Skip to content

calc()

calc() 最强大的特性是支持不同的单位混合运算,包括绝对单位(px、cm、rem、em等)和相对单位(%、vw、vh等),这是静态数值无法实现的。

容性极佳,支持 IE9+、Chrome、Firefox、Safari 等所有现代浏览器,无需额外兼容处理。

运算规则

  • 加法(+):必须在运算符两侧保留空格(如 10px + 20%,不可写 10px+20%)
  • 减法(-):必须在运算符两侧保留空格(如 100% - 30px,不可写 100%-30px)
  • 乘法(*):无需强制空格,但至少有一个操作数是无单位的纯数字(如 20px * 2 合法,20px * 30px 非法)
  • 除法(/):无需强制空格,但第二个操作数必须是无单位的纯数字(如 100px / 2 合法,100px / 20px、100px / 50% 均非法)

示例

示例1:动态设置元素宽度(自适应留白)

场景:让容器占满父元素宽度,同时左右各保留20px的留白(无需手动计算父元素宽度)

css
/* 父元素 */
.parent {
  width: 500px;
  height: 200px;
  border: 1px solid #333;
}

/* 子元素:使用calc()计算宽度 */
.child {
  width: calc(100% - 40px); /* 100%(父元素宽度) - 左右各20px(总计40px) */
  height: 100px;
  margin: 0 auto; /* 水平居中 */
  background-color: skyblue;
}

示例2:动态设置字体大小(响应式文字)

场景:字体大小基于视口宽度,同时保留基础大小,实现响应式文字

css
.text {
  /* 基础16px + 视口宽度的1%,实现屏幕越大文字越大 */
  font-size: calc(16px + 1vw);
}

示例3:动态定位元素(精准偏移)

场景:让元素相对于父元素右侧偏移30px,顶部偏移20px

css
.parent {
  position: relative;
  width: 500px;
  height: 300px;
  border: 1px solid #333;
}

.box {
  position: absolute;
  /* 右侧偏移:100%(父元素宽度) - 自身宽度50px - 额外偏移30px */
  left: calc(100% - 50px - 30px);
  top: 20px;
  width: 50px;
  height: 50px;
  background-color: coral;
}

示例4:calc() 嵌套使用

calc() 支持嵌套调用(内层calc()可省略关键字,直接写表达式,建议保留以提高可读性)

css
/* 嵌套用法:计算宽度 = 父元素80% - (20px + 1rem)* 2 */
.nested-box {
  /* 完整嵌套写法 */
  width: calc(80% - calc(20px + 1rem) * 2);
  /* 简化写法(内层calc()省略) */
  /* width: calc(80% - (20px + 1rem) * 2); */
  height: 80px;
  background-color: purple;
  color: #fff;
}