CSS必學:你需要知道的盒子模型的秘密

来源:https://www.cnblogs.com/wmbuke/archive/2023/10/24/17783071.html
-Advertisement-
Play Games

作者:WangMin 格言:努力做好自己喜歡的每一件事 作為前端開發來說,要掌握的CSS基礎一定很多,那麼CSS中盒子模型肯定是必考必問必掌握的前端知識點,因為它是CSS基礎中非常重要的內容,接下來我們就一起來瞭解一下盒子模型吧! 什麼是盒子模型? CSS 所有的HTML 標簽元素在網頁中都生成了一 ...


作者:WangMin
格言:努力做好自己喜歡的每一件事

作為前端開發來說,要掌握的CSS基礎一定很多,那麼CSS中盒子模型肯定是必考必問必掌握的前端知識點,因為它是CSS基礎中非常重要的內容,接下來我們就一起來瞭解一下盒子模型吧!

什麼是盒子模型?

CSS 所有的HTML 標簽元素在網頁中都生成了一個描述該元素在HTML文檔佈局中所占空間的矩形框,我們可以形象地將它看作是一個盒子,它會把各種html元素按照設計需求包裹起來,將html元素進行封裝,就組成了各式各樣好看的網頁。

簡單一點來說,頁面中的每一個標簽,都可以看作是一個盒子,通過盒子的視角我們可以更直觀地進行網頁排版佈局.

盒子模型的組成以及大小的計算

盒子模型的四個組成屬性:內容區域(content)、填充區域(padding)、邊框(border)以及 外邊距區域(margin)

下麵來分別瞭解一下這四個屬性!

內容區(content)

內容區域(content)是盒子模型的中心,它呈現了盒子的主要信息內容,這些內容可以你想要展示的任何東西,例如文本、圖片等等多種類型。

這時候你會有一個疑問"內容區的大小如何確定呢?" 那麼這裡就可以提到width屬性和height屬性,這兩個屬性大家應該不陌生吧!

內容區域(content)就是由這兩個屬性組成的,使用width屬性和height屬性可以指定盒子內容區域的高度和寬度,如圖所示

案例1:

只給元素設置width屬性和height屬性,我們來看看盒子模型的大小是多少?

<div id="box"></div>
<style>
    #box{
        width: 300px;
        height: 300px;
        background:#f00;
    }
</style>

結果如圖所示:

從上圖中我們可以明顯地看出盒子模型的大小為200 * 200,正是元素的高度與寬度。

由此可以的出一個結論:當一個元素只有width屬性和height屬性時,那麼這個元素的內容區域的大小就是盒子模型的大小,

即盒子模型的大小=內容區域的大小.

邊框(border)

邊框是圍繞在內容區和填充四周的邊界

相信大家對border屬性應該十分熟悉吧!border屬性其實是 border-style、border-width和border-color 這三個屬性的簡寫方式,

它們分別對應的含義與屬性值如下表:

屬性 含義 屬性值
border-style 指定邊框樣式,是邊框最重要的屬性。如果沒有指定邊框樣式,其他的邊框屬性都會被忽略,邊框將不會顯示 dotted(點線)、dashed(虛線)、solid(實線)等等
border-width 指定邊框的寬度 任意數值,通常單位為px
border-color 指定邊框的顏色 css中任何一種顏色表示方法都可以

案例2:

在案例1的基礎上,再給元素設置boder屬性,我們來看看盒子模型的大小是多少呢?

<div id="box"></div>
<style>
    #box{
        width: 300px;
        height: 300px;
        border:3px solid #000;
        background:#f00;
    }
</style>

結果如圖所示:

從上圖中可以明顯的看出,我設置的邊框寬度明明是3px,為什麼瀏覽器顯示的是2.4px呢?大家這時候應該都很疑惑

這裡我給大家解答一下:這可能是因為你的瀏覽器縮放比例不是100%,如果瀏覽器比例是100%而值還是對的話,那麼可能是電腦的縮放比例不是100%,通常電腦比例都是125%,可以讓用戶視覺上由更好的體驗。如果你想要瀏覽器顯示出正確的數值,你可以將電腦的縮放比例改為100%。

