Flash動畫可以讓Web網站看起來很漂亮,但是由於各種原因不是每個人都會在自己的客戶端瀏覽器上安裝Flash播放器。如果你或者你的使用者不幸安裝了64位的Linux發行版,或者你痛恨在自己的Web頁面上放動畫,那麼你就不得不面對沒有Flash動畫的情況了。
在本文裡,我將告訴你如何用JavaScript實現一個可用性更高的旋轉木馬(carousel)而棄用Flash。
JavaScript——兩害相交取其輕
在本文裡,我不準備去爭論為什麼要開發一個旋轉木馬,而是要接受我們不得不去開發的事實。
那麼問題就來了:為什麼要使用JavaSript而不是Flash?
它要比Flash的實現更加輕巧——通過優化程式碼,我們只需要幾千位元組就能夠獲得一個可以使用的旋轉木馬,載入圖片所需要的時間要比HTML和JavaScript的長。
可維護性是另外一個原因。很多開發人員都知道JavaScript在可維護性上要勝Flash一籌。也許你沒有(足夠的)設計資源來建立一個功能完整的Flash實現,所以如果將它突然留給開發人員,這就意味著JavaScript是一個可行的替代方案。
降級。在禁用JavaScript的情況下將有用的內容傳送給使用者要比在禁用Flash的情況下容易得多。
可訪問性。用螢幕閱讀器瀏覽旋轉木馬要比瀏覽Flash物件更容易。
Google。如果你的內容是在頁面中的,Google就能夠搜尋到它;如果它在Flash中,而且頁面中沒有隱藏旋轉木馬的話,那麼Googlebot就無法找到連結。
HTML基礎
知道了這些原因,就讓我們從將要在本文中用到的四個內容開始建立旋轉木馬吧。
Log files are essential to reconstruct events before an IIS Web server failure. Learn how to protect your log files with this tip.
Learn how the .NET Framework works and the tools you'll need to get up and running in this quick start guide.
這個時候蒙娜麗莎對我們還沒有用。現在讓我們向這些div加入一些樣式,讓它看起來更像我們所知道的旋轉木馬:
.storydiv {
height:182px;
width:355px;
padding-left:175px;
top:0px;
left:0px;
}
#story1 {
background:url(http://www.builderau.com.au/i/s/cov/securitychain170110.gif) no-repeat;
}
#story2 {
background:url(http://www.builderau.com.au/i/s/cov/browser170110.jpg) no-repeat;
}
#story3 {
background:url(http://www.builderau.com.au/i/s/cov/dotnet170110.gif) no-repeat;
}
#story4 {
background:url( no-repeat;
}
.storyDesc{
padding-top: 10px;
padding-right: 8px;
display:block;
}
.fStory {
padding-top: 10px;
display:block;
font-weight:bold;
}
Log files are essential to reconstruct events before an IIS Web server failure. Learn how to protect your log files with this tip.
Learn how the .NET Framework works and the tools you'll need to get up and running in this quick start guide.
這好極了,但是它們是一個接一個垂直排列的,那麼它們很難旋轉起來。要讓所有的div互相疊在一起,我們就要往storydiv類里加入下面一行程式碼:
position:absolute;
現在我們有了一堆亂糟糟的玩意。要讓它變得井然有序,我們就要用下面一句把帶有id story 2到4的div隱藏起來:
display:none
這就是載入的時候我們的旋轉木馬的樣子——現在是討論JavaScript的時候了。
引入JavaScript
旋轉木馬至關重要的特性是內容的旋轉,因此我們要使用一些常見的CSS技巧來隱藏和顯示div。我們將用到下面的程式碼:
var stor = -1;
var maxstor = 3;
var timeout = 3500;
function autorot() {
showNext();
timeout = setTimeout('autorot();', timeout);
}
function rotateDiv(stor){
var divs = document.getElementById("storyContainer").getElementsByTagName("div");
for (var i=0; i < divs.length; i++ ) {
var div = divs[i];
if ( (div.id != "")) {
if(i != stor){
div.style.display = "none";
}
else{
div.style.display = "block";
}
}
}
}
function showNext(){
if(stor < maxstor)
stor++;
else
stor=0;
rotateDiv(stor);
}
and on the body tag we put:
對於body標記,我們使用:
這裡發生的情況是當頁面載入的時候,autorot函式被呼叫,從而進一步呼叫showNext函式,然後設定一個超時,在3.5秒之後重新呼叫自己——這個超時用來保證旋轉木馬反覆旋轉。
showNext方法會確定哪一個story被顯示出來,並把它傳遞給rotateDiv函式,所有的操作都在這裡發生。RotateDiv會取回所有storyContainer div的子div,並把它們的style.display變數設定為無,除非它是我們希望看到的story,在這種情況下,它被設定為block。
現在我們有了一個可以使用的旋轉木馬——但是從可用性的角度上講還不夠理想。就讓我們做點改動吧。
導航
旋轉木馬提供了一種顯示內容多個不同部分的快速方法,但這常常也要在旋轉速度和能夠真正閱讀內容之間作出權衡。
我們準備加入一個用於導航連結的div,這能夠帶我們跳到這四個story中的任何一個,並給予我們利用story向前和向後連結來控制旋轉木馬顯示的能力。
下面就是在關閉body標記之前我們插入的導航HTML:
正如看到的,我們將需要一些更多的JavaScript函式,就是下面這幾個:
function showNext(){if(stor < maxstor)stor++;elsestor=0; rotateDiv(stor);} function stoprot() function showNext(){if(stor < maxstor)stor++;elsestor=0; rotateDiv(stor);} function showPrev(){if(stor > 0)stor--;elsestor=maxstor; rotateDiv(stor);} function showStoryOne()function showStoryTwo()function showStoryThree()function showStoryFour(){stor=3;
沒有什麼很特別的,只有所需要的。我還需要更改rotateDiv函式,以更新正在顯示哪一個story,下面就是要用的程式碼:
function rotateDiv(stor){var divs = document.getElementById("storyContainer").getElementsByTagName("div");for (var i=0; i < divs.length; i++ ) {var div = divs[i];if ( (div.id != "")) {if(i != stor){div.style.display = "none";}else{div.style.display = "block";}}}var spans = document.getElementById("nav").getElementsByTagName("span");for (var i=0; i < spans.length; i++ ) {var span = spans[i];if ( (span.id != "")) {if(i != stor)span.className = "none";elsespan.className = "selStory";}}}
由於有一些新的樣式,我們需要把它們新增到樣式表裡:
#nav { font-size:12px;position:absolute;top:100px;left:325px;} .selStory {background:#eee;border:1px solid #777;}
完成了,我們功能完備的旋轉木馬已經完成了,在這裡可以檢視完整的程式碼。
加入效果——讓它看起來真的很酷
有了這個原型我們就可以真正地加入效果了,這樣至少我們能夠看到與在Flash裡一樣的效果。
再經過一些有創意的工作,我確信你創造的旋轉木馬一定會比我在倉促之間創造的要好。
什麼時候不用JavaScript
知道什麼時候使用JavaScript還不夠,要取得最好的結果,你還需要知道什麼時候不用JavaScript。你希望獲得的效果越高階,使用JavaScript的優勢就越少。
在最新和最眩目的效果上,JavaScript是絕對不是Flash的對手,Flash在獲得相同效果所需要的時間上是其他產品無法比擬的。
如果你需要使用視訊,那麼flv是用於Web的最佳格式。這就是為什麼YouTube和Google Video都使用Flash播放器的原因。
一旦你開始越來越多地使用JavaScript,瀏覽器之間的差異就會顯得越明顯。解決這一問題的一個重要途徑是將平臺標準化,這也就是Flash所適應的標準化平臺。
結論
做到這一步需要花上一點功夫,也需要多喝幾杯咖啡,但是可以結束了。
要記住的一件事是,如果你最終決定把Flash替換掉,那麼你就和想要使用Flash的人差不多了。
如果你所需要的只不過是簡單的旋轉效果,那麼JavaScript可能就是你的不二選擇,如果你需要高階的動畫以及各種視覺效果,那麼還是使用Flash吧。
記住用合適的工具完成合適的任務。