JavaScript实战(原生range和自定义特效)简单实例
今天我又码了两个特效:一个是用原生input[type=range]的,另一个完全自定义的;下面是完整代码和演示:
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title></title>
<style>
#tip{
position:absolute;
top:30px;
left:0;
right:0;
width:200px;
height:160px;
margin:auto;
border:1pxsolidgray;
background-color:cornsilk;
}
#tipdiv{
position:relative;
width:100%;
height:80px;
border-bottom:1pxsolidgray;
}
.out{
position:relative;
left:16%;
display:inline-block;
border:2pxsolidroyalblue;
margin-top:20px;
width:130px;
height:20px;
background-color:lightgoldenrodyellow;
}
.in{
display:block;
height:20px;
line-height:20px;
text-align:right;
color:white;
width:50%;
background-image:linear-gradient(toright,powderblue0%,#33669950%,red100%);
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
}
input[type="range"]{
position:relative;
left:19%;
top:5px;
box-shadow:01px00px#424242,01px0#060607inset,0px2px10px0pxblackinset,1px0px2pxrgba(0,0,0,0.4)inset,00px1pxrgba(0,0,0,0.6)inset;
background-color:lightskyblue;
border-radius:15px;
width:60%;
-webkit-appearance:none;
-moz-appearance:none;
appearance:none;
height:15px;
}
input[type="range"]::-webkit-slider-thumb{
-webkit-appearance:none;
-moz-appearance:none;
appearance:none;
height:20px;
width:10px;
background-color:coral;
border-radius:15px;
-webkit-box-shadow:0-1px1pxblackinset;
-moz-box-shadow:0-1px1pxblackinset;
box-shadow:0-1px1pxblackinset;
}
input[type="range"]:before{
content:attr(value);
color:white;
border-radius:5px005px;
background-color:lightskyblue;
}
input[type="range"]:after{
content:attr(max);
color:white;
border-radius:05px5px0;
background-color:lightskyblue;
}
.b{
display:inline-block;
width:22px;
padding:0;
}
#outer2{left:5px}
#btn1{
position:relative;
left:5px;
}
#btn2{
position:relative;
left:5px;
}
</style>
<script>
window.onload=function(){
//原生组件range
varinner=document.getElementById('inner1');
varrange=document.getElementById('range');
range.onclick=function(){
inner.innerHTML=range.value;
inner.style.width=range.value+'%';
};
range.onmousemove=function(){
inner.innerHTML=range.value;
inner.style.width=range.value+'%';
};
//自定义组件
varouter2=document.getElementById('outer2');
varinner2=document.getElementById('inner2');
varbtn1=document.getElementById('btn1');
varbtn2=document.getElementById('btn2');
varid,id1;
varvalue=parseInt(inner2.innerHTML);
vara=parseFloat(window.getComputedStyle(outer2,null).width)/100;
//减---
btn1.onmousedown=function(){
id1=setTimeout(functionchange(){
if(value>0){
value--;
inner2.innerHTML=value;
inner2.style.width=(value)*a+'px';
id=setTimeout(function(){
clearTimeout(id);
change();
},16.7);
}else{clearTimeout(id);}
},500);
};
btn1.onmouseup=function(){clearTimeout(id1);clearTimeout(id)};
btn1.onclick=function(){
console.log('a:'+a+','+'value:'+value);
if(value>0){
value--;
inner2.innerHTML=value;
inner2.style.width=(value)*a+'px';
}
};
//加+++
btn2.onmousedown=function(){
id1=setTimeout(functionchange(){
if(value<100){
value++;
inner2.innerHTML=value;
inner2.style.width=value*a+'px';
id=setTimeout(function(){
clearTimeout(id);
change();
},16.7);
}else{clearTimeout(id);}
},500);
};
btn2.onmouseup=function(){clearTimeout(id1);clearTimeout(id)};
btn2.onclick=function(){
if(value<100){
value++;
inner2.innerHTML=value;
inner2.style.width=value*a+'px';
}
}
}
</script>
</head>
<body>
<formid="tip">
<div>
<spanid="outer1"class="out">
<spanid="inner1"class="in">50</span>
</span>
<inputid="range"class="ran"type="range"min="0"max="100"step="1"value="50">
</div>
<divid="d2">
<inputid="btn1"class="b"type="button"value="<">
<spanid="outer2"class="out">
<spanid="inner2"class="in">50</span>
</span>
<inputid="btn2"class="b"type="button"value=">">
</div>
按住按钮0.5秒,会持续变化!
</form>
</body>
</html>
第一个的实现很简单,就不做解释了,自己看代码;
这里主要介绍第二个实例的实现:
在我们看到一个需求,或者别人的特效时,不急着去看别人的代码,先想想,要是你,该怎么实现?先把思路整理出来
该特效的实现原理:
1.一个span内嵌套一个span;
•外面的span:只显示宽、高、边框,背景无
•里面的span:高度和外面一样,宽度为默认的50%,先设置好背景颜色为线性渐变
2.按钮的onclick事件比较简单,点一下,就改变里面的span的宽度和显示数字
3.当按钮的onmousedown时,启动计时器,等500ms后执行函数change函数,而change函数是一个用setTimeout回调自身的函数,他会没16.7ms回调一次,达到动画效果
难点解析:
1.这一句vara=parseFloat(window.getComputedStyle(outer2,null).width)/100;
用来获得初始值,如果你用outer2.style.width
是得不到值得,当然你也可以将a设个固定值,比如这里可以设为
vara=1.3,
注意IE9以下不支持getComputedStyle方法,
IE的Element对象有currentStyle属性;
2.这一句
btn1.onmouseup=function(){clearTimeout(id1);
clearTimeout(id)};
很关键,没了它,在onclick触发之前,会先触发onmosedown,在500ms后,开始执行,之后一直执行外层的计时器;
3.其它的都不是难点;
这个实例其实扩展到其它很多应用,比如可以把中间的显示部分替换为文章、图片等等,再把按钮换成自定义的,效果将会很酷的!
如果您觉得我有写的不好的地方,欢迎指出!
以上这篇JavaScript实战(原生range和自定义特效)简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。