項目裏須要使用輪播圖,electron + vue 技術棧,項目應用一旦啓動會持續運行24小時,而且機器性能較差,因此很關注兩個點css
目前社區的輪播組件,大多隻是適用於常規 web 應用,通過內部測試後,並不能知足內存和性能方面的要求,因此須要本身實現輪播組件html
最開始找到了這篇文章,裏面講解了傳統的輪播圖實現思路和做者原創的輪播思路,並在文末給出了性能較高的原創方案。vue
做者的原創方案性能是很高了,可是我注意到每次執行輪播都須要移動一個 DOM 節點,這會觸發瀏覽器重排重繪,性能依舊不夠高,還能夠繼續優化。web
首先想到了 flex 佈局的 order 屬性:https://developer.mozilla.org/zh-CN/docs/Web/CSS/orderchrome
能夠看到只有現代瀏覽器才支持,若是要兼容老久瀏覽器就不用考慮本方案了,個人環境是electron 2.0,集成的chrome 61,可以使用。瀏覽器
本文章只記錄實現方案與僞代碼,不會給出 demo。electron
html結構函數
<div class="carousel">
<div class="carousel-container" style="transition-duration: 0ms; transform: translate3d(0px, 0px, 0px);">
<!-- 輪播列表元素 -->
<div class="carousel-item" style="order: 0;"></div>
<div class="carousel-item" style="order: 1;"></div>
<div class="carousel-item" style="order: 2;"></div>
<div class="carousel-item" style="order: 3;"></div>
<div class="carousel-item" style="order: 4;"></div>
</div>
</div>
<style> .carousel { width: 100%; } .carousel-container { width: 100%; display: flex; transition-property: transform; } .carousel-item { width: 100%; } </style>
複製代碼
從裏面元素開始解釋佈局
transition-duration
賦值 500ms
,就能實現動畫。到此就完成了輪播組件的基本功能post
先實現一個函數 next()
方法,定時調用
translate3d
的X軸一般的輪播都是 從右往左 滾動的,可是有時須要兼容 從左往右,實現方案:
非動畫狀態無需調整,主要關注動畫狀態。
-1 * (輪播條數 - 1) * 輪播寬度
-1 * (輪播條數 - 與上條間隔數量) * 輪播寬度
反向拖動,若是拖動的時候拖動的距離是個正數,則立刻更新順序爲反向,若是爲負數,立刻更新順序爲正向
該方案的性能很高,可是兼容性不太好。並且實現過程當中,對元素的排序計算若是涉及到反向動畫的話會比較複雜