JS 的平凡之路--學習人氣眼中的效果(下)

descire發表於2017-08-18

本篇實現tab切換的效果,主要介紹CSS動畫的一些注意點。

一、簡介

  先看一下效果圖:

人氣眼tab效果的實現

  實現這個效果,我們得理解兩個方面的知識點:

  • 移動端滑動場景的處理;

  • CSS動畫實現的一些注意事項。

二、移動端滑動

  對於web原生的滑動,當內容的尺寸大於容器尺寸的時候結合overflow屬性就可以出現漂亮的滾動條了,然後我們可以監聽scroll事件。但是在移動端,太多的情況下可能並不能滿足我們的需求。

  這裡我推薦兩個比較好的庫:

  值得慶幸的是,better-scroll.js的作者就在兩天前,重構了程式碼,並給了文件和例子。

  而better-scroll.js實現的核心主要是:

  • 監聽touchstart事件,呼叫_start方法,初始化運動引數;

  • 監聽touchmove事件,呼叫_move方法,判斷是否為標準的滑動,通過transform中的translate實現滑動;

  • 監聽touchend事件,呼叫_end方法,新增慣性滑動。

三、CSS實現動畫的注意點

  如果你一名英雄聯盟選手,相信你對FPS很敏感,如果FPS低於60,那團戰一打起來就像播放幻燈片一樣。我們的動畫也一樣,只有當幀率大於60時,動畫才會顯得很自然。

  為了讓動畫更加順暢,我們必須避免不必要的Reflow和Repaint,採用代價最小的Composite(渲染層合併)。

  什麼才能觸發渲染層合併?那就是我們的transform和opacity屬性。當然進入CSS3的時代,它同樣提供了一個will-change屬性,讓你告訴瀏覽器這個元素要發生改變,瀏覽器提前做好複雜的工作,從而提高響應的速度。這裡我們從上面這個動畫效果來學習。

  我們先看一下DOM結構:(這裡語義化不規範,需要批評)

    better-scroll(class="tap", :list="sub", :scroll-x="scrollX", :listenScroll="listenScroll", :page="page")
        ul(class="content" slot="content", :class="type === 1 ? '' : 'simple-text'")
            li(v-for="(item, index) in sub", :key="index", :class="selectIndex === index ? 'active' : ''" @click="select(index,$event)")
                div.des
                    p.title    {{item.title}}
                    p.sub    {{item.sub}}
                div.icon
複製程式碼

  動畫的實現主要通過opacity和transform改變元素前後狀態,對於需要變化的元素宣告will-change屬性,使用transition進行過渡,最後進行類名切換達到動畫效果。

    /* 變化前 */
    .sub {
        @include font-size(10px);
        transition: opacity 300ms ease-in-out;
        will-change: opacity; 
    }
    
    /* 變化後 */
    .sub {
        opacity: 0;
    }
複製程式碼

四、總結

  本節內容不多,主要總結為:

  • 移動端滾動可以選擇alloyTouch或者better-scroll,後者文件比較全,而且是採用Vue寫的例子;
  • 在實現動畫方面,優先考慮從transform和opacity屬性著手,使用will-change優化;

參考文章:Performant Web Animations and Interactions: Achieving 60 FPS


  喜歡本文的小夥伴們,歡迎關注我的訂閱號超愛敲程式碼,檢視更多內容.

JS 的平凡之路--學習人氣眼中的效果(下)

相關文章