談談ScrollBar對Mobile Web Design的使用建議

談談ScrollBar對Mobile Web Design的使用建議

撰寫該篇文章時,主要的是因為在研究Mobile Web Design過程中所遇到的一個問題:

「想要在手機螢幕上,固定Header 與 Footer的部分,然後中間的部分可以支援Scroll的功能」,

其實這樣的功能在一般iPhone的App上是很容易看到的,在製作桌上型的Web Site也是很常用到的,

但在製作Mobile Site時,其實要固定Header或Footer並非難事,只是需要透過計算的方式來算出中間的區域。

例如:

(1) 定義三個<div>範圍

1: <body>
2:     <form id="form1" runat="server">
3:         <div id="Header"></div>
4:         <div id="Content"></div>
5:         <div id="Footer"></div>
6:     </form>
7: </body>

(2) 利用JavaScript進行Content的Width與Height計算

1: function SetHeight() {
2:     var headerH = document.getElementById('Header').offsetHeight;
3:     var footerH = document.getElementById('Footer').offsetHeight;
4:     var contentH = 0;
5:     var tUserAgent = navigator.userAgent;
6:     //由於Windows Phone不支援windows.innerHeight語法,改用screen代替
7:     if (tUserAgent.indexOf("Windows Phone") != -1) {
8:         contentH = screen.availHeight - headerH - footerH;
9:     }
10:     else {
11:         contentH = window.innerHeight - headerH - footerH;
12:    }
13:    document.getElementById("Content").style.height = contentH + "px";
14: }

 

但問題來了,固定了Header與Footer後,中間可以使用的大小變的非常小,舉例來說:一個480x800的ScreenSize,

扣掉Browser的Address Bar與下方的ToolBar,已經剩下沒有很多的空間了,再加上扣掉Header與Footer,剩下的空間

只剩也許不到400px。如下圖:

Screen18

為了讓Content範圍內能夠放入豐富的內容,但又要在這小範圍之中,就需要透過ScrollBar的功能來完成了。然帀,

透過ScrollBar確實可以滿足讓Content範圍內塞進一個Page的資料,但非常可惜的是:iPhone與Android沒有ScrollBar

不會看到ScrollBar出現在畫面上,但其實並非真的沒有,只是WebKit底層換了個方式,改用Touch Event的註冊

讓整個Screen具有Scroll的功能,隨著用戶手指的上下滑動,來觸發Screen內容的移動。

如下圖示:

Screen19

那如果想要在iPhone或Android手機中,在指定的範圍內使用到ScrollBar的效果呢?這也不是沒有辦法可以解決。

(1) 自訂ScrollBar功能,包括實作ScrollBar的UI與功能 – jScrollPane

透過<jScrollPane - Basic examples>可以看到一些基本實作ScrollBar的範例,裡面包括了一些Sample Code可以協助你

自訂成需要的功能。裡面的範例目前測試下來的結果,也是可以正常顯示於iPhone與Android系列的手機上。

但是,問題又來了,如下圖示:

Screen20


可以發現到雖然有ScrollBar的功能出現,但少了一個很重要的功能,那就是:

「點選ScrollBar中的方格進行拖曳來移動內容的功能,失效了。」

沒有這項功能,也許你會說,那我多增加像一般ScrollBar中有往下與往下的鍵號就可以了。

確實這樣的方法可以解決,但對於使用過iPhone與Android的用戶而言,其實這樣的作法,

根據我開發的經驗,用戶是不太能接受的。因此,該方法只能解決我們部分的問題,

不能完全解決我們的需求。

 

因此,就讓我們往下看一下第(2)個方法來試試。

 

(2) 使用第三方元件 - Scrolling div on iPhone/iPod Touch (iScroll)

iScroll是針對WebKit核心所開發支援iPhone與Android這類系統的第三方元素,它提供透過JavaScript與Css的配合,

讓指定<div>範圍在固定的Width與Heigh下,可以有與iPhone與Android系統那種原生ScrollBar功能的效果(如圖2)。

範例程式如下:

1: function loaded() {
2:     //為document註冊touchmove的事件,當用戶對整個document做touchmove的事件時,會沒有效果(preventDefault()方法的作用)
3:     document.addEventListener('touchmove', function(e){ e.preventDefault(); });
4:     //myScroll中使用的'scroller'就是指定要有ScrollBar功能的範圍ID
5:     myScroll = new iScroll('scroller');
6: }
		7: document.addEventListener('DOMContentLoaded', loaded);

上述程式碼的運作原理:

