iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >通过CSS数学函数实现动画特效
  • 106
分享到

通过CSS数学函数实现动画特效

2024-04-02 19:04:59 106人浏览 薄情痞子
摘要

目录前言CSS 数学函数绝对值中位数数轴上两点距离三角函数例子一维交错动画初始状态应用动画交错动画二维交错动画初始状态应用动画交错动画另一种动画余弦波动动画初始状态余弦排列波动动画交

前言

大家好,这里是 CSS 兼 webGL 魔法使——alphardex。
之前一直在玩 three.js ,接触了很多数学函数,用它们创造过很多特效。于是我思考:能否在 CSS 中也用上这些数学函数,但发现 CSS 目前还没有,据说以后的新规范会纳入,估计也要等很久。
然而,我们可以通过一些小技巧,来创作出一些属于自己的 CSS 数学函数,从而实现一些有趣的动画效果。
让我们开始吧!

CSS 数学函数

注意:以下的函数用原生 CSS 也都能实现,这里用 SCSS 函数只是为了方便封装,封装起来的话更方便调用

绝对值

绝对值就是正的还是正的,负的变为正的
可以创造 2 个数,其中一个数是另一个数的相反数,比较它们的最大值,即可获得这个数的绝对值


@function abs($v) {
  @return max(#{$v}, calc(-1 * #{$v}));
}

中位数

原数减 1 并乘以一半即可


@function middle($v) {
  @return calc(0.5 * (#{$v} - 1));
}

数轴上两点距离

数轴上两点距离就是两点所表示数字之差的绝对值,有了上面的绝对值公式就可以直接写出来


@function dist-1d($v1, $v2) {
  $v-delta: calc(#{$v1} - #{$v2});
  @return #{abs($v-delta)};
}

三角函数

其实这个笔者也不会实现~不过之前看到过好友 chokcoco 的一篇文章写到了如何在 CSS 中实现三角函数,在此表示感谢


@function fact($number) {
  $value: 1;
  @if $number>0 {
    @for $i from 1 through $number {
      $value: $value * $i;
    }
  }
  @return $value;
}

@function pow($number, $exp) {
  $value: 1;
  @if $exp>0 {
    @for $i from 1 through $exp {
      $value: $value * $number;
    }
  } @else if $exp < 0 {
    @for $i from 1 through -$exp {
      $value: $value / $number;
    }
  }
  @return $value;
}

@function rad($angle) {
  $unit: unit($angle);
  $unitless: $angle / ($angle * 0 + 1);
  @if $unit==deg {
    $unitless: $unitless / 180 * pi();
  }
  @return $unitless;
}

@function pi() {
  @return 3.14159265359;
}

@function sin($angle) {
  $sin: 0;
  $angle: rad($angle);
  // Iterate a bunch of times.
  @for $i from 0 through 20 {
    $sin: $sin + pow(-1, $i) * pow($angle, (2 * $i + 1)) / fact(2 * $i + 1);
  }
  @return $sin;
}

@function cos($angle) {
  $cos: 0;
  $angle: rad($angle);
  // Iterate a bunch of times.
  @for $i from 0 through 20 {
    $cos: $cos + pow(-1, $i) * pow($angle, 2 * $i) / fact(2 * $i);
  }
  @return $cos;
}

@function tan($angle) {
  @return sin($angle) / cos($angle);
}

例子

以下的几个动画特效演示了上面数学函数的作用

一维交错动画

初始状态

创建一排元素,用内部阴影填充,准备好我们的数学函数


<div class="list">
  <div class="list-item"></div>
  ...(此处省略14个 list-item)
  <div class="list-item"></div>
</div>

body {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  margin: 0;
  background: #222;
}

:root {
  --blue-color-1: #6ee1f5;
}

(这里复制粘贴上文所有的数学公式)

.list {
  --n: 16;

  display: flex;
  flex-wrap: wrap;
  justify-content: space-evenly;

  &-item {
    --p: 2vw;
    --gap: 1vw;
    --bg: var(--blue-color-1);

    @for $i from 1 through 16 {
      &:nth-child(#{$i}) {
        --i: #{$i};
      }
    }

    padding: var(--p);
    margin: var(--gap);
    box-shadow: inset 0 0 0 var(--p) var(--bg);
  }
}

应用动画

这里用了 2 个动画:grow 负责将元素缩放出来;melt 负责“融化”元素(即消除阴影的扩散半径)


<div class="list grow-melt">
  <div class="list-item"></div>
  ...(此处省略14个 list-item)
  <div class="list-item"></div>
</div>

.list {
  &.grow-melt {
    .list-item {
      --t: 2s;

      animation-name: grow, melt;
      animation-duration: var(--t);
      animation-iteration-count: infinite;
    }
  }
}

@keyframes grow {
  0% {
    transfORM: scale(0);
  }

  50%,
  100% {
    transform: scale(1);
  }
}

@keyframes melt {
  0%,
  50% {
    box-shadow: inset 0 0 0 var(--p) var(--bg);
  }

  100% {
    box-shadow: inset 0 0 0 0 var(--bg);
  }
}

交错动画

  1. 计算出元素下标的中位数
  2. 计算每个元素 id 到这个中位数的距离
  3. 根据距离算出比例
  4. 根据比例算出 delay

<div class="list grow-melt middle-stagger">
  <div class="list-item"></div>
  ...(此处省略14个 list-item)
  <div class="list-item"></div>
</div>

.list {
  &.middle-stagger {
    .list-item {
      --m: #{middle(var(--n))}; // 中位数,这里是7.5
      --i-m-dist: #{dist-1d(var(--i), var(--m))}; // 计算每个id到中位数之间的距离
      --ratio: calc(var(--i-m-dist) / var(--m)); // 根据距离算出比例
      --delay: calc(var(--ratio) * var(--t)); // 根据比例算出delay
      --n-delay: calc((var(--ratio) - 2) * var(--t)); // 负delay表示动画提前开始

      animation-delay: var(--n-delay);
    }
  }
}

地址:Symmetric Line Animation

二维交错动画

初始状态

如何将一维的升成二维?应用网格系统即可


<div class="grid">
  <div class="grid-item"></div>
  ...(此处省略62个 grid-item)
  <div class="grid-item"></div>
</div>

.grid {
  $row: 8;
  $col: 8;
  --row: #{$row};
  --col: #{$col};
  --gap: 0.25vw;

  display: grid;
  gap: var(--gap);
  grid-template-rows: repeat(var(--row), 1fr);
  grid-template-columns: repeat(var(--col), 1fr);

  &-item {
    --p: 2vw;
    --bg: var(--blue-color-1);

    @for $y from 1 through $row {
      @for $x from 1 through $col {
        $k: $col * ($y - 1) + $x;
        &:nth-child(#{$k}) {
          --x: #{$x};
          --y: #{$y};
        }
      }
    }

    padding: var(--p);
    box-shadow: inset 0 0 0 var(--p) var(--bg);
  }
}

应用动画

跟上面的动画一模一样


<div class="grid grow-melt">
  <div class="grid-item"></div>
  ...(此处省略62个 grid-item)
  <div class="grid-item"></div>
</div>

.grid {
  &.grow-melt {
    .grid-item {
      --t: 2s;

      animation-name: grow, melt;
      animation-duration: var(--t);
      animation-iteration-count: infinite;
    }
  }
}

交错动画

  1. 计算出网格行列的中位数
  2. 计算网格 xy 坐标到中位数的距离并求和
  3. 根据距离算出比例
  4. 根据比例算出 delay

<div class="grid grow-melt middle-stagger">
  <div class="grid-item"></div>
  ...(此处省略62个 grid-item)
  <div class="grid-item"></div>
</div>

.grid {
  &.middle-stagger {
    .grid-item {
      --m: #{middle(var(--col))}; // 中位数,这里是7.5
      --x-m-dist: #{dist-1d(var(--x), var(--m))}; // 计算x坐标到中位数之间的距离
      --y-m-dist: #{dist-1d(var(--y), var(--m))}; // 计算y坐标到中位数之间的距离
      --dist-sum: calc(var(--x-m-dist) + var(--y-m-dist)); // 距离之和
      --ratio: calc(var(--dist-sum) / var(--m)); // 根据距离和计算比例
      --delay: calc(var(--ratio) * var(--t) * 0.5); // 根据比例算出delay
      --n-delay: calc(
        (var(--ratio) - 2) * var(--t) * 0.5
      ); // 负delay表示动画提前开始

      animation-delay: var(--n-delay);
    }
  }
}

地址:Symmetric Grid Animation

另一种动画

可以换一种动画 shuffle(穿梭),会产生另一种奇特的效果


<div class="grid shuffle middle-stagger">
  <div class="grid-item"></div>
  ...(此处省略254个 grid-item )
  <div class="grid-item"></div>
</div>

.grid {
  $row: 16;
  $col: 16;
  --row: #{$row};
  --col: #{$col};
  --gap: 0.25vw;

  &-item {
    --p: 1vw;

    transform-origin: bottom;
    transform: scaleY(0.1);
  }

  &.shuffle {
    .grid-item {
      --t: 2s;

      animation: shuffle var(--t) infinite ease-in-out alternate;
    }
  }
}

@keyframes shuffle {
  0% {
    transform: scaleY(0.1);
  }

  50% {
    transform: scaleY(1);
    transform-origin: bottom;
  }

  50.01% {
    transform-origin: top;
  }

  100% {
    transform-origin: top;
    transform: scaleY(0.1);
  }
}

地址:Shuffle Grid Animation

余弦波动动画

初始状态

创建 7 个不同颜色的(这里直接选了彩虹色)列表,每个列表有 40 个子元素,每个子元素是一个小圆点
让这 7 个列表排列在一条线上,且 z 轴上距离错开,设置好基本的 delay


<div class="lists">
  <div class="list">
    <div class="list-item"></div>
    ...(此处省略39个 list-item)
  </div>
  ...(此处省略6个 list)
</div>

.lists {
  $list-count: 7;
  $colors: red, orange, yellow, green, cyan, blue, purple;

  position: relative;
  width: 34vw;
  height: 2vw;
  transform-style: preserve-3D;
  perspective: 800px;

  .list {
    position: absolute;
    top: 0;
    left: 0;
    display: flex;
    transform: translateZ(var(--z));

    @for $i from 1 through $list-count {
      &:nth-child(#{$i}) {
        --bg: #{nth($colors, $i)};
        --z: #{$i * -1vw};
        --basic-delay-ratio: #{$i / $list-count};
      }
    }

    &-item {
      --w: 0.6vw;
      --gap: 0.15vw;

      width: var(--w);
      height: var(--w);
      margin: var(--gap);
      background: var(--bg);
      border-radius: 50%;
    }
  }
}

余弦排列

运用上文的三角函数公式,让这些小圆点以余弦的一部分形状进行排列


.lists {
  .list {
    &-item {
      $item-count: 40;
      $offset: pi() * 0.5;
      --wave-length: 21vw;

      @for $i from 1 through $item-count {
        &:nth-child(#{$i}) {
          --i: #{$i};
          $ratio: ($i - 1) / ($item-count - 1);
          $angle-unit: pi() * $ratio;
          $wave: cos($angle-unit + $offset);
          --single-wave-length: calc(#{$wave} * var(--wave-length));
          --n-single-wave-length: calc(var(--single-wave-length) * -1);
        }
      }

      transform: translateY(var(--n-single-wave-length));
    }
  }
}

波动动画

对每个小圆点应用上下平移动画,平移的距离就是余弦的波动距离


.lists {
  .list {
    &-item {
      --t: 2s;

      animation: wave var(--t) infinite ease-in-out alternate;
    }
  }
}

@keyframes wave {
  from {
    transform: translateY(var(--n-single-wave-length));
  }

  to {
    transform: translateY(var(--single-wave-length));
  }
}

交错动画

跟上面一个套路,计算从中间开始的 delay,再应用到动画上即可


.lists {
  .list {
    &-item {
      --n: #{$item-count + 1};
      --m: #{middle(var(--n))};
      --i-m-dist: #{dist-1d(var(--i), var(--m))};
      --ratio: calc(var(--i-m-dist) / var(--m));
      --square: calc(var(--ratio) * var(--ratio));
      --delay: calc(
        calc(var(--square) + var(--basic-delay-ratio) + 1) * var(--t)
      );
      --n-delay: calc(var(--delay) * -1);

      animation-delay: var(--n-delay);
    }
  }
}

地址:Rainbow Sine

到此这篇关于通过CSS数学函数实现动画特效的文章就介绍到这了,更多相关CSS实现动画特效内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 通过CSS数学函数实现动画特效

本文链接: https://www.lsjlt.com/news/133358.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 通过CSS数学函数实现动画特效
    目录前言CSS 数学函数绝对值中位数数轴上两点距离三角函数例子一维交错动画初始状态应用动画交错动画二维交错动画初始状态应用动画交错动画另一种动画余弦波动动画初始状态余弦排列波动动画交...
    99+
    2024-04-02
  • 怎么用css实现3d动画特效
    小编给大家分享一下怎么用css实现3d动画特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   属性   perspect...
    99+
    2024-04-02
  • WPF实现动画效果(四)之缓动函数
    WPF动画效果系列 WPF实现动画效果(一)之基本概念 WPF实现动画效果(二)之From/To/By 动画 WPF实现动画效果(三)之时间线(TimeLine) WPF实现动画效果...
    99+
    2024-04-02
  • 如何通过css动画实现一个表格滚动轮播效果
    这篇文章主要介绍了如何通过css动画实现一个表格滚动轮播效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。css动画的一个应用,与此前的css走马灯同样的内容。只是一次不同的...
    99+
    2023-06-08
  • C++ 函数对 GUI 动画和特效的实现有什么影响?
    c++++ 函数在 gui 动画和特效的实现中发挥关键作用,主要体现在:精确的帧率管理,优化动画性能和创建戏剧性效果。多线程编程,实现交互式 gui 动画和特效的实时处理。与绘图 api...
    99+
    2024-04-25
    c++ gui
  • 通过CSS实现逼真水滴动效
    哈喽哈喽!CSS真的好好玩啊,哈哈,反正我是爱了,空闲写着玩。画画不好的我乐了,下面就是一个用CSS3动画完成的模仿水珠的动效,其中主要就是会使用CSS设置阴影效果以及@keyfra...
    99+
    2024-04-02
  • 通过JetpackCompose实现双击点赞动画效果
    目录实现步骤先红色画个爱心点击事件加动画完整代码效果图实现步骤 先红色画个爱心 Icon( Icons.Filled.Favorite, "爱心", Modi...
    99+
    2024-04-02
  • Flutter实现心动的动画特效
    目录实现动画混入 SingleTickerProviderStateMixin创建动画抽离成小组件完整代码为了追求更好的用户体验,有时候我们需要一个类似心跳一样跳动着的控件来吸引用户...
    99+
    2024-04-02
  • WPF实现流光动画特效
    一、代码 <Window.Resources> <!--外--> <Storyboard x:Key="Storyboar...
    99+
    2024-04-02
  • CSS动画教程:手把手教你实现震动特效
    引言:在现代Web开发中,动画效果的应用越来越广泛。CSS动画是一种简单而强大的实现动画效果的方法。本文将带您一起学习如何使用CSS动画实现震动特效,并提供具体的代码示例。一、了解CSS动画基础知识在使用CSS动画之前,我们需要了解一些基础...
    99+
    2023-10-21
    CSS动画 手把手教程 震动特效
  • 使用CSS怎么实现一个图片动画特效
    本篇文章给大家分享的是有关使用CSS怎么实现一个图片动画特效,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。HTML代码<!-- 主容器 -->&...
    99+
    2023-06-08
  • 如何通过纯CSS实现漂浮动画效果的方法和技巧
    如何通过纯CSS实现漂浮动画效果的方法和技巧在现代网页设计中,动画效果已成为吸引用户眼球的重要元素之一。而其中一种常见的动画效果就是漂浮效果,它可以给网页增加一种动感和活力,使得用户体验更加丰富和有趣。本文将介绍如何通过纯CSS实现漂浮动画...
    99+
    2023-10-25
    动画效果 CSS实现 漂浮
  • 如何通过CSS实现鼠标悬停时的特效效果
    CSS是一种用于美化和定制网页的样式表语言,它可以使我们的网页更加生动和吸引人。其中,通过CSS实现鼠标悬停时的特效效果是一种常见的方式,可以为网页添加一些互动和动态性。本文将介绍一些常见的悬停特效,并提供相应的代码示例。高亮背景色当鼠标悬...
    99+
    2023-10-21
    CSS特效 实现 鼠标悬停
  • CSS怎么实现动画移动效果
    这篇文章主要为大家展示了“CSS怎么实现动画移动效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS怎么实现动画移动效果”这篇文章吧。思路首先我们新建一个正方形,用<svg>&l...
    99+
    2023-06-27
  • CSS动画教程:手把手教你实现翻页特效
    CSS动画教程:手把手教你实现翻页特效,需要具体代码示例CSS动画是现代网站设计中必不可少的一部分。它可以为网页增添生动感,吸引用户的注意力,并且提高用户体验。其中一种常见的CSS动画效果就是翻页特效。在这篇教程中,我将带领大家一步一步实现...
    99+
    2023-10-24
    CSS动画 翻页特效 手把手教程
  • CSS动画教程:手把手教你实现旋转特效
    引言:CSS动画是现代网页设计的重要组成部分之一,通过CSS动画可以为网页增加交互性和视觉吸引力。本文将教你如何使用CSS实现一个简单而漂亮的旋转特效,通过简单的代码示例,让你轻松掌握该技巧。创建HTML结构:首先,我们需要创建一个HTML...
    99+
    2023-10-21
    CSS动画 手把手教 旋转特效
  • CSS动画教程:手把手教你实现跃动背景特效
    在网页设计中,动画效果可以增添页面的生动感,吸引用户的注意力。而CSS动画则是实现这些效果的一种方法。本教程将手把手教你如何利用CSS实现一个跃动背景特效,通过具体的代码示例来让你更容易理解和应用。步骤一:创建HTML结构首先,我们需要创建...
    99+
    2023-10-21
    CSS动画 背景 跃动
  • CSS动画教程:手把手教你实现脉冲特效
    引言:CSS动画是网页设计中常用的一种效果,它可以为网页增添活力和视觉吸引力。本篇文章将带您深入了解如何利用CSS实现脉冲特效,并提供具体的代码示例教您一步步完成。一、了解脉冲特效脉冲特效是一种循环变化的动画效果,通常用在按钮、图标或其他元...
    99+
    2023-10-21
    CSS动画 教程 脉冲
  • CSS动画教程:手把手教你实现可拖动的特效
    在现代Web开发中,动画效果已经成为了提高用户体验和吸引用户注意力的重要手段之一。CSS动画是一种轻量级、简单易用的实现动画效果的方法,常用来实现页面元素的过渡、动态效果和交互特效。本文将为大家介绍一种利用CSS动画实现可拖动特效的方法,并...
    99+
    2023-10-21
    CSS动画 手把手教程 可拖动特效
  • CSS如何实现loading动画效果
    这篇文章主要介绍CSS如何实现loading动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:预览代码使用了CSS的keyframes自定义关键帧动画<!DOCT...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作