<head>
<title>5-2多物体同时运动</title>
<!--引用js文件,把运动代码封装起来 -->
<style type="text/css">
*
{
margin: 0;
padding: 0;
}
ul li
{
list-style: none;
}
li
{
width: 200px;
height: 100px;
background: yellow;
margin-bottom:20px;
border: 4px solid #000;
fliter: alpha(opacity:30);
opacity: 0.3;
}
</style>
<script type="text/javascript" src="Scripts/PerfectMove.js"></script>
</head>
<body>
<ul>
<li id="li1"></li>
</ul>
</body>
</html>
<script type="text/javascript">
//链式动画:执行完当前动画,调用回调函数执行下一个动画
window.onload = function () {
var li1 = document.getElementById('li1');
li1.onmouseover = function () {
//statMove(li1, 'width', 400);
//statMove(li1, 'height', 200);
//只会执行高的运动,因为框架move.js那边方法一进来就clearInterval(obj.timer);宽度变化刚开始就清除
statMove(li1, {height: 200,width:400,opacity:100},8);//同时运动
}
li1.onmouseout = function () {
statMove(li1, { height: 100, width: 200, opacity: 30 }, 8);
}
}
</script>
PerfectMove.js
//move.js的完整版 PerfectMove.js 可同时运动
//move.js无法实现同时运动 statMove(obj, attr, iTarget,fn)只能一次运动 执行一对键值,改用json可以实现同时运动
//获取目标元素样式
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr]; //获取样式 支持IE
}
else {
return getComputedStyle(obj, false)[attr]; //支持 火狐
}
}
//statMove(obj,{ attr1:iTarget2,attr1:iTarget2}, fn)多属性同时运动
function statMove(obj,json,value,fn) {//fn为回调函数
//方式一 :alert(getStyle(obj,'width')); 200px; obj.style.offsetWidth 则是 204px
var flag = true; //假设同时运动都达到目标值
clearInterval(obj.timer);
obj.timer = setInterval(function () {
for (var attr in json) {
//1、获取值
var cul = 0;
if (attr == 'opacity') {//parseFloat小数点
cul = Math.round(parseFloat(getStyle(obj, attr)) * 100); //Math.round alert(0.7*100)=7.0000000000001需要做下处理 要不然透明度100.998
}
else {
cul = parseInt(getStyle(obj, attr));
}
//2、算速度
speed = (json[attr] - cul) / value; //json[attr]目标属性的目标值
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
//3、检测停止
if (cul != json[attr]) {//得先判断同时运动完毕 再关闭定时器
//clearInterval(obj.timer);if (fn) { fn();}
flag = false;
}
else {
flag = true;
}
if (attr == 'opacity') {
obj.style.filter = 'alpha(opacity:' + cul + speed + ')';
obj.style.opacity = (cul + speed) / 100;
}
//css样式高 透明度字体大小都可以改变
else {
obj.style[attr] = cul + speed + 'px'; //obj.style.width 可以写成 obj.style['width']
}
}
if (flag == true) {
clearInterval(obj.timer);
if (fn) {
fn();
}
}
}, 30)
}