使用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)
}
相关推荐
烛阴6 分钟前
ABS - Rhomb
前端·webgl
植物系青年6 分钟前
10+核心功能点!低代码平台实现不完全指南 🧭(下)
前端·低代码
植物系青年7 分钟前
10+核心功能点!低代码平台实现不完全指南 🧭(上)
前端·低代码
小小李程序员14 分钟前
JSON.parse解析大整数踩坑
开发语言·javascript·json
桑晒.23 分钟前
CSRF漏洞原理及利用
前端·web安全·网络安全·csrf
宋辰月27 分钟前
Vue2-VueRouter
开发语言·前端·javascript
徐小夕28 分钟前
再也不怕看不懂 GitHub 代码!这款AI开源项目,一键生成交互架构图
前端·算法·github
Antonio91529 分钟前
【音视频】WebRTC 开发环境搭建-Web端
前端·webrtc
excel41 分钟前
JavaScript 中 WeakMap、WeakSet、Set、Map、Object、Array 的区别与应用场景
前端
golitter.1 小时前
python的异步、并发开发
开发语言·python