项目里须要使用轮播图,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 * (轮播条数 - 与上条间隔数量) * 轮播宽度
反向拖动,若是拖动的时候拖动的距离是个正数,则立刻更新顺序为反向,若是为负数,立刻更新顺序为正向
该方案的性能很高,可是兼容性不太好。并且实现过程当中,对元素的排序计算若是涉及到反向动画的话会比较复杂