UNPKG

4.04 kBJavaScriptView Raw
1// BiGauge 仪表盘
2var BiGauge = function BiGauge(container, params) {
3 /* ----------------------
4 Model
5 ---------------------- */
6 var defaults = {
7 minValue: 0,
8 maxValue: 360,
9 currentValue: 0,
10
11 maxPointRotate: 270,
12
13 // dom
14 pointClass: '.gauge-pointer',
15 waveClass: '.gauge-wave',
16 valueClass: '.gauge-text',
17
18 // animate
19 delay: 0,
20 durationall: 2000
21
22 /* callbacks
23 onChangeStart:function(Gauge)
24 onChangeEnd:function(Gauge)
25 onOut:function(Gauge)
26 */
27 };
28 for (var def in defaults) {
29 if (params[def] === undefined) {
30 params[def] = defaults[def];
31 }
32 }
33 var s = this;
34 s.params = params;
35 s.container = typeof container === 'string' ? document.querySelector(container) : container;
36 if (!s.container) {
37 console.log('SeedsUI Error:未找到Gauge的DOM对象,请检查传入参数是否正确');
38 return;
39 }
40 s.point = s.container.querySelector(s.params.pointClass); // 指针
41 s.wave = s.container.querySelector(s.params.waveClass) || null; // 波浪
42 s.value = s.container.querySelector(s.params.valueClass); // 指针值
43
44 s.percent = (s.params.currentValue - s.params.minValue) / (s.params.maxValue - s.params.minValue); // 当前值所占比例
45
46 s.duration = Math.round(s.percent * s.params.durationall); // 执行时间长度
47 if (s.duration > s.params.durationall) {
48 s.duration = s.params.durationall;
49 }
50 s.bgLvl = Math.round(s.percent * 10) + 1; // 背景等级
51 if (s.bgLvl < 1) s.bgLvl = 1;
52 if (s.bgLvl > 10) s.bgLvl = 10;
53
54 s.waveTop; // 波浪高度
55
56 /* ----------------------
57 Method
58 ---------------------- */
59 // 旋转指针
60 s.updatePoint = function () {
61 // 指针旋转角度
62 s.pointRotate = s.params.maxPointRotate * s.percent;
63
64 // CallBack onOut
65 if (s.pointRotate > s.params.maxPointRotate) {
66 s.pointRotate = s.params.maxPointRotate;
67
68 if (s.params.onOut) s.params.onOut(s);
69 }
70
71 // CallBack onChangeStart
72 if (s.params.onChangeStart) s.params.onChangeStart(s);
73 // 旋转时长
74 s.point.style.webkitTransitionDuration = s.duration + 'ms';
75 };
76 // 设置数字
77 s.updateValue = function () {
78 s.value.innerHTML = s.params.currentValue;
79 };
80 // 更改背景色
81 s.updateBg = function () {
82 s.container.style.webkitAnimationDuration = s.duration + 'ms';
83 };
84 // 设置波浪
85 s.updateWave = function () {
86 if (!s.wave) return;
87 s.waveTop = 100 - Math.round(s.percent.toFixed(1) * 100);
88 if (s.waveTop < 0) {
89 s.waveTop = 0;
90 }
91 s.wave.style.webkitTransitionDuration = s.duration + 'ms';
92 };
93 s.updateDelay = function () {
94 s.container.style.webkitAnimationDelay = s.params.delay + 'ms';
95 s.point.style.webkitTransitionDelay = s.params.delay + 'ms';
96 if (s.wave) s.wave.style.webkitTransitionDelay = s.params.delay + 'ms';
97 };
98 s.update = function () {
99 s.updateBg();
100 s.updatePoint();
101 s.updateValue();
102 s.updateWave();
103 s.updateDelay();
104 };
105 s.update();
106 s.play = function () {
107 // 播放指针
108 s.point.style.webkitTransform = 'rotate(' + s.pointRotate + 'deg)';
109 // 播放背景
110 var bgExpr = /bg[1-9]0?$/g;
111 if (bgExpr.test(s.container.className)) {
112 s.container.className = s.container.className.replace(bgExpr, 'bg' + s.bgLvl);
113 } else {
114 s.container.className += ' bg' + s.bgLvl;
115 }
116 // 播放波浪
117 if (s.wave) s.wave.style.top = s.waveTop + '%';
118 };
119 /* ----------------------
120 Events
121 ---------------------- */
122 s.events = function (detach) {
123 var action = detach ? 'removeEventListener' : 'addEventListener';
124 s.point[action]('webkitTransitionEnd', s.onTransitionEnd, false);
125 };
126 // attach、detach事件
127 s.attach = function () {
128 s.events();
129 };
130 s.detach = function () {
131 s.events(true);
132 };
133 s.onTransitionEnd = function (e) {
134 // CallBack onChangeEnd
135 if (s.params.onChangeEnd) s.params.onChangeEnd(s);
136 };
137 // Init
138 s.init = function () {
139 s.attach();
140 };
141 s.init();
142};
143
144export default BiGauge;
\No newline at end of file