CSS中的布局詳解(一):視覺格式化模型

一雏胃、盒模型

盒模型婚度,顧名思義伟葫,是HTML文檔中每個元素在渲染的時候都會被描述成一個矩形盒子,盒模型就是表示每個元素盒子所占空間大小的模型部逮。

盒模型主要有四個部分:

  • margin (外邊距)
  • border (邊框)
  • padding (內(nèi)邊距)
  • content (內(nèi)容區(qū)域)

一般來說娜汁,默認盒模型實際占用空間計算模式為:

  • 水平空間大小 = margin(左右)+ border(左右)+ padding(左右)+ width
  • 垂直空間大小 = margin(上下)+ border (上下)+ padding (上下)+height

因此, 一個元素的實際大小為:border + padding + width/height

在CSS中兄朋,名為box-sizing的屬性可以改變元素寬高的計算方式掐禁。

box-sizing有兩個常用的取值:

  • content-box
  • border-box
    content-box為默認值,實際寬高為上述元素實際大小的計算方式。
    border-box則是一個元素設置的width和height傅事,不包含其他的缕允。

二、視覺格式化模型

元素能夠被渲染成一個又一個盒子蹭越,那么這些盒子的位置在頁面中又是如何擺放的呢障本?

在默認情況下,盒子是按照元素在HTML中的先后位置從左至右從上至下一個接著一個排列放置般又。

但此時也分為兩種情況彼绷,有的盒子呈水平排列,有的盒子卻占滿整個一行茴迁。這是因為不同的盒子寄悯,使用的是不同的格式化上下文來布局。

格式化上下文常見的有兩種:

  • 塊格式化上下文(BFC)
  • 行內(nèi)格式化上下文(IFC)

當元素的display值為block堕义、list-item猜旬、table、flex倦卖、grid時洒擦,它是塊級元素,每個塊級元素至少生成一個塊級盒怕膛,塊級盒參與BFC熟嫩,被渲染成完整的一個新行。

W3C對于BFC的定義是:

浮動元素和絕對定位元素褐捻,非塊極盒子的塊級容器掸茅,以及overflow值不為“visiable”的塊級盒子,都會為他們的內(nèi)容創(chuàng)建新的塊級格式化上下文柠逞。
在一個塊級格式化上下文里昧狮,盒子從包含塊的頂端開始垂直地一個接一個地排列,兩個盒子之間的垂直的間隙是由他們的margin來決定的板壮,兩個相鄰的塊級盒子的垂直外邊距會發(fā)生疊加逗鸣。
在塊級格式化上下文中,每一個盒子的左外邊緣會觸碰到容器的左邊緣(對于從右到左的格式來說绰精,則會觸碰到右邊緣)撒璧,即使存在浮動也是如此,除非這個盒子創(chuàng)建一個新的塊級格式化上下文笨使。

總結(jié)一下BFC的特性:

  • 內(nèi)部的Box會在垂直方向沪悲,從頂部開始一個接一個地放置。
  • Box垂直方向的距離由margin決定阱表。屬于同一個BFC的兩個相鄰Box的margin會發(fā)生疊加殿如。
  • 每個元素的margin box的左邊贡珊,與包含塊border box的左邊相接觸,即使存在浮動也是如此涉馁。
  • BFC的區(qū)域不會與float box疊加
  • BFC就是頁面上的一個隔離的獨立容器门岔,容器里面的子元素不會影響到外面的元素,反之亦然烤送。
  • 計算BFC的高度時寒随,浮動元素也參與計算。

當元素的display值為inline帮坚、inline-block妻往、inline-table、inline-flex试和、inline-grid時讯泣,它是行內(nèi)級元素,行內(nèi)級元素生成行內(nèi)級盒阅悍,參與IFC好渠,被渲染為水平排列,直到當行被占滿然后換行节视。

