【学会轮播图这一篇文章就足够啦】JS 网页轮播图详解 自动播放+手动播放

  1. 轮播图的基本结构搭建及原理分析
  1. 光标移动至轮播图处切换按钮的显示与隐藏
  1. 点击下方按钮切换图片的实现
  1. 右侧按钮滚动实现 以及 下方点点同步改变
  1. 左侧按钮滚动实现 以及 下方点点同步改变
  1. 自动播放实现

一: 轮播图的基本结构搭建及原理分析

==================

其实轮播图的构成很简单,仅由显示区域和图片区域两部分组成,图片区域由一个 ul 标签实现,内部一个 li 标签里放一张图片,使其左浮动形成一行,其移动其实靠的就是 ul 的 动画原理 左右移动来改变显示区域,效果如下:(页面结构的HTML与CSS,还有封装好的动画函数js文件在文章末尾)


二: 光标移动至轮播图处切换按钮的显示与隐藏

======================

光标移动到轮播图区域使左右切换图片按钮显示与隐藏,我们用到两个事件分为: mouseenter 和 mouseleave,之所以不用 mouseover 和 mouseout 是因为这两个事件会冒泡,会产生很多不可控的影响,但两组事件的效果几乎完全相同。绑定事件后改变按钮的 display 值即可。

首先我们先了解一下获取到的元素有哪些,以免下面的分步讲解有疑惑的地方:

var leftbtn=document.querySelector(‘.leftbtn’); //左按钮

var rightbtn=document.querySelector(‘.rightbtn’); //右按钮

var windows=document.querySelector(‘.windows’); //显示窗口区域

var circleul=document.querySelector(‘.imgbox’); //装图片的 ul

var circleol=document.querySelector(‘.circle’); //装下方小点点的 ol

此部分是 光标移动至轮播图处切换按钮的显示与隐藏 的实现:

windows.addEventListener(‘mouseenter’,function(){

leftbtn.style.display=‘block’;

rightbtn.style.display=‘block’;

clearInterval(timer) //清除定时器自动播放,此处不需要管

timer=null;

})

windows.addEventListener(‘mouseleave’,function(){

leftbtn.style.display=‘none’

rightbtn.style.display=‘none’

timer=setInterval(function(){

rightbtn.click();

},2000)

})

leftbtn.addEventListener(‘click’,function(){ //按钮点击后变色一下的效果

leftbtn.style.color=‘grey’

var timer=setTimeout(function(){

leftbtn.style.color=‘aliceblue’

},100)

})

rightbtn.addEventListener(‘click’,function(){

rightbtn.style.color=‘grey’

var timer=setTimeout(function(){

rightbtn.style.color=‘aliceblue’

},100)

})


三:点击下方按钮切换图片的实现

================

for循环的作用为根据 ul 中图片的个数来添加 ol 中小点点的个数并添加在 ol 中,给创建的 li 添加自定义属性 indexfor 循环的 i 作为其每个 li 的属性值,而图片作为ul的子节点,分别对应 children[0],children[1],children[2],children[3],正好与自定义属性的 index 一一对应,也就是说每个点点都配对一个同样序号的图片。

在添加每个 li 的同时就给每个 li 绑定点击事件,并获取该自定义属性index,使用 排他思想 更改点击的原点的颜色,并调用封装好的动画函数就可以完成点击小圆点切换图片的效果

这两行是移动的关键代码:**windows.offsetWidt 作用是获取每张图片的宽度,-6** 是为了消除一些移动中由于图片与图片之间间隔产生的误差

var imgwidth=windows.offsetWidth-6;

var long=this.getAttribute(‘index’)*imgwidth;

点第一个小点点:

点第二个小点点:

点第三个小点点:

代码实现:

for(var i=0;i<circleul.children.length;i++){ //根据图片个数自动创建小点点个数

lis=document.createElement(‘li’);

lis.setAttribute(‘index’,i);

circleol.appendChild(lis);

lis.addEventListener(‘click’,function(){

var currentindex=this.getAttribute(‘index’); //bug整改

num=currentindex; //bug整改

circlechange=currentindex; //bug整改

for(var i=0;i<circleol.children.length;i++){ //排他思想

circleol.children[i].className=‘’;

}

this.className=‘circlecolor’;

var imgwidth=windows.offsetWidth-6;

var long=this.getAttribute(‘index’)*imgwidth;

run(circleul,-long); //封装好的动画函数

})

}


