想问下两个 div 如何反复重复出现

2020-12-08 11:45:35 +08:00
 xiaohantx
<div>
  <div>1</div>
  <div>2</div>
</div>

需求是这样的,刚进来的时候显示 2,最外层的 div 有个 overflow:hidden;然后隔一会触发 1 从上往下停留在 2 的位置,2 也会同时从原来位置往下到外面,再过一会,2 从上往下到 1 位置,1 从原来位置往下到外面,以此循环

1613 次点击
所在节点    问与答
26 条回复
learnshare
2020-12-08 12:15:42 +08:00
看起来是要做滚动动画,两个 div 放完全一致的内容,然后实现循环滚动的效果?

这种状况通常建议使用 transform: translate*() 的 animation 实现,具体来讲是
1. 三层结构:外部容器 > 内部容器( transform 的目标) > 滚动内容(重复多次)
2. 定义动画:内部容器 translate* 0~-50%(第二个值 = 100% / 内容重复次数)
3. 重复播放

并不需要考虑 DOM 的删除和插入,这么做反而需要复杂的位置计算和处理逻辑。

参考示例 https://codepen.io/web-app-dev/pen/BaLzJeB

示例中可以看到,每个动画周期结束后,瞬间跳回了第一帧( 1-2 切换为 1-1 )
liyang5945
2020-12-08 12:17:02 +08:00
这玩意都不用写 js,用 css3 animate 就行
liyang5945
2020-12-08 12:29:23 +08:00
我写了个往返的运动的动画,不知道是不是你想要的效果: https://codepen.io/liyang5945/pen/oNzLprM
xiaohantx
2020-12-08 12:32:25 +08:00
@learnshare 不好意思可能没说清楚,以此循环是指后续动画我想到是这样到一个交互,并不是指动画一直播放,需要触发条件,比如接口调用后如果成功,执行以此动画,这时候这里有旧消息 2,然后调用完接口新消息 1 会出来,2 会下去消失
xiaohantx
2020-12-08 12:33:12 +08:00
@liyang5945 下去的时候是类似效果,但是没有返回的效果,另外动画是需要一个触发
cmdOptionKana
2020-12-08 12:41:05 +08:00
@xiaohantx 看 3 楼的代码,怎样从上往下,怎样从下往上,都有很清晰的代码,如果要触发,就直接在触发时用 js 改 css class 即可。
learnshare
2020-12-08 12:59:24 +08:00
@xiaohantx
@cmdOptionKana
没错,来回播放可以修改关键帧,或者设置动画来回播放;按需启动可以使用 JS 修改元素的 class
yaphets666
2020-12-08 13:27:51 +08:00
这不是轮播图吗兄弟?
xiaohantx
2020-12-08 13:37:41 +08:00
@cmdOptionKana
@learnshare
因为没有从下往上过度,我看从上往下,第一次是没问题,主要就是第二次因为界面已经停留在 div1 了,想 div2 继续从 div1 上面下来。。
xiaohantx
2020-12-08 13:38:04 +08:00
@yaphets666 是。。但是觉得用轮播做太麻烦,有没有稍微简单点的方式
yaphets666
2020-12-08 13:39:41 +08:00
@xiaohantx 就用上面那个老哥的代码 vue 这边是可以动态绑定一个 class 让他动就绑上去 不让他动就不绑
xiaohantx
2020-12-08 13:40:00 +08:00
@learnshare
@cmdOptionKana
没有衔接的话就会感觉卡一下
xiaohantx
2020-12-08 13:41:26 +08:00
@yaphets666 但是第一次是 div1 在 div2 上面下来,上面有内容,第二次要 div2 从 div1 上面下来,第二次之后这个衔接没看明白,第一次是没问题的,,,动画能做出来我知道
xiaohantx
2020-12-08 13:44:57 +08:00
@yaphets666 就是轮播图那种一直下一页到最后一页时候,继续下一页时候第一页衔接到效果(但是不是通过回弹到第一页)
zxCoder
2020-12-08 13:48:12 +08:00
@liyang5945 css 好神奇。。。
liyang5945
2020-12-08 13:50:25 +08:00
我懂你的意思了,就是一个无限循环的轮播图呗,使用 swiper 这个 js 插件可以达到你的效果: https://www.swiper.com.cn/demo/index.html
yaphets666
2020-12-08 13:51:12 +08:00
@xiaohantx 数组 arr[1,2,3,4] 四张图片对吧 实际上轮播图是五张 是这样的[1,2,3,4,1],播放到'4'也就是 arr[3]的时候下一张就是'1',也就是 arr[4]. 然后瞬间把当前播放张换成 arr[0]. 由于 arr[4]和 arr[0]的图片是一样的 所以说视觉效果上是观察不到这个动作的 这样就无缝循环了
xiaohantx
2020-12-08 13:52:11 +08:00
@liyang5945 我是知道这个最终解决方案,但是因为不是属于轮播图,其实是消息提示样式,类似轮播图,而且就两个,所以我在想有没有比较简单点到方式,或者通过每次修改 dom 节点来做到。。
xiaohantx
2020-12-08 13:53:58 +08:00
@yaphets666 那这个方案好像是不太适合,因为始终只有一个新的消息,一个旧的消息,新的消息永远从上出现,旧的消息永远从出现往下,过程没有两条同样内容的消息,所以也就感觉不太适合这个方案
yaphets666
2020-12-08 13:56:04 +08:00
@xiaohantx 视觉效果上就是 一个新消息 一个旧消息 1 和 1 你能看出不同吗?当然咱们自己写代码是知道 arr[0]和 arr[4]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/733248

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX