CSS calc() 函數
calc() 函數可以在 CSS 中進行數學計算,允許混合不同單位進行運算。
基本語法
property: calc(運算式);
.box {
width: calc(100% - 40px);
height: calc(100vh - 60px);
padding: calc(10px + 2%);
}
支援的運算
+加法-減法*乘法/除法
.example {
width: calc(100% - 20px); /* 減法 */
width: calc(50% + 100px); /* 加法 */
width: calc(100% / 3); /* 除法 */
width: calc(20px * 2); /* 乘法 */
}
加號
+ 和減號 - 的前後必須有空格,否則會被解析為正負號。乘號 * 和除號 / 則不需要空格,但建議加上空格增加可讀性。混合單位
calc() 最強大的功能是可以混合不同單位:
.sidebar {
width: calc(250px + 10%);
}
.header {
height: calc(100vh - 60px);
}
.content {
width: calc(100% - 250px - 40px);
}
巢狀 calc()
可以巢狀使用(雖然通常不需要):
.box {
width: calc(calc(100% - 20px) / 2);
}
/* 等同於 */
.box {
width: calc((100% - 20px) / 2);
}
搭配 CSS 變數
:root {
--sidebar-width: 250px;
--gap: 20px;
}
.main {
width: calc(100% - var(--sidebar-width) - var(--gap));
}
.spacing {
padding: calc(var(--gap) * 2);
}
實用範例
固定側邊欄 + 彈性主內容
.sidebar {
width: 250px;
}
.main {
width: calc(100% - 250px);
}
扣除固定高度
.header {
height: 60px;
}
.content {
height: calc(100vh - 60px);
}
等分欄位(含間距)
.column {
width: calc((100% - 40px) / 3); /* 三欄,兩個 20px 間距 */
margin-right: 20px;
}
.column:last-child {
margin-right: 0;
}
置中(已知寬度)
.centered {
width: 800px;
margin-left: calc((100% - 800px) / 2);
}
響應式字體
.title {
font-size: calc(16px + 2vw);
}
等比例縮放
.box {
width: calc(100% / 4);
padding-top: calc(100% / 4); /* 正方形 */
}
扣除邊框和內距
.input {
width: calc(100% - 20px - 2px); /* 扣除 padding 和 border */
padding: 10px;
border: 1px solid #ccc;
}
/* 更好的做法是用 box-sizing */
.input {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
box-sizing: border-box;
}
動態間距
:root {
--gutter: 20px;
}
.grid {
display: flex;
flex-wrap: wrap;
margin: calc(var(--gutter) / -2);
}
.grid-item {
width: calc(33.33% - var(--gutter));
margin: calc(var(--gutter) / 2);
}
注意事項
空格規則
/* 正確 */
width: calc(100% - 20px);
/* 錯誤:減號前後需要空格 */
width: calc(100%-20px);
width: calc(100% -20px);
width: calc(100%- 20px);
除法和乘法
除數和乘數必須是純數字(無單位):
/* 正確 */
width: calc(100% / 3);
width: calc(20px * 2);
/* 錯誤 */
width: calc(100px / 20px); /* 無效 */
width: calc(20px * 2px); /* 無效 */
零值需要單位
在 calc() 中,即使是零也需要單位:
/* 建議 */
width: calc(100% - 0px);
/* 可能有問題 */
width: calc(100% - 0);
min()、max() 和 clamp()
這些函數提供更多計算功能:
/* min():取最小值 */
width: min(100%, 800px); /* 等同於 max-width: 800px */
/* max():取最大值 */
width: max(50%, 300px); /* 等同於 min-width: 300px */
/* clamp():限制範圍 */
width: clamp(300px, 50%, 800px); /* 最小 300px,最大 800px */
font-size: clamp(1rem, 2vw + 1rem, 3rem);