摘要:盒子的概念盒子模型指的是瀏覽器將文檔流從視覺上渲染為不同矩形框的組合。瀏覽器將文檔流中的每個元素都渲染為一個矩形框,其包含內容區域如文本圖片和可選的三個區域,中文名為外邊距邊框和填充。注意只有普通文檔流中塊框的垂直外邊距才會發生外邊距合并。
一直對盒模型的了解很零碎,學習都來源于各個文章的只言片語,這樣學來的既不完善,也不持久。最近通讀了w3的官方文檔,對其中的內容進行一點歸納吧。
盒子的概念盒子模型指的是瀏覽器將文檔流從視覺上渲染為不同矩形框的組合。
瀏覽器將文檔流中的每個元素都渲染為一個矩形框,其包含內容區域(如文本、圖片)和可選的margin/border/padding三個區域,中文名為外邊距、邊框和填充。如下圖所示:
這四個區域每一個都可以劃分為上下左右4個部分的邊界,如上邊距、下邊距,上邊框、下邊框等。
內容邊界:包裹著元素寬度和高度確定的盒子的四個線段組成。 填充邊界:包裹著元素填充區域的四個線段組成,如果填充寬度為0,則等于內容邊界。 邊框邊界:包裹著元素邊框區域的四個線段組成,如果邊框寬度為0,則等于填充邊界。 外邊距邊界:包裹著元素外邊距區域的四個線段組成,如果外邊距寬度為0,則等于外邊距邊界。
其中內容區域的盒子的寬度和高度由幾個因素來進行確定,是否設置了寬度和高度值,是否包含文本內容或者其他的盒子,盒子類型是否為table相關等等。
內容和填充區域的顏色由background屬性來設置,邊框區域的顏色由border-color || color其中一個屬性來設置,外邊距區域的顏色為transparent透明色。
下面的插圖展示了margin/border/padding如何被渲染(圖二是更為詳細的切分):
Examples of margins, padding, and borders
需要注意的是:
內容區域的計算是自上而下的,所有的li元素的內容區域計算都基于ul父元素。
margin盒子包含了content/padding/border/margin四部分的總和,在縱向上會出現margin的合并。
margin的顏色總是透明的,所以顏色會是父元素的透射顏色。
margin屬性margin屬性包括margin-top/margin-right/margin-bottom/margin-left 和 margin。
margin-top/margin-right/margin-bottom/margin-left 值:|| inherit || auto 初始值: 0 適用于:除了table展示類型的所有元素,table類型里依然適用的有`table-caption/table/inline-table` 繼承: 否 百分比:根據父包裹容器的寬度 計算值:指定的百分比或固定值
需要注意:margin-top/margin-bottom屬性對行間元素不起作用。
如果使用auto,同時父元素具有對應的寬度和高度,將在計算時均分空余空間達到居中的效果。
margin是以上四種屬性的簡寫,如果只有一個值,則設置所有邊界;兩個值則第一個值為top/bottom值,第二個值為left/right值;三個值則第一個值為top值,第二個值為left/right值,第三個為bottom值;四個值則分別對應top/right/bottom/left四個邊界。
body { margin: 2em } /* all margins set to 2em */ body { margin: 1em 2em } /* top & bottom = 1em, right & left = 2em */ body { margin: 1em 2em 3em } /* top=1em, right=2em, bottom=3em, left=2em */margin的邊界合并
在CSS里,兩個相鄰元素(并不一定是兄弟元素)的外邊距將會發生合并為一個外邊距,這個過程我們成為collapse。這個過程只會發生在垂直方向上的margin,合并結果是所有外邊距的最大值。
邊界合并的設置是為了元素布局的合理展示,如段落間的距離不會成為頂部的兩倍。
邊界的合并適用于margin-top/margin-bottom,不僅僅包括兄弟元素的合并,還有父子元素甚至自身的上下邊距合并。
注意:只有普通文檔流中塊框的垂直外邊距才會發生外邊距合并。行內框、浮動框或絕對定位之間的外邊距不會合并。
下圖展示margin合并的效果圖(來源于w3school文檔):
兄弟元素外邊距合并:
父子元素外邊距合并:
自身元素外邊距合并:
另外官方文檔里關于合并還有很多的特殊情況,不再一一說明,粘貼源文檔:
Adjoining vertical margins collapse, except: Margins of the root element"s box do not collapse. If the top and bottom margins of an element with clearance are adjoining, its margins collapse with the adjoining margins of following siblings but that resulting margin does not collapse with the bottom margin of the parent block. Horizontal margins never collapse. Two margins are adjoining if and only if: both belong to in-flow block-level boxes that participate in the same block formatting context no line boxes, no clearance, no padding and no border separate them (Note that certain zero-height line boxes (see 9.4.2) are ignored for this purpose.) both belong to vertically-adjacent box edges, i.e. form one of the following pairs: - top margin of a box and top margin of its first in-flow child - bottom margin of box and top margin of its next in-flow following sibling - bottom margin of a last in-flow child and bottom margin of its parent if the parent has "auto" computed height - top and bottom margins of a box that does not establish a new block formatting context and that has zero computed "min-height", zero or "auto" computed "height", and no in-flow children A collapsed margin is considered adjoining to another margin if any of its component margins is adjoining to that margin. Note. Adjoining margins can be generated by elements that are not related as siblings or ancestors. Note the above rules imply that: - Margins between a floated box and any other box do not collapse (not even between a float and its in-flow children). - Margins of elements that establish new block formatting contexts (such as floats and elements with "overflow" other than "visible") do not collapse with their in-flow children. - Margins of absolutely positioned boxes do not collapse (not even with their in-flow children). - Margins of inline-block boxes do not collapse (not even with their in-flow children). - The bottom margin of an in-flow block-level element always collapses with the top margin of its next in-flow block-level sibling, unless that sibling has clearance. - The top margin of an in-flow block element collapses with its first in-flow block-level child"s top margin if the element has no top border, no top padding, and the child has no clearance. - The bottom margin of an in-flow block box with a "height" of "auto" and a "min-height" of zero collapses with its last in-flow block-level child"s bottom margin if the box has no bottom padding and no bottom border and the child"s bottom margin does not collapse with a top margin that has clearance. - A box"s own margins collapse if the "min-height" property is zero, and it has neither top or bottom borders nor top or bottom padding, and it has a "height" of either 0 or "auto", and it does not contain a line box, and all of its in-flow children"s margins (if any) collapse. When two or more margins collapse, the resulting margin width is the maximum of the collapsing margins" widths. In the case of negative margins, the maximum of the absolute values of the negative adjoining margins is deducted from the maximum of the positive adjoining margins. If there are no positive margins, the maximum of the absolute values of the adjoining margins is deducted from zero. If the top and bottom margins of a box are adjoining, then it is possible for margins to collapse through it. In this case, the position of the element depends on its relationship with the other elements whose margins are being collapsed. If the element"s margins are collapsed with its parent"s top margin, the top border edge of the box is defined to be the same as the parent"s. Otherwise, either the element"s parent is not taking part in the margin collapsing, or only the parent"s bottom margin is involved. The position of the element"s top border edge is the same as it would have been if the element had a non-zero bottom border. Note that the positions of elements that have been collapsed through have no effect on the positions of the other elements with whose margins they are being collapsed; the top border edge position is only required for laying out descendants of these elements.
順便講一個常見的bug:垂直外邊距合并問題常見于第一個子元素的margin-top會頂開父元素與父元素相鄰元素的間距。其原因為父元素和第一個子元素的外邊距進行合并,并選取其最大值,即第一個元素的上邊距,導致撐開父元素上邊距。解決方案為:設置父元素的border或padding將子元素控制在父元素content內部,防止發生margin合并,即給外部div設置一個透明的1像素的border-top即可。
.outer-box{ border-top:1px solid transparent; }Padding屬性
padding屬性包括padding-top/padding-right/padding-bottom/padding-left 和 padding。
padding-top/padding-right/padding-bottom/padding-left 值:|| inherit 初始值: 0 適用于:除了`table-row-group/table-header/group/table-footer-group/table-row/table-column-group/table-column`的所有元素 繼承: 否 百分比:根據父包裹容器的寬度 計算值:指定的百分比或固定值
需要注意:margin-top/margin-bottom屬性對行間元素不起作用,且值不能為負。
margin是以上四種屬性的簡寫,設置的內容和上面一致,元素的個數和含義與margin相同。
border屬性border屬性包括border-width/border-color/border-style,而其中每一個都可以切分為4塊,如border-left-width/border-top-color。對于不同的用戶代理(瀏覽器)會對部分的元素渲染出特定的樣式來,如button,menus等。
border-top-width等 值:|| inherit || thin || medium || thick 初始值: medium 適用于:所有元素 繼承: 否 百分比:N/A,無法設置 計算值:絕對值,如果為none/hidden則轉換為0
需要注意:thin/medium/thick由不同的瀏覽器實現,具體的值不盡相同。
border-top-color等 值:|| transparent || inherit 初始值: color的值(字體顏色) 適用于:所有元素 繼承: 否 百分比:N/A,無法設置 計算值:指定的值或者字體顏色color的值
border-top-style等 值:none || hidden || dotted || dashed || solid || double || groove || ridge || inset || outset || inherit 初始值: none 適用于:所有元素 繼承: 否 百分比:N/A,無法設置 計算值:指定的值
需要注意:邊框會繪制在所有盒子背景色的上方,在groove/ridge/inset/outset值時,具體的顏色可能會被瀏覽器強制修改,而不僅限于border-color屬性。初始值為none,所以一定要進行設置樣式,否則看不到。
border屬性: [|| || <"border-top-color"> ] || inherit
需要注意:border屬性不能像其中三個子屬性一樣分別設置,如果設置其中一個值,則會應用到所有四條邊界上。
margin是以上四種屬性的簡寫,設置的內容和上面一致,元素的個數和含義與margin相同。
下面的兩段樣式只是出現的順序不同會顯示出不同的效果來,原因是設置的順序影響到值的覆蓋:
// 左邊框為雙細線和黑色 blockquote { border: solid red; border-left: double; color: black; } // 邊框全部為實線和紅色 blockquote { border-left: double; color: black; border: solid red; }雙向上下文的行間元素的盒模型
在每一個行間元素中,瀏覽器需要產生每一個盒子按照視覺順序而非邏輯順序(也就是direction設置的方向)進行渲染。
下面的兩句話我實在是看不懂在講什么,貼出原文:
When the element"s "direction" property is "ltr", the left-most generated box of the first line box in which the element appears has the left margin, left border and left padding, and the right-most generated box of the last line box in which the element appears has the right padding, right border and right margin. When the element"s "direction" property is "rtl", the right-most generated box of the first line box in which the element appears has the right padding, right border and right margin, and the left-most generated box of the last line box in which the element appears has the left margin, left border and left padding.盒模型相關的周邊問題
inline-block元素之間的小空白
第一個元素 第二個元素
效果入圖:
原因為:HTML 中的換行符、空格符、制表符等合并為空白符, 字體大小不為 0 的情況下, 空白符自然占據一定的寬度, 因此產生了元素間的空隙.
解決方案:可以為inline-block元素設置為負的margin-left; 或父元素font-size設置為0, 子元素再重新設置回來等方法。
推薦方案:直接在HTML文檔里改變文本排列,使行間元素尾標簽和下一個頭便簽間不留任何空格,如
第一個元素第二個元素
因為這樣影響范圍最小,不需任何額外代碼。
參考文獻w3c官網文檔 - 盒子模型:https://www.w3.org/TR/CSS2/bo...
你不知道的margin屬性:http://louiszhai.github.io/20...元素之間空白Bug
w3school - CSS外邊距合并:http://www.w3school.com.cn/cs...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/112615.html
摘要:重點介紹一下常見的三列布局之圣杯布局和雙飛翼布局。兩種布局方式的不同之處在于如何處理中間主列的位置圣杯布局是利用父容器的左右內邊距定位雙飛翼布局是把主列嵌套在后利用主列的左右外邊距定位。 CSS總結 由于最近在準備前端方面的面試,所以對自己平常工作中用到的地方做出一些總結。該篇是CSS部分(上),有許多地方敘述的并不是十分詳細,只是大致的描述一下,給自己提供一個知識輪廓。本篇中主要描述...
摘要:當兩個及以上外邊距折疊,合并后的外邊距寬度是發生折疊的外邊距中的最大寬度。如果該元素的外邊距同其父元素的上外邊距折疊,則該盒的上邊框邊緣同其父元盒的上邊框邊緣相同。 2017-07-20: 關于外邊距折疊, 推薦問題: https://segmentfault.com/q/10... 8 盒模型 Box Model URL: http://www.w3.org/TR/CSS2/box...
摘要:筆記從尚硅谷的第講開始的內聯元素的盒模型,此套視頻是第二遍看,為了以后不再看第三遍,把重要的知識做個總結。其實我們的元素天生就有這種效果。是元素的默認值,也是設置元素為隱藏,但是它隱藏后還會占用頁面的布局。以上只是在正常的文檔流中 筆記從尚硅谷html+css的第54講開始的內聯元素的盒模型,此套視頻是第二遍看,為了以后不再看第三遍,把重要的知識做個總結。 54講 內聯元素的盒模型 內...
摘要:筆記從尚硅谷的第講開始的內聯元素的盒模型,此套視頻是第二遍看,為了以后不再看第三遍,把重要的知識做個總結。其實我們的元素天生就有這種效果。是元素的默認值,也是設置元素為隱藏,但是它隱藏后還會占用頁面的布局。以上只是在正常的文檔流中 筆記從尚硅谷html+css的第54講開始的內聯元素的盒模型,此套視頻是第二遍看,為了以后不再看第三遍,把重要的知識做個總結。 54講 內聯元素的盒模型 內...
閱讀 1325·2023-04-26 00:10
閱讀 2427·2021-09-22 15:38
閱讀 3745·2021-09-22 15:13
閱讀 3503·2019-08-30 13:11
閱讀 646·2019-08-30 11:01
閱讀 3028·2019-08-29 14:20
閱讀 3207·2019-08-29 13:27
閱讀 1724·2019-08-29 11:33