前面我们都是用定时器实现单物体运动,在项目中我们往往不是做单物体运动,而是做多物体多个值变化。
这里我们将通过改变参数实现多物体、任意值的运动。一个运动框架,可以改变物体的宽度、高度、边框、字体大小、透明度等等。
注意:上面章节中,我们都是用offsetWidth(offsetWidth包含边框和padding等)等设置、获取样式,因为使用方式简单,但是如果物体包含border和padding等样式的时候,就会报错,所以这里我们用更加严谨的方式currentStyle和getComputedStyle来获取样式。
注意:在电脑中我们并不能真正的存储一些具体的数值,我们存储的是一些近似值,比如0.07*100,最终结果并不是7,所以在下面我们会四舍五入转换为整数。
注意注意:在多物体运动时,定时器和一些参数一定不要共用,否则会到这这个运动没有完成就被清除然后触发了其他运动,一些参数也不可以共用,会导致一些参数没有达到固定值就被重新操作。所以,下例中的定时器都是放在元素上。
下面是我们做的一个例子
<!DOCTYPE html>
<html>
<head>
<title>运动改变宽度、高度、边框、字体、透明度</title>
<style>
div {
width: 200px;
height: 200px;
background: red;
margin: 10px;
float: left;
border:1px solid #000;
font-size:14px;
}
div:nth-child(5) {
filter: alpha(opacity:30);
opacity:0.3;
}
</style>
<script>
window.onload = function() {
var oDiv1 = document.getElementById("div1");
var oDiv2 = document.getElementById("div2");
var oDiv3 = document.getElementById("div3");
var oDiv4 = document.getElementById("div4");
var oDiv5 = document.getElementById("div5");
oDiv1.onmouseover=function(){
startMove(this,"height", 400)
}
oDiv1.onmouseout=function(){
startMove(this,"height", 200)
}
oDiv2.onmouseover=function(){
startMove(this,"width", 400)
}
oDiv2.onmouseout=function(){
startMove(this, "width",200)
}
oDiv3.onmouseover=function(){
startMove(this,"fontSize", 50)
}
oDiv3.onmouseout=function(){
startMove(this, "fontSize",14)
}
oDiv4.onmouseover=function(){
startMove(this,"borderWidth", 100)
}
oDiv4.onmouseout=function(){
startMove(this, "borderWidth",1)
}
oDiv5.onmouseover=function(){
startMove(this,"opacity", 100)
}
oDiv5.onmouseout=function(){
startMove(this, "opacity",30)
}
}
function getStyle(obj,name){
if(obj.currentStyle){
return obj.currentStyle[name];
}
else{
return getComputedStyle(obj,false)[name];
}
}
function startMove(obj, attr, iTarget) {
clearInterval(obj.timer);
obj.timer = setInterval(function() {
var cur=0;
if(attr==="opacity"){
cur=Math.round(parseFloat(getStyle(obj,attr))*100);//有可能会出现误差0.07*100
}
else{
cur=parseInt(getStyle(obj,attr));
}
var speed = (iTarget - cur) / 6;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if (cur === iTarget) {
clearInterval(obj.timer);
} else {
if(attr==="opacity"){
obj.style.filter="alpha(opacity:"+cur+speed+")";
obj.style.opacity=(cur+speed)/100;
}else{
obj.style[attr]=cur+speed+"px";
}
}
}, 30)
}
</script>
</head>
<body>
<div id="div1">变宽</div>
<div id="div2">变高</div>
<div id="div3">文字变大</div>
<div id="div4">borderwidth</div>
<div id="div5">透明度</div>
</body>
</html>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。