原生JS实现滑块效果

本文介绍了如何使用HTML、CSS和JavaScript实现一个可响应触摸的滑动进度条,包括鼠标和触屏操作的处理。
摘要由CSDN通过智能技术生成

html

<div id="range">
    <span>0%</span>
    <div class="bar">
        <div class="progress"></div>
        <div class="dot"></div>
    </div>
</div>

css

* {
	touch-action:manipulation
}
#range {
	width:500px;
	height:80px;
	margin:100px auto;
	position:relative;
}
.bar {
	width:500px;
	height:12px;
	border-radius:10px;
	background:#e4e7ed;
	position:absolute;
	top:0;
	bottom:0;
	left:0;
	right:0;
	margin:auto;
	cursor:pointer;
}
.progress {
	width:0;
	height:12px;
	border-radius:10px;
	background:#409eff;
}
.dot {
	width:20px;
	height:20px;
	background:#fff;
	border:1px solid #409eff;
	position:absolute;
	bottom:0;
	top:0;
	margin:auto 0;
	border-radius:50%;
	cursor:pointer;
}

js

// 进度条
function slider(obj, maximum = 100) { // maximum最大值默认为100
    var range = document.getElementById(obj),
        bar = range.getElementsByTagName("div")[0],
        progress = bar.children[0],
        dot = bar.children[1],
        num = range.getElementsByTagName("span")[0];
    bar.className = "bar";
    progress.className = "progress";
    dot.className = "dot";
    num.className = "num";
    /*
     * offsetWidth 获取当前节点的宽度 (width + border + padding)
     **/
    // 总长度减去原点覆盖的部分
    var rest = bar.offsetWidth - dot.offsetWidth;

    // 判断是否移动端
    if ((!navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|Symbian|Windows Phone|Phone)/i))) {
        // 鼠标按下事件
        dot.onmousedown = function(ev) {
            /*
             * offsetLeft 获取的是相对于父对象的左边距, 返回的是数值, 没有单位
             */
            let dotL = dot.offsetLeft;
            let e = ev || window.event; //兼容性
            /*
             * clientX 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(或客户区)的水平坐标。
             */
            let mouseX = e.clientX //鼠标按下的位置
            window.onmousemove = function(ev) {
                let e = ev || window.event;
                // 浏览器当前位置减去鼠标按下的位置
                let moveL = e.clientX - mouseX; //鼠标移动的距离
                // 保存newL是必要的    
                let newL = dotL + moveL; //left值
                // 判断最大值和最小值
                if (newL < 0) {
                    newL = 0;
                }
                if (newL >= rest) {
                    newL = rest;
                }
                // 改变left值
                dot.style.left = newL + 'px';
                // 计算比例
                let bili = newL / rest * maximum;
                num.innerHTML = Math.ceil(bili);
                progress.style.width = bar.offsetWidth * Math.ceil(bili) / maximum + 'px';
                return false; //取消默认事件
            }
            window.onmouseup = function() {
                window.onmousemove = false; //解绑移动事件
                return false;
            }
            return false;
        };
        // 点击进度条
        bar.onclick = function(ev) {
            let left = ev.clientX - range.offsetLeft - dot.offsetWidth / 2;
            if (left < 0) {
                left = 0;
            }
            if (left >= rest) {
                left = rest;
            }
            dot.style.left = left + 'px';
            let bili = left / rest * maximum;
            num.innerHTML = Math.ceil(bili);
            progress.style.width = bar.offsetWidth * Math.ceil(bili) / maximum + 'px';
            return false;
        }
    } else {
        // 触摸事件
        dot.ontouchstart = function(ev) {
            let dotL = dot.offsetLeft;
            let e = ev || window.event; //兼容性
            let mouseX = e.touches[0].clientX; //触摸的位置
            window.ontouchmove = function(ev) {
                let e = ev || window.event;
                // 浏览器当前位置减去鼠标按下的位置
                let moveL = e.touches[0].clientX - mouseX; //触摸移动的距离
                // 保存newL是必要的    
                let newL = dotL + moveL; //left值
                // 判断最大值和最小值
                if (newL < 0) {
                    newL = 0;
                }
                if (newL >= rest) {
                    newL = rest;
                }
                // 改变left值
                dot.style.left = newL + 'px';
                // 计算比例
                let bili = newL / rest * maximum;
                num.innerHTML = Math.ceil(bili);
                progress.style.width = bar.offsetWidth * Math.ceil(bili) / maximum + 'px';
                return false; //取消默认事件
            }
            window.ontouchend = function() {
                window.ontouchmove = false; //解绑移动事件
                return false;
            }
            return false;
        };
        // 点击进度条
        bar.ontouchstart = function(ev) {
            let left = ev.touches[0].clientX - range.offsetLeft - dot.offsetWidth / 2;
            if (left < 0) {
                left = 0;
            }
            if (left >= rest) {
                left = rest;
            }
            dot.style.left = left + 'px';
            let bili = left / rest * maximum;
            num.innerHTML = Math.ceil(bili);
            progress.style.width = bar.offsetWidth * Math.ceil(bili) / maximum + 'px';
            return false;
        }
    }
}

slider("range");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的原生JS实现滚动尺子的代码: HTML代码: ``` <div class="slider-wrapper"> <div class="slider-track"></div> <div class="slider-handle"></div> </div> ``` CSS代码: ``` .slider-wrapper { width: 300px; height: 30px; border: 1px solid #ccc; position: relative; } .slider-track { width: 100%; height: 5px; background-color: #ccc; position: absolute; top: 50%; transform: translateY(-50%); } .slider-handle { width: 20px; height: 20px; background-color: #fff; border: 1px solid #ccc; border-radius: 50%; position: absolute; top: 50%; transform: translate(-50%, -50%); cursor: pointer; } ``` JS代码: ``` var sliderWrapper = document.querySelector('.slider-wrapper'); var sliderHandle = sliderWrapper.querySelector('.slider-handle'); var sliderTrack = sliderWrapper.querySelector('.slider-track'); var isDragging = false; sliderHandle.addEventListener('mousedown', function(e) { isDragging = true; }); document.addEventListener('mousemove', function(e) { if (isDragging) { var x = e.clientX - sliderWrapper.offsetLeft; if (x < 0) { x = 0; } else if (x > sliderWrapper.offsetWidth - sliderHandle.offsetWidth) { x = sliderWrapper.offsetWidth - sliderHandle.offsetWidth; } var percent = x / (sliderWrapper.offsetWidth - sliderHandle.offsetWidth); sliderHandle.style.left = percent * 100 + '%'; sliderTrack.style.width = percent * 100 + '%'; } }); document.addEventListener('mouseup', function(e) { isDragging = false; }); ``` 说明:该代码使用了部分ES6语法,需要在支持ES6的浏览器中运行。该滚动尺子可拖动滑块调节滑块位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值