数学函数可以用来做什么?

最基础的当然是用来进行四则运算了,再进一步可以用来平方,对数,幂,绝对值,取余等,当然还可以用来计算三角函数。

CSS 中的数学函数

灵活运用 CSS 中的数学函数,可以抛弃很多原本需要 JS 才能实现的布局场景。

calc()

最基础的四则运算函数,对头,就是用来做小学就学过的加、减、乘、除。

比如有这么一个需求:子元素占用宽度是父元素的一半多20像素!

这个需求,如果用常规的布局思路来看,父元素如果宽度固定 200px,还能简单的算出来,子元素宽度是 120px

但如果父元素的宽度不固定呢?还能计算出来吗?如果没有 calc 函数,那么唯一的办法就只有拿出 40 米的 JS 大刀了~。

使用 calc 函数,就可以轻松解决这个问题:

.box {
width: 100%;
}
.box .child {
width: calc(50% + 20px);
}

注意:

加法(+)、减法(-) 运算符左右两边必须要有空格!原因是如果没有空格字符串,-20px 是表示的负数,而不是减法。

除法中:除数(除号 / 右面的数)必须是一个数字(如:1,1.1,+2,-2.3,1e4),不能是带有单位的值(如:2px,50%,3vw,2em)。与以前学过的除法一样,0 不能作为除数!

乘法中:乘号(*)两边必须有一个数字。原因:calc(20px * 20px) 表示的像素平方,在浏览器中无法解析这种值!!

calc() 的各种使用方式:

<div class="box">
<div class="child">calc(50% + 20px)</div>
<div class="child">calc(12 * 20px)</div>
<div class="child">calc(100% / 3)</div>
<div class="child">calc(10em + 40px)</div>
<div class="child">calc(var(--child-width) + 40px - 20px)</div>
<div class="child">calc((((40vw + 20px) * 3) - 500px) / 5)</div>
</div>
<style>
.box {
margin: 20px 0;
width: 400px;
border: var(--base-border, 2px solid rgba(255, 71, 87,0.3));
}
.box .child {
margin: 10px;
border: 1px solid #ffa947;
padding: 10px;
}
.box .child:nth-of-type(1) {
/* 加法 */
width: calc(50% + 20px);
}
.box .child:nth-of-type(2) {
/* 乘法 */
width: calc(12 * 20px);
}
.box .child:nth-of-type(3) {
/* 除法 */
width: calc(100% / 3);
}
.box .child:nth-of-type(4) {
/* 不同的单位加法 */
width: calc(10em + 40px);
}
.box .child:nth-of-type(5) {
/* 使用 CSS 变量 */
--child-width: 16vw;
width: calc(var(--child-width) + 40px - 20px);
}
.box .child:nth-of-type(6) {
/* 复杂的四则运算 */
width: calc((((40vw + 20px) * 3) - 500px) / 5);
}
</style>

效果:

min()

min() 用于获取一组数值中的最小值。通常用于比较不同单位之间的最小值,比如 min(400px, 50%, 20em, 10vw)

使用示例:

<div class="box">
<div class="child">min(230px, 220px)</div>
<div class="child">min(50%, 220px)</div>
<div class="child">min(20vw, 20em, 1000px)</div>
<div class="child">min(var(--child-width), 100em, calc(100% * 0.85))</div>
</div>
<style>
.box {
margin: 20px 0;
width: 400px;
border: var(--base-border, 2px solid rgba(255, 71, 87,0.3));
}
.box .child {
margin: 10px;
border: 1px solid #ffa947;
padding: 10px;
}
.box .child:nth-of-type(1) {
/* 相同单位比较 */
width: min(230px, 220px);
}
.box .child:nth-of-type(2) {
/* 不同单位比较 */
width: min(50%, 220px);
}
.box .child:nth-of-type(3) {
/* 多个不同单位比较 */
width: min(20vw, 20em, 1000px);
}
.box .child:nth-of-type(4) {
/* 使用 var 和 calc */
--child-width: 26vw;
width: min(var(--child-width), 100em, calc(100% * 0.85));
}
</style>

效果:

max()

max() 用于获取一组数值中的最大值。与 min() 类似,作用相反取最大值,比如 max(400px, 50%, 20em, 10vw)

使用示例:

<div class="box">
<div class="child">max(230px, 220px)</div>
<div class="child">max(50%, 220px)</div>
<div class="child">max(20vw, 20em, 300px)</div>
<div class="child">max(var(--child-width), 6em, calc(100% * 0.9))</div>
</div>
<style>
.box {
margin: 20px 0;
width: 400px;
border: var(--base-border, 2px solid rgba(255, 71, 87,0.3));
}
.box .child {
margin: 10px;
border: 1px solid #ffa947;
padding: 10px;
}
.box .child:nth-of-type(1) {
/* 相同单位比较 */
width: max(230px, 220px);
}
.box .child:nth-of-type(2) {
/* 不同单位比较 */
width: max(50%, 220px);
}
.box .child:nth-of-type(3) {
/* 多个不同单位比较 */
width: max(20vw, 20em, 300px);
}
.box .child:nth-of-type(4) {
/* 使用 var 和 calc */
--child-width: 6vw;
width: max(var(--child-width), 6em, calc(100% * 0.9));
}
</style>

