輪播動畫簡單實現

JulissaCaus 7年前發布 | 13K 次閱讀 WebKit CSS3 CSS 前端技術

輪播動畫簡單實現

現在的前端,越來越注重用戶交互和體驗,有很多動畫和效果是很常見的,如本篇要講的主題:輪播動畫。這和以前經常聽到的一個名詞–”跑馬燈“效果一樣。在CSS3出來之前,都是通過JavaScript實現的動畫,現在我們完全可以使用CSS3,性能有很大的提升,兼容性也已經很不錯,尤其是移動端。

JavaScript與輪播

首先看看Js實現:

html結構如下:

    <h2>Js實現</h2>
    <div class="wrapper-js">
        <div class="container-js marquee">
            <p>今天</p>
            <p>明天</p>
            <p>后天</p>
            <p>今天</p><!-- 輔助元素,為實現循環輪播 -->
        </div>
    </div>

Js代碼:

    <script type="text/javascript">
        /**

     * [marquee 輪播效果]
     * @param  {[type]} ele      [輪播元素容器]
     * @param  {[type]} delay    [輪播間隔時間]
     * @param  {[type]} duration [輪播動畫時間]
     * @return {[type]}          [description]
     */
    function marquee(ele, delay, duration) {
        if (!ele) {
            return false;
        }

        delay = delay || 2000;
        duration = duration || 500;
        var height = ele.clientHeight;
        var active = true;
        var len = ele.querySelectorAll('p').length - 1;

        setTimeout(function() {
                active = true;
            ele.scrollTop = 1;// 開始動畫
            setInterval(function() {// 一個一個元素輪播
                if (!active) return;

                if (ele.scrollTop % height === 0) {
                // 當有某一元素輪播完成時,重置active,并開始下一元素的輪播
                    active = false;
                    setTimeout(function() {
                        active = true;
                        ele.scrollTop += 1;
                    }, delay);
                    if (ele.scrollTop == len * height) {
                        ele.scrollTop = 0;
                    }
                } else {
                    // 通過scrollTop值實現輪播滾動效果
                    ele.scrollTop += 1;
                }
            }, duration / height);
        }, delay);
    }

    marquee(document.querySelector('.marquee'));
</script></code></pre> 

通過以上代碼可以看出,其主要使用元素的scrollTop值不斷改變實現輪播滾動效果,同時為了達到循環輪播效果,必須在最后添加一個重復輔助元素。

CSS3實現

CSS3實現動畫性能會有極大提升,特別是當頁面動畫較多或定時器較多時。

html結構:

    <h2>CSS實現</h2>
    <div class="wrapper-css">
        <div class="container-css marquee">
            <p>今天</p>
            <p>明天</p>
            <p>后天</p>
            <p>今天</p><!-- 輔助元素,為實現循環輪播 -->
        </div>
    </div>

可以看到,依然需要在后面添加一個重復輔助元素,實現循環輪播效果。

CSS代碼:

    // 輪播動畫
        @-webkit-keyframes marquee {
            0% {
                -webkit-transform: translate3d(0, 0, 0);
            }
            27% {
                -webkit-transform: translate3d(0, 0, 0);
            }
            33% {
                -webkit-transform: translate3d(0, -100%, 0);
            }
            60% {
                -webkit-transform: translate3d(0, -100%, 0);
            }
            67% {
                -webkit-transform: translate3d(0, -200%, 0);
            }
            94% {
                -webkit-transform: translate3d(0, -200%, 0);
            }
            100% {
                -webkit-transform: translate3d(0, -300%, 0);
            }
        }
        @keyframes marquee {
            0% {
                transform: translate3d(0, 0, 0);
            }
            /* 100/3 * (2s/2.5s) => 26.7% => 27% */
            27% {
                transform: translate3d(0, 0, 0);
            }
            /* 100/3 =>33.3 => 33% */
            33% {
                transform: translate3d(0, -100%, 0);
            }
            60% {
                transform: translate3d(0, -100%, 0);
            }
            67% {
                transform: translate3d(0, -200%, 0);
            }
            94% {
               transform: translate3d(0, -200%, 0);
            }
            100% {
                transform: translate3d(0, -300%, 0);
            }
        }
        .wrapper-css {
            width: 200px;
            height: 30px;
            margin: 10px;
            overflow: hidden;
        }

        .container-css {
            height: 30px;
            -webkit-animation: marquee 7.5s linear infinite;/* 2.5s(2s + 0.5s) * 3 => 7.5s */
            animation: marquee 7.5s linear infinite;
        }
        .container-css p {
            width: 100%;
            height: 30px;
            margin: 0;
            line-height: 30px;
            font-size: 18px;
        }

如上,我們使用CSS3定義動畫關鍵幀,并結合transform位移實現無縫輪播動畫,通過移動容器實現輪播效果,主要需要根據輪播元素計算動畫關鍵幀點。

 

來自:http://blog.codingplayboy.com/2017/03/14/marquee/

 

 本文由用戶 JulissaCaus 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!