使用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)
}
相关推荐
CodeCraft Studio1 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
零点零一1 小时前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助
开发语言·qt
2501_915918412 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂3 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技3 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip3 小时前
JavaScript二叉树相关概念
前端
rannn_1113 小时前
【Javaweb学习|实训总结|Week1】html基础,CSS(选择器、常用样式、盒子模型、弹性盒布局、CSS定位、动画),js(基本类型、运算符典例)
css·笔记·学习·html
lingchen19063 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
gb42152874 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go4 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript