1 |
|
2 |
|
3 |
|
4 |
|
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 |
|
52 | var options = $.extend({
|
53 | factor: 0,
|
54 | type: 'background',
|
55 | direction: 'vertical'
|
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 |
|
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 |