亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 web前端 css教學 css中的margin屬性詳解

css中的margin屬性詳解

Mar 22, 2018 pm 04:55 PM
css margin

這次帶給大家css中的margin屬性詳解,使用css中margin的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。

之前我一直認為margin屬性是一個非常簡單的屬性,但是最近做專案時遇到了一些問題,才發(fā)現(xiàn)margin屬性還是有一些「坑」的,下面我會介紹margin的基本知識以及那些「坑」。這篇部落格文章主要分為以下幾個部分:

  • margin--基礎知識

  • margin--在同級元素(非父子關係)之間應用

  • margin--在父元素和子元素之間應用(重點)

  • margin--margin值的單位為%時的幾種情況??

第一部分:margin--基礎知識

要介紹margin的基礎知識,我們不可迴避地要談到css盒子模型(Box Model),一般而言,css盒子模型是用來設計和佈局的。它本質上是一個盒子,包括:外邊距(margin)、邊框(border)、內(nèi)邊距(padding)以及最中間的內(nèi)容(content)。下圖即為盒子模型(這裡只談W3C規(guī)範的標準盒模型,而不談IE5和IE6在怪異模式中使用的非標準的盒子模型):

?我們要介紹的margin在最外層,因為margin(外邊距)一定是透明的,所以它可以用來使得不同的盒子之間留有一定的間隙從而達到佈局美觀等效果。從上面的盒子模型中我們可以看到,margin在四周均存在,我們可以使用margin-top、margin-right、margin-bottom、margin-left分別設定這四個方向的margin值。 (註:由於這部分知識較為基礎,所以我不再在這部分不做更多介紹)

?第二部分:margin--在同級元素(非父子關係)之間應用

這部分主要介紹水平方向和垂直方向的外邊距的合併問題。

(1)水平方向的外邊距合併

兩個水平方向的盒子相遇,那麼最終兩者之間的距離為左邊盒子的右外邊距和右邊盒子的做外邊距之和。

?範例1:

程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>水平方向的兩個盒子</title>
????<style>
????????*{
????????????margin:0;
????????????padding:0;
????????????border:0;
????????}
????????body{
????????????font-size:?0;
????????}
????????.left{
????????????width:?100px;
????????????height:?100px;
????????????background:?red;
????????????display:?inline-block;
????????????margin-right:?50px;
????????????font-size:?20px;
????????}
????????.right{
????????????width:?100px;
????????????height:?100px;
????????????background:?yellow;
????????????display:?inline-block;
????????????margin-left:?50px;
????????????font-size:?20px;
????????}
????</style>
</head>
<body>
????<p class="left">寬為100px,右邊距為50px</p>
????<p class="right">寬為100px,左邊距為50px</p>
</body>
</html>

效果如下:

這時兩者之間的距離剛好為100px。

補充說明:大家可以看到,為了使得兩個p(塊狀元素)脫離正常的文檔流我使用了display:inline-block;屬性,另外,我還把body的font-size設為0,這樣可以解決inline-block自身的問題,否則兩個p的舉例會大於100px。當然使用float也可以讓兩個p出現(xiàn)在同一行。

(2)垂直方向的外邊距合併

兩個垂直方向的盒子相遇時,其垂直方向的距離等於上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。

例2:

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>水平方向的兩個盒子</title>
????<style>
????????*{
????????????margin:0;
????????????padding:0;
????????????border:0;
????????}
????????.top{
????????????width:?100px;
????????????height:?100px;
????????????margin-bottom:?100px;
????????????background:?red;
????????}
????????.bottom{
????????????width:?100px;
????????????height:?100px;
????????????margin-top:?50px;
????????????background:?green;
????????}
????</style>
</head>
<body>
????<p class="top">高為100px,下邊距為100px</p>
????<p class="bottom">高為100px,上邊距為50px</p>
</body>
</html>

效果如下:

#這時我們?nèi)庋鄱伎梢杂^察出來,兩者垂直方向的舉例大約為100px(實際上是100px)而非100+50=150px;這正是因為兩個垂直方向的盒子相遇時,其垂直方向的距離等於上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。

