mirror of
https://github.com/crmeb/CRMEB.git
synced 2025-12-17 06:52:49 +00:00
95 lines
3.2 KiB
JavaScript
95 lines
3.2 KiB
JavaScript
(function($){
|
|
$.iosParallax = function(el, options){
|
|
// To avoid scope issues, use 'base' instead of 'this'
|
|
// to reference this class from internal events and functions.
|
|
var base = this;
|
|
|
|
// Access to jQuery and DOM versions of element
|
|
base.$el = $(el);
|
|
base.el = el;
|
|
|
|
// Add a reverse reference to the DOM object
|
|
base.$el.data("iosParallax", base);
|
|
|
|
var centerCoordinates = {x: 0, y: 0};
|
|
var targetCoordinates = {x: 0, y: 0};
|
|
var transitionCoordinates = {x: 0, y: 0};
|
|
|
|
function getBackgroundImageUrl(){
|
|
var backgroundImage = base.$el.css('background-image').match(/url\(.*\)/ig);
|
|
if ( ! backgroundImage || backgroundImage.length < 1) {
|
|
throw 'No background image found';
|
|
}
|
|
return backgroundImage[0].replace(/url\(|'|"|'|"|\)$/ig, "");
|
|
}
|
|
|
|
function getBackgroundImageSize(){
|
|
var img = new Image;
|
|
img.src = getBackgroundImageUrl();
|
|
return {width: img.width, height: img.height};
|
|
}
|
|
|
|
function setCenterCoordinates(){
|
|
var bgImgSize = getBackgroundImageSize();
|
|
centerCoordinates.x = -1 * Math.abs(bgImgSize.width - base.$el.width()) / 2;
|
|
centerCoordinates.y = -1 * Math.abs(bgImgSize.height - base.$el.height()) / 2;
|
|
targetCoordinates.x = centerCoordinates.x;
|
|
targetCoordinates.y = centerCoordinates.y;
|
|
transitionCoordinates.x = centerCoordinates.x;
|
|
transitionCoordinates.y = centerCoordinates.y;
|
|
}
|
|
|
|
function bindEvents(){
|
|
base.$el.mousemove(function(e){
|
|
var width = base.options.movementFactor / base.$el.width();
|
|
var height = base.options.movementFactor / base.$el.height();
|
|
var cursorX = e.pageX - ($(window).width() / 2);
|
|
var cursorY = e.pageY - ($(window).height() / 2);
|
|
targetCoordinates.x = width * cursorX * -1 + centerCoordinates.x;
|
|
targetCoordinates.y = height * cursorY * -1 + centerCoordinates.y;
|
|
});
|
|
|
|
// Slowly converge the background image position to the target coordinates in 60 FPS
|
|
var loop = setInterval(function(){
|
|
transitionCoordinates.x += ((targetCoordinates.x - transitionCoordinates.x) / base.options.dampenFactor);
|
|
transitionCoordinates.y += ((targetCoordinates.y - transitionCoordinates.y) / base.options.dampenFactor);
|
|
base.$el.css("background-position", transitionCoordinates.x+"px "+transitionCoordinates.y+"px");
|
|
}, 16);
|
|
|
|
$(window).resize(function(){
|
|
// Re-center the image
|
|
setCenterCoordinates();
|
|
});
|
|
|
|
// There's a problem with getting image height and width when the image isn't loaded.
|
|
var img = new Image;
|
|
img.src = getBackgroundImageUrl();
|
|
$(img).load(function(){
|
|
setCenterCoordinates();
|
|
});
|
|
};
|
|
|
|
base.init = function(){
|
|
base.options = $.extend({}, $.iosParallax.defaultOptions, options);
|
|
bindEvents();
|
|
};
|
|
|
|
base.init();
|
|
};
|
|
|
|
$.iosParallax.defaultOptions = {
|
|
// How fast the background moves
|
|
movementFactor: 50,
|
|
// How much to dampen the movement (higher is slower)
|
|
dampenFactor: 36
|
|
};
|
|
|
|
$.fn.iosParallax = function(options){
|
|
return this.each(function(){
|
|
(new $.iosParallax(this, options));
|
|
});
|
|
};
|
|
|
|
})(jQuery);
|
|
|