這篇文章主要介紹了CSS中margin的使用技巧,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
10年積累的成都網(wǎng)站制作、網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有下城免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
當(dāng)我們學(xué)習(xí)CSS時,我們大多數(shù)人學(xué)到的第一件事是CSS中盒子的各個部分的細節(jié),這部分通過叫做 CSS盒、模型。“盒模型”中的元素之一是margin
,即盒子周圍的透明區(qū)域,它會將其他元素從盒子內(nèi)容中推開。
CSS1中描述了 margin-top
、margin-right
、margin-bottom
和margin-left
屬性,以及一次設(shè)置所有四個屬性的簡寫 margin
。
margin
看起來是一個相當(dāng)簡單的事情,但是,在本文中,咱們將看一些在使用margin
一些讓人迷惑有有趣的事情。 特別是,margin
之間如何相互作用,以及 margin
重疊效果。
CSS 盒模型指的是一個盒子的各個部分——content
、padding
、border
和margin
,它們各自之前是如何布局及相互作用的, 如下所示:
盒子的的四個margin
屬性和maring
縮寫都在CSS1中定義。
CSS2.1規(guī)范有一個演示盒模型的插圖,還定義了用來描述各種盒子的術(shù)語,其中包括 content box
、填padding box
、border box
和 margin box
。
現(xiàn)在有一個 Level 3 Box Model specification 的草案。這個規(guī)范引用了CSS2作為盒模型和margin
的定義,因此我們將在本文的大部分內(nèi)容中使用CSS2定義。
CSS1 規(guī)范定義了margin
,也定義了垂直 margin
重疊。如果考慮到在早期,CSS被用作文檔格式語言,那么 margin
重疊是有意義的。 margin 重疊意味著,當(dāng)一個有底部margin
的標題后面跟著一個有頂部 margin
的段落時,它們之間就不會出現(xiàn)較大的空白。
當(dāng)兩個 margin
發(fā)生重疊時,它們將組合在一起,兩個元素之間的空間取較大的一個。 較小的 margin
在較大的里面。
在以下情況下,margin 會重疊:
相鄰的兄弟姐妹
完全空盒子
父元素和第一個或最后一個子元素
依次來看看這些場景。
對 margin
重疊的最初描述是演示相鄰兄弟姐妹之間的 margin
是如何重疊的。除了下面提到的情況之外,如果有兩個元素在正常流中依次顯示,那么第一個元素的底部 margin
將與下面元素的頂部 margin
一起重疊。
在下面示例中,有三個div
元素。第一個 div
的頂部和底部的margin
都是50px
。第二個 div
的頂部和底部 margin
都是20px
。第三個 div
的頂部和底部 margin
都是3em
。前兩個元素之間的 margin
是50px
,因為較小的頂部 margin
與較大的底部 margin
相結(jié)合。第二個元素與第三個元素之間的 margin 是 3em
,因為3em
大于第二個元素底部margin
20px。
html
<div class="wrapper"> <div class="box example1"> margin-top: 50px; margin-bottom: 50px; </div> <div class="box example2"> margin-top: 20px; margin-bottom: 20px; </div> <div class="box example3"> margin-top: 3em; margin-bottom: 3em; </div> </div>
css
.wrapper { border: 5px dotted black; } .example1 { margin: 50px 0 50px 0; } .example2 { margin: 20px 0 20px 0; } .example3 { margin: 3em 0 3em 0; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; }
運行效果:
如果一個盒子是空的,那么它的頂部和底部 margin
可能會相互重疊。在下面的示例中,class
為empty
的元素的頂部和底部 margin
各為50px
,但是,第一項和第三項之間的 margin
不是100px
,而是50px
。這是由于兩個 margin
重疊造成的。如果向空盒子中放入內(nèi)容就會阻止 margin
合并。
html
<div class="wrapper"> <div class="box"> A box </div> <div class="box empty"></div> <div class="box"> Another box </div> </div>
css
.wrapper { border: 5px dotted black; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; border-radius: .5em; } .empty { margin: 50px 0 50px 0; }
運行效果:
margin 重疊讓人猝不及防,因為它有時候不是很直觀。在下面的示例中,有一個類名為 wrapper
的div
,給這個div一個紅色的outline
,這樣就可以看到它在哪里了。
這個div
里面的三個子元素的 margin
都是50px
。但是你會發(fā)現(xiàn)實際的效果是第一項和最后一項與父元素的的margin
齊平,好像子元素和父元素之間沒有50px
的margin
一樣。
html
<div class="wrapper"> <div class="box"> Item 1 </div> <div class="box"> Item 2 </div> <div class="box"> Item 3 </div> </div>
css
.wrapper { outline: 1px solid red; } .box { margin: 50px; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; }
運行效果:
這是因為子節(jié)點上的margin
會隨著父節(jié)點上的任何一邊的margin
相互重疊,從而最終位于父節(jié)點的外部。如果使用DevTools檢查第一個子元素,就可以看到這一點,顯示的黃色區(qū)域就是是 margin
。
在CSS2中,只指定垂直方向的 margin
重疊,即元素的頂部和底部 margin。因此,上面的左右邊距不會重疊。
值得注意的,margin 只在塊的方向上重疊,比如段落之間。
如果一個元素是絕對的定位,或者是浮動的,那么它的margin
永遠不會重疊。然而,假設(shè)你遇到了上面示例中的幾種情況,那么如何才能阻止 margin 重疊呢?
例如,一個完全空的盒子,如果它有border
或padding
,它的上下 margin
就不會重疊。在下面的例子中,給這個空盒子添加了1px的padding
。現(xiàn)在這個空盒子的的上方和下方都有一個50px
的 margin
。
html
<div class="wrapper"> <div class="box"> A box </div> <div class="box empty"></div> <div class="box"> Another box </div> </div>
css
.wrapper { border: 5px dotted black; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; border-radius: .5em; } .empty { margin: 50px 0 50px 0; padding: 1px; }
運行效果:
這背后是有邏輯,如果盒子是完全空的,沒有border
或padding
,它基本上是不可見的。 它可能是CMS中標記為空的段落元素。 如果你的CMS添加了多余的段落元素,你可能不希望它們在其他段落之間造成較大的空白,這時 margin 重疊就有一定的意義。
對于父元素和第一個或最后一個子元素 margin 重疊,如果我們向父級添加border
,則子級上的margin
會保留在內(nèi)部。
... .wrapper { border: 5px dotted black; } ...
同樣,這種行為也有一定的邏輯。如果出于語義目的而對元素進行包裝,但這些元素不顯示在屏幕上,那么你可能不希望它們在顯示中引入大的 margin
。當(dāng)web主要是文本時,這很有意義。當(dāng)我們使用元素來布局設(shè)計時,它的重疊行為就沒有多大的意義了。
BFC(Block Formatting Context)格式化上下文,是Web頁面中盒模型布局的CSS渲染模式,指一個獨立的渲染區(qū)域或者說是一個隔離的獨立容器。
BFC 可以阻止邊距的重疊。 如果我們再看父元素和第一個或最后一個子元素的示例,可以在 wrapper 元素加上 display: flow-root
就會創(chuàng)建一個新的BFC,從而阻止 margin
合并
... .wrapper { outline: 1px solid red; display: flow-root; } ...
display: flow-root
是CSS3新出來的一個屬性,用來創(chuàng)建一個無副作用的 BFC。將overflow
屬性的值設(shè)為auto
也會產(chǎn)生同樣的效果,因為這也創(chuàng)建了一個新的BFC,盡管它也可能創(chuàng)建一些在某些場景中不需要的滾動條。
flex
和 grid
容器為其子元素建立flex
和grid
格式化上下文,因此它們也能阻止 margin
的重疊。
還是以上面的例子為例,將 wrapper 改用 flex 布局:
... .wrapper { outline: 1px solid red; display: flex; flex-direction: column; } ...
由于margin
會重疊,最好能找到一種一致的方法來處理網(wǎng)站的 margin
。最簡單的方法是只在元素的頂部或底部定義 margin
。這樣,就很少會遇到 margin 重疊的問題,因為有margin
的邊總是與沒有margin
的邊相鄰。
這個解決方案并不能解決你可能遇到的問題,因為子元素的margin
會與父元素相互重疊。這個特定的問題往往不那么常見,但知道它為什么會發(fā)生可以幫助你想出一個解決方案。
對此,一個理想的解決方案是給元素設(shè)置 display: flow-root
,但有的瀏覽器并不支持,可以使用overflow
創(chuàng)建BFC
、或?qū)⒏冈卦O(shè)置成flex
容器,當(dāng)然還可以設(shè)置padding
來解決。
當(dāng)你在CSS中使用百分比的時候,它必須是某個元素的百分比。使用百分比設(shè)置的 margin(或 padding)始終是父元素內(nèi)聯(lián)大小(水平寫入模式下的寬度)的百分比。這意味著在使用百分比時,元素周圍的padding
大小都是相同的。
在下面的示例中,有一個200px 寬的 d當(dāng),里面是一個類名為 box
的div
,它的 margin
值為10%
,也就是 20px
(200*10%)。
html
<div class="wrapper"> <div class="box"> I have a margin of 10%. </div> </div>
css
* { box-sizing: border-box; } .wrapper { border: 5px dotted black; width: 200px; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; margin: 10%; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; }
我們在本文中一直在討論垂直 margin ,然而,現(xiàn)代CSS傾向于以相對于流的方式而不是物理方式來考慮事情。因此,當(dāng)我們討論垂直邊距時,我們實際上是在討論塊維度的邊距。如果我們在水平寫作模式下,這些 margin
將是頂部和底部,但在垂直寫作模式下,這些 margin
將是右側(cè)和左側(cè)。
一旦使用邏輯的、流相關(guān)的方向,就更容易討論塊的開始和結(jié)束,而不是塊的頂部和底部。為了簡化這一過程,CSS引入了邏輯屬性和值規(guī)范。這將流的相關(guān)屬性映射到物理屬性上。
margin-top = margin-block-start
margin-right = margin-inline-end
margin-bottom = margin-block-end
margin-left = margin-inline-start
還有兩個新的快捷鍵,可以同時設(shè)置兩個塊或者兩個內(nèi)嵌塊。
margin-block
margin-inline
在下面示例中,使用了這些流相關(guān)關(guān)鍵字,然后更改了盒子的編寫模式,你可以看到 margin
是如何遵循文本方向的:
html
<div class="wrapper horizontal-tb"> <div class="box"> A box with a horizontal-tb writing mode. </div> </div> <div class="wrapper vertical-rl"> <div class="box"> A box with a vertical-rl writing mode. </div> </div>
css
* { box-sizing: border-box; } .wrapper { border: 5px dotted black; inline-size: 200px; } .horizontal-tb { writing-mode: horizontal-tb; margin-bottom: 1em; } .vertical-rl { writing-mode: vertical-rl; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; margin-block-start: 30px; margin-block-end: 10px; margin-inline-start: 2em; margin-inline-end: 5%; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“CSS中margin的使用技巧”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
標題名稱:CSS中margin的使用方式
文章來源:http://chinadenli.net/article2/jsijic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)頁設(shè)計公司、標簽優(yōu)化、虛擬主機、網(wǎng)站營銷、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)