<!DOCTYPE html>
<html lang="zh">
<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>原生js实现拖动滑块验证</title>
<style>
#box{
width:150px;
height: 30px;
position: relative;
background: #ccc;
}
#box .btn{
width:20px;
height: 30px;
box-sizing: border-box;
border:1px solid #eee;
text-align: center;
line-height: 30px;
position: absolute;
left: 0;
top: 0;
z-index: 3;
font-size: 18px;
background: #fff;
cursor: pointer;
}
#box .bg{
width: 0;
height: 100%;
background: #f0f;
position: absolute;
left: 0;
top: 0;
z-index: 1;
}
#box .text{
width: 100%;
height: 100%;
text-align: center;
position: absolute;
line-height: 30px;
z-index: 2;
font-size: 18px;
left: 0;
top: 0;
margin: 0;
}
</style>
</head>
<body>
<div id="box">
<div class="btn">》</div>
<p class="text">拖动滑块验证</p>
<div class="bg"></div>
</div>
</body>
</html>
<script type="text/javascript">
var flag=false;//处理验证是否通过,默认为不通过
var box=document.getElementById('box');//大盒子
var btn=document.getElementsByClassName('btn')[0];//滑块
var text=document.getElementsByClassName('text')[0];//文字
var bg=document.getElementsByClassName('bg')[0];//背景
//鼠标按下事件
btn.onmousedown=function(e){
var downX=e.clientX;//按下按钮后与窗口的x轴间距
// 鼠标移动事件
btn.onmousemove=function(e){
var moveX=e.clientX-downX;//滑动的时候距离窗口的x轴的间距
//只有在大于0的时候才拖动,否则会出现反向拖动
if(moveX>0){
btn.style.left=moveX+'px';//滑块与左边的距离
bg.style.width=moveX+'px'; //背景的宽度就是滑块距离左边的位置
if(moveX>=(box.offsetWidth-btn.offsetWidth)){
text.innerText="验证成功";
text.style.color="#fff";
btn.onmousemove=null;
btn.onmousedown=null;
flag=true;
}
}
}
}
// 鼠标松开事件
btn.onmouseup=function(){
//为假的时候
if(flag==false){
btn.onmousemove=null;//清除事件
btn.style.left=0;
bg.style.width=0;
}
}
</script>
- getElementsByClassName()方法返回文档中所有指定类名的元素集合,代表一个有顺序的节点列表
- clientX,点击位置距离当前body可视区域的x,y坐标
- btn.οnmοusemοve=null;进行事件解除。这个有没有影响是看你实际开发中是否有别的也需要用到document.onmousedown情况。
这个例子下,这句刚好没影响。但是最好建议是加上的 - 涉及到的事件:
按下 onmousedown
拖动 onmousemove
松开 onmouseup