用JS原生实现轮播图(一)
最近在面试的时候,项目中用的Vue,然后用到了一个轮播图的插件,面试官就问如果用原生JS怎么实现,因此笔者想总结一下,督促自己把基础打好。今天先写一个最基础版本的,后续再添加一些升级版。 今天的版本是有多少张图,就有多少个按钮,每点击一个按钮,就切换到对应的那张图。
效果如下:

我这里考虑两种思路。
(1)下一次点击之前,先把所有按钮的背景颜色全部还原,再为新点击的这一张添加背景颜色。代码如下:
<style>
body{background: #333}
ul{margin: 0; padding: 0}
li{list-style: none;}
#pic{width: 440px; height: 440px; position: relative; margin: 0 auto}
#pic img{width: 440px; height: 440px}
#pic ul{width: 40px; position: absolute; top: 0; right: -50px}
#pic li{width: 40px; height: 40px; margin-bottom: 4px;background: #666}
#pic .active{background: #FC3}
#pic p{margin: 0; width: 440px; height: 30px; line-height: 30px; text-align: center; color: #fff; position: absolute; left: 0; bottom: 0}
#pic span{width: 440px; height: 30px; line-height: 30px; text-align: center; color: #fff; position: absolute; left: 0; top: 0}
</style>
<script>
window.onload = function(){
var arrUrl = ['./src/imgs/1.jpg.jpg','./src/imgs/2.jpg.jpg','./src/imgs/3.jpg.jpg','./src/imgs/4.jpg.jpg'];
var arrText = ['图片1','图片2','图片3','图片4'];
var oDiv = document.getElementById('pic');
var oImg = oDiv.getElementsByTagName('img')[0];
var oSpan = oDiv.getElementsByTagName('span')[0];
var oP = oDiv.getElementsByTagName('p')[0];
var oUl = oDiv.getElementsByTagName('ul')[0];
var aLi = oUl.getElementsByTagName('li');
var num = 0;
for(var i = 0; i < arrUrl.length; i++){
oUl.innerHTML += '<li></li>'
}
oImg.src = arrUrl[num];
oP.innerHTML = arrText[num];
oSpan.innerHTML = (num+1) + '/' + arrUrl.length;
aLi[num].className = 'active';
for(let i = 0; i < aLi.length; i++){
aLi[i].onclick = function(){
for(var j = 0; j < aLi.length; j++){
aLi[j].className = '';
}
this.className = 'active';
oImg.src = arrUrl[i];
oSpan.innerHTML = (i+1) + '/' + arrUrl.length;
oP.innerHTML = arrText[i];
}
}
}
</script>
<body>
<div id="pic">
<img src=""/>
<span>图片正在加载中。。。</span>
<p>文字说明正在加载中。。。</p>
<ul>
</ul>
</div>
</body>
(2)先还原上一次点击按钮的背景颜色,再添加这一次点击的背景颜色,而不用全部还原。这里和上一种处理方式相比。只是JS部分稍有改动,我就只附这一部分的代码了,其他地方都是一样的。
<script>
window.onload = function(){
var arrUrl = ['./src/imgs/1.jpg.jpg','./src/imgs/2.jpg.jpg','./src/imgs/3.jpg.jpg','./src/imgs/4.jpg.jpg'];
var arrText = ['图片1','图片2','图片3','图片4'];
var oDiv = document.getElementById('pic');
var oImg = oDiv.getElementsByTagName('img')[0];
var oSpan = oDiv.getElementsByTagName('span')[0];
var oP = oDiv.getElementsByTagName('p')[0];
var oUl = oDiv.getElementsByTagName('ul')[0];
var aLi = oUl.getElementsByTagName('li');
var num = 0;
for(var i = 0; i < arrUrl.length; i++){
oUl.innerHTML += '<li></li>'
}
oImg.src = arrUrl[num];
oP.innerHTML = arrText[num];
oSpan.innerHTML = (num+1) + '/' + arrUrl.length;
aLi[num].className = 'active';
var oLdLi = aLi[num];
for(let i = 0; i < aLi.length; i++){
aLi[i].onclick = function(){
oLdLi.className = '';
oLdLi = this;
this.className = 'active';
oImg.src = arrUrl[i];
oSpan.innerHTML = (i+1) + '/' + arrUrl.length;
oP.innerHTML = arrText[i];
}
}
}
</script>
转载自:https://juejin.cn/post/6844904088451153927