本文通过一个具体的JavaScript实例,演示如何实现可拖拽的进度条或数量选择控件。文章详细解析了HTML结构与CSS样式,并重点讲解了核心JS函数drag的参数配置,包括被拖拽对象、限制区域、背景反馈及方向控制,帮助开发者快速掌握拖拽交互的开发技巧。
JavaScript拖拽实例概述
此前文章已阐述过拖拽的基本原理,理论具备后,关键在于实际应用。本文将展示一个基于拖拽思想的具体案例,供读者参考,具体效果可参考下方图片。

该示例呈现为一个简单的拖拽条,其功能可灵活定义为滚动条、表单中的数值选择器或进度条等。根据实际需求,可调整其表现形式。接下来将详细介绍实现方法。
鉴于拖拽原理已在《JavaScript小实例:PC网页里的拖拽》中详细说明,此处不再赘述。不清楚原理的读者可查阅前文,本文直接提供代码实现。
CSS样式部分如下:
HTML与CSS结构实现
<style>
#drag_wrap{
width:220px;
height:10px;
position:relative;
margin:100px auto;
}
.dis_bg{
width:200px;
height:10px;
border-radius:10px;
background:#ccc;
margin-left:10px;
}
#drag_bg{
width:0;
height:10px;
border-radius:10px;
background:#0CF;
}
#drag_box{
width:20px;
height:20px;
border-radius:10px;
background:#F30;
position:absolute;
top:-5px;
left:0;
cursor:move;
}
#drag_box span{
width:40px;
height:20px;
text-align:center;
line-height:20px;
border:1px solid #ccc;
position:absolute;
top:-25px;
left:-10px;
color:#333;
background:#fff;
}
#drag_wrap1{
width:10px;
height:220px;
position:relative;
margin:100px auto;
}
.dis_bg1{
width:10px;
height:200px;
border-radius:10px;
background:#ccc;
position:absolute;
top:10px;
}
#drag_bg1{
width:10px;
height:0;
border-radius:10px;
background:#0CF;
}
#drag_bg1{
width:10px;
height:0;
border-radius:10px;
background:#0CF;
}
#drag_box1{
width:20px;
height:20px;
border-radius:10px;
background:#F30;
position:absolute;
top:-5px;
left:-5px;
cursor:move;
}
#drag_box1 span{
width:40px;
height:20px;
text-align:center;
line-height:20px;
border:1px solid #ccc;
position:absolute;
top:0;
left:25px;
color:#333;
background:#fff;
}
</style>
HTML结构部分如下:
<div id="drag_wrap">
<div class="dis_bg">
<div id="drag_bg"></div>
</div>
<div id="drag_box"><span>0</span></div>
</div>
<div id="drag_wrap1">
<div class="dis_bg1">
<div id="drag_bg1"></div>
</div>
<div id="drag_box1"><span>0</span></div>
</div>
JavaScript逻辑部分如下:
JavaScript核心逻辑与参数详解
window.onload = function(){
drag("drag_box","drag_wrap","drag_bg","left");
drag("drag_box1","drag_wrap1","drag_bg1","top");
function drag(obj,parentNode,bgObj,attr,endFn){
var obj = document.getElementById(obj);
var parentNode = document.getElementById(parentNode);
var bgObj = document.getElementById(bgObj);
var oNum = obj.getElementsByTagName('span')[0];
obj.onmousedown = function(ev){
var ev = ev || event;
//非标准设置全局捕获(IE)
if(obj.setCapture){
obj.setCapture()
};
var disX = ev.clientX - this.offsetLeft,
disY = ev.clientY - this.offsetTop;
var oWidth = obj.offsetWidth,
oHeight = obj.offsetHeight;
var pWidth = parentNode.offsetWidth,
pHeight = parentNode.offsetHeight;
document.onmousemove = function(ev){
var ev = ev || event;
if(attr == "left"){ //横向
var left = ev.clientX - disX;
//左侧
if(left <= 0){
left = 0;
}else if(left > pWidth - oWidth){//右侧
left = pWidth - oWidth;
};
obj.style.left = bgObj.style.width = left + 'px';
oNum.innerHTML = left;
}else if(attr == "top"){ //竖向
var top = ev.clientY - disY;
//上面
if(top <= 0){
top = 0;
}else if(top > pHeight - oHeight){//下面
top = pHeight - oHeight;
};
obj.style.top = bgObj.style.height = top + 'px';
oNum.innerHTML = top;
};
};
document.onmouseup = function(ev){
var ev = ev || event;
document.onmousemove = document.onmouseup = null;
endFn && endFn();
//非标准释放全局捕获(IE)
if(obj.releaseCapture){
obj.releaseCapture()
};
};
return false;
};
}
}
相关参数说明如下:
该函数接收5个参数,分别为obj、parentNode、bgObj、attr和endFn,具体含义如下:
obj:指定需要被拖拽的目标元素。
parentNode:定义限制被拖拽对象活动范围的容器,通常设置为该元素的父级元素。
bgObj:指定拖动过程中显示的背景反馈对象。
attr:包含left和top两个属性值,用于指定拖拽方向是横向还是纵向。
endFn:可选的回调函数,若提供则执行,否则不执行。
以上内容为本文的全部介绍,希望能为读者的学习提供有益帮助。