css波浪线-现代 CSS 解决方案:CSS 原生支持三角函数 | 建立惊人的疗效

2023-08-23 0 6,950 百度已收录

CSS中,有很多物理函数,可以通过简单的估计操作生成单独的属性值,例如:

在《现代 CSS 解决方案:CSS 物理函数 [1]》一文中,我们详细介绍了

四种生理功能。

在这篇文章中,我将向大家介绍最近各大浏览器逐渐开始原生支持的三角函数:

CSS三角函数句型简介

首先我们来看看如何使用CSS三角函数:

.box {
  /* 设置元素的宽度为 sin(30deg) 的值 */
  widthcalc(sin(30deg) * 100px);

  /* 设置元素的高度为 cos(45deg) 的值 */
  heightcalc(cos(45deg) * 100%);

  /* 设置元素的透明度为 tan(60deg) 的值 */
  opacitycalc(tan(60deg));
}

上面的代码中,我们使用calc()函数进行估计,然后使用sin()、cos()和tan()函数对估计结果进行进一步处理,以达到不同的疗效。

需要注意的是,CSS3中三角函数仅支持弧度单位。 如果开发中想使用三角函数,可以使用转换函数deg()和rad()来转换度数和弧度。

CSS3的功能使开发者能够更方便地处理一些复杂的物理问题,提高CSS的表现力。

三角函数的轨迹

三角函数的运用在动画中较多。 以cosine和cosine函数为例,图形如下:

我们用一个简单的例子来还原三角函数的图形,从而了解三角函数的作用。 首先,我们实现一个白色球体:

<div class='g-single'></div>

.g-single {
    width20px;
    height20px;
    background#000;
    border-radius50%;
}

疗效如下:

css波浪线-现代 CSS 解决方案:CSS 原生支持三角函数 | 建立惊人的疗效

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

.g-single {
    width20px;
    height20px;
    background#000;
    border-radius50%;
    animation: move 5s infinite ease-in-out;
    transformtranslate(
        calc(var(--dis) - 40vw),
        calc(5 * sin(var(--angle)) * 1em)
    );
}

@keyframes move {
    0% {
        --dis0px;
        --angle0deg;
    }
    100% {
        --dis80vw;
        --angle1080deg;
    }
}

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

x轴方向是从0px到80vw的水平位移动画

y轴方向是从5*sin(0deg)*1em到5*sin(1080deg)*1em的垂直动画

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

如果我们设置多个具有相同轨迹的相同球,并设置不同的动画延迟,会产生什么效果

<ul class="g-multi">
  <li> </li>
  // ... 一共 80 个 li
  <li> </li>
</ui>

