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

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

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. WinForm 进度条显示进度百分比

    参考: https://blog.csdn.net/zhuimengshizhe87/article/details/20640157 WinForm中显示进度条百分比有多种方式: 1. 添加 Lab ...

  2. Deepseek学习随笔(9)--- 清华大学发布Deepseek赋能职场(附网盘链接)

    作为一名职场人,在工作中常常面临效率瓶颈:如何快速生成高质量内容?如何高效处理复杂任务?这些问题在接触了<清华大学-DeepSeek赋能职场>这份文档后,得到了全新的解答.这份由清华大学新 ...

  3. mysql常用优化

    SQL优化是一个分析,优化,再分析,再优化的过程.站在执行计划的角度来说,我们这个过程,就是在不断的减少rows的数量. 1.建索引 2.减少表之间的关联 3.优化 sql,尽量让 sql 很快定位数 ...

  4. 文件快递柜FileCoxBox-匿名口令分享文本,文件,像拿快递一样取文件

    FileCoxBox特色 轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数 ...

  5. PowerShell实现读取照片并做灰度处理

    Powershell一直是我的学习目标.做一个小例子.PowerShell实现读取照片并做灰度处理.还想要保存这张灰度照片并直接打开查看. 分析需求: [读取照片]  需要借助.net framewo ...

  6. AI 核心能力与开发框架工程能力的共生关系解析

    一.本质定位:能力层与载体层的互补 1. AI 能力:突破性认知的"大脑" - 定义:AI 的核心能力(如大语言模型的泛化推理.多模态感知)源于算法创新.海量数据与算力突破,其本质 ...

  7. docker部署ceph集群

    1. 创建Ceph专用网络 sudo docker network create --driver bridge --subnet 172.20.0.0/16 ceph-network 2. 拉取搭建 ...

  8. WARN  Issues with peer dependencies found,pnpm peer dependencies auto-install

    前言 pnpm 也需要设置自动安装对等依赖项 解决 pnpm 使用 npm 的配置格式,所以应该以与 npm 相同的方式设置配置: pnpm config set auto-install-peers ...

  9. 链表的创建&遍历打印

    博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Node: def __init__(self, item): ...

  10. 认识知识库与知识图谱:从CDSS的前世今生聊聊模型幻觉问题

    提供AI咨询+AI项目陪跑服务,有需要回复1 今年很多医院已经部署上了DeepSeek,甚至有医生真的使用它对患者进行诊断,但马上就出问题了:AI 误诊,上海患者获赔 127 万. 不过,我去搜索详情 ...