原生js写的一个简单slider

  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     width: 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     width: 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     width: 100%;
 42     height: 320px;
 43 }
 44 .container ul {
 45     height: 100%;
 46 }
 47 .container li {
 48     width: 1000px;
 49     height: 100%;
 50     float: left;
 51 }
 52 .container li a,
 53 .container li img {
 54     display: block;
 55     width: 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     width: 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){
102     this.ele = ele;
103     this.oList = ele.children[0];
104     this.items = this.oList.getElementsByTagName("li");
105     this.itemWidth = parseInt(this.items[0].offsetWidth, 10);
106     this.page = document.getElementById("page");
107     this.prevBtn = document.getElementById("prev");
108     this.nextBtn = document.getElementById("next");
109     this.init();
110 }
111 Slider.prototype = {
112     constructor: Slider,
113     init: function(){
114         this.oList.style.position = 'absolute';
115         this.oList.style.top = 0;
116         this.oList.style.left = 0;
117 
118         this.going = 0;
119         this.current = 1;
120         this.speed = 100;
121         this.timer = null;
122         this.wrapWidth = parseInt(this.ele.offsetWidth, 10);
123         this.pageCircles = null;
124 
125         this.prevBtn.style.marginLeft = -this.itemWidth/2 + 'px';
126         this.nextBtn.style.marginRight = -this.itemWidth/2 + 'px';
127 
128         if(this.items.length > 2) {
129             this.setUp();
130         } else {
131             this.oList.style.left = (this.wrapWidth - this.itemWidth * this.items.length)/2 + 'px';
132             this.prevBtn.style.display = "none";
133             this.nextBtn.style.display = "none";
134         }
135 
136         this.oList.style.width = this.itemWidth * this.items.length + 'px';
137 
138     },
139     setUp:function(){
140         var first1 = this.items[0].cloneNode();
141             first1.innerHTML = this.items[0].innerHTML;
142 
143             first2 = this.items[1].cloneNode();
144             first2.innerHTML = this.items[1].innerHTML;
145 
146             last1 = this.items[this.items.length-1].cloneNode();
147             last1.innerHTML = this.items[this.items.length-1].innerHTML;
148 
149             last2 = this.items[this.items.length-2].cloneNode();
150             last2.innerHTML = this.items[this.items.length-2].innerHTML;
151 
152         this.oList.appendChild(first1);
153         this.oList.appendChild(first2);
154         this.oList.insertBefore(last1, this.items[0]);
155         this.oList.insertBefore(last2, this.items[0]);
156 
157         this.buildPage();
158         this.bindEvent();
159         this.slientGoTo();
160     },
161     buildPage:function(){
162         for(var i = 0,len = this.items.length - 4; i<len; i++) {
163             var circle = document.createElement('span');
164             circle.innerHTML = i + 1;
165             this.page.appendChild(circle);
166         }
167         this.pageCircles = this.page.getElementsByTagName('span');
168         this.addEvent(this.page, 'click', 'gotoIndex');
169         this.page.style.display = 'block';
170     },
171     bindEvent:function(){
172         this.addEvent(this.prevBtn, 'click', 'prev');
173         this.addEvent(this.nextBtn, 'click', 'next');
174     },
175     addEvent:function(ele, type, fn, context) {
176         context = context || this;
177         var innerFun = function(event) {
178             var evt = event || window.event;
179             if(typeof fn === 'string'){
180                context[fn].call(context, this, evt);
181             } else {
182                 fn.call(context, this, evt);
183             }
184         }
185         if(window.addEventListener) {
186             ele.addEventListener(type, innerFun, false);
187         } else {
188             ele.attachEvent('on'+type, innerFun);
189         }
190     },
191     index:function(ele){
192         var parentNode = ele.parentNode;
193         var eles = parentNode.getElementsByTagName(ele.tagName);
194 
195         for(var i = 0, len = eles.length; i<len; i++){
196             if(eles[i] == ele) {
197                 return i;
198             }
199         }
200     },
201     hasClass: function(obj, cls) {
202         return !!obj.className && obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
203     },
204     addClass: function(obj, cls) {
205         if (!this.hasClass(obj, cls)) obj.className += " " + cls;
206     },
207     removeClass:function (obj, cls) {
208         if (this.hasClass(obj, cls)) {
209             var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
210             obj.className = obj.className.replace(reg, ' ');
211         }
212     },
213     gotoIndex:function(eleContext, evt){
214         var ele = evt.target || evt.srcElement;
215         var index = this.index(ele);
216         if(this.current === this.items.length-4 && index === 0) {
217             this.current = 0;
218             this.slientGoTo();
219         } else if(this.current === 1 && index ===this.items.length-5) {
220             this.current = this.items.length-3;
221             this.slientGoTo();
222         }
223         this.current = index + 1;
224         this.doAnimate();
225     },
226     prev:function(eleContext, evt){
227         this.current--;
228         this.doAnimate();
229     },
230     next:function(eleContext, evt){
231         this.current++;
232         this.doAnimate();
233     },
234     doAnimate:function(){
235         this.distance = (this.wrapWidth-this.itemWidth*(2*this.current + 3))/2 - parseInt(this.oList.style.left, 10);
236         if(this.distance < 0){
237             this.speed = -Math.abs(this.speed);
238         } else {
239             this.speed = Math.abs(this.speed);
240         }
241         this.distance = Math.abs(this.distance);
242         this.animate();
243     },
244     animate:function(){
245         var that = this;
246         this.timer = setTimeout(function() {
247             var left = parseInt(that.oList.style.left, 10) || 0;
248 
249             if (that.going+Math.abs(that.speed) >= that.distance) {
250                 if (that.speed > 0) {
251                     that.oList.style.left = left + that.distance - that.going + 'px';
252                 } else {
253                     that.oList.style.left = left - that.distance + that.going + 'px';
254                 }
255                 clearTimeout(that.timer);
256                 that.going = 0;
257                 that.onceEnd();
258             } else {
259                 that.going += Math.abs(that.speed);
260                 that.oList.style.left = left + that.speed + 'px';
261                 that.animate();
262             }
263         }, 25);
264 
265     },
266     slientGoTo:function(){
267         console.log(this.current);
268         this.oList.style.left = (this.wrapWidth-this.itemWidth*(2*this.current + 3))/2 + 'px';
269     },
270     setCircleSelect:function(){
271         for(var i=0,len = this.pageCircles.length; i<len; i++) {
272             var ele= this.pageCircles[i];
273             if(this.hasClass(ele, 'select')) {
274                 this.removeClass(ele, 'select');
275             }
276         }
277         this.addClass(this.pageCircles[this.current-1], 'select');
278     },
279     correctCurrent:function(){
280         if(this.current === 0) {
281             this.current = this.items.length - 4;
282         } else if(this.current === this.items.length - 3) {
283             this.current = 1;
284         } else {
285             return false;
286         }
287         this.slientGoTo();
288     },
289     onceEnd:function(){
290         this.correctCurrent();
291         this.setCircleSelect();
292     }
293 }
294 var con = document.getElementById("container");
295 var s = new Slider(con);
296 </script>
297 </body>
298 </html>

 

posted on 2014-03-28 14:00  坚壳  阅读(1315)  评论(0编辑  收藏  举报