效果:

clamp()

此函数是 min()max() 的结合体,可以同时指定最小值和最大值以及限定值,使用方式:clamp(min, value, max)

比如 clamp(400px, 50%, 20em) 表示如果 50% 小于 400px,则取 400px,如果 50% 大于 20em,则取 20em,否则取 50%。

使用示例:

<div class="box">
<div class="child">clamp(180px, 50%, 100px)</div>
<div class="child">clamp(100px, 60%, 320px)</div>
<div class="child">clamp(20vw, 20em, 300px)</div>
<div class="child">clamp(var(--child-width), 20em, calc(100% * 0.9))</div>
</div>
<style>
.box {
margin: 20px 0;
width: 400px;
border: var(--base-border, 2px solid rgba(255, 71, 87,0.3));
resize: both;
overflow: auto;
}
.box .child {
margin: 10px;
border: 1px solid #ffa947;
padding: 10px;
}
.box .child:nth-of-type(1) {
/* 最小值180px 大于了 最大值 100px,直接应用了 180px */
width: clamp(180px, 50%, 100px);
}
.box .child:nth-of-type(2) {
/* 子元素大小必在 100px ~ 320px 之间 */
width: clamp(100px, 60%, 320px);
}
.box .child:nth-of-type(3) {
/* 子元素大小必在 10% ~ 90% 之间 */
width: clamp(10%, 20em, 90%);
}
.box .child:nth-of-type(4) {
/* 也可使用 var 和 calc */
--child-width: 6vw;
width: clamp(var(--child-width), 20em, calc(100% * 0.9));
}
</style>

效果:

一个组合应用例子

<div class="box">
<div class="child">组合应用</div>
<div class="child">组合应用</div>
</div>
<style>
.box {
margin: 20px 0;
width: 400px;
border: var(--base-border, 2px solid rgba(255, 71, 87,0.3));
resize: both;
overflow: auto;
}
.box .child {
margin: 10px;
border: 1px solid #ffa947;
padding: 10px;
}
.box .child:nth-of-type(1) {
--base-width: 10%;
width: clamp(min(20px, 10rem), calc(var(--base-width) * 6), max(100%, 100vw));
}
.box .child:nth-of-type(2) {
--base-width: 10%;
width: clamp(min(20px, var(--base-width)), calc(min(var(--base-width) * 4, 300px)), max(calc(var(--base-width) * 9), 100vw));
}
</style>

可以看到上面例子中,clamp 函数可以嵌套 min、calc、max 函数,calc 函数也可以可以嵌套使用 min 函数,max 函数也可以使用 calc 的计算结果。

套娃一样的用法,可以组合出各种复杂的运算场景!!

效果:

其他数学函数

对于 CSS 布局而言,四个基本的数学函数已经完全足够了,但在一些 3D 和动画场景中,您可能会用到一些其他数学运算函数,目前 CSS 支持的数学运算函数如下:

阶跃值函数

round() 实验性 根据舍入策略计算一个舍入的数字。

mod() 实验性 计算一个数除以另一个数的模(与除数的符号相同)。

rem() 实验性 计算一个数字除以另一个数字的余数(与被除数的符号相同)。

三角函数

sin() 计算一个数的三角函数正弦值。

cos() 计算一个数的三角函数余弦值。

tan() 计算一个数的三角函数正切值。

asin() 计算一个数的三角函数反正弦值。

acos() 计算一个数的三角函数反余弦值。

atan() 计算一个数的三角函数反正切值。

atan2() 计算平面内两个数字的三角函数反正切值。

指数函数

pow() 计算基数的幂次方值。

sqrt() 计算一个数的平方根。

hypot() 计算其参数平方之和的平方根。

log() 计算一个数的对数值。

exp() 计算一个数的 e 次方值。

符号函数

abs() 实验性 计算一个数的绝对值。

sign() 实验性 计算一个数的符号值(正值或负值)。

对于高级运算函数有兴趣可以参阅 MDN 文档:https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Values_and_Units/CSS_Value_Functions

写在最后

在响应式布局中,灵活运用数学函数,可以简化很多不必要的代码,也许您都可以放弃部分非必要的 媒体查询 代码。

