用js实现一个简单的拖拽条

实现思路是:因为能够拖动,所以是相对于一个盒子定位的,拖动的时候走过的总距离是父盒子的总长度 - 定位盒子的长度。然后走过的距离除以总长可以得到百分比,实现如下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
       * {
            margin: 0;
            padding: 0;
       }
       .scroll{
         width: 400px;
         height: 8px;
         background-color: #ccc;
         margin: 50px;
         position: relative;
       }
       .bar{
        position: absolute;
        width: 10px;
        height: 20px;
        background: #369;
        top: -50%;
        margin-top: -2px;
        cursor: pointer;
        left: 0;
       }
       .mask{
        width: 0;
        height: 100%;
        position: absolute;
        top: 0;
        left: 0;
        background-color: #369;
       }
    </style>
</head>
<body>
    <div class="scroll" id="scroll">
        <div class="bar"></div>
        <div class="mask"></div>
    </div>
    <div id="demo"></div>
</body>
</html>
<script>
  var scroll = document.getElementById('scroll')
  var demo = document.getElementById("demo");
  var bar = scroll.children[0]
  var mask = scroll.children[1]
  bar.onmousedown = function (e) {
    var e = e || window.event // 标准化event
    var leftVal = e.clientX - this.offsetLeft // 因为当前盒子是bar,bar是相对于scroll定位的,因此得到的offsetLeft是相对于scroll的距离,所以说leftVal是scroll距离浏览器左边的距离
    var that = this
    document.onmousemove = function (e) {
         var e = e || window.event // 标准化event
         var maxLimit = scroll.offsetWidth - 10 // 10为bar的宽度
         that.style.left = event.clientX - leftVal  + 'px'; // 设置滑块走过的距离,为什么要设置后获取,因为style是行内样式,不设置湖区不到
        var val = parseInt(that.style.left);
         if (val < 0) {
            val = 0
         } else if (val > maxLimit) {
            val = maxLimit
         }
         that.style.left = val + 'px'
         mask.style.width = that.style.left;  // 遮罩盒子的宽度
         // 计算百分比
         demo.innerHTML = "已经走了:"+ parseInt(parseInt(that.style.left) / maxLimit * 100) + "%"; // 走过的距离除以总长就得到百分比
         window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); // 解决选中出现蓝色的一片的bug
    }
    document.onmouseup = function() {
      document.onmousemove = null;   // 弹起鼠标不做任何操作
    }
  }
</script>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,697评论 1 92
  • 1.CSS基本概念 1.1 CSS的定义 CSS(Cascading Style Sheets)层叠样式表,主要用...
    寥寥十一阅读 5,933评论 0 6
  • 照顾好你自己,才是在大城市生活的第一步。 所谓的房租房价,工作机会,生活成本,大家面临的困难或者说挑战是一样的。...
    苹果就是苹果阅读 1,801评论 0 1
  • 文/酸甜只酸不甜 不要期待对等的爱 这样才不会受伤 我希望你可以平等对待 人人心是肉长的 久了会疼的
    酸甜只酸不甜阅读 1,265评论 0 2
  • 爸妈又一次陷入了经济危机里面 心里很不赞同他们的理财方式 可是我不一定能改变他们 这个时候 只想自己多赚点钱 先让...
    梦想优雅的小白阅读 1,495评论 0 0

友情链接更多精彩内容