html⾃定义拖动进度条,包含样式和事件
⾃定义可拖动的进度条,如下图效果:
代码分三部分
html
<body>
<div id="demo">
<div class="progress">
<div class="progress-bar">
<div class="progress-thumb"></div>
</div>
</div>
</div>
</body>
css
#demo {
width: 600px; height: 100px; margin: 100px auto;
display: flex; align-items: center;
}
#demo .progress {
width: 100%; height: 6px; border-radius: 3px;
background: #F1F5FD;
}
#demo .progress .progress-bar {
width: 40%; height: 100%; border-radius: 3px;
background: #0072FF;
}
#demo .progress .progress-bar .progress-thumb {
width: 14px; height: 14px; border-radius: 50%;
background: #FFFFFF; box-shadow: 0 0 15px 5px #0072FF;
float: right;
position: relative; left: 7px; top: -5px;
}
到这步就基本实现了⾃定义的样式,只需改变 .progress-bar 的 width 就能显⽰不同的进度;接下来给进度条加上拖动事件
JavaScript
<script>
var slider = {
use: function(id) {
var self = this;
self.slider = ElementById(id);
self.bar = self.slider.querySelector('.progress-bar');
self.thumb = self.slider.querySelector('.progress-thumb');
self.slider.addEventListener('mousedown', function(e) {
if (e.button == 0) { // 判断点击左键
self.mDown = true;
self.beginX = e.offsetX;
self.positionX = e.offsetX;
self.beginClientX = e.clientX;
self.sliderLong = Style(self.slider, 'width'));
var per = parseInt(self.positionX / self.sliderLong * 100);
self.bar.style.width = per + '%';
}
jquery是什么选择器});
document.addEventListener('mousemove', function(e) {
if (self.mDown) {
var moveX = e.clientX - self.beginClientX;
self.positionX = (self.beginX + moveX > self.sliderLong) ? self.sliderLong : (self.beginX + moveX < 0) ? 0 : self.beginX + moveX;
var per = parseInt(self.positionX / self.sliderLong * 100);
self.bar.style.width = per + '%';
}
});
document.addEventListener('mouseup', function(e) {
if (e.button == 0) {
self.mDown = false;
}
});
},
getStyle: function(obj,styleName){ // 获取元素样式的⽅法
if(obj.currentStyle){
return obj.currentStyle[styleName];
}else{
return getComputedStyle(obj,null)[styleName];
}
}
};
slider.use('demo');
</script>
关于本篇随笔,作者的考虑:
1. 将 mousedown 事件绑定在进度条的包裹层⽽⾮进度条本⾝,这是参考了主流视频播放器的效果后的设计,为了优化⽤户体验
2. js ⽤纯原⽣语法书写,如果⽤ JQuery 可以简化选择器和 css 样式的获取
3. ⿏标在滚动条外的移动,本⽂使⽤ clientX 来计算