另一個有趣的例子就是:假設有一個元素同時設定了margin-top和margin-bottom,但是內(nèi)容為空,那麼這兩個margin值也會疊加,值為兩者最大的一個,它類似與垂直方向上兩個盒子margin值的疊加。程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>水平方向的兩個盒子</title>
????<style>
????????*{
????????????margin:0;
????????????padding:0;
????????}
?
????????.top{
????????????width:?500px;
????????????height:?100px;
????????????background:?red;
????????}
????????.middle{
????????????margin-top:?100px;
????????????margin-bottom:50px;
????????}
????????.footer{
????????????width:?500px;
????????????height:?100px;
????????????background:?green;
????????}
?
????</style>
</head>
<body>
????<p class="top">上面的p,高100px</p>
????<p class="middle"></p>
????<p class="footer">下面的p,高100px</p>
</body>
</html>

最終的效果如下:

#

我們發(fā)現(xiàn)這時在上面的p和在下面的p之間的舉例并不是100+50=150px,而是兩者中的最大者,即100px。

那么W3C為什么會設定這樣的標準而不設定和水平方向一樣的標準呢?即margin值的疊加,實際上這也是有一定的道理的。比如我們需要設計一個由若干個段落構成的一個頁面。我們需要設置margin-top和margin-bottom使得第一段和頁面的最上方有一段距離,使得最后一段和最下方有一段距離。下面是不疊加和疊加的效果圖:

我們可以看到左邊的頁面沒有重疊,那么兩個段落之間的舉例就是最上方的兩倍間距了,而右邊的頁面發(fā)生了重疊,則所有的間距都是相等的。或許這就是這樣設定標準的目的吧,誰知道呢?

第三部分:margin--在父元素和子元素之間應用(重點)

第二部分介紹了同級元素之間使用margin,而這一部分將要介紹最有意思的父元素和子元素之間margin的應用。這一部分,我們同樣從兩個方面來討論。一方面是子元素設置水平方向上的margin值,另一方面是子元素設置豎直方向的margin值。

(1)在子元素中設置水平方向的margin值

我們可以設置margin-left來控制子元素的左邊框和父元素的左邊框之間的舉例。

例3:

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>margin</title>
????<style>
????????*{padding:0;?margin:0;?border:0;}
????????.father{
????????????width:?500px;
????????????height:?500px;
????????????background:?red;
????????}
????????.son{
????????????width:?100px;
????????????height:?100px;
????????????background:?green;
????????????margin-left:?100px;
????????}
????</style>
</head>
<body>
????<p class="father">
????????<p class="son">寬度為100px,margin-left為100px。</p>
????</p>
</body>
</html>

我將子元素的margin-left設置為了100px;效果如下:

即子元素的左邊框和父元素的左邊框之間的距離為100px。與在同級元素之間設置margin不同,因為同級元素之間的margin不會考慮到padding,但是在父元素和子元素就不同了,那么如果父元素中如果有padding,效果會是什么樣的呢?請看下面一個例子:

例4:

下面我們在上面例子的基礎上給父元素添加padding值。

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>margin</title>
????<style>
????????*{padding:0;?margin:0;?border:0;}
????????.father{
????????????width:?500px;
????????????height:?500px;
????????????padding:100px;
????????????background:?red;
????????}
????????.son{
????????????width:?100px;
????????????height:?100px;
????????????background:?green;
????????????margin-left:?100px;
????????}
????</style>
</head>
<body>
????<p class="father">
????????<p class="son">寬度為100px,margin-left為100px。</p>
????</p>
</body>
</html>

上面的代碼給父元素添加了100px的padding值,效果如下:

我們可以看到子元素舉例上方的距離為100px,因為子元素一定是在父元素的content的部分的,這點毫無疑問。

但是經(jīng)過測量可以發(fā)現(xiàn)子元素的左邊框距離父元素的左邊框之間的距離為200px,因為其中還有100px的左padding值,前面的例子因為我沒有設置padding值,所以沒有觀察出來,因此這就說明了在子元素中設置margin-left,其值實際上是子元素的左邊框距離父元素左padding內(nèi)側的距離。

例5:margin-right的使用和margin-left的使用是相似的,我在這里只舉一個例子。

這個例子在子元素中設置了margin-right值,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>margin</title>
????<style>
????????*{padding:0;?margin:0;?border:0;}
????????.father{
????????????width:?500px;
????????????height:?500px;
????????????padding:100px;
????????????background:?red;
????????}
????????.son{
????????????float:?right;
????????????width:?100px;
????????????height:?100px;
????????????background:?green;
????????????margin-right:?100px;
????????}
????</style>
</head>
<body>
????<p class="father">
????????<p class="son">寬度為100px,margin-right為100px。</p>
????</p>
</body>
</html>

