JS如何实现轮播图
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容介绍了"JS如何实现轮播图"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现功能:1、自动轮
千家信息网最后更新 2025年11月08日JS如何实现轮播图
本篇内容介绍了"JS如何实现轮播图"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
实现功能:
1、自动轮播:鼠标停留在轮播图上时不切换图片,鼠标离开后自动轮播。
2、点击左右按钮切换图片。
3、点击下方按钮切换到对应的图片。
4、轮播图大小自适应:
可以放入到执行的父容器中展示。
不指定父容器时,默认放入body标签。占满一屏的宽度,当改变浏览器窗口大小时,轮播图大小成比例改变。
可以指定轮播图的宽高。
实现方式:用面向对象的方式实现,使用时传入图片和图片对应的数据,再创建实例。
import Carousel from './js/Carousel.js'; var itemList1 = [{ day: 26, date: "/Oct.2020", title: "秘境之蓝 无阿里不西藏 自驾阿里小北线", src: "./carousel_img/a.jpg", }, { day: 25, date: "/Oct.2020", title: "这是一个什么样的国家?", src: "./carousel_img/b.jpg", }, { day: 24, date: "/Oct.2020", title: "在徽州,给秋天写了8封信", src: "./carousel_img/c.jpg", }, { day: 23, date: "/Oct.2020", title: "「穿过狂野的风」赶赴内蒙的追羊计划", src: "./carousel_img/d.jpg", }, { day: 22, date: "/Oct.2020", title: "爱让我们无所不能|南极大冒险", src: "./carousel_img/e.jpg", }, ]; let carousel1 = new Carousel(itemList1); carousel1.appendTo(".div1"); animation(); function animation(){ requestAnimationFrame(animation); carousel1.update(); // carousel2.update();}代码:
import Component from './Component.js'; export default class Carousel extends Component{ imgList; bnList; imgCon; dot; dotList=[]; data; direction; pos=0; x=0; speedX=1; bool=false; time=200; autoBool=true; // WIDTH=13.66; // HEIGHT=4.55; WIDTH; HEIGHT; constructor(_data,_width,_height){ super("div"); this.data=_data; this.width = _width; this.height = _height; this.elem.className = "carousel"; // Object.assign(this.elem.style,{ // width:this.WIDTH+"rem", // height:this.HEIGHT+"rem", // position:"relative", // overflow:"hidden", // }); let arr = ["./carousel_img/left.png","./carousel_img/right.png"]; let _imgList = this.data.reduce((value,item)=>{ if(item.src) value.push(item.src); return value },arr); this.loadImg(_imgList,this.createCarousel); // window.addEventListener("resize",e=>this.resizeHandler(e)); } createCarousel(imgList){ Object.assign(this.elem.style,{ width:this.WIDTH+"rem", height:this.HEIGHT+"rem", position:"relative", overflow:"hidden", }); this.imgList = imgList; this.bnList = this.imgList.splice(0,2); imgList.forEach(item=>{ Object.assign(item.style,{ width:this.WIDTH+"rem", height:this.HEIGHT+"rem", }) }) this.createimgCon(); this.createDotList(); this.createBn(); // 动画一般在外面做,类里面只需要写状态更新即可。 // this.animation(); // 鼠标停留在轮播图上时不进行自动轮播。 this.elem.addEventListener("mouseenter",e=>this.mouseHandler(e)); this.elem.addEventListener("mouseleave",e=>this.mouseHandler(e)); } createimgCon(){ this.imgCon = document.createElement("div"); Object.assign(this.imgCon.style,{ width:this.WIDTH*2+"rem", height:this.HEIGHT+"rem", position:"absolute", }); let item = this.createItem(this.imgList[0],this.data[0]); this.imgCon.appendChild(item); this.elem.appendChild(this.imgCon); } createItem(img,obj){ let item = document.createElement("div"); Object.assign(item.style,{ width:this.WIDTH+"rem", height:this.HEIGHT+"rem", position:"relative", float:"left", }); let title = document.createElement("div"); Object.assign(title.style,{ position:"absolute", left:"15%", top:"0.3rem", fontSize:"0.3rem", color:"#ffffff", textShadow:"0.02rem 0.02rem 0.02rem #000000", width:"8rem", lineHeight:"0.5rem", }) let head1=document.createElement("div"); Object.assign(head1.style,{ height:"0.5rem", }) head1.textContent = obj.date; let span = document.createElement("span"); Object.assign(span.style,{ fontSize:"0.4rem", }); span.textContent = obj.day; let head2 = document.createElement("div"); Object.assign(head2.style,{ height:"0.5rem", }) head2.textContent = obj.title; head1.insertBefore(span,head1.firstChild); title.appendChild(head1); title.appendChild(head2); item.appendChild(title); item.appendChild(img); return item; } createDotList(){ this.dot = document.createElement("ul"); Object.assign(this.dot.style,{ listStyle:"none", margin:0, padding:0, position:"absolute", left:(this.WIDTH-1.8)/2+"rem", bottom:"0.3rem", }) for(let i=0;ithis.dotClickHandler(e)); this.elem.appendChild(this.dot); } createBn(){ for(let i=0;ithis.bnClickHandler(e)); this.elem.appendChild(this.bnList[i]); } } bnClickHandler(e){ if(this.bool) return if(e.target===this.bnList[0]){ this.direction="left"; this.pos++; if(this.pos>this.imgList.length-1) this.pos = 0; }else{ this.direction="right"; this.pos--; if(this.pos<0) this.pos=this.imgList.length-1; } this.bool=true; this.createNextItem(); } dotClickHandler(e){ if(e.target.constructor!==HTMLLIElement) return //这里因为是对父元素进行侦听,因此要先判断点击的是不是li,如果点击的不是小圆点就不能改变开关,直接return。不能先改变开关。 if(this.bool)return for(let i=0;i0){ this.imgCon.lastElementChild.remove(); this.x=0; this.bool=false; } } this.imgCon.style.left=this.x+"rem"; } autoPlay(){ if(!this.autoBool) return this.time--; //增加防抖 if(this.time===0){ let evt = new Event("click"); this.bnList[0].dispatchEvent(evt); this.time=200; } } resizeHandler(e){ document.documentElement.style.fontSize=document.documentElement.clientWidth/(this.WIDTH*100)*100+"px"; } appendTo(parent){ if(typeof parent==="string") parent = document.querySelector(parent); parent.appendChild(this.elem); if(!isNaN(this.WIDTH) && !isNaN(this.HEIGHT)) return if(parent===document.body){ this.WIDTH = 13.66; this.HEIGHT = 4.55; }else{ let rect = parent.getBoundingClientRect(); this.WIDTH=rect.width/100; this.HEIGHT=rect.height/100; } } mouseHandler(e){ if(e.type==="mouseenter"){ this.autoBool=false; }else{ this.autoBool=true; } } // 图片预加载 loadImg(_imgList,_callBack){ let img = new Image(); img.i=0; img.arr=[]; img.imgList=_imgList; // img.callBack=_callBack; img.src=_imgList[img.i]; img.addEventListener("load",e=>this.imgLoadFinishHandler(e)); } imgLoadFinishHandler(e){ // console.log(e.currentTarget); e.currentTarget.arr.push(e.currentTarget.cloneNode()); e.currentTarget.i++; if(e.currentTarget.i"JS如何实现轮播图"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
图片
动轮
大小
鼠标
切换
内容
动画
容器
按钮
方式
更多
状态
知识
阿里
更新
实用
狂野
无所不能
学有所成
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全事件形式
excel与数据库的叙述
kettle循环连接多个数据库
当代软件开发行业的痛点
网络安全我们应该怎么做
西安长信网络技术有限责任公司
劫后余生加入不了服务器
win7中管理服务器
带图的文献数据库
函数按天汇总数据库
临床资料数据库有哪些问题
河北软件开发服务费
流星网络安全专业
cstpcd是什么数据库
青岛云触网络技术 近邻
微软数据库access
魔法觉醒 服务器 人数
斩龙服务器
数据库d是什么型
全局DB数据库
网络安全与自身做起
小型数据库是database
西安长信网络技术有限责任公司
本地服务器安全策略
黑客客网络技术论坛
杭州鑫峰维网络技术有限公司
慈善网络技术
工业园区一站式网络技术市场价格
中国网络安全法 saas
软件开发设计招聘