FrankKai / FrankKai.github.io

FE blog
https://frankkai.github.io/
362 stars 39 forks source link

CSS函数之计算函数calc() #230

Open FrankKai opened 4 years ago

FrankKai commented 4 years ago

初识calc()

常见calc()demo

width: calc(10px + 100px);
width: calc(100% - 30px);
width: calc(2em * 5);
width: calc(var(--variable-width) + 20px);

calc()语法

/* property: calc(expression) */
width: calc(100% - 80px);

calc()将一个单表达式作为入参,将表达式的计算结果作为值。 表达式可以是任意的通过运算符连接的表达式,使用标准的运算符优先级:

+
-
* (至少一个是数字)
/ (右侧的是数字)

表达式的操作式可以是任意的<length> 如果需要的话,可以在表达式中为值使用任意的单位。 如果需要的话,可以用圆括号去执行计算。

calc()笔记

calc()常用语法

calc(<calc-sum>)
<calc-sum> = <calc - product>[[ '+' | '-' ] <calc-product> ]*
<calc-product> = <calc-value>[ '*' <calc-value> | '/' <number>]*
<calc-value> = <number> | <dimension> | <percentage> | ( <calc-sum> )

通过margin定位一个对象

<div class="banner">This is a banner!</div>
// banner左右距离均为40px
.banner {
  position: absolute;
  left: 40px;
  width: calc(100% - 80px);
  border: solid black 1px;
  box-shadow: 1px 2px;
  background-color: yellow;
  padding: 6px;
  text-align: center;
  box-sizing: border-box;
}

另一种写法:

width: 100%;
tranform: translateX(-40px);

自动填充容器

帮助确保表单字段适用可用空间,而不超过其容器的边缘,同时保持适当的边距。

<form>
  <div id="formbox">
  <label>Type something:</label>
  <input type="text">
  </div>
</form>
input {
  padding: 2px;
  display: block;
  width: calc(100% - 1em);
}

#formbox {
  width: calc(100% / 6);
  border: 1px solid black;
  padding: 4px;
}

image

与CSS变量结合进行计算

.foo {
  --widthA: 100px;
  --widthB: calc(var(--widthA) / 2);
  --widthC: calc(var(--widthB) / 2);
  width: var(--widthC);
}

最终计算结果为

.foo {
    --widthA: 100px;
    --widthB: 50px;
    --widthC: 24.984px;
    width: 24.984px;
}

与整数使用需要注意的

.modal {
  z-index: calc(3 / 2);
}

Chrome下即使是z-index:calc(4 / 2),都是无效的。

兼容性考虑

相对长度单位。

h1 {
  font-size: calc(1.5rem + 3vw);
}

https://developer.mozilla.org/en-US/docs/Web/CSS/calc