用js模拟拖拽滚动条

如图,这是要实现的效果。
在这里插入图片描述
我的布局是先定义一个长方形,也就是滑动条。)
然后在再定义一个其子元素div定位在他的头部,也就是滑动按钮

这里是js代码:

<script>
    // 获取元素
    var scrollBar = document.getElementById("scrollBar"); //滑动条的长度
    var bar = scrollBar.children[0]; //拖动的按钮
    var mask = scrollBar.children[1];   //按钮左边的遮罩层
    var demo = document.getElementById("demo");
    var scrollW=scrollBar.offsetWidth;
    var barW=bar.offsetWidth;
    // 拖动原理
    bar.onmousedown=function (e) {
        var e1=e||window.event;  //这里是按下的事件对象
        that=this;
        document.onmousemove=function (e) {
            var e2=e||window.event;     //这里是移动的事件对象
            that.style.left=e2.clientX -scrollBar.offsetLeft-e1.offsetX+"px";
            // 按钮到其父元素的left就是移动时的鼠标对象到可视页面的X
            // 减去滑动条到页面的left
            // 再减去按下按钮时的事件对象相对于其事件源的x值
            var val = parseInt(that.style.left);
            demo.innerHTML=(val/(parseInt(scrollW))*10).toFixed(1);
            if(val < 0){
                that.style.left = 0;
                demo.innerHTML="0"; //当滑动条的宽度小于0的时候,将bar的left设置成滑动条的宽度减去滑动按钮的宽度。
            }else if(val > (scrollW-barW)){
                that.style.left =scrollW-barW+"px"; //当超出滑动条宽度的时候,将bar的left设置成滑动条的宽度减去滑动按钮的宽度。
                demo.innerHTML="10";
            }
            mask.style.width=that.style.left; //因为之前if控制过that.style.left的值,所以直接将bar的left的值赋给左边mask的宽。
        }
        document.onmouseup = function () {
            //清除滑动
            document.onmousemove = null;
            //清除抬起,为了节省性能
            document.onmouseup = null;
        }
    }
script>

解释都在代码里里面了。
我再来提一下本题的难点:
1.按下按钮和移动按钮的两个事件对象是不一样的。
2.因为按钮是滑动条的子元素,所以滑动条遮罩的宽度就等于按钮的left属性值。
3.抬起按钮事件触发时,清除滑动,清除抬起(为了节省性能,因为下次按下的时候还会有抬起事件。)
4.按钮的left属性(就是按钮相对于其父元素滑动条的left距离)=
移动时的鼠标对象到可视页面的X,
减去滑动条到页面的left值,
再减去按下按钮时的事件对象相对于其事件源的x值。

下面是html代码:

<body>
<div class="scroll" id="scrollBar">
    <div class="bar">div>
    <div class="mask">div>
div>
<div class="demo" id="demo">div>
body>

下面是css代码:

 <style>
        *{
            margin: 0;
            padding: 0;
            user-select: none;
        }
        .scroll{
            width: 400px;
            height: 8px;
            background-color: #ccc;
            margin: 100px;
            position: relative;
            border-radius: 10px;
        }
        .bar{
            width: 10px;
            height: 22px;
            background-color: #369;
            position: absolute;
            top: -7px;
            left: 0;
            cursor: pointer;
            border-radius: 10px;
        }
        .mask{
            width: 0;
            height: 100%;
            background-color: #336699;
            /*position: absolute;
            top: 0;
            left: 0;*/
        }
        .demo{
            width: 30px;
            height: 22px;
            border:5px solid #ffff00;
            position: fixed;
           top: 90px;
           left: 20px;
            text-align: center;
        }
    style>

你可能感兴趣的:(前端h5,JS,用JS模拟拖拽滚动条)