在 CSS 中,存在许多数学函数,这些函数能够通过简单的计算操作来生成某些属性值,例如 :

  • calc():用于计算任意长度、百分比或数值型数据,并将其作为 CSS 属性值。
  • min() 和 max():用于比较一组数值中的最大值或最小值,也可以与任意长度、百分比或数值型数据一同使用。
  • clamp():用于将属性值限制在一个范围内,支持三个参数:最小值、推荐值和最大值。

现代 CSS 解决方案:CSS 数学函数一文中,我们详细介绍了

  • calc()
  • min()
  • max()
  • clamp()

四个数学函数。

而本文,将给大家介绍一下最近各大浏览器也逐渐开始原生支持的三角函数:

  • sin()
  • cos()
  • tan()

CSS 三角函数语法介绍

首先,我们来看看 CSS 三角函数的使用方式:

.box {
/* 设置元素的宽度为 sin(30deg) 的值 */
width: calc(sin(30deg) * 100px); /* 设置元素的高度为 cos(45deg) 的值 */
height: calc(cos(45deg) * 100%); /* 设置元素的透明度为 tan(60deg) 的值 */
opacity: calc(tan(60deg));
}

上述代码中,我们使用了 calc() 函数进行了计算,然后通过 sin()、cos() 和 tan() 函数对计算结果进行了进一步的处理,从而实现了不同的效果。

需要注意的是,三角函数在 CSS3 中仅对弧度(radian)单位进行支持。如果想要在开发中使用三角函数,可以借助转换函数 deg() 和 rad() 将角度(degree)和弧度进行转换。

CSS3 的这些函数使得开发者可以更加方便处理一些复杂的数学问题,增强了 CSS 的表现力。

三角函数的运动轨迹

三角函数的运用,更多的是在动画当中。以正弦、余弦函数为例,其图形如下:

我们通过一个简单的例子,还原三角函数的图形,以此来感受三角函数的作用。首先,我们实现一个黑色圆球:

<div class='g-single'></div>
.g-single {
width: 20px;
height: 20px;
background: #000;
border-radius: 50%;
}

效果如下:

我们可以通过 transfrom,借助 CSS @property 属性,来构造一个三角函数的使用场景:

.g-single {
width: 20px;
height: 20px;
background: #000;
border-radius: 50%;
animation: move 5s infinite ease-in-out;
transform: translate(
calc(var(--dis) - 40vw),
calc(5 * sin(var(--angle)) * 1em)
);
} @keyframes move {
0% {
--dis: 0px;
--angle: 0deg;
}
100% {
--dis: 80vw;
--angle: 1080deg;
}
}

上述的核心在于这一段代码 -- transform: translate(calc(var(--dis) - 40vw), calc(5 * sin(var(--angle)) * 1em)),内部使用了两个 CSS @property 变量:

  1. x 轴方向是 0px80vw 的水平位移动画
  2. y 轴方向是 5 * sin(0deg) * 1em5 * sin(1080deg) * 1em 的竖直动画

通过动画,动态的修改这两个变量的值,我们就可以得到一个三角函数曲线动画图形:

如果我们,设定多个一模一样的小球,同一个运动轨迹,设定不同的 animation-delay,效果会上怎么样呢?

<ul class="g-multi">
<li> </li>
// ... 一共 80 个 li
<li> </li>
</ui>
li {
animation: move 5s infinite ease-in-out;
transform: translate(
calc(var(--dis) - 40vw),
calc(5 * sin(var(--angle)) * 1em);
}
@for $i from 1 to $count {
li:nth-child(#{$i}) {
animation-delay: #{$i * 5 / $count * -1s};
}
}
@keyframes move {
0% {
--dis: 0px;
--angle: 0deg;
}
100% {
--dis: 80vw;
--angle: 1080deg;
}
}

这样,就得到了这么一个动画,非常的类似三角函数动画的曲线:

完整的代码,你可以戳这里:CodePen Demo -- CSS Cos/Sin Math function

快速实现圆弧轨迹动画

在之前,我们想实现一个圆弧动画,如下所示,还是稍微有点点麻烦的:

有了三角函数之后,类似的动画,可以节省部分代码实现:

<div></div>
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
} .g-single {
background: #000;
width: 20px;
height: 20px;
border-radius: 50%;
animation: move 3s infinite linear;
transform: translate(
calc(sin(var(--angle)) * 10vmin),
calc(cos(var(--angle)) * 10vmin)
);
} @keyframes move {
0% {
--angle: 0deg;
}
100% {
--angle: 360deg;
}
}

核心就在于 transform: translate(calc(sin(var(--angle)) * 10vmin), calc(cos(var(--angle)) * 10vmin));,简化一下这段代码,表达式为:

  • transform: translate(sinX, conX),其中 X 为角度变化

