UNPKG

5.13 kBJavaScriptView Raw
1/**
2 * jQuery plugin paroller.js v1.3.0
3 * https://github.com/tgomilar/paroller.js
4 * preview: https://tgomilar.github.io/paroller/
5 **/
6(function (factory) {
7 'use strict';
8
9 if (typeof module === 'object' && typeof module.exports === 'object') {
10 module.exports = factory(require('jquery'));
11 }
12 else {
13 factory(jQuery);
14 }
15})(function ($) {
16 'use strict';
17
18 var setDirection = {
19 bgVertical: function (elem, bgOffset) {
20 return elem.css({'background-position': 'center ' + -bgOffset + 'px'});
21 },
22 bgHorizontal: function (elem, bgOffset) {
23 return elem.css({'background-position': -bgOffset + 'px' + ' center'});
24 },
25 vertical: function (elem, elemOffset, oldTransform) {
26 (oldTransform === 'none' ? oldTransform = '' : true);
27 return elem.css({
28 '-webkit-transform': 'translateY(' + elemOffset + 'px)' + oldTransform,
29 '-moz-transform': 'translateY(' + elemOffset + 'px)' + oldTransform,
30 'transform': 'translateY(' + elemOffset + 'px)' + oldTransform,
31 'transition': 'transform linear',
32 'will-change': 'transform'
33 });
34 },
35 horizontal: function (elem, elemOffset, oldTransform) {
36 (oldTransform === 'none' ? oldTransform = '' : true);
37 return elem.css({
38 '-webkit-transform': 'translateX(' + elemOffset + 'px)' + oldTransform,
39 '-moz-transform': 'translateX(' + elemOffset + 'px)' + oldTransform,
40 'transform': 'translateX(' + elemOffset + 'px)' + oldTransform,
41 'transition': 'transform linear',
42 'will-change': 'transform'
43 });
44 }
45 };
46
47 $.fn.paroller = function (options) {
48 var windowHeight = $(window).height();
49 var documentHeight = $(document).height();
50
51 // default options
52 var options = $.extend({
53 factor: 0, // - to +
54 type: 'background', // foreground
55 direction: 'vertical' // horizontal
56 }, options);
57
58 return this.each(function () {
59 var working = false;
60 var $this = $(this);
61 var offset = $this.offset().top;
62 var height = $this.outerHeight();
63 var dataFactor = $this.data('paroller-factor');
64 var dataType = $this.data('paroller-type');
65 var dataDirection = $this.data('paroller-direction');
66
67 var factor = (dataFactor) ? dataFactor : options.factor;
68 var type = (dataType) ? dataType : options.type;
69 var direction = (dataDirection) ? dataDirection : options.direction;
70 var bgOffset = Math.round(offset * factor);
71 var transform = Math.round((offset - (windowHeight / 2) + height) * factor);
72
73 /* Transform directive of element before paroller */
74 var oldTransform = $this.css('transform');
75
76 if (type == 'background') {
77 if (direction == 'vertical') {
78 setDirection.bgVertical($this, bgOffset);
79 }
80 else if (direction == 'horizontal') {
81 setDirection.bgHorizontal($this, bgOffset);
82 }
83 }
84 else if (type == 'foreground') {
85 if (direction == 'vertical') {
86 setDirection.vertical($this, transform, oldTransform);
87 }
88 else if (direction == 'horizontal') {
89 setDirection.horizontal($this, transform, oldTransform);
90 }
91 }
92
93 var scrollAction = function () {
94 working = false;
95 };
96
97 $(window).on('scroll', function () {
98 if (!working) {
99 var scrolling = $(this).scrollTop();
100 documentHeight = $(document).height();
101
102 bgOffset = Math.round((offset - scrolling) * factor);
103 transform = Math.round(((offset - (windowHeight / 2) + height) - scrolling) * factor);
104
105 if (type == 'background') {
106 if (direction == 'vertical') {
107 setDirection.bgVertical($this, bgOffset);
108 }
109 else if (direction == 'horizontal') {
110 setDirection.bgHorizontal($this, bgOffset);
111 }
112 }
113 else if ((type == 'foreground') && (scrolling <= documentHeight)) {
114 if (direction == 'vertical') {
115 setDirection.vertical($this, transform, oldTransform);
116 }
117 else if (direction == 'horizontal') {
118 setDirection.horizontal($this, transform, oldTransform);
119 }
120 }
121
122 window.requestAnimationFrame(scrollAction);
123 working = true;
124 }
125 }).trigger('scroll');
126 });
127 };
128});
\No newline at end of file