總結(jié)IFC的渲染規(guī)則:

  • 盒子一個接一個地水平擺放拳锚,當容器寬度不夠時就會換行。
  • 在水平方向上寻行,這些盒的外邊距霍掺,邊框,內(nèi)邊距所占用的空間都會被計算拌蜘,但行內(nèi)和的垂直border杆烁,padding,margin都會撐開行盒的高度拦坠。
  • 在垂直方向上连躏,這些盒可能會以不同形式來對齊剩岳,可通過vertical-align來設置贞滨,默認對齊為baseline
  • 每一行將生成一個行盒,包括該行所有的盒子拍棕,行盒的寬度是由包含塊和存在的浮動來決定
  • 行盒一般左右邊都貼近其包含塊晓铆,但是會因為浮動和的存在而發(fā)生變化,浮動盒會位于包含塊邊緣與行盒邊緣之間绰播,這樣行盒的可用寬度就小于包含塊的寬度
  • 當所有盒的總寬度小于行盒的寬度骄噪,那么行盒中的水平方向排版有text-align來決定
  • 當所有盒的總寬度超過一個行盒時,就會形成多個行盒蠢箩,多個行盒互相之間垂直方向不能分離链蕊,不能重疊
  • 當一個行內(nèi)盒超過行盒的寬度時事甜,它會被分割成多個盒,這些盒被分布在多個行盒里滔韵,如果一個行內(nèi)盒不能被分割逻谦,那么這個行內(nèi)盒將溢出這個行盒
  • 行盒的高度由內(nèi)部元素中實際高度最高的元素計算出來,每個行盒的高度由于內(nèi)容不一樣陪蜻,所以高度也可能不一樣
  • 在一個行盒中邦马,當他包含的內(nèi)部容器的高度小于行盒的高度的時候,內(nèi)部容器的垂直位置可由自己的vertical-align屬性來確定
  • 在IFC中宴卖,是不能存在塊級元素的滋将,如果將塊級元素放入IFC,那么會被破壞成BFC症昏,而塊級元素前的元素或文本和塊級元素后的元素或文本將會各自自動產(chǎn)生一個匿名塊盒將其包圍随闽。

三、一些易混淆的概念

塊元素與塊級元素

塊級元素:塊級元素是那些視覺上會被格式化成塊狀的元素齿兔,也就是會換新行的元素橱脸。
塊元素:塊元素是display屬性值為block的元素,他應該是塊級元素的一個子集分苇。

行內(nèi)元素與行內(nèi)及元素

行內(nèi)級元素:行內(nèi)級元素是不會為自身內(nèi)容形成新的塊添诉,而讓內(nèi)容分布在多行中的元素。
行內(nèi)元素:行內(nèi)元素僅僅是display值為inline的元素医寿,是行內(nèi)及元素的一個子集栏赴。

block,inline靖秩,inline-block

block和inline這里不再贅述须眷,重點說一下inline-block:
inline-block是將元素呈現(xiàn)為inline,但元素的內(nèi)容卻又作為block呈現(xiàn)沟突,既具有block的寬高特性花颗,又具有inline的同行特性。

參考資料:

  • 騰訊課堂前端NEXT課程文檔——視覺格式化模型

CSS布局詳解系列索引:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惠拭,一起剝皮案震驚了整個濱河市扩劝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌职辅,老刑警劉巖棒呛,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異域携,居然都是意外死亡簇秒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門秀鞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趋观,“玉大人扛禽,你說我怎么就攤上這事≈逄常” “怎么了旋圆?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長麸恍。 經(jīng)常有香客問我灵巧,道長,這世上最難降的妖魔是什么抹沪? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任刻肄,我火速辦了婚禮,結(jié)果婚禮上融欧,老公的妹妹穿的比我還像新娘敏弃。我一直安慰自己,他們只是感情好噪馏,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布麦到。 她就那樣靜靜地躺著,像睡著了一般欠肾。 火紅的嫁衣襯著肌膚如雪瓶颠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天刺桃,我揣著相機與錄音粹淋,去河邊找鬼。 笑死瑟慈,一個胖子當著我的面吹牛桃移,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葛碧,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼借杰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了进泼?” 一聲冷哼從身側(cè)響起蔗衡,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缘琅,沒想到半個月后粘都,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廓推,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了堡掏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡堆生,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雷酪,到底是詐尸還是另有隱情淑仆,我是刑警寧澤,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布哥力,位于F島的核電站蔗怠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吩跋。R本人自食惡果不足惜寞射,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锌钮。 院中可真熱鬧桥温,春花似錦、人聲如沸梁丘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氛谜。三九已至掏觉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間值漫,已是汗流浹背履腋。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惭嚣,地道東北人遵湖。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像晚吞,于是被迫代替她去往敵國和親延旧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348

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