這個例子與例4的區(qū)別僅在與子元素的位置不同。效果如下:

通過這個例子可以說明margin-right的值是子元素的右邊框和父元素的右padding內(nèi)側的距離。只是前面的幾個例子我沒有使用padding,所以無法觀察出來。

(2)在子元素中設置豎直方向的margin值

按照前面的經(jīng)驗,理論上來說,我們同樣可以通過設置margin-top的值使得子元素的上邊框和父元素的上padding的內(nèi)側留有一定的距離。那么我們就試試吧!

例6:

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>margin</title>
????<style>
????????*{padding:0;?margin:0;?border:0;}
????????.father{
????????????width:?500px;
????????????height:?500px;
????????????background:?red;
????????}
????????.son{
????????????width:?100px;
????????????height:?100px;
????????????background:?green;
????????????margin-top:?100px;
????????}
????</style>
</head>
<body>
????<p class="father">
????????<p class="son">高度為100px,margin-top為100px。</p>
????</p>
</body>
</html>

這個例子我設置了margin-top為100px,效果如下:

這并不是我們想要的效果啊,我們希望子元素的上部距離父元素的上部為100px,可是我們看到的卻是父元素的上部距離瀏覽器頁面的上部有100px的距離,這是為什么呢?哪里出現(xiàn)問題了呢?

實際上這是因為當父元素沒有設置padding值以及border值時,出現(xiàn)了一個bug--父元素的上方與子元素的上方完全重合在了一起,無法分開。所以才會導致上述這種父元素和子元素同時向下的情況。

對于這種問題解決方法有下面幾種:

  • 方法一:給父元素添加padding-top值

  • 方法二:給父元素添加border值

  • 方法三:給父元素添加屬性overflow:hidden;

  • 方法四:給父元素或者子元素聲明浮動float

  • 方法五:使父元素或子元素聲明為絕對定位:position:absolute;

  • 方法六:給父元素添加屬性 overflow:auto; positon:relative;(注:此方法為后續(xù)添加,感謝博友@小精靈Pawn提供此方法)

方法一:基于例6,在父元素的css代碼中添加padding-top:1px;效果如下:

?方法的唯一缺點就是增加了1px的誤差。

方法二:基于例6,在父元素的css代碼中添加border-top:1px solid transparent;效果如下:

同樣達到了效果, 缺點同方法一。

方法三:基于例6,在父元素的css代碼中添加overflow:hidden;效果如下:

同樣達到了效果,并且沒有任何誤差的存在。堪稱perfect!!!!

方法四:給父元素或者子元素聲明float;基于例6,在子元素css代碼添加float:left;或者在父元素css代碼添加float:left;均達到效果,這里不再展示相同的圖片。

優(yōu)點:沒有像素的誤差。?? 缺點:float有時是不必要的。

方法五:給父元素或者子元素添加position:absolute;屬性。 同樣達到效果。

優(yōu)點:同方法四。? 且只要我們不使用top和left也不會有任何影響,所以這也是一種不錯的方法。

方法六:給父元素添加overflow:auto;和position:relative;同樣達到效果。

第四部分:margin值的單位為%時的幾種情況

之前我舉例子時使用margin,它的值都是以px為單位的,這個理解起來沒有問題。但是如果margin值是以%為單位呢?實際上這時候百分比(%)是相對于該元素的父元素(容器),對于同級元素和父子元素都是如此。(再次感謝 博友@小精靈Pawn 提供的建議!!基于此建議補充這部分內(nèi)容) 但是在同級元素中使用豎直方向的margin時會出現(xiàn)意想不到的結果,下面舉例說明。

(1)同級元素在水平方向使用值為%的margin

例7:

<head>
????<meta charset="UTF-8">
????<title>margin</title>
????<style>
????????*{
????????????margin:0;
????????????padding:0;
????????}
????????.first{
????????????float:?left;
????????????width:?200px;
????????????height:?200px;
????????????background:?green;
????????}
????????.second{
????????????float:?left;
????????????width:?200px;
????????????height:?200px;
????????????background:?red;
????????????margin-left:?20%;
????????}
????</style>
</head>
<body>
????<p class="first">寬為200,無margin</p>
????<p class="second">寬為200,margin-left為20%;</p>
</body>
</html>

