UNPKG

3.65 kBJavaScriptView Raw
1// Marquee 滚动框
2var Marquee = function Marquee(container, params) {
3 /* --------------------
4 Model
5 -------------------- */
6 var defaults = {
7 start: 0,
8 end: 300,
9 step: 50,
10 duration: 300,
11 delay: 2000,
12 direction: 'top', // top | bottom | left | right
13 loop: false,
14 duplicateClass: 'duplicate'
15 /*
16 Callbacks:
17 onSlideChange:function(Marquee)
18 onSlideChangeEnd:function(Marquee)
19 */
20 };
21 params = params || {};
22 for (var def in defaults) {
23 if (params[def] === undefined) {
24 params[def] = defaults[def];
25 }
26 }
27 var s = this;
28 s.params = params;
29 // Container
30 s.container = typeof container === 'string' ? document.querySelector(container) : container;
31 // 定时器
32 s.interval = null;
33 // 循环
34 s.updateLoop = function () {
35 var dups = [].slice.call(s.container.querySelectorAll('.' + s.params.duplicateClass));
36 dups.forEach(function (item) {
37 s.container.removeChild(item);
38 });
39 if (s.params.loop) {
40 var beforeDupContainer = s.container.cloneNode(true);
41 var afterDupContainer = s.container.cloneNode(true);
42 beforeDupContainer.classList.add(s.params.duplicateClass);
43 afterDupContainer.classList.add(s.params.duplicateClass);
44 s.container.insertBefore(beforeDupContainer, s.container.firstElementChild);
45 s.container.appendChild(afterDupContainer);
46 }
47 };
48 // 设置开始位置
49 s.setStart = function (start) {
50 s.params.start = start;
51 };
52 // 设置结束位置
53 s.setEnd = function (end) {
54 s.params.end = end;
55 };
56 /* --------------------
57 Method
58 -------------------- */
59 // 设置动画时长
60 s.setDuration = function (duration) {
61 s.container.style.webkitTransitionDuration = duration + 'ms';
62 };
63 // 设置移动位置
64 s.setPosition = function (pos) {
65 switch (s.params.direction) {
66 case 'top':
67 s.container.style.webkitTransform = 'translate(0px, ' + pos + 'px)';
68 break;
69 default:
70 s.container.style.webkitTransform = 'translate(0px, ' + pos + 'px)';
71 }
72 };
73 // 初始化位置变量
74 s.start = 0;
75 s.end = 0;
76 s.move = 0;
77 s.update = function () {
78 s.start = s.params.start;
79 s.end = s.params.end;
80 var range = s.params.end - s.params.start;
81 if (s.params.loop) {
82 s.updateLoop();
83 s.start = s.params.end + s.params.step;
84 s.end = s.start + range;
85 }
86 s.setDuration(0);
87 // 设置起始位置
88 s.setPosition(-s.start);
89 // 设置动画时长
90 setTimeout(function () {
91 s.setDuration(s.params.duration);
92 }, 10);
93 // 设置起始位置
94 s.move = s.start;
95 // 初始化播放
96 if (s.interval) window.clearInterval(s.interval);
97 };
98 s.update();
99 // 播放
100 s.play = function () {
101 if (s.interval) window.clearInterval(s.interval);
102 s.interval = window.setInterval(function () {
103 s.move += s.params.step;
104 if (s.params.loop) {
105 if (s.move >= s.end + s.params.step) {
106 // 回到复制相同处
107 var initPos = s.start - s.params.step;
108 s.setDuration(0);
109 s.setPosition(-initPos);
110 // 再移动一格
111 s.move = initPos + s.params.step;
112 setTimeout(function () {
113 s.setDuration(s.params.duration);
114 s.setPosition(-s.move);
115 }, 10);
116 } else {
117 s.setPosition(-s.move);
118 }
119 } else {
120 s.setPosition(-s.move);
121 if (s.move >= s.end) {
122 window.clearInterval(s.interval);
123 }
124 }
125 }, s.params.delay);
126 };
127 s.pause = function () {
128 window.clearInterval(s.interval);
129 };
130};
131
132export default Marquee;
\No newline at end of file