滑块拖动

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style type="text/css">
        *{
            padding: 0%;
            margin: 0%;
        }

        body{
            background: #006b9d;
        }

        #verify{
            background: url(bg.png);
            width: 508px;
            height: 532px;
            margin: 50px auto; /*上下边距为50px,左右边距自动形成,形成水平方向的居中显示*/
            position: relative;
        }

        #drag{
            width: 171px;
            height: 140px;
            position: absolute;
            /*top为185px,left为156时重合*/
            top: 185px;
            left: 0px;
            background: url(drag.png);
        }

        #dot{
            width: 29px;
            height: 29px;
            background: url(dot.png);
            position: absolute;
            top: 460px;
            left: 70px;
        }

        #success{
            position: absolute;
            font-size: 32px;
            top: 130px;
            right: 0px;
            font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
            columns: #fff;
            background: #C33;
            padding: 5px 20px;
            /*隐藏,拖拽成功时才出现*/
            display: none;
        }
    </style>
</head>
<body>
    <div id="verify">
        <div id="drag"></div>
        <div id="dot"></div>
        <p id="success">Success!</p>
      </div>

      <script type="text/javascript">
        var max = 350; //设置最大可拖动的滑块的范围,等于滑块区域的宽度减去图片自身的宽度
        var final = 156; //设置拼图相对于div的正确位置的坐标
        var buffer = 7;
        var drag = document.getElementById("drag");
        var dot = document.getElementById("dot");
        var success = document.getElementById("success");

        var dotStart = dot.offsetLeft; //获取点的起始坐标
        var dragStart = drag.offsetLeft;//获取滑块拼图的起始坐标

        drag.style.left = -Math.random()* 200+drag.offsetLeft+"px";

        dot.onmousedown = function(e){
            var startX = e.clientX;//按下时鼠标的指针x坐标
            /*dotLeft与dotStart不同,dotLeft有可能是第二次或某一次按下时的坐标,和dotStart的坐标不同,每次刷新界面时,dotStart都会重置为初始值*/
            var dotLeft = dot.offsetLeft;

            document.οnmοusemοve=function(e){
                /*由dot的移动的距离to来改变dot自身和drag的位置*/
                var move = e.clientX - startX;
                var to = move + dotStart; //目的坐标值
                /*如果目标的位置大于最右侧的位置就停留在最右侧,如果dot的位置小于其实坐标,就停留在最左侧
                    max为进度条的长度
                */
                if(to > dotStart+max){
                    to = dotStart+max;
                
                }else if(to < dotStart){
                    to = dotStart;
                }

                dot.style.left = to +"px";
                drag.style.left = (dragStart+(to-dotStart))+"px";
            }

            document.onmouseup = function(e){
                /*不要忘记对之前事件的监听*/
                this.onmousemove = null;
                if(Math.abs(drag.offsetLeft-final) < buffer){
                    console.log(drag.offsetLeft);//157,
                    //offsetLeft 和 offsetTop 返回的是相对于 offsetParent 元素的距离,而 offsetParent 指的是一个元素最近的父级定位元素,如果没有定位元素就是文档根节点。
                    success.style.display = "block";
                }else{
                    success.style.display = "none";
                }
            }
        }
      </script>
</body>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用原生JavaScript以面向对象方式实现Slider块的开启范围选择用法的示例代码: ```javascript class Slider { constructor(options) { this.ele = document.querySelector(options.ele); this.min = options.min; this.max = options.max; this.value = options.value || [this.min, this.max]; this.setTips = options.setTips || null; this.done = options.done || null; this.sliderRange = null; this.sliderThumbStart = null; this.sliderThumbEnd = null; this.draggingStart = false; this.draggingEnd = false; this.init(); } init() { this.createSlider(); this.updateSlider(); this.sliderThumbStart.addEventListener('mousedown', this.startDraggingStart.bind(this)); this.sliderThumbEnd.addEventListener('mousedown', this.startDraggingEnd.bind(this)); document.addEventListener('mousemove', this.handleDragging.bind(this)); document.addEventListener('mouseup', this.stopDragging.bind(this)); } createSlider() { this.sliderRange = document.createElement('div'); this.sliderRange.classList.add('slider-range'); this.sliderThumbStart = document.createElement('div'); this.sliderThumbStart.classList.add('slider-thumb'); this.sliderThumbStart.classList.add('slider-thumb-start'); this.sliderThumbEnd = document.createElement('div'); this.sliderThumbEnd.classList.add('slider-thumb'); this.sliderThumbEnd.classList.add('slider-thumb-end'); this.ele.appendChild(this.sliderRange); this.ele.appendChild(this.sliderThumbStart); this.ele.appendChild(this.sliderThumbEnd); } updateSlider() { const rangeWidth = this.ele.clientWidth; const startPercentage = ((this.value[0] - this.min) / (this.max - this.min)) * 100; const endPercentage = ((this.value[1] - this.min) / (this.max - this.min)) * 100; this.sliderRange.style.left = `${startPercentage}%`; this.sliderRange.style.width = `${endPercentage - startPercentage}%`; } startDraggingStart() { this.draggingStart = true; } startDraggingEnd() { this.draggingEnd = true; } handleDragging(event) { if (this.draggingStart || this.draggingEnd) { const rangeWidth = this.ele.clientWidth; const startX = this.ele.getBoundingClientRect().left; const endX = startX + rangeWidth; let newValue; if (this.draggingStart) { newValue = ((event.clientX - startX) / rangeWidth) * (this.max - this.min) + this.min; if (newValue < this.min) { newValue = this.min; } else if (newValue > this.value[1]) { newValue = this.value[1]; } this.value[0] = newValue; this.updateSlider(); } if (this.draggingEnd) { newValue = ((event.clientX - startX) / rangeWidth) * (this.max - this.min) + this.min; if (newValue > this.max) { newValue = this.max; } else if (newValue < this.value[0]) { newValue = this.value[0]; } this.value[1] = newValue; this.updateSlider(); } if (typeof this.setTips === 'function') { this.setTips(this.value); } } } stopDragging() { if (this.draggingStart || this.draggingEnd) { this.draggingStart = false; this.draggingEnd = false; if (typeof this.done === 'function') { this.done(this.value); } alert(`当前的value参数为:${this.value}`); } } } // 使用示例 const slider = new Slider({ ele: '.slider-container', min: 0, max: 100, value: [30, 60], setTips: (value) => { console.log(`当前的value参数为:${value}`); }, done: (value) => { console.log(`块拖拽完毕,当前的value参数为:${value}`); } }); ``` 在上述示例中,我们通过`class Slider`定义了一个Slider类,构造函数中接收了`options`对象作为参数,包含了初始化Slider时的各种配置信息。在`init`方法中,我们创建了块的DOM元素,并添加了相应的事件监听器。通过`updateSlider`方法更新块的位置和宽度。 在拖动块过程中,会触发`handleDragging`方法来更新块的值和位置,并通过`setTips`方法设置提示文本。当拖动结束时,会触发`stopDragging`方法,其中会调用`done`方法进行回调,并使用`alert`模拟提示弹窗。 你可以根据需要修改样式和事件处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值