深度了解margin

2024-04-29    分類: 網(wǎng)站建設(shè)

你真的了解margin嗎?你知道m(xù)argin有什么特性嗎?你知道什么是垂直外邊距合并?margin在塊元素、內(nèi)聯(lián)元素中的區(qū)別?什么時(shí)候該用 padding而不是margin?你知道負(fù)margin嗎?你知道負(fù)margin在實(shí)際工作中的用途嗎?常見(jiàn)的瀏覽器下margin出現(xiàn)的bug有哪些?……

寫(xiě)css,你少不了與margin打交道,而對(duì)于這個(gè)平時(shí)我們最常用的css屬性我們并非十分了解。介于此我打算寫(xiě)下這篇文章,一來(lái)是自己工作中的總結(jié),也是對(duì)自己知識(shí)的一次梳理。

Margin是什么

CSS 邊距屬性定義元素周?chē)目臻g。通過(guò)使用單獨(dú)的屬性,可以對(duì)上、右、下、左的外邊距進(jìn)行設(shè)置。也可以使用簡(jiǎn)寫(xiě)的外邊距屬性同時(shí)改變所有的外邊距。——W3School

邊界,元素周?chē)深~外的空白區(qū)?!翱瞻讌^(qū)”通常是指其他元素不能出現(xiàn)且父元素背景可見(jiàn)的區(qū)域?!狢SS權(quán)威指南

我比較喜歡使用“外邊距”這個(gè)詞來(lái)解釋margin(同理padding可以稱之為“內(nèi)邊距”,但是我又恰恰喜歡稱呼padding為“補(bǔ)白”或者“留白”),我們可以很清楚的了解到margin的最基本用途就是控制元素周?chē)臻g的間隔,從視覺(jué)角度上達(dá)到相互隔開(kāi)的目的。

Margin的特性

margin始終是透明的。

margin通過(guò)使用單獨(dú)的屬性,可以對(duì)上、右、下、左的外邊距進(jìn)行設(shè)置。即:margin-top、margin-right、margin-bottom、margin-left。

外邊距的 margin-width 的值類型有:auto | length | percentage

也可以使用簡(jiǎn)寫(xiě)的外邊距屬性同時(shí)改變所有的外邊距:margin: top right bottom left;(eg: margin:10px 20px 30px 40px) 記憶方式是元素周?chē)戏巾槙r(shí)針“上右下左”記憶。

并且規(guī)范還提供了省略的數(shù)值寫(xiě)法,基本如下:

1、如果margin只有一個(gè)值,表示上右下左的margin同為這個(gè)值。例如:margin:10px; 就等于 margin:10px 10px 10px 10px;

2、如果 margin 只有兩個(gè)值,第一個(gè)值表示上下margin值,第二個(gè)值為左右margin的值。例如:margin:10px 20px; 就等于 margin:10px 20px 10px 20px;

3、如果margin有三個(gè)值,第一個(gè)值表示上margin值,第二個(gè)值表示左右margin的值,第三個(gè)值表示下margin的值。例如:margin:10px 20px 30px; 就等于 margin:10px 20px 30px 20px;

4、如果margin有四個(gè)值,那這四個(gè)值分別對(duì)應(yīng)上右下左這四個(gè)margin值。例如:margin:10px 20px 30px 40px;

在實(shí)際應(yīng)用中,個(gè)人不推薦使用三個(gè)值的margin,一是容易記錯(cuò),二是不容易日后修改,一開(kāi)始如果寫(xiě)成margin:10px 20px 30px;日后需求改動(dòng)為上10px,右30px,下30px,左20px,你不得不還是得把這個(gè)margin拆開(kāi)為margin:10px 30px 30px 20px;費(fèi)力且不討好,不如一開(kāi)始就老老實(shí)實(shí)的寫(xiě)成margin:10px 20px 30px 20px;來(lái)的實(shí)在,不要為了現(xiàn)在節(jié)省倆個(gè)字節(jié)而讓日后再次開(kāi)發(fā)的成本上升。

垂直外邊距合并問(wèn)題

別被上面這個(gè)名詞給嚇倒了,簡(jiǎn)單地說(shuō),外邊距合并指的是,當(dāng)兩個(gè)垂直外邊距相遇時(shí),它們將形成一個(gè)外邊距。合并后的外邊距的高度等于兩個(gè)發(fā)生合并的外邊距的高度中的較大者。你可以查看W3Shool CSS外邊距合并了解這個(gè)基本知識(shí)。

