JS圖片自動或者手動滾動效果
在談元件之前 來談談今天遇到搞笑的事情,今天上午接到一個杭州電話 0571-28001187 即說是杭州人民法院的 貌似說我用招商銀行信用卡在今年的6月23日借了招商銀行19800元人民幣,今天是最後一天沒有還款,說我其他銀行錢都被凍結了。以後有可能法律投訴我!我靠 我無語啊 我長這麼大從來都沒有辦理過信用卡,我根本就不需要辦理信用卡,所以一直以來也沒有辦過,招商一卡通是有一張 但是從來沒有借過錢啊,身份證一直都身上帶著!基本上沒有脫離過身,今天我打電話過去 他問我叫什麼名字 我就報了名字 我問是什麼情況 然後說了很多 大概意思就是剛剛上面的意思 然後他接著問我身份證號是多少?我就沒有告訴他,我今天就半信半疑 我到銀行取下錢 看看是不是真的我的卡被凍結了 結果我所有的銀行卡都沒有被凍結。我懷疑有可能是騙人的,如果有杭州的朋友 可以試試打上面的電話 然後隨便報個假名字 讓他們查下 看看他們怎麼說?就知道了!快過年了 我也在這希望大家不要被一些人騙了,年底小心騙子(騙子很多的)。 不多說了,下面來看看我這個JS效果原理吧!
基本原理
1. 開始獲取每次滾動的個數,如果引數item(int整形數字)傳進來,就取引數item個數 否則的話 個數count = 取外層容器寬度(或高度) / 每個li寬度(或高度)。然後判斷方向 如果是left(向左) 那麼父級容器寬度ul * 2,否則的話ul高度*2. 然後計算下一次滾動多少距離。如果方向是left 那麼值的計算 = $("li", $wrap).outerWidth() * _cache.count(也就是當前一個li的寬度*滾動的個數)。如方向是top 那麼值的計算 = $("li", $wrap).outerHeight() * _cache.count(一個li的高度*滾動的個數)。
2. 下一頁按鈕事件的原理:
預設是auto(自動播放),不斷向下一頁滾動,_scrollNext函式的原理:如果方向是left 那麼marginLeft:動畫(animate)移動多少距離。接著回撥函式把第一個li插入到最後上面來,且讓margin-left:0;接著又執行相應的動作 就是一個迴圈了。同理 向上滾動也是這個道理。
3. 上一頁按鈕事件的原理:
從後面獲取幾項元素(根據count個數來獲取多少個)。接著判斷left或者up方向。接著marginLeft或者marginTop,就這樣迴圈。
4. 判斷傳進來的auto引數 如沒有傳 則預設顯示true 自動滾動 否則的 手動滾動。如果是自動的話 呼叫 setInterval 執行 _scrollNext滾動下一頁的方法。
示意圖如下:
jsfiddle的效果如下連結,可以點選進去看看。
http://jsfiddle.net/longen/3jXFN/embedded/result/
依賴於HTML結構如下
<div id="example"> <div class="scroll"> <ul> <li></li> <li></li> <li></li> <li></li> </ul> </div> <span class="prev">前一個</span> <span class="next">下一個</span> </div>
如果沒有上下頁的話 上下頁按鈕可去掉HTML程式碼。
可配置的引數如下
HTML程式碼如下:
<div id="wrap"> <!-- 純文字公告 --> <div class="demo1"> <h3>文字自動滾動(向上)</h3> <div class="box" id='demo1'> <span class="title">塵世:</span> <div class='fl scroll1'> <ul> <li>我來測試1;我來測試1;</li> <li>我來測試2;我來測試2;</li> <li>我來測試3;我來測試3;</li> <li>我來測試4;我來測試4;</li> <li>我來測試5;我來測試5;</li> <li>我來測試6;我來測試6;</li> <li>我來測試7;我來測試7;</li> <li>我來測試8;我來測試8;</li> <li>我來測試9;我來測試9;</li> <li>我來測試10;我來測試10;</li> <li>我來測試11;我來測試11;</li> <li>我來測試12;我來測試12;</li> <li>我來測試13;我來測試13;</li> <li>我來測試14;我來測試14;</li> <li>我來測試15;我來測試15;</li> </ul> </div> </div> </div> <div class="demo1"> <h3>圖片自動滾動(向左)</h3> <div class="box" id='demo2'> <div class='scroll2'> <ul> <li><img src="images/1-1.jpg" alt="" /></li> <li><img src="images/1-2.jpg" alt="" /></li> <li><img src="images/1-3.jpg" alt="" /></li> <li><img src="images/1-4.jpg" alt="" /></li> <li><img src="images/1-5.jpg" alt="" /></li> <li><img src="images/1-6.jpg" alt="" /></li> </ul> </div> </div> </div> <div class="demo1"> <h3>圖片滾動(向左,帶按鈕控制,每次滾動個數3)</h3> <div class="box" id='demo3'> <div class='scroll3'> <ul> <li><img src="images/1-1.jpg" alt="" /></li> <li><img src="images/1-2.jpg" alt="" /></li> <li><img src="images/1-3.jpg" alt="" /></li> <li><img src="images/1-4.jpg" alt="" /></li> <li><img src="images/1-5.jpg" alt="" /></li> <li><img src="images/1-6.jpg" alt="" /></li> </ul> </div> <span class="prev" style="margin-left:30px;">前一個</span> <span class="next">下一個</span> </div> </div> <div class="boxs absl" id='demo4'> <div class='scroll4'> <ul> <li><img src="images/1-1.jpg" alt="" /></li> <li><img src="images/1-2.jpg" alt="" /></li> <li><img src="images/1-3.jpg" alt="" /></li> <li><img src="images/1-4.jpg" alt="" /></li> <li><img src="images/1-5.jpg" alt="" /></li> <li><img src="images/1-6.jpg" alt="" /></li> </ul> </div> </div> <div class="boxs absr" id='demo5'> <div class='scroll5'> <ul> <li><img src="images/1-1.jpg" alt="" /></li> <li><img src="images/1-2.jpg" alt="" /></li> <li><img src="images/1-3.jpg" alt="" /></li> <li><img src="images/1-4.jpg" alt="" /></li> <li><img src="images/1-5.jpg" alt="" /></li> <li><img src="images/1-6.jpg" alt="" /></li> </ul> </div> <span class="prev">前一個</span> <span class="next">下一個</span> </div> </div>
CSS程式碼如下:
<style> * { margin:0; padding:0; } body { background:#e3e3e3; height:100%; font:normal normal 12px/24px "Microsoft yahei", Arial; padding-bottom:30px; } li{list-style:none;} h3{color:#333;font-size:14px;width:330px;margin:30px auto 0;} img{display:block;} #title{margin:20px 0; text-align:center;} #wrap {position:relative;width:800px;height:550px;margin:0 auto;background:#f8f8f8;border:1px solid #a3a3a3;border-radius:5px;-moz-border-radius:5px;} .box{width:400px;margin:0 auto;margin-top:10px;} .boxs{width:110px;margin:0;margin-top:30px;} .box span.title{float:left;height:30px;line-height:28px;border:1px solid #5AABCF;border-right:none;text-indent:5px;margin-left:29px;background:#73C5E5;color:#fff;} /*文字*/ .scroll1{width:297px;height:30px;margin:0 auto;border:1px solid #5AABCF;overflow:hidden;} .scroll1 li{width:230px;height:30px;line-height:30px;text-indent:5px;} .scroll2 {width:330px;height:110px;margin:0 auto;border:1px solid #5AABCF;padding:5px;overflow:hidden;} .scroll2 li{float:left;width:100px;height:100px;padding:5px;} .scroll3 {width:330px;height:110px;margin:0 auto;border:1px solid #5AABCF;padding:5px;overflow:hidden;} .scroll3 li{float:left;width:100px;height:100px;padding:5px;} .scroll4 {width:110px;height:330px;border:1px solid #5AABCF;padding:5px;overflow:hidden;} .scroll4 li{width:100px;height:100px;float:left;padding:5px;} .absl{position:absolute;left:30px; top:0;} .scroll5 {width:110px;height:330px;border:1px solid #5AABCF;padding:5px;overflow:hidden;} .scroll5 li{width:100px;height:100px;float:left;padding:5px;} .absr{position:absolute;right:40px; top:0;} .prev, .next{float:left;margin-top:5px;margin-left:5px;padding:2px 5px;background:#73C5E5;color:#fff;cursor: pointer;} .download{width:300px;margin:0 auto;text-align:center;} .fl{float:left;} .fr{float:right;} .hide{display:none;} </style>
JS程式碼如下:
/** * JS圖片自動滾動效果 * @time 2014-1-4 * @author tugenhua * @email 879083421@qq.com ********************************************************************** *完整的html程式碼結構: *<div id="example"> * <div class="scroll"> * <ul> * <li></li> * <li></li> * <li></li> * <li></li> * </ul> * </div> * <span class="prev">前一個</span> * <span class="next">下一個</span> *</div> */ function XYMarquee(options) { this.config = { targetElem : '', // 目標元素 預設為空 需要傳入 direction : 'left', // 預設方向為left 或者自定義 up btnPrev : '.prev', // 上一頁按鈕 btnNext : '.next', // 下一頁按鈕 auto : true, // 預設為true 自動播放 item : null, // 一次滾動多少個 speed : "1000", // 設定每次滾動動畫執行時間(單位毫秒,預設為1000); time : "3000", // 設定每次動畫執行間隔時間(單位毫秒,預設為3000); callback : null // 點選上一頁或者下一頁回撥 }; this.cache = { timer : null, count : 1, marquee : true }; this.init(options); } XYMarquee.prototype = { constructor: XYMarquee, init: function(options){ this.config = $.extend(this.config, options || {}); var self = this, _config = self.config, _cache = self.cache; // 初始化 判斷方向是left還是up if(_config.targetElem !== '') { var $wrap = $('div',$(_config.targetElem)), $parent = $("li", $wrap).parent(); _cache.count = _config.direction == 'left' ? Math.floor($wrap.width() / $("li", $wrap).outerWidth()) : Math.floor($wrap.height() / $('li',$wrap).outerHeight()); if(_config.item) { _cache.count = _config.item; } if(_config.direction == 'left') { $parent.css('width',$wrap.width() * 2 + 'px'); }else { $parent.css('height',$wrap.height() * 2 + 'px'); } $wrap.css("overflow", "hidden"); var $value = _config.direction =="left" ? $("li", $wrap).outerWidth() * _cache.count : $("li", $wrap).outerHeight() * _cache.count; self._bindEnv($parent,$wrap,$value); } }, /* * 所有的事件 */ _bindEnv: function($parent,$wrap,$value) { var self = this, _config = self.config, _cache = self.cache; if(_config.auto) { $wrap.hover(function(){ self._stopMarquee(); },function(){ self._autoPlay($parent,$wrap,$value); }); // 自動播放 self._autoPlay($parent,$wrap,$value); } // 點選上一頁事件 或者下一頁事件 $(_config.btnPrev,$(_config.targetElem)).click(function(){ self._scrollPrev($parent,$wrap,$value); _config.callback && $.isFunction(_config.callback) && _config.callback(); }); $(_config.btnNext,$(_config.targetElem)).click(function(){ self._scrollNext($parent,$wrap,$value); _config.callback && $.isFunction(_config.callback) && _config.callback(); }); }, /* * 自動播放 */ _autoPlay: function($parent,$wrap,$value){ var self = this, _config = self.config, _cache = self.cache; _cache.timer = setInterval(function(){ self._scrollNext($parent,$wrap,$value); }, _config.time); }, /* * 向下頁滾動 */ _scrollNext: function($parent,$wrap,$value){ var self = this, _config = self.config, _cache = self.cache; if(_cache.marquee) { _cache.marquee = false; if(_config.direction == 'left') { $parent.animate({ "marginLeft": -$value },_config.speed,function(){ var $tempwrap = $("li", $wrap).slice(0, _cache.count); $parent.append($tempwrap); $parent.css("marginLeft", 0); _cache.marquee = true; }); }else { $parent.animate({ "marginTop": -$value },_config.speed,function(){ var $tempwrap = $("li", $wrap).slice(0, _cache.count); $parent.append($tempwrap); $parent.css("marginTop", 0); _cache.marquee = true; }); } } }, /* * 向上一頁滾動 從尾部開始 然後插入到最前面來 */ _scrollPrev: function($parent,$wrap,$value){ var self = this, _config = self.config, _cache = self.cache; if(_cache.marquee) { var $tempwrap = $("li", $wrap).slice( -_cache.count); _cache.marquee = false; $parent.prepend($tempwrap); if(_config.direction == 'left') { $parent.css("marginLeft", -$value); $parent.animate({ "marginLeft": 0 },_config.speed,function(){ _cache.marquee = true; }); }else { $parent.css("marginTop", -$value); $parent.animate({ "marginTop": 0 },_config.speed,function(){ _cache.marquee = true; }); } } }, /* * 停止滾動 */ _stopMarquee: function() { var self = this, _config = self.config, _cache = self.cache; _cache.timer && clearInterval(_cache.timer); } };
程式碼初始化方式分別如下:
$(function(){ new XYMarquee({ targetElem: '#demo1', direction: 'up' }); new XYMarquee({ targetElem: '#demo2', direction: 'left', item:1 }); new XYMarquee({ targetElem: '#demo3', direction: 'left', btnPrev: '.prev', btnNext: '.next', auto: false, item:3 }); new XYMarquee({ targetElem: '#demo4', direction: 'up', item:1 }); new XYMarquee({ targetElem: '#demo5', direction: 'up', btnPrev: '.prev', btnNext: '.next', auto: false, item:3 }); });