在网页开发里头,新闻列表的滚动效果是挺常见的,然而呢,要去达成真正的那种“无缝”体验,好多开发者会把其中的细节以及陷阱给忽略掉 。
引子开头
新闻列表进行无缝向上滚动,这看起来好像简洁,然而却能够直接去影响用户的阅读体验,有不少实现的方法存在内容跳动的 那种“缝隙”,致使效果被大幅减弱 。
实现无缝滚动的核心思路
达成无缝滚动的关键之处在于内容的“转接”,平常的做法是预备两个内容一样的容器,像list1以及list2,list1起初启程向上移动,就在它全然移出可视范围之际,list2恰好承接至list1起始的位置。
这个当儿,用户不会觉察出内容已然切换。跟着,我们就得马上把滚动位置重又设置回到起始点原处,鉴于两个容器之内的内容是一样相同的,所以这个重置的进程对于用户来讲是没有能感觉到而无察觉的。这般便造就了一个在视觉方面不曾间断持续不断的循环模样。
HTML结构的设计要点
HTML的结构应当要保持简洁同时还得是很容易被CSS去进行控制的。一般情况下,我们会采用一个处于外部的容器把它当作视窗,然后设置overflow: hidden以此来将超出的部分给隐藏掉。置于内部的是两个子容器,它们放置的方式是以并排的形式,并且这两个子容器里面所含的内容是完全一样的 。
这样的两个子容器,能够以水平方式进行排列,或者借助CSS达成垂直排列的效果。关键之处在于,要保证它们在外层容器的隐蔽区域当中,实现连续的排布,进而为JavaScript的滚动以及重置操作,构建起结构方面的基础。
CSS样式的关键控制
对于CSS而言,其作用在于创建滚动轨道,并且对外观予以控制。再者,外层容器需要设置固定的高度,以及overflow: hidden。另外,内部两个子容器的宽度一般设置成100%,以此确保内容宽度能够保持一致。
文字列表无缝向上滚动代码
要是期望垂直滚动,那就能够把两个子容器在垂直方向上依照顺序排列。为了达成平滑滚动,可为涵盖这两个子容器的父元素增添transition属性,或者往后借助JavaScript动态更改其top值去达成动画效果。
JavaScript的滚动与复位逻辑
由JavaScript来负责驱动整个动画的进程,其关键之处在于借助setInterval函数,按照一定的时间间隔去对滚动容器的位置进行更改,像是scrollTop或者transform属性,每次仅仅滚动一小段的距离,以此来模拟出平滑移动的效果。
需对滚动距离予以监听,当首个子容器的内容彻底滚出视窗之际,即刻把滚动位置重置为零,鉴于第二个子容器的内容和第一个完全一样,此次瞬间的复位不会在屏幕上出现任何跳跃的感觉,进而达成无缝衔接的效果。
处理不同内容长度的技巧
新闻条目数量,或者其长度能够发生变化,要是内容过少的时候,少到没办法填满容器,那么就无需滚动,能够于代码开始之际,去判断内容的总高度是不是大于容器高度 。
对于动态加载的新闻,内容更新之后,要确保重新初始化两个子容器的内容,还要重启滚动计时器,不然新内容可能无法正确进入滚动循环,进而导致显示异常或者中断。
优化性能与注意兼容性
进行频繁的DOM操作以及定时器,这有可能对性能造成影响,建议采用requestAnimationFrame去替换setInterval,以此来对动画加以控制,进而让滚动变得更加流畅,并且能够节省资源。
当进行新闻列表移除操作或者页面切换动作时,一定要清除定时器或者取消动画帧请求,以此来避免内存泄漏情况发生同时,要留意在浏览器版本较低的情况下,某些CSS属性,像transform属性这样的兼容性要注意,在需要的情况下要提供备用方案。
当你着手去实现差不多类似滚动那般的效果之际,碰到的最为常见的问题究竟是滚动复位那个时段出现的闪烁现象呢,或者是在进行动态更新有关内容之后滚动终止的那种情况呢?