實(shí)際工作中,垂直外邊距合并問(wèn)題常見(jiàn)于第一個(gè)子元素的margin-top會(huì)頂開(kāi)父元素與父元素相鄰元素的間距,而且只在標(biāo)準(zhǔn)瀏覽器下 (FirfFox、Chrome、Opera、Sarfi)產(chǎn)生問(wèn)題,IE下反而表現(xiàn)良好。例子可以查看下面代碼(IE下表現(xiàn)“正?!保瑯?biāo)準(zhǔn)瀏覽器下查看出現(xiàn)“bug”):

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>垂直外邊距合并</title> <style> .top{width:160px; height:50px; background:#ccf;} .middle{width:160px; background:#cfc;} .middle .firstChild{margin-top:20px;} </style> </head>

<body> <div></div> <div> <div>我其實(shí)只是想和我的父元素隔開(kāi)點(diǎn)距離。</div> <div></div> </div> </body> </html>

如果按照CSS規(guī)范,IE的“良好表現(xiàn)”其實(shí)是一個(gè)錯(cuò)誤的表現(xiàn),因?yàn)镮E的hasLayout渲染導(dǎo)致了這個(gè)“表現(xiàn)良好”的外觀。而其他標(biāo)準(zhǔn)瀏覽器則會(huì)表現(xiàn)出“有問(wèn)題”的外觀。好了,如果你讀過(guò)了上面W3Shcool的CSS外邊距合并的文章后,就很容易討論這個(gè)問(wèn)題了。這個(gè)問(wèn)題發(fā)生的原因是根據(jù)規(guī)范,一個(gè)盒子如果沒(méi)有上補(bǔ)白(padding-top)和上邊框(border-top),那么這個(gè)盒子的上邊距會(huì)和其內(nèi)部文檔流中的第一個(gè)子元素的上邊距重疊。

再說(shuō)了白點(diǎn)就是:父元素的第一個(gè)子元素的上邊距margin-top如果碰不到有效的border或者padding.就會(huì)不斷一層一層的找自己 “領(lǐng)導(dǎo)”(父元素,祖先元素)的麻煩。只要給領(lǐng)導(dǎo)設(shè)置個(gè)有效的 border或者padding就可以有效的管制這個(gè)目無(wú)領(lǐng)導(dǎo)的margin防止它越級(jí),假傳圣旨,把自己的margin當(dāng)領(lǐng)導(dǎo)的margin執(zhí)行。 對(duì)于垂直外邊距合并的解決方案上面已經(jīng)解釋了,為父元素例子中的middle元素增加一個(gè)border-top或者padding-top即可解決這個(gè)問(wèn)題。

一般說(shuō)來(lái)這個(gè)問(wèn)題解釋到這里,大多數(shù)文章就不會(huì)再深入下去了,但作為一名實(shí)戰(zhàn)開(kāi)發(fā)者,最求的是知其然知其所以然,原本使用margin-top就是為了與父元素隔開(kāi)距離,而按照你這么一個(gè)解法,其實(shí)是一種“修復(fù)”,為了“彌補(bǔ)修復(fù)”這個(gè)父子垂直外邊距合并這個(gè)CSS規(guī)范“Bug”,而強(qiáng)制在父元素上使用border-top和padding-top,不舒服,也不容易記住,下次再發(fā)生這樣的情況還是會(huì)忘記這條準(zhǔn)則,而且在頁(yè)面設(shè)計(jì)稿里如果不需要 border-top加個(gè)上邊框,這么一加反而畫(huà)蛇添足,為以后修改留下隱患。

為什么一定要用border-top,padding-top去為了這么一個(gè)所謂的標(biāo)準(zhǔn)規(guī)范而多寫(xiě)這么一行代碼呢?答案你可以參考另外一篇文章用Margin還是用Padding里找到答案。

用Margin還是用Padding

何時(shí)應(yīng)當(dāng)使用margin:

需要在border外側(cè)添加空白時(shí)。

空白處不需要背景(色)時(shí)。

上下相連的兩個(gè)盒子之間的空白,需要相互抵消時(shí)。如15px + 20px的margin,將得到20px的空白。

何時(shí)應(yīng)當(dāng)時(shí)用padding:

需要在border內(nèi)測(cè)添加空白時(shí)。

空白處需要背景(色)時(shí)。

上下相連的兩個(gè)盒子之間的空白,希望等于兩者之和時(shí)。如15px + 20px的padding,將得到35px的空白。

個(gè)人認(rèn)為:margin是用來(lái)隔開(kāi)元素與元素的間距;padding是用來(lái)隔開(kāi)元素與內(nèi)容的間隔。margin用于布局分開(kāi)元素使元素與元素互不相干;padding用于元素與內(nèi)容之間的間隔,讓內(nèi)容(文字)與(包裹)元素之間有一段“呼吸距離”。

本文來(lái)自成都品牌網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)公司-創(chuàng)新互聯(lián)

新聞標(biāo)題:深度了解margin
文章網(wǎng)址:http://www.bm7419.com/news38/326488.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、全網(wǎng)營(yíng)銷推廣、定制網(wǎng)站、做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)