七、多属性封装函数

前面分别介绍了单独改变单一属性值得动画,从本节起开始介绍多属性封装函数,一个函数搞定多种属性值的改变。

首先介绍一个很重要的函数getStyle(),这个函数返回一个元素的当前属性值。两个形参分别是元素和属性。注意浏览器的兼容性问题。

 //获得元素样式专用封装函数,返回该属性的当前值
function getStyle(obj,attr) {
if (obj.currentStyle) {//IE浏览器
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj,false)[attr];//火狐浏览器
}
}

接下来重点来了,一个函数实现改变多种属性的动画:

//多物体改变样式(宽,高,字体大小,边框等,透明度需单独分析)速度缓冲封装函数
function startMove(obj,attr,target) {//元素,改变的样式属性,达到的目标值
clearInterval(obj.timer);//首先清除定时器
obj.timer=setInterval(function(){
//1.取当前值
var icur=0;//icur返回物体样式属性值的大小
if (attr=='opacity') {//如果属性是透明度,透明度的返回值是零点几的小数
icur=Math.round(parseFloat(getStyle(obj,attr))*100);//round函数避免透明度值在小数之间来回跳动
} else {
icur=parseInt(getStyle(obj,attr));
}
//2.算速度
var speed=(target-icur)/8;//分母为比例系数K,可调
speed=speed>0?Math.ceil(speed):Math.floor(speed);//缓冲速度要取整,不然移动不到终点就停止
//3.检测运动是否停止
if (icur==target) {
clearInterval(obj.timer);
} else {
if (attr=='opacity') {
obj.style.filter='alpha(opacity:'+(icur+speed)+')';//IE浏览器
obj.style.opacity=(icur+speed)/100;//火狐浏览器
} else {
obj.style[attr]=icur+speed+'px';
}
}
},30)
}

我们通过两个div来验证一下:

 <style type="text/css">
#div1,#div2{
width: 200px;
height: 200px;
background: red;
border: 1px solid black;
margin-bottom: 10px;
}
</style>
 <div id="div1"></div>
<div id="div2"></div>
<script type="text/javascript">
window.onload=function(){
var ob1=document.getElementById('div1');
var ob2=document.getElementById('div2');
ob1.onmouseover=function(){
startMove(this,'width',400);
}
ob1.onmouseout=function(){
startMove(this,'width',200);
} ob2.onmouseover=function(){
startMove(this,'opacity',31);
}
ob2.onmouseout=function(){
startMove(this,'opacity',100);
}
//alert(parseFloat(0.07*100));弹出7.00000000001而不是7 所以上面程序中的parseFloat前加四舍五入Math.round函数
}
</script>

这样就实现了通过一个startMove()函数实现改变物体的宽和透明度了。

八、链式运动

上面讲的都是一个事件激发一个运动,本节介绍一个div的宽、高、透明度的链式运动。在上面的startMove函数基础上加一个形参fn,作为回调函数;在程序内部的检测运动是否停止部分加一个判断:if(fn) fn();在代码18行:

 //多物体改变样式(宽,高,字体大小,边框等,透明度单独分析)速度缓冲封装函数
function startMove(obj,attr,target,fn) {//元素,改变的样式属性,达到的目标值,回调函数
clearInterval(obj.timer);
obj.timer=setInterval(function(){
//1.取当前值
var icur=0;//icur返回物体样式属性值的大小
if (attr=='opacity') {//如果属性是透明度,透明度的返回值是零点几的小数
icur=Math.round(parseFloat(getStyle(obj,attr))*100);//round函数避免透明度值在小数之间来回跳动
} else {
icur=parseInt(getStyle(obj,attr));
}
//2.算速度
var speed=(target-icur)/8;//分母为比例系数K,可调
speed=speed>0?Math.ceil(speed):Math.floor(speed);//缓冲速度要取整,不然移动不到终点就停止
//3.检测运动是否停止
if (icur==target) {
clearInterval(obj.timer);
if(fn){//上一个运动停止后判断一下是否还有下一个运动,如果有的话就执行回调函数
fn();
}
} else {
if (attr=='opacity') {
obj.style.filter='alpha(opacity:'+(icur+speed)+')';//IE浏览器
obj.style.opacity=(icur+speed)/100;//火狐浏览器
} else {
obj.style[attr]=icur+speed+'px';
}
}
},30)
}

下面是个简单的div

 <style type="text/css">
#div1{
width: 200px;
height: 200px;
background: red;
border: 2px solid black;
filter: alpha(opacity:30);
opacity: 0.3;
}
</style>

