成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

給angular的repeat列表的行操作加上動(dòng)效遇到的問(wèn)題總結(jié)

incredible / 2476人閱讀

摘要:還有沒(méi)有別的辦法呢一定要指定嗎行不行修改即使沒(méi)有設(shè)置,通過(guò)執(zhí)行動(dòng)畫(huà)也是沒(méi)有問(wèn)題的。解決動(dòng)畫(huà)執(zhí)行完清除元素的問(wèn)題修改修改這次的效果不錯(cuò)。用上解決變的問(wèn)題設(shè)置固定了已有動(dòng)效正常了。

加入“動(dòng)效”是讓用戶對(duì)應(yīng)用的行為進(jìn)行感知的一種有效手段。“列表”是應(yīng)用中最常使用的一種界面形式,經(jīng)常會(huì)有添加行,刪除行,移動(dòng)行這些操作。設(shè)想添加的操作很簡(jiǎn)單,刪除時(shí)從大到小,然后消失;添加時(shí)從小到大;移動(dòng)就是先刪除再添加。感覺(jué)上并不復(fù)雜,應(yīng)該利用CSS的transition就能搞定,可是實(shí)際做起來(lái)發(fā)現(xiàn)有不少問(wèn)題要處理,下面一一道來(lái)。

來(lái)些簡(jiǎn)單的測(cè)試 1、最初的版本
row-1
row-2
.list{margin:20px;background:#eee;font-size:18px;color:white;}
.row-1{background:green;overflow:hidden;padding:15px;}
.row-2{background:blue;padding:15px;}
/*demo1*/
.demo-1 .remove{-webkit-transition: height 3s linear;}
.demo-1 .remove.active{height:0;}
var ele = document.querySelector(".demo-1 .row-1");
ele.classList.add("remove");
ele.classList.add("active");

想法很簡(jiǎn)單,通過(guò)添加“remove”類,設(shè)置動(dòng)畫(huà)的效果,添加“active”修改css屬性,激活動(dòng)畫(huà)。

結(jié)果和想的不一樣,兩個(gè)問(wèn)題:1、動(dòng)畫(huà)并沒(méi)有運(yùn)行;2、row-1并沒(méi)有消失。為什么?首先,CSS的transition不能作用于auto的屬性,因?yàn)閞ow-1本來(lái)并沒(méi)有設(shè)置height,所以不會(huì)產(chǎn)生從現(xiàn)有的高度變到0的動(dòng)畫(huà)。第二,height=0只是設(shè)置了content區(qū)域?yàn)?,padding并沒(méi)有改變,所以還是row-1還是占據(jù)了30px的空間。

2、指定固定的height并且padding也加上動(dòng)畫(huà)

調(diào)整CSS

/*demo2*/
.demo-2 .row-1{height:48px;}
.demo-2 .remove{-webkit-transition: height 3s linear, padding-top 3s linear;}
.demo-2 .row-1.remove.active{height:0;padding-top:0;padding-bottom:0;}

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

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

修改CSS

/*demo3*/
.demo-3 .remove{-webkit-transition: -webkit-transform 3s linear,padding 0s linear 3s;}
.demo-3 .row-1.remove.active{-webkit-transform-origin:0 0;-webkit-transform:scaleY(0);}


即使沒(méi)有設(shè)置height,通過(guò)transform執(zhí)行動(dòng)畫(huà)也是沒(méi)有問(wèn)題的。問(wèn)題是,row-1還在原來(lái)的地方,還占著空間,row-2并沒(méi)有向上挪。由此帶來(lái)個(gè)問(wèn)題,動(dòng)畫(huà)執(zhí)行完了(包括第2個(gè)設(shè)置height的例子),row-1并沒(méi)有刪除掉,只是看不見(jiàn)了。

4、解決動(dòng)畫(huà)執(zhí)行完清除元素的問(wèn)題

修改CSS

.demo-4 .remove{-webkit-transition: height 3s linear, padding 3s linear, opacity 3s linear,color .5s linear;}
.demo-4 .row-1.remove.active{padding-top:0;padding-bottom:0;color:rgba(0,0,0,0);opacity:0;}

修改JS

var ele, l;
ele =  document.querySelector(".demo-4 .row-1");
l = ele.addEventListener("webkitTransitionEnd", function(evt){
    if (evt.propertyName === "height") {
        ele.style.display = "none";     
        ele.style.height = "";
        ele.removeEventListener("webkitTransitionEnd", l, false);
    }
}, false);
ele.style.height = ele.offsetHeight + "px";
ele.classList.add("remove");
$timeout(function(){
    ele.classList.add("active");
    ele.style.height = "0px";
});

