亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于鏈式和多屬性運動的另一種情況

老師已經給我們介紹了一個完美的運動框架

多物體運動>鏈式運動>多屬性運動

假設鏈式步驟{}1,2,3.多屬性同時運動a,b,c

老師的框架運行結構1:{a,b}>2:{a,b,c}>3:{a,b,c}


但是存在一種情況:對于一個物體而言,兩條屬性同時變化,而當第一個屬性完成后接著一個鏈式第三個屬性.此時第二個屬性和第三個屬性繼續同步完成.

即: 1:{ 1.1:{a}>1.2:{c} , b }

時間軸例:

{aaaaaaa}>{cccccccc}

{bbbbbbbbbbbbbbb}

應該如何修改框架實現此種情況.

正在回答

1 回答

<!DOCTYPE?html>

<html>
<head>
<meta?charset="UTF-8">
<title></title>
<style?type="text/css">
body?{
????margin:?0px;
}
li?{
????width:200px;
????height:50px;
????list-style-type:none;
????margin-bottom:10px;
????background-color:brown;
????filter:alpha(opacity=30);?
????opacity:0.3;
}
</style>
<script?type="text/javascript">???
window.onload?=?function(){
??????var?li?=?document.getElementsByTagName('li');
??????for(var?i=0;i<li.length;i++){
??????li[i].timer=null;?
??????li[i].onmouseover?=?function(){
??????startMove(this,{'width':400},function(obj){//這里的obj參數由startMobe方法調用回調那里傳回來,方便解決這行的函數找不到對象的問題
??????????startMove(obj,{'height':300,'opacity':100});//用了json同時實現高和透明度的修改
??????});
?????????????}?
?????????????//鼠標移開
??????li[i].onmouseout?=?function(){
??????startMove(this,{'width':200,'height':50,'opacity':30});//用了json同時實現寬高透明度的修改
??????????????}
?????????}
????}
??????var?alpha=30;
???function?startMove(obj,json,fn){
??????clearInterval(obj.timer);
??????var?curStyle=0;
??????obj.timer?=?setInterval(function(){
????????var?flag=true;//flag如果放在外面的話在計時器里面被修改之后就不會再變回true的值了,如果在計時器里面,每次計時都會把flag重新賦值true
??????????for(var?attr?in?json){
??????curStyle=(attr=='opacity')?Math.round(parseFloat(getStyle(obj,attr))*100):parseInt(getStyle(obj,attr));//這里把if(){}else{}的判斷是不是opacity寫成一句了
????????????var?speed?=?(json[attr]-curStyle)/10;
??????speed?=?(attr=='opacity')?speed:(speed>0?Math.ceil(speed):Math.floor(speed));
??????if(curStyle!=json[attr]){//如果不能同時滿足所有當前的屬性值等于目標值就給flag賦值false
?????????flag=false;
?????????}
?????????obj.style[attr]=(attr=='opacity')?(curStyle+speed)/100:(curStyle+speed+'px');
?????????if(flag){
??????clearInterval(obj.timer);????
????????????if(fn){
??????????????fn(obj);//這里把obj做成參數主要是方便處理回調函數fn的對象問題
??????????}
?????????}
??????????????}
??????????
??????},30)
???}
??
??function?getStyle(obj,attr){
??????if(obj.currentStyle){
?????????return?obj.currentStyle[attr];
??????}else{
??????????return?window.getComputedStyle(obj,false)[attr];
????????
??????}
??}
?</script>
</head>

<body>
<li?id="li"></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</body>
</html>

--------------------------------------------------------------------------------------

花了大半天寫好的,不知道有沒有你想要的“第二個屬性和第三個屬性繼續同步完成”

2 回復 有任何疑惑可以回復我~
#1

Fishzz 提問者

首先很感動用心作答. 我的想法是,動作一和動作二是同時開始的,而動作三是承接動作一鏈式激活開始的,之后動作三和動作二同時完成. 你的satrmove的函數結構上并不是我想要的,它先執行完成了width動畫,其次執行高度和透明度同時變化. 我想要的是 執行寬度動畫, 同時執行高度變化, 高度結束后執行透明度 寬度透明度完成動畫. 時間軸上: 0s:寬度和高度開始變. 3s:寬度執行到途中.高度結束動作,并激活透明度開始變. 6s:寬度完成動作,透明度完成動作.
2018-06-27 回復 有任何疑惑可以回復我~
#2

YGT9865 回復 Fishzz 提問者

我的想法是,動作一和....時完成.按照你這段話來說,其實你的邏輯是有問題的,動作三和動作二既然是同時開始的,為什么不能通過鏈式回調函數來執行,為什么要放在一開始就執行呢?
2018-08-13 回復 有任何疑惑可以回復我~
#3

YGT9865 回復 Fishzz 提問者

從你這段時間軸上看到了前后矛盾 1、高度和寬度同時執行,當高度和寬度完成了再執行透明度的變化。 2、高度和寬度同時執行,高度執行完畢,寬度執行一半后執行透明度變化。 3、高度和寬度同時執行,當高度執行完畢,寬度和透明度再執行。 4、高度和寬度同時執行,當寬度執行完畢,高度和透明度再執行。 我從你的描述中看出了好幾種意思,首先你的邏輯就存在錯誤。按照你在時間軸上的描述,你可以先設置高度和一半的寬度變化,當3s到了之后,再執行另外一半寬度和透明度的變化,至于3s到了停止高度的變化,你可以計算的,通過計算控制運動的時間
2018-08-13 回復 有任何疑惑可以回復我~
#4

Fishzz 提問者 回復 YGT9865

你的意思我理解,就是把較長的動畫分解成兩個部分,然后分別和其他兩個不同的動畫同時執行.前后之間采用鏈式.但是這不是我想要的,我想要的是設計的函數框架就能實現這個功能
2018-08-19 回復 有任何疑惑可以回復我~
查看1條回復

舉報

0/150
提交
取消
JS動畫效果
  • 參與學習       113918    人
  • 解答問題       1502    個

通過本課程JS動畫的學習,從簡單動畫開始,逐步深入各種動畫框架封裝

進入課程

關于鏈式和多屬性運動的另一種情況

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號