图片切换.so屌

  1 <!doctype html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Document</title>
  6 <style type="text/css">
  7 body,div,ul,li {
  8     margin: 0;
  9     padding: 0;
 10 }
 11 ul,li {
 12     list-style: none;
 13 }
 14 a img {
 15     border: none;
 16 }
 17 .wrap {
 18      100%;
 19     overflow: hidden;
 20     position: relative;
 21 }
 22 .wrap .prev,
 23 .wrap .next  {
 24     height: 320px;
 25     position: absolute;
 26     left: -50%;
 27     top: 0;
 28     background-color: #999;
 29     opacity: 0.7;
 30      100%;
 31 }
 32 .wrap .next {
 33     left: auto;
 34     right: -50%;
 35 }
 36 .wrap .prev:hover,
 37 .wrap .next:hover {
 38     opacity: 0.5;
 39 }
 40 .container {
 41      100%;
 42     height: 320px;
 43 }
 44 .container ul {
 45     height: 100%;
 46 }
 47 .container li {
 48      1000px;
 49     height: 100%;
 50     float: left;
 51 }
 52 .container li a,
 53 .container li img {
 54     display: block;
 55      100%;
 56     height: 100%;
 57 }
 58 .page {
 59     position: absolute;
 60     left: 50%;
 61     bottom: 10px;
 62     display:none;
 63 }
 64 .page span {
 65     float: left;
 66     margin-right: 10px;
 67      20px;
 68     height: 20px;
 69     display: block;
 70     cursor: pointer;
 71     background: #999;
 72     border-radius: 50%;
 73     text-align: center;
 74     color: #fff;
 75 }
 76 .page .select {
 77     background: #f00;
 78 }
 79 </style>
 80 </head>
 81 <body>
 82 <div class="wrap">
 83     <div class="container" id="container">
 84         <ul>
 85             <li><a href="1"><img src="http://www.hengqijy.com/uploadfile/2013/1031/20131031084228263.jpg"></a> </li>
 86             <li><a href="2"><img src="http://www.hengqijy.com/uploadfile/2014/0315/20140315023711196.jpg"></a></li>
 87             <li><a href="3"><img src="http://www.hengqijy.com/uploadfile/2014/0228/20140228091207797.jpg"></a></li>
 88             <li><a href="4"><img src="http://www.hengqijy.com/statics/images/new_img/ksss.jpg"></a></li>
 89         </ul>
 90     </div>
 91     <div class="prev" id="prev"></div>
 92     <div class="next" id="next"></div>
 93     <div id="page" class="page"></div>
 94 </div>
 95 <script type="text/javascript">
 96 /*
 97 * Slider constructor
 98 * @param {Node}  ele  容器节点
 99 * @param {Int} index 默认显示第几张
100 */
101 var Slider = function(ele, autoInterval){
102     autoInterval = parseInt(autoInterval, 10);
103     this.autoInterval = !isNaN(autoInterval) && Math.abs(autoInterval) ||  3000;
104     this.ele = ele;    
105     this.oList = ele.children[0];
106     this.items = this.oList.getElementsByTagName("li");
107     this.itemWidth = parseInt(this.items[0].offsetWidth, 10);
108     this.page = document.getElementById("page");
109     this.prevBtn = document.getElementById("prev");
110     this.nextBtn = document.getElementById("next");
111     this.init();
112 }
113 Slider.prototype = {
114     constructor: Slider,
115     init: function(){
116         this.oList.style.position = 'absolute';
117         this.oList.style.top = 0;
118         this.oList.style.left = 0;
119 
120         this.going = 0;
121         this.current = 1;
122         this.speed = 100;
123         this.timer = null;
124         this.inter = null;
125         this.lock = false;
126         this.wrapWidth = parseInt(this.ele.offsetWidth, 10);
127         this.pageCircles = null;
128 
129         this.prevBtn.style.marginLeft = -this.itemWidth/2 + 'px';
130         this.nextBtn.style.marginRight = -this.itemWidth/2 + 'px';
131 
132         if(this.items.length > 2) {
133             this.setUp();
134         } else {
135             this.oList.style.left = (this.wrapWidth - this.itemWidth * this.items.length)/2 + 'px';
136             this.prevBtn.style.display = "none";
137             this.nextBtn.style.display = "none";
138         }
139 
140         this.oList.style.width = this.itemWidth * this.items.length + 'px';
141 
142     },
143     setUp:function(){
144         var    first1 = this.items[0].cloneNode();
145             first1.innerHTML = this.items[0].innerHTML;
146 
147         var first2 = this.items[1].cloneNode();
148             first2.innerHTML = this.items[1].innerHTML;
149 
150         var last1 = this.items[this.items.length-1].cloneNode();
151             last1.innerHTML = this.items[this.items.length-1].innerHTML;
152 
153         var last2 = this.items[this.items.length-2].cloneNode();
154             last2.innerHTML = this.items[this.items.length-2].innerHTML;
155 
156         this.oList.appendChild(first1);
157         this.oList.appendChild(first2);
158         this.oList.insertBefore(last1, this.items[0]);
159         this.oList.insertBefore(last2, this.items[0]);
160 
161         this.buildPage();
162         this.bindEvent();
163         this.slientGoTo();
164         this.doAnimate();
165         this.autoSlider();
166     },
167     autoSlider:function(){
168         var that = this;
169         if(this.autoInterval > 0) {
170             this.inter = setInterval(function(){
171                 that.next();
172             }, this.autoInterval);
173         }
174     },
175     stopAutoSlider:function(){
176         clearInterval(this.inter);
177     },
178     buildPage:function(){
179         for(var i = 0,len = this.items.length - 4; i<len; i++) {
180             var circle = document.createElement('span');
181             circle.innerHTML = i + 1;
182             this.page.appendChild(circle);
183         }
184         this.pageCircles = this.page.getElementsByTagName('span');
185         this.addEvent(this.page, 'click', 'gotoIndex');
186         this.page.style.display = 'block';
187     },
188     bindEvent:function(){
189         this.addEvent(this.prevBtn, 'click', 'prev');
190         this.addEvent(this.nextBtn, 'click', 'next');
191         this.addEvent(this.ele, 'mouseover' , 'stopAutoSlider');
192         this.addEvent(this.ele, 'mouseout' , 'autoSlider');
193     },
194     addEvent:function(ele, type, fn, context) {
195         context = context || this;
196         var innerFun = function(event) {
197             var evt = event || window.event;
198             if(typeof fn === 'string'){
199                context[fn].call(context, this, evt);
200             } else {
201                 fn.call(context, this, evt);
202             }
203         }
204         if(window.addEventListener) {
205             ele.addEventListener(type, innerFun, false);
206         } else {
207             ele.attachEvent('on'+type, innerFun);
208         }
209     },
210     index:function(ele){
211         var parentNode = ele.parentNode;
212         var eles = parentNode.getElementsByTagName(ele.tagName);
213 
214         for(var i = 0, len = eles.length; i<len; i++){
215             if(eles[i] == ele) {
216                 return i;
217             }
218         }
219     },
220     hasClass: function(obj, cls) {
221         return !!obj.className && obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
222     },
223     addClass: function(obj, cls) {
224         if (!this.hasClass(obj, cls)) obj.className += " " + cls;
225     },
226     removeClass:function (obj, cls) {
227         if (this.hasClass(obj, cls)) {
228             var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
229             obj.className = obj.className.replace(reg, ' ');
230         }
231     },
232     gotoIndex:function(eleContext, evt){
233         var ele = evt.target || evt.srcElement;
234         var index = this.index(ele);
235         if(this.lock){return false;}
236         if(this.current === this.items.length-4 && index === 0) {
237             this.current = 0;
238             this.slientGoTo();
239         } else if(this.current === 1 && index ===this.items.length-5) {
240             this.current = this.items.length-3;
241             this.slientGoTo();
242         }
243         this.current = index + 1;
244         this.doAnimate();
245     },
246     prev:function(eleContext, evt){
247         if(this.lock){return false;}
248         this.current--;
249         this.doAnimate();
250     },
251     next:function(eleContext, evt){
252         if(this.lock){return false;}
253         this.current++;
254         this.doAnimate();
255     },
256     doAnimate:function(){
257         this.distance = (this.wrapWidth-this.itemWidth*(2*this.current + 3))/2 - parseInt(this.oList.style.left, 10);
258         if(this.distance < 0){
259             this.speed = -Math.abs(this.speed);
260         } else {
261             this.speed = Math.abs(this.speed);
262         }
263         this.distance = Math.abs(this.distance);
264         this.lock = true;
265         this.animate();
266     },
267     animate:function(){
268         var that = this;
269         this.timer = setTimeout(function() {
270             var left = parseInt(that.oList.style.left, 10) || 0;
271 
272             if (that.going+Math.abs(that.speed) >= that.distance) {
273                 if (that.speed > 0) {
274                     that.oList.style.left = left + that.distance - that.going + 'px';
275                 } else {
276                     that.oList.style.left = left - that.distance + that.going + 'px';
277                 }
278                 clearTimeout(that.timer);
279                 that.going = 0;
280                 that.onceEnd();
281             } else {
282                 that.going += Math.abs(that.speed);
283                 that.oList.style.left = left + that.speed + 'px';
284                 that.animate();
285             }
286         }, 25);
287 
288     },
289     slientGoTo:function(){
290         this.oList.style.left = (this.wrapWidth-this.itemWidth*(2*this.current + 3))/2 + 'px';
291     },
292     setCircleSelect:function(){
293         for(var i=0,len = this.pageCircles.length; i<len; i++) {
294             var ele= this.pageCircles[i];
295             if(this.hasClass(ele, 'select')) {
296                 this.removeClass(ele, 'select');
297             }
298         }
299         this.addClass(this.pageCircles[this.current-1], 'select');
300     },
301     correctCurrent:function(){
302         if(this.current === 0) {
303             this.current = this.items.length - 4;
304         } else if(this.current === this.items.length - 3) {
305             this.current = 1;
306         } else {
307             return false;
308         }
309         this.slientGoTo();
310     },
311     onceEnd:function(){
312         this.lock = false;
313         this.correctCurrent();
314         this.setCircleSelect();
315     }
316 }
317 var con = document.getElementById("container");
318 var s = new Slider(con, 4000);
319 </script>
320 </body>
321 </html>

  1 /*
  2 *2
  3 */
  4 <!doctype html>
  5 <html lang="en">
  6 <head>
  7     <meta charset="UTF-8">
  8     <title>Document</title>
  9 <style type="text/css">
 10 body,div,ul,li {
 11     margin: 0;
 12     padding: 0;
 13 }
 14 ul,li {
 15     list-style: none;
 16 }
 17 a img {
 18     border: none;
 19 }
 20 .wrap {
 21      100%;
 22     overflow: hidden;
 23     position: relative;
 24 }
 25 .wrap .prev,
 26 .wrap .next  {
 27     height: 320px;
 28     position: absolute;
 29     left: -50%;
 30     top: 0;
 31     background-color: #999;
 32     opacity: 0.7;
 33      100%;
 34 }
 35 .wrap .next {
 36     left: auto;
 37     right: -50%;
 38 }
 39 .wrap .prev:hover,
 40 .wrap .next:hover {
 41     opacity: 0.5;
 42 }
 43 .container {
 44      100%;
 45     height: 320px;
 46 }
 47 .container ul {
 48     height: 100%;
 49 }
 50 .container li {
 51      1000px;
 52     height: 100%;
 53     float: left;
 54 }
 55 .container li a,
 56 .container li img {
 57     display: block;
 58      100%;
 59     height: 100%;
 60 }
 61 .page {
 62     position: absolute;
 63     left: 50%;
 64     bottom: 10px;
 65     display:none;
 66 }
 67 .page span {
 68     float: left;
 69     margin-right: 10px;
 70      20px;
 71     height: 20px;
 72     display: block;
 73     cursor: pointer;
 74     background: #999;
 75     border-radius: 50%;
 76     text-align: center;
 77     color: #fff;
 78 }
 79 .page .select {
 80     background: #f00;
 81 }
 82 </style>
 83 </head>
 84 <body>
 85 <div class="wrap">
 86     <div class="container" id="container">
 87         <ul>
 88             <li><a href="1"><img src="http://www.hengqijy.com/uploadfile/2013/1031/20131031084228263.jpg"></a> </li>
 89             <li><a href="2"><img src="http://www.hengqijy.com/uploadfile/2014/0315/20140315023711196.jpg"></a></li>
 90             <li><a href="3"><img src="http://www.hengqijy.com/uploadfile/2014/0228/20140228091207797.jpg"></a></li>
 91             <li><a href="4"><img src="http://www.hengqijy.com/statics/images/new_img/ksss.jpg"></a></li>
 92         </ul>
 93     </div>
 94     <div class="prev" id="prev"></div>
 95     <div class="next" id="next"></div>
 96     <div id="page" class="page"></div>
 97 </div>
 98 <script type="text/javascript">
 99 /*
100 * Slider constructor
101 * @param {Node}  ele  容器节点
102 * @param {Int} index 默认显示第几张
103 */
104 var Slider = function(ele, autoInterval){
105     autoInterval = parseInt(autoInterval, 10);
106     this.autoInterval = !isNaN(autoInterval) && Math.abs(autoInterval) ||  3000;
107     this.ele = ele;    
108     this.oList = ele.children[0];
109     this.items = this.oList.getElementsByTagName("li");
110     this.itemWidth = parseInt(this.items[0].offsetWidth, 10);
111     this.page = document.getElementById("page");
112     this.prevBtn = document.getElementById("prev");
113     this.nextBtn = document.getElementById("next");
114     this.init();
115 }
116 Slider.prototype = {
117     constructor: Slider,
118     init: function(){
119         this.oList.style.position = 'absolute';
120         this.oList.style.top = 0;
121         this.oList.style.left = 0;
122 
123         this.going = 0;
124         this.current = 1;
125         this.speed = 100;
126         this.timer = null;
127         this.inter = null;
128         this.lock = false;
129         this.wrapWidth = parseInt(this.ele.offsetWidth, 10);
130         this.pageCircles = null;
131 
132         this.prevBtn.style.marginLeft = -this.itemWidth/2 + 'px';
133         this.nextBtn.style.marginRight = -this.itemWidth/2 + 'px';
134 
135         if(this.items.length > 2) {
136             this.setUp();
137         } else {
138             this.oList.style.left = (this.wrapWidth - this.itemWidth * this.items.length)/2 + 'px';
139             this.prevBtn.style.display = "none";
140             this.nextBtn.style.display = "none";
141         }
142 
143         this.oList.style.width = this.itemWidth * this.items.length + 'px';
144 
145     },
146     setUp:function(){
147         var    first1 = this.items[0].cloneNode();
148             first1.innerHTML = this.items[0].innerHTML;
149 
150         var first2 = this.items[1].cloneNode();
151             first2.innerHTML = this.items[1].innerHTML;
152 
153         var last1 = this.items[this.items.length-1].cloneNode();
154             last1.innerHTML = this.items[this.items.length-1].innerHTML;
155 
156         var last2 = this.items[this.items.length-2].cloneNode();
157             last2.innerHTML = this.items[this.items.length-2].innerHTML;
158 
159         this.oList.appendChild(first1);
160         this.oList.appendChild(first2);
161         this.oList.insertBefore(last1, this.items[0]);
162         this.oList.insertBefore(last2, this.items[0]);
163 
164         this.buildPage();
165         this.bindEvent();
166         this.slientGoTo();
167         this.doAnimate();
168         this.autoSlider();
169     },
170     autoSlider:function(){
171         var that = this;
172         if(this.autoInterval > 0) {
173             this.inter = setInterval(function(){
174                 that.next();
175             }, this.autoInterval);
176         }
177     },
178     stopAutoSlider:function(){
179         clearInterval(this.inter);
180     },
181     buildPage:function(){
182         for(var i = 0,len = this.items.length - 4; i<len; i++) {
183             var circle = document.createElement('span');
184             circle.innerHTML = i + 1;
185             this.page.appendChild(circle);
186         }
187         this.pageCircles = this.page.getElementsByTagName('span');
188         this.addEvent(this.page, 'click', 'gotoIndex');
189         this.page.style.display = 'block';
190     },
191     bindEvent:function(){
192         this.addEvent(this.prevBtn, 'click', 'prev');
193         this.addEvent(this.nextBtn, 'click', 'next');
194         this.addEvent(this.ele, 'mouseover' , 'stopAutoSlider');
195         this.addEvent(this.ele, 'mouseout' , 'autoSlider');
196     },
197     addEvent:function(ele, type, fn, context) {
198         context = context || this;
199         var innerFun = function(event) {
200             var evt = event || window.event;
201             if(typeof fn === 'string'){
202                context[fn].call(context, this, evt);
203             } else {
204                 fn.call(context, this, evt);
205             }
206         }
207         if(window.addEventListener) {
208             ele.addEventListener(type, innerFun, false);
209         } else {
210             ele.attachEvent('on'+type, innerFun);
211         }
212     },
213     index:function(ele){
214         var parentNode = ele.parentNode;
215         var eles = parentNode.getElementsByTagName(ele.tagName);
216 
217         for(var i = 0, len = eles.length; i<len; i++){
218             if(eles[i] == ele) {
219                 return i;
220             }
221         }
222     },
223     hasClass: function(obj, cls) {
224         return !!obj.className && obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
225     },
226     addClass: function(obj, cls) {
227         if (!this.hasClass(obj, cls)) obj.className += " " + cls;
228     },
229     removeClass:function (obj, cls) {
230         if (this.hasClass(obj, cls)) {
231             var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
232             obj.className = obj.className.replace(reg, ' ');
233         }
234     },
235     gotoIndex:function(eleContext, evt){
236         var ele = evt.target || evt.srcElement;
237         var index = this.index(ele);
238         if(this.current === this.items.length-4 && index === 0) {
239             if(this.setCurrent(0)){
240                 this.slientGoTo();
241             }
242         } else if(this.current === 1 && index ===this.items.length-5) {
243             if(this.setCurrent(this.items.length-3)){
244                 this.slientGoTo();
245             } 
246         }
247         if(this.setCurrent(index + 1)){
248             this.doAnimate();
249         }
250     },
251     prev:function(eleContext, evt){
252         if(this.setCurrent(this.current-1)){
253             this.doAnimate();
254         }
255     },
256     next:function(eleContext, evt){
257         if(this.setCurrent(this.current+1)){
258             this.doAnimate();
259         }
260     },
261     doAnimate:function(){
262         this.distance = (this.wrapWidth-this.itemWidth*(2*this.current + 3))/2 - parseInt(this.oList.style.left, 10);
263         if(this.distance < 0){
264             this.speed = -Math.abs(this.speed);
265         } else {
266             this.speed = Math.abs(this.speed);
267         }
268         this.distance = Math.abs(this.distance);
269         this.lock = true;
270         this.animate();
271     },
272     setCurrent:function(index){
273         if(this.lock){return false;}
274         this.current = index;
275         return true;
276     },
277     animate:function(){
278         var that = this;
279         this.timer = setTimeout(function() {
280             var left = parseInt(that.oList.style.left, 10) || 0;
281 
282             if (that.going+Math.abs(that.speed) >= that.distance) {
283                 if (that.speed > 0) {
284                     that.oList.style.left = left + that.distance - that.going + 'px';
285                 } else {
286                     that.oList.style.left = left - that.distance + that.going + 'px';
287                 }
288                 clearTimeout(that.timer);
289                 that.going = 0;
290                 that.onceEnd();
291             } else {
292                 that.going += Math.abs(that.speed);
293                 that.oList.style.left = left + that.speed + 'px';
294                 that.animate();
295             }
296         }, 25);
297 
298     },
299     slientGoTo:function(){
300         this.oList.style.left = (this.wrapWidth-this.itemWidth*(2*this.current + 3))/2 + 'px';
301     },
302     setCircleSelect:function(){
303         for(var i=0,len = this.pageCircles.length; i<len; i++) {
304             var ele= this.pageCircles[i];
305             if(this.hasClass(ele, 'select')) {
306                 this.removeClass(ele, 'select');
307             }
308         }
309         this.addClass(this.pageCircles[this.current-1], 'select');
310     },
311     correctCurrent:function(){
312         if(this.current === 0) {
313             this.current = this.items.length - 4;
314         } else if(this.current === this.items.length - 3) {
315             this.current = 1;
316         } else {
317             return false;
318         }
319         this.slientGoTo();
320     },
321     onceEnd:function(){
322         this.correctCurrent();
323         this.setCircleSelect();
324         this.lock = false;
325     }
326 }
327 var con = document.getElementById("container");
328 var s = new Slider(con);
329 </script>
330 </body>
331 </html>

  • 不待续...
原文地址:https://www.cnblogs.com/xy404/p/3629794.html