這次的效果不錯(cuò)。有幾個(gè)注意的地方:1、通過(guò)注冊(cè)transitionEnd事件可以捕獲到動(dòng)結(jié)束;2、可以同時(shí)執(zhí)行多個(gè)動(dòng)效,每個(gè)東西結(jié)束都會(huì)產(chǎn)生transitionEnd事件,通過(guò)事件的“propertyName”可以知道是哪個(gè)屬性的動(dòng)效結(jié)束了。

5、用velocity.js也試了一下

CSS不用設(shè)置
JS代碼

var ele =  document.querySelector(".demo-5 .row-1");
Velocity(ele, "slideUp", { duration: 1000 });   

看了看執(zhí)行的過(guò)程,也是修改height和padding。但是,velocity用的是requestAnimationFrame函數(shù)。我認(rèn)為如果動(dòng)效比較簡(jiǎn)單,就不用引入其他的庫(kù)了,直接寫(xiě)出來(lái)的運(yùn)行效果差不多。

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

調(diào)整CSS

.demo-6 .row-1{width:100%;}
.demo-6 .remove{-webkit-transition: width 3s linear;}
.demo-6 .row-1.remove.active{width:0%;}

雖然寬本身可以通過(guò)百分比進(jìn)行設(shè)置,但是height不固定的問(wèn)題還是存在。

7、用上JS解決變width的問(wèn)題

設(shè)置CSS

.demo-7 .row-1{width:100%;height:48px;}
.demo-7 .remove{-webkit-transition: width 3s linear, opacity 3s ease;}
.demo-7 .row-1.remove.active{width:0%;opacity:0;}

固定了height已有動(dòng)效正常了。其他的改進(jìn)可參照前面的例子了。

二、一個(gè)完整的例子

完整的例子實(shí)在angular中實(shí)現(xiàn)的。angular實(shí)現(xiàn)首先一個(gè)問(wèn)題就是在什么時(shí)機(jī)設(shè)置動(dòng)效?因?yàn)?,angular是雙向綁定的,如果在controller中刪除了一個(gè)對(duì)象,渲染界面的時(shí)候這個(gè)對(duì)象就沒(méi)了,所以必須介入到數(shù)據(jù)綁定的過(guò)程中。angular提供ngAnimatie這個(gè)動(dòng)畫(huà)模塊,試了一下它也確實(shí)可以完成ngRepeat列表數(shù)據(jù)更新的動(dòng)效。但是要額外引入angular-animation.js,雖然不大,還是覺(jué)得不是很有必要。另外,我是在一個(gè)已經(jīng)寫(xiě)好的框架頁(yè)面上加動(dòng)畫(huà),如果需要引入新的module,需要改框架文件,我覺(jué)得不好。試了試動(dòng)態(tài)加載animation模塊也沒(méi)成功,所以就研究了一下自己怎么控制動(dòng)效。

angular即使不加載animation模塊,也有一個(gè)$animate,它為動(dòng)效控制留出了接口。
看JS

var fnEnter = $animate.enter,
    fnLeave = $animate.leave;
$animate.enter = function() {
    var defer = $q.defer(),
        e = arguments[0],
        p = arguments[1],
        a = arguments[2],
        options = {
            addClass: "ng-enter"
        };
    fnEnter.call($animate, e, p, a, options).then(function() {
        $animate.addClass(e, "ng-enter-active").then(function(){
            var l = e[0].addEventListener("webkitTransitionEnd", function(){
                e[0].classList.remove("ng-enter-active");
                e[0].classList.remove("ng-enter");
                e[0].removeEventListener("webkitTransitionEnd", l, false);
                defer.resolve();
            }, false); 
        });
    });
    return defer.promise;
};
$animate.leave = function() {
    var defer = $q.defer(),
        e = arguments[0];
    $animate.addClass(e, "ng-leave").then(function(){
        $animate.addClass(e, "ng-leave-active").then(function(){
            var l = e[0].addEventListener("webkitTransitionEnd", function(){
                fnLeave.call($animate, e).then(function(){
                    defer.resolve();
                });
            }, false);
        });
    });
    return defer.promise;
};

ng-repeat進(jìn)行數(shù)據(jù)更新是會(huì)調(diào)用$animate服務(wù)的enters,leave和move方法,所以,要自己控制動(dòng)效就要重寫(xiě)對(duì)應(yīng)的方法。重寫(xiě)的時(shí)候要用$animate添加,直接在dom上設(shè)置有問(wèn)題。(這一段的angular的邏輯比較底層,沒(méi)有太看明白,還需要深入研究。)

