去年上半年,我開(kāi)始著(zhù)手推動(dòng)項目中響應式設計的落地。以官網(wǎng)優(yōu)化需求為契機,主動(dòng)去做了響應式的頁(yè)面設計,也說(shuō)服了產(chǎn)品、設計和開(kāi)發(fā)的相關(guān)同事一起把它上線(xiàn)落實(shí),但不幸的是,由于各種方面的原因,比如,生搬硬套的PC模塊,無(wú)差異化的設計使得移動(dòng)端閱讀不佳,導航兼容性有限等等原因,上線(xiàn)幾個(gè)月后又悄然下線(xiàn)。我不禁反思,項目中是否應該推行響應式?今年年初重新啟動(dòng)了全站響應式項目,從產(chǎn)品、交互、視覺(jué)到開(kāi)發(fā),各個(gè)角色全方面參與了響應式項目,最終門(mén)戶(hù)的頁(yè)面實(shí)現全面響應式。在項目過(guò)程中有技術(shù)沉淀,也有不少的思考,也就有了以下的文字。文章的內容圍繞四個(gè)方面,響應式的概念,實(shí)踐方法,一些案例,以及一些看法。
Ehan Marcotte 為A List Apart寫(xiě)過(guò)一篇介紹型的文章 <響應式網(wǎng)頁(yè)設計> 。文中講到響應式的概念源自響應式建筑設計,即房間或者空間會(huì )根據其內部人群數量和流動(dòng)而變化。
[最近一門(mén)新興的學(xué)科“響應式建筑(responsive architecture)”開(kāi)始在探討物理空間根據流動(dòng)于其中的人進(jìn)行響應的方法。建筑師們通過(guò)把嵌入式機器人與可拉伸材料結合的方法,嘗試藝術(shù)裝置和可彎曲、伸縮和擴展的墻體結構,達到根據接近人群的情況變化的效果。運動(dòng)傳感器與氣候控制系統相結合,調整圍繞人們周?chē)姆块g的溫度以及環(huán)境照明。已經(jīng)有公司制造了“智能玻璃技術(shù)”,當室內人數達到一定的閥值時(shí),它可以自動(dòng)變?yōu)椴煌该鳡顟B(tài),為人們提供更多隱私保護。]
Web響應式設計的概念與之也非常相似。在如今技術(shù)飛快發(fā)展的時(shí)代,一向是以快論英雄,設備和分辨率日新月異,就以分類(lèi)相對明晰的iPhone為例,就有多達4種的分辨率和屏幕尺寸,更別提廠(chǎng)商蓬勃發(fā)展的安卓機領(lǐng)域。因此,為每種設備或者特定設備分辨率制定相應的獨立版本是非常費時(shí)費力的事情。
Web響應式設計的理念,應當是,頁(yè)面可以根據用戶(hù)的設備環(huán)境,包括系統,分辨率,屏幕尺寸等等因素,進(jìn)行自發(fā)式調整,提供更適合當前環(huán)境的閱讀和操作體驗,對已有和未來(lái)即將出現的新設備有一定的適應能力。
有了概念,一定要談?wù)剬?shí)現的方法。類(lèi)似于響應式建筑,Web頁(yè)面也有對應關(guān)鍵因素。
可彎曲、伸縮、擴展的墻體結構——可擴展的布局;
運動(dòng)傳感器——MediaQuery;
氣候控制系統——柵格;
藝術(shù)裝置——css等等。
以上給了我寫(xiě)文章的脈絡(luò )結構靈感,于是先從最基礎的布局談起。
有一種流體布局的概念在早起web興起的時(shí),就開(kāi)始盛行了。它的概念是說(shuō)頁(yè)面會(huì )根據瀏覽器窗口的變化進(jìn)行更改,網(wǎng)站可以通過(guò)維護一套代碼,保質(zhì)一致性的設計。我這里強調的可擴展的布局也是基于這個(gè)概念,只是現在的方法多種多樣,因此要強調頁(yè)面布局的可擴展性。
可擴展的布局途徑有很多,比如常見(jiàn)的百分比布局,以及一直未成為標準的柵格布局等等。
框架
就從這框架來(lái)說(shuō),以一個(gè)常見(jiàn)的可擴展的三欄布局為例,就有數十種方法,這里拋磚引玉舉幾個(gè)例子。
方法1:
方法2:
方法3:
方法4:
方法5:
方法6:
方法7:
方法8:
方法9:
除了上述總結的幾種,還有更多更多的方法。兩欄布局同理就不贅述。
此外W3C也有一個(gè)柵格化布局(Grid Layout)的規范,這個(gè)布局是基于兩維柵格系統設計的,可以輕松按照我們的意愿改變頁(yè)面的設計。它與Flexbox配合效果更佳。但目前仍處于草案階段。翻看了W3C的最新草案內容,對Grid Layout的使用方法和原理簡(jiǎn)單介紹下。
1)定義grid:
首先在grid item外的父級容器上定義display: grid.
Values:
grid – 定義block-level的柵格;
inline – 定義 inline-level的柵格
2)一些相關(guān)概念:
grid lines – 是橫向和縱向劃分grid的線(xiàn),它可以一朝數字順序被指定,也可以用用戶(hù)制定的名字被指定。
grid tracks – 指的是一個(gè)grid列或者行之前的區域,換而言之是兩個(gè)相鄰的grid lines之前的空間。下圖是第二行和第三行之間的grid tracks。
grid cells – 一個(gè)grid cell指的是grid中最小的單位。
grid areas – 是用來(lái)展現一個(gè)或多個(gè)grid item的邏輯空間。它被四條grid line包圍。
3)grid item 屬性
了解了一些基本概念后,就可以更加絨里理解相關(guān)的grid item屬性。
grid-column-start
grid-column-end
grid-row-start
grid-row-end
這四個(gè)屬性中,grid-column-start和grid-row-start指明區域起始線(xiàn),grid-column-end和grid-row-end指明區域結束線(xiàn)。這四個(gè)屬性均有以下四個(gè)值可取。
Values:
<line> – 可以是一個(gè)數字,代表的是 grid line
span <number> – 該項會(huì )橫跨所提供的數字個(gè)grid tracks
span <name> – 該項會(huì )橫跨直到碰到下一個(gè)指定名字的grid line
auto – 自動(dòng)或者默認屬性
舉個(gè)例子:
代表的區域就是:
除以上提到,grid還擁有更多的屬性,使之可以定義grid item的寬高,間隙,內部自適應的方式,對齊方式等等。更多屬性可以參考W3C文檔。
4)瀏覽器支持:
令人遺憾的是,瀏覽器的支持度還未盡人意,未來(lái)在UA上獲取更多支持才是Grid發(fā)展的根本。
框架搭建好,才僅僅是響應式的開(kāi)始。但是俗語(yǔ)有云:Well begun is half done. 響應式從做好的布局開(kāi)始。