li {
    animation: move 5s infinite ease-in-out;
    transformtranslate(
        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% {
        --dis0px;
        --angle0deg;
    }
    100% {
        --dis80vw;
        --angle1080deg;
    }
}

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

完整代码可以点击这里:CodePenDemo--SSSCos/SinMathfunction[2]

快速实现圆弧轨迹动画

之前我们想要实现一个圆弧动画,如下图,还是有点麻烦:

css波浪线-现代 CSS 解决方案:CSS 原生支持三角函数 | 建立惊人的疗效

借助三角函数css波浪线,保存部分代码即可实现类似的动画:

<div></div>

@property --angle {
  syntax: '<angle>';
  inheritsfalse;
  initial-value: 0deg;
}

.g-single {
    background#000;
    width20px;
    height20px;
    border-radius50%;
    animation: move 3s infinite linear;
    transformtranslate(
        calc(sin(var(--angle)) * 10vmin),
        calc(cos(var(--angle)) * 10vmin)
    );
}

@keyframes move {
    0% {
        --angle0deg;
    }
    100% {
        --angle360deg;
    }
}

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

这样我们只需要动态设置X从0deg到360deg的变化就可以得到矩形动画效果

完整代码可以点击这里:CodePenDemo--SSSCos/SinMathfunction-arcanimation[3]

基于这个方法,我们可以尝试实现一个旋转的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>';
  inheritsfalse;
  initial-value: 0deg;
}
ul {
    position: relative;
}
li {
    position: absolute;
    inset0;
    border-radius50%;
    animation: move 3s infinite ease-in-out;
    transformtranslate(
        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% {
        --angle0deg;
    }
    100% {
        --angle360deg;
    }
}

使用SASS完成部分重复代码,核心是让小圆以不同的速度旋转动画,结果如下:

完整的代码可以戳这里:CSSCos/SinMathfunction-Loadinganimation[4]

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

那么三角函数还能做什么呢?

让我们尝试一些新的东西并使用三角函数实现曲线(波浪线)。

css波浪线-现代 CSS 解决方案:CSS 原生支持三角函数 | 建立惊人的疗效

对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 {
        $xcalc(2 * sin(#{$i * 15 * 1deg}) * #{$vy});
        $y: $i * $vy;

        $shadow: $shadow, #{$x} #{$y} 0 0 $color;
    }

    @return $shadow;
}

div {
    margin: auto;
    width10px;
    height10px;
    border-radius50%;
    background#f00;
    box-shadowshadowSet(3px3px, #f00);
}
div:nth-child(2) {
    width6px;
    height6px;
    background#fc0;
    box-shadowshadowSet(3px3px, #fc0);
}
div:nth-child(3) {
    width4px;
    height4px;
    background#000;
    box-shadowshadowSet(2px2px, #000);
}

这样我们就可以得到3条波浪线:

单独看其中一个,尽管它是一堆盒子阴影代码:

嗯,这个方法确实在一定程度上弥补了之前CSS未能有效绘制波浪线的缺陷css波浪线,而且缺陷也非常明显,编译代码量太多了!

完整代码可以点击这里:CSSCos/SinMathAndbox-shadow[5]

曲线创意

有了绘制曲线的能力,我们可以用它在CSS中创造出许多美丽的艺术效果。

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

代码并不复杂,所以就不贴出完整的代码了。 有兴趣的话可以点击这里:CodePenDemo-CSSCos/SinMathAndbox-shadow-bookmark[6]

css波浪线-现代 CSS 解决方案:CSS 原生支持三角函数 | 建立惊人的疗效

熟悉我的读者一定熟悉CSS-doodle。 CSS-doodle库的作者袁川先生[7]在他的Codepen主页背景板上使用了利用三角函数实现的纯CSS。 绘画:

CodepenDemo--边框半径[8]

我之前也尝试过用三角函数,实现的有点难看:

CodepenDemo--CSS-Doodlefish&seaweed[9]

综上所述

CSS 原生支持的三角函数为 CSS 开辟了更多可能性。

但是,我们也必须听到,各种物理功能的减少,导致CSS的复杂度越来越高。 CSS 不再是一种纯粹负责的样式。 很多时候,很多计算也可以直接在CSS中完成。 优点和缺点可能因人而异。 至于利弊,让时间给出答案。

好了,这篇文章就到此结束了,希望对你有帮助:)

更多精彩CSS技术文章汇总在我的Github--iCSS[10]中,持续更新。 欢迎点击星星订阅合集。

如果还有疑问或者建议,可以多沟通。 原创文章文采有限,缺乏才华。 如果文章中有任何不准确的地方,请告诉我。

参考

[1]

现代 CSS 解决方案:CSS 物理函数:

[2]

CodePenDemo——SSSCos/SinMathfunction:

[3]

CodePenDemo--SSSCos/SinMathfunction-动画:

[4]

CSSCos/SinMath 函数 - 加载动画:

[5]

CSSCos/SinMathAndbox 阴影:

[6]

CodePenDemo-SSSCos/SinMathAndbox-shadow-书签:

[7]

袁川:

[8]

CodepenDemo --边框半径:

[9]

CodepenDemo--CSS-Doodlefish&seaweed:

[10]

Github--iCSS:

如果觉得还不错,欢迎点赞、收藏、转发❤❤

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 css css波浪线-现代 CSS 解决方案:CSS 原生支持三角函数 | 建立惊人的疗效 https://www.wkzy.net/game/146125.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务