我们发现有些slide没有过渡效果,而且不是非必现的,没有规律。经过一番排查,发现如果把上面的nextTick改成setTimeout情况就会好一些,并且setTimeout的时间越长,就越不会出现失去过渡效果的情况。但是这个不能从根本上解决问题,这里的原因应该是Vue的自动更新DOM和transition动画不是很兼容,有可能是Vue的异步机制问题,也有可能是JS结合transition本身就有问题,但以前没有遇到过,具体没有深入排查。不管怎么样,只能放弃使用CSS的transition做动画。
如果有使用jQuery的话,可以使用jQuery的animation,如果没有的话,那么可以使用原生dom的animate函数,如下代码所示:
_slideToNext(fast = false) { let currentIndex = this.slideQueue.pop(); // 下一个slide的类型 let nextType = currentIndex % 2 ? "odd" : "even"; // 获取下一个slide的dom元素 let $nextSlide = this.$refs[`${nextType}Task`].$el; $nextSlide.style.display = "block"; this.sliding = true; // 使用原生animate函数 $nextSlide.animate([ // 关键帧 {transform: "translateX(100%)"}, {transform: "translateX(0)"} ], { duration: fast ? 200 : 500, iteration: 1, easing: "ease" // 返回一个Animate对象,它有一个onfinish的回调 }).onfinish = () => { // 等动画结束后更新数据 this._updateData(currentIndex); if (this.slideQueue.length) { this.$nextTick(() => { this._slideToNext(true); }); } else { this.sliding = false; } }; },
使用animate函数达到了和transition同样的效果,并且还有一个onfinish的动画结束回调函数。上面代码还做了一个优化,如果用户点得很快的时候,缩短过渡动画的时间,让它切得更快一点,这样看起来更自然一点。使用这样的方式,就不会出现transition的问题了。最后的效果如下:
这个体验感觉已经比较流畅了。
原生animate不兼容IE/Edge/Safari,可以装一个polyfill的库,如这个 web-animation ,或者使用其它一些第三方的动画库,或自己用setInterval写一个。
如果你要加上一题的按钮,支持返回上一题,那么可能需要准备3个component,中间那个用于显示,左右两边各跟着一个,准备随时切过来。具体读者可以自行尝试。
这种模式除了答题的场景,还有多封邮件预览、PPT展示等都可以用到,它除了有一个过渡的效果外,还能提前预加载下一个slide需要的图片、音频、视频等资源,并且不会像传统的轮播插件那样一下子把所有的slide都渲染了。适用于slide比较多的情况,不需要太复杂的切换动画。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持黑区网络。