搜尋

容器盒子模型 (Box Model )

網頁中所有的元素所產生的容器,都會透過一套標準的「盒子模型 Box Model」來定義容器的「長寬、內邊距、邊框和外邊界」,盒子模型也是網頁排版最基礎也必備的 CSS 知識,這篇教學會介紹什麼是盒子模型、盒子模型的水平對齊和垂直對齊行為。

快速導覽:

CSS 教學 - 容器盒子模型 ( box Model )

認識盒子模型 (Box Model )

容器的盒子模型的構造如下圖所示,從內而外分成:「內容、內邊距、邊框、外邊界」四層。

盒子模型結構 說明 對應樣式屬性 box-sizing 影響
內容 元素本身呈現的內容。 width 和 height
內邊距 元素內緣向外延伸到邊框的範圍。 padding
邊框 元素邊框。 border
外邊界 元素邊框外緣延伸出去的範圍。 margin 不會

CSS 教學 - 容器盒子模型 ( box Model ) - 認識盒子模型

盒子模型的水平對齊

當元素本身是「行內容器」類型特性時 ( inlineinline-* ),可以進行「水平對齊」,對齊時會使用盒子模型的「外邊界」作為左右對齊的依據

CSS 教學 - 容器盒子模型 ( box Model ) - 水平對齊行為

下方的範例將兩個 div 改成 display:inline;,並分別設定 margin 為 50px 和 25px 並進行靠左對齊。

線上展示:https://codepen.io/oxxo/pen/mdYKXZa

<!-- HTML 程式碼 -->
<main>
  <span>Good Morning</span>
  <br/>
  <div>oxxo</div>
  <br/>
  <div class="a">apple</div>
</main>

<!-- CSS 程式碼 -->
<style>
  main{
    text-align: left;   /* inline 顯示類型的子元素靠左對齊 */
    font-size: 20px;
  }
  span {background: orange;}
  div {
    display: inline;      /* 將 div 換成 inline 類型 */
    background: pink;
    padding: 20px;
    margin: 50px;
    border: 10px solid #000;
    line-height: 100px;  /* 設定行高避免重疊 */
  }
  .a {
    background:cyan;
    padding: 10px;
    margin: 25px;
    line-height: 100px;  /* 設定行高避免重疊 */
  }
</style>

CSS 教學 - 容器盒子模型 ( box Model ) - 水平左右對齊

進行「水平置中」時,會先計算容器的總寬度,接著透過「總寬度 / 2」計算出中心點的位置進行垂直對齊,而總寬度的計算與 box-sizing 的屬性值有關,下方列出不同屬性值下總寬度的算法:

inline 顯示類型元素無法調整寬高,inline-* 顯示類型元素才能調整寬高。

box-sizing 總寬度
content-box 左外邊界寬 + 左邊框寬 + 左內邊距寬 + 內容寬 + 右內邊距寬 + 右邊框寬 + 右外邊界寬
border-box 左外邊界寬 + 內容寬 + 右外邊界寬

下方的範例可以很明顯地看出,兩個 div 因為左右 margin 和 padding 數值不同,所以在水平置中對齊時,就會發生偏向左邊或右邊的狀況。

線上展示:https://codepen.io/oxxo/pen/yLWEvmJ

<!-- HTML 程式碼 -->
<main>
  <span>Good Morning</span>
  <br/>
  <div>oxxo</div>
  <br/>
  <div class="a">apple</div>
</main>

<!-- CSS 程式碼 -->
<style>
  main{
    text-align: center;      /* inline 的子元素水平置中 */
    font-size: 20px;
  }
  span {
    background: orange;      /* 將 div 換成 inline 類型 */
  }
  div {
    display: inline;
    background: pink;
    padding: 20px 20px 0 0;  /* 設定上右內邊距為 20px,下左內邊距為 0 */
    margin: 0 50px 0 0;      /* 設定右外邊界為 50px,上下左外邊界為 0 */
    border: 10px solid #000;
    line-height: 100px;
  }
  .a {
    background:cyan;
    padding: 10px 0 0 10px;  /* 設定上左內邊距為 10px,下右內邊距為 0 */
    margin: 0 0 0 25px;      /* 設定左外邊界為 50px,上下右外邊界為 0 */
    line-height: 50px;
  }
</style>

CSS 教學 - 容器盒子模型 ( box Model ) - 水平置中對齊

盒子模型的垂直對齊

當元素本身是「行內或表格容器」類型特性時 ( inlineinline-*tabletable-* ),可以進行「垂直對齊」,對齊時會使用盒子模型的「外邊界」作為垂直對齊的依據

CSS 教學 - 容器盒子模型 ( box Model ) - 垂直對齊行為

下方的範例將兩個 div 改成 display:inline-block;,並分別用 margin 設定下邊界為 20px 和 50px 並進行垂直對齊,垂直對齊使用預設值 baseline,過程中在內容加入一個 displayblock 的 div 凸顯內容大小。

線上展示:https://codepen.io/oxxo/pen/mdYKXNa

<!-- HTML 程式碼 -->
<main>
  <span>Good Morning</span>
  <div><div></div> </div>
  <div class="a"><div></div> </div>
</main>

<!-- CSS 程式碼 -->
<style>
  main {font-size: 20px;}
  span {
    background: orange;
  }
  div {
    display: inline-block;  /* 將 div 的顯示類型改成 inline-block */
    background: pink;
    width: 50px;
    height: 50px;
    padding: 20px;
    margin: 0  0 20px 0;   /* 下外邊界為 20px,上左右外邊界為 0 */
    border: 10px solid #000;
  }
  .a {
    background:cyan;
    margin: 0 0 50px 0;   /* 下外邊界為 50px,上左右外邊界為 0 */
  }
  div div{
    display: block;        /* 內容 div 的顯示類型為 block */
    width: 50px;
    height: 50px;
    padding: 0;           /* 內邊距為 0 */
    margin: 0;            /* 外邊界為 0 */
    border: none;         /* 邊框為 0 */
    background: yellow;
  }