四:右侧按钮滚动实现 以及 下方点点同步改变

=======================

总算到了关键的一步,通过按钮来使轮播图运动,也是本案例最抽象的一部分,抽象在它最后一张和第一张的无缝衔接,此处要说明我们要使其无缝衔接的原理,是将第一张图片克隆一份放在最后一张图片的后面**(下方点点数不包括克隆的这一张图片,但是ul 的子元素包含了这个新克隆的图片!)**,在图片滚动到该克隆图片后,立马将其 ul 的 left 值改为 0 。

克隆第一张图片我们使用节点的带参克隆 :

var firstimg=circleul.children[0].cloneNode(true);

circleul.appendChild(firstimg);

我们已经知道了图片滚动的距离等于该图片的顺序乘图片宽度,在这里我们先设置一个全局变量num,并设初始值为0,点击一次右侧按钮则 num 自增1,第一次点击 num自增1, num=1,移动距离为 1✖宽度,第二次点击 num 自增 1,num=2,移动距离为 2✖宽度,前面几步都好理解,但是当num 为最后无缝衔接时需要一个判断语句,我们重点研究无缝衔接的原理:

第一次点击右侧按钮后:

第二次点击右侧按钮后:

第三次点击右侧按钮后:

第四次点击右侧按钮后:

注意此步骤判断前 num=3,即不执行判断里的语句,但是判断完后num自增为4,也就是说下一次就要执行判断里的语句

第五次点击右侧按钮后:

**为什么点击后直接到了第二张图片呢?不是在判断语句里设置了left为0吗?**这是因为判断中设置了num=0和left=0后才自增1,所以这一次点击后带入动画函数的num=1,移动距离为1✖宽度,又开始新一轮循环图片!

代码实现:

num=0;

circlechange=0; //目的为下方点点同步改变时使用,这一步先不用管这个参数

rightbtn.addEventListener(‘click’,function(){

if(num==circleul.children.length-1){

circleul.style.left=0;

num=0;

}

num++;

long=numwindows.offsetWidth-6num;

run(circleul,-long);

我们点击右侧按钮,图片滚动的同时,小圆圈也应该跟着切换才对,该怎么实现呢?

每点击一次都让circlechange这个变量自增,当自增到值和 circleul.children.length-1 的值相等时(即滚动到了克隆过去的最后一张图片),这时让 circlechange 变为 0 即可

circlechange++;

if(circlechange==circleul.children.length-1){

circlechange=0;

}

for(var i=0;i<circleol.children.length;i++){ //排他思想

circleol.children[i].className=‘’;

}

circleol.children[circlechange].className=‘circlecolor’;

})


五:左侧按钮滚动实现 以及 下方点点同步改变

=======================

向左切换和向右切换的原理类似,在此我们只研究第一张图片开始往左无缝衔接最后一张图片的过程

第一次点击左侧按钮后:

代码实现:

leftbtn.addEventListener(‘click’,function(){

if(num==0){

circleul.style.left=(circleul.children.length-1)*windows.offsetWidth;

num=circleul.children.length-1;

}

num–;

long=numwindows.offsetWidth-6num;

run(circleul,-long);

点击左侧按钮,小圆圈跟随切换:

circlechange–;

if(circlechange<0){

circlechange=circleol.children.length-1; //注意此处是ol的子节点的长度-1

}

for(var i=0;i<circleol.children.length;i++){

circleol.children[i].className=‘’;

}

circleol.children[circlechange].className=‘circlecolor’;

})


六:自动播放实现

========

自动播放最简单!,只需要一个自动点击即可

**此处为右侧按钮自动点击:**rightbtn.click()

将其添加在定时器中就可以完成我们的轮播图啦

var timer=setInterval(function(){

rightbtn.click();

},2000)

