CSS3實現偽類hover離開時平滑過渡效果

John發表於2017-08-10

由於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貝塞爾曲線,可以做到很多效果,大家可以上這個網址去試一試貝塞爾曲線實現的動畫

相關文章