今天文章的內容是關於使用jquery的animate方法,修改html元素的position屬性,創建一個圖片走廊。效果預覽圖片:
大家可以下載demo看完整效果,下面介紹制作過程。
1.首先創建一個html頁面,html結構如下:
<div id="slider"> <div id="viewer"> <img id="image1" src="img/amstrad.jpg" alt="Amstrad CPC 472" /> <img id="image2" src="img/atari.jpg" alt="Atari TT030" /> <img id="image3" src="img/commodore16.jpg" alt="Commodore 64" /> <img id="image4" src="img/commodore128.jpg" alt="Commodore 128" /> <img id="image5" src="img/spectrum.jpg" alt="Sinclair ZX Spectrum +2" /> </div> <ul id="ui"> <li class="hidden" id="prev"><a href="" title="Previous">«</a></li> <li><a href="#image1" title="Image 1" class="active">Image 1</a></li> <li><a href="#image2" title="Image 2">Image 2</a></li> <li><a href="#image3" title="Image 3">Image 3</a></li> <li><a href="#image4" title="Image 4">Image 4</a></li> <li><a href="#image5" title="Image 5">Image 5</a></li> <li class="hidden" id="next"><a href="" title="Next">»</a></li> </ul> </div>
大家一看就明白,viewer包含了幾張圖片,ul對象里面包含了‘上一條’、‘下一條’和各個圖片對應的導航。
2.接下來需要為這些html元素設置css樣式,css我就不多說了,就是給viewer、圖片等元素加樣式,viewer同時只能顯示一張圖片:
#slider { width: 500px; position: relative; } #viewer { width: 400px; height: 300px; margin: auto; position: relative; overflow: hidden; } #slider ul { width: 350px; margin: 0 auto; padding: 0; list-style-type: none; } #slider ul:after { content: "."; visibility: hidden; display: block; height: 0; clear: both; } #slider li { margin-right: 10px; float: left; } #prev, #next { position: absolute; top: 175px; } #prev { left: 20px; } #next { position: absolute; right: 10px; } .hidden { display: none; } #slide { width: 2000px; height: 300px; position: absolute; top: 0; left: 0; } #slide img { float: left; width: 400px; height: 300px; } #title { margin: 0; text-align: center; }
3.為頁面添加jquery和jquery.easing.1.3.js的引用。然后就是我們這篇的重頭了,為導航編寫相應的js事件。
首先我們需要創建一個新的div來包裝5張圖片。
$('#viewer').wrapInner('<div id="slide"></div>');
接下來我們使用jquery的selector找到slider,slide,prev,next等對象,把他們存到相應的js變量中。
var container = $('#slider'), prev = container.find('#prev'), prevChild = prev.find('a'), next = container.find('#next').removeClass('hidden'), nextChild = next.find('a'), slide = container.find('#slide')
創建兩個新的js變量,key保存當前活動圖片id,details保存所有圖片各自的position和title信息。
key = "image1", details = { image1: { position: 0, title: slide.children().eq(0).attr('alt') }, image2: { position: -400, title: slide.children().eq(1).attr('alt') }, image3: { position: -800, title: slide.children().eq(2).attr('alt') }, image4: { position: -1200, title: slide.children().eq(3).attr('alt') }, image5: { position: -1600, title: slide.children().eq(4).attr('alt') } };
為了顯示圖片標題,我們需要添加一個h2標題到頁面。
$('<h2>', { id: 'title', text: details[key].title }).prependTo('#slider');
上述工作完成后,就可以開始為a標簽添加click事件了,這里的a標簽分兩種,一種是‘上一條’和‘下一條’,另外一種是各圖片對應的導航。我們需要分別為他們添加相應的click事件。但是他們都會使用到一個相同的回調函數,我們先完成回調函數的編寫。代碼思路我就直接以注釋的方式完成。
function postAnim(dir) {
//首先我們獲取到當前活動圖片的id,只包含數字部分 var keyMath = parseInt(key.match(/\d+$/));
//slide的left小於0,也就是說當前活動圖片不是圖片1,‘上一條’導航顯示;否則‘上一條’導航消失 (parseInt(slide.css('left')) < 0) ? prev.show() : prev.hide();
//slide的left等於-1600,也就是說當前活動圖片是第五章,‘下一條’導航消失,否則‘下一條’導航顯示 (parseInt(slide.css('left')) === -1600) ? next.hide() : next.show();
//if條件語句當使用‘上一條’和‘下一條’導航時才有意義。實現的功能就是點‘上一條’是key減一,點‘下一條’key加1 if (dir) { var titleKey = (dir === 'back') ? keyMath - 1 : keyMath + 1; key = 'image' + titleKey; } //重新設置h2標題 container.find('#title').text(details[key].title);
//重新設置當前哪個圖片為活動狀態 container.find('.active').removeClass('active'); container.find('a[href=#' + key + ']').addClass('active'); }
接下來我們完成‘上一條’和‘下一條’導航的功能。
nextChild.add(prevChild).click(function (e) { //阻止默認事件,否則動畫效果就沒有了
e.preventDefault(); var arrow = $(this).parent();
//當前slide沒有動畫時,我們才添加新的動畫效果
if (!slide.is(':animated')) { slide.animate({ left: (arrow.attr('id') === 'prev') ? '+=400' : '-=400' }, 'slow', 'easeOutBack', function () { (arrow.attr("id") === "prev") ? postAnim("back") : postAnim("forward"); }); } });
最后是圖片對應的各自導航的功能實現。
$('#ui li a').not(prevChild).not(nextChild).click(function (e) { //阻止默認事件
e.preventDefault(); //獲取當前活動圖片id key = $(this).attr('href').split('#')[1]; //設置動畫效果
slide.animate({ left: details[key].position }, 'slow', 'easeOutBack', postAnim); });
本課的內容完畢了,大家可以下載demo,查看功能具體是如下實現的。
demo下載地址:jQuery.animation.position.zip