- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
在 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 属性,来构造一个三角函数的使用场景:
.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 变量:
0px
到 80vw
的水平位移动画 5 * sin(0deg) * 1em
到 5 * 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 从 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 是支持多重阴影的这两个特性,我们就可以利用它们来实现波浪线.
当然,可以还需要借助 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 订阅收藏.
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知.
想 Get 到最有意思的 CSS 资讯,千万不要错过我的 iCSS 公众号 😄 :
最后此篇关于现代CSS解决方案:CSS原生支持的三角函数的文章就讲到这里了,如果你想了解更多关于现代CSS解决方案:CSS原生支持的三角函数的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在C语言标准库里面提供了常用的三角函数,在头文件math.h里面可以看到函数的相关定义。 double __cdecl sin(double _X); double __cdecl cos(dou
我这个人可不是“科学怪人”,但是我可爱的朋友们,今天我想和你们谈一谈三角函数与牛顿迭代法。这可不是一件简单的事情哦,就像是找到一片荒芜的沙漠中的绿洲一样。但是别怕,我会用通俗易懂的语言给你们解释清楚的
我想做一个 sin 函数。所以这是我的代码: inline double _cdecl Sin(double Rad) { _asm { fld QWORD PTR [
当我偶然发现这个时,我正在通过为表中的字段预先计算一些三角函数来优化查询: SELECT 6371 * acos( 0.793521289617132 * 0.793521289617132 + 0.
我正在尝试在 Android 上使用 Java 和 LibGDX 做一些基本的三角函数。我花了很长时间在谷歌上搜索“如何找到直角三角形的角度”。我还是不太明白:( 我想给 Actor 子类一个随机的方
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我目前使用 MSSQL 查询,它允许我查找特定半径内的项目。它看起来像这样: select distinct ID,longitude,latitude, (@unite * ACOS(cos(rad
这个问题类似于斐波那契数列,只是我们将最后三个数字加在一起而不是最后两个数字。它被称为 Tribonacci。 INPUT:序列中 3 个起始数字的数组/列表,以及 (n) 您希望最终模式有多长,例如
我明白如何计算斜边 a^2 + b^2 = c^2,sqrt(c) = 斜边。而且我知道 stackoverflow 上已经有一些相关的答案,但他们沉浸在我作为初学者程序员还不理解的术语中。 由于这更
我正在写一个应该计算角度(以度为单位)的类,经过长时间的尝试我没有让它工作。 When r = 45 & h = 0 sum should be around 77,14° 但它返回 NaN - 为什
我试着算出三角形的角。 如果三角形的一边是100,另一边是100。 我如何使它达到 45 度。 如果我在我的计算器上运行 tan-1(100/100),我得到 45。我如何在 PHP 中执行此操作?
由于 java.lang.Math 中的三角函数非常慢:是否有一个库可以快速且良好地进行近似?在不损失太多精度的情况下,似乎可以将计算速度提高几倍。 (在我的机器上,乘法需要 1.5ns,java.l
我正在尝试计算 SSIS 表达式(作为新列)中的 SIN 和 COS,但找不到任何表达式。 例如: 新加坡(lat_org_rad)COS(long_org_rad)ACOS(long_org_rad
问题: 在简单的 SDL 2.0.4 应用程序(自上而下的移动/旋转尝试)中使用 math.h 三角函数时,我发现三角计算中存在一些小错误,导致“玩家”不动正好在面对的方向,这让我很烦恼。我搜索了为什
我用 Python 编写了这段代码 def hitsin(a): a = a*57.3 return math.sin(a) 所以每当我输入 hitsin(x) 时,x 都会转换为弧度
我的 Enemy 类中有一个名为 huntPlayer 的方法。它需要一个播放器对象 p。在这里: def huntPlayer(self, p): if self.dist2p self.
我遇到了一些应该很容易回答的问题,但我不能 Handlebars 指放在上面。自从我做了一些三角函数以来已经有一段时间了。 double cosValue = -2.7105054312E-20; /
我是一名优秀的程序员,十分优秀!