完整JS代码:

=======

我们的 JS 是单独的一个文件,所以加入了 load 事件等文档流执行完毕后,再执行 JS 的内容

window.addEventListener(‘load’,function(){

var leftbtn=document.querySelector(‘.leftbtn’);

var rightbtn=document.querySelector(‘.rightbtn’);

var windows=document.querySelector(‘.windows’);

var circleul=document.querySelector(‘.imgbox’);

var circleol=document.querySelector(‘.circle’);

//光标移动至轮播图区域按钮显示,移开隐藏,点击按钮的变化效果

windows.addEventListener(‘mouseenter’,function(){

leftbtn.style.display=‘block’;

rightbtn.style.display=‘block’;

clearInterval(timer)//清除定时器自动播放

timer=null;

})

windows.addEventListener(‘mouseleave’,function(){

leftbtn.style.display=‘none’

rightbtn.style.display=‘none’

timer=setInterval(function(){

rightbtn.click();

},2000)

})

leftbtn.addEventListener(‘click’,function(){

leftbtn.style.color=‘grey’

var timer=setTimeout(function(){

leftbtn.style.color=‘aliceblue’

},100)

})

rightbtn.addEventListener(‘click’,function(){

rightbtn.style.color=‘grey’

var timer=setTimeout(function(){

rightbtn.style.color=‘aliceblue’

},100)

})

//点击小圆圈可以滚动

for(var i=0;i<circleul.children.length;i++){

lis=document.createElement(‘li’);

lis.setAttribute(‘index’,i);

circleol.appendChild(lis);

lis.addEventListener(‘click’,function(){

var currentindex=this.getAttribute(‘index’);//bug整改(3行)

num=currentindex;

circlechange=currentindex;

for(var i=0;i<circleol.children.length;i++){

circleol.children[i].className=‘’;

}

this.className=‘circlecolor’;

var imgwidth=windows.offsetWidth-6;

var long=this.getAttribute(‘index’)*imgwidth;

run(circleul,-long);

})

}

circleol.children[0].className=‘circlecolor’;

//克隆第一张图片至末尾

var firstimg=circleul.children[0].cloneNode(true);

circleul.appendChild(firstimg);

//右侧按钮点击滚动

num=0;

circlechange=0;

rightbtn.addEventListener(‘click’,function(){

if(num==circleul.children.length-1){

circleul.style.left=0;

num=0;

}

num++;

long=numwindows.offsetWidth-6num;

run(circleul,-long);

//小圆圈跟着一起变化

circlechange++;

if(circlechange==circleul.children.length-1){

circlechange=0;

}

for(var i=0;i<circleol.children.length;i++){

circleol.children[i].className=‘’;

}

circleol.children[circlechange].className=‘circlecolor’;

})

//左侧按钮滚动

leftbtn.addEventListener(‘click’,function(){

if(num==0){

circleul.style.left=(circleul.children.length-1)*windows.offsetWidth;

num=circleul.children.length-1;

}

num–;

long=numwindows.offsetWidth-6num;

run(circleul,-long);

//小圆圈跟着一起变化

circlechange–;

if(circlechange<0){

circlechange=circleol.children.length-1; //注意此处是ol的子节点的长度-1

}

for(var i=0;i<circleol.children.length;i++){

circleol.children[i].className=‘’;

}

circleol.children[circlechange].className=‘circlecolor’;

})

//自动播放

var timer=setInterval(function(){

rightbtn.click();

},2000)

})

动画函数代码:

=======

function run(obj,long,callback){

clearInterval(obj.timer)

obj.timer=setInterval(function(){

if(obj.offsetLeft==long){

window.clearInterval(obj.timer);

if(callback){

callback();

}

}else{

step=(long-obj.offsetLeft)/10

step=step>0?Math.ceil(step):Math.floor(step)

obj.style.left=obj.offsetLeft+step+‘px’;

}

},20)

}

HTML+CSS 完整代码:

==============

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

