多物体链式运动,多值同时运动

实现函数

/*
 * 多物体链式运动,多值同时运动
 */
function startMove(obj, json, callback){
	clearInterval(obj.timer);
	var iSpeed, iCur;
	obj.timer = setInterval(function(){
		var stopFlag = true;
		for(var attr in json) {
			if(attr == 'opacity') {    //透明度需要单独设定,因为它的范围是0~1,而且没有单位
				iCur = parseFloat( getStyle(obj, 'opacity') ) * 100;
			} else {
				iCur = parseInt( getStyle(obj, attr) );
			}
			iSpeed = (json[attr] - iCur) / 7;    //缓冲运动
			iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
			if(attr == 'opacity') {
				obj.style.opacity = (iCur+iSpeed) / 100;
			} else {
				obj.style[attr] = iCur + iSpeed + 'px';
			}
			if(iCur != json[attr]) {
				stopFlag = false;
			}
		}
		if(stopFlag) {  //当所有属性都达到目标值时
			clearInterval(obj.timer);    //清除定时器
			callback && callback();       //调用回掉函数
		}
	}, 30);
}

所调用的getStyle函数

//获取样式属性值
function getStyle(obj, attr) {
    if(obj.currentStyle) {	//兼容IE
      return obj.currentStyle[attr];
    } else {
      return window.getComputedStyle(obj,false)[attr];
    }
}

HTML部分,需要将上面两个函数添加进去

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>test</title>

<style type="text/css">
div{
	position: absolute;
	left: 0px;
	width: 100px;
	height: 100px;
	background: orange;
  opacity: 1;
}
.top {
  top: 100px;
}
.bottom{
  top: 400px;
}
</style>
</head>

<body>
	<div class="top"></div>
	<div class="bottom"></div>

<script type="text/javascript">
console.log('多物体链式运动,多值同时运动')
var oDivArr = document.getElementsByTagName('div');
var targetObj ={
	width: 400,
	height: 400,
	opacity: 50,
	left: 300,
	top: 200
}

oDivArr[0].onclick = function() {
	startMove(this, targetObj, function(){
		startMove(oDivArr[1], targetObj)
	})
}

</script>

</body>
</html>

效果


猜你喜欢

转载自blog.csdn.net/qq_37746973/article/details/80750939
今日推荐