要轮播5张图 ,布置 5->1->2->3->4->5->1 7张图 要实现无缝
实际思路上就是最后一张滚到第一张实际是顺着滚,动画结束再取消transition切回第一张再附加transition
现在我遇到这个个问题
/...5->1执行的代码(有滚动动画).../
if (newLeft === -3600) { //滚到第7张图时的left,执行回滚
setTimeout(function () {
list.style.transition = 'none'; //取消动画
list.style.left = -600 + 'px'; //瞬间回滚
list.style.transition = 'left 2s linear';//恢复动画 //但是这句话回滚的时候会生效是为什么
},2000)
}
这么写回滚的时候动画会生效
必须要用下面的写法,第二个计时器必须大于2000几个毫秒才满足需求,
为什么会发生这种事情,计时器里面回调函数应该是同步的呀, list.style.left = -600 + 'px';不执行完后面应该是不会设置动画的呀?
if (newLeft === -3600) {
setTimeout(function () {
list.style.transition = 'none';
list.style.left = -600 + 'px';
},2000)
setTimeout(function () {
list.style.transition = 'left 2s linear';
},2020)
}
这里我发现:间隔时间1-4秒基本没用给,间隔10ms偶尔会出现回滚动画,设置20ms基本没问题
实际上还是刚刚的问题,js是单线程,会阻塞,2000ms执行的代码如果不执行完,2010ms是不会把异步代码拿来执行的,如果执行完了,那么我这个回滚应该是没有动画的。求大神解释一下
浏览器会在一个特定的点去执行渲染,在那之前的操作是没有中间态的!
在两次渲染间,浏览器只知道
list.style.left
从 0 变为 4px 这个事实, 他不知道也不关心你到 4 中间发生了什么, 你可以是1个px 累加,或先到100再到4. 浏览器看到就是上一次渲染是0,这次是4.所以
在浏览器看来就是:
解决办法是在需要被感知状态的地方让浏览器进行一次渲染, setTimeout 就可以达到这个效果,还有常见的访问
offsetWidth
等属性触发一次 reflow.方案一:
方案二: