js动画学习(四)
七、多属性封装函数
前面分别介绍了单独改变单一属性值得动画,从本节起开始介绍多属性封装函数,一个函数搞定多种属性值的改变。
首先介绍一个很重要的函数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动画学习(四)的更多相关文章
- 【06-23】js动画学习笔记01
<html> <head> <style> * { margin:0; padding:0; } #div1{ width:200px; height:200px; ...
- js动画(四)
终于到了最后了,这里要告一段落了,整了个js运动框架,咳咳咳,好冷 啊啊啊啊啊啊,这天气.妈的,工资怎么也不发,啊,说好的 人与人之间的信任呢?哎,气诶,不到150字啊,又是这个梗..怎么办?说些什么 ...
- js动画学习(二)
四.简单动画之缓冲运动 实现速度的缓冲,即不同位置的速度不同,越靠近目标值速度越小,所以速度值与目标值与当前值之差成正比.这里要注意一个问题就是物体在运动中速度是连续变化的,不是按照整数变化的,当物体 ...
- js动画学习(一)
一.运动框架实现思路 1.匀速运动(属性值匀速变化)(改变 left, right, width, height, opacity 等): 2.缓冲运动(属性值的变化速度与当前值与目标值的差成正比): ...
- Node.js基础学习四之注册功能
前言:在Node.js学习(二)和(三)中介绍了如何在Node.js 中获取登录的用户名和密码与数据库进行验证并返回数据给客户端 需求:实现注册功能 为了区分登录和注册是两个不同的请求,在端口后面加上 ...
- js动画学习(五)
九.多属性同时运动 前面的例子都是每个属性单独运动,如果想要多属性同时运动怎么办?比如,我想要一个div的onmouseover事件中宽和高同时变化.下面这个函数是单独变宽: window.onloa ...
- js动画学习笔记
<html> <head> <meta charest="utf-8"> <title>test</title> < ...
- js动画学习(三)
五.多物体变宽 这里面要注意由于物体变多了,需要给每个物体各配备一个定时器,否则如果只有一个定时器的话,当鼠标在不同物体之间快速滑动时,不同的物体就会出现争抢的现象.所以timer前要加obj. fu ...
- JS基础学习四:绑定事件
添加事件 IE: attachEvent Other: addEventListener var button = document.getElementById("buttonId&quo ...
随机推荐
- gulp+browserfy模块化工具环境搭建
1.下载ruby,在ruby环境下安装sass; 2.安装nodejs; 3.进入当前项目所在目录,在cmd命令行中输入npm install; 4.安装browserify和gulp 安装brows ...
- jquery取对象数组元素的错误方式
代码如下: <div id="div1"> <span>a</span> <span>b</span> <span ...
- TextView settextcolor 无效解决方案
viHolder.order_item_tipcolor.setBackgroundColor(context .getResources().getColor(R.color.order_xixie ...
- 找出n个数中出现了奇数次的两个数
如果是找只出现了奇数次的一个数, 那么我们从头异或一遍就可以. 那么如何找出现了奇数次的两个数呢? 首先我们还是从头异或一遍, 然后结果肯定不为0, 对于异或出来的结果, 如果这个数的某一位是1, 说 ...
- mysql alter table
准备: create table t(x int,y int); 用法 1: 修改列的数据类 alter table t modify column y nvarchar(32); 用法2: 给表加一 ...
- eclipse及Java常用问题及解决办法汇总
junit-test 我觉得这点比idea好用,可以直接选中要测试的方法名,右击run as即可 http://www.cnblogs.com/brolanda/p/4532779.html 打开您的 ...
- kafka初探
http://www.infoq.com/cn/articles/kafka-analysis-part-1
- C++面试经常涉及的概念1
1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应.free只会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,ne ...
- [置顶] C++基础之六:运算符的重载
网上太多有关运算符的重载了,但是写的太过的详细,不适合新手入门,特别是那什么++和--的前增量后增量重载,一元二元运算符重载,特殊运算符,下标运算符,new和delete,甚至是指针运算符的重载,吓退 ...
- HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4633 典型的Polya定理: 思路:根据Burnside引理,等价类个数等于所有的置换群中的不动点的个 ...