范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

有趣的CSS数学函数

  前言
  之前一直在玩  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)}; } 三角函数
  其实这个也不会实现~不过之前看到过  一篇文章[1] 写到了如何在 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); } 例子
  以下的几个动画特效演示了上面数学函数的作用  一维交错动画初始状态
  创建一排元素,用内部阴影填充,准备好我们的数学函数        ...(此处省略14个 list-item)     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   负责"融化"元素(即消除阴影的扩散半径)       ...(此处省略14个 list-item)     .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);   } }
  交错动画计算出元素下标的中位数  计算每个元素  id   到这个中位数的距离 根据距离算出比例  根据比例算出  delay         ...(此处省略14个 list-item)     .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[2]  二维交错动画初始状态
  如何将一维的升成二维?应用网格系统即可        ...(此处省略62个 grid-item)     .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);   } }
  应用动画
  跟上面的动画一模一样        ...(此处省略62个 grid-item)     .grid {   &.grow-melt {     .grid-item {       --t: 2s;        animation-name: grow, melt;       animation-duration: var(--t);       animation-iteration-count: infinite;     }   } }
  交错动画计算出网格行列的中位数  计算网格  xy   坐标到中位数的距离并求和 根据距离算出比例  根据比例算出  delay         ...(此处省略62个 grid-item)     .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[3]  另一种动画
  可以换一种动画  shuffle  (穿梭),会产生另一种奇特的效果       ...(此处省略254个 grid-item )     .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[4]  余弦波动动画初始状态
  创建  7   个不同颜色的(这里直接选了彩虹色)列表,每个列表有 40   个子元素,每个子元素是一个小圆点
  让这  7   个列表排列在一条线上,且 z   轴上距离错开,设置好基本的 delay                ...(此处省略39个 list-item)      ...(此处省略6个 list)  .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);     }   } }
  CSS   数学函数能实现的特效远不止于此,希望通过本文能激起大家创作特效的灵感~ 参考资料
  [1]在 CSS 中使用三角函数绘制曲线图形及展示动画:   https://github.com/chokcoco/iCSS/issues/72
  [2]Symmetric Line Animation:   https://codepen.io/alphardex/pen/vYmqvpe
  [3]Symmetric Grid Animation:   https://codepen.io/alphardex/pen/zYwgdZO
  [4]Shuffle Grid Animation:   https://codepen.io/alphardex/pen/YzVmYaV
  [5]Rainbow Sine:   https://codepen.io/alphardex/pen/GREKJbL

