筆者此次要教的範例是把上一次的「上下垂直選項式廣告輪播」改成左右水平的移動,同時還想要把按鈕移動到置中的位置。
這次的 HTML 比上一個少了 #player 的區塊:
檢視原始碼 HTML
1 2 3 4 5 6 7 8 9 10 11 | <body> <div id="abgneBlock"> <ul class="list"> <li><a target="_blank" href="#"><img src="images/01.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/02.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/03.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/04.jpg"></a></li> <li><a target="_blank" href="#"><img src="images/05.jpg"></a></li> </ul> </div> </body> |
同時再用 CSS 稍微修改裝飾:
檢視原始碼 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 | #abgneBlock { width: 940px; height: 279px; position: relative; overflow: hidden; border: 1px solid #ccc; } #abgneBlock ul.list { padding: 0; margin: 0; list-style: none; position: absolute; width: 9999px; height: 100%; } #abgneBlock ul.list li { float: left; width: 940px; height: 100%; } #abgneBlock .list img{ width: 100%; height: 100%; border: 0; } #abgneBlock ul.playerControl { margin: 0; padding: 0; list-style: none; position: absolute; bottom: 5px; right: 5px; height: 14px; } #abgneBlock ul.playerControl li { float: left; width: 23px; height: 14px; cursor: pointer; margin: 0px 2px; background: url(images/rect_ctrl.png) no-repeat 0 0; } #abgneBlock ul.playerControl li.current { background-position: -23px 0; } |
最後就是請出 jQuery 來加上動態效果囉:
檢視原始碼 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 | $(function(){ // 先取得必要的元素並用 jQuery 包裝 // 再來取得 $block 的高度及設定動畫時間 var $block = $('#abgneBlock'), $slides = $('ul.list', $block), _width = $block.width(), $li = $('li', $slides), _animateSpeed = 600; // 產生 li 選項 var _str = ''; for(var i=0, j=$li.length;i<j;i++){ // 每一個 li 都有自己的 className = playerControl_號碼 _str += '<li class="playerControl_' + (i+1) + '"></li>'; } // 產生 ul 並把 li 選項加到其中 // 並幫 li 加上 mouseover 事件 $('<ul class="playerControl"></ul>').html(_str).appendTo($slides.parent()).css('left', function(){ // 把 .playerControl 移到置中的位置 return (_width - $(this).width()) / 2; }).find('li').mouseover(function(){ var $this = $(this); $this.addClass('current').siblings('.current').removeClass('current'); // 移動位置到相對應的號碼 $slides.stop().animate({ left: _width * $this.index() * -1 }, _animateSpeed); return false; }).eq(0).mouseover(); }); |
其中 .playerControl 的在置中的 left 座標是透過簡單的計算:
檢視原始碼 JavaScript
1 | (#abgneBlock 的寬 - .playerControl 的寬) / 2 |
接著只要當滑鼠移到 .playerControl li 後就能進行廣告的切換顯示了。
若是要讓它能自動輪播展示的話,得再修改一下程式的部份:
檢視原始碼 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 | $(function(){ // 先取得必要的元素並用 jQuery 包裝 // 再來取得 $block 的高度及設定動畫時間 var $block = $('#abgneBlock'), $slides = $('ul.list', $block), _width = $block.width(), $li = $('li', $slides), _animateSpeed = 600, // 加入計時器, 輪播時間及控制開關 timer, _showSpeed = 3000, _stop = false; // 產生 li 選項 var _str = ''; for(var i=0, j=$li.length;i<j;i++){ // 每一個 li 都有自己的 className = playerControl_號碼 _str += '<li class="playerControl_' + (i+1) + '"></li>'; } // 產生 ul 並把 li 選項加到其中 var $playerControl = $('<ul class="playerControl"></ul>').html(_str).appendTo($slides.parent()).css('left', function(){ // 把 .playerControl 移到置中的位置 return (_width - $(this).width()) / 2; }); // 幫 li 加上 click 事件 var $playerControlLi = $playerControl.find('li').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().end(); // 如果滑鼠移入 $block 時 $block.hover(function(){ // 關閉開關及計時器 _stop = true; clearTimeout(timer); }, function(){ // 如果滑鼠移出 $block 時 // 開啟開關及計時器 _stop = false; timer = setTimeout(move, _showSpeed); }); // 計時器使用 function move(){ var _index = $('.current').index(); $playerControlLi.eq((_index + 1) % $playerControlLi.length).click(); } }); |
除了自動輪播之外,筆者還把切換廣告的事件改成用 .click(),及把選單改成圓點的樣式:
檢視原始碼 CSS
1 2 3 4 5 6 7 8 9 10 11 | #abgneBlock ul.playerControl li { float: left; width: 10px; height: 10px; cursor: pointer; margin: 0px 2px; background: url(images/cir_ctrl.png) no-repeat -10px 0; } #abgneBlock ul.playerControl li.current { background-position: 0 0; } |
至於是想要用點擊(click)或是當滑鼠移入(mouseover)到選單來判斷切換廣告的時機,這就由各位自行選擇囉!
男丁老師 你好
我套用了您這個jQuery 應用在我的網站上,Chrome & Safari 都能正常執行無誤
但換成IE以後,有時可以正常顯示 有時又不行
我實在找不出原因在哪JavaScript我沒改過,只改了CSS playerControl 的位置
會是onload or ready的問題嗎?
因為我把整個網站每個頁面會使用到的Javascript 都集中在一個js檔,再從外部載入到各個頁面
謝謝~
請仔細看一下你的網頁, 請先引用 css 再引用 js
對不起,我對JQuery很不熟,但最近有需要寫一下程式,上面有幾個問題我不懂
1.第一段javaSript $slides.stop().animate,為何在animate前需要增加stop()我把STOP()刪除好像也沒變
2.第一段javaSript 的第30行為何需要return false;最後一行為何需要eq(0).mouseover();,這兩部分都刪除好像也可以執行
3.最後第二段javaSript的40行eq(0).click().end();為何需要按又停不懂哩與$playerControlLi.eq((_index + 1) % $playerControlLi.length).click();這%物件如何求餘數???
1.動畫會累加, 所以當被重覆觸發時, 希望先停掉未完成的, 直接執行新的動畫
2.return false 主要是為了取消可能會觸發超連結預設的功能用, 而 eq(0).mouseover() 是要先讓第一個 li 先觸發一次 mouseover() 事件
3.end() 是要讓選擇的元素由 li 再回到 $playerControl, 至於求餘數是用來自動循環輪播切換用
謝謝您的回答,好像還是有點似懂非懂,真的很深奧ㄟ,這些程式您到底怎麼想出來的,太神了‧
想像你是你的超能力XD
親愛的版大,
我參考了國外的skitter jquery 再參考站主的教學,學到了很多實用的範例,
但我遇到了一個問題想請教站主
我做了一個skitter jquery slider 網址為以下
http://blog-imgs-56.fc2.com/e/v/i/evilkiwi/banner3-u99.html
但每一張輪播圖片我在HTML裡面都有新增 target="_blank" 或 _top
但實際上在執行時,只有第一張圖片有開新視窗連結的效果,如果去按導航鍵切換圖片後,
就會失去新開視窗的效果,當我把這個jquery利用 iframe崁在網站裡時,就會出現無限鬼打牆
請問站主這個狀況該怎麼解決呢?
如這個網站 http://www.i-search.com.tw
中間的jquery 去用滑鼠切換其它張圖片時,再按超連結,就會失去_blank效果
請問老師如果要把往左移動改城淡入淡出要如何修改?
謝謝老師~
男丁老師好
我想請問一下如何再加上左右按鈕的功能呢???
可以參考 move() 中的程式, 它就等於是下一張的按鈕, 然後上一張的按鈕, 則是要將 index - 1 才行(要判斷是否小於 0)
老師,想請問這類的輪播圖,若要有第二張圖才顯示切換小圖,一張則不顯示..該如何設定?
<? for($i=1;$i
謝謝
噢,貼的部分程式沒顯示..
麻煩老師指點了~
"切換小圖"指的是..正中央下方那小長方形..
只上傳一張廣告圖則不顯示..
二張以上就顯示小長方形讓瀏覽者切換~~
3Q~
請問男丁大大
這可以作成像是
-> http://www.esri.com
這個網站的banner 一樣
縮小的話 可以無限長出這個banner嗎??
請問一下 playcontrol 若被圖片覆蓋或看不見要怎麼解決,我已經將position:absolute;了
但是還是看不到控制選項,請前輩能為我解答嗎?
您好~ 想請問有辦法將輪播的圖片改為自適頁面大小嗎?
想讓手機瀏覽起來方便些~ 謝謝!
把圖片改自己要的大小應該就可以了@@
程式碼裡面的CSS調整
#abgneBlock {
width: 940px;
height: 279px;
position: relative;
overflow: hidden;
border: 1px solid #ccc;
我沒碰過JQuery不過應該是從這裡改大小吧?@@
這裡~
#abgneBlock ul.list li {
float: left;
width: 940px;
height: 100%;
}
這裡940px也要改一下
我是初心者~如果回答錯不要打我XD
如果對你有幫助就好~^^
如果講錯的話就請男丁大大幫我修正喔@@
老師~不好意思~我用您所提供的程式碼修改後,再DW預覽都沒問題,上架後不知道為什麼圖片跑出一張後就全部空白,怎麼滑動都不會回來,來回檢查程式碼也不知道發生甚麼事QAQ
可以幫幫我嗎?
需要看到你有問題的頁面才知道發生什麼問題了!