calc() 是 CSS 中一个非常实用的函数,允许开发者在声明 CSS 属性值时进行动态计算。它的核心优势在于能够混合使用不同的单位(如百分比、像素、视口单位等),并直接在样式表中完成数学运算,从而实现更灵活的布局设计。
一、基本语法
property: calc(expression);
expression:数学表达式,支持 +、-、*、/ 四种运算符。
运算符两侧必须保留空格,例如 calc(100% - 20px)(正确),而非 calc(100%-20px)(错误)。
二、核心特性
1、单位混合计算
支持不同单位的混合运算,比如百分比与像素、rem 与 vw 等,突破传统 CSS 单位限制。
.box { width: calc(100% - 50px); /* 容器宽度为父元素宽度减去50像素 */ }
2、响应式布局利器
结合视口单位(如 vw、vh),轻松实现自适应布局:
.header { height: calc(100vh - 80px); /* 高度为视口高度减去80px */ }
3、动态计算替代固定值
减少手动计算,直接在 CSS 中定义逻辑关系:
.item { margin: calc(1rem * 0.5); /* 相当于 0.5rem */ }
三、使用场景示例
1. 等分布局(消除缝隙)
.grid-item { width: calc((100% - 20px) / 3); /* 三列布局,总宽度减去间隙后等分 */ }
2. 视口适应布局
.sidebar { width: 250px; } .content { width: calc(100vw - 250px); /* 内容区域宽度为视口宽度减去侧边栏 */ }
3. 动态调整间距
.text-block { padding: calc(1rem + 2vh); /* 内边距随视口高度动态变化 */ }
注意事项
1、运算符空格强制要求
错误写法会失效:calc(100%-20px) ❌
正确写法:calc(100% - 20px) ✅
2、乘法和除法限制
乘法:至少一个操作数为无单位数字(如 2 * 20px ✅,20px * 2rem ❌)。
除法:右操作数必须是无单位数字(如 100px / 2 ✅,100px / 2rem ❌)。
3、嵌套使用
支持多层嵌套,但需注意可读性:
width: calc(100% - calc(20px + 2rem));
4、兼容性
现代浏览器普遍支持(包括 IE9+)。
旧版浏览器(如 IE8)需提供降级方案:
.box { width: 95%; /* 备用值 */ width: calc(100% - 50px); }
四、进阶技巧
CSS 变量结合使用
动态调整更灵活:
:root { --spacing: 20px; } .container { padding: calc(var(--spacing) * 2); }
配合 min()/max() 函数
实现边界控制:
.responsive-image { width: calc(50vw - 20px); max-width: 300px; /* 限制最大宽度 */ }
calc() 通过将计算逻辑直接写入 CSS,大幅提升代码的灵活性和可维护性。尤其在响应式设计、动态布局和复杂单位转换场景中,它能显著减少 JavaScript 干预,是现代前端开发的常用工具之一。使用时需注意语法细节和兼容性,合理搭配其他 CSS 特性效果更佳。