主要的是在DOMContent載入後,為document設定touchmove的EvetnListener,並指定對應的處理方法:preventDefault()

該方法會取消原本document具有的touchmove功能,也就是整個Page已經沒有辦法透過上下移動來瀏覽內容了;

另外透過 new iScroll(指定的ID),設定固定的<div>具有ScrollBar功能(也就是為<div>註冊了touchmove的EventListener)

這樣用戶就可以在指定的範圍內放入豐富的內容,並且透過iScroll的功能瀏覽 。

如下的範例:

Screen21 Screen22

iScroll還提供更多豐富的功能,大家可以參考<Scrolling div on iPhone/iPod Touch>裡的介紹,裡面也包括每個屬性的使用

會對iScroll的對象產生其他有用的支援。

 

然而,touchmove這類事件還有相關的類型,可以參考<Touching and Gesturing on the iPhone>該篇提供了相關的定義與範例。

但是在使用iScroll的時候,我發現了一個要注意的問題:

a. iScroll的preventDefault使用時要特別小心

上述提到preventDefault()該方法會取消原生網頁瀏覽時touchmove支援上下移動畫面的功能。如果你今天設計的內容裡,

如果沒有使用固定Header、Footer,而只是用於特定的元件時,請記得把下列程式先取消掉,不然會發生整個Page沒有辦法

上下移動的問題

1: document.addEventListener('touchmove', function(e) { e.preventDefault(); }, true);

 

b. iScroll沒有辦支援巢狀式iScroll的使用情形

巢狀iScroll的應用是什麼意思?也就是目前在指定使用iScroll的區域內,又在引入其他具有iScroll的元件,形成雙層的iScroll。

例如下圖的需求:

clip_image001

透過雙層的iScroll在Android或iPhone上會變成什麼樣子呢?

clip_image002(Android) Screen27 (iPhone)

在Android的平台上顯示是沒有問題的,它可以支援二個iScroll重疊在一起使用;可是iPhone平台下,你可以看到

第二層的iScroll裡資料全部溢出到第一層外了,其實主要原因,我自己是認為在iScroll中使用的Css屬性有問題:

1: .wrapper
2: {
3:     height: 200px;
4:     position: relative;
5:     z-index: 1;
6:     width: 100%;    
7:     overflow: hidden;
8: }

裡面使用了「z-index: 1」與「position: relative」這二個會造成位置變動的Css屬性,可能造成Browser在Render的時候

沒有辦法做正確的識別造成的問題。但這只是我的假設啦,不過這樣的問題,我也有反應給製作者了。也許不久他

就會提供支援的功能。

 

那也許你會問:那其他Browser呢?Symbian S60、Opera Mobile/Mini或是Internet Explorer呢?

這些Browser都具有ScrollBar的功能,但功能最接近熟悉於桌上型應用的是Internet Explorer與Symbain S60,為何我會

說Opera Mobile/Mini不是最接近的呢?透過下方的圖示就可以了解:

Screen25 Screen26

*在Opera Mobile/Mini中使用ScrollBar,只要你開啟「overflow-y: auto; overflow-x: auto」,它Opera會自動加上ScrollBar的UI

然而,你會發現ScrollBar的Y軸竟然是全部完全展開,而不是在你限制的範圍內才有ScrollBar。

這個問題困擾我很久,我也還沒找到可行的解法,如果有人遇到希望可以指導我一下。謝謝。

 

上述只是說明了ScrollBar用於Mobile Browser上的差異。對於如何設計一個用戶最統一能接受的Mobile Web,其實目前我

還沒有找到一個固定的答案,只有幾個我從製作與設計Mobile Web的經驗,所得到的一些建議:

(1) 分析Mobile Web主要用提供的目的與功能

此點是最重要的,由於與客戶談論Mobile WebSite的建製時,通常客戶的需求會把「WebSite想成Mobile App」或者是把

「Desktop WebSite 等於 Mobile WebSite」;當用戶把這二個混進Mobile WebSite時,其實就很難設計一個會讓用戶滿意的產品。

因此,建議先跟客戶仔細研究出他們腦裡的Mobile WebSite,如果客戶沒有Idea的話,可以製作一些常見的雛形系統作為參考,

另外,將他需要該產品主要完成的目的與功能清單式的列表出來,並且找出這些功能之間的關聯性

為何需要這樣?=>「因為用戶會習慣的把App互相串聯的觀念帶進來,想要合進來使用於Mobile WebSite中。」,這個是非常

可怕的,因為這會影響你在設計網站的結果與後端要處理邏輯間的限制,因此,最好在一開始就把它找出90%。

 