那麼此時從圖中我們也可以看出盒子模型的大小為204.8 * 204.8

盒子模型的寬度=200(寬度)+ 2.4(左邊框)+2.4(右邊框)= 204.8

盒子模型的高度=200(高度)+ 2.4(上邊框)+2.4(下邊框)= 204.8

由此可以的出一個結論:當一個元素設置width屬性、height屬性以及border屬性時,

那麼這個元素的盒子模型的寬度 = width + 左邊框 + 右邊框,

元素的盒子模型的高度 = height + 上邊框 + 下邊框

元素的盒子模型的大小 = 元素的盒子模型的寬度 * 元素的盒子模型的高度

填充區域(padding)

填充區域是內容區域和邊框之間的空間,填充區域也可以叫做內邊距。

padding屬性是padding -top(上內邊距)、padding -bottom(下內邊距)、padding -left(左內邊距)、padding-right(右內邊距)這四個屬性的簡寫方式,常見的取值方式如下表:

取值個數 例子 含義
1 padding:10px 上右下左四個方向的內邊距都設置為10px
2 padding:10px 30px 上下方向的內邊距設置為10px、左右方向的內邊距設置為30px
3 padding:10px 30px 40px 上內邊距設置為10px、左右方向的內邊距設置為30px、下內邊距設置為40px
4 padding:10px 30px 40px 50px 上內邊距設置為10px、右內邊距設置為30px、下內邊距設置為40px、左內邊距設置為50px

案例3:

在案例1和案例2的基礎上,再給元素的上下內邊距設置為10px,左右內邊距設置為20px,我們來看看盒子模型的大小是多少呢?

<div id="box"></div>
<style>
    #box{
        width: 300px;
        height: 300px;
        border:3px solid #000;
        padding:10px 20px;
        background:#f00;
    }
</style>

結果如圖所示:

那麼此時從圖中我們也可以看出盒子模型的大小為244.8 * 224.8

盒子模型的寬度=200(寬度)+ 20 (左內邊距) + 2.4(左邊框)+ 20 (右內邊距) + 2.4(右邊框) = 244.8

盒子模型的高度=200(高度)+ 10 (上內邊距) + 2.4(上邊框)+ 10 (下內邊距) + 2.4(下邊框) = 224.8

由此可以的出一個結論:當一個元素設置width屬性、height屬性、border屬性以及padding屬性時,

那麼這個元素的盒子模型的寬度 = width + 左內邊距 + 左邊框 + 右內邊距 + 右邊框,

元素的盒子模型的高度 = height + 上內邊距 +上邊框 + 下內邊距 + 下邊框

元素的盒子模型的大小 = 元素的盒子模型的寬度 * 元素的盒子模型的高度

外邊距區域(margin)

外邊距區域位於盒子的最外面,是添加在邊框外周圍的空間,盒子與盒子之間的距離。外邊距區域(margin)使盒子與盒子之間不會緊湊地挨在一起,是CSS 佈局的一個很重要的屬性。

margin屬性跟padding屬性類似,是**margin -top(上外邊距)、margin -bottom(下外邊距)、margin -left(左外邊距)、margin-right(右外邊距) **這四個屬性的簡寫方式,常見的取值方式如下表:

取值個數 例子 含義
1 margin:10px 上右下左四個方向的外邊距都設置為10px
2 margin:10px 30px 上下方向的外邊距設置為10px、左右方向的外邊距設置為30px
3 margin:10px 30px 40px 上外邊距設置為10px、左右方向的外邊距設置為30px、下外邊距設置為40px
4 margin:10px 30px 40px 50px 上外邊距設置為10px、右內外距設置為30px、下外邊距設置為40px、左外邊距設置為50px

案例4:

在案例1、案例2以及案例3的基礎上,再給元素的上下外邊距設置為10px,左右外邊距設置為30px,我們來看看盒子模型的大小是多少呢?

<div id="box"></div>
<style>
    #box{
        width: 300px;
        height: 300px;
        border:3px solid #000;
        padding:10px 20px;
        margin:10px 30px;
        background:#f00;
    }
</style>

結果如圖所示:

