animation屬性之純css3實現曲線運動——貝塞爾曲線(cubic-bezier)

animation: name duration timing-function delay iteration-count direction fill-mode play-state;
(關鍵幀名稱,持續時間,速度曲線,延遲時間,動畫次數,是否反向,完成狀態,運行|暫停)

  • animation-name 關鍵幀名稱
    @keyframes name { }
    (1)關鍵幀的聲明只有兩種:(from/to)和(%)
    (2)0 (%)從0%開始至100%,0%~100%中間任意數字都可以
  • animation-duration 動畫持續時間(默認爲0,值可以設置成秒[s]或毫秒[ms])
  • animation-timing-function 動畫速度曲線(默認值ease)
  • animation-delay 動畫播放延遲時間設置(s/ms)
  • animation-iteration-count 動畫播放次數,默認值1,值:n/infinite)
  • animation-direction 規定是否應該輪流反向播放動畫。
    animation-direction: normal|alternate;
    normal:默認值。動畫應該正常播放。
    alternate:動畫應該輪流反向播放。動畫會在奇數次數(1、3、5 等等)正常播放,而在偶數次數(2、4、6 等等)向後播放。
  • animation-fill-mode: backwards/forwards; 動畫播放完之後的狀態(默認值none,值:none;backwards;forwards;both.)
    (1)backwards應用在第一個關鍵幀的狀態,即定格在0%時候的樣子
    (2) forwards動畫完成保持最後一幀的狀態,即定格在最後100%的樣子
    animation-play-state:running|paused; //運行|暫停(默認運行)
    注意:始終規定 animation-duration 屬性,否則時長爲 0,就不會播放動畫了。
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>貝塞爾曲線動畫調研</title>
    <style>
        html {
            background: #ad4e24;
        }

        /* //定義球的初始值,位置是絕對定位; */
        .ball {
            height: 100px;
            width: 100px;
            border-radius: 50%;
            position: absolute;
            bottom: 40px;
            z-index: 10;
            left: 40px;
            background: greenyellow;
        }

        /* //定義動畫的流程 */
        .run_top_right {
            display: block;
            animation: run-right-right 3s 0.4s 1 linear, run-right-top 3s 0.4s 1 cubic-bezier(.66, .1, 1, .41);
            /* animation: run-right-right 3s 0.4s 1 linear, run-right-top 3s 0.4s 1 ease-out; */
            animation-fill-mode: forwards;
        }

        /* //向上走的動畫初始及結尾值 */
        @keyframes run-right-top {
            0% {
                bottom: 40px;
            }

            100% {
                bottom: 500px;
            }
        }

        /* //向上右的動畫初始及結尾值 */
        @keyframes run-right-right {
            0% {
                left: 40px;
            }

            100% {
                left: 600px;
            }
        }
    </style>
</head>

<body>
    <div class="ball run_top_right"></div>
</body>

</html>

第一、分解運動
上圖的曲線運動進行分解
向右:勻速運動;
向上:加速運動;(因爲向上的線越來越陡,意味着速度越來越快,所以在做加速運動)

第二、實現代碼解釋
——@keyframes 是css3的一個規則,用來定義一個運動的每個楨的位置,大小顏色等;
——這段代碼的意思是動畫animation用run-right-right動畫和 run-right-top動畫,注意我們是同時引用的兩個動畫;
就是@keyframes 所定義的,然後我們又設置了一些參數,逐一解釋:

一.第一個參數就是引用的動畫名字;
二,動畫持續時間3s;
三、0.4s是延遲時間爲0.4s,以run_top_right加到ball上面的時間爲準,延後0.4s;
四、1是動畫的執行次數是1次;
五、cubic-bezier(.66,.1,1,.41) 就是重要的貝塞爾曲線(cubic-bezier);

實際上是設置animation-timing-function的屬性;就是設置運動速度的特性屬性;

1.linear,就是線性運動,也就是勻速運動;

2 ease,默認。動畫以低速開始,然後加快,在結束前變慢。
3.ease-in,ease-out,ease-in-out,就很好記,ease就是慢的意思,ease-in就是慢速開始,就是做加速運動,ease-out就是減速運動,ease-in-out就是先加速後減速;當然我們也可以設置成cubic-bezier()值;

因爲這裏我只需要向上的運動做變速運動所以run-right-right 我設置的是linear,勻速運動,然後 run-right-top設置的是cubic-bezier(.66,.1,1,.41),這樣的加速運動,這樣得到的運動路徑就是一條曲線!!曲線的軌跡又run-right-top的cubic-bezier值決定!

animation-fill-mode: forwards;

animation-fill-mode設置動畫完成後的狀態;
forwards:當動畫完成後,保持最後一個屬性值(在最後一個關鍵幀中定義)。簡單說就是定格在最後100%的樣子;
backwards:在 animation-delay 所指定的一段時間內,在動畫顯示之前,應用開始屬性值(在第一個關鍵幀中定義)。就是定格在0%時候的樣子

css3圓形軌跡動畫

<!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title> css3圓形軌跡動畫 </title>
    <style type="text/css">
    @keyframes animX{
          0% {left: 0px;}
        100% {left: 500px;}
    }
    @keyframes animY{
          0% {top: 0px;}
        100% {top: 500px;}
    }

    #ball {
        width: 20px;
        height: 20px;
        background-color: #f66;
        border-radius: 50%;
        position: absolute;
        animation: animX 4s cubic-bezier(0.36,0,0.64,1) -2s infinite alternate, animY 4s cubic-bezier(0.36,0,0.64,1)  0s infinite alternate;
    }

    #lopp {
        width: 500px;
        height: 500px;
        border: 2px solid #999;
        border-radius: 50%;
        box-sizing: border-box;
    }

    </style>
    </head>
    <body>
    <div id="lopp"></div>
    <div id="ball"></div>
    </body>
    </html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章