<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • js使用transition效果實現無縫滾動

          2020-9-7    seo達人

          前言

          無縫輪播一直是面試的熱門題目,而大部分答案都是復制第一張到最后。誠然,這種方法是非常標準,那么有沒有另類一點的方法呢?

          第一種方法是需要把所有圖片一張張擺好,然后慢慢移動的,

          但是我能不能直接不擺就硬移動呢?

          如果你使用過vue的transition,我們是可以通過給每一張圖片來添加入場動畫和離場動畫來模擬這個移動

          • 進場動畫就是從最右側到屏幕中央
          • 出場動畫是從屏幕中央到左側移出

          這樣看起來的效果就是圖片從右邊一直往左移動,但是這個不一樣的地方是,我們每一個元素都有這個進場動畫和離場動畫,我們根本不用關心它是第幾個元素,你只管輪播就是。

          如果不用vue呢?

          很簡單,我們自己實現一個transtition的效果就好啦,主要做的是以下兩點

          • 元素顯示的時候,即display屬性不為none的時候,添加xx-enter-active動畫
          • 元素消失的時候,先添加動畫xx-leave-active, 注意要讓動畫播完才消失
           function hide(el){
               el.className = el.className.replace(' slide-enter-active','')
               el.className += ' slide-leave-active' el.addEventListener('animationend',animationEvent)
           } function animationEvent(e){
               e.target.className = e.target.className.replace(' slide-leave-active','')
               e.target.style.display = 'none' e.target.removeEventListener('animationend',animationEvent)
           } function show(el){
               el.style.display = 'flex' el.className += ' slide-enter-active' }

          這里我們使用了animationend來監聽動畫結束,注意這里每次從新添加類的時候需要重新添加監聽器,不然會無法監聽。如果不使用這個方法你可以使用定時器的方式來移除leave-active類。

           function hide(el){
               el.className = el.className.replace(' slide-enter-active','') 
          

          el.className += ' slide-leave-active' setTimeout(()=>

          { //動畫結束后清除class el.className = el.className.replace(' slide-leave-active','')

          el.style.display = 'none' }, ANIMATION_TIME) //這個ANIMATION_TIME為你在css中動畫執行的時間 }

          那么,動畫怎么寫呢?

           .slide-enter-active{ position: absolute; animation: slideIn ease .5s forwards;
           } .slide-leave-active{ position: absolute; animation: slideOut ease .5s forwards;
           } @keyframes slideIn {
               0%{ transform: translateX(100%);
               }
               100%{ transform: translateX(0);
               }
           } @keyframes slideOut {
               0%{ transform: translateX(0);
               }
               100%{ transform: translateX(-100%);
               }
           }

          需要注意的是這里的 forwards屬性,這個屬性表示你的元素狀態將保持動畫后的狀態,如果不設置的話,動畫跑完一遍,你的元素本來執行了離開動畫,執行完以后會回來中央位置杵著。這個時候你會問了,上面的代碼不是寫了,動畫執行完就隱藏元素嗎?

          如果你使用上面的setTimeout來命令元素執行完動畫后消失,那么可能會有一瞬間的閃爍,因為實際業務中,你的代碼可能比較復雜,setTimeout沒法在那么精準的時間內執行。保險起見,就讓元素保持動畫離開的最后狀態,即translateX(-100%)。此時元素已經在屏幕外了,不用關心它的表現了

          輪播邏輯怎么寫?

          很簡單,我們進一個新元素的時候同時移除舊元素即可,兩者同時執行進場和離場動畫即可。

           function autoPlay(){
               setTimeout(()=>{
                   toggleShow(新元素, 舊元素) this.autoPlay()
               },DURATION) //DURATION為動畫間隔時間 } function toggleShow(newE,oldE){ //舊ele和新ele同時動畫 hide(oldE)
               show(newE)
           }

          藍藍設計www.sdgs6788.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.sdgs6788.com

          存檔

          久久99国产精品久久99果冻传媒 | 天天爽天天狠久久久综合麻豆| 国产精品99久久久久久宅男小说| 久久久久久久波多野结衣高潮 | 久久人人爽人人爽人人av东京热| 99精品国产在热久久无毒不卡| 久久国产精品免费一区二区三区| 午夜精品久久久久成人| 久久精品亚洲中文字幕无码麻豆| 日批日出水久久亚洲精品tv| 久久精品国产亚洲AV电影| 久久无码精品一区二区三区| 亚洲级αV无码毛片久久精品| 国产呻吟久久久久久久92| 国产三级久久久精品麻豆三级 | 久久AV高潮AV无码AV| 久久精品国产亚洲精品| 婷婷久久综合九色综合98| 色综合久久无码五十路人妻| 久久人人爽人人爽人人片av麻烦| 99久久www免费人成精品| 99久久精品午夜一区二区 | 久久强奷乱码老熟女网站| 人妻中文久久久久| 久久男人中文字幕资源站| 国产高清国内精品福利99久久| 久久99亚洲网美利坚合众国| 中文字幕久久精品无码| 欧美精品乱码99久久蜜桃| 亚洲国产精品无码久久久久久曰| 国产精品欧美久久久久无广告| 久久婷婷国产麻豆91天堂| 青青青青久久精品国产| 色综合色天天久久婷婷基地| 99久久99久久精品国产片果冻| 久久精品国产半推半就| 色综合合久久天天综合绕视看 | 久久精品国产乱子伦| 精品国产乱码久久久久久人妻| 久久久久久精品无码人妻| 久久精品国产99久久久|