js面向对象实现无缝轮播图
来源:互联网 发布:php增删改查代码 编辑:程序博客网 时间:2024/06/05 06:20
下面是实现代码:
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>面向对象轮播图</title> <style type="text/css"> *{ margin: 0; padding: 0; } #box{ position: relative; width: 500px; height: 350px; overflow: hidden; margin: 20px auto; } #list{ width: 2500px; position: absolute; left: 0; top: 0; } #list li{ list-style: none; float: left; } #list li img{ width: 500px; height: 350px; } #prev{ position: absolute; left: 0; top: 50%; color: #FFFFFF; background: rgba(0,0,0,0.6); } #next{ position: absolute; right: 0; top: 50%; color: #FFFFFF; background: rgba(0,0,0,0.6); } #box span{ cursor: pointer; } #point{ position: absolute; left: 50%; bottom: 10px; margin-left: -30px; } #point li{ list-style: none; float: left; margin-right: 10px; width: 10px; height: 10px; border-radius: 50%; border: 1px solid #FFFFFF; background: rgba(0,0,0,0.5); cursor: pointer; } #point li.active{ background: #FFFFFF; } </style> </head> <body> <div id="box"> <ul id="list"> <li><img src="img/10.jpg" alt="" /></li> <li><img src="img/03.jpg" alt="" /></li> <li><img src="img/04.jpg" alt="" /></li> <!--<li><img src="img/06.jpg" alt="" /></li> <li><img src="img/09.jpg" alt="" /></li>--> <li><img src="img/10.jpg" alt="" /></li> <li><img src="img/03.jpg" alt="" /></li> </ul> <ul id="point"> <li class="active"></li> <li></li> <li></li> <!--<li></li> <li></li>--> </ul> <span id="prev">上一张</span> <span id="next">下一张</span> </div> <script> window.onload = function(){ //new一个轮播图对象 var box = new Carousel('box'); box.init(); window.onblur = function(){ //页面失去焦点后停止自动播放,防止计时出现错误,造成错乱 clearInterval(box.timer2); } window.onfocus = function(){ //回到页面再重新运行代码 box.init(); } } //定义轮播图对象构造函数 function Carousel(id){ this.odiv = document.getElementById(id); this.oul1 = document.getElementById('list'); this.prev = document.getElementById('prev'); this.next = document.getElementById('next'); this.li1 = this.oul1.getElementsByTagName('li'); this.oul2 = document.getElementById('point'); this.li2 = this.oul2.getElementsByTagName('li'); this.width = this.li1[0].offsetWidth;//单张图宽度 this.imgs = this.li1.length;//图片个数 this.points = this.li2.length;//显示点数 this.num = 1;//当前图片下标 this.timer = null;//过渡效果定时器 this.timer2 = null;//自动播放定时器 this.stop = true;//判断过渡效果执行完的开关// this.speed = 10;//过渡效果运动速度 } //定义轮播图方法 Carousel.prototype.init = function(){ var _this = this; //鼠标移入清除定义自动播放定时 this.odiv.onmouseover = function(){ clearInterval(_this.timer2); } //鼠标移出重新启动自动播放定时 this.odiv.onmouseout = function(){ _this.timer2 = setInterval(function(){ _this.move(); },3000); } //阻止鼠标按下默认事件 this.odiv.onmousedown = function(ev){ var ev = ev || window.event; ev.preventDefault(); return false; } this.move(); //开始显示第一张 this.oul1.style.left = -this.width + 'px'; this.prev.onclick = function(){ _this.prevpage(_this);//需要传入一个参数,否则函数执行对象是window } this.next.onclick = function(){ _this.nextpage(_this);//名字不能是next()存在冲突,需要传入一个参数,否则函数执行对象是window } //导航按钮操作 for(var i=0;i<this.li2.length;i++){ this.li2[i].index = i; this.li2[i].onclick = function(){ _this.point(_this,this); } } //自动播放 this.timer2 = setInterval(function(){ _this.move(); },3000); } //前一张操作方法 Carousel.prototype.prevpage = function(obj){ if(this.stop){ this.stop = false; this.num--; for(var i=0;i<this.points;i++){ this.li2[i].className = ''; } if(this.num==0){ this.li2[2].className = 'active'; }else{ this.li2[this.num-1].className = 'active'; } this.timer = setInterval(function(){ obj.moveup();//不使用参数则是window在调用,而不是对象在调用 },30); } } //下一张操作方法 Carousel.prototype.nextpage = function(obj){ if(this.stop){ this.stop = false; this.num++; for(var i=0;i<this.points;i++){ this.li2[i].className = ''; } if(this.num==this.imgs-1){ this.li2[0].className = 'active'; }else{ this.li2[this.num-1].className = 'active'; } this.timer = setInterval(function(){ obj.movedown();//不使用参数则是window在调用,而不是对象在调用 },30); } } Carousel.prototype.moveup = function(){ if(this.oul1.offsetLeft != -this.width * this.num){ var speed = (-this.width*this.num-this.oul1.offsetLeft)/10; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); this.oul1.style.left = this.oul1.offsetLeft + speed + 'px'; }else{ clearInterval(this.timer); this.stop = true; //执行完这个动作后再判断变换 if(this.num==0){ this.num=this.imgs-2; this.oul1.style.left = -this.width * this.num + 'px'; } } } Carousel.prototype.movedown = function(){ if(this.oul1.offsetLeft != -this.width * this.num){//???? var speed = (-this.width*this.num-this.oul1.offsetLeft)/10; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); this.oul1.style.left = this.oul1.offsetLeft + speed + 'px'; }else{ clearInterval(this.timer); this.stop = true; //执行完后再进行变换判断 if(this.num==this.imgs-1){ this.num=1; this.oul1.style.left = -this.width + 'px'; } } } //导航点操作方法 Carousel.prototype.point = function(obj,pnt){ this.num = pnt.index+1; for(var i=0;i<this.li2.length;i++){ this.li2[i].className = ''; } this.li2[pnt.index].className = 'active'; this.timer = setInterval(function(){ obj.pointmove();//不使用参数则是window在调用,而不是对象在调用 //因此才需要把执行的部分代码移出去,否则需要每一个this都改写成obj },30); } Carousel.prototype.pointmove = function(){ if(this.oul1.offsetLeft != -this.width * this.num){ var speed = (-this.width*this.num-this.oul1.offsetLeft)/10; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); this.oul1.style.left = this.oul1.offsetLeft + speed + 'px'; }else{ clearInterval(this.timer); this.stop = true; } } Carousel.prototype.move = function(){ var _this = this; this.num++; for(var i=0;i<_this.points;i++){ this.li2[i].className = ''; } if(this.num==this.imgs-1){ this.li2[0].className = 'active'; }else{ this.li2[this.num-1].className = 'active'; } this.timer = setInterval(function(){ _this.movedown();//不使用_this会认为是window在调用,出错 },30);//这个执行时间要比外部的时间执行短,再外部时钟执行下一次之前要完成动作,否则会连续触发 } </script> </body></html>
整个书写过程是先写出面向过程的函数实现,再按着下面的步骤把它修改成面向对象。
/** 变形: * 1、尽量不会函数嵌套 * 2、可以有全局变量 * 3、把onload里面不是赋值的语句放到函数中 * *//* * 修改: * 1、onload中创建对象实例 * 2、全局变量换成属性 * 3、函数换成方法 * 4、修改this指向 * */
下面是面向过程的实现代码:
面向过程没有修改缓冲运动的速度值,给的是一个固定的,面向对象把这个固定的速度值修改为一个动态的速度值。
window.onload = function(){ var odiv = document.getElementById('box'); var oul1 = document.getElementById('list'); var prev = document.getElementById('prev'); var next = document.getElementById('next'); var li1 = oul1.getElementsByTagName('li'); var oul2 = document.getElementById('point'); var li2 = oul2.getElementsByTagName('li'); var num = 1; var timer = null; var timer2 = null; var stop = true; var speed = 10; odiv.onmouseover = function(){ clearInterval(timer2); } odiv.onmouseout = function(){ timer2 = setInterval(move,3000); } odiv.onmousedown = function(ev){ var ev = ev || window.event; ev.preventDefault(); return false; } move(); //开始显示第一张 oul1.style.left = -li1[0].offsetWidth + 'px'; prev.onclick = function(){ if(stop){ stop = false; num--; for(var i=0;i<li2.length;i++){ li2[i].className = ''; } if(num==0){ li2[2].className = 'active'; }else{ li2[num-1].className = 'active'; } timer = setInterval(function(){ if(oul1.offsetLeft != -li1[0].offsetWidth * num){ oul1.style.left = oul1.offsetLeft + speed + 'px'; }else{ clearInterval(timer); stop = true; //执行完这个动作后再判断变换 if(num==0){ num=3; oul1.style.left = -li1[0].offsetWidth * num + 'px'; } } },30); } } next.onclick = function(){ if(stop){ stop = false; num++; for(var i=0;i<li2.length;i++){ li2[i].className = ''; } if(num==4){ li2[0].className = 'active'; }else{ li2[num-1].className = 'active'; } timer = setInterval(function(){ if(oul1.offsetLeft != -li1[0].offsetWidth * num){ oul1.style.left = oul1.offsetLeft-speed + 'px'; }else{ clearInterval(timer); stop = true; //执行完后再进行变换判断 if(num==4){ num=1; oul1.style.left = -li1[0].offsetWidth + 'px'; } } },30); } } for(var i=0;i<li2.length;i++){ (function(j){ li2[i].onclick = function(){ if(num<(j+1)){ speed = -10; }else{ speed = 10; } num = j+1; for(var i=0;i<li2.length;i++){ li2[i].className = ''; } li2[j].className = 'active'; timer = setInterval(function(){ if(oul1.offsetLeft != -li1[0].offsetWidth * num){ oul1.style.left = oul1.offsetLeft+speed + 'px'; }else{ clearInterval(timer); stop = true; } },30); } })(i); } timer2 = setInterval(move,4000); function move(){ num++; for(var i=0;i<li2.length;i++){ li2[i].className = ''; } if(num==4){ li2[0].className = 'active'; }else{ li2[num-1].className = 'active'; } timer = setInterval(function(){ if(oul1.offsetLeft != -li1[0].offsetWidth * num){ oul1.style.left = oul1.offsetLeft-speed + 'px'; }else{ clearInterval(timer); stop = true; //执行完后再进行变换判断 if(num==4){ num=1; oul1.style.left = -li1[0].offsetWidth + 'px'; } } },30);//这个执行时间要比外部的时间执行短,再外部时钟执行下一次之前要完成动作,否则会连续触发 } window.onblur = function(){ clearInterval(timer2);// clearInterval(timer); } window.onfocus = function(){ timer2 = setInterval(move,3000); }}
阅读全文
0 0
- js面向对象实现无缝轮播图
- js面向对象---无缝轮播图(附面向过程代码)
- JS面向对象轮播图实现
- 纯js实现无缝轮播图
- 原生JS实现无缝轮播图
- js实现无缝滚动
- js实现无缝切换
- JS实现无缝滚动
- js实现无缝滚动
- js 实现面向对象编程
- js prototype 详解 js实现面向对象
- js 轮播图无缝连接
- js无缝轮播图
- 例子---JS无缝轮播图
- JS实现图片无缝滚动
- 通过js实现无缝滚动
- js实现无缝滚动效果
- js 实现图片无缝滚动
- S树(S-Trees, Uva 712)
- PAT(乙级)1014
- Google VR Views实战(VR全景图播放器)
- GreenDao使用说明(四)特殊的单表
- org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘__frch_item
- js面向对象实现无缝轮播图
- 编写Linux内核模块实现阶乘
- 【CSDN常见问题解答】使用JNA调用Windows动态库
- Android Gradle Plugin解析
- c语言中怎么实现字符串转化数字的功能
- 前端性能优化补充
- LeetCode 3. Longest Substring Without Repeating Characters
- hive启动异常Cannot create directory /usr/hive-2.1.1/tmp/root/ff3fc24a-fa0e-4b85-a938-eac74b50df52. Name
- 822D My pretty girl Noora