js实现可配置参数的轮播图

一个轮播图做了一天多,期间各种小错误层出不穷,为自己的功力感到压力好大,却也在这艰难挣扎中体会了不少知识点,更加求知若渴。

get到的点:js来添加、修改、去除css样式

       对setTimeout 或setInterval 函数队列里事件的清除

  1 var show = document.getElementById("show");
  2 var pic = show.getElementsByTagName(‘img‘);
  3 var timer;
  4 var start_index;
  5 var listli = [], lista = [], i;
  6 addEvent(window, "load", function(){
  7     //主调用
  8     roundShow(1, 1, 2000);
  9     //设置轮播参数,direction == 1 为正向,isloop == 1 为循环;
 10     function roundShow(direction, isloop, interval){
 11         //添加id与style.left并初始化;
 12         (function(){
 13             for(var k=0; k<pic.length; k++){
 14                 pic[k].setAttribute("id", "pic"+k);
 15                 pic[k].setAttribute("style", "left:"+800+"px; background-color:");
 16             }
 17         })();
 18
 19         //生成对应图片的小点
 20         (function createPointer(){
 21             var list = document.createElement("ul");
 22             list.setAttribute("id", "round_list");
 23             document.getElementById("show").appendChild(list);
 24             for(var i=0; i<pic.length; i++){
 25                 listli[i] = document.createElement("li");
 26                 list.appendChild(listli[i]);
 27                 lista[i] = document.createElement("a");
 28                 lista[i].setAttribute("id", "point"+i);
 29                 listli[i].appendChild(lista[i]);
 30             }
 31             //添加样式
 32             var style = document.createElement("style");
 33             style.type = "text/css";
 34             var text = "#round_list{position: absolute;bottom: 5px;right: 10px;}#round_list li{display: inline-block;} #round_list a{width: 10px;height: 10px;display: inline-block;border: 1px solid white;border-radius: 100%;margin-left:5px;}";
 35             try{
 36                 style.appendChild(document.createTextNode(text));
 37             }
 38             catch(ex){
 39                 style.styleSheet.cssText = text;
 40             }
 41             var head = document.getElementsByTagName("head");
 42             head[0].appendChild(style);
 43
 44             //添加鼠标滑过小点时的动作
 45             for(i=0; i<pic.length; i++){
 46                 lista[i].onmouseover = function(){
 47                     clearInterval(timer);
 48                     //把清除movement时截停的图片挪一边去
 49                     for(var j=0; j<pic.length; j++){
 50                         pic[j].style.left = 800+"px";
 51                     }
 52                     //再把当前的挪过来
 53                     pic[start_index].style.left = 0;
 54                     //确定图片滑动方向
 55                     var toindex = lista.indexOf(this);
 56                     if(toindex > start_index){
 57                         pic[toindex].style.left = 800+"px";
 58                         movePic("pic"+start_index, "pic"+toindex, 1);
 59                     }
 60                     if(toindex < start_index){
 61                         pic[toindex].style.left = -800+"px";
 62                         movePic("pic"+start_index, "pic"+lista.indexOf(this), 0);
 63                     }
 64                     start_index = lista.indexOf(this);
 65                 }
 66                 lista[i].onmouseout = function(){
 67                     clearInterval(timer);
 68                     timer = setInterval("roundPic("+direction+", "+isloop+")", interval);
 69                 }
 70             }
 71         })();
 72         //按配置参数进行初始化
 73         if(direction){
 74             start_index = 0;
 75         }
 76         else{
 77             start_index = pic.length-1;
 78         }
 79         pic[start_index].style.left = 0;
 80         lista[start_index].setAttribute("style", "background-color:white;");//首图片小点点亮
 81         timer = setInterval("roundPic("+direction+", "+isloop+")", interval);
 82     }
 83 });
 84
 85 //图片滑动动画
 86 function movePic(nowid, nextid, direction){
 87     //开始移动,将当前的小圆点灭掉
 88     //lista[parseInt(nowid.replace(/[^0-9]+/g, ""))].setAttribute("style","");
 89     lista[parseInt(nowid.replace(/[^0-9]+/g, ""))].style.backgroundColor = "";
 90 console.log(lista[parseInt(nowid.replace(/[^0-9]+/g, ""))].style);
 91     now = document.getElementById(nowid+"");
 92     next = document.getElementById(nextid+"");
 93     //为防止频繁快速调用(如鼠标很快的移动)造成的拉扯,所以每次都将积累在setTimeout队列中的事件清除;
 94     if(pic.movement){
 95         clearTimeout(pic.movement);
 96     }
 97     var nowleft = parseInt(now.style.left);
 98     var nextleft = parseInt(next.style.left);
 99     var dist = 0;
100     if(direction){
101         var nowtoleft = -800;
102     }
103     else{
104         var nowtoleft = 800;
105     }
106     if(nowleft == nowtoleft){
107         //移动完成,将新的小圆点点亮
108         //lista[parseInt(nextid.replace(/[^0-9]+/g, ""))].setAttribute("style", "background-color:white");
109         lista[parseInt(nextid.replace(/[^0-9]+/g, ""))].style.backgroundColor = "white";
110         return true;
111     }
112     else if(nowleft > nowtoleft){
113         dist = Math.ceil((nowleft - nowtoleft)/20);//变速运动
114         nowleft -= dist;
115         nextleft -= dist;
116     }
117     else{
118         dist = Math.ceil((nowtoleft - nowleft)/20);//变速运动
119         nowleft += dist;
120         nextleft += dist;
121     }
122     now.style.left = nowleft+‘px‘;
123     next.style.left = nextleft+‘px‘;
124     var repeat = "movePic(‘"+nowid+"‘,‘"+nextid+"‘,"+direction+")";
125     //movement设置成全局变量会造成上面开始那里“没有设置就清除”的错误;若设置成局部变量,
126     //则局部变量在clearTimeout函数的上下文里不存在,使其不能正常工作;
127     //所以设置成一个变量的属性;
128     pic.movement = this.setTimeout(repeat, 1);
129 }
130
131 //按设置顺序轮播图片
132 function roundPic(direction, isloop){
133     //debug:如果在不循环且当前为最末index的情况下调用roundPic();
134     if(!isloop && (direction && start_index == pic.length-1) || (!direction && start_index == 0)){
135         pic[start_index].style.left = 0;
136         clearInterval(timer);
137         return;
138     }
139     if(direction){
140         if(isloop){
141             if(start_index == pic.length){
142                 start_index = 0;
143             }
144             nextid = "pic"+(start_index+1);
145             if(start_index == pic.length-1){
146                 nextid = "pic"+0;
147             }
148         }
149         if(!isloop){
150             if(start_index < pic.length-1){
151                 nextid = "pic"+(start_index+1);
152             }
153             if(start_index == pic.length-2){
154                 clearInterval(timer);
155             }
156         }
157         startid = "pic"+start_index;
158         document.getElementById(startid).style.left = 0;
159         document.getElementById(nextid).style.left = 800+"px";
160         movePic(startid, nextid, direction);
161         start_index++;
162     }
163     else{
164
165         if(isloop){
166             if(start_index == -1){
167                 start_index = pic.length-1;
168             }
169             nextid = "pic"+(start_index-1);
170             if(start_index == 0){
171                 nextid = "pic"+(pic.length-1);
172             }
173         }
174         if(!isloop){
175             if(start_index > 0){
176                 nextid = "pic"+(start_index-1);
177             }
178             if(start_index == 1){
179                 clearInterval(timer);
180             }
181         }
182         startid = "pic"+start_index;
183         document.getElementById(startid).style.left = 0;
184         document.getElementById(nextid).style.left = -800+"px";
185         movePic(startid, nextid, direction);
186         start_index--;
187     }
188 }

