CSS 柵格系統(tǒng)原理分析

眾所周知剪勿,現(xiàn)在前端有很多類似于bootstrap,foundation這樣優(yōu)秀的UI框架耻姥,它們都提供了自己的一套響應(yīng)式布局方案销钝,即柵格系統(tǒng)。用過的人都知道只要給頁面的元素添加其柵格系統(tǒng)指定的類名琐簇,就能達(dá)到你想達(dá)到的響應(yīng)式布局效果曙搬,簡(jiǎn)潔而優(yōu)雅。筆者有很長(zhǎng)一段時(shí)間不明白柵格系統(tǒng)是基于什么樣的原理實(shí)現(xiàn)鸽嫂,遂分析了一下主流框架的源碼纵装,發(fā)現(xiàn)其實(shí)并不復(fù)雜,甚至自己也可以實(shí)現(xiàn)一套很簡(jiǎn)單的柵格系統(tǒng)据某。

一橡娄、Bootstrap

bootstrap的柵格系統(tǒng)用于通過一系列的行(row)與列(col-*)的組合來創(chuàng)建頁面布局,它的柵格系統(tǒng)最大分為12份:


圖片.png
<div class="container">
    <div class="row">
        <div class="col-md-12">col-12</div>
    </div>
    <div class="row">
        <div class="col-md-4">col-4</div>
        <div class="col-md-4">col-4</div>
        <div class="col-md-4">col-4</div>
    </div>
    ...
</div>

不過bootstrap@3.x版本與@4.0版本實(shí)現(xiàn)柵格系統(tǒng)方式不一樣:

  1. bootstrap@3.x版本為了兼容IE8癣籽,采用的是浮動(dòng)方式來實(shí)現(xiàn)柵格系統(tǒng):
[class |= col] { float: left; }
.col-md-1 { width: 8.33333333%; }
.col-md-2 { width: 16.66666667%; }
.col-md-3 { width: 25%; }
.col-md-4 { width: 33.33333333%; }
.col-md-5 { width: 41.66666667%; }
.col-md-6 { width: 50%; }
.col-md-7 { width: 58.33333333%; }
.col-md-8 { width: 66.66666667%; }
.col-md-9 { width: 75%; }
.col-md-10 { width: 83.33333333%; }
.col-md-11 { width: 91.66666667%; }
.col-md-12 { width: 100%; }

即每行的一個(gè)柵格都是用左浮動(dòng)和百分比來進(jìn)行排版挽唉,當(dāng)窗口寬度改變滤祖,對(duì)應(yīng)改變container容器的寬度,對(duì)應(yīng)柵格寬度自然也跟著改變:

@media (min-width: 768px) {
  .container {
    width: 750px;
  }
}
@media (min-width: 992px) {
  .container {
    width: 970px;
  }
}
@media (min-width: 1200px) {
  .container {
    width: 1170px;
  }
}
  1. bootstrap@4.0版本放棄了對(duì)版本IE的支持瓶籽,柵格系統(tǒng)采用的是最新的伸縮布局方式:
.row {
    display: flex;
    flex-wrap: wrap;
}
.col-1 { flex: 0 0 8.333333%; }
.col-2 { flex: 0 0 16.666667%; }
.col-3 { flex: 0 0 25%; }
.col-4 { flex: 0 0 33.333333%; }
.col-5 { flex: 0 0 41.666667%; }
.col-6 { flex: 0 0 50%; }
.col-7 { flex: 0 0 58.333333%; }
.col-8 { flex: 0 0 66.666667%; }
.col-9 { flex: 0 0 75%; }
.col-10 { flex: 0 0 83.333333%; }
.col-11 { flex: 0 0 91.666667%; }
.col-12 { flex: 0 0 100%; }

柵格系統(tǒng)可以決定每一個(gè)柵格的排版順序匠童,兩種柵格系統(tǒng)實(shí)現(xiàn)方式不同斩跌,自然他們得排版方式也不同:

/*
 * bootstrap@3.x版本 排版
 */
[class |= col] {
    position: relative;
}
/* 向右移動(dòng)指定的柵格數(shù) */
.col-md-pull-1 { right: 8.33333333%; }
.col-md-pull-2 { right: 16.66666667%; }
.col-md-pull-3 { right: 25%; }
...
/* 向左移動(dòng)指定的柵格數(shù) */
.col-md-push-1 { left: 8.33333333%; }
.col-md-push-2 { left: 16.66666667%; }
.col-md-push-3 { left: 25%; }
...

/*
 * bootstrap@4.0版本  排版
 */
.order-1 { order: 1; }
.order-2 { order: 2; }
.order-3 { order: 3; }
...

可以看到朴摊,@3.0版本采用的是相對(duì)定位進(jìn)行左右移動(dòng)?xùn)鸥駚磉M(jìn)行排版恰聘,@4.0版本就很簡(jiǎn)潔疫诽,只用采用flex布局特有的order屬性來進(jìn)行排版。當(dāng)然奴曙,這兩個(gè)版本也有相同的排版方式奶甘,就是offset偏移:

/* bootstrap@3.x版本偏移 */
.col-md-offset-1 { margin-left: 8.33333333%; }
.col-md-offset-2 { margin-left: 16.66666667%; }
.col-md-offset-3 { margin-left: 25%; }
...

/* bootstrap@4.0版本偏移 */
.offset-1 { margin-left: 8.33333333%; }
.offset-2 { margin-left: 16.66666667%; }
.offset-3 { margin-left: 25%; }
...