Web前端入门第 46 问:CSS 中的数学函数不要只会 calc的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

  3. 进击的Python【第十三章】:Web前端基础之HTML与CSS样式

    进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...

  4. Android零基础入门第46节:下拉框Spinner

    原文:Android零基础入门第46节:下拉框Spinner 上一期学习了GridView的使用,你已经掌握了吗?本期一起来学习Spinner的使用. 一.认识Spinner Spinner其实就是一 ...

  5. 好程序员web前端分享18个用CSS制作出来的东西

    好程序员web前端分享18个用CSS制作出来的东西,与流行的看法相反,CSS不仅仅是用来提供一个WEB页面的基本风格,以使它看起来更有吸引力.还有很多其他的事情,CSS也可以做的很好.由于它创建动画和 ...

  6. js高级程序设计书中,有一句话在全局作用域中定义的函数实际上只 能被某个对象调用???

    js没有块级作用域(题外话:函数可以作为一个块级),所以我们经常使用闭包来模拟块级作用域,以避免变量或者函数因为名称相同而产生的冲突. 重点来了: 所以,如果我们把哪个变量或者函数放在全局作用域中,那 ...

  7. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  8. Brackets - 强大免费的开源跨平台Web前端开发工具IDE (HTML/CSS/Javascript代码编辑器)

    Brackets 是一个免费.开源且跨平台的 HTML/CSS/JavaScript 前端 WEB 集成开发环境 (IDE工具).该项目由 Adobe 创建和维护,根据MIT许可证发布,支持 Wind ...

  9. web前端(7)—— 了解CSS样式,引入css样式的方式

    CSS 在前面大概的介绍了css,从本片博文开始,会详细的介绍它,在最开始介绍web前端时,打开百度首页,当时我提出了一个问题,为什么百度首页的输入框可以放在正中间,就是由于有css的控制,我们可以打 ...

  10. [转载]Brackets - 强大免费的开源跨平台Web前端开发工具IDE (HTML/CSS/Javascript代码编辑器)

    http://brackets.io/ Brackets 是一个免费.开源且跨平台的 HTML/CSS/JavaScript 前端 WEB 集成开发环境 (IDE工具).该项目由 Adobe 创建和维 ...

随机推荐

  1. [THUSC2015] 异或运算 题解

    学到新思路了:求解 \(k\) 大值时,可以将所有元素放一块一起跑. 考虑到 \(n,q\) 奇小无匹,我们便可以制造一个 \(O(qn\log V)\) 的代码. 那么对于我们不想在时间复杂度中出现 ...

  2. autohue.js:让你的图片和背景融为一体,绝了!

    需求 先来看这样一个场景,拿一个网站举例 这里有一个常见的网站 banner 图容器,大小为为 1910*560 ,看起来背景图完美的充满了宽度,但是图片原始大小时,却是: 它的宽度只有 1440 , ...

  3. 【COM3D2Mod 制作教程(6)】实战!制作身体部分(下)

    [COM3D2Mod 制作教程(6)]实战!制作身体部分(下) 有了上一章制作帽子的经验,此时做头发很多就不必再重复赘述了,但如果用完全一样的流程和方法,把头发做好后直接装扮就会导致游戏报错,这就是我 ...

  4. 互联网和DeepSeak时代,获取信息这么容易,为什么我们还是学习不好?

    因为人性倾向于立即获得享受,而不是延迟获得享受,然而,学习就是延迟获得享受,所以,学习,其实是反人性的一种活动. 学习,特别是对知识的深入学习,其实需要付出大量的时间和精力,这个过程中必然伴随着各种各 ...

  5. Elasticsearch搜索引擎学习笔记(四)

    分词器 内置分词器 standard:默认分词,单词会被拆分,大小会转换为小写. simple:按照非字母分词.大写转为小写. whitespace:按照空格分词.忽略大小写. stop:去除无意义单 ...

  6. AI回答:php中间件

    在PHP中,中间件(Middleware)是一种用于在处理请求和生成响应之间插入额外逻辑的机制.中间件通常用于执行诸如身份验证.日志记录.缓存.错误处理等任务.PHP本身并没有内置的中间件系统,但许多 ...

  7. helm部署redis集群

    Redis 集群部署流程 前提:K8s+helm安装完成 1. 安装 NFS 服务器 1.1 安装 NFS 工具包 在 NFS 服务器上安装 nfs-utils 包: sudo yum install ...

  8. labelImg 工具介绍

    1.什么是labelImg 图片标记工具,生成的xml文件用于人工智能数据 2.怎么使用 打开图片文件夹 使用默认工具tooth 选中图片,快捷键w ,鼠标标记图片 [Ctrl+s] 保存

  9. SICK Ranger3源码分析——断线重连

    前言 本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读,体验更加 简单分析一下SICK Ranger3源码中断 ...

  10. mac brew 安装

    Homebrew国内源 知乎文章地址:https://zhuanlan.zhihu.com/p/111014448 苹果电脑安装脚本: /bin/zsh -c "$(curl -fsSL h ...