為了實現 RWD,我們會將 width
與 margin
都改用 %
而非 px
,但這會造成 margin
隨 Browser 寬度改變,若要 margin
固定而 width
依舊使用 %
,則要借數 calc()
根據固定 margin
動態計算 width
。
Version
CSS 3
Flexbox
Item 的 width
與 margin
都使用 %
看似完美。
當 browser 的 width 縮減時,可明顯發現 item 的 margin 也隨之改變。
<template>
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</template>
<style scoped>
.box {
display: flex;
flex-wrap: wrap;
width: 95%;
margin: auto;
}
.item {
width: 29%;
margin: 2%;
}
</style>
10 行
.box {
display: flex;
flex-wrap: wrap;
width: 95%;
margin: auto;
}
display: flex
:使用 Flexbox 讓 item 橫排flex-wrap: wrap
:當各 item 總 width 超過 parent width 時,會自動換行,主要目的是防止 item 總 width 計算錯誤width: 95%
:設定 box width,特別改成%
適合 RWD,可避免出現 scroll barmargin: auto
:讓 box 水平置中
17 行
.item {
width: 29%;
margin: 2%;
}
width: 29%
:設定 item 的 width,特別改用%
適合 RWDmargin: 2%
:設定 item 的 margin,特別改用%
適合 RWD
將
width
與margin
都改成%
可完美配合 RWD,其唯一缺點是 margin 會隨 browser 改變而改變,實務上通常希望 margin 為固定值
calc()
Item 間的 margin 改成固定 10px
,看起來與使用 %
一樣。
但 browser 的 width 縮減時,可明顯發現 item 的 margin 仍然固定為 10px
。
<template>
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</template>
<style scoped>
* {
--column: 3;
--margin: 10px;
}
.box {
display: flex;
width: 95%;
margin: auto;
}
.item {
width: calc(100% / var(--column) - 2 * var(--margin));
margin: var(--margin);
}
</style>
10 行
* {
--column: 3;
--margin: 10px;
}
--column: 3
:設定 column 個數--margin: 10px
:以--margin
設定固定 margin
15 行
.box {
display: flex;
width: 95%;
margin: auto;
}
display: flex
:一樣使用 Flexboxwidth: 95%
:width 一樣使用%
margin: auto
:一樣水平置中
21 行
.item {
width: calc(100% / var(--column) - 2 * var(--margin));
margin: var(--margin);
}
width: calc(100% / var(--column) - 2 * var(--margin))
:使用calc()
計算 width,* 2
表示左右 margin,/ 3
表示平分3
等分margin: var(--margin)
:使用固定 margin
Conclusion
- 理論上將 width 與 margin 改成
%
就可適合 RWD,但可能不是所有人都喜歡 margin 動態改變,此時可將 margin 以 CSS variable 先定義好,再以calc()
根據固定 margin 計算 width