(2) 分割不同的顯示內容,將複雜的操作變成一連串的精靈式操作流程

Desktop WebSite中有很多複雜的操作都可以透過Keyboard與Mouse的配合來完成,但對於Mobile WebSite而言就不是如此,

由於並非所有裝置都有實體的QWERTY或滾輪,因此,太複雜的動作,最好不要放在同一個Mobile WebSite Page中。

因為這樣會讓用戶不斷地「上下推移、輸入、上下推移、輸入、點擊」,重覆的上下推移對於用戶而言,在Form型的表單輸入

是最困擾的事情,因此,建議把太複雜的操作,進行分類與切割,形成一個連串性的操作流程,讓用戶可以在一個Page就

完成該Page提供的事件,最後在一次呈現出來,簡化用戶處理的步驟。這樣的操作,可參考iPhone App的設計方式

 

(3) 避免巢狀式內容的呈現,並且減少過長的文字欄位

所謂的巢狀式內容,舉個例子來說:就像我們的Desktop WebSite中,通常會用到<iFrame>來引入外部或指定的網頁內容,

但如果這個引入的網頁內容過長,通常又會產生自身的ScrollBar。問題來了,這樣就出現了:「雙層的ScrollBar」,

在Desktop上可以透過Mouse來選擇要移動的ScrollBar,但在Mobile WebSite呢?我想大家都非常清楚,該畫面是非常複雜的。

因此,建議把需要外部引入的內容,獨立一個畫面讓它引入,因為這樣可以讓用戶更清楚的得到完整的內容與基本的操作

並且,透過JavaScript開另一個視窗再把新視窗的值帶回來舊的畫面是很常見的做法(但要小心Opera Mini或UCWeb它們會壓

縮JavaScript Code,容易造成有些自訂的JavaScript方法與功能失敗),所以獨立單一個畫面是比較好的作法。

 

另外,在Desktop WebSite我們會用<TextArea>來讓用戶輸入他們要備註或較長的內容,在Mobile WebSite上,根據設計的經驗

告訴我,用戶通常不會輸入超過30個中文字(英文除外),主要原因是輸入鍵盤過於狹小,或者是欄位超過Screen Size造成輸入

時,畫面會不斷地移動造成輸入上的不便。因此,建議減少過長的文字欄位,這樣一來可以避開用戶輸入時的不方便與顯示

的不整理,另外,除非真的需要,不妨把<TextArea>大量需要輸入的文字也獨立成一頁,讓用戶輸入後在帶回原畫面。

這樣可以讓用戶專心輸入文字,而畫面也夠大讓他處理他要的任務。設計方法可以參考一般Mobile SMS App的設計方式。

 

(4) 圖示與流量的取捨,也會影響瀏覽器的使用選擇

由於Mobile WebSite強調用戶可以在不同的網路環境下使用,因此,為了讓Mobile WebSite有個好的UI而去使用大量的圖示,

使用圖示會遇到的問題就是瀏量,由於圖示是沒有辦法透過IIS壓縮而變小的,因此,在3/3.5G的網路下容易會讓網頁程式

出現「回應時間過長」的問題。因此,有一些瀏覽器就有支援圖示品質或是是否載入圖片的選項,例如:Opera Mini/UCWeb,

它們會透過各自的Mini Server或UCWeb Server將要轉給Mobile裡的圖示進行壓縮轉成比較低解析的圖示再傳給用戶,降低流量。

但這就會影響Mobile WebSite設計的目標,如果Mobile WebSite要提供的功能會用到圖示時,就會造成不便。

因此,建議二個做法:

(1) 在Mobile WebSite設計時,減少圖示的使用;如真的需要,可以盡量使用RGB色系能解釋的內容,太複雜圖檔就變大。

(2) 選擇適用的Browser。可先了解用戶常用的Browser是屬於何種,這將會影響最後用戶的使用經驗。

 

以上是個人在開發Mobile WebSite的一些經驗。希望對大家在開發Mobile WebSite的時候會有所幫助。

至於要不要使用ScrollBar於特定的範圍或元件上,就要看你是否真的需要用到這樣的功能了。

 

References:

Beginning Smartphone Web Development: Building Javascript, CSS, HTML and Ajax-Based Applications for iPhone, Android, Palm Pre, Blackberry, Windows Mobile and Nokia S60

jScrollPane

WAP CSS / WCSS Tutorial

Scrolling div on iPhone/iPod Touch

Touching and Gesturing on the iPhone

 

Dotblogs 的標籤: