CSS盒子模型

来源:http://www.cnblogs.com/giggle/archive/2016/01/28/5161941.html
-Advertisement-
Play Games

對CSS盒子模型的理解,以及闡述了margin、border、padding、content的作用和在標準模式與怪異模式的區別。


盒子模型

在CSS這個一切皆為框的世界里,今天我想談談我對CSS盒子模型的理解,如有不妥,請狠狠拍磚。

一、什麼是CSS盒子模型呢?

  通俗一點,CSS盒子模型由外邊距(margin)、邊框(border)、內邊距(padding)、元素內容(content)組成,請見下圖:

 

二、盒子模型中margin、border、padding、content的各自作用

(1) margin:

 

自己的理解

 

控制元素周圍空間的間隔,從視覺角度上達到相互隔開的目的。註意:行內元素是木有margin-top、margin-bottom的。

 

CSS權威指南

邊界,元素周圍生成額外的空白區。“空白區”通常是指其他元素不能出現且父元素背景可見的區域。

 

下麵通過具體的demo初步來瞧瞧margin的作用,比如有兩個塊級元素,如div,在它們margin都設置為0時,效果是這樣的:

 1 <!DOCTYPE html>
 2     <head>
 3         <title>no_margin</title>
 4         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 5         <style>
 6             * {
 7                 margin:0;
 8                 padding:0;
 9             }
10             div {
11                 width:80px;
12                 height:80px;
13                 line-height:80px;
14                 text-align:center;
15             }
16             .div1 {
17                 background:#9FCD82;
18             }
19             .div2 {
20                 background:#C8ECCC;
21             }
22         </style>
23     </head>
24     <body>
25         <div class="div1">
26             div1
27         </div>
28         <div class="div2">
29             div2
30         </div>
31     </body>
32 </html>
View Code

 

倘若我想要讓div2的上邊距遠離div1一些距離,如10像素呢?我們可以設置相對應的div2樣式margin-top:10px,設置後的結果見下圖

 1 <!DOCTYPE html>
 2     <head>
 3         <title>no_margin</title>
 4         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 5         <style>
 6             * {
 7                 margin:0;
 8                 padding:0;
 9             }
10             div {
11                 width:80px;
12                 height:80px;
13                 line-height:80px;
14                 text-align:center;
15             }
16             .div1 {
17                 background:#9FCD82;
18             }
19             .div2 {
20                 background:#C8ECCC;
21                 margin-top:10px;
22             }
23         </style>
24     </head>
25     <body>
26         <div class="div1">
27             div1
28         </div>
29         <div class="div2">
30             div2
31         </div>
32     </body>
33 </html>
View Code

 

為達到div2距離div1垂直之間相距10像素的效果,也可以設置div1的margin-bottom:10px;

或者同時設置div1的margin-bottom:10px;和div2的margin-top:10px;

你可能會感覺奇怪,為什麼同時設置都可以呢?!!!

同時設置後它們的相對距離不應該是20px了嗎?!!!

這就又要涉及到margin的重疊問題啦。

css2.0規範中對於margin的重疊,描述是:水平邊距永遠不會重合,垂直邊距可能會在特定的框之間重合。

我靠,這個垂直邊距可能會在特定的框之間重合,是在哪個特定情況呢。請見下表

1、

在普通流中,兩個或者更多的塊級元素相鄰的垂直邊,會重合。如果邊距都為正數,選其最大的值;如果出現負邊距,則用正邊距減去負邊距。

2、

在一個浮動框和其它框之間的垂直邊距是不重合的。

3、

絕對定位的框與相對定位的框,邊距不重合

現在大家知道為什麼對前面demo中兩個div的邊距不是20px,而是10px了吧。

針對第2點--在一個浮動框和其它框之間的垂直邊距是不重合的。我還想談談,使用block元素+float+margin請註意在IE6下會出現一個雙邊距問題哦,常見的解決方案就是將block元素換成inline-block元素,不過ie6除了在某些機構外,估計也木有人用了吧!!!

(2) border:

它是可見的,你可以設置任何元素的邊框。如我將一個div設置為5px的黑色實線邊框border:5px solid #000000。見下圖:

 1 <!DOCTYPE html>
 2     <head>
 3         <title>border</title>
 4         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 5         <style>
 6             * {
 7                 margin:0;
 8                 padding:0;
 9             }
10             div {
11                 width:80px;
12                 height:80px;
13                 line-height:80px;
14                 text-align:center;
15             }
16             .div1 {
17                 background:#9FCD82;
18                 border:5px solid #000000;
19             }
20         </style>
21     </head>
22     <body>
23         <div class="div1">
24             div1
25         </div>
26     </body>
27 </html>
View Code

(3)padding:

padding是設置內容區域與border的距離的,沒有負值;並且如果你不通過調試器來看,你是看不出padding設置的是多少值的。註意:行內元素沒有padding-top和padding-bottom。