另外,在移動(dòng)行的位置時(shí),要通過(guò)$timeout將刪除和插入放到兩個(gè)digest循環(huán)中處理,否則看不出效果。

var index = records.indexOf($scope.selected),
    r = records.splice(index, 1);
$timeout(function(){
    records.splice(index + 1, 0, r[0]);
},500);

angular的動(dòng)畫(huà)和digest循環(huán)關(guān)系密切,看了angular-animation.js的代碼沒(méi)看明白,還需要深入研究才行。

示例

基礎(chǔ)的示例
完整示例

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78664.html

相關(guān)文章

  • angularrepeat列表操作加上動(dòng)效遇到問(wèn)題總結(jié)

    摘要:還有沒(méi)有別的辦法呢一定要指定嗎行不行修改即使沒(méi)有設(shè)置,通過(guò)執(zhí)行動(dòng)畫(huà)也是沒(méi)有問(wèn)題的。解決動(dòng)畫(huà)執(zhí)行完清除元素的問(wèn)題修改修改這次的效果不錯(cuò)。用上解決變的問(wèn)題設(shè)置固定了已有動(dòng)效正常了。 加入動(dòng)效是讓用戶對(duì)應(yīng)用的行為進(jìn)行感知的一種有效手段。列表是應(yīng)用中最常使用的一種界面形式,經(jīng)常會(huì)有添加行,刪除行,移動(dòng)行這些操作。設(shè)想添加的操作很簡(jiǎn)單,刪除時(shí)從大到小,然后消失;添加時(shí)從小到大;移動(dòng)就是先刪除再添...

    未東興 評(píng)論0 收藏0
  • 第一個(gè)AngularJS應(yīng)用

    摘要:從最重要的頁(yè)面開(kāi)始吧錦標(biāo)賽的表格。重啟你的應(yīng)用,看看搜索框。然后我們加入兩個(gè)路由一個(gè)轉(zhuǎn)向錦標(biāo)賽表格,另一個(gè)轉(zhuǎn)向車手詳情。你所需要做的只是創(chuàng)建一個(gè)名為的文件,然后將錦標(biāo)賽表格放在那里。結(jié)論我們已經(jīng)介紹了開(kāi)發(fā)一個(gè)簡(jiǎn)單應(yīng)用所需的一切。 AngularJS是Google開(kāi)源出來(lái)的一款 Javascript MVC 框架。利用AngularJS,你可以構(gòu)建結(jié)構(gòu)清晰、便于測(cè)試和維護(hù)的前端應(yīng)用。 ...

    shadajin 評(píng)論0 收藏0
  • FE.FW-AngularJS 1.x 實(shí)現(xiàn)進(jìn)銷存系統(tǒng)感悟與反思

    摘要:背景作為單頁(yè)大型應(yīng)用的框架愛(ài)好者的我,不實(shí)現(xiàn)個(gè)大型應(yīng)用練練手怎么趕說(shuō)自己熟練,于是嘗試實(shí)現(xiàn)了大部分的進(jìn)銷存功能。本文主要對(duì)實(shí)現(xiàn)業(yè)務(wù)需求中遇到的問(wèn)題以及解決方案進(jìn)行闡述。不確保對(duì)其他項(xiàng)目有可移植性。 背景 作為單頁(yè)大型應(yīng)用的mv*框架AngularJS愛(ài)好者的我,不實(shí)現(xiàn)個(gè)大型web應(yīng)用練練手怎么趕說(shuō)自己熟練ng,于是嘗試實(shí)現(xiàn)了大部分erp的進(jìn)銷存功能。本文主要對(duì)實(shí)現(xiàn)業(yè)務(wù)需求中遇到的問(wèn)題以...

    陸斌 評(píng)論0 收藏0
  • angular性能優(yōu)化心得

    摘要:本文針對(duì)的讀者具備性能優(yōu)化的相關(guān)知識(shí)雅虎條性能優(yōu)化原則高性能網(wǎng)站建設(shè)指南等擁有實(shí)戰(zhàn)經(jīng)驗(yàn)。這種機(jī)制能減少瀏覽器次數(shù),從而提高性能。僅會(huì)檢查該和它的子,當(dāng)你確定當(dāng)前操作僅影響它們時(shí),用可以稍微提升性能。 搬運(yùn)自: http://atian25.github.io/2014/05/09/angular-performace/ 不知不覺(jué),在項(xiàng)目中用angular已經(jīng)半年多了,踩了很多坑...

    guqiu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<