當圖片放在 Block 中,會發現圖片似乎與 Item 底部有些空隙,這是因為 <img>
本身 vertical-align
預設值為 baseline
所造成。
Version
CSS 3
Image in Block
當 <img>
放在 block 中,若 item 有設定背景色,會發現圖片下方竟然會顯示出背景色。
<template>
<div class="box">
<div class="item">
<img src="https://picsum.photos/300/200?random=10">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=11">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=12">
</div>
</div>
</template>
<style>
.box {
width: 960px;
border: 1px solid #000;
display: flex;
}
.item {
width: 300px;
margin: 10px;
background-color: #f00;
}
.item img {
width: 100%;
}
</style>
22 行
.item {
width: 300px;
margin: 10px;
background-color: #f00;
}
特別設定 item 背景色為 紅色
凸顯問題。
28 行
.item img {
width: 100%;
}
圖片的寬度為 100%
,表示 <img>
寬度會撐滿整個 item。
因為 <img>
為 inline,其預設為 vertical-align: baseline
,它與 bottom
之間還有些高度,紅色背景部分正是 baseline
與 bottom
之間的空隙。
Vertical Align
重新設定 vertical-align
之後,圖片底部空隙就不見了。
<template>
<div class="box">
<div class="item">
<img src="https://picsum.photos/300/200?random=10">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=11">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=12">
</div>
</div>
</template>
<style>
.box {
width: 960px;
border: 1px solid #000;
display: flex;
}
.item {
width: 300px;
margin: 10px;
background-color: #f00;
}
.item img {
width: 100%;
vertical-align: top;
}
</style>
28 行
.item img {
width: 100%;
vertical-align: top;
}
特別設定 vertical-align
,只要不是 baseline
皆可解決問題。
Block
<template>
<div class="box">
<div class="item">
<img src="https://picsum.photos/300/200?random=10">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=11">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=12">
</div>
</div>
</template>
<style>
.box {
width: 960px;
border: 1px solid #000;
display: flex;
}
.item {
width: 300px;
margin: 10px;
background-color: #f00;
}
.item img {
width: 100%;
display: block;
}
</style>
28 行
.item img {
width: 100%;
display: block;
}
另一個解決方法是將 <img>
由 inline 轉為 block,因為 block 不支援 vertical-align,故沒有 vertical-align: baseline
問題。
Flexbox
<template>
<div class="box">
<div class="item">
<img src="https://picsum.photos/300/200?random=10">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=11">
</div>
<div class="item">
<img src="https://picsum.photos/300/200?random=12">
</div>
</div>
</template>
<style>
.box {
width: 960px;
border: 1px solid #000;
display: flex;
}
.item {
width: 300px;
margin: 10px;
background-color: #f00;
}
.item img {
width: 100%;
display: flex;
}
</style>
28 行
.item img {
width: 100%;
display: flex;
}
同理只要使 <img>
不要是 inline 即可,那設定成 flex
也可以。
Conclusion
<img>
因為vertical-align: baseline
與 item 之間的空隙,只有在 HTML 5 之後才會出現,之前 HTML 4 並沒有此問題- 將
<img>
由 inline 轉成 block 也是不錯方式,這也是為什麼 Tailwind CSS 預設將<img>
reset 成 block 原因