28相电路1200W供电!这都是NV卡皇的标配了?RTX3090Ti作为有史以来最强大的显卡,代价也是惨重的,供电功耗都是大问题,非公版更是不择手段。之前我们见识过影驰的RTX3090TiHOFOCLabLimitedEditio红米Note12坚持6000mAh大电池,天玑900芯片,又是千元爆款今年的红米依旧是火力全开,RedmiK50系列很惊艳,不仅性能出众,还有5500mAh的大电池,可以说是很多人的梦中情机了,虽然说现在的手机都很注重续航体验,各家厂商也加大了电池容小米有品推穷人剃须刀众筹7天卖出1125万,雷军价格很实在小米有品推穷人剃须刀,众筹7天卖出1125万,价格很实在小米有品推穷人剃须刀,众筹7天卖出1125万,价格很实在剃了十年胡子,我都不懂为什么一把电动剃须刀的价格,能差十几倍?大学时E5旗舰屏幕加持,12GB256GB120W超级快充,顶配官方直降400元如果要说手机零件上面我们肯定想到的都是处理器芯片,摄像头等等,但要说到哪个零件最贵的话,那肯定会有人表示,一定是手机的屏幕。没错,现在各家都在想办法提升自家手机的屏幕显示效果,很多Github加速神器FastGithub大概很多人和我一样,写代码时经常遇到github打不开用户头像无法加载releases无法上传下载gitclonegitpullgitpush失败等问题。最近发现了一款Github京东出手,就看你的了京东前一段时间太憋屈了,想做不能做。京东前一段时间太委婉了,想说不好说。京东今天终于解封啦!对比上海社区工作的磨磨唧唧拖拖拉拉,京东强大的专业能力将是无与伦比的!货源不是问题,运输同为天玑9000处理器手机,为何OPPO的这款产品热度这么低在现在的手机市场上,联发科的处理器天玑9000这款市场新4nm处理器,确实有着非常的高端市场热度表现情况,并且在手机市场上的确是有着很不错的市场发展空间,像搭载其的红米50Pro,被联发科超越之后,高通被迫放出大招?闲聊站小米王炸又来了随着美国修改芯片规则后,众多美企苦不堪言,因为不能自由出货,导致白白失去了中国市场。尽管高通英特尔最后还是拿到了通行证,但依旧无法回到当初的辉煌。毕竟华为事件之后,众多厂商开始明白国产GPU传来喜讯,国产巨头公布最新研发进展,已完成流片封装本文原创,禁止搬运和抄袭,违者必究!GPU图形处理器的重要性不亚于CPU中央处理器,一款设备能取得怎样的显示效果,图形数据处理能力全靠GPU加持。游戏爱好者都喜欢追求顶级的GPU显央妈发声力挺后,深圳卫视又来助攻!为何酷派总获官媒青睐?做个小调研酷派这个品牌,有多少人听过并用过它家的电子产品?当很多人以为酷派退出国产手机市场的时候,这个曾经已经王者归来,获得了新的资本,组建了新团队,并立下目标3年内重返国内手机市球形闪电是怎么形成的?你知道闪电还有球形(胖成球的球)的吗?今天我们就趁此机会一起来认识一下球形闪电吧。01球状闪电存在吗?它好像是约有两个拳头大的暗白色火球。后来它靠近了,我看得很清楚。有两次它的外壳
可以刷微信抖音,这货真的只是功能机?AGM三防手机M7评测说起三防手机,很多人都会联想到砖头一样的大小,而且还特别重,功能嘛几乎没有,主要就是打接电话或者收个短信,不过最近AGM最近推出的一款M7却显得有些与众不同,除了具备超强的防护性能A3幅面激光打印机值得推荐的有哪些?在很多人的印象里,A3幅面的激光机主要用来打印CAD工程图纸,而实际上A3幅面激光打印机并不只是处理的幅面更大,更重要的是它使用寿命设计得更长,比如惠普的M437n,月打印负荷超过折叠屏最终会以哪种形态出现?全面屏手机百花齐放,但其屏幕形态已经最终定型,现在困扰的不过是如何做出终极全面屏,给顾客更好的视觉体验和使用感受。折叠屏因为价格原因仍是小众市场,这次就来讲一下世界上最先出现的三个亚马逊封号余震留下还是出走?数万跨境卖家绝处求生8月初,盛夏日,热浪滚。深圳市龙岗区坂田街道,跨境电商卖家的聚集地。曾经繁华忙碌淌金流银之处,如今正笼罩在灰暗情绪中。徐凌(化名)在坂田经营着一家规模超过四十人的跨境电商公司,主要小米MIX4一块不完美的完美屏,一条微创新的创新路小米MIX系列,一直以来被看作最具创新性的手机系列。依稀记得当年小米推出第一代MIX手机时,超高屏占比给整个行业带来的轰动。我本以为MIX系列会成为小米最为别致的名片,但MIX系列LGD都不敢这么定价,小米OLED电视咋这么便宜小米2021秋季新品发布会,终于推出了大家梦寐以求的新品OLED电视,当公布价格的时候,更是让大家惊掉了下巴!小米电视6OLED价格为55英寸4999元66英寸6999元,和5年前究竟iQOO8系列还将带给我们哪些惊喜呢,让我们拭目以待大家期待已久的iQOO8全新旗舰系列,将于8月17日1930正式推出,iQOO8系列分为iQOO8和iQOO8Pro两款,网上有消息称iQOO8Pro的8GB256GB版本定价为57月新能源车市比亚迪家族持续爆发,特斯拉销量有蹊跷根据乘联会公布的最新零售销量数据,今年7月国内新能源乘用车销量达22。2万辆。对比其它几大细分市场纷纷呈现下滑趋势的情况,新能源车市同比大增169。4实现了淡季逆势上涨,其表现可谓手机到底要不要携号转网真相你知道多少现在5G信号,中国移动,中国电信,中国联通等都在积极的部署自己的信号基站。也都在积极的发展自己的5G用户。为了抢占市场,每家都在各自发挥神通,想尽一切招数壮大自己的用户。现在的4G小米搞懂仿生机器人了?雷军可能只是做着玩雷军的梦想和选择是什么或许暂未可知,但他至少拥有了自己的仿生机器人。前几天的小米发布会,除了MIX4跟OLED电视,雷军还带来了铁蛋,小米首款仿生四足机器人。不出意外,大多媒体都极1500元以内手机推荐(1)1realme真我Q3,搭载高通骁龙750G处理器,内置5000Mah电池,支持30w快充,120赫兹打孔电竞屏,后置4800w800w200w流光三摄,支持侧边指纹识别。目前81