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

使用JavaScript实现轮播图的任意页码切换和丝滑衔接切换效果

相关文章

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

HTML代码

<body><!-- 轮播图图片 --><div class="inner"><ul class="innerbox"><li><img src="../img/tu3.jpg" alt=""></li><li><img src="../img/tu1.jpg" alt=""></li><li><img src="../img/tu2.jpg" alt=""></li><li><img src="../img/tu3.jpg" alt=""></li><li><img src="../img/tu1.jpg" alt=""></li></ul><!-- 轮播图左右箭头切换 --><ul class="item"><li class="left" role="button"><</li><li class="right" role="button">></li></ul><!-- 轮播图任意切换 --><ul class="inner-btn"><li index="0" class="current"></li><li index="1"></li><li index="2"></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: 500%; /* 5张图片 */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;
}
/* 轮播图任意切换 */
.inner-btn{position: absolute;width: 100%;bottom: 20px;left: 45%;display: flex;cursor:pointer;/* 鼠标形状 */
}
.inner-btn li{margin: 5px;height: 16px;width: 16px;background: rgba(208, 208, 208, 0.5);border-radius: 50%;
}
.inner-btn li.current{background: rgba(0, 0, 255, 0.5);
}

JavaScript代码

实现任意页码切换

var innerbox = document.querySelector(".innerbox")
var left = document.querySelector(".left")
var right = document.querySelector(".right")
var btns = document.querySelectorAll(".item li,.inner-btn li")
var innerBtn = document.querySelectorAll(".inner-btn li")// 获取单个轮播图的宽度
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"
}// 小圆点样式切换核心方法
var count = 0
var light = function(num){count = count + num// 判断边界值  count值大于2,返回到0的位置;count值小于0,返回到2的位置if(count>2){count=0}else if(count<0){count=2}// 遍历  如果index值与count值相同,赋予current样式;如果不相同,去掉样式for(var i=0;i<innerBtn.length;i++){if(innerBtn[i].getAttribute("index")==count){innerBtn[i].className = "current"}else{innerBtn[i].className = ""}}
}// 任意页码切换  绑定点击事件
for(var i=0;i<innerBtn.length;i++){innerBtn[i].onclick = function(){// 数据切换 小圆点与图片绑定一起change((count - this.getAttribute("index"))*slideWidth)// 样式切换light(this.getAttribute("index") - count)}
}// 往上一张切换
left.onclick = function(){change(slideWidth)light(-1)
}
// 往下一张切换
right.onclick = function(){change(-slideWidth)light(1)
}
// 自动切换
var timer =  setInterval(right.onclick,4000)// 通过遍历 解决手动轮播和自动轮播的冲突
for(var i=0;i<btns.length;i++){btns[i].onmouseenter = function(){clearInterval(timer)}btns[i].onmouseleave = function(){timer = setInterval(right.onclick, 4000)}
}

实现轮播丝滑衔接切换效果

修改的地方有:

  • CSS中的.innerbox宽修改为5张图片的宽
  • 初始位置修改
  • 核心切换方法修改
var innerbox = document.querySelector(".innerbox")
var left = document.querySelector(".left")
var right = document.querySelector(".right")
var btns = document.querySelectorAll(".item li,.inner-btn li")
var innerBtn = document.querySelectorAll(".inner-btn li")// 获取单个轮播图的宽度
var slideWidth = document.querySelector(".innerbox li").offsetWidth
// 初始位置
innerbox.style.left = -slideWidth +"px"// 核心切换方法
var flag = 0
var change = function(num){flag = 1// target_position目标位置var target_position =  parseInt(innerbox.style.left) + num// 丝滑衔接切换setInterval(function(){innerbox.style.left = (parseInt(innerbox.style.left) + num/40) + "px"if(parseInt(innerbox.style.left) == target_position){clearInterval(timer)if(target_position == -slideWidth * 4){innerbox.style.left = -slideWidth + "px"}else if(target_position == 0){innerbox.style.left = -slideWidth * 3 + "px"}flag = 0}},20)
}// 小圆点样式切换核心方法
var count = 0
var light = function(num){count = count + num// 判断边界值  count值大于2,返回到0的位置;count值小于0,返回到2的位置if(count>2){count=0}else if(count<0){count=2}// 遍历  如果index值与count值相同,赋予current样式;如果不相同,去掉样式for(var i=0;i<innerBtn.length;i++){if(innerBtn[i].getAttribute("index")==count){innerBtn[i].className = "current"}else{innerBtn[i].className = ""}}
}// 任意页码切换  绑定点击事件
for(var i=0;i<innerBtn.length;i++){innerBtn[i].onclick = function(){// 数据切换 小圆点与图片绑定一起change((count - this.getAttribute("index"))*slideWidth)// 样式切换light(this.getAttribute("index") - count)}
}// 往上一张切换
left.onclick = function(){if(flag==0){change(slideWidth)light(-1)}
}
// 往下一张切换
right.onclick = function(){if(flag==0){change(-slideWidth)light(1)}
}
// 自动切换
var timer =  setInterval(right.onclick,4000)// 通过遍历 解决手动轮播和自动轮播的冲突
for(var i=0;i<btns.length;i++){btns[i].onmouseenter = function(){clearInterval(timer)}btns[i].onmouseleave = function(){timer = setInterval(right.onclick, 4000)}
}

问题:修改为丝滑衔接切换代码后,会发现轮播图一直停不下来,通过打印22行的代码 console.log(parseInt(innerbox.style.left))
console.log(target_position)
发现两边的值一直不相等。
原因:宽一直是使用的百分比,换算下来会有小数点的情况,parseInt会丢弃小数部分,只取整数部分,导致与target_position计算不匹配。
解决方案:将parseInt修改为parseFloat,这样问题就解决了。

  • parseFloat:会保留小数部分,避免精度丢失
  // 丝滑衔接切换var timer_change = setInterval(function(){innerbox.style.left = (parseFloat(innerbox.style.left) + num/40) + "px"console.log(parseFloat(innerbox.style.left))console.log(target_position)if(parseFloat(innerbox.style.left) == target_position){clearInterval(timer_change)if(target_position == -slideWidth * 4){innerbox.style.left = -slideWidth + "px"}else if(target_position == 0){innerbox.style.left = -slideWidth * 3 + "px"}flag = 0}},20)
http://www.dtcms.com/a/303962.html

相关文章:

  • uniapp 实现全局变量
  • 【数据结构】用堆实现排序
  • vue3+vite 使用liveplayer加载视频
  • MySQL MVCC:并发神器背后的原理解析
  • 网工知识——OSPF摘要知识
  • [工具类] 分片上传下载,MD5校验
  • echarts饼图
  • 封装$.ajax
  • 一个人开发一个App(数据库)
  • OpenAI Python API 完全指南:从入门到实战
  • 【学习笔记】Lean4 定理证明 ing
  • 7.29错题(zz)史纲 7章 建立新中国
  • Scala实用编程(附电子书资料)
  • Node.js 内置模块
  • AR辅助前端设计:虚实融合场景下的设备维修指引界面开发实践
  • 学习Scala语言的最佳实践有哪些?
  • GCC、glibc、GNU C(gnuc)的关系
  • SkSurface---像素的容器:表面
  • PowerShell脚本自动卸载SQL Server 2025和 SSMS
  • 零基础-动手学深度学习-7.7 稠密连接网络(DenseNet)
  • 景区负氧离子环境监测系统云平台方案
  • 论文阅读:2024 arxiv AutoDefense: Multi-Agent LLM Defense against Jailbreak Attacks
  • 【OpenAI】ChatGPT辅助编码:Spring Boot + Copilot自动生成业务逻辑
  • 【MySQL】从连接数据库开始:JDBC 编程入门指南
  • Java优雅使用Spring Boot+MQTT推送与订阅
  • vue请求golang后端CORS跨域问题深度踩坑
  • 【STM32】FreeRTOS 任务消息队列 和 中断消息队列的区别(六)
  • 14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)
  • “非参数化”大语言模型与RAG的关系?
  • 云原生MySQL Operator开发实战(五):扩展与生态系统集成