仰望星空的天台

0%

关于JS拖动条的原码解读

原码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>滚动条拖动评分的JS效果</title>
<style>
body{
	margin:50px;
}
.scale_panel{
	font-size:12px;
	color:#999;
	width:200px;
	position:absolute; 
	line-height:18px; 
	left:60px;
	top:-0px;
}
.scale_panel .r{
	float:right;
}
.scale span{
	background:url(./demopic/pic1.gif) no-repeat; 
	width:8px;
	height:16px; 
	position:absolute; 
	left:-2px;
	top:-1px;
	cursor:pointer;
}
.scale{
	background:url(./demopic/pic2.gif) repeat-x 0 100%;
	border-left:1px #83BBD9 solid;
	border-right:1px red solid;
	width:200px;
	height:10px; 
	position:relative; 
	font-size:0px;
}
.scale div{
	background:url(./demopic/pic3.gif) repeat-x;
	width:0px; 
	position:absolute; 
	width:0;
	left:0;
	height:5px;
	bottom:0;
}
li{
	font-size:12px;
	line-height:50px;
	position:relative; 
	height:50px; 
	list-style:none;
}
</style>
</head>
<body>
<ul>
 <li>爱情 <span id="title">0</span>
<div class="scale_panel">
	<span class="r">100</span>0
	<div class="scale" id="bar">
		<div></div>
		<span id="btn"></span>
	</div> 
</div> 
 </li>
 <li>事业 <span id="title2">0</span>
<div class="scale_panel">
	<span class="r">100</span>0
	<div class="scale" id="bar2">
		<div></div>
		<span id="btn2"></span>
	</div> 
</div> 
 </li>
 <li>家庭 <span id="title3">0</span>
<div class="scale_panel">
	<span class="r">100</span>0
	<div class="scale" id="bar3">
		<div></div>
		<span id="btn3"></span>
	</div> 
</div> 
 </li>
</ul>
</body>

<script>

// 原理是通过拉动鼠标拖拽动态改变 btn的position(拖动按钮)
// 动态改变 每一个bar下div的长度(已完成进度)

// 难点在于js
// 声明了一个全局变量scale 用来构造方法
// 通过prototype原型添加对象属性的两个方法init 和 ondrag


// 构造函数+原型模式

// 构造函数(不同的DOM结点获取)
scale=function (btn,bar,title){
	this.btn=document.getElementById(btn);
	this.bar=document.getElementById(bar);
	this.title=document.getElementById(title);
	this.step=this.bar.getElementsByTagName("DIV")[0];
	this.init();
};
// 原型方法(通用的功能)
scale.prototype={
	init:function (){
		// 这里作用域的this指的是调用的实例 scale 
		var f=this;
		f.btn.onmousedown=function (ev){
			var x=(ev||window.event).clientX;
			
			// 这里作用域的this指的是当前鼠标拖动的按钮的DOM结点
			var l=this.offsetLeft;
			// max保存剩下的百分比
			var max=f.bar.offsetWidth-this.offsetWidth;
			document.onmousemove=function (ev){
				var thisX=(ev||window.event).clientX;
				// 按下那一点鼠标x轴坐标和拖动到某一点的鼠标x轴坐标差 + 原本按钮的位移 ,每次拖动得到的最大值取最小值,最终产生显示
				var to=Math.min(max,Math.max(-2,l+(thisX-x)));
				// 根据计算的值让滑动的按钮移动
				f.btn.style.left=to+'px';
				// 根据计算的值让显示的百分比改变
				f.ondrag(Math.round(Math.max(0,to/max)*100),to);

				// Selection对象浏览器兼容,详情百度
				window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
			};

			// 函数的三种声明方式要牢记
			// 1.function fn(){}   直接语法声明(常见)
			// 2.var fn  = function(){} 表达式声明
			// 3.var fn  = new function('参数1','参数2' ···, '执行的函数语句'); 构造函数声明 
			document.onmouseup=new Function('this.onmousemove=null');
		};
	},
	ondrag:function (pos,x){
		this.step.style.width=Math.max(0,x)+'px';
		this.title.innerHTML=pos+'%';
	}
}

// 构造3个实例
new scale('btn','bar','title');
new scale('btn2','bar2','title2');
new scale('btn3','bar3','title3');
</script>
</html>

效果展示

原码提供

鬼少博客

Table of Contents