兩者都用margin-left進(jìn)行偏移量設(shè)置赛蔫。

二裤唠、Pure

pure的柵格系統(tǒng)又是另外一種方式實(shí)現(xiàn)挤牛,它支持最大24等分的柵格:


圖片.png
<div class="pure-g">
    <div class="pure-u-1-3">1/3</div>
    <div class="pure-u-1-3">1/3</div>
    <div class="pure-u-1-3">1/3</div>
</div>
<div class="pure-g">
    <div class="pure-u-1-8">1/8</div>
    <div class="pure-u-1-8">1/8</div>
    <div class="pure-u-1-8">1/8</div>
    ...
</div>
<div class="pure-g">
    <div class="pure-u-1-24">1/24</div>
    <div class="pure-u-1-24">1/24</div>
    <div class="pure-u-1-24">1/24</div>
    ...
</div>

pure它的柵格系統(tǒng)采用的是伸縮與行內(nèi)結(jié)合的方式:

.pure-g {
        display: -webkit-box;
        display: -webkit-flex;
        display: -ms-flexbox;
        display: flex;
        flex-flow: row wrap;
}
[class|=pure-u] {
    display: inline-block;
    *display: inline;   /*iE < 8*/
    zoom: 1;
}
.pure-u-1-24 { width: 4.1667%; }
.pure-u-2-24,.pure-u-1-12 { width: 8.3333%; }
.pure-u-3-24,.pure-u-1-8 { width: 12.5000%; }
.pure-u-4-24,.pure-u-1-6 { width: 16.6667%; }
.pure-u-5-24 { width: 20.8333%; }
...

不過它是不支持偏移和指定順序的排版。

三种蘸、Foundation

fundation的柵格系統(tǒng)原理其實(shí)是和bootstrap@4.0版本如出一轍墓赴,都是采用伸縮布局的方式,最大支持12等分的柵格:

.grid-x {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -webkit-flex-flow: row wrap;
      -ms-flex-flow: row wrap;
          flex-flow: row wrap; 
}

.grid-x > .small-1 { width: 8.33333%; }
.grid-x > .small-2 { width: 16.66667%; }
.grid-x > .small-3 { width: 25%; }
...
.grid-x > .small-12 { width: 100%; }

四航瞭、總結(jié)

UI框架柵格系統(tǒng)實(shí)現(xiàn)方式基本為三種:
1. 純伸縮布局flex方式: 這種方式對(duì)古老的IE瀏覽器支持性不是很好诫硕,所以一般出現(xiàn)在技術(shù)比較激進(jìn)的框架上,如Bootstrap@4.0沧奴,F(xiàn)oundation,基于React的antDesign长窄,基于Vue的ElementUI 等等滔吠。
2. 浮動(dòng)方式:這種方式是為了向下兼容IE低版本瀏覽器,比如用處很廣的Bootstrap@3.x版本挠日。
3. 伸縮和行內(nèi)結(jié)合的方式:雅虎的Pure疮绷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嚣潜,隨后出現(xiàn)的幾起案子冬骚,更是在濱河造成了極大的恐慌,老刑警劉巖懂算,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只冻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡计技,警方通過查閱死者的電腦和手機(jī)喜德,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垮媒,“玉大人舍悯,你說我怎么就攤上這事航棱。” “怎么了萌衬?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵饮醇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我秕豫,道長(zhǎng)朴艰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任馁蒂,我火速辦了婚禮呵晚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沫屡。我一直安慰自己饵隙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布沮脖。 她就那樣靜靜地躺著金矛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勺届。 梳的紋絲不亂的頭發(fā)上驶俊,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音免姿,去河邊找鬼饼酿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胚膊,可吹牛的內(nèi)容都是我干的故俐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼紊婉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼药版!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喻犁,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤槽片,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肢础,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體还栓,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年传轰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝙云。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡路召,死狀恐怖勃刨,靈堂內(nèi)的尸體忽然破棺而出波材,到底是詐尸還是另有隱情,我是刑警寧澤身隐,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布廷区,位于F島的核電站,受9級(jí)特大地震影響贾铝,放射性物質(zhì)發(fā)生泄漏隙轻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一垢揩、第九天 我趴在偏房一處隱蔽的房頂上張望玖绿。 院中可真熱鬧,春花似錦叁巨、人聲如沸斑匪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚀瘸。三九已至,卻和暖如春庶橱,著一層夾襖步出監(jiān)牢的瞬間贮勃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工苏章, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寂嘉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓枫绅,卻偏偏與公主長(zhǎng)得像泉孩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撑瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案棵譬? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評(píng)論 1 92
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color显蝌,font预伺,text-align,li...
    love2013閱讀 2,304評(píng)論 0 11
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color曼尊,font酬诀,text-align,li...
    wzhiq896閱讀 1,732評(píng)論 0 2
  • 一直以來都想提高自己的寫作能力骆撇,也知道最好的方式就是堅(jiān)持寫瞒御。但是不管讀書筆記也好、心得體會(huì)也好神郊、日記也好肴裙,都常常斷...
    程影閱讀 1,263評(píng)論 1 3
  • AngularJS是目前最熱門的一種前端開發(fā)框架蜻懦。對(duì)于前端工程師來說甜癞,掌握這門炙手可熱的技術(shù)是完全有必要的。本書會(huì)...
    TGCode閱讀 556評(píng)論 0 3