那麼此時從圖中我們也可以看出盒子模型的大小為244.8 * 224.8,跟案例3的結果一樣沒有改變。

由此可以的出一個結論::margin屬性不會計算到盒子模型的大小裡面去,也就是說它不會影響盒子模型的大小,它影響的是盒子與盒子之間的距離

預設寬度的情況下,盒子模型大小的計算

我們在沒有設置寬度的情況下,瀏覽器顯示的寬度就是預設寬度。

舉個簡單的例子來說明一下

<div id="box">今天天氣真好啊!</div>
<style>
  #box{
       height: 100px;
       background:#ccc;
  }
</style>

結果如圖所示:

從上圖中可以看到,在沒有給元素#box設置寬度的情況下,它的預設寬度是1472px, 會鋪滿整個父元素,這裡#box的父元素是body,而body的寬度是根據你的電腦屏幕大小而定的,所以我這裡是#box的預設寬度為1472px。

案例5

當給一個沒有寬度的元素設置上下外邊距為20px,左右外邊距為30px時,也就是margin:20px 30px時,我們來看看盒子模型的大小是多少呢?

<div id="box">今天天氣真好啊!</div>
<style>
  #box{
       height: 100px;
       margin:20px 30px;
       background:#ccc;
  }
</style>

結果如圖所示:

從上圖中可以看到元素#box的高度沒變依舊是100px,預設寬度變為了是1412px,這是為什麼呢?那麼就跟設置的margin屬性有關了。

我們發現剛好1412px=1470px - 30px - 30px,這是因為當我們在沒有給元素設置寬度,並且還設置了margin屬性的情況下,它會在預設寬度的基礎上減去左右外邊距才會的到最終呈現在瀏覽器上的寬度,設置的上下外邊距不會對元素的高度產生影響,只會影響元素的上下位置。

也就是說當元素處於預設寬度,但設置了margin屬性的情況下時,元素的盒子模型寬度會受左右外邊距的影響,元素的盒子模型寬度不會受上下外邊距的影響。

此時元素的盒子模型寬度 = 預設寬度 - 左外邊距 - 右外邊距

元素的盒子模型高度 = height

案例6

當給一個沒有寬度的元素分別設置margin:20px 30px,padding:10px,border:3px solid #000;的情況下,我們來看看盒子模型的大小是多少呢?

<div id="box">今天天氣真好啊!</div>
<style>
  #box{
       height: 100px;
       margin:20px 30px;
       border:3px solid #000;
       padding:10px;
       background:#ccc;
  }
</style>

結果如圖所示:

從上圖可以看到元素的寬度跟上一個案例的寬度一樣沒有改變,依舊是1412px,而高度反而變為了124.8px,這是為什麼呢?

我明明給元素設置了padding:10px,border:3px solid #000;,按照案例2與案例3盒子模型大小的計算方式,應該會對元素大小有影響,但是這裡並沒有影響到元素大小,由此可以得到一個結論:當我們在沒有給元素設置寬度,但設置了padding屬性與border屬性的情況下時,左右內邊距與左右邊框不會影響到元素的預設寬度。這裡高度發生了變化,是因為這裡給元素高度設置了100px,按照案例2與案例3元素盒子模型大小的計算方式,最終元素盒子模型的高度會加上上下內邊距與上下邊框,就變成了100+10+2.4+10+2.4=124.8px。

那麼此時元素的盒子模型的寬度 = 預設寬度 - 左右外邊距(內容區域高度 + 左右內邊距 + 左右邊框)

元素的盒子模型的高度 = height + 上下邊框 +上內邊距 +下邊框 +下內邊距

總結

當一個元素沒有設置寬度,也就是預設寬度的情況下,設置的左右外邊距會影響到元素的盒子模型的大小,設置的左右內邊距和左右邊框不會影響到元素的盒子模型的大小。元素的盒子模型的大小會不會受margin屬性的影響取決於這個元素有沒有設置寬度。

盒子模型的分類

CSS樣式中明確將盒子模型分為標準盒子模型與怪異盒子模型。怪異盒子模型也稱為IE盒子模型

其主要的屬性為box-sizing,當屬性值為:content-box時,該元素的盒子模型為標準盒子模型;

