We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在 CSS 中,存在许多数学函数,这些函数能够通过简单的计算操作来生成某些属性值,例如 :
在现代 CSS 解决方案: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 属性,来构造一个三角函数的使用场景:
transfrom
.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 变量:
transform: translate(calc(var(--dis) - 40vw), calc(5 * sin(var(--angle)) * 1em))
0px
80vw
5 * sin(0deg) * 1em
5 * sin(1080deg) * 1em
通过动画,动态的修改这两个变量的值,我们就可以得到一个三角函数曲线动画图形:
如果我们,设定多个一模一样的小球,同一个运动轨迹,设定不同的 animation-delay,效果会上怎么样呢?
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(calc(sin(var(--angle)) * 10vmin), calc(cos(var(--angle)) * 10vmin));
transform: translate(sinX, conX)
如此,我们只需要动态设置 X 从 0deg 到 360deg 的变化即可,就可以得到一个圆形动画效果:
0deg
360deg
完整的代码,你可以戳这里: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
借助三角函数、以及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 当中完成。其中利弊,可能不同的人会有不一样的看法。至于好坏,交给时间给出答案吧。
好了,本文到此结束,希望对你有帮助 :)
想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 -- iCSS前端趣闻 😄
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
The text was updated successfully, but these errors were encountered:
sin() 函数的妙用:https://x.com/jh3yy/status/1766216768710664222?s=20
Sorry, something went wrong.
No branches or pull requests
在 CSS 中,存在许多数学函数,这些函数能够通过简单的计算操作来生成某些属性值,例如 :
在现代 CSS 解决方案:CSS 数学函数一文中,我们详细介绍了
四个数学函数。
而本文,将给大家介绍一下最近各大浏览器也逐渐开始原生支持的三角函数:
CSS 三角函数语法介绍
首先,我们来看看 CSS 三角函数的使用方式:
上述代码中,我们使用了 calc() 函数进行了计算,然后通过 sin()、cos() 和 tan() 函数对计算结果进行了进一步的处理,从而实现了不同的效果。
需要注意的是,三角函数在 CSS3 中仅对弧度(radian)单位进行支持。如果想要在开发中使用三角函数,可以借助转换函数 deg() 和 rad() 将角度(degree)和弧度进行转换。
CSS3 的这些函数使得开发者可以更加方便处理一些复杂的数学问题,增强了 CSS 的表现力。
三角函数的运动轨迹
三角函数的运用,更多的是在动画当中。以正弦、余弦函数为例,其图形如下:
我们通过一个简单的例子,还原三角函数的图形,以此来感受三角函数的作用。首先,我们实现一个黑色圆球:
效果如下:
我们可以通过
transfrom
,借助 CSS @Property 属性,来构造一个三角函数的使用场景:上述的核心在于这一段代码 --
transform: translate(calc(var(--dis) - 40vw), calc(5 * sin(var(--angle)) * 1em))
,内部使用了两个 CSS @Property 变量:0px
到80vw
的水平位移动画5 * sin(0deg) * 1em
到5 * sin(1080deg) * 1em
的竖直动画通过动画,动态的修改这两个变量的值,我们就可以得到一个三角函数曲线动画图形:
如果我们,设定多个一模一样的小球,同一个运动轨迹,设定不同的
animation-delay
,效果会上怎么样呢?这样,就得到了这么一个动画,非常的类似三角函数动画的曲线:
完整的代码,你可以戳这里:CodePen Demo -- CSS Cos/Sin Math function
快速实现圆弧轨迹动画
在之前,我们想实现一个圆弧动画,如下所示,还是稍微有点点麻烦的:
有了三角函数之后,类似的动画,可以节省部分代码实现:
核心就在于
transform: translate(calc(sin(var(--angle)) * 10vmin), calc(cos(var(--angle)) * 10vmin));
,简化一下这段代码,表达式为:transform: translate(sinX, conX)
,其中 X 为角度变化如此,我们只需要动态设置 X 从
0deg
到360deg
的变化即可,就可以得到一个圆形动画效果:完整的代码,你可以戳这里:CodePen Demo -- CSS Cos/Sin Math function - arc animation
基于这个技巧,我们可以尝试实现一个旋转的 Loading 动画,代码也非常简单:
借助了 SASS 完成了部分重复性代码,核心就是让小圆以不同的速率进行旋转动画,结果如下:
完整的代码,你可以戳这里:CSS Cos/Sin Math function - Loading animation
尝试使用三角函数实现波浪线
那么,三角函数还有什么作用吗?
我们来尝试点新奇的,借助三角函数实现曲线(波浪线)。
对
box-shadow
足够了解的同学应该知道,box-shadow
是支持多重阴影的,借助这个特性,出现了很多单标签,借助box-shadow
来绘图的案例。借助三角函数、以及
box-shadow
是支持多重阴影的这两个特性,我们就可以利用它们来实现波浪线。当然,可以还需要借助 SASS 简化手动书写的代码量。我们来看一个 DEMO:
这样,我们就能得到 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 当中完成。其中利弊,可能不同的人会有不一样的看法。至于好坏,交给时间给出答案吧。
好了,本文到此结束,希望对你有帮助 :)
想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 -- iCSS前端趣闻 😄
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
The text was updated successfully, but these errors were encountered: