談一談響應(yīng)式布局的技巧

寫(xiě)在前面的話(huà)


響應(yīng)式(responsive)逾柿,顧名思義馋吗,就是物體自身具備能夠適應(yīng)各種不一樣環(huán)境的能力缺猛,而網(wǎng)頁(yè)的響應(yīng)式布局就好比把一杯液態(tài)的網(wǎng)頁(yè)倒進(jìn)各種大小不一樣的玻璃瓶里拷沸,不管是從哪個(gè)角角度上看去,頁(yè)面的形態(tài)都是那么的自然消玄,那么的合理跟伏。響應(yīng)式的網(wǎng)頁(yè)看上去會(huì)比傳統(tǒng)的pc頁(yè)面“聰明”一點(diǎn),它們知道如何把自己體面的塞進(jìn)各種尺寸不一樣的移動(dòng)端設(shè)備里面翩瓜,用更親民的呈現(xiàn)方式受扳,讓拇指一族們愛(ài)不釋手。它們可以“偽裝”得像原生手機(jī)App那樣展現(xiàn)出同樣流暢兔跌,華麗的交互體驗(yàn)勘高,甚至還能披上App的外衣,為了hybrid app的榮譽(yù)與native app一戰(zhàn)坟桅!響應(yīng)式的潮流還在不斷的前進(jìn)华望,趁著這個(gè)熱度,就來(lái)談一談響應(yīng)式布局的技巧仅乓。

打開(kāi)響應(yīng)式門(mén)的鑰匙


The key赖舟, 一般都是在講某個(gè)概念的關(guān)鍵核心部分,那么the key of responsive一定離不開(kāi)CSS3里面的Media Query夸楣,也就是常說(shuō)的“媒體查詢(xún)”宾抓。所有接下來(lái)要提到的布局技巧都是在media query的基礎(chǔ)上建立的,當(dāng)然你完全也可以通過(guò)代碼的方式來(lái)做到和媒體查詢(xún)同樣的效果{if(你不嫌麻煩)}豫喧。媒體查詢(xún)的工作原理很簡(jiǎn)單:設(shè)置斷點(diǎn)石洗,分不同區(qū)間,以像素為單位紧显,設(shè)備的寬度屬于哪個(gè)區(qū)間就套用哪個(gè)區(qū)間的樣式讲衫。舉個(gè)栗子:

@media screen and (min-width: 320px) and (max-width: 768px) {
  .submit {
    ......
  }   
}

上面設(shè)了兩個(gè)斷點(diǎn),理論上是可以有三個(gè)區(qū)間鸟妙,即[0,320]焦人、[320,768]、[768,沒(méi)上限]重父,而上面的樣式則會(huì)套用在寬度在[320,768]范圍里的設(shè)備中花椭,這些設(shè)備一般包括iphone,ipod以及ipad豎屏房午。通過(guò)media query我們完全可以針對(duì)不同尺寸的屏幕大小矿辽,來(lái)定制我們想要的布局。

響應(yīng)式布局的幾種方法


頁(yè)面元素寬度基于百分比的響應(yīng)式

這是最常見(jiàn)也是最基礎(chǔ)的做法郭厌。在非響應(yīng)式的pc端網(wǎng)頁(yè)中袋倔,從設(shè)計(jì)圖開(kāi)始,頁(yè)面中的每個(gè)元素都被設(shè)置好了固定的寬度折柠,無(wú)論怎樣改變窗口的大小宾娜,頁(yè)面中各元素的布局與大小始終保持與設(shè)計(jì)稿設(shè)一致。而到了移動(dòng)端的尺寸扇售,我們需要通過(guò)設(shè)置斷點(diǎn)前塔,基于移動(dòng)端的設(shè)計(jì)稿,重新改變pc端原有的布局承冰。但問(wèn)題是华弓,移動(dòng)端的設(shè)計(jì)稿往往只出一份(基于一個(gè)通用的尺寸),然而市面上移動(dòng)端設(shè)備的尺寸困乒、分辨率參差不齊寂屏,設(shè)計(jì)師也不可能細(xì)微到為每個(gè)不同的設(shè)備出一份精確的設(shè)計(jì)圖。因此娜搂,為了能夠讓頁(yè)面得體的顯示迁霎,頁(yè)面元素的寬度會(huì)被設(shè)置成百分之多少,以確保各個(gè)元素的大小可以基于一個(gè)比例輸出百宇。

1.png

上圖看做是一個(gè)在768px寬度(ipad豎屏)下的一個(gè)頁(yè)面欧引,其中包含了 頂部導(dǎo)航(灰色)、頁(yè)面頭圖(藍(lán)色)恳谎、頁(yè)面主體(紅色)以及頁(yè)腳(棕色)芝此。每個(gè)色塊的寬度都設(shè)置成百分比的寬度,這使得元素在其他的尺寸下同樣可以以這個(gè)比例顯示:

iphone5:
iphone5.png
iphone6:
iphone6.png