當屬性值為:border-box時,該元素的盒子模型為怪異盒子模型;

當未設值box-sizing屬性時,該元素的盒子模型也為標準盒子模型。

標準盒子模型

上述案例中所提到的都是標準盒子模型,在標準模式下,盒子模型大小的計算方式如下:

元素的盒子模型的寬度 = width + 左內邊距 + 左邊框 + 右內邊距 + 右邊框

元素的盒子模型的高度 = height + 上內邊距 +上邊框 + 下內邊距 + 下邊框

元素的盒子模型的大小 = 元素的盒子模型的寬度 * 元素的盒子模型的高度

詳細案例可以往上翻閱查看

怪異盒子模型 (IE盒子模型)

案例7:

在上述案例的基礎上,再給元素設置上box-sizing屬性,並且屬性值為border-box時,我們來看看盒子模型的大小是多少呢?

<div id="box"></div>
<style>
    #box{
        width: 300px;
        height: 300px;
        border:3px solid #000;
        padding:10px 20px;
        margin:10px 30px;
        box-sizing: border-box;
        background:#f00;
    }
</style>

結果如圖所示:

從上述案例中第二張圖中我們可以看出盒子模型的大小為200 * 200,不正是我設置的寬度與長度嗎?會從上述案例中第一張圖中找到答案。圖中左右內邊距以及左右邊框以及內容區域的寬度是包含在設置的寬度內的,也就是說在怪異模式下,盒子模型的寬度=width(左右內邊距+左右邊框+內容區域的寬度);圖中上下內邊距以及上下邊框以及內容區域的高度是包含在設置的高度內的,也就是說在怪異模式下,盒子模型的高度=height(上下內邊距+上下邊框+內容區域的高度)

註意:在標準盒子模型和怪異盒子模型 (IE盒子模型)下,margin屬性都不會計算到盒子模型的大小裡面去。


以上僅是個人見解,若有不足之處歡迎在下方評論指出,那就先分享到這裡!!

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

-Advertisement-
Play Games
更多相關文章
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 在 Linux 系統中,/proc和/sys都是特殊的文件系統,數據內容是存放在記憶體中,這兩個目錄文件中的內容由內核動態生成,查看這個文件中的內容,實際上就是查詢內核的某些狀態或信息。 可以將這兩個目錄文件理解為虛擬的目錄,即在硬碟上不存在。 /proc 文件系統 proc 是process(進程) ...
  • 導讀: 本文系原創,歡迎規範轉載。 本文描述瞭如何處理linux虛擬機從xen虛擬化遷移kvm虛擬化遇到問題,包括重建initramfs,處理未卸載的tools等。 系列文章: xen2kvm遷移-Windows篇 xen2kvm遷移-Linux篇 遷移環境: 源平臺:華為FusionCompute ...
  • 痞子衡嵌入式半月刊: 第 83 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 1. on-my-zsh安裝 1.1. 使用curl方式安裝 1.1.1 官方鏡像源 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 1.1.2 國內Git ...
  • 1. 增長 1.1. 在高速的業務環境中,流量可能逐年增長幾個數量級,環境會變得更加複雜,隨之而來的數據需求也會快速增加 1.2. 擴展Web伺服器 1.2.1. 在負載均衡的後端添加更多的伺服器節點,而這通常就是擴展We b伺服器的全部工作 2. 可擴展性 2.1. 系統支撐不斷增長的流量的能力 ...
  • 更多技術交流、求職機會,歡迎關註位元組跳動數據平臺微信公眾號,回覆【1】進入官方交流群 近年來,隨著消費者的心理需求逐步趨向於精神層面、科技的迭代迅速以及市場環境的複雜性逐步上升,我國的廣告行業逐步展開新的投放模式。但流量成本高,企業試錯成本高昂,如何在控製成本的同時實現廣告投放效益最大化,成為廣告投 ...
  • HDFS文件系統基本信息 HDFS作為分散式存儲的文件系統,有其對數據的路徑表達方式。 HDFS同Linux系統一樣,均是以/作為根目錄的組織形式 Linux: /usr/local/hello.txt HDFS: /usr/local/hello.txt 命令行 # 老版本用法 hadoop fs ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...