(4)content:

內容。是內容占的區域content,而不是內容區域contentarea。

我靠,content != contentarea ?

答案:是的。

談到contentarea,那麼你就應該有必要清楚地瞭解什麼是標準盒子模型,什麼又是IE盒子模型啦。其實它們的區別在與對contentarea 的解析不同,說白了,就是對width、height解析不一樣啦,盒子都一樣,包括margin、border、padding、content。下麵我們具體來看一看這兩種模型,先從標準盒子模型開始:

標準盒子模型的width、height只包括內容區域 content,詳情見下圖

IE盒子模型的width、height則包括了內容區域的content、內邊距padding以及邊框border,詳情見下圖

 

這個怎麼解決!!!一個盒子在不同的瀏覽器解析不同!!!

不用擔心,申明文檔類型,一鍵快速解決。

<!DOCTYPE html>這個熟悉吧,它的作用就將標準模式和怪異模式統一為標準模式,當然解析盒子嘛,也就解析為標準模式咯。

我靠,那這是不是太霸道了點,強硬的你可能會說,我覺得IE盒子模型不錯呢,勞資就要用它,哈哈,不要動怒,css3中已經提供了這一屬性box-sizing,它有兩個值content-box和border-box。當你申明文檔類型<!DOCTYPE html>時,預設是content-box,也就是標準盒子模型,如果你想使用IE盒子模型,reset一下box-sizing為border-box就OK啦。

Bootstrap也是這麼做的哦,下圖是bootstrap的部分css reset,可供你參考。

下麵我們來簡單驗證一下box-sizing的兩個值(content-box和border-box)到底是否與上面講的標準盒子模型與IE盒子模型一樣。

當設置box-sizing:content-box時,通過chrome調試器的結果如下

可以看出我設置的width:80px,內容區域顯示的也是80px。

接下來,當我設置box-sizing:border-box時,通過chrome調試器的結果如下

可以看出,我僅僅改變了box-sizing的值,其他的都原封不動,我設置的width:80px,但是內容content只顯示出來50px,並且細心的你可以發現

width(80px)  ===  content(50px) + padding(10px)*2  + border(5px)*2

height(80px)  ===  content(50px) + padding(10px)*2  + border(5px)*2

 

通過比較分析上面兩張圖片,可以知道box-sizing的兩個值的確對應標準盒子模型(content-box)和IE盒子模型(border-box)。

好啦,盒子模型也差不多講到這裡了,時間也不早,洗洗睡咯。今天第一次開博,如有不對之處,望狠狠拍磚~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 來源:w3cplus - 南北(@ping4god) 網址:http://www.w3cplus.com/tools/dev-tips.html 谷歌瀏覽器如今是Web開發者們所使用的最流行的網頁瀏覽器。伴隨每六個星期一次的發佈周期和不斷擴大的強大的開發功能,Chrome變成了一個必須的工具。大多數
  • 本篇主要通過分析Tony Parisi的sim.js庫(原版代碼托管於:https://github.com/tparisi/WebGLBook/tree/master/sim),總結基礎Web3D框架的編寫方法。在上一篇的基礎上,要求讀者具有簡短英文閱讀或者查字典的能力。 限於水平和時間,本文難免
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o
  • 最近在研究css~當設置一個元素width後~有時候也會對他設定padding,margin,border值, 每次這樣我就心裡琢磨,那這個元素的width會變嗎,js獲取元素的寬度width()指的是哪個寬度,還有innerWidth()?outerWidth()?outerWidth(true)
  • SVG 基本內容 SVG並不屬於HTML5專有內容 HTML5提供有關SVG原生的內容 在HTML5出現之前,就有SVG內容 SVG,簡單來說就是矢量圖 SVG文件的擴展名為".svg" SVG使用的是XML語法 概念 SVG是一種使用XML技術描述二維圖形的語言 SVG的特點 SVG繪製圖形可以被
  • 在瞭解浮動屬性之前,首先我們先瞭解一下html中關於display屬性的相關知識。 display屬性常用的有inline, block, inline-block. inline也就是內聯的意思。 常見的html標簽中如 span, font, a, b, em 都是內聯元素。 所謂內聯,簡單理解
  • 如果可以回到過去的話,我會告訴自己這句話:"初學JavaScript的時候無視DOM和BOM的相容性" 我初學時的處境 在我初學JavaScript的時候最頭痛的就是瀏覽器相容問題。在Firefox下麵好好的代碼放到IE就不能顯示了,又或者是在IE能正常顯示的代碼在firefox又報錯了。 前端開發
  • 效果體驗:http://hovertree.com/texiao/jquery/26/本效果適用於移動設備,可以使用手機等瀏覽效果。代碼下載:http://hovertree.com/h/bjaf/e14uccpw.htmHTML代碼如下: 1 <!doctype html> 2 <html lan
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...