而每個(gè)色塊的高度則以其包含的內(nèi)容的主體來(lái)做對(duì)應(yīng)的調(diào)整:

  • 如果色塊里面包含的是圖片因痛,例如圖中的藍(lán)色部分婚苹,其高度可以是基于原圖寬高比保持比例輸出的。
  • 如果色塊里面包含的只有文字鸵膏,例如藍(lán)色部分里面都是文字膊升,在這種情況下,高度不需要保持比例谭企,讓里面的文字自適應(yīng)填充就好廓译。
  • 如果色塊的主要作用是用于布局评肆,里面還包含例如圖片、文字等其他元素非区,其寬高比瓜挽,最好保持與設(shè)計(jì)稿的比例一致,這里就需要用到媒體查詢(xún)征绸,來(lái)維護(hù)一致的寬高比久橙。例如,假設(shè)ipad下顯示紅色塊的寬高比就是設(shè)計(jì)圖上的比例管怠,那么iphone下為了保持一致淆衷,紅色塊就不應(yīng)該那么‘扁高’了。

元素寬度基于百分比的布局保證了頁(yè)面的響應(yīng)式渤弛,然而在設(shè)置這些百分比的數(shù)值時(shí)祝拯,我們需要根據(jù)色塊所占據(jù)每行的列數(shù),來(lái)計(jì)算他們各自所占的百分?jǐn)?shù)她肯,這其中可能還會(huì)考慮到彼此之間的間距鹿驼。例如圖中紅色部分的色塊,在設(shè)置寬度百分比的時(shí)候辕宏,我們甚至還要把其中的間距也要用百分比來(lái)表示畜晰,這其中的計(jì)算難免會(huì)出現(xiàn)錯(cuò)誤。倘若我們不把這些常用到的比例歸納成常用的class使用瑞筐,而是直接寫(xiě)上數(shù)值(代碼中會(huì)出現(xiàn)大量%單位的數(shù)值)凄鼻,這不僅會(huì)顯得繁瑣,且大大降低代碼的維護(hù)性聚假。此外块蚌,我們可能希望這種百分比的布局更加靈活,譬如上圖紅色塊里膘格,在如此狹小的手機(jī)屏幕上顯示2列甚至是3列已經(jīng)是相當(dāng)擁擠了峭范,這時(shí)候我想制定一套規(guī)則,讓這些元素的布局可以在狹小的空間里顯示一列瘪贱,而在更寬的空間里才顯示2列纱控、甚至3列。有沒(méi)有什么方法菜秦,可以讓隨心所欲的去定制這么一套規(guī)則甜害,而不需要去計(jì)算這些百分比寬度與間距,能不能只需把關(guān)注點(diǎn)放在每行顯示多少列球昨,而這一列該占多少比例就可以了尔店?答案是有的,bootstrap的柵格系統(tǒng)正是為了解決這些問(wèn)題而應(yīng)運(yùn)而生。

柵格系統(tǒng)

bootstrap的柵格系統(tǒng)天生就是為響應(yīng)式布局而生的嚣州。這個(gè)系統(tǒng)會(huì)隨著屏幕尺寸的變化鲫售,自動(dòng)為占據(jù)屏幕的每一行分為最多12列。

柵格系統(tǒng)用于通過(guò)一系列的行(row)與列(column)的組合來(lái)創(chuàng)建頁(yè)面布局该肴,你的內(nèi)容就可以放入這些創(chuàng)建好的布局中情竹。柵格系統(tǒng)非常貼切網(wǎng)頁(yè)的內(nèi)容以一種從上到下一行一行排布的形式,以格子為單位拼湊成你需要的布局沙庐。換句話(huà)說(shuō),任何網(wǎng)頁(yè)里的布局佳吞,都可以將其柵格化拱雏,除此之外,我們甚至可以利用柵格系統(tǒng)來(lái)制定其在不同尺寸下的不一樣的布局底扳。

關(guān)于柵格系統(tǒng)的具體用法铸抑,可以參考下bootstrap里的官方介紹,在這里我舉個(gè)簡(jiǎn)單的例子用來(lái)展示其強(qiáng)大之處:
首先看一段代碼:

<div class="row"> 
  <div class="col-xs-12 col-sm-6 col-md-8">.col-xs-12 .col-sm-6 .col-md-8</div> 
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
</div>
<div class="row"> 
  <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div> 
  <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div> 
  <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
</div>

