CSS規(guī)范:你真的了解盒模型嗎?
為了給文檔樹(shù)中的各個(gè)元素排版定位(布局),瀏覽器會(huì)根據(jù)渲染模型(是講元素怎么在頁(yè)面上定位及布局的,包括position和float等等,visual formatting model)為每個(gè)元素生成四個(gè)嵌套的矩形框,分別稱作content box、padding box、border box 和margin box。
以上說(shuō)的四種類型是不可分割的,并可能會(huì)重合,這就是CSS規(guī)范中描述的“盒模型”(box model),也就是以CSS的角度去看一個(gè)元素被渲染后的抽象形態(tài)。是講一個(gè)元素自身的構(gòu)成部分,不同于布局:多個(gè)元素在頁(yè)面上的定位。
51CTO推薦閱讀:CSS布局:Web標(biāo)準(zhǔn)必備小結(jié)
上面的大框,代表一個(gè)元素生成的矩形區(qū)域,也就是 box,每一個(gè) box 都包括一個(gè) content 區(qū)域(元素的內(nèi)容,如文本,圖形等)以及環(huán)繞其四周的 padding(元素的內(nèi)邊距,填充部分)、border (元素的邊框) 和 margin (元素的外邊距) 區(qū)域。padding、border 和 margin 區(qū)域都包括 top、right、bottom、left 四部分。如圖所示(“LM”代表left margin,“RP”代表right padding,“TB”代表top border……)。
邊界
上述四個(gè)區(qū)域(content、 padding、border和margin)分別有他們自己的邊界,細(xì)化來(lái)說(shuō),每個(gè)區(qū)域都有top、right、bottom、left四個(gè)邊界。
◆content 邊界/內(nèi)邊界
Content 邊界環(huán)繞在由該元素的寬和高決定的一個(gè)矩形上,這個(gè)尺寸通常由該元素渲染后的內(nèi)容決定。這四個(gè)content邊界組成的矩形框就是該元素的 content box。
◆padding邊界
Padding 邊界環(huán)繞在該元素的 padding區(qū)域的四周,顧名思義,填充背景色,在此范圍內(nèi)有效。如果padding的寬度為0,則padding邊界與content邊界重合。這四個(gè)padding邊界組成的矩形框就是該元素的padding box。
◆border 邊界
Border 邊界環(huán)繞在該元素的border區(qū)域的四周,如果border的寬度為0,則border邊界與padding邊界重合。這四個(gè)border邊界組成的矩形框就是該元素的 border box。
◆margin 邊界/外邊界
Margin 邊界環(huán)繞在該元素的margin區(qū)域的四周,如果margin的寬度為0,則margin邊界與border邊界重合。這四個(gè)margin邊界組成的矩形框就是該元素的 margin box。下面分別說(shuō)一下各個(gè)部分。一個(gè)簡(jiǎn)單的例子,來(lái)自 W3C 官方:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
- <HTML>
- <HEAD>
- <TITLE>Examples of margins, padding, and borders</TITLE>
- <STYLE type="text/css">
- UL {
- background: yellow;
- margin: 12px 12px 12px 12px;
- padding: 3px 3px 3px 3px;
- /* No borders set */
- }
- LI {
- color: white; /* text color is white */
- background: blue; /* Content, padding will be blue */
- margin: 12px 12px 12px 12px;
- padding: 12px 0px 12px 12px; /* Note 0px padding right */
- list-style: none /* no glyphs before a list item */
- /* No borders set */
- }
- LI.withborder {
- border-style: dashed;
- border-width: medium; /* sets border width on all sides */
- border-color: lime;
- }
- </STYLE>
- </HEAD>
- <BODY>
- <UL>
- <LI>First element of list</LI>
- <LI class="withborder">Second element of list is
- a bit longer to illustrate wrapping.</LI>
- </UL>
- </BODY>
- </HTML>
示意圖:
#p#
margin
'margin' 是 'margin-top', 'margin-right', 'margin-bottom', 'margin-left' 的簡(jiǎn)寫(xiě),表明 margin 的大小范圍。它的值可以是寬度值、百分比值或‘auto’這3者之一,注意:寬度值必須帶有單位。
margin簡(jiǎn)寫(xiě)
1. 以上、右、下、左的順序給以上四個(gè)值賦值。
- CSS codemargin: 1px 2px 3px 4px;
等價(jià)于:
- CSS codemargin-top: 1px
- margin-right: 2px
- margin-bottom: 3px
- margin-left: 4px
記住,從上面開(kāi)始,順時(shí)針旋轉(zhuǎn)一圈。
2. 以上下、左右的順序賦值
- CSS codemargin: 1px 2px;
那么相當(dāng)于:
- CSS codemargin-top: 1px
- margin-right: 2px
- margin-bottom: 1px
- margin-left: 2px
這種賦值方式,適合下面講到的 *-top,*-right,*-bottom,*-left的簡(jiǎn)寫(xiě)的賦值,如padding,border-width,border-color等,下面不再說(shuō)明。
可以應(yīng)用在什么元素上
非table類型的元素,以及table類型中table-caption, table 和inline-table這3類。例如 TD TR TH等,margin是不適用的。
什么時(shí)候無(wú)效
對(duì)于行內(nèi)非替換元素(例如 SPAN),垂直方向的margin不起作用。例如:
- <div style="border:1px solid red;">
- <span style="margin:100px; background:gray;">ddd</span>
- </div>
可以看到,DIV 的上下 border 緊貼著灰色的SPAN元素。
margin折疊
垂直方向上的不同元素的相鄰的margin在某些情況下,會(huì)發(fā)生折疊的現(xiàn)象。比如,兩個(gè) div ,上下相鄰,上面 DIV 的margin-bottom 會(huì)和 下面 DIV 的 margin-top 產(chǎn)生折疊的現(xiàn)象,兩個(gè)重疊成一個(gè),具體寬度取較大的。例如:
- <div style="background-color:green; width:100px; height:100px;margin-bottom:100px;">
- </div>
- <div style="background-color:red; width:100px; height:100px; margin-top:50px;">
- </div>
上下兩個(gè)DIV最終相距100px,而不是150px。
#p#
padding
padding是 'padding-top', 'padding-right', 'padding-bottom', 'padding-left'的縮寫(xiě)。賦值的方法跟margin相同,只是沒(méi)有 ‘auto’ 值。默認(rèn)值是0。
它可以應(yīng)用到的元素
除display值是 ‘table-row-group’, ‘table-header-group’, ‘table-footer-group’, ‘table-row’, ‘table-column-group’ 和 ’table-column’ 的所有元素。
border
border是個(gè)比較復(fù)雜的東西。它是'border- top', 'border-right', 'border-bottom', 'border-left'。千萬(wàn)別認(rèn)為它跟前面的padding還有 margin一樣只是設(shè)置width就好了。
border包含3個(gè)部分,’border-width’,’border- color’,’border-style’,分別用來(lái)設(shè)置它的寬度,顏色和樣式。適用于任何元素。
border-width是 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'。默認(rèn)值是0。可用值有‘thin’,‘medium’,‘thick’,以及常用的數(shù)值帶單位的寬度值。
border-color是'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color'的簡(jiǎn)寫(xiě)。默認(rèn)值是 ‘color’ 特性的值。
border-style是'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style'的簡(jiǎn)寫(xiě)。默認(rèn)值是 none 特性的值。可用值有:’none’,’hidden’,’dotted’,’dashed’,’solid’,’double’,’groove’,’ridge’,’inset’,’outset’,有興趣的可以逐個(gè)試試效果。
【編輯推薦】