給angular加上動畫效遇到的問題總結

2022-09-27 02:54:12 字數 3478 閱讀 2656

加入「動效」是讓使用者對應用的行為進行感知的一種有效手段。「列表」是應用中最常使用的一種介面形式,經常會有新增行,刪除行,移動行這些操作。設想新增的操作很簡單,刪除時從大到小,然後消失;新增時從小到大;移動就是先刪除再新增。感覺上並不複雜,應該利用css的transition就能搞定,可是實際做起來發現有不少問題要處理,下面一一道來。

來些簡單的測試

1、最初的版本

row-1

row-2

.list

.row-1

.row-2

/*demo1*/

.demo-1 .remove

.demo-1 .remove.active

var ele = document.queryselector('.demo-1 .row-1');

ele.classlist.add('remove');

ele.classlist.add('active');

想法很簡單,通過新增「remove」類,設定動畫的效果,新增「active」修改css屬性,啟用動畫。

結果和想的不一樣,兩個問題:1、動畫並沒有執行;2、row-1並沒有消失。為什麼?首先,css的transition不能作用於auto的屬性,因為row-1本來並沒有設定height,所以不會產生從現有的高度變到0的動畫。第二,height=0只是設定了content區域為0,程式設計客棧padding並沒有改變,所以還是row-1還是佔據了30px的空間。

2、指定固定的height並且padding也加上動畫

調整css

/*demo2*/

.demo-2 .row-1

.demo-2 .remove

.demo-2 .row-1.remove.active

這次的效果是對的,row-1從48px邊到0,同時padding也跟著變。

3、還有沒有別的辦法呢?一定要指定height嗎?transform行不行

修改css

/*demo3*/

.demo-3 .remove

.demo-3 .row-1.remove.active

即使沒有設定height,通過transform執行動畫也是沒有問題的。問題是,row-1還在原來的地方,還佔著空間,row-2並沒有向上挪。由此帶來個問題,動畫執行完了(包括第2個設定height的例子),row-1並沒有刪除掉,只是看不見了。

4、解決動畫執行完清除元素的問題

修改css

複製** **如下:

.demo-4 .remove

.demo-4 .row-1.remove.active

修改js

var ele, l;

ele = document.queryselector('.demo-4 .row-1');

l = ele.addeventlistener('webkittransitionend', function(evt)

}, false);

ele.style.he = ele.offsetheight + 'px';

ele.classlist.add('remove');

$timeout(function());

這次的效果不錯。有幾個注意的地方:1、通過註冊transitionend事件可以捕獲到動結束;2、可以同時執行多個動效,每個東西結束都會產生transitionend事件,通過事件的「propertyname」可以知道是哪個屬性的動效結束了。

5、用velocity.js也試了一下

css不用設定

js**

var ele = document.queryselector('.demo-5 .row-1');

velocity(ele, 'slideup', );

看了看執行的過程,也是修改height和padding。但是,velocity用的是requestanimationframe函式。我認為如果動效比較簡單,就不用引入其他的庫了,直接寫出來的執行效果差不多。

6、高度搞明白了,變寬度呢?

調整css

.demo-6 .row-1

.demo-6 .remove

.demo-6 .row-1.remove.active

雖然寬本身可以通過百分比進行設定,但是height不固定的問題還是存在。

7、用上js解決變width的問題

設定css

.demo-7 .row-1

.demo-7 .remove

.demo-7 .row-1.remove.active

固定了height已有動效正常了。其他的改進可參照前面的例子了。

二、乙個完整的例子

完整的例子實在angular中實現的。angular實現首先乙個問題就是在什麼時機設定動效?因為,angular是雙向繫結的,如果在controller中刪除了乙個物件,渲染介面的時候這個物件就沒了,所以必須介入到資料繫結的過程中。angular提供nganimatie這個動畫模組,試了一下它也確實可以完成ngrepeat列表資料更新的動效。但是要額外引入angular-animation.js,雖然不大,還是覺得不是很有必要。另外,我是在乙個已經寫好的框架頁面上加動畫,如果需要引入新的module,需要改框架檔案,我覺得不好。試了試動態載入animation模組也沒成功,所以就研究了一下自己怎麼控制動效。

angular即使不載入animation模組,也有乙個$animate,它為動效控制留出了介面。

看jsvar fnenter = $animate.enter,

fnle**e = $animate.le**e;

$animate.enter = function() ;

fnenter.call($animate, e, p, a, options).then(function() , false);

});});

return defer.promise;

};$animate.le**e = function() );

}, false);

});});

return defer.promise;

};ng-repeat進行資料更新是會呼叫$animate服務的enters,le**e和move方法,所以,要自己控制動效就要重寫對應的方法。重寫的時候要用$animate新增,直接在dom上設定有問題。(這一段的angular的邏輯比較底層,沒有太看明白,還需要深入研究。)

另外,在移動行的位置時,要通過$timeout將刪除和插入放到兩個digest迴圈中處理,否則看不出效果。

var index = records.indexof($scope.selected)程式設計客棧,

r = records.splice(index, 1);

$timeout(function(),500);

angular的動畫和digest迴圈關係密切,看了angular-animation.js的**沒看明白,還需要深入研究才行。

本文標題: 給angular加上動畫效遇到的問題總結

本文位址: /ruanjian/j**a/142641.html

libsvm在matlab中遇到的問題總結

包含libsvm四個exe程式包,我們所用的庫就是它們,然後在matlab命令框輸入 1.mex setup 2.選擇vc 3.之後輸入make 問題一 error d libsvm libsvm 3.21 matlab make.m failed line 13 未找到 e 百葉通 matlab ...

在angular打包優化中遇到的問題 記錄

正常是ng build 優化打包方式 ng build prod aot 使用這個打包的時候 報錯 這個寫法的是 publicservice只能在constructor中使用,所以應該改為 即可解決問題 還有一部分報錯 是因為 平時 不注意規則 不太標準 以及html頁面裡有無用字段造成的 使用如上...

關於「foreach迴圈」中遇到的幾個問題總結

1.列表頁面用 foreach迴圈 的時候資料沒有顯示,此時需要檢查你物件模型中屬性的首字母是否大寫,切記不能大寫 本人在做乙個專案的時候,物件模型是別人建立的,屬性首字母大寫了,導致最後列表頁面資料不顯示,後來一問老師,說改為小寫,瞬間好了 2.資料儲存不到表裡 在對映檔案中沒有指定資料表列名的時...