首页 > 其他分享 >现代 CSS 解决方案:CSS 原生支持的三角函数

现代 CSS 解决方案:CSS 原生支持的三角函数

时间:2023-09-14 16:02:00浏览次数:45  
标签:原生 angle 三角函数 -- shadow calc CSS

在 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 的表现力。

三角函数的运动轨迹

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

现代 CSS 解决方案:CSS 原生支持的三角函数_三角函数

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

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

效果如下:

现代 CSS 解决方案:CSS 原生支持的三角函数_Math_02

我们可以通过 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 的竖直动画

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

现代 CSS 解决方案:CSS 原生支持的三角函数_CSS_03

如果我们,设定多个一模一样的小球,同一个运动轨迹,设定不同的 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;
    }
}

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

现代 CSS 解决方案:CSS 原生支持的三角函数_CSS_04

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

快速实现圆弧轨迹动画

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

现代 CSS 解决方案:CSS 原生支持的三角函数_三角函数_05

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

<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 的变化即可,就可以得到一个圆形动画效果:

现代 CSS 解决方案:CSS 原生支持的三角函数_Math_06

完整的代码,你可以戳这里: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 解决方案:CSS 原生支持的三角函数_Math_07

完整的代码,你可以戳这里: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 条波浪线:

现代 CSS 解决方案:CSS 原生支持的三角函数_三角函数_08

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

现代 CSS 解决方案:CSS 原生支持的三角函数_Math_09

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

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

曲线创意构想

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

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

现代 CSS 解决方案:CSS 原生支持的三角函数_CSS_10

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

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

现代 CSS 解决方案:CSS 原生支持的三角函数_Math_11

Codepen Demo -- border-radius

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

现代 CSS 解决方案:CSS 原生支持的三角函数_三角函数_12

Codepen Demo -- CSS-Doodle fish

标签:原生,angle,三角函数,--,shadow,calc,CSS
From: https://blog.51cto.com/u_15566643/7470931

相关文章

  • 直播app开发,CSS3动画实现左右无缝滚动图
    直播app开发,CSS3动画实现左右无缝滚动图<viewclass="shortList_con"><viewclass="scrollCon":style="'width:'+(shortRouteList.length)*210+'rpx'"><viewclass="shortItem"v-for="(item,index......
  • 纯css实现边框环绕的效果
    最近做项目遇到一个需求,需要给卡片添加一个边框环绕的效果,当鼠标移入卡片时,出现边框。这里我主要是使用:before和:after来辅助实现这个功能。在很多时候,我们可以巧用:before或者:after来实现一些看起来较为复杂的效果。我们先看看效果:代码如下,希望大家能受到些许的启发,......
  • How to fix Tailwind CSS colors not work in Next.js All In One
    HowtofixTailwindCSScolorsnotworkinNext.jsAllInOneTailwindCSS&Next.js13errorimporttype{Config}from'tailwindcss'constconfig:Config={content:['./src/pages/**/*.{js,ts,jsx,tsx,mdx}','......
  • PostCSS received undefined instead of CSS string
    问题npmrunserve启动项目后,报错SyntaxError:Error:PostCSSreceivedundefinedinsteadofCSSstring解决node-sass版本兼容问题导致,按照应用使用的node-sass版本切换(可使用nvm)到对应的node版本,再重新npmi......
  • CSS中的变量
    前言在CSS中,有很多需要反复使用的属性值,如果每个使用的地方都直接写死这个值,而没有使用变量去定义这个值的话,后期修改起来会很麻烦。有很多人忽略了在CSS中也可以定义变量这个事情,相信你会爱上它!CSS使用变量有很多好处:可以减少样式代码的重复性,增加样式代码的扩展性和灵......
  • react配置css相关
    1.installnormalize:yarnaddnormalize.css-D(1).引入src/index.js或src/index.tsx:import"normalize.css";2.installsass:[email protected].配置less:(1).安装less相关依赖:[email protected]@5.0.0-D(2).修改config/webpack.config.js文件:......
  • 全栈工程师必须要掌握的前端CSS技能
    作为一名全栈工程师,在日常的工作中,可能更侧重于后端开发,如:C#,Java,SQL,Python等,对前端的知识则不太精通。在一些比较完善的公司或者项目中,一般会搭配前端工程师,UI工程师等,来弥补后端开发的一些前端经验技能上的不足。但并非所有的项目都会有专职前端工程师,在一些小型项目或者初创公......
  • 去除字符串中的css标记
       有时我们拿到的资料中会有很多网页css标记符号,非常影响资料的可读性。例如:<p>\u3000\u3000第一首</p><p>\u3000\u3000晓日曈曈万象融、河清海晏庆年丰、生逢盛世\真欢乐、好把心田答化工。</p><p>\u3000\u3000晓日:黎明时的太阳</p><p>\u3000\u3000曈曈:形\容太阳刚出还不......
  • windows下浏览器调用原生app
    regist.regWindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\protocolName]@="protocolNameProtocol""URLProtocol"=""[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\protocolName\DefaultIcon]@="C:......
  • CSS3 中 transition 和 animation 的属性分别有哪些
    Transition属性:transition 属性用于定义元素在状态改变时从一个样式转换到另一个样式的过渡效果。它包含以下几个属性:transition-property:指定过渡效果应用的CSS属性名称,多个属性可以用逗号分隔。transition-duration:指定过渡效果的持续时间,单位可以是秒(s)或毫秒(ms)。transit......