</style>

CSS 教學 - 容器盒子模型 ( box Model ) - 垂直對齊

進行「垂直置中」時,會先計算容器的總高度,接著透過「總高度 / 2」計算出中心點的位置進行垂直對齊,而總高度的計算與 box-sizing 的屬性值有關,下方列出不同屬性值下總高度的算法:

inline 顯示類型元素無法調整寬高,inline-* 顯示類型元素才能調整寬高。

box-sizing 總高度
content-box 上外邊界高 + 上邊框高 + 上內邊距高 + 內容高 + 下內邊距高 + 下邊框高 + 下外邊界高
border-box 上外邊界高 + 內容高 + 下外邊界高

下方的範例可以很明顯地看出,兩個 div 因為上下 margin 和 padding 數值不同,所以在垂直置中對齊時,就會發生偏向上面或下面的狀況。

線上展示:https://codepen.io/oxxo/pen/MWdXVgj

<!-- HTML 程式碼 -->
<main>
  <span>Good Morning</span>
  <div><div></div></div>
  <div class="a"><div></div></div>
  <div class="b"><div></div></div>
</main>

<!-- CSS 程式碼 -->
<style>
  main {font-size: 20px;}
  main * {vertical-align: middle;}  /* main 裡的所有元素都垂直置中對齊 */
  span {background: orange;}
  div {
    display: inline-block;     /* div 的顯示類型為 inline-block */
    background: pink;
    width: 20px;
    height: 50px;
    padding: 20px;
    margin: 0  0 100px 0;      /* 下外邊界為 100px,上左右外邊界為 0 */
    border: 10px solid #000;
  }
  .a {
    background:cyan;
    padding: 10px 20px 0 20px; /* 上內邊距為 10px,左右內邊距為 20px,下內邊距為 0 */
    margin: 50px 0 0 0;        /* 上外邊界為 50px,下左右外邊界為 0 */
  }
  .b {
    background: #0f0;
    margin: 50px 0;            /* 上下外邊界為 50px,左右外邊界為 0 */
  }
  div div{
    display:block;             /* div 裡的 div 的顯示類型為 block */
    width: 20px;
    height: 50px;
    padding: 0;                /* 內邊距為 0 */
    margin: 0;                 /* 外邊界為 0 */
    border: none;              /* 邊框為 0 */
    background: yellow;
  }
</style>

CSS 教學 - 容器盒子模型 ( box Model ) - 垂直置中對齊

不過垂直置中會有一些特殊狀況,當垂直置中的元素內容包含「inline」顯示類型元素,垂直對齊的「baselinesupersub」的參考線,就會根據 inline 的參考線進行垂直對齊 ( 參考「vertical-align 垂直對齊」)。

注意,只要出現「文字」,就會自動產生 inline 行內容器。

下方的範例在空白的 div 內容時,會使用 inline-block 的對齊方式對齊 baseline,但當文字出現在 div 裡時,垂直對齊的行為就變成對齊文字的 baseline。

線上展示:https://codepen.io/oxxo/pen/mdYKxbv

<!-- HTML 程式碼 -->
<main>
  <span>Good Morning</span>
  <div><div></div></div>
  <div><div>oxxo</div></div>            <!-- 出現文字 -->
  <div class="a"><div></div></div>
  <div class="a"><div>oxxo</div></div>  <!-- 出現文字 -->
</main>

<!-- CSS 程式碼 -->
<style>
  main {font-size: 20px;}
  main * {vertical-align: baseline;}  /* main 裡的所有元素都垂直置中對齊 */
  span {background: orange;}
  div {
    display: inline-block;    /* div 的顯示類型為 inline-block */
    background: pink;
    width: max-content;       /* 讓最大的內容撐滿寬度 */
    height: 100px;
    padding: 20px;
    margin: 0  0 50px 0;      /* 下外邊界為 50px,上左右外邊界為 0 */
    border: 10px solid #000;
  }
  .a {
    background:cyan;
    padding: 10px 20px 0 20px; /* 上內邊距為 10px,左右內邊距為 20px,下內邊距為 0 */
    margin: 50px 0 0 0;        /* 上外邊界為 50px,下左右外邊界為 0 */
  }
  div div{
    display:block;             /* div 裡的 div 的顯示類型為 block */
    background: yellow;
    padding: 0;                /* 內邊距為 0 */
    margin: 0;                 /* 外邊界為 0 */
    border: none;              /* 邊框為 0 */
  }
</style>

CSS 教學 - 容器盒子模型 ( box Model ) - 垂直置中對齊出現文字

小結

容器盒子模型 ( box Model ) 是 CSS 最重要的觀念之一,幾乎所有的排版和對齊都圍繞在盒子模型的觀念上打轉,透過這篇教學,相信能夠深入理解容器盒子模型的運作原理。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 顏色單位 位置名稱與時間單位

變數與內容函式

變數 數學計算 文字與清單計數 生成內容與引號

顏色與濾鏡

色彩模型 漸層色 影像濾鏡

文字樣式

使用通用字型 使用外部字型 @font-face 定義字型 文字尺寸 常用文字樣式 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 特殊文字樣式

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 影像邊框 輪廓 ( outline ) 可見性與透明度 內容溢出與裁切

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 定義計數規則 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 定位 ( position )

Flexbox 彈性排版

Flexbox 彈性盒子 Flexbox 對齊方式 Flexbox 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask )