iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
3
自我挑戰組

前端新手進化史系列 第 7

混血兒 inline-block

文章將陸續整理並更新至個人部落格


inline-block 就像是 HTML 中 inline 和 block 兩大角頭聯姻下的產物,來看看他遺傳了哪些優良的顯性基因吧!

首先,該如何召喚出 inline-block 呢?
很簡單,利用 display 屬性
順便稍微認識一下 display 吧!


display

以下摘自 W3C

The display property defines an element’s display type, which consists of the two basic qualities of how an element generates boxes:

  • the inner display type, which defines (if it is a non-replaced element) the kind of formatting context it generates, dictating how its descendant boxes are laid out. (The inner display of a replaced element is outside the scope of CSS.)

  • the outer display type, which dictates how the principal box itself participates in flow layout.

簡單來說

display 屬性用來決定元素的顯示方式,其中又分為:

  • 內部顯示:定義元素(替換元素除外)會形成何種格式化上下文,會影響後裔元素的佈局。

  • 外部顯示:定義元素本身如何參與佈局(layout)


團圓時間~快速回顧一下 inline 和 block /images/emoticon/emoticon47.gif


inline

  • display 屬性值為 inline
    摘自 W3C

    This value causes an element to generate one or more inline boxes.

  • 除了替換元素之外,無法透過 widthheight 屬性調整寬高。

  • 除了替換元素之外,寬高取決於內容(例如文字)的長度行高(line height)

  • 呈現水平排列

  • 裡面只能放 inline 元素。

    下圖為三個 <span>


block

  • display 屬性值為 block

    摘自 W3C

    This value causes an element to generate a principal block box.

  • 預設寬度為容器的 100%

  • 可以透過 widthheight 屬性調整寬高。

  • 強迫換行,呈現垂直排列

  • 裡面可放 inline 元素或 block 元素。

    下圖為三個 <div>:


inline-block

  • display 屬性值為 inline-block

    摘自 W3C

    This value causes an element to generate a principal inline-level block container. (The inside of an inline-block is formatted as a block box, and the element itself is formatted as an atomic inline-level box.)

    簡單來說,若將元素 A 的 display 值設定為 inline-block:

    內部顯示:A 元素形成一個 塊格式化上下文(BFC),對後裔元素來說是個 block 容器。

    外部顯示:A 元素成為 行內級元素(inline-level element),參與行內格式化上下文(IFC),呈現水平排列。

可以想像成:


註:W3C 對於行內級元素(inline-level) 的定義 為 display: inlineinline-tableinline-block 的元素,皆屬於行內級元素

  • 可以透過 widthheight 屬性調整寬高。

  • 呈現水平排列。

  • 在無設定 width 與 height 時,寬高由內容決定。

  • 裡面可放 inline 元素或 block 元素。


下圖為三個 inline-block:



咦? 在 display: inline-block 下,明明沒有指定 margin,元素與元素之間卻有空白的縫隙 ?!

/images/emoticon/emoticon19.gif

這是因為 HTML 標籤之間因空格或換行而造成的一個空白字元空間



解決方法

既然是因為預設的空白字元空間所造成的,那就用字的屬性來解決它吧!
在元素的外容器指定 font-size: 0,會發現元素內的文字消失了(因為繼承),再重新指定一個 font-size 值給元素就長回來囉。


雖然 display 屬性很好用,可以將 inline 和 block 互換,但不建議這樣使用唷~




/images/emoticon/emoticon29.gif

參考資料

W3C-display
W3C-Inline-level elements and inline boxes
MDN-display
MDN-Block formatting context


上一篇
Collapsing margins
下一篇
text-align
系列文
前端新手進化史30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Chris
iT邦新手 4 級 ‧ 2019-09-23 22:31:52

我以為會像友篇很狂放的取名字「混血王子的 inline-block」

Chris iT邦新手 4 級 ‧ 2019-09-23 22:35:52 檢舉

圖很用心哦~~/images/emoticon/emoticon12.gif

yachen iT邦新手 4 級 ‧ 2019-09-24 14:49:57 檢舉

哈利波特看太多!!!
/images/emoticon/emoticon69.gif

我要留言

立即登入留言