欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自定义拖动进度条,包含样式和事件

程序员文章站 2022-06-20 23:42:32
自定义可拖动的进度条,如下图效果: 代码分三部分 HTML CSS 到这步就基本实现了自定义的样式,只需改变 .progress-bar 的 width 就能显示不同的进度;接下来给进度条加上拖动事件 JavaScript 关于本篇随笔,作者的考虑: 1. 将 mousedown 事件绑定在进度条的 ......

自定义可拖动的进度条,如下图效果:

自定义拖动进度条,包含样式和事件

代码分三部分

html

 1 <body>
 2     <div id="demo">
 3 
 4         <div class="progress">
 5             <div class="progress-bar">
 6                 <div class="progress-thumb"></div>
 7             </div>
 8         </div>
 9 
10     </div>
11 </body>

css

 1 #demo { 
 2     width: 600px; height: 100px; margin: 100px auto; 
 3     display: flex; align-items: center; 
 4 }
 5 
 6 #demo .progress { 
 7     width: 100%; height: 6px; border-radius: 3px; 
 8     background: #f1f5fd; 
 9 }
10 
11 #demo .progress .progress-bar { 
12     width: 40%; height: 100%; border-radius: 3px; 
13     background: #0072ff; 
14 }
15 
16 #demo .progress .progress-bar .progress-thumb { 
17     width: 14px; height: 14px; border-radius: 50%; 
18     background: #ffffff; box-shadow: 0 0 15px 5px #0072ff; 
19     float: right; 
20     position: relative; left: 7px; top: -5px; 
21 }

 

到这步就基本实现了自定义的样式,只需改变 .progress-bar 的 width 就能显示不同的进度;接下来给进度条加上拖动事件

javascript

 1     <script>
 2            
 3         var slider = {
 4             use: function(id) {
 5                 var self = this;
 6                 self.slider = document.getelementbyid(id);
 7                 self.bar = self.slider.queryselector('.progress-bar');
 8                 self.thumb = self.slider.queryselector('.progress-thumb');
 9                 self.slider.addeventlistener('mousedown', function(e) {
10                     if (e.button == 0) { // 判断点击左键
11                         self.mdown = true;
12                         self.beginx = e.offsetx;
13                         self.positionx = e.offsetx;
14                         self.beginclientx = e.clientx;
15                         self.sliderlong = parseint(self.getstyle(self.slider, 'width'));
16                         var per = parseint(self.positionx / self.sliderlong * 100);
17                         self.bar.style.width = per + '%';
18                     }
19                 });
20                 document.addeventlistener('mousemove', function(e) {
21                     if (self.mdown) {
22                         var movex = e.clientx - self.beginclientx;
23                         self.positionx = (self.beginx + movex > self.sliderlong) ? self.sliderlong : (self.beginx + movex < 0) ? 0 : self.beginx + movex;
24                         var per = parseint(self.positionx / self.sliderlong * 100);
25                         self.bar.style.width = per + '%';
26                     }
27                 });
28                 document.addeventlistener('mouseup', function(e) {
29                     if (e.button == 0) { 
30                         self.mdown = false;
31                     }
32                 });
33             },
34             getstyle: function(obj,stylename){ // 获取元素样式的方法
35                 if(obj.currentstyle){
36                     return obj.currentstyle[stylename];
37                 }else{
38                     return getcomputedstyle(obj,null)[stylename];
39                 }
40             }
41         };
42         slider.use('demo');
43 
44     </script>

关于本篇随笔,作者的考虑:

  1. 将 mousedown 事件绑定在进度条的包裹层而非进度条本身,这是参考了主流视频播放器的效果后的设计,为了优化用户体验;

  2. js 用纯原生语法书写,如果用 jquery 可以简化选择器和 css 样式的获取;

  3. 鼠标在滚动条外的移动,本文使用 clientx 来计算,如果有其他想法欢迎留言探讨