首頁技術(shù)文章正文

前端與移動開發(fā):H5C3-過渡效果失效的問題小結(jié)

更新時間:2018-01-05 來源:黑馬程序員 瀏覽量:

1、過渡效果的基礎(chǔ)知識

問題1:在原生的html中,如何實現(xiàn)一個元素的過渡效果?

答:在原生的html中,如果要讓一個元素實現(xiàn)過渡效果,那么我們需要做一件事情,給這個元素設(shè)置一個css樣式,transition,例如:

在上面的代碼中,transition的值為 width 2s linear ,它分別代表了3個方面的設(shè)置。

第一個:width,代表了當(dāng)這個div的寬度width這個屬性,只要這個值發(fā)生了改變,那么就會有過渡效果。

第二個:2s,這個代表了過渡的時長。既然是過渡,那就是一個慢慢變化的過程,那這個過程的時間是多長呢,就是這個值所決定的。

第三個:linear,這個代表了過渡的變化曲率。簡單的來說,是過渡是勻速進(jìn)行的。Width從一個值慢慢的變到另外一個值,是勻速變化的。還有其他的取值比如ease、ease-in、ease-out等

上面的代碼如果不使用簡寫的話,那么它的完整寫法應(yīng)該如下:

transition-property過渡屬性

transition-duration過渡時長

transition-timing-function 過渡的時間函數(shù)

需要注意的是,我們在css樣式中設(shè)置了transition相關(guān)的屬性不代表它立馬就有過渡效果了,我們只是制定了規(guī)則而已:當(dāng)什么屬性的值發(fā)生改變之后將會有幾秒的過渡效果。紅色文字就是我們制定的規(guī)則。

因此要真正看到過渡效果,我們還需要有觸發(fā)條件,比如我們點擊一個按鈕,在按鈕的點擊事件監(jiān)聽中改變這個div的寬度值,這時候我們才能看到慢慢變化的過渡效果。

問題2:要實現(xiàn)一個元素的過渡效果,最少需要設(shè)置幾個css屬性

答:在過渡的樣式設(shè)置中,上面講了3個屬性,如果你比較懶,不想設(shè)置這么多個值,那么你最少得設(shè)置一個屬性,那就是transition-duration 過渡時長。transition-property的默認(rèn)值為all,all的含義代表所有的屬性,所有的屬性發(fā)生了值得改變,那么都會有過渡效果。不過不是太建議使用all這個值,因為這樣有可能會出現(xiàn)我們預(yù)期之外的效果。

2、過渡效果失效的幾種場景

(1)過渡的屬性的取值非連續(xù)性

過渡效果對于width、left、height、opacity、padding、margin等屬性都可以適用,但是對于一些非連續(xù)值得屬性無法使用,典型的例子就是display

有些人會通過display的none和block來控制一個元素的顯示和隱藏,而他又想在display從none變?yōu)閎lock或者從block變?yōu)閚one的時候有過渡效果,于是乎他就會這樣寫:

他將transition-property寫為了display,這樣做完之后,當(dāng)元素顯示切換到隱藏的時候是不會有過渡效果的。因為display的取值不是連續(xù)值。而之前案例中的width就是連續(xù)值,可以從1px、2px、3px。。。1000px進(jìn)行取值。

(2)過渡的屬性沒有設(shè)置初始值

我們對過渡的定義是這樣的:以width為例,當(dāng)width這個屬性值發(fā)生改變的時候,將會有一段時間的過渡效果慢慢的改變,慢慢的從原始值變?yōu)槲覀兘o它設(shè)置的值。

有一種場景大家比較容易忘,如下:

在上訴的代碼中,我們給div設(shè)置了寬度,但是并沒有設(shè)置高度height,它的高度其實是由子元素?fù)伍_的。我們也給它設(shè)置了過渡規(guī)則,當(dāng)height的值發(fā)生改變的時候,會擁有過渡效果。在js代碼中我們響應(yīng)了一個按鈕的點擊事件,在點擊事件中改變了div的高度,但是你們會發(fā)現(xiàn),高度的變化并沒有過渡效果。原因是在于我們并沒有在css樣式中或者行內(nèi)樣式中設(shè)置過div的height屬性,相當(dāng)于它沒有初始值,它就不知道從什么值慢慢過渡到200px,這個是很多人都會忽略的并且不好找的錯誤。

(3)過渡的屬性的值改變得太猝不及防

有時候我們使用ajax獲取服務(wù)器數(shù)據(jù),然后使用模板引擎將數(shù)據(jù)渲染成html片段,放到界面中。

$.ajax({

type:"get",

url:"/getData.php",

dataType:"json",

success:function(data){

var html = template("dataTemplate",data);

$(".container").html(html);

//此時,立馬改變html中元素的屬性,就算這個屬性有過渡規(guī)則,可能也會失效

var divElt = document.querySelector("div");

divElt.style.height = "200px";

}

});

如上述代碼所示,在局部渲染網(wǎng)頁之后,立馬改變html中元素的屬性,就算這個屬性有過渡規(guī)則,可能也會失效

對此我們可能會做如下操作:

$.ajax({

type:"get",

url:"/getData.php",

dataType:"json",

success:function(data){

var html = template("dataTemplate",data);

$(".container").html(html);

//此時,立馬改變html中元素的屬性,就算這個屬性有過渡規(guī)則,可能也會失效

setTimeout(function(){

var divElt = document.querySelector("div");

divElt.style.height = "200px";

},200);

}

});


本文版權(quán)歸黑馬程序員前端與移動開發(fā)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!

作者:黑馬程序員前端與移動開發(fā)培訓(xùn)學(xué)院

首發(fā):http://web.itheima.com/

分享到:
在線咨詢 我要報名
和我們在線交談!