js链式动画小例子

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>链式动画</title>
<style>
* {
margin: 0;
padding: 0;
}

#odiv {
width: 100px;
height: 100px;
background: pink;
opacity: 0.5;

}
</style>
</head>

<body>
<div id="odiv">

</div>
<script type="text/javascript">
var odiv = document.getElementById("odiv");

//第三种
//执行动画的对象,目标值,动画的属性,下一个动画
odiv.onmouseover=function(){
starMove(odiv,500,‘width‘,function(){
starMove(odiv,200,‘height‘,function(){
starMove(odiv,100,‘opacity‘,function(){
console.log("结束")
})
})
})
};
odiv.onmouseout=function(){
starMove(odiv,50,‘opacity‘,function(){
starMove(odiv,100,‘height‘,function(){
starMove(odiv,100,‘width‘,function(){
console.log("结束")
})
})
})
}

function starMove(obj, targetValue, attr, nextFn) {
//执行之前动画的结束
clearInterval(obj.timer);
obj.timer = setInterval(function(){ //执行动画的定时器
var currentValue;//执行动画对应的属性的当前值
if(attr == ‘opacity‘){
currentValue=Math.round(parseFloat(getStyle(obj,attr))*100);
//
}else{
//去掉字符串中的Px,再变成整数
currentValue=parseInt(getStyle(obj,attr))//100
}

var speed;//每次动画增长的幅度
speed = (targetValue-currentValue)/4;
speed =speed>0?Math.ceil(speed):Math.floor(speed);
//当对象到达目标时,停止动画,开始下一个动画
if(currentValue==targetValue){
clearInterval(obj.timer);
if(nextFn){
nextFn();
}

}else{
if(attr==‘opacity‘){
obj.style.opacity=(currentValue+speed)/100;
}else{
obj.style[attr]=(currentValue+speed)+‘px‘;
}
}

}, 50);
}

//获取当前对象元素的特性属性的函数
function getStyle(obj,attr){
//IE8之前的浏览器
if(obj.currentStyle){//IE8以前的浏览器的方法
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
}
console.log(getStyle(odiv,"height"))

</script>
</body>

</html>

时间: 2024-10-10 06:02:32

js链式动画小例子的相关文章

js原生实现链式动画效果

// 1. css样式 div { width: 100px; height: 100px; background: olivedrab; position: absolute; left: 0px; opacity: 1; } .top { top: 100px; } .bottom { top: 300px; } // html和JavaScript代码 <div class="top"></div> <div class="bottom&q

js图片轮换经典小例子

使用js脚本实现图片轮换.图片轮播的小例子,纯js实现的,感觉不错,收藏下. 例子,js脚本实现图片轮换代码. <script type="text/javascript"> var NowFrame = 1; //初始化显示第几张 var MaxFrame = 3; //最大显示几张 function show() { for (var i = 1; i < (MaxFrame + 1); i++) { if (i == NowFrame) document.get

文件上传以及JS链式结构

文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileName获取. 因为名字相同的文件将会被直接覆盖,所以一般文件名字要拼接上传时间和用户名保证不重名. 上传文件默认最大为4MB,在C#端限制文件大小有缺陷,一般用JS端限制. 获取要上传的文件通过ID获取FileUpload控件然后通过value值获取文件然后通过.length属性确定是否有文件要上传,然

链式动画

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>链式动画</title> <style> body,div{ margin: 0; padding:0; } #div1{ width:200px; height:100px; background-color:yellow; border:4p

js链式调用

我们都很熟悉jQuery了,只能jQuery中一种非常牛逼的写法叫链式操作 * $('#div').css('background','#ccc').removeClass('box').stop().animate({width:300}) 那这是如何实现的呢,我自己写了个例子:并非jQuery源码 Ferrinte.prototype.show=function () { for(var i=0;i<this.elements.length;i++) { this.elements[i].s

Node.js链式回调

由于异步的关系,代码的书写顺序可能和执行顺序并不一样,可能想先执行A再执行B,但由于异步可能B要先于A执行.例如在OC中使用AFnetworking请求数据然后刷新页面,由于网络请求是用block实现的异步方法,所以刷新的时候并没有数据,为了解决这个问题,一般会在请求响应结束在block中刷新页面(这就回出现循环引用的问题,不过node中不会出现). 上面是OC中异步执行中的链式回调,在node.js中也是使用这样的方法在回调中调用方法来实现链式回调. function logCar(car,c

JS 链式调用

<!-- ————————JS函数链式调用——————— --> function Dog(){ this.run=function(){ alert("跑"); return this; }; this.eat=function(){ alert("吃"); return this; }; this.sleep=function(){ alert("睡觉"); return this; }; } var dog=new Dog();

IOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // rect:裁剪图片的尺寸,传递是像素 CGImageRef norImage = CGImageCreateWithImageInRect(norBigImage.CGImage, clipRect); 2.每次点击按钮立马变为选中状态,并且取消上次的按钮的选中状态 当然还要重写- (void)setH

js链式操作DOM节点的简单封装

function Base() { //把返回的节点对象保存到一个Base 对象的属性数组里 this.elements = []; //获取id 节点 this.getId = function (id) { this.elements.push(document.getElementById(id)); return this; }; //获取name 节点数组 this.getName = function (name) { var names = document.getElements