css3的calc()函数允许我们在属性值中执行数学操作。
例如,我们可以使用calc()指定一个元素宽的固定像素值为多个数值的和
.foo{
width: calc(100px + 50px);
}
# 为什么是calc()
如果你使用过CSS预处理器,比如SASS,以上示例你或许碰到过
.foo {
width: 100px + 50px;
}
$width-one: 100px;
$width-two: 50px;
.bar {
width: $width-one + $width-two;
}
然而,calc()函数提供了更好地解决方案。
首先,我们能够组合不同的单元。特别是,我们可以混合计算绝对单位(比如百分比与视口单元)与相对单位(比如像素)
例如,我们可以创造一个表达式,用一个百分比减掉一个像素值
.foo {
width: calc(100% - 50px)
}
本例中,.foo元素总是小于它父元素宽度50px
第二,使用calc(),计算值是表达式它自己,而非表达式的结果。当使用css预处理器做数学运算时,特定值为表达式结果
.foo {
width: 100px + 50px;
}
.foo {
width: 150px;
}
然而,浏览器解析的calc()的值为真实的calc()表达式
.foo {
width: calc(100% - 50px);
}
.foor {
width: calc(100% - 50px)
}
这意味着浏览器中的值可以更加灵活,能够响应视口的改变。我们能够给元素设定一个高度为视口的高度减去一个绝对值,它将视口的改变进行调节。
# 使用calc()
calc()函数可以用来对数值属性执行四则运算,比如:<length>,<frequency><angle>,<time>,<number> 或者 <integer> 数据类型。
.foo {
width: calc(50vmax + 3rem);
padding: calc(1vw + 1rem);
transform: rotate( calc(1turn + 28deg) );
background: hsl(100, calc(3 * 20%), 40%);
font-size: calc(50vw / 3);
}
# calc()嵌套
calc()函数可以嵌套。在函数里面,会被视为简单的括号表达式,
.foo {
width: calc(100% / calc(100px * 2))
}
函数的计算值如下
.foo {
width: calc( 100% / (100px * 2) );
}
# 降级方案
calc()已经得到普遍支持
对于不支持 calc() 的浏览器,整个属性值表达式将被忽略。不过我们可以对那些不支持 calc() 的浏览器,使用一个固定值作为降级方案。
.foo {
width: 90%;
width: calc(100% - 50px);
}
# 什么场景可以使用calc()
# 居中元素
使用calc()给我们提供另一种垂直居中方案