這個例子中,設置兩個元素向左浮動,以便于觀察兩者水平方向的margin。其中左邊p無margin,右邊p的margin-left為20%,效果如下:

從效果圖可以看出兩個p之間的間距始終為父元素(這里右邊p的父元素即為body,其寬度為瀏覽器寬度)的20%。

(2)同級元素在豎直方向使用值為%的margin

根據(jù)例7的啟發(fā),我們可以猜想,如果在豎直方向上使用margin,且值的單位為%,那么最終兩者之間的距離將是父元素(上例中為body)的百分數(shù)。那么究竟是不是這樣呢?看下面的例子。

例8

<head>
????<meta charset="UTF-8">
????<title>margin</title>
????<style>
????????*{
????????????margin:0;
????????????padding:0;
????????}
????????.first{
????????????width:?200px;
????????????height:?200px;
????????????background:?green;
????????}
????????.second{
????????????width:?200px;
????????????height:?200px;
????????????background:?red;
????????????margin-top:?10%;
????????}
????</style>
</head>
<body>
????<p class="first">高為200,無margin</p>
????<p class="second">高為200,margin-top為20%;</p>
</body>
</html>

這里設置上面的p無margin,下面的p的margin-top為10。效果如下:

我們發(fā)現(xiàn),當我在縮小瀏覽器的高度時,豎直方向上的間距并沒有縮?。。?! 而當我縮小瀏覽器的寬度時,豎直方向上的距離縮小了?。。?/p>

這就說明:統(tǒng)計元素之間在豎直方向上使用margin,當值的單位為%時,它是相對于父元素的寬度。

那么這里為什么不是如我們所希望的那樣相對于瀏覽器的高度呢?知乎上有大神是這樣解釋的:

(3)父子元素使用值為%的margin

對于父子元素,如果在子元素中使用單位為%margin,那么這個margin值是相對于父元素的寬度和高度(注意:這時的確是相對于父元素的高度!)的。

例9?

代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>Document</title>
????<style>
????????*{
????????????margin:0;
????????????padding:0;
????????}
????????.father{
????????????width:?500px;
????????????height:?300px;
????????????background:?red;
????????????overflow:?hidden;
????????}
????????.son{
????????????width:?100px;
????????????height:?100px;
????????????background:?green;
????????????margin-top:?20%;
????????????margin-left:?20%;
????????}
????</style>
</head>
<body>
????<p class="father">
????????<p class="son"></p>
????</p>
</body>
</html>

在這個例子中,我設置了margin-left的值為20%,margin-top的值為20%,父元素的width為500px,父元素的height為300px。下面看看效果吧。

從上圖可以看出子元素的margin-top值最終同樣是相對與父元素的寬度而非高度。

總結:

這篇博文只介紹了margin的其中一部分知識點,但如果大家讀后能有些許收獲是再好不過的了。由于本人總結倉促,知識不足,錯誤在所難免,希望大家如果發(fā)現(xiàn)不妥之初能提出意見,我將非常感激。

相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關注php中文網(wǎng)其它相關文章!

推薦閱讀:

CSS3的box-sizing屬性圖文教程

在CSS邊界線消失如何處理

三種絕對定位元素的水平垂直居中的辦法

以上是css中的margin屬性詳解的詳細內(nèi)容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何用PHP搭建社交分享功能 PHP分享接口集成實戰(zhàn) 如何用PHP搭建社交分享功能 PHP分享接口集成實戰(zhàn) Jul 25, 2025 pm 08:51 PM

在PHP中搭建社交分享功能的核心方法是通過動態(tài)生成符合各平臺要求的分享鏈接。 1.首先獲取當前頁面或指定的URL及文章信息;2.使用urlencode對參數(shù)進行編碼;3.根據(jù)各平臺協(xié)議拼接生成分享鏈接;4.在前端展示鏈接供用戶點擊分享;5.動態(tài)生成頁面OG標籤優(yōu)化分享內(nèi)容展示;6.務必對用戶輸入進行轉義以防止XSS攻擊。該方法無需複雜認證,維護成本低,適用於大多數(shù)內(nèi)容分享需求。

PHP打造博客評論系統(tǒng)變現(xiàn) PHP評論審核與防刷策略 PHP打造博客評論系統(tǒng)變現(xiàn) PHP評論審核與防刷策略 Jul 25, 2025 pm 08:27 PM

