現在很多公司網頁的動態效果都希望能在像是 iPad 上能正常瀏覽,可惜偏偏 iPad 就是不理不理 Flash,因此上課時最常被問到的就是如何寫出滑動的展示效果。滑動的效果不外是控制區塊的 top 或是 left 來達成,但最重要的還是整個區塊的操作設計。只要設計排版不同,就算用到同樣的原理也能產生不一樣的使用者體驗(UX)。
好了~有興趣的就跟筆者一起來動手試看看囉(圖片來源-梅問題教學網):
檢視原始碼 HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <body> <div id="abgne-110223"> <div class="wrap-110223"> <ul> <li><a href="#"><img src="A-280_02.jpg" alt="從正面可看到,三孔Bowens的標準卡口,並且在卡口處還有個卡榫,如此一來再大的燈罩也不用怕啦" /></a></li> <li><a href="#"><img src="A-280_03.jpg" alt="轉到後方的屁屁,正是所有的精華所在,所有的調控都集中在此" /></a></li> <li><a href="#"><img src="A-280_04.jpg" alt="下巴的地方,可看到傘孔安裝的地方。" /></a></li> <li><a href="#"><img src="A-280_05.jpg" alt="再往下面一點,就會看到多了一個貼心的安全卡鎖,這樣就不用擔心,閃燈與腳架鬆開時,不小心掉下來的命運" /></a></li> <li><a href="#"><img src="A-280_06.jpg" alt="在燈的最尾部,會看到一個小小的突出物,難不成長瘤啦!哈~當然不是囉!這是光觸發的感應器" /></a></li> </ul> </div> <div class="caption"></div> <div class="arrows"> <a href="#" class="prev"></a> <a href="#" class="next"></a> </div> </div> </body> |
其中有幾個區塊都是沒有內容的,像是 .caption 是用來放置圖片描述用的等等。雖然這些都能透過 Script 來動態產生,但為了避免增加同學在看程式時的負擔,所以儘量會先寫好。
接著再利用 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 53 54 55 56 57 58 | a img { border: none; vertical-align: middle; } #abgne-110223 { height: 456px; /* 圖片的高 + 30 */ width: 642px; /* 圖片的寬 + 邊框寬度 * 2 */ overflow: hidden; } #abgne-110223 .wrap-110223 { height: 426px; /* 圖片的高 */ width: 640px; /* 圖片的寬 */ overflow: hidden; position: relative; margin-bottom: 5px; border: 1px solid #ccc; } .wrap-110223 ul, .wrap-110223 li { list-style: none; margin: 0; padding: 0; } .wrap-110223 ul { position: absolute; } .wrap-110223 ul li { float: left; } #abgne-110223 .arrows { float: right; } #abgne-110223 .arrows a { float: left; width: 22px; height: 22px; background: url(arrows.png) no-repeat left top; } #abgne-110223 a.next { margin-left: -1px; background-position: right top; } #abgne-110223 .caption { float: left; width: 596px; /* 區塊的寬 - .arrows 的寬(44) */ overflow: hidden; /* 避免文字太長 */ color: #666; font-size: 13px; line-height: 22px; /* .arrows a 的高 */ } |
經過 CSS 排版後就已經能看出大概的畫面了
當然讓它能動起來的重責大任就落在 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 33 34 35 36 37 38 39 40 | $(function(){ // 先取得 #abgne-110223 及 ul, li 及 .caption 元素 // 並預設先顯示第幾個, 還有動畫速度 var $block = $('#abgne-110223'), $wrap = $block.find('.wrap-110223'), $ul = $wrap.find('ul'), $li = $ul.find('li'), $caption = $block.find('.caption'), _default = 0, _width = $wrap.width(), animateSpeed = 400; // 先把 ul 的寬度設成 li 數量 x $wrap 的寬 $ul.width(_width * $li.length); // 如果 .arrows 中的 a 被點擊時 $block.find('.arrows').delegate('a', 'click', function(event){ // 先找出 .selected 的元素後移掉該樣式 var $selected = $li.filter('.selected').removeClass('selected'), // 找出目前顯示的元素是第幾個 _index = $li.index($selected); // 依點擊的是上一張或下一張來切換 _index = (event.target.className == 'prev' ? _index - 1 + $li.length : _index + 1) % $li.length; $ul.animate({ left: _index * _width * -1 }, animateSpeed); // 改變標題 $caption.hide().html($li.eq(_index).addClass('selected').find('img').attr('alt')).fadeIn(animateSpeed); return false; }); // 先顯示預設的 $ul.css('left', _default * _width * -1); $caption.html($li.eq(_default).addClass('selected').find('img').attr('alt')); $block.find('a').focus(function(){ this.blur(); }); }); |
這樣就能快速的做出另一種效果的商品展示囉:
若需要自動輪播時得再補上控制輪播用計時器部份:
檢視原始碼 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 | $(function(){ // 先取得 #abgne-110223 及 ul, li 及 .caption 元素 // 並預設先顯示第幾個, 還有動畫速度 var $block = $('#abgne-110223'), $wrap = $block.find('.wrap-110223'), $ul = $wrap.find('ul'), $li = $ul.find('li'), $caption = $block.find('.caption'), _default = 0, _width = $wrap.width(), animateSpeed = 400, timer, speed = 3000, isHover = false; // 先把 ul 的寬度設成 li 數量 x $wrap 的寬 // 並在滑鼠移上時停止計時器; 移出後再啟動計時器 $ul.width(_width * $li.length).hover(function(){ isHover = true; clearTimeout(timer); }, function(){ isHover = false; timer = setTimeout(move, speed); }); // 如果 .arrows 中的 a 被點擊時 $block.find('.arrows').delegate('a', 'click', function(event){ // 如果滑鼠現在是移入狀態就不做動作 if(isHover) return; clearTimeout(timer); // 先找出 .selected 的元素後移掉該樣式 var $selected = $li.filter('.selected').removeClass('selected'), // 找出目前顯示的元素是第幾個 _index = $li.index($selected); // 依點擊的是上一張或下一張來切換 _index = (event.target.className == 'prev' ? _index - 1 + $li.length : _index + 1) % $li.length; $ul.animate({ left: _index * _width * -1 }, animateSpeed, function(){ if(!isHover){ timer = setTimeout(move, speed); } }); // 改變標題 $caption.hide().html($li.eq(_index).addClass('selected').find('img').attr('alt')).fadeIn(animateSpeed); return false; }); // 先顯示預設的 $ul.css('left', _default * _width * -1); $caption.html($li.eq(_default).addClass('selected').find('img').attr('alt')); $block.find('a').focus(function(){ this.blur(); }); // 控制移動用 function move() { $('.next').click(); } // 啟動計時器 timer = setTimeout(move, speed); }); |
改版了,有點小小不習慣
這個能運用到選單上嗎?
假設連結1要連到圖片1這樣?
我不太懂你的意思耶..可以的話用個圖片說明一下:$
請問一下...
那個1.3伊莉查詢器會跳出
An exception of class NilObjectException was not handled. The application must shut down.
的問題有辦法改善嗎@@?
我再找時間修改一下XD
請問老師,可以把這個案例做成像模擬在ipad上換圖的效果嗎?(就是用手指按圖,往左邊刷,就換成下一張;換成在pc上的話,就是滑鼠左鍵壓著往左邊拉就換成下一張圖)
謝謝!
你是要用在手機或是平版上面嗎..?
如果是的話, 可以試試 For Mobile 版 的 jQuery
男丁大
當這個左右切換式的商品展示不止一個呢?
該如何寫@@?
也就是若有兩個商品展示的話,這樣要怎麼寫..
我寫不出來="=
一樣都是要用 each() 的方式, 又或者直接改寫成外掛..
修改過CSS的圖片大小設定後,最後一張圖會變成空白QQ"
能提供個問題範例來看看嗎@@?
感謝您的教學!!
受益良多 謝謝指導~^^
感謝男丁大的教學文章~