響應式網頁設計的靈活性
過去的一年里,如果你不是住在深山里,就一定知道響應式網頁設計,它已經成為當今的主流。響應式設計是Ethan Marcotte提出的,概念很簡單:使網站的頁面布局能夠根據不同設備和分辨率進行自動調整。
當我第一次了解到它時,我就立即被迷住了--特別是media queries,我馬上就用到我自己的個人兼職網站上。我甚至寫了一篇文章介紹《如何使用CSS3 Media Queries響應不同設備》(強烈建議在讀這篇文章之前讀一下)。
在第一次嘗試使用media queries后,我很快意識到我忽略了一個響應式設計的重點: 靈活性。
挑戰(zhàn)固定寬度
我的個人兼職網站使用了固定寬度的設計,所有的width, margin和padding都使用了固定的像素值。 我一般都會這樣寫網站,因為對我來說它更簡單,更快速。
但當我試圖在我的固定寬度的網站上應用media queries的時候,那些簡單和快速的優(yōu)勢全部都消失了。為什么?因為對于固定寬度的設計,我需要非常細致的定義media queries并在CSS文件中調整每個單獨的像素值,基本上,我需要為每一種可能的分辨率都設計一個全新的布局,繁瑣!慢!!還不好玩!!!
我有幸聽了Marcotte先生在《In Control 2011》的演講,他討論了響應式設計的理論和最佳實踐,諸如fluid grid(流體網格)實現方式。
流動且靈活的公式
流動式布局是靈活的。由于width,margin和padding(甚至字體和圖像)使用了百分比和em(相對長度單位),因此頁面布局會隨著瀏覽器的窗口變化而變化。隨著分辨率的改變,布局會成比例地進行調整,實現過程中不需要用到任何media query。
這對于實現響應式網頁設計來說簡直太美妙了。如果我有一個基于比例值的布局,流動式的網格將替我完成大部分繁重的工作。我的media query將不再需要包含那些覆蓋其他分辨率的所有width, margin和padding的樣式定義。
但是也有一點讓我感到頭疼,計算流動式網格的比例寬度需要用到一些數學知識,我數學不太好…
幸運的是, Ethan 提供了一個很簡單(即便對我來說)的公式來計算比例寬度:
目標寬度÷上下文寬度=結果(比例寬度)
這個公式用子元素的像素寬度(目標寬度)除以它父元素的像素寬度(上下文寬度),得到的結果就是這個子元素的比例寬度。
圖1 實例:目標寬度(300px)和上下文寬度(960)像素
在圖1中,例如,深灰色區(qū)域寬度為300px,包含在寬度為960px的淺灰色區(qū)域中.這里,960像素區(qū)域是上下文元素,300像素區(qū)域是目標元素,所以我們的數學公式是: 300 ÷ 960 = 0.3125
0.3125這個結果需要變成瀏覽器可識別的數值, 因此需要轉化成一個比例值, 將小數點右移兩位,變成31.25% 即可。然后在CSS中,將元素的寬度設定為這個比例值:
aside{ background-color:#ccc; float:left; width:31.25%; }
測試一下
公式雖然看起來很簡單,但我知道必須在實際的網站中檢驗一下才行。幸運的是,我最近加入了EE播客,正在重新設計那個網站。當我的搭檔給我她的 PS 設計文件時,我就決定將它打造成靈活布局的網站。
比例寬度
我首先記錄下所有元素的像素寬度。(在排版設計事,我們沒有嚴格遵循網格布局,這也是我建議的做法)正如你在圖2中看到的。整體寬度為940像素,Logo,主持人介紹和分享鏈接都有它們各自的像素寬度。
圖2 主頁和頂部導航元素的像素寬度
按照 Ethan 的公式,整體寬度940px就是我的上下文寬度,根據它就可以確定所有元素的比例寬度.
Logo: 240 ÷ 940 = .255319148
主持人介紹: 436 ÷ 940 = .463829787
分享鏈接: 90 ÷ 940 = .09574468
隨后我將這些浮點值轉換成百分比值,運用到我的CSS中:
#logo a{ width:25.5319148%;/*240px/940px*/ } #hosts{ width:46.3829787%;/*436px/940px*/ } #push{ width:9.574468%;/*90px/940px*/ }
我沒有對這些百分比值進行四舍五入,而是直接運用在CSS中。我也從來沒有遇到過任何瀏覽器對這樣精度的百分比值識別錯誤的情況(包括IE)。
同時,我為每一個百分比值都注釋了計算它所用到的目標寬度和上下文寬度,這對于今后的開發(fā)來說是非常重要的參考。
確保你的上下文寬度是正確的
只要你的數學計算是正確的,那么將寬度值轉化為比例值的過程就是很簡單的,或者,更具體地說,只要你的上下文寬度是對的,那么你得到的比例值也就是正確的.
實戰(zhàn)中, 我通過計算得到的比例值很少會出錯,除非我將上下文寬度搞錯了。
像圖3中標示,主持人信息是一個包含
但是這個比例值(12.0833333%)不是我要的正確尺寸.直到我意識到我的上下文寬度是不同的,我才得到了正確的比例值.
如果你計算的比例寬度有任何問題,請先檢查一下選定的上下文寬度是否正確,這會幫你省不少事。
我將ee-podcast.com變得更加“靈活”的第二步是使用比例字號,它和比例寬度的道理是相同的:將固定的像素值變成比例值,字體的比例值使用em進行計算.
要計算比例em,使用相同的公式(目標寬度 ÷上下文寬度 = 結果)即可,字體的上下文寬度就是它基本字號,通常在body元素中定義:
body { font: 100%/1.5 "Open Sans",Arial,Helvetica,sans-serif; }
大多現代瀏覽器的基本字號是16px,如果你設定的比例字號是100%,字號同樣也是16px.
現在,我們來考慮一下主持人名字的字號,在版式設計時設定的是12px,使用公式12÷16=.75就得到了它的em值。這個浮點數不用轉換成百分比值就能直接在CSS中使用:
#hosts dd{ font-size:.75em;/*12px/16px*/ }
對于padding和margin來說,那個神奇公式同樣有效. 讓我們考慮一下主持人信息當中,右margin被設定為20像素的
#hosts dt{ margin-right:4.5871559%;/*20px/436px*/ width:26.6055045%;/*116px/436px*/ }
ee-podcast.com的主區(qū)域(如圖4所示)的寬度為940px,同時左右各有40px的橫向padding。我使用目標寬度(40px)除以上下文寬度(940px)得到它們的比例寬度:
這個公式對于橫向padding比例寬度的計算有一個特例:對于padding而言,上下文元素永遠都是這個元素本身,無論父元素的寬度是多少。
例如圖5所示的分享鏈接,文字左側均有25像素的橫向padding來放圖標.
計算此padding的比例值時,應將這個元素本身的寬度(90px)作為上下文寬度,而不是父元素的寬度940px.(圖2)
#push li a { padding-left: 27.7777777%; /* 25px / 90px */ }
到目前為止,我們已經嚴謹地計算了左右的水平值,但是我們在x軸和y軸方向都會設定padding和margin,這就意味著,上下文寬度應該依據水平或垂直方向而變化。
正如你之前看到的那計算,水平方向的百分比值,都是以父元素的寬度作為上下文寬度的(padding是除外)。與此同時,縱向em值是以基本字體大小作為上下文值的。
-
,這些元素的寬度值各不相同.
本文地址:http://m.likemindfilms.com/tutorial/di1691.html