注意看js部分的函数嵌套:

 <div id="div1"></div>
<script type="text/javascript">
window.onload=function(){
var ob1=document.getElementById('div1');
ob1.onmouseover=function(){
startMove(ob1,'width',400,function(){
startMove(ob1,'height',400,function(){
startMove(ob1,'opacity',100);
})
});
}
ob1.onmouseout=function(){
startMove(ob1,'opacity',30,function(){
startMove(ob1,'height',200,function(){
startMove(ob1,'width',200);
})
});
}
}

鼠标离开的变化顺序与鼠标经过时的相反。

js动画学习(四)的更多相关文章

  1. 【06-23】js动画学习笔记01

    <html> <head> <style> * { margin:0; padding:0; } #div1{ width:200px; height:200px; ...

  2. js动画(四)

    终于到了最后了,这里要告一段落了,整了个js运动框架,咳咳咳,好冷 啊啊啊啊啊啊,这天气.妈的,工资怎么也不发,啊,说好的 人与人之间的信任呢?哎,气诶,不到150字啊,又是这个梗..怎么办?说些什么 ...

  3. js动画学习(二)

    四.简单动画之缓冲运动 实现速度的缓冲,即不同位置的速度不同,越靠近目标值速度越小,所以速度值与目标值与当前值之差成正比.这里要注意一个问题就是物体在运动中速度是连续变化的,不是按照整数变化的,当物体 ...

  4. js动画学习(一)

    一.运动框架实现思路 1.匀速运动(属性值匀速变化)(改变 left, right, width, height, opacity 等): 2.缓冲运动(属性值的变化速度与当前值与目标值的差成正比): ...

  5. Node.js基础学习四之注册功能

    前言:在Node.js学习(二)和(三)中介绍了如何在Node.js 中获取登录的用户名和密码与数据库进行验证并返回数据给客户端 需求:实现注册功能 为了区分登录和注册是两个不同的请求,在端口后面加上 ...

  6. js动画学习(五)

    九.多属性同时运动 前面的例子都是每个属性单独运动,如果想要多属性同时运动怎么办?比如,我想要一个div的onmouseover事件中宽和高同时变化.下面这个函数是单独变宽: window.onloa ...

  7. js动画学习笔记

    <html> <head> <meta charest="utf-8"> <title>test</title> < ...

  8. js动画学习(三)

    五.多物体变宽 这里面要注意由于物体变多了,需要给每个物体各配备一个定时器,否则如果只有一个定时器的话,当鼠标在不同物体之间快速滑动时,不同的物体就会出现争抢的现象.所以timer前要加obj. fu ...

  9. JS基础学习四:绑定事件

    添加事件 IE: attachEvent Other: addEventListener var button = document.getElementById("buttonId&quo ...

随机推荐

  1. symfony2-创建提交表单生成数据过程

    一.”一对多“关系 表shop(一)

  2. 【LeetCode题意分析&解答】38. Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  3. iphone 4 safrai fixed

    <script type="text/javascript"> if(navigator.userAgent.indexOf("Safari")&g ...

  4. listview 的onitemlongclick阿和onitemclick冲突,item中还有button的点击事件

    listview里面item有button的,button要设置 android:focusable="false"  ,listview里面如果设置了 onitemlongcli ...

  5. Using SetWindowRgn

    Using SetWindowRgn Home Back To Tips Page Introduction There are lots of interesting reasons for cre ...

  6. nmon related

    nmon related pGraph (supports nmon) https://www.ibm.com/developerworks/community/wikis/home?lang=en# ...

  7. [置顶] C#扩展方法 扩你所需

    通过前面的学习,了解到:使用扩展方法,可以向现有类型“添加”方法.本文将使用扩展方法来对系统类型,自定义类型及接口进行方法扩展,一睹扩展方法的风采. 1.使用扩展方法来扩展系统类型 String是c# ...

  8. Ext2文件系统布局,文件数据块寻址,VFS虚拟文件系统

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  9. ubuntu 14.04设备flash媒体播放器

    今天是2014年4一个月19日本,就在两天前公布 ubuntu 14.04版本号, 以今天的优势是星期六,西安小雨,所以折腾linux. 我是个有点linux基础的小白.说是有些基础是由于以前在上大学 ...

  10. C# 查找指定名称的控件(转)

    请问我知道控件的名称如何得到这个控件对象呢? var button = this.FindName("button1") as Button; Button button = th ...