由於hover偽類新增的動畫效果,僅當滑鼠放在元素上時會被觸發,而當滑鼠離開時,效果會中斷,會顯得很生硬。
大多數人的想法都是使用js的onmouseover和onmouseleave事件來實現動畫效果。其實不必這麼麻煩,CSS3便可以幫你解決這些問題。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>離開時效果生硬</title>
<style type="text/css">
div{
width: 100px;
height: 100px;
border:1px solid;
margin:0px auto;
margin-top: 200px;
}
div:hover{
transform: scale(2);
transition: all 1s linear;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
由於div元素只有在:hover偽類觸發的時候,效果才能加到div元素上。
當滑鼠離開div元素的時候,:hover偽類將不再生效,瞬間丟掉hover裡寫的動畫效果。
此時,我們應當在原本元素上再寫一個一模一樣的transition效果,將離開斷掉的動畫效果續接上。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>簡單解決</title>
<style type="text/css">
div{
width: 100px;
height: 100px;
border:1px solid;
margin:0px auto;
margin-top: 200px;
/* 在原本元素上再加一個transition */
transition: all 1s linear;
}
div:hover{
transform: scale(2);
transition: all 1s linear;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
此時,不管滑鼠在什麼時候離開元素,都會原樣返回。
但此時會有一個問題,滑鼠放上去,立馬離開,或者滑鼠從上邊勻速劃過,div回到原樣的時間,依舊是1s。
其實,我們在hover裡寫的transition:all 1s linear完全是多餘的。
transition有一個特性,只要是帶有數值型別的屬性(例如:% , rgba() , rgb() , hsla() , 數字等),在其發生變化的時候,均會被觸發動畫效果。
因此,不管:hover偽類什麼時候丟掉我的動畫,也不管我:hover時,元素動畫走到了什麼地步。只要元素本身帶有transitioin,該動畫便會從當前動畫執行到的地方,以相同的時間返回原樣。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>簡單解決</title>
<style type="text/css">
div{
width: 100px;
height: 100px;
border:1px solid;
margin:0px auto;
margin-top: 200px;
/* 在此處留一個transition就夠了 */
transition: all 1s linear;
}
div:hover{
transform: scale(2);
/* 去掉這個tansition */
/* transition: all 1s linear; */
}
</style>
</head>
<body>
<div></div>
</body>
</html>
這只是最簡單的動畫實現,但對於目前大部分需求來說,配合配合貝塞爾曲線,已經足夠用了。
你僅僅需要做到,hover中的最終樣式,保證為數值樣式變OK了。
像display:block變為display:none就不好使了,此時我們可以用visibilty:1變為visibilty:0,同樣也可以簡單實現顯示到隱藏的效果。
另外加一句,不太清楚transition屬性的可以自行去百度去,transition-timing-function屬性定義的速度曲線,使用cubic-bezier貝塞爾曲線,可以做到很多效果,大家可以上這個網址去試一試貝塞爾曲線實現的動畫。