中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

javascript 小型動畫組件與實現(xiàn)代碼

做一個普通的動畫效果,js是怎么完成的呢.看一下例子
復(fù)制代碼 代碼如下:
setInterval(function(){
element.style.left =parseFloat(element.style.left) +(n) +'px';
},10);


[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
用window.setInterval 動畫函數(shù) ,每隔10毫秒 都會去執(zhí)行一次動畫 ;
和 set配套的是 clearInterval 函數(shù),用來結(jié)束動畫。
每隔setInterval 都會返回一個類似于線程id的值 ;
var interval =setInterval(function(){
element.style.left =parseFloat(element.style.left) +(n) +'px';
},10);
用 clearInterval (interval) 既可結(jié)束動畫播放.
interval = setInterval(function(){
if(parseFloat(element.style.left)>500) clearInterval(interval)
element.style.left =parseFloat(element.style.left) +2 +'px';
},10);
超過500px的時候,動畫就會停止, element將不在移動

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
但是上面的動畫是比較生硬的,然后我們有另外一種時間線動畫。
看例子:
var element = document.getElementById('test1');
var start = +new Date,dur=1000,finish = start+dur;
interval = setInterval(function(){
var time = +new Date,
pos = time > finish ? 1 : (time-start)/dur;
element.style.left = (100*pos)+"px";
if(time>finish) {
clearInterval(interval);
}
},10);
start 為目標(biāo)動畫的開始時間 ( +new Date 其實就是 new Date().getTime() )
dur 為 動畫執(zhí)行一共所需要的時間
finish 是目標(biāo)動畫結(jié)束的時間
pos = time > finish ? 1 : (time-start)/dur; //可以把pos 想象成頻率 ,一個時間比
(100*pos) ,100代表距離,,如果距離為500px 就設(shè)置為 500*pos;
time>finish : 如果超過時間,就停止動畫!

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
很好,到這里我們已經(jīng)知道一個簡單動畫效果是怎么樣寫的了.
再來看一個小型的完整的動畫組件是如何寫的 :
復(fù)制代碼 代碼如下:
(function($,name){
var parseEl = document.createElement('div')
,
props = ('backgroundColor borderBottomColor borderBottomWidth borderLeftColor borderLeftWidth '+
'borderRightColor borderRightWidth borderSpacing borderTopColor borderTopWidth bottom color fontSize '+
'fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop maxHeight '+
'maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft '+
'paddingRight paddingTop right textIndent top width wordSpacing zIndex').split(' ')
,
normalize =function (style){
var css,
rules = {},
i = props.length,
v;
parseEl.innerHTML = '<div style="'+style+'"></div>';
css = parseEl.childNodes[0].style;
while(i--) if(v = css[props[i]]) rules[props[i]] = parse(v);
return rules;
},
color = function(source,target,pos){
var i = 2, j, c, tmp, v = [], r = [];
while(j=3,c=arguments[i-1],i--)
if(s(c,0)=='r') { c = c.match(//d+/g); while(j--) v.push(~~c[j]); } else {
if(c.length==4) c='#'+s(c,1)+s(c,1)+s(c,2)+s(c,2)+s(c,3)+s(c,3);
while(j--) v.push(parseInt(s(c,1+j*2,2), 16)); }
while(j--) { tmp = ~~(v[j+3]+(v[j]-v[j+3])*pos); r.push(tmp<0?0:tmp>255?255:tmp); }
return 'rgb('+r.join(',')+')';
},
parse = function(prop){
var p = parseFloat(prop), q = prop.replace(/^[/-/d/.]+/,'');
return isNaN(p) ? { v: q, f: color, u: ''} : { v: p, f: interpolate, u: q };
},
s = function(str, p, c){
return str.substr(p,c||1);//color 用
},
interpolate =function(source,target,pos){
return (source+(target-source)*pos).toFixed(3);
},
flower = function(el, style,opts,after){
var el = document.getElementById(el), //通過id獲取元素對象
opts = opts || {},
target = normalize(style),
comp = el.currentStyle ? el.currentStyle : getComputedStyle(el, null), //ie和w3c兼容,獲取樣式
prop,
current = {},
start = +new Date, //開始時間
dur = opts.duration||200, //執(zhí)行事件,默認(rèn)為200
finish = start+dur, //結(jié)束時間
interval,
easing = opts.easing || function(pos){ return (-Math.cos(pos*Math.PI)/2) + 0.5; };
for(prop in target) current[prop] = parse(comp[prop]);
interval = setInterval(function(){
var time = +new Date,
pos = time>finish ? 1 : (time-start)/dur;
for(prop in target){
el.style[prop] = target[prop].f(current[prop].v,target[prop].v,easing(pos)) + target[prop].u;
}
if(time>finish) {
clearInterval(interval); opts.after && opts.after(); after && setTimeout(after,1);
}
},10);
};
$[name] = flower;
})(window,"flower");

復(fù)制代碼 代碼如下:
var parse = function(prop){
var p = parseFloat(prop), q = prop.replace(/^[/-/d/.]+/,'');
return isNaN(p) ? { v: q, f: color, u: ''} : { v: p, f: interpolate, u: q };
}
var p = parseFloat(prop) 意思是 : 500px => 500;
q = prop.replace(/^[/-/d/.]+/,''); 500px => px;
return isNaN(p) ? { v: q, f: color, u: ''} : { v: p, f: interpolate, u: q }; 意思是 如果取的是顏色值(因為帶有#號),返回{ v: q, f: color, u: ''} u 代表代為,f是一個color函數(shù)(后面會講到);
var s = function(str, p, c){ return str.substr(p,c||1); }

s 函數(shù)是用來截取字符串,并將最后結(jié)果返回
color 函數(shù) 將顏色值,最后統(tǒng)一返回 "rgb(x,x,x)" 的形式
normalize 函數(shù) 返回一個json對象,對象里包含了該元素要執(zhí)行的css屬性名和值
while(i--) if(v = css[props[i]]) rules[props[i]] = parse(v);
把一行代碼拆開,看看到底如何作用
while(i--){
//這里用了一個 =號, 先進(jìn)行賦值運(yùn)算,如果不存在之 if將不通過, 一舉兩得 : )
if(v = css[props[i]]){
rules[props[i]] = parse(v); //賦給新的對象,
}
}
interpolate函數(shù)中 return (source+(target-source)*pos).toFixed(3);
toFixed 是為了解決小數(shù)問題,如 0.000000001; 會變成 1e-9; 不是我們想要的結(jié)果,通過toFixed 可以解決, toFixed (n), 其中n代表保留小數(shù)點后幾位
el.currentStyle ? el.currentStyle : getComputedStyle(el, null);
這個其實兼容多瀏覽器,獲取元素的一句代碼 具體參考 : JS 獲取最終樣式 【getStyle】
flower的 4個參數(shù) el 目標(biāo)對象,style 是最終樣式,opts,是參數(shù)選項包括 (dur時間,easing緩懂函數(shù),after結(jié)束后運(yùn)行的callbak) ,第4個after是最后執(zhí)行的callbak;
opts.easing 可以利用各種緩動算法,來改變元素的運(yùn)動狀態(tài);

復(fù)制代碼 代碼如下:
function bounce(pos) {
if (pos < (1/2.75)) {
return (7.5625*pos*pos);
} else if (pos < (2/2.75)) {
return (7.5625*(pos-=(1.5/2.75))*pos + .75);
} else if (pos < (2.5/2.75)) {
return (7.5625*(pos-=(2.25/2.75))*pos + .9375);
} else {
return (7.5625*(pos-=(2.625/2.75))*pos + .984375);
}
}
(function($,name){
window.flower = flower;
})(window,'flower');

這樣其實就是讓內(nèi)部函數(shù)自由,并且只通過這個調(diào)用去暴露一個接口。不然外面的函數(shù),訪問不到匿名函授中的flower;
看一下調(diào)用的例子 : )
復(fù)制代碼 代碼如下:
<div id="test1" style="position:absolute;left:0px;background:#f00;opacity:0">test</div>
<div id="test2" style="border:0px solid #00ff00;position:absolute;left:0px;top:400px;background:#0f0">test</div>
<script>
(function($,name){
var parseEl = document.createElement('div')
,
props = ('backgroundColor borderBottomColor borderBottomWidth borderLeftColor borderLeftWidth '+
'borderRightColor borderRightWidth borderSpacing borderTopColor borderTopWidth bottom color fontSize '+
'fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop maxHeight '+
'maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft '+
'paddingRight paddingTop right textIndent top width wordSpacing zIndex').split(' ')
,
normalize =function (style){
var css,
rules = {},
i = props.length,
v;
parseEl.innerHTML = '<div style="'+style+'"></div>';
css = parseEl.childNodes[0].style;
while(i--) if(v = css[props[i]]) rules[props[i]] = parse(v);
return rules;
},
color = function(source,target,pos){
var i = 2, j, c, tmp, v = [], r = [];
while(j=3,c=arguments[i-1],i--)
if(s(c,0)=='r') { c = c.match(//d+/g); while(j--) v.push(~~c[j]); } else {
if(c.length==4) c='#'+s(c,1)+s(c,1)+s(c,2)+s(c,2)+s(c,3)+s(c,3);
while(j--) v.push(parseInt(s(c,1+j*2,2), 16)); }
while(j--) { tmp = ~~(v[j+3]+(v[j]-v[j+3])*pos); r.push(tmp<0?0:tmp>255?255:tmp); }
return 'rgb('+r.join(',')+')';
},
parse = function(prop){
var p = parseFloat(prop), q = prop.replace(/^[/-/d/.]+/,'');
return isNaN(p) ? { v: q, f: color, u: ''} : { v: p, f: interpolate, u: q };
},
s = function(str, p, c){
return str.substr(p,c||1);
},
interpolate =function(source,target,pos){
return (source+(target-source)*pos).toFixed(3);
},
flower = function(el, style,opts,after){
var el = document.getElementById(el),
opts = opts || {},
target = normalize(style),
comp = el.currentStyle ? el.currentStyle : getComputedStyle(el, null),
prop,
current = {},
start = +new Date,
dur = opts.duration||200,
finish = start+dur,
interval,
easing = opts.easing || function(pos){ return (-Math.cos(pos*Math.PI)/2) + 0.5; };
for(prop in target) current[prop] = parse(comp[prop]);
interval = setInterval(function(){
var time = +new Date,
pos = time>finish ? 1 : (time-start)/dur;
for(prop in target){
el.style[prop] = target[prop].f(current[prop].v,target[prop].v,easing(pos)) + target[prop].u;
}
if(time>finish) {
clearInterval(interval); opts.after && opts.after(); after && setTimeout(after,1);
}
},10);
};
$[name] = flower;
})(window,"flower");
(function(){
var bounce = function(pos) {
if (pos < (1/2.75)) {
return (7.5625*pos*pos);
} else if (pos < (2/2.75)) {
return (7.5625*(pos-=(1.5/2.75))*pos + .75);
} else if (pos < (2.5/2.75)) {
return (7.5625*(pos-=(2.25/2.75))*pos + .9375);
} else {
return (7.5625*(pos-=(2.625/2.75))*pos + .984375);
}
}
flower('test2', 'left:300px;padding:10px;border:50px solid #ff0000', {
duration: 1500,
after: function(){
flower('test1', 'background:#0f0;left:100px;padding-bottom:100px;opacity:1', {
duration: 1234, easing: bounce
});
}
});
})();
</script>

參考 : http://scripty2.com/doc/scripty2%20fx/s2/fx/transitions.html

php技術(shù)javascript 小型動畫組件與實現(xiàn)代碼,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲国产一区二区三区, | 伊人伊成久久人综合网站 | 91大神在线看 | 91成人在线| av在线免费观看网址 | 97碰碰碰 | 久草视频观看 | 一区二区三区久久久 | 日日骚视频 | 免费观看一级特黄欧美大片 | 久久综合九色综合欧美狠狠 | www国产成人 | 欧美精品成人一区二区三区四区 | 妹子干综合 | 国产精品久久久久久久久婷婷 | 日日碰狠狠躁久久躁96avv | 九九色九九 | 欧美精品影院 | 午夜视频在线观看一区二区 | 日韩一 | 欧美亚洲视频 | 久草网站 | 国产精品视频不卡 | 成人天堂| 久久精品影视 | 日韩av啪啪网站大全免费观看 | 久久日韩精品一区二区三区 | 黄色网址在线免费观看 | 91亚洲国产 | 国产乱肥老妇国产一区二 | 欧美精品一区二区三区在线 | 美女三区 | 亚洲天堂一区 | 国产黄色网址在线观看 | 91欧美精品 | 国产精品美女久久久久aⅴ国产馆 | 草逼网站| 精品一区二区久久久久久久网站 | 国产精品一区2区 | jizz在线看片 | 国产丝袜一区二区三区免费视频 |