主页 > 前端 > javascript >
来源:未知 时间:2020-03-24 11:50 作者:小飞侠 阅读:次
[导读] 今天站长给大家带来纯JS实现过渡动画。目前只实现平速过渡,如果需要加速或者减速需要前端同学们自己加入 speed 速度变量自己代入方法里面。 源码: !DOCTYPEhtmlhtmlheadmetacharset=UTF-8...
|
今天站长给大家带来纯JS实现过渡动画。目前只实现平速过渡,如果需要加速或者减速需要前端同学们自己加入 speed 速度变量自己代入方法里面。 源码:
html代码 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>动画</title>
<style>
*{
margin: 0px;
padding: 0px;
}
#a{
width: 50px;
height: 50px;
background: #f00;
position: absolute;
left:50px;
top:20px;
}
#b{
width: 50px;
height: 50px;
background: #00d6b2;
position: absolute;
left:0px;
top:80px;
}
#c{
width: 200px;
height: 200px;
background: #00d6b2;
position: absolute;
left:80px;
top:130px;
margin-left: 10px;
}
</style>
</head>
<body>
<div id="a"></div>
<div id="b"></div>
<div id="c" style="width:200px;height:200px;left:80px;top:130px;"></div>
<script src="js/animate.js"></script>
</body>
</html>源码: /**
* Created by lipan on 2020/3/23.
*/
// 补丁
window.requestAnimationFrame = (
function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ){
window.setTimeout(callback, 1000 / 60);
};
}
)();
;(function(w){
console.log(w);
var A = {
data:{
anmList:[]
},
move:function(dom,pms,time,cbk){
//校验传参
if(this.isEmptyObject(pms)){
return false;
}
var anmLen = 1;
//拆碎
for(i in pms){
var fn = {}
fn = {};
fn.dom = dom;
fn.startTime = new Date().getTime();
fn.pms = pms;
fn.overTime = time;
fn.fn = cbk;
A.getDefaultStyle(fn); //追加默认参数
fn.type = i;
fn.value = pms[i];
fn.anmLen = anmLen;
if(typeof fn.default[i] == "undefined"){
continue;
}
//追加动画队列
this.data.anmList.push(fn);
anmLen ++;
}
this.frameChange();
},
getStyle:function(obj,styleName){
if(obj.currentStyle){
return obj.currentStyle[styleName];
}else{
return getComputedStyle(obj,null)[styleName];
}
},
isEmptyObject: function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
},
//设置默认属性
getDefaultStyle:function(item){
//测试
var dom = item.dom;
if(typeof item.default == "object"){ return false;}
item.default = {};
item.default.width = dom.style.width != ""?parseInt(dom.style.width):dom.offsetWidth;
item.default.height = dom.style.height != ""?parseInt(dom.style.height):dom.offsetHeight;
item.default.left = dom.style.left != ""?parseInt(dom.style.left):dom.offsetLeft;
item.default.top = dom.style.top != ""?parseInt(dom.style.top):dom.offsetTop;
item.default.opacity = parseFloat(this.getStyle(dom,'opacity'));
},
//真刷新
anmpx:function(item){
//console.log('获得当前实列',item);
var now = new Date().getTime(),
proportion = (now - item.startTime)/item.overTime; //获得比例
//循环CSS属性
var _value;
var _last = item.value; //最终期望结果
var _default = item.default[item.type]; //原始大小
var _nowValue = _last - _default; //期望 - 原始
_value = _default + _nowValue * proportion; //得到当前
//console.log('anmpx',i,_value);
if(_nowValue > 0){ //大
if(_value >= _last){
_value = _last;
item.isok = true;
}
}else{ //小
if(_value 0 && requestAnimationFrame(A.frameChange);
}
}
w.A = A;
})(window);调用实列 A.move(document.getElementById("a"),{
left:300,
top:150
},2200,function(){
console.log('触发完成');
});
A.move(document.getElementById("b"),{
left:500,
top:180,
width:300,
height:190
},1200,function(item){
console.log('触发完成',item);
A.move(document.getElementById("b"),{
left:100,
top:50
},1200,function(item){
console.log('触发完成',item);
A.move(item.dom,{
left:300,
top:300,
width:100,
height:100
},1200,function(item){
console.log('触发完成',item);
});
});
});
A.move(document.getElementById("c"),{
width:100,
height:100,
opacity:0.3,
color:"#ff0"
},1200,function(item){
console.log('触发完成',item);
}); |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com