当前位置: 首页 > ai >正文

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

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代码

*{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()方法:转成整数,保留字符串中的数字

设置定时器自动播放

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)

设置左右箭头切换

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

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

// 核心切换方法
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)
}

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

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

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

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

// 自动切换
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)
}

优化后的完整代码

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)
}
http://www.xdnf.cn/news/16464.html

相关文章:

  • BERT 的 NSP慢慢转换为SOP
  • Linux -- 文件【中】
  • 工具链攻击利用漏洞链入侵SharePoint服务器获取完全控制权
  • 图片查重从设计到实现(7) :使用 Milvus 实现高效图片查重功能
  • python基础:request请求Cookie保持登录状态、重定向与历史请求、SSL证书校验、超时和重试失败、自动生成request请求代码和案例实践
  • GCC、glibc、GNU C(gnuc)的关系
  • 准大一GIS专业新生,如何挑选电脑?
  • redhat7.9更换源为centos7(阿里云源-目前centos7可用的源)
  • 基于KMeans、AgglomerativeClustering、DBSCAN、PCA的聚类分析的区域经济差异研究
  • 222. 完全二叉树的节点个数
  • AI算法实现解析-C++实例
  • 如何在在NPM发布一个React组件
  • 第2章 cmd命令基础:常用基础命令(1)
  • 音频算法基础(语音识别 / 降噪 / 分离)
  • Rust:anyhow::Result 与其他 Result 类型转换
  • HTTP 与 HTTPS 的区别
  • 【C++篇】“内存泄露”的宝藏手段:智能指针
  • Neurosciences study notes[1]
  • vue2 使用liveplayer加载视频
  • CVPR 2025 | 华科精测:无需人工标注也能精准识别缺陷类别,AnomalyNCD 实现多类别缺陷自主分类
  • 机器学习、深度学习与数据挖掘:核心技术差异、应用场景与工程实践指南
  • 笔试——Day22
  • 【RK3588部署yolo】算法篇
  • Marin说PCB之POC电路layout设计仿真案例---10
  • Wndows Docker Desktop-Unexpected WSL error
  • 从视觉到智能:RTSP|RTMP推拉流模块如何助力“边缘AI系统”的闭环协同?
  • MOE 速览
  • 吃透 lambda 表达式(匿名函数)
  • 实验-静态路由
  • Polkadot 的 Web3 哲学:从乔布斯到 Gavin Wood 的数字自由传承