如此,我们只需要动态设置 X 从 0deg360deg 的变化即可,就可以得到一个圆形动画效果:

完整的代码,你可以戳这里:CodePen Demo -- CSS Cos/Sin Math function - arc animation

基于这个技巧,我们可以尝试实现一个旋转的 Loading 动画,代码也非常简单:

<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
ul {
position: relative;
}
li {
position: absolute;
inset: 0;
border-radius: 50%;
animation: move 3s infinite ease-in-out;
transform: translate(
calc(sin(var(--angle)) * 60px),
calc(cos(var(--angle)) * 60px)
);
}
@for $i from 1 to 11 {
li:nth-child(#{$i}) {
animation-delay: #{ $i * -0.15 }s;
background: #{hsl(100 + $i * 15, 80%, 60%)};
}
}
@keyframes move {
0% {
--angle: 0deg;
}
100% {
--angle: 360deg;
}
}

借助了 SASS 完成了部分重复性代码,核心就是让小圆以不同的速率进行旋转动画,结果如下:

完整的代码,你可以戳这里:CSS Cos/Sin Math function - Loading animation

尝试使用三角函数实现波浪线

那么,三角函数还有什么作用吗?

我们来尝试点新奇的,借助三角函数实现曲线(波浪线)。

box-shadow 足够了解的同学应该知道,box-shadow 是支持多重阴影的,借助这个特性,出现了很多单标签,借助 box-shadow 来绘图的案例。

借助三角函数、以及box-shadow 是支持多重阴影的这两个特性,我们就可以利用它们来实现波浪线。

当然,可以还需要借助 SASS 简化手动书写的代码量。我们来看一个 DEMO:

