可拖动的播放条

方案一

鼠标按下的时候 起点 = 球的x轴位置-偏移位置.
按下开始移动的时候 , 需要继承上次的偏移位置开始移动 即style.left = 球的x轴实时位置-起点

<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    body{
      padding: 100px;
      margin: 0;
    }
    .scroll{
      width: 500px;
      height: 5px;
      background: #ccc;
      position: relative;
    }
    .bar{
      width: 20px;
      height: 20px;
      border-radius: 50%;
      background: #369;
      position: absolute;
      top: -7px;
      left: 0;
      cursor: pointer;
    }
    .mask{
      position: absolute;
      left: 0;
      top: 0;
      background: #369;
      width: 0;
      height: 5px;
    }
  </style>  
</head>
<body>
  <div class="scroll">
    <div class="bar"></div>
    <div class="mask"></div>
  </div>
  <p>已经走了0%</p>
  <script> 
    const [scroll, bar, mask, ptxt // 条, 点, 进度条, 进度字
    ] =['.scroll','.bar','.mask', 'p' ].map(item=>document.querySelector(item));
    let barleft = 0;

    bar.onmousedown = function(e){
      const leftVal = e.clientX - this.offsetLeft; // 类似于 res = x-l;
      document.onmousemove = ({clientX})=>{
        barleft = clientX - leftVal; // 类似于 l = res-x l就是left的值
        if(barleft < 0){barleft = 0;}
        else if(barleft > scroll.offsetWidth - bar.offsetWidth){barleft = scroll.offsetWidth - bar.offsetWidth;}
        mask.style.width = barleft;
        this.style.left = barleft;
        
        ptxt.innerHTML = "已经走了" + parseInt(barleft/(scroll.offsetWidth-bar.offsetWidth) * 100) + "%";

        //防止选择内容--当拖动鼠标过快时候,弹起鼠标,bar也会移动,修复bug
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
      }
    }
    document.onmouseup = function(){
      document.onmousemove = null; //弹起鼠标不做任何操作
    }
  </script>
</body>
</html> 

方案二

不推荐

<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    body {
      padding: 100px;
      margin: 0;
    }

    .scroll {
      width: 500px;
      height: 5px;
      background: #ccc;
      position: relative;
    }

    .bar {
      width: 20px;
      height: 20px;
      border-radius: 50%;
      background: #369;
      position: absolute;
      top: -7px;
      left: 0;
      cursor: pointer;
    }

    .mask {
      position: absolute;
      left: 0;
      top: 0;
      background: #369;
      width: 0;
      height: 5px;
    }
  </style>
</head>

<body>
  <div class="scroll">
    <div class="bar"></div>
    <div class="mask"></div>
  </div>
  <p>已经走了0%</p>
  <script>
    const [scroll, bar, mask, ptxt // 条, 点, 进度条, 进度字
    ] = ['.scroll', '.bar', '.mask', 'p'].map(item => document.querySelector(item));
    const initScrollX = scroll.getBoundingClientRect().left; // scroll距离body距离
    
    bar.onmousedown = function (e) {
      const barX = bar.getBoundingClientRect().left; // 球距离body距离
      const mouseDistanceBar = e.clientX - initBarX; // 鼠标x坐标->距离->球左侧长度:鼠标距离球左侧的位置
      document.onmousemove = ({ clientX }) => {
        if (clientX - initScrollX - mouseDistanceBar < 0) { this.style.left = 0 } 
        else if (clientX - initScrollX - mouseDistanceBar + bar.offsetWidth > scroll.offsetWidth) { 
          this.style.left = scroll.offsetWidth - bar.offsetWidth;
        } else { 
          // 当前在球中鼠标x位置-条x位置-鼠标距离球左侧的位置:即假设永远使得在球左侧起拖动
          this.style.left = clientX - initScrollX - mouseDistanceBar; 
        }
        // 显示百分比
        const shwoPercent = parseInt(Number(this.style.left.replace('px',''))/(scroll.offsetWidth - bar.offsetWidth)*100);
        ptxt.innerHTML = `已经走了${shwoPercent}%`; 
        //防止选择内容--当拖动鼠标过快时候,弹起鼠标,bar也会移动,修复bug
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
      }
    }
    document.onmouseup = function () {
      document.onmousemove = null; //弹起鼠标不做任何操作
    }
  </script>
</body>
</html>
posted @ 2021-12-19 23:22  丁少华  阅读(88)  评论(0编辑  收藏  举报