基本上廣告的滑動效果作法都是大同小異,會有差別的是在樣式及功能上的改變。像有同學就問到說是否能把「左右水平廣告輪播」的下方加上號碼鈕,甚至還希望多加一對能切換上下張圖片的鈕。
筆者就稍微修改一下 HTML:
檢視原始碼 HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <body> <div id="abgne-block-20110317"> <div class="abgne-player"> <ul class="abgne-list"> <li><a target="_blank" href="#"><img src="images/a.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/b.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/c.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/d.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/e.jpg"></a></li> </ul> </div> <div class="abgne-control"> <ul class="arrows"> <li class="prev"><</li> <li class="next">></li> </ul> </div> </div> </body> |
這便會發現多了一個新的 .abgne-control 區塊,裡面除了目前看到用來控制上下張的鈕之外,等等還會利用 jQuery 來動態產生相對應數量的號碼鈕清單。
檢視原始碼 CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | ul, li { padding: 0; margin: 0; list-style: none; } #abgne-block-20110317 { width: 720px; /* 圖片的寬 */ height: 250px; /* 圖片的高 + 30 */ border: 10px solid #ddd; } .abgne-player { width: 720px; /* 圖片的寬 */ height: 220px; /* 圖片的高 */ position: relative; overflow: hidden; } .abgne-player ul.abgne-list { position: absolute; width: 9999px; height: 100%; } .abgne-player ul.abgne-list li { float: left; width: 720px; /* 圖片的寬 */ height: 100%; } .abgne-player ul.abgne-list img{ width: 100%; height: 100%; border: 0; } .abgne-control { height: 24px; padding: 3px; color: #fff; font-size: 13px; background: #333; } .abgne-control ul { float: left; } .abgne-control ul li { float: left; padding: 0 5px; line-height: 20px; margin: 2px; background: #666; cursor: pointer; } .abgne-control ul.numbers { margin-left: 13px; } .abgne-control ul li.current { background: #fff; color:#000; } .abgne-control ul li.hover { background: #fff; color:#000; } |
至於 CSS 的部份只是針對 .abgne-control 的部份來排版用。除了號碼鈕之外,目前就能看到半完成的畫面了:
那說好的號碼鈕呢?!別擔心~接著就看咱們的 jQuey 大顯神通:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | $(function(){ // 先取得必要的元素並用 jQuery 包裝 // 再來取得 $block 的高度及設定動畫時間 var $block = $('#abgne-block-20110317'), $slides = $block.find('ul.abgne-list'), _width = $block.width(), $li = $slides.find('li'), $control = $block.find('.abgne-control'), _animateSpeed = 600; // 設定 $slides 的寬(為了不讓 li 往下擠) $slides.css('width', ($li.length + 1) * _width); // 產生 li 選項 var _str = ''; for(var i=0, j=$li.length;i<j;i++){ // 每一個 li 都有自己的 className = playerControl_號碼 _str += '<li class="abgne-player-control_' + (i+1) + '">' + (i+1) + '</li>'; } // 產生 ul 並把 li 選項加到其中 var $number = $('<ul class="numbers"></ul>').html(_str).appendTo($control), $numberLi = $number.find('li'); // 並幫 .numbers li 加上 click 事件 $numberLi.click(function(){ var $this = $(this); $this.addClass('current').siblings('.current').removeClass('current'); // 移動位置到相對應的號碼 $slides.stop().animate({ left: _width * $this.index() * -1 }, _animateSpeed); return false; }).eq(0).click(); // 幫 .arrows li 加上 click 事件 $control.find('ul.arrows li').click(function(){ var _index = $numberLi.filter('.current').index(); $numberLi.eq((this.className.indexOf('next')>-1?_index+1:_index-1+$numberLi.length)%$numberLi.length).click(); return false; }); // 當滑鼠移到 $control li 上時, 加上 .hover 效果 // 反之則移除 $control.find('li').hover(function(){ $(this).addClass('hover'); }, function(){ $(this).removeClass('hover'); }); }); |
號碼鈕的數量會隨著 .abgne-list 中的 li 數量而自動的產生,因此使用時就不用再辛苦的自己加上。
若是想讓它能自動輪播的話,則得使用 setTimeout() 等計時器來控制:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | $(function(){ // 先取得必要的元素並用 jQuery 包裝 // 再來取得 $block 的高度及設定動畫時間 var $block = $('#abgne-block-20110317'), $slides = $block.find('ul.abgne-list'), _width = $block.width(), $li = $slides.find('li'), $control = $block.find('.abgne-control'), _animateSpeed = 600, // 加入計時器, 輪播時間及控制開關 timer, _showSpeed = 3000, _stop = false; // 設定 $slides 的寬(為了不讓 li 往下擠) $slides.css('width', ($li.length + 1) * _width); // 產生 li 選項 var _str = ''; for(var i=0, j=$li.length;i<j;i++){ // 每一個 li 都有自己的 className = playerControl_號碼 _str += '<li class="abgne-player-control_' + (i+1) + '">' + (i+1) + '</li>'; } // 產生 ul 並把 li 選項加到其中 var $number = $('<ul class="numbers"></ul>').html(_str).appendTo($control), $numberLi = $number.find('li'); // 並幫 .numbers li 加上 click 事件 $numberLi.click(function(){ var $this = $(this); $this.addClass('current').siblings('.current').removeClass('current'); clearTimeout(timer); // 移動位置到相對應的號碼 $slides.stop().animate({ left: _width * $this.index() * -1 }, _animateSpeed, function(){ // 當廣告移動到正確位置後, 依判斷來啟動計時器 if(!_stop) timer = setTimeout(move, _showSpeed); }); return false; }).eq(0).click(); // 幫 .arrows li 加上 click 事件 $control.find('ul.arrows li').click(function(){ var _index = $numberLi.filter('.current').index(); $numberLi.eq((this.className.indexOf('next')>-1?_index+1:_index-1+$numberLi.length)%$numberLi.length).click(); return false; }); // 當滑鼠移到 $control li 上時, 加上 .hover 效果 // 反之則移除 $control.find('li').hover(function(){ $(this).addClass('hover'); }, function(){ $(this).removeClass('hover'); }); // 如果滑鼠移入 $slides 時 $slides.hover(function(){ // 關閉開關及計時器 _stop = true; clearTimeout(timer); }, function(){ // 如果滑鼠移出 $block 時 // 開啟開關及計時器 _stop = false; timer = setTimeout(move, _showSpeed); }); // 計時器使用 function move(){ $control.find('ul.arrows li.next').click(); } }); |
感恩分享
謝謝老師