/** * jquery plugin paroller.js v1.4.4 * https://github.com/tgomilar/paroller.js * preview: https://tgomilar.github.io/paroller/ **/ (function (factory) { 'use strict'; if (typeof define === 'function' && define.amd) { define('parollerjs', ['jquery'], factory); } else if (typeof module === 'object' && typeof module.exports === 'object') { module.exports = factory(require('jquery')); } else { factory(jquery); } })(function ($) { 'use strict'; var working = false; var scrollaction = function() { working = false; }; var setdirection = { bgvertical: function (elem, bgoffset) { return elem.css({'background-position': 'center ' + -bgoffset + 'px'}); }, bghorizontal: function (elem, bgoffset) { return elem.css({'background-position': -bgoffset + 'px' + ' center'}); }, vertical: function (elem, elemoffset, oldtransform) { (oldtransform === 'none' ? oldtransform = '' : true); return elem.css({ '-webkit-transform': 'translatey(' + elemoffset + 'px)' + oldtransform, '-moz-transform': 'translatey(' + elemoffset + 'px)' + oldtransform, 'transform': 'translatey(' + elemoffset + 'px)' + oldtransform, 'transition': 'transform linear', 'will-change': 'transform' }); }, horizontal: function (elem, elemoffset, oldtransform) { (oldtransform === 'none' ? oldtransform = '' : true); return elem.css({ '-webkit-transform': 'translatex(' + elemoffset + 'px)' + oldtransform, '-moz-transform': 'translatex(' + elemoffset + 'px)' + oldtransform, 'transform': 'translatex(' + elemoffset + 'px)' + oldtransform, 'transition': 'transform linear', 'will-change': 'transform' }); } }; var setmovement = { factor: function (elem, width, options) { var datafactor = elem.data('paroller-factor'); var factor = (datafactor) ? datafactor : options.factor; if (width < 576) { var datafactorxs = elem.data('paroller-factor-xs'); var factorxs = (datafactorxs) ? datafactorxs : options.factorxs; return (factorxs) ? factorxs : factor; } else if (width <= 768) { var datafactorsm = elem.data('paroller-factor-sm'); var factorsm = (datafactorsm) ? datafactorsm : options.factorsm; return (factorsm) ? factorsm : factor; } else if (width <= 1024) { var datafactormd = elem.data('paroller-factor-md'); var factormd = (datafactormd) ? datafactormd : options.factormd; return (factormd) ? factormd : factor; } else if (width <= 1200) { var datafactorlg = elem.data('paroller-factor-lg'); var factorlg = (datafactorlg) ? datafactorlg : options.factorlg; return (factorlg) ? factorlg : factor; } else if (width <= 1920) { var datafactorxl = elem.data('paroller-factor-xl'); var factorxl = (datafactorxl) ? datafactorxl : options.factorxl; return (factorxl) ? factorxl : factor; } else { return factor; } }, bgoffset: function (offset, factor) { return math.round(offset * factor); }, transform: function (offset, factor, windowheight, height) { return math.round((offset - (windowheight / 2) + height) * factor); } }; var clearpositions = { background: function (elem) { return elem.css({'background-position': 'unset'}); }, foreground: function (elem) { return elem.css({ 'transform' : 'unset', 'transition' : 'unset' }); } }; $.fn.paroller = function (options) { var windowheight = $(window).height(); var documentheight = $(document).height(); // default options var options = $.extend({ factor: 0, // - to + factorxs: 0, // - to + factorsm: 0, // - to + factormd: 0, // - to + factorlg: 0, // - to + factorxl: 0, // - to + type: 'background', // foreground direction: 'vertical' // horizontal }, options); return this.each(function () { var $this = $(this); var width = $(window).width(); var offset = $this.offset().top; var height = $this.outerheight(); var datatype = $this.data('paroller-type'); var datadirection = $this.data('paroller-direction'); var oldtransform = $this.css('transform'); var type = (datatype) ? datatype : options.type; var direction = (datadirection) ? datadirection : options.direction; var factor = setmovement.factor($this, width, options); var bgoffset = setmovement.bgoffset(offset, factor); var transform = setmovement.transform(offset, factor, windowheight, height); if (type === 'background') { if (direction === 'vertical') { setdirection.bgvertical($this, bgoffset); } else if (direction === 'horizontal') { setdirection.bghorizontal($this, bgoffset); } } else if (type === 'foreground') { if (direction === 'vertical') { setdirection.vertical($this, transform, oldtransform); } else if (direction === 'horizontal') { setdirection.horizontal($this, transform, oldtransform); } } $(window).on('resize', function () { var scrolling = $(this).scrolltop(); width = $(window).width(); offset = $this.offset().top; height = $this.outerheight(); factor = setmovement.factor($this, width, options); bgoffset = math.round(offset * factor); transform = math.round((offset - (windowheight / 2) + height) * factor); if (! working) { window.requestanimationframe(scrollaction); working = true; } if (type === 'background') { clearpositions.background($this); if (direction === 'vertical') { setdirection.bgvertical($this, bgoffset); } else if (direction === 'horizontal') { setdirection.bghorizontal($this, bgoffset); } } else if ((type === 'foreground') && (scrolling <= documentheight)) { clearpositions.foreground($this); if (direction === 'vertical') { setdirection.vertical($this, transform); } else if (direction === 'horizontal') { setdirection.horizontal($this, transform); } } }); $(window).on('scroll', function () { var scrolling = $(this).scrolltop(); documentheight = $(document).height(); bgoffset = math.round((offset - scrolling) * factor); transform = math.round(((offset - (windowheight / 2) + height) - scrolling) * factor); if (! working) { window.requestanimationframe(scrollaction); working = true; } if (type === 'background') { if (direction === 'vertical') { setdirection.bgvertical($this, bgoffset); } else if (direction === 'horizontal') { setdirection.bghorizontal($this, bgoffset); } } else if ((type === 'foreground') && (scrolling <= documentheight)) { if (direction === 'vertical') { setdirection.vertical($this, transform, oldtransform); } else if (direction === 'horizontal') { setdirection.horizontal($this, transform, oldtransform); } } }); }); }; });