计算机网络

  • HTTP 缓存

  • 你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?

  • HTTP 常用的请求方式,区别和用途?

  • HTTPS 是什么?具体流程

  • 三次握手和四次挥手

  • 你对 TCP 滑动窗口有了解嘛?

  • WebSocket与Ajax的区别

  • 了解 WebSocket 嘛?

  • HTTP 如何实现长连接?在什么时候会超时?

  • TCP 如何保证有效传输及拥塞控制原理。

  • TCP 协议怎么保证可靠的,UDP 为什么不可靠?

算法

  • 链表

  • 字符串

  • 数组问题

  • 二叉树

  • 排序算法

  • 二分查找

  • 动态规划

  • BFS

  • DFS

  • 回溯算法

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-lgkRrHFw-1712879328925)]

计算机网络

  • HTTP 缓存

  • 你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?

  • HTTP 常用的请求方式,区别和用途?

  • HTTPS 是什么?具体流程

  • 三次握手和四次挥手

  • 你对 TCP 滑动窗口有了解嘛?

  • WebSocket与Ajax的区别

  • 了解 WebSocket 嘛?

  • HTTP 如何实现长连接?在什么时候会超时?

  • TCP 如何保证有效传输及拥塞控制原理。

  • TCP 协议怎么保证可靠的,UDP 为什么不可靠?

算法

  • 链表

  • 字符串

  • 数组问题

  • 二叉树

  • 排序算法

  • 二分查找

  • 动态规划

  • BFS

  • DFS

  • 回溯算法

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-V41WtLkR-1712879328925)]

  • 28
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现轮播图的思路通常有以下几步: 1. 准备轮播图的HTML结构和CSS样式。 2. 使用JavaScript获取轮播图的DOM节点,并初始化轮播图的一些参数,比如轮播图的宽度、滑动速度、间隔时间等。 3. 编写事件监听器,监听轮播图前进和后退的按钮点击事件,以及自动轮播的定时器。 4. 在事件监听器中编写轮播图的滑动逻辑,比如用CSS3的transform属性实现轮播图的滑动效果。 5. 处理轮播图的边界问题,比如当轮播图到达最后一张时,要自动跳转到第一张。 6. 可选:为轮播图添加指示器或者控制按钮,让用户可以手动切换轮播图。 具体实现代码可以参考以下示例: HTML: ```html <div class="carousel"> <ul class="carousel-list"> <li><img src="image1.jpg"></li> <li><img src="image2.jpg"></li> <li><img src="image3.jpg"></li> </ul> <div class="prev-btn"><</div> <div class="next-btn">></div> </div> ``` CSS: ```css .carousel { position: relative; overflow: hidden; } .carousel-list { position: relative; width: 300%; left: 0; transition: left 0.5s; } .carousel-list li { float: left; width: 33.33%; } .prev-btn, .next-btn { position: absolute; top: 50%; transform: translateY(-50%); width: 40px; height: 40px; line-height: 40px; text-align: center; cursor: pointer; background-color: rgba(0, 0, 0, 0.5); color: #fff; } .prev-btn { left: 0; } .next-btn { right: 0; } ``` JavaScript: ```javascript var carousel = document.querySelector('.carousel'); var carouselList = carousel.querySelector('.carousel-list'); var prevBtn = carousel.querySelector('.prev-btn'); var nextBtn = carousel.querySelector('.next-btn'); var slideWidth = carousel.clientWidth / 3; var currentIndex = 0; // 初始化轮播图参数 carouselList.style.width = slideWidth * 3 + 'px'; // 监听前进和后退按钮点击事件 prevBtn.addEventListener('click', function() { currentIndex = Math.max(currentIndex - 1, 0); carouselList.style.left = -slideWidth * currentIndex + 'px'; }); nextBtn.addEventListener('click', function() { currentIndex = Math.min(currentIndex + 1, 2); carouselList.style.left = -slideWidth * currentIndex + 'px'; }); // 自动轮播 setInterval(function() { currentIndex = (currentIndex + 1) % 3; carouselList.style.left = -slideWidth * currentIndex + 'px'; }, 2000); ``` 这是一个简单的轮播图实现,具体实现方式会因需求而异,但基本思路都是相似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值