这篇博文主要讲如何使用原生js来实现一个兼容 IE9+ 的无缝轮播图。主要知识点如下:
- 面向对象
- js优化之节流函数
- js运动
效果
html结构
<div class="sliders-wraper" id="rotation-1"> <ul class="sliders clear"> <li class="slider" style="background:purple">5</li> <li class="slider" style="background:pink">1</li> <li class="slider" style="background:beige">2</li> <li class="slider" style="background:gold">3</li> <li class="slider" style="background:skyblue">4</li> <li class="slider" style="background:purple">5</li> <li class="slider" style="background:pink">1</li> </ul> <div class="pagenation"> <div class="page page-active"><a></a></div> <div class="page"><a></a></div> <div class="page"><a></a></div> <div class="page"><a></a></div> <div class="page"><a></a></div> </div> <span class='prev rotation-btn'><</span> <span class='next rotation-btn'</span> </div>
css样式
*{margin: 0;padding: 0;box-sizing: border-box;} .clear{zoom: 0;} .clear:after{content: '';display: block;overflow: hidden;clear: both;widows: 0;height: 0;} .sliders-wraper{width: 100%;height: 400px;line-height: 400px; overflow: hidden;position: relative;text-align: center;} .sliders{position: absolute;list-style: none;font-size: 50px;} .slider{float: left;} .rotation-btn{position: absolute;top: 50%;width: 50px;height: 50px; line-height: 50px;margin-top: -25px;font-size: 30px;color: #ccc;cursor: pointer;} .prev{left:0;} .next{right:0;} .pagenation{position: absolute;bottom: 10px;width: 100%;height: 25px;line-height: 25px;} .pagenation .page{width: 40px;height: 25px;display: inline-block;cursor: pointer;} .pagenation .page a{display: block;width: 30px;height: 5px;border: 1px solid #ccc; border-radius: 5px;background: transparent;margin: 10px auto;} .pagenation .page-active a{border-color: #0076ff;background-color: #0076ff;}
js
;(function(doc, win){ function Rotation(obj){ this.wraper = doc.getElementById(obj.el) //窗口 this.sliders = this.wraper.getElementsByClassName('sliders')[0] //图片父盒子 this.slideList = this.sliders.getElementsByClassName('slider') //所有图片 this.length = this.slideList.length this.index = 1 //当前显示的图片的索引 this.timer = null //单张图片运动定时器 this.animation = null //自动轮播定时器 // 在obj中可以自定义的参数 this.mode = 'easy-in-out'//动画曲线,可选 'linear' this.step = 5 //匀速运动滚动步长 this.delay = 2500 //轮播间隔 this.duration = 40 //单张图片动画时长 this.auto = true //是否开启自动轮播 this.btn = false //是否有左右按钮 this.focusBtn = true //是否支持焦点事件 for(var k in obj) this[k] = obj[k] if(this.btn){ this.prev = this.wraper.getElementsByClassName('prev')[0] this.next = this.wraper.getElementsByClassName('next')[0] } if(this.focusBtn){ this.pagenation = this.wraper.getElementsByClassName('pagenation')[0] this.pageList = this.pagenation.getElementsByClassName('page') this.activePage = 0 //当前的焦点的索引 } this.init() } var D = Rotation.prototype /* * func init * 初始化函数 * @para 0 */ D.init = function(){ this.width = this.wraper.clientWidth if(this.mode == 'linear') this.duration = 1 for(var i=0; i<this.length; i++) this.slideList[i].style.width = this.width + 'px' this.sliders.style.width = this.width * this.length + 'px' this.sliders.style.marginLeft = -this.width + "px"; this.handler() this.auto && this.autoPlay() } D.getStyle = function(obj, attr){ return obj.currentStyle"px"; } this.toggleClass(); } /* * func toggleClass * 改变数字焦点样式,轮播动画核心函数调用 * @para 0 */ D.toggleClass = function(){ if(this.focusBtn){ this.pageList[this.activePage].className = "page"; this.pageList[this.index-1].className = "page page-active"; this.activePage = this.index-1; } this.slide(-this.index * this.width); } /* * func slide * 图片滚动函数,核心函数 * @param ins 滚动终点 */ D.slide = function(ins){ var _th = this // 防止动画过度过程中计算错误 if(_th.timer) clearInterval(_th.timer); _th.timer = setInterval(move,_th.duration); function move(){ var currentPosition = parseFloat(_th.sliders.style.marginLeft); // 根据起始点和目标位置的比较确定向哪个方向移动 var n = ins-currentPosition<0"px"; clearInterval(_th.timer); }else{ // 变速运动关键,注释变为匀速运动 if(_th.mode == 'easy-in-out') _th.step = Math.abs(ins-currentPosition)/5 _th.sliders.style.marginLeft = currentPosition + n*_th.step + "px"; } } } /* * func autoPlay * 自动轮播函数 * @para 0 */ D.autoPlay = function(){ var _th = this clearInterval(_th.animation) _th.animation = setInterval(function(){ _th.turnRight(); },_th.delay) } /* * func debounce * 节流函数 * @para fn<要执行的函数> delay<节流时间> * @value func */ D.debounce = function(fn,delay){ var timer = null return function(){ if(timer){ clearTimeout(timer) } timer = setTimeout(fn,delay) } } /* * func refresh * 自动刷新函数,这里采用节流是防止刷新操作太过于频繁导致性能下降 * @para 0 */ D.refresh = function(){ var _th = this this.debounce(function(){ _th.init() _th.toggleClass() },100)() } /* * func rotation * 实例化函数 * @para obj 实例化的具体参数 * @value 返回具体实例 */ win.rotation = function(obj){ return new Rotation(obj) } })(document, window)
调用方式
var r2 = rotation({ el: 'rotation-1', mode: 'easy-in-out', //运动曲线 auto: true,//开启自动轮播 btn: true, //左右按钮 focusBtn: false//焦点 }) window.onresize = function(){ r2 && r2.refresh() }
精彩专题分享:jQuery图片轮播 JavaScript图片轮播 Bootstrap图片轮播
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年11月14日
2024年11月14日
- 刘德华《劲歌集》24K金碟港版[WAV+CUE][1.2G]
- Faker五冠王什么意思 世界赛五冠王Faker选手介绍
- faker塞拉斯s14决赛什么出装 faker塞拉斯s14决赛出装介绍
- LOLtoc9魔法口令在哪可以找到 2024云顶之弈toc观赛魔法口令兑换码
- 黑鸭子2008《影视经典·珍藏版》试音碟[WAV+CUE]
- 碧娜《温柔吻语2》[WAV+CUE]
- Stravinsky-Symphonies,Volume1-OrquestaSinfonicadeGalicia,DimaSlobodeniouk(2024)[24-
- 外媒评Switch2:向下兼容是关键 但挑战依然存在
- 任天堂提醒:宠物的尿或唾液或会让NS故障 把它放好!
- 《博德3》再创新高 Steam掌机总游玩时长近2000年
- 张玮伽《想你的夜DSD》东升 [WAV+CUE][1G]
- 姚璎格《 粤 24KGOLD》正版低速原抓[WAV+CUE][1G]
- 杨千嬅《如果大家都拥有海》寰亚 [WAV+CUE][998M]
- 孟庭苇.1994-1990-1994钻石精选集2CD(2022环球XRCD限量版)【上华】【WAV+CUE】
- 群星.1998-华纳好情歌精选17首【华纳】【WAV+CUE】