Home » jQuery 應用

[jQ]用 jQuery 做畫廊 – 含控制器的淡入淡出式圖片切換展示

範例 1
範例 2
範例 3
沒錯!只要 1,200 元就能獲得我們團隊完整的協助,讓效果能迅速的整合到您的網站,並保證瀏覽器的相容性。
立刻申請!

通常圖片的展示是否自動播放都是一開始就決定好的,若是能把這權限交給瀏覽者的話,那麼也能讓瀏覽者有實際參與網站的感覺。此次筆者要教的是跟「淡入淡出式的切換影像」很類似但不同的範例。

HTML 的部份是利用 ul li 來當做列表使用:

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 來讓它們重疊一起:

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;
}

雖然有多張圖片,但因為 liposition 是設成 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 樣式:

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

效果就是會一直換換換~

範例 1 範例 2 範例 3

檔案描述
基本的範例檔案(免空) 開始下載
基本的範例檔案 會員限定

25 筆針對 [jQ]用 jQuery 做畫廊 – 含控制器的淡入淡出式圖片切換展示 的迴響

  1. 老師您好:

    請問您autoplay的範例網頁剛開啟的時候,第一張圖的連結會不會變成最後一張的連結呢?(跑到第二張後就恢復正常連結)
    是否因為是使用透明度控制的關係呢?

  2. 老師你好! 我想請問一下
    為什麼我的控制器顯示不出來呢?
    滑鼠滑過去沒有東西顯示出來
    但是可以按

發表迴響