<div></div>
<div></div>
<div></div>
@function shadowSet($vx, $vy, $color) {
$shadow: 0 0 0 0 $color; @for $i from 0 through 50 {
$x: calc(2 * sin(#{$i * 15 * 1deg}) * #{$vy});
$y: $i * $vy; $shadow: $shadow, #{$x} #{$y} 0 0 $color;
} @return $shadow;
} div {
margin: auto;
width: 10px;
height: 10px;
border-radius: 50%;
background: #f00;
box-shadow: shadowSet(3px, 3px, #f00);
}
div:nth-child(2) {
width: 6px;
height: 6px;
background: #fc0;
box-shadow: shadowSet(3px, 3px, #fc0);
}
div:nth-child(3) {
width: 4px;
height: 4px;
background: #000;
box-shadow: shadowSet(2px, 2px, #000);
}

这样,我们就能得到 3 条波浪线:

单独看其中一个,其实是这样一坨 box-shadow 代码:

好吧,这个方法确实一定程度上弥补了之前 CSS 无法有效绘制波浪线的缺陷,但是,缺点也非常明显,编译后的代码量太多了!

完整的代码,你可以戳这里:CSS Cos/Sin Math And box-shadow

曲线创意构想

有了绘制曲线的能力,我们就能利用它在 CSS 中创造许多有美感、艺术性的效果。

我们可以尝试使用这些曲线,来制作书签图案:

代码也不复杂,我就不贴完整的代码了,感兴趣的可以戳这里:CodePen Demo - CSS Cos/Sin Math And box-shadow - bookmark

熟悉我的读者一定对 CSS-doodle 不陌生,袁川老师,也就是 CSS-doodle 库的作者,在他的 Codepen 首页背景板中,使用的就是使用了三角函数实现的一副纯 CSS 画作:

Codepen Demo -- border-radius

我之前也尝试使用三角函数,实现了一副丑一点的:

Codepen Demo -- CSS-Doodle fish & seaweed

总结一下

CSS 原生支持的三角函数,给 CSS 打开了更多的可能性。

但是,我们也必须看到,各种数学函数的增加,导致 CSS 的复杂度也是愈来愈高。CSS 已经不再是非常纯粹的负责样式了,很多时候,很多计算也可以直接在 CSS 当中完成。其中利弊,可能不同的人会有不一样的看法。至于好坏,交给时间给出答案吧。

好了,本文到此结束,希望对你有帮助

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

现代 CSS 解决方案:CSS 原生支持的三角函数的更多相关文章

  1. js插件动态加载js、css解决方案

    最近因为工作需要做了一个js自动导入的插件,一开始很天真的以为动态创建个script添加到head中就ok了,试了之后才发现了问题,就是如果同时引入了多个js文件,而且后一个文件中用到了前一个文件中的 ...

  2. 现代 CSS 解决方案:CSS 数学函数

    在 CSS 中,其实存在各种各样的函数.具体分为: Transform functions Math functions Filter functions Color functions Image ...

  3. CSS选择器的浏览器支持

    CSS1 CSS2 CSS 3 :hover 在IE6中只有a元素可用. E:empty 貌似在webkit核心浏览器中有些小bug. 如果这个bug依然存在,不太确定如何测试. IE6不支持.cla ...

  4. css解决方案之css布局

    固定宽度布局解决方案 固定宽度的居中布局 首先我们这里探讨的是我们常用的固定宽度的居中布局,这应该是目前实战中应用的最多的了. 然后从考虑是否应用大背景上我们分为两种,一种是允许整体有一个大背景,一种 ...

  5. sass文件转css时注释虽然支持中文,但是出现乱码的解决方法

    sass文件转css时注释虽然支持中文,但是出现乱码的解决方法 Scss 注释中文报错问题(windows系统, 已解决)找到ruby的安装目录,里面也有sass模块,类似这样样的路径:F:\Prog ...

  6. 从0构建webpack开发环境(二) 添加css,img的模块化支持

    在一个简单的webpack.config.js中,构建了一个基础的webpack.config.js文件,但是只支持js模块的打包. 本篇中添加对css和img的模块化支持 首先需要安装三个个load ...

  7. 现代 CSS 解决方案:Modern CSS Reset

    在早年间(其实也不是很早),写过几篇关于 CSS Reset 的文章 - reset.css 知多少. 详细描述了当时业界比较常用的,两个 CSS reset 方案:reset.css 与 Norma ...

  8. 分享15个优秀的 CSS 解决方案和工具

    CSS 代码是很难管理,尤其是在大型项目. 样式都写在一个全局作用域里,通过复杂的选择器来指向特定的页面元素.冗余.膨胀和维护可以成为前端开发人员的一场噩梦.幸运的是我们有一些 CSS 工具来帮助开发 ...

  9. CSS:CSS 字体

    ylbtech-CSS:CSS 字体 1.返回顶部 1. CSS 字体 CSS字体属性定义字体,加粗,大小,文字样式. serif和sans-serif字体之间的区别  在计算机屏幕上,sans-se ...

  10. 学无止境的CSS(xHTML+CSS技巧教程资源大全)

    本文里面收集一些有关CSS的技巧.教程.工具和观点等,其中一些你也许早就运用的炉火纯青,也可能有的你听都没听说过.不管是新手还是高手,大家都继续学习吧. 一,Web 标准 要玩游戏,就得先了解规则.要 ...

随机推荐

  1. fortify Unsafe JNI

    Unsafe JNI 主要解决问题: 1.system.currentTimeMillis(); 使用SystemClock.now()替换. 2.isAssignableFrom(); 使用新定义的 ...

  2. Sentinel 流量控制

    一.Sentinel 介绍 Sentinel 是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流,流量整形.熔断降级.系统负载保护等多个维度来保障微服务的稳定性.主页地 ...

  3. void关键字

    在C++中,void表示为无类型,主要有三个用途: (1)函数的 返回值用void,表示函数没有返回值. void func(int a, int b) { //函数体代码 return; } (2) ...

  4. Easy App Locker - 给你的 mac 应用加锁保护你的隐私

    Easy App Locker可以对Mac上的单个应用进行密码保护.维护Mac上的隐私. 像如果你的某个应用存在隐私数据就可以使用该软件将此应用上锁,这样当你的朋友使用你的 mac 时你就不用担心你的 ...

  5. Ubuntu+uWSGI部署基于Django的API【鸿篇巨制,事无巨细】

    背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...

  6. Apache Hudi 0.9.0版本重磅发布!更强大的流式数据湖平台

    1. 重点特性 1.1 Spark SQL支持 0.9.0 添加了对使用 Spark SQL 的 DDL/DML 的支持,朝着使所有角色(非工程师.分析师等)更容易访问和操作 Hudi 迈出了一大步. ...

  7. 6步带你用Spring Boot开发出商城高并发秒杀系统

    摘要:本博客将介绍如何使用 Spring Boot 实现一个简单的商城秒杀系统,并通过使用 Redis 和 MySQL 来增强其性能和可靠性. 本文分享自华为云社区<Spring Boot实现商 ...

  8. AI开发实践:关于停车场中车辆识别与跟踪

    摘要:本案例我们使用FairMOT进行车辆检测与跟踪.yolov5进行车牌检测.crnn进行车牌识别,在停车场入口.出口.停车位对车辆进行跟踪与车牌识别,无论停车场路线多复杂,小车在你掌控之中! 本文 ...

  9. [PKM] 家庭数据中心

    1 NAS(Network Attached Storage/网络附属存储) 1.1 NAS的定义 NAS(Network Attached Storage:网络附属存储):具备资料存储功能的装置.按 ...

  10. [Linux]Linux发展历程

    古人云,知其然知其所以然.马哲思想指导着我们,任何事物.问题,离不开:为什么(Why,事物从哪里来?).是什么(What,事物的定位?).怎么做(How,到哪里去?)的哲学3问. 继上个月算是相对彻底 ...