第 63 题:如何设计实现无缝轮播?
图片轮播过程分析,假设一共有5张图片,克隆第一张图片放在最后,现在一共有6张图。轮播中图片显示的顺序为:
1 2 3 4 5 (6–>1) 2 3 4 5 (6–>1) ….
(6—>1)表示图片显示第6张图片(克隆自第一张图片)后,迅速的将图片容器滚动到开始的位置,即第一张图片,这也是无缝轮播的秘密所在,由于切换为同一张图片,且切换的时间很小,所以人眼看不出来。图片对应锚点的顺序为:
0 1 2 3 4 0 1 2 3 4 0
图片显示时容器的位置:
0 -100% -200% -300% -400% (-500%–>0) -100% -200% -300% -400% (-500%–>0)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
参考了18055975947,没有用jquery
FYI. -> Demo && Code
nter从 translateX(-100%) 开始,到 translateX(0) 结束,leave从translateX(0)开始,到translateX(100%)结束
这样是向右移动吧
4.1应该是把最后一个li的left设置为所有li宽度之和的负值,4.2应该是把ul的left设置为1个li的宽度。
prev和next反了吧。
用Vue实现无缝轮播好像比较省事:
用
transition-group
来显示图片的位置,Vue中的过渡有4种状态:
enter -> enter-to, leave ->leave-to
如果向左移动,那么enter从
translateX(-100%)
开始,到translateX(0)
结束,leave从translateX(0)
开始,到translateX(100%)
结束,向右移动则反过来。演示地址⭐
github 源码
原理
本例 固定为4张图的轮播图,主要为便于阐述原理.
4fake
的图片4
的复制,1fake
的图片1
的复制,1fake
时,在滚动完成后,将left值设置到1
的位置(此处没有动画,用户无法察觉);4fake
时,在滚动完成后,将left值设置到4
的位置(此处也没有动画);3 实现无缝轮播
改变了以往写轮播的方式,尝试了一下纯操控节点增删来实现无缝连接轮播图。https://github.com/yaodongyi/javascript
代码千万种,这里主要说一下两种实现思想:
自己写的react-native的轮播组件,欢迎评鉴:https://github.com/lvzhiyi/react-naitve-SeamlessScroll
一上来clone一个
这里说一个不需要clone的方案:
1、最外层
div.slide
定宽、相对定位relative2、
ul
足够宽,最起码li数*li宽度
,这里有个技巧,直接width: 9999em
,目的是让里面的所有li
一字排开3、滚动效果通过控制
ul
的left
或者transform
来进行滚动效果4、到了最后一个
li
,往后看第一个li
的时:4.1、准备继续滚动,把最后一个的
li
设置为相对定位relative
,left
值为此时此刻相对ul的位置(设置的时候不要带缓动效果),目的是让最后一个li
不动。4.2、然后把ul的
left
或者transform
设为0(这步没有缓动效果),4.3、然后再正常的开始一样出现第一个li的滚动效果(这步有缓动效果)
4.4、最后等无缝的第一个
li
效果完成后,把最后一个li
的left
值复原为05、到第一个
li
,往前看最后一个li
时,也是和上面同理具体效果可以看下 汽车之家首页的轮播图效果
克隆第一张和最后一张作为过渡,在切换时就会显得流畅一些
前一阵使用angular写了一个无缝轮播的组件,与大家思路都差不多
https://github.com/zmh3788/AElfWebsite-Angular/blob/master/src/app/components/app.carousel.component/app.carousel.component.ts
无限轮播基本插件都可以做到,不过要使用原生代码实现无缝滚动的话我可以提点思路,
因为轮播图基本都在ul盒子里面的li元素,
首先获取第一个li元素和最后一个li元素,
克隆第一个li元素,和最后一个li元素,
分别插入到lastli的后面和firstli的前面,
然后监听滚动事件,如果滑动距离超过x或-x,让其实现跳转下一张图或者跳转上一张,(此处最好设置滑动距离),
然后在滑动最后一张实现最后一张和克隆第一张的无缝转换,当到克隆的第一张的时候停下的时候,,让其切入真的第一张,则实现无线滑动,向前滑动同理
简单来说,无缝轮播的核心是制造一个连续的效果。最简单的方法就是复制一个轮播的元素,当复制元素将要滚到目标位置后,把原来的元素进行归位的操作,以达到无缝的轮播效果。
贴一段轮播的核心代码: