使用JavaScript实现轮播图的自动切换和左右箭头切换效果

HTML代码

html 复制代码
<body>
  <!-- 轮播图图片 -->
  <div class="inner">
    <ul class="innerbox">
      <li><img src="../img/tu1.jpg" alt=""></li>
      <li><img src="../img/tu2.jpg" alt=""></li>
      <li><img src="../img/tu3.jpg" alt=""></li>
    </ul>
    <!-- 轮播图左右箭头切换 -->
    <ul class="item">
      <li class="left" role="button"><</li>
      <li class="right" role="button">></li>
    </ul>
  </div>
</body>

CSS代码

css 复制代码
*{
  margin: 0;
  padding: 0;
}
li{
  list-style-type: none;
}
/* 轮播图片 */
.inner{
  height:350px;
  width:40%;
  position: relative;
  margin: 200px auto;
  overflow: hidden;
}
.innerbox, .innerbox li, .innerbox li img{
  width: 100%;
  height: 100%;
}
.innerbox{
  width: 300%; /* 6张图片 */
  position: relative;
  left: -100%;
  display: flex;
}
.innerbox li img{
  object-fit: cover;/* 图片不变形 */
}
/* 轮播图左右箭头切换 */
.item{
  position: absolute;
  width: 85%;
  height: 50px;
  left: 40px;
  top: 150px;
}
.left, .right{
  font-size: 40px;
  font-weight: bold;
  color: #8F939F;
  width: 50px;
  height: 50px;
  text-align: center;
  line-height: 45px;
  border-radius: 25px;
  background: rgba(208, 208, 208, 0.5);
  cursor:pointer;/* 鼠标形状 */
}
.left{
  float: left;
}
.right{
  float: right;
}

JavaScript代码

  • parseInt()方法:转成整数,保留字符串中的数字

设置定时器自动播放

javascript 复制代码
var innerbox = document.querySelector(".innerbox")

// 获取单个轮播图的宽度
var slideWidth = document.querySelector(".innerbox li").offsetWidth
// 初始位置
innerbox.style.left = "0px"

// 设置定时器
setInterval(function(){
  // target_position目标位置
  var target_position =  parseInt(innerbox.style.left) - slideWidth
  // 判断边界值  如果目标位置小于3张图片的位置,立马返回第一张的位置
  if(target_position<-slideWidth*2){
    target_position = 0
  }
  innerbox.style.left = target_position + "px"
},4000)

设置左右箭头切换

javascript 复制代码
var left = document.querySelector(".left")
var right = document.querySelector(".right")

// 往上一张切换
left.onclick = function(){
  var target_position =  parseInt(innerbox.style.left) + slideWidth
  if(target_position>0){
    target_position = -slideWidth*2
  }
  innerbox.style.left = target_position + "px"
}
// 往下一张切换
right.onclick = function(){
  var target_position =  parseInt(innerbox.style.left) - slideWidth
  if(target_position<-slideWidth*2){
    target_position = 0
  }
  innerbox.style.left = target_position + "px"
}

可以看出自动播放和左右切换 的代码逻辑相似,代码重复较多,可以进行优化:写一个核心的切换方法

javascript 复制代码
// 核心切换方法
var change = function(num){
  // target_position目标位置
  var target_position =  parseInt(innerbox.style.left) + num
  // 图片一部到位
  // 判断边界值  如果目标位置小于3张图片的位置,立马返回第一张的位置
  if(target_position<-slideWidth*2){
    target_position = 0
  }else if(target_position>0){
    target_position = -slideWidth*2
  }
  innerbox.style.left = target_position + "px"
}

// 自动切换
setInterval(function(){
  change(-slideWidth)
},4000)

// 往上一张切换
left.onclick = function(){
  change(slideWidth)
}
// 往下一张切换
right.onclick = function(){
  change(-slideWidth)
}

可以看出往下一张切换和自动切换 代码依然冗余,可以进一步优化:两段代码写在一起

javascript 复制代码
// 往下一张切换
right.onclick = function(){
  change(-slideWidth)
}
// 自动切换
setInterval(right.onclick,4000)

问题:点击左右切换时,自动轮播也在进行中,会出现冲突

解决方法:在使用手动左右切换时,让自动切换停止

javascript 复制代码
// 自动切换
var timer =  setInterval(right.onclick,4000)

// 鼠标进行手动切换时,自动切换停止
left.onmouseenter = function(){
  clearInterval(timer)
}
right.onmouseenter = function(){
  clearInterval(timer)
}

// 鼠标离开手动切换,自动切换开始
left.onmouseleave = function(){
  timer = setInterval(right.onclick,4000)
}
right.onmouseleave = function(){
  timer = setInterval(right.onclick,4000)
}

优化后的完整代码

javascript 复制代码
var innerbox = document.querySelector(".innerbox")
var left = document.querySelector(".left")
var right = document.querySelector(".right")

// 获取单个轮播图的宽度
var slideWidth = document.querySelector(".innerbox li").offsetWidth
// 初始位置
innerbox.style.left = "0px"

// 核心切换方法
var change = function(num){
  // target_position目标位置
  var target_position =  parseInt(innerbox.style.left) + num
  // 图片一部到位
  // 判断边界值
  if(target_position<-slideWidth*2){
    target_position = 0
  }else if(target_position>0){
    target_position = -slideWidth*2
  }
  innerbox.style.left = target_position + "px"
}

// 往上一张切换
left.onclick = function(){
  change(slideWidth)
}
// 往下一张切换
right.onclick = function(){
  change(-slideWidth)
}
// 自动切换
var timer =  setInterval(right.onclick,4000)

// 鼠标进行手动切换时,自动切换停止
left.onmouseenter = function(){
  clearInterval(timer)
}
right.onmouseenter = function(){
  clearInterval(timer)
}

// 鼠标离开手动切换,自动切换开始
left.onmouseleave = function(){
  timer = setInterval(right.onclick,4000)
}
right.onmouseleave = function(){
  timer = setInterval(right.onclick,4000)
}
相关推荐
txinyu的博客几秒前
map和unordered_map的性能对比
开发语言·数据结构·c++·算法·哈希算法·散列表
Mr -老鬼16 分钟前
Rust适合干什么?为什么需要Rust?
开发语言·后端·rust
予枫的编程笔记19 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
ohoy25 分钟前
RedisTemplate 使用之Set
java·开发语言·redis
mjhcsp25 分钟前
C++ 后缀数组(SA):原理、实现与应用全解析
java·开发语言·c++·后缀数组sa
hui函数26 分钟前
如何解决 pip install 编译报错 ‘cl.exe’ not found(缺少 VS C++ 工具集)问题
开发语言·c++·pip
Hilaku35 分钟前
我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)
前端·javascript·github
IT_陈寒35 分钟前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
云栖梦泽35 分钟前
易语言Windows桌面端「本地AI知识管理+办公文件批量自动化处理」双核心系统
开发语言
快手技术36 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法