1.評論系統(tǒng)商業(yè)價值最大化需結合原生廣告精準投放、用戶付費增值服務(如上傳圖片、評論置頂)、基於評論質量的影響力激勵機制及合規(guī)匿名數(shù)據(jù)洞察變現(xiàn);2.審核策略應採用前置審核 動態(tài)關鍵詞過濾 用戶舉報機制組合,輔以評論質量評分實現(xiàn)內(nèi)容分級曝光;3.防刷需構建多層防禦:reCAPTCHAv3無感驗證、Honeypot蜜罐字段識別機器人、IP與時間戳頻率限制阻止灌水、內(nèi)容模式識別標記可疑評論,持續(xù)迭代應對攻擊。

什麼是常見的CSS瀏覽器不一致? 什麼是常見的CSS瀏覽器不一致? Jul 26, 2025 am 07:04 AM

不同瀏覽器對CSS解析存在差異,導致顯示效果不一致,主要包括默認樣式差異、盒模型計算方式、Flexbox和Grid佈局支持程度及某些CSS屬性行為不一致。 1.默認樣式處理不一致,解決方法是使用CSSReset或Normalize.css統(tǒng)一初始樣式;2.舊版IE的盒模型計算方式不同,建議統(tǒng)一使用box-sizing:border-box;3.Flexbox和Grid在邊緣情況或舊版本中表現(xiàn)有差異,應多測試並使用Autoprefixer;4.某些CSS屬性行為不一致,需查閱CanIuse並提供降級

如何用Mac搭建PHP Nginx環(huán)境 MacOS配置Nginx與PHP服務組合 如何用Mac搭建PHP Nginx環(huán)境 MacOS配置Nginx與PHP服務組合 Jul 25, 2025 pm 08:24 PM

Homebrew在Mac環(huán)境搭建中的核心作用是簡化軟件安裝與管理。 1.Homebrew自動處理依賴關係,將復雜的編譯安裝流程封裝為簡單命令;2.提供統(tǒng)一的軟件包生態(tài),確保軟件安裝位置與配置標準化;3.集成服務管理功能,通過brewservices可便捷啟動、停止服務;4.便於軟件升級與維護,提升系統(tǒng)安全性與功能性。

描述'垂直align”屬性及其典型用例 描述'垂直align”屬性及其典型用例 Jul 26, 2025 am 07:35 AM

1.ItAdjustSelementsLikeImagesRikeImagesOrformInputswithIntExtLineSustLineSlineSlineSlineSlikeLikeLikeBaseline,中間,Super,Super,Super和Sub.2.intablebecells,ItControlScontentalStalteNtalmscontentalMedwithThtop,Middle,Middle,Midder,Midder,經(jīng)常

什麼是口音色的物業(yè)? 什麼是口音色的物業(yè)? Jul 26, 2025 am 09:25 AM

accent-color是CSS中用於自定義復選框、單選按鈕和滑塊等表單元素高亮顏色的屬性;1.它直接改變表單控件選中狀態(tài)的默認顏色,如將復選框的藍色勾選標記改為紅色;2.支持的元素包括type="checkbox"、type="radio"和type="range"的輸入框;3.使用accent-color可避免複雜的自定義樣式和額外DOM結構,保持原生可訪問性;4.現(xiàn)代瀏覽器普遍支持,舊瀏覽器需降級處理;5.設置accent-col

如何將SCSS編譯到CSS? 如何將SCSS編譯到CSS? Jul 27, 2025 am 01:58 AM

installdartsassvianpmafterinstallingnode.jsusingnpminstall-gsass.2.compilescsstocssssusingthecommandSassInput.scsssoutput.css.3。 useass - watchinput.scssoutput.csstoauto-compileonsave.4.watchentirefolderswithsass-watchscss:css.5.usepartialswith_prefixfo

如何更改CSS中的文本顏色? 如何更改CSS中的文本顏色? Jul 27, 2025 am 04:25 AM

要改變CSS中文本顏色,需使用color屬性;1.使用color屬性可設置文本前景色,支持顏色名稱(如red)、十六進制碼(如#ff0000)、RGB值(如rgb(255,0,0))、HSL值(如hsl(0,100%,50%))以及帶透明度的RGBA或HSLA(如rgba(255,0,0,0.5));2.可將顏色應用於包含文本的任何元素,如h1至h6標題、段落p、鏈接a(需注意a:link、a:visited、a:hover、a:active不同狀態(tài)的顏色設置)、按鈕、div、span等;3.最

See all articles