首先說(shuō)明的一點(diǎn)衷模,上面代碼里出現(xiàn)的類(lèi)名如果需要其生效鹊汛,必須要引用到bootstrap的css代碼。接下來(lái)有人一定會(huì)吐槽阱冶,尼瑪這些帶類(lèi)名都是些神馬刁憋,放那么類(lèi)名用來(lái)布局,你在逗我玩木蹬?不急不急至耻,待我慢慢道來(lái):

  • 首先,柵格系統(tǒng)的基本框架是這個(gè)樣子的:
    <div class="container">
      <div class="row">
        <div class="col-..."></div>
        ...
      </div>
    </div>
    
    也就是說(shuō)镊叁,柵格里的每一行必須要被包裹在一個(gè)container的類(lèi)里尘颓,和列相關(guān)的類(lèi)只能被包含在row的類(lèi)里。
  • 接著晦譬,讓我們徹底剖析下這個(gè)類(lèi)名col-xs-12疤苹,從左到右來(lái)吧:
    col:表示該項(xiàng)是一個(gè)列
    xs:是bootstrap柵格系統(tǒng)里用于表示適用于小屏幕尺寸的一個(gè)斷點(diǎn)(<768px)標(biāo)識(shí)符,也就是說(shuō)敛腌,類(lèi)前綴為.col-xs的樣式會(huì)在小于768px的屏幕寬度下生效卧土。除了xs,柵格系統(tǒng)里還有sm像樊、md夸溶、lg,它們對(duì)應(yīng)的斷點(diǎn)分別是:>=768px凶硅,>=992px缝裁,>=1200px。因此,只有在滿(mǎn)足這些斷點(diǎn)條件的情況下捷绑,其對(duì)應(yīng)的類(lèi)前綴的樣式才能夠生效韩脑。
    12:后面的數(shù)字就是表示其樣式生效的呈現(xiàn)效果。之前提到粹污,柵格系統(tǒng)會(huì)隨著屏幕尺寸的變化段多,自動(dòng)為占據(jù)屏幕的每一行分為最多12列,col-xs-12直譯過(guò)來(lái)就是表示:在小于768px的設(shè)備尺寸下壮吩,套用這個(gè)類(lèi)的div(也就是這一列)占據(jù)了這一行的12個(gè)格子进苍,也就是它以100%的寬度占滿(mǎn)了一整行。

基于以上的粗略解釋?zhuān)賮?lái)看看一開(kāi)始列出來(lái)的代碼在不同尺寸寬度下的表現(xiàn)鸭叙,我想其強(qiáng)大之處應(yīng)該是一目了然:

<768px(xs生效):
400.png
>=768px(sm生效):
780.png
>=992px(md生效)
1030.png

我覺(jué)得有必要引用下官方對(duì)柵格參數(shù)的介紹觉啊,以便對(duì)其工作效果會(huì)有一個(gè)更詳盡的描述:
通過(guò)下表可以詳細(xì)查看 Bootstrap 的柵格系統(tǒng)是如何在多種屏幕設(shè)備上工作的:

args.png

Flex-box 軟盒子模式布局

比起前面兩種介紹的方法,軟盒(又稱(chēng)作伸縮盒)模式的布局則是一種完全不一樣方法沈贝,前者的響應(yīng)式方式是基于寬度百分比杠人,而后者則是通過(guò)控制設(shè)置其彈性屬性flex來(lái)達(dá)到響應(yīng)式的效果,而我認(rèn)為軟盒模式在布局上除了支持響應(yīng)式的布局之外宋下,其自身布局的方式嗡善,以及它對(duì)包裹在其內(nèi)部元素之間的間距、顯示順序的控制大大顛覆了原來(lái)的頁(yè)面流布局方式学歧,軟盒布局一定會(huì)是日后網(wǎng)頁(yè)布局的一大潮流罩引。有關(guān)flex-box的詳細(xì)用法可以參照大漠兄翻譯的一篇譯文,而我日后也會(huì)貼出自己在使用軟盒布局方面的一些心得枝笨,畢竟最近項(xiàng)目都是在用flex-box來(lái)做響應(yīng)式蜒程,我想以后只要待ie完全退出江湖,flex-box將定會(huì)成為網(wǎng)頁(yè)布局的首選項(xiàng)伺帘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昭躺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伪嫁,更是在濱河造成了極大的恐慌领炫,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件张咳,死亡現(xiàn)場(chǎng)離奇詭異帝洪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脚猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)龙助,“玉大人砰奕,你說(shuō)我怎么就攤上這事〗视酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵绘梦,是天一觀(guān)的道長(zhǎng)胸哥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)空厌,這世上最難降的妖魔是什么庐船? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任嘲更,我火速辦了婚禮,結(jié)果婚禮上哮内,老公的妹妹穿的比我還像新娘盗棵。我一直安慰自己北发,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布喷屋。 她就那樣靜靜地躺著琳拨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屯曹。 梳的紋絲不亂的頭發(fā)上狱庇,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音恶耽,去河邊找鬼密任。 笑死,一個(gè)胖子當(dāng)著我的面吹牛偷俭,可吹牛的內(nèi)容都是我干的浪讳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涌萤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淹遵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起负溪,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤透揣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后川抡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辐真,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拆祈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恨闪。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖放坏,靈堂內(nèi)的尸體忽然破棺而出咙咽,到底是詐尸還是另有隱情,我是刑警寧澤淤年,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布钧敞,位于F島的核電站,受9級(jí)特大地震影響麸粮,放射性物質(zhì)發(fā)生泄漏溉苛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一弄诲、第九天 我趴在偏房一處隱蔽的房頂上張望愚战。 院中可真熱鬧,春花似錦齐遵、人聲如沸寂玲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拓哟。三九已至,卻和暖如春伶授,著一層夾襖步出監(jiān)牢的瞬間断序,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工糜烹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留违诗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓疮蹦,卻偏偏與公主長(zhǎng)得像诸迟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挚币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容