成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

通過CSS數學函數實現動畫特效

瀏覽:553日期:2022-06-03 11:08:24
目錄
  • 前言
  • 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>  <div></div>  ...(此處省略14個 list-item)  <div></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>  <div></div>  ...(此處省略14個 list-item)  <div></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>  <div></div>  ...(此處省略14個 list-item)  <div></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>  <div></div>  ...(此處省略62個 grid-item)  <div></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>  <div></div>  ...(此處省略62個 grid-item)  <div></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>  <div></div>  ...(此處省略62個 grid-item)  <div></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>  <div></div>  ...(此處省略254個 grid-item )  <div></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>  <div>    <div></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實現動畫特效內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

    標簽: CSS HTML
    相關文章:
    成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
    欧美aaaaa成人免费观看视频| 欧美精品一区二区三区一线天视频 | 337p亚洲精品色噜噜| 亚洲高清不卡在线观看| 一本色道久久综合亚洲精品高清| 欧美高清在线视频| 97国产一区二区| 精品国产电影一区二区| 成人av在线电影| 欧美精品一区二| 99久免费精品视频在线观看| 日韩精品最新网址| 成人av在线电影| www成人在线观看| 99re成人在线| 国产视频一区在线播放| a美女胸又www黄视频久久| 欧美精品乱码久久久久久按摩| 精品无码三级在线观看视频| 精品视频全国免费看| 另类小说欧美激情| 欧美日韩国产bt| 国产成人在线电影| 26uuu欧美| 欧美成人精品| 日韩毛片视频在线看| 亚洲精品护士| 一区二区三区国产| 亚洲欧美久久久| 日本最新不卡在线| 欧美三区在线视频| 国产美女一区二区三区| 日韩亚洲欧美在线观看| 91小视频在线| 国产精品国产成人国产三级 | 91视频精品在这里| 国产免费久久精品| 91在线视频18| 亚洲国产日韩综合一区| 中文文精品字幕一区二区| 亚洲视频观看| 亚洲综合色在线| 久久久www| 久久99国产精品久久99| 欧美一个色资源| 972aa.com艺术欧美| 国产精品美女久久久久久久网站| 1024亚洲| 午夜国产不卡在线观看视频| 欧美日韩高清一区二区| 国产精品一区二区在线播放| xf在线a精品一区二区视频网站| 欧美区亚洲区| 一区二区三区在线观看动漫 | 色欧美日韩亚洲| 黑人巨大精品欧美黑白配亚洲| 精品久久久久久久人人人人传媒| 亚洲视频高清| 日韩国产精品大片| 欧美一二区视频| 欧美午夜视频| 婷婷综合在线观看| 日韩一区二区麻豆国产| 欧美午夜a级限制福利片| 亚洲一区在线视频| 欧美日韩午夜在线| 欧美一区影院| 亚洲一区二区在线视频| 欧美日韩在线观看一区二区| 91麻豆精品视频| 亚洲午夜免费电影| 91久久精品国产91性色tv| 国产91精品精华液一区二区三区| 国产精品高潮久久久久无| 色域天天综合网| av男人天堂一区| 一区二区成人在线| 91精品国产色综合久久ai换脸| 欧美日韩一区二区国产| 日日欢夜夜爽一区| 久久亚洲一级片| 国产精品日本欧美一区二区三区| 国产在线视频精品一区| 国产精品成人午夜| 欧美日韩一区视频| 欧美日韩一区自拍| 久久99精品久久久久婷婷| 国产欧美日韩在线看| 色婷婷久久久综合中文字幕 | 久久午夜影视| 国产酒店精品激情| 中文在线免费一区三区高中清不卡| 午夜亚洲性色视频| 国产成人亚洲综合a∨婷婷| 国产情人综合久久777777| 久久精品二区| 91在线观看免费视频| 午夜日韩在线电影| 久久精品在这里| 欧洲精品一区二区三区在线观看| 99精品桃花视频在线观看| 日韩电影在线观看一区| 国产日韩综合av| 91九色最新地址| 欧美久久久久久| 久久9热精品视频| 亚洲三级在线看| 日韩欧美国产小视频| 亚洲欧美不卡| 欧美aⅴ99久久黑人专区| 男女男精品视频网| 国产精品久久久久7777按摩| 7777精品伊人久久久大香线蕉的 | 欧美福利精品| 七七婷婷婷婷精品国产| 欧美高清激情brazzers| 亚洲国产欧美日韩| 国产黄色精品视频| 婷婷综合久久一区二区三区| 3d动漫精品啪啪一区二区竹菊| 一区二区av| 91视频观看免费| 韩国女主播一区二区三区| 亚洲午夜久久久久久久久电影院| 欧美精品一区二区三区四区| 欧美少妇xxx| 国产精品乱码一区二区三区| eeuss鲁片一区二区三区在线看| 男人操女人的视频在线观看欧美| 亚洲天堂成人网| 精品国产污网站| 在线视频你懂得一区二区三区| 亚洲精品在线免费| 91麻豆福利精品推荐| 国产乱妇无码大片在线观看| 日本欧美在线看| 亚洲国产成人tv| 亚洲欧美偷拍另类a∨色屁股| 精品国精品自拍自在线| 欧美巨大另类极品videosbest| 久久精品女人的天堂av| 亚洲国产精品一区在线观看不卡| 91免费精品国自产拍在线不卡| 国产麻豆日韩欧美久久| 蜜桃视频在线一区| 香蕉影视欧美成人| 欧美日韩国产色站一区二区三区| 高清日韩电视剧大全免费| 亚洲成a人在线观看| 亚洲同性gay激情无套| 久久久亚洲精华液精华液精华液| 91麻豆精品国产自产在线 | 午夜影院久久久| 亚洲欧美日韩在线| 中文字幕一区二区三区视频| 国产亚洲成aⅴ人片在线观看| 日韩免费观看高清完整版| 欧美日韩国产片| 在线免费亚洲电影| 久久久99爱| 麻豆久久久9性大片| 99成人精品| 亚洲免费观看| 亚洲三级网站| 一色屋精品视频在线观看网站| 欧美sm重口味系列视频在线观看| 成人av免费观看| 成人污视频在线观看| 国产精品一区一区三区| 国产在线观看免费一区| 韩国av一区二区三区在线观看| 久久成人羞羞网站| 久久精品免费观看| 天堂va蜜桃一区二区三区漫画版| 五月婷婷激情综合| 日韩精品乱码av一区二区| 偷拍自拍另类欧美| 日韩二区在线观看| 麻豆成人在线观看| 久久精品国产精品亚洲综合| 看电影不卡的网站| 国产综合色精品一区二区三区| 国产真实乱子伦精品视频| 国产一二精品视频| 粉嫩一区二区三区性色av| 成人在线视频首页| 91首页免费视频| 黄色国产精品一区二区三区| 精品福利电影| 亚洲免费成人| 久久国产主播| 精品视频一区二区三区免费| 欧美精品日日鲁夜夜添| 欧美一区二区免费| 日韩精品一区二区三区在线观看| 久久丝袜美腿综合| 国产精品午夜免费| 一区二区三区在线视频免费| 天天综合天天做天天综合| 蜜桃视频一区二区三区在线观看|