通常圖片的展示是否自動播放都是一開始就決定好的,若是能把這權限交給瀏覽者的話,那麼也能讓瀏覽者有實際參與網站的感覺。此次筆者要教的是跟「淡入淡出式的切換影像」很類似但不同的範例。
HTML 的部份是利用 ul li 來當做列表使用:
檢視原始碼 HTML
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 | <body> <div class="slideshow"> <ul> <li> <a href="#"> <img src="images/P1030038.jpg" title="" alt="" /> </a> </li> <li> <a href="#"> <img src="images/P1030054.jpg" title="" alt="" /> </a> </li> <li> <a href="#"> <img src="images/P1030068.jpg" title="" alt="" /> </a> </li> <li> <a href="#"> <img src="images/P1030075.jpg" title="" alt="" /> </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 46 47 48 49 50 51 52 | ul, li { margin: 0; padding: 0; list-style: none; } .slideshow { position: relative; height: 160px; width: 210px; float: left; margin: 0 10px; border: 3px solid #ddd; } .slideshow li { position: absolute; } .slideshow a img{ display: block; padding: 0; margin: 0 auto; border: none; } .slideshow li a{ display: block; } .slideshowController { position: absolute; right: 0; bottom: 0; } .slideshowController a { background: transparent url(images/arrows.png) no-repeat left top; display: block; width: 30px; height: 30px; position: absolute; right: 60px; bottom: 0; z-index: 9999; outline: none; /* 去除超連結虛線 */ } .slideshowController .next{ background-position: -30px 0; right: 0; } .slideshowController .play{ background-position: -60px 0; right: 30px; } .slideshowController .pause{ background-position: -90px 0; } |
雖然有多張圖片,但因為 li 的 position 是設成 absolute,所以只會看到最後一個 li 的內容:
接著再利用 jQuery 來幫每一個 .slideshow 區塊加上專屬的控制器及功能:
檢視原始碼 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 | $(function(){ // 預設圖片淡出淡入的動畫時間 var _fadeSpeed = 600; // 把每一個 .slideshow 取出來做處理 $('.slideshow').each(function(){ // 先取得相關的 ul , li // 並產生控制器 var $this = $(this), $ul = $this.find('ul'), $li = $ul.find('li'), $controller = $('<div class="slideshowController"><a href="#"></a><a href="#" class="play"></a><a href="#" class="next"></a></div>').css('opacity', 0), _len = $li.length, _index = 0, timer, _speed = 2000; // 先把第一張圖片之外的都透明度設成 0 $li.eq(_index).css('z-index', 2).siblings().css('opacity', 0); // 加入控制器並當滑鼠移入時顯示; 滑鼠移出時隱藏 $this.append($controller).hover(function(){ $controller.stop().animate({ opacity: 1 }); }, function(){ $controller.stop().animate({ opacity: 0 }); }); // 當點擊到控制器上面的按鈕時 $controller.delegate('a', 'click', function(){ // 先取得按鈕的 class var $a = $(this), _className = $a.attr('class'); // 如果按的是 play 或是 pause 鈕 if(('play pause').indexOf(_className) > -1){ // 切換目前按鈕圖案 // 並依狀態來啟動或停止計時器 $a.toggleClass('pause').hasClass('pause') ? timer = setTimeout(autoClickNext, _fadeSpeed + _speed) : clearTimeout(timer); return false; } // 停止計時器 clearTimeout(timer); // 移除 pause 鈕 $a.siblings('.pause').removeClass('pause'); // 依按鈕功能來決定上下張圖片索引 _index = ('next' == _className ? _index + 1 : _index - 1 + _len) % _len; // 切換圖片 show(); return false; }); // 自動播放下一張 function autoClickNext() { _index = (_index + 1) % _len; show(); timer = setTimeout(autoClickNext, _fadeSpeed + _speed); } // 淡入淡出圖片 function show() { $li.eq(_index).animate({ opacity: 1, zIndex: 2 }, _fadeSpeed).siblings(':visible').animate({ opacity: 0, zIndex: 1 }, _fadeSpeed); } }); }); |
咱們的控制器可以上一張下一張的切換,還能控制是否自動播放及停止播放的功能,來看預覽效果吧:
那...那如果要讓它預設能自動播放的話呢?首先可以在 .slideshow 中新增一個設定用的 .autoPlay 樣式:
檢視原始碼 HTML
1 | <div class="slideshow autoPlay"> |
接著程式中就能針對有沒有 .autoPlay 樣式來決定是否預設就是自動播放:
檢視原始碼 JavaScript
1 2 3 4 | // 如果有設定預設自動播放的話 if($this.hasClass('autoPlay')){ $controller.find('.play').click(); } |
若如果要像韓國的 GMarket 在展示商品時都是像 gif 動畫一樣的瘋狂切換圖片時,只需要把 _fadeSpeed 及 _speed 設短一點就可以囉(只是淡入淡出的功能就沒什麼太大的作用):
檢視原始碼 JavaScript
1 2 | _fadeSpeed = 50 _speed = 100 |
效果就是會一直換換換~
老師您好:
請問您autoplay的範例網頁剛開啟的時候,第一張圖的連結會不會變成最後一張的連結呢?(跑到第二張後就恢復正常連結)
是否因為是使用透明度控制的關係呢?
已修正, 再麻煩重新試試!
想請問可以加上random,讓重新瀏覽的時候圖片不同嗎?
把一開始 _index = 0 改成 _index = Math.floor(Math.random() * $li.length) 試試
感覺滑鼠移過,遲緩一秒才出現控制器?!
老師你好! 我想請問一下
為什麼我的控制器顯示不出來呢?
滑鼠滑過去沒有東西顯示出來
但是可以按