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

这篇具有很好参考价值的文章主要介绍了现代 CSS 解决方案: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 原生支持的三角函数

我们可以通过 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 原生支持的三角函数

如果我们,设定多个一模一样的小球,同一个运动轨迹,设定不同的 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 原生支持的三角函数

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

快速实现圆弧轨迹动画

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

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

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

<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 原生支持的三角函数

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

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

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

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

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

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

曲线创意构想

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

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

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

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

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

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

Codepen Demo -- border-radius

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

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

Codepen Demo -- CSS-Doodle fish 🐟 & seaweed🍀

总结一下

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

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

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

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

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。文章来源地址https://www.toymoban.com/news/detail-458363.html

到了这里,关于现代 CSS 解决方案:CSS 原生支持的三角函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生应用安全简介(含CloudStrike解决方案)】

    1、云环境通常包含应用程序、数据库实例和对象存储(如AWS S3或SEO blob)。 2、现代应用程序通常依赖容器化和微服务架构。 3、云管理员扮演着管理云环境和各类工作负载的重要角色。 1、攻击者倾向于利用云配置中的漏洞来进行恶意活动,如信息泄露或造成破坏。 2、常见

    2024年02月04日
    浏览(36)
  • 云原生全栈监控解决方案(全面详解)

    【作者】 JasonXu 当前全球企业云化、数字化进程持续加速,容器、微服务等云原生技术在软件架构中快速渗透,IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型,以及为了考虑系统的弹性、效率,企业软件开发中大量云原生技术的应用推动全球 IT 监控

    2024年01月23日
    浏览(48)
  • 【云原生】私有镜像的解决方案-Harbor管理实战

    通过前面的镜像管理,我们知道docker的开发和运行都离不开镜像管理,如果要进行镜像管理就需要使用镜像仓库。 docker官方提供的镜像仓库是: docker hub, 很方面但从安全和效率的角度考虑,这样的公有镜像环境就无法在企业私有环境中使用了。所以我们今天来探讨下企业中

    2024年02月05日
    浏览(62)
  • css相邻元素边框重合问题,解决方案

    给每个元素设置margin-top以及margin-left为负的边框 我的解决方案是在宽度上下手,根据观察,发现一行三列,实际导致缺失的是两个边框的大小,那么将这两个边框的大小平分到每行三列模块的开宽度内即可解决,其他情况下,由此推导

    2024年03月08日
    浏览(37)
  • 【支持拖拉拽的可视化图表解决方案】

    《xxx-xxxx》需要做一个可视化图表模块: 1、支持表格、折线图、饼图、柱状图、数值图、横向柱状图、仪表盘等图表。     2、支持表单配置图表参数,以及数据筛选参数。     3、支持拖拽排序、支持伸缩调整图表大小。 了解到这需求其实之前就有,但是之前的小伙伴一直

    2024年02月11日
    浏览(41)
  • 阿里云云原生弹性方案:用弹性解决集群资源利用率难题

    随着上云的认知更加普遍,我们发现除了以往占大部分的互联网类型的客户,一些传统的企业,一些制造类的和工业型企业客户也都开始使用云原生的方式去做 IT 架构的转型,提高集群资源使用率也成为企业上云的一致共识。大家上云的同时,开始思考有没有云原生的方法能

    2024年02月02日
    浏览(49)
  • SmartX 边缘计算解决方案:简单稳定,支持各类应用负载

    在《一文了解近端边缘 IT 基础架构技术需求》文章中,我们为大家分析了边缘应用对 IT 基础架构的技术要求,以及为什么超融合架构是支持边缘场景的最佳选择。值得一提的是,IDC 近日发布的《中国软件定义存储(SDS)及超融合存储系统(HCI)市场季度跟踪报告》也指出,

    2024年02月07日
    浏览(53)
  • 云原生 - 微信小程序 COS 对象存储图片缓存强制更新解决方案

    遇到一个这样的情况:在微信小程序里图片缓存十分麻烦,网上很多说在腾讯云里的 COS 存储对象服务里设置对应的图片缓存(Header 头 Cache-Contorl),说实话真不好用,一会儿生效,一会儿没生效,而且量又大。于是,今天给大家分享一个简单粗暴的解决方案~ 以腾讯云为例,

    2024年01月23日
    浏览(40)
  • 关于Redmi K50刷安卓原生(Pixel Experience)的解决方案

    请注意,目前pe的gsi仍然存在蓝牙耳机无声音、打电话对面能听见但是对面说话你听不见的问题,5G信号也比较差(应该是系统支持的频段变少了很多),这三个大问题目前仍无法解决,但是不得不否认流畅度和系统响应速度简直秒杀miui,同时指纹人脸识别什么的功能都是正

    2024年02月15日
    浏览(41)
  • Android原生键盘弹起,H5页面被压缩的两种解决方案

    移动H5项目中,会出现input框获得焦点键盘弹出把页面元素顶上去压缩到一起,影响页面布局. 方案一:监听页面变化,动态的展示和隐藏底部被顶上来的内容 这种方法经调试还不算十分完美 方案二:监听页面变化,键盘弹起时将变化之前的高度赋值给压缩后的页面         这种

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包