基本上廣告的滑動效果作法都是大同小異,會有差別的是在樣式及功能上的改變。像有同學就問到說是否能把「左右水平廣告輪播」的下方加上號碼鈕,甚至還希望多加一對能切換上下張圖片的鈕。
筆者就稍微修改一下 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(); } }); |
男丁老師~我想請問我練習應用你這個但是我卡住了~
http://bali.newamazing.com.tw/MaraRiverSafari.asp
我想應用在此頁面,但是並不會播放
http://bali.newamazing.com.tw/MaraRiverSafari.html
但是用html就可以不知道是哪裡出問題,煩請幫忙~
你的 function.js 中有缺另一支跟 swf 有關的 js, 也許是它引起的問題。
先試著把這引用先拿掉後試試。
老師請問~~要怎麼改寫成,輪播到最後面26的時候,動畫是*繼續*(或繼續的感覺)往下變成1的圖,
而*不是*快速的跑25.24.23....1
這樣要怎麼改寫呢~~~@@a~
有幾種方式可以做到, 可以先參考這篇的方法:仿 Yahoo 滾動式訊息跑馬燈
老師您好
第一個原始碼 第8行 後面少個 , 逗號
使用的時候發現錯誤 告知老師一下^^
謝謝你的回報, 已經修正囉!!
老師您好
我同時實用 lightbox 跟 左右水平廣告輪播-附加號碼鈕 ,可是lightbox 的效果就會出現不暸
請問該如何解決呢
要看你用的是那套 lightbox, 通常都是 framework 衝突的關係。
可以試著把我範例中的 $() 都改回用 jQuery()
老師不好意思, 我有試著把$都改成 jQuery(),可是lightbox 效果還是出現不了~
這是我的網址, 可以麻煩你在幫我看看要怎麼修正嗎?
http://www.ok-psoriasis.com/Japanese/12333.asp
你網頁中重覆載入多次 jQuery 了, 先試著移除舊版的只留新版的試試。
YA! 解決了~
謝謝老師 🙂
老師! 我已是會員,但下載提交頁要求我輸入密碼@@請問密碼怎麼取得呢?嗚...
檔案是放在免費空間上, 所以下載時等它倒數完就會看到密碼了
男丁大大:
不好意思,問一個比較簡單的問題
碰觸javascript很短時間,但是
又有時間性要做出來,所以麻煩大大
想要改變整個的寬度該改哪一邊?
為什麼圖片大小需要設定那麼多次呢?
基本上看到是 720 的地方就是寬的部份, 你可以試著在最外框設定寬度後, 裡面的用 100% 試看看
請問版主, 我拿這個範例來用, 但我把圖片寬度改為 960px, 並且希望
_showSpeed = 6000, 但我用 Firefox 和 Chrome 測試, 發現畫面有時候
會卡在兩張圖片中間, 不知道要如何解決呢? 還請大大指點
你有把 css 中設定的寬度改成 960px 嗎@@?
若真的還是有問題, 可以直接把範例寄給我看看
不好意思, 版主大大你可以把信箱寄給我嗎, 我找不到你的聯絡方式, 謝謝
就是網址加 gmail