本文介绍如何使用原生JavaScript实现一个简单的无缝自动轮播效果。通过复制图片列表实现视觉上的无限循环,利用定时器控制位移,并在关键帧重置位置以达成无缝衔接。
近期持续强化JavaScript基础。在接触jQuery和Vue等框架后,意识到若缺乏对底层原理的理解,往往只能机械地调用API,长期依赖现成库对个人技术成长助益有限。
基础扎实是快速掌握新技术的前提。尝试用原生代码实现功能能带来显著的成就感,此处记录今日复习的原生JS无缝轮播实现过程。
先展示一张配图作为开场。
HTML结构与CSS样式
首先阐述实现思路:将多张图片置于ul元素中进行展示,具体代码实现如下。
<div id="wrap">
<ul id="ul">
<li>
<img src="http://img3.imgtn.bdimg.com/it/u=1135520735,2369294998&fm=200&gp=0.jpg">
</li>
<li>
<img src="http://img2.imgtn.bdimg.com/it/u=695607252,2370769232&fm=200&gp=0.jpg">
</li>
<li>
<img src="http://img4.imgtn.bdimg.com/it/u=4133407901,1533904167&fm=200&gp=0.jpg">
</li>
<li>
<img src="http://img5.imgtn.bdimg.com/it/u=4083237979,1376579798&fm=26&gp=0.jpg">
</li>
<li>
<img src="http://img2.imgtn.bdimg.com/it/u=1640379911,3259036309&fm=26&gp=0.jpg">
</li>
</ul>
</div>
轮播机制采用移动整个ul元素而非调整li的margin。CSS样式设定单张图片宽度为80px,因此容器总宽度设为400px。
#wrap{
width: 400px;
height: 80px;
overflow: hidden;
margin-left: 500px;
margin-top: 300px;
position: relative;
}
#ul{
position: absolute;
left: 0;
top: 0;
width: 400px;
font-size: 0;
margin: 0;
padding: 0;
}
基础JavaScript逻辑
JavaScript逻辑相对简单,主要依靠定时器控制ul元素向左或向右缓慢移动。此处暂不讨论后续问题,先提供基础代码。
window.onload = function(){
var odiv = document.getElementById('wrap');
var oul = document.getElementById('ul');
setInterval(function(){
oul.style.left = oul.offsetLeft + 5 +'px';
},30)
上述代码仅实现单向移动,图片向左移出后无法复位。需解决当最后一张图片到达左边缘时,如何重新显示第一张图片的问题。
无缝循环实现原理
解决方法是复制一份图片序列,例如原序列为1、2、3、4,扩展为1、2、3、4、1、2、3、4。当显示到第二组的第4张时,将ul位置重置,从而实现视觉上的无缝循环。
基于上述逻辑,具体代码实现如下。
var odiv = document.getElementById('wrap');
var oul = document.getElementById('ul');
var oli = oul.getElementsByTagName('li');
oul.innerHTML = oul.innerHTML + oul.innerHTML;//拼接li,因为图片可能是任意张
oul.style.width = oli[1].offsetWidth * oli.length + 'px';//ul的宽度等于所有图片宽度的总和
setInterval(function(){
if (oul.offsetLeft < -oul.offsetWidth/2) {
oul.style.left = 0;//如果ul已经显示完了一组,也就是宽度的一半,那么就把他拉回来重新轮播
}else{
oul.style.left = oul.offsetLeft - 2 +'px';
}
},30);
完整代码与测试
至此功能完成,可将代码复制到浏览器中测试效果。
总结
以上为原生JS实现简单无缝自动轮播效果的完整介绍,希望有所帮助。如有疑问欢迎留言,小编将及时回复。感谢支持。