addEvent是已经自己封装过的函数。

 1 // 给一个element绑定一个针对event事件的响应,响应函数为listener
 2 function addEvent(element, event, listener) {
 3     if(element.addEventListener){
 4         element.addEventListener(event, listener, false)
 5     }
 6     else if(element.attachEvent){
 7         element.attachEvent(‘on‘+event, listener)
 8     }
 9     else{
10         element[‘on‘+event] = listener;
11     }
12 }
时间: 2024-12-11 16:08:51

js实现可配置参数的轮播图的相关文章

告别组件之教你使用原生js和css写移动端轮播图

在工作中由于项目需要要写一个轮播图,本想使用组件直接调用实现快速开发,但是一想到自己经常使用组件但是让自己手写的话确实一点都不会. 一个不会手写组件的前端程序员不是一个好程序员!于是打算自己手写一个. 老规矩,首先看一下最终效果,这个最终可以实现定时自动播放,触摸滑动,手动修改下面横条效果等功能. 项目中使用到的HTML代码如下 <div class="banner"> <ul class="clearfix"> <li><

未学习JS也可以通过bootstrap做出轮播图的实际应用

由于本人新手 还没学JS 我是用bootstrap来做的 很简单 直接把那坨代码复制到 webstorm里面 下面我会用我的某一次作业 来做实际解释里面的某部分各代表什么意思 (由于这个代码到底什么意思 老师没有教过 我自行理解 有错的地方 望海涵)“男友秋装上新”这个地方 就是个轮播 一共3个小点 也就是三张图 可通过左右的箭头 左右翻动 接下来 奉上源代码:并在代码后给各部分做出解释 <div class="col-md-9 lunbo"> <div id=&qu

每天一个JS 小demo之韩雪冬轮播图。主要知识点:html,css布局,对于数组和对象的理解和运用

1 @charset "utf-8"; 2 /* CSS Document */ 3 4 * { padding: 0; margin: 0; } 5 li { list-style: none; } 6 img { border: none; } 7 body { background: #ececec; padding-top: 50px; } 8 9 #automatic { width: 970px; height: 344px; position: relative; mar

用 js封装以左右滑动的轮播图,调用任意

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title></title> <style> .tab{ width: 500px; height: 300px; margin: 0 auto; background: yellow; position: relative; overflow: hidden; } *{ margin: 0; pad

JS纯生实现无缝滚动轮播图

1.定时器加上以后需要进入一次才能引用,所以在上面提前调用一次定时器: 2.当在实现下标小按钮的时候一定要给第三部的num赋值: 3.切记谁做动画谁加定位

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

JQ全屏居中轮播图代码

<style> .clearfloat:after{ display: block; clear: both; content: ""; visibility: hidden; height: 0; } .clearfloat{ zoom: 1; } /*轮播图*/ .banners { position: relative; width: 100%;height:542px} .banner-img { position: relative; float: left; w

封装一个简单的原生js焦点轮播图插件

轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放.本篇文章的主要目的是分享封装插件的思路. 轮播图的我一开始是写成非插件形式实现的效果,后来才改成了封装成插件的形式. 首先要明白轮播图的实现原理和基本布局,大概就是外面有一个容器包裹着(通常是div),容器设置宽高,以及overflow为hidden,超出宽高部分隐藏, 容器里面又包含着另一个容器,包裹着所有的图片,宽为所有图片的总宽度,ul的position为absolute,通过改变ul的left

JS图片自动和可控的轮播切换特效

详细内容请点击 点击这里查看效果: http://hovertree.com/texiao/js/1.htm HTML文件代码如下:  <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"/> <title>JS图片自动和可控的轮播切换特效 - 何问起 HoverTree</ti