有趣的CSS数学函数
前言
之前一直在玩three。js,接触了很多数学函数,用它们创造过很多特效。于是我思考:能否在CSS中也用上这些数学函数,但发现CSS目前还没有,据说以后的新规范会纳入,估计也要等很久。
然而,我们可以通过一些小技巧,来创作出一些属于自己的CSS数学函数,从而实现一些有趣的动画效果。
让我们开始吧!CSS数学函数
注意:以下的函数用原生CSS也都能实现,这里用SCSS函数只是为了方便封装,封装起来的话更方便调用绝对值
绝对值就是正的还是正的,负的变为正的
可以创造2个数,其中一个数是另一个数的相反数,比较它们的最大值,即可获得这个数的绝对值functionabs(v){returnmax({v},calc(1{v}));}中位数
原数减1并乘以一半即可functionmiddle(v){returncalc(0。5({v}1));}数轴上两点距离
数轴上两点距离就是两点所表示数字之差的绝对值,有了上面的绝对值公式就可以直接写出来functiondist1d(v1,v2){vdelta:calc({v1}{v2});return{abs(vdelta)};}三角函数
其实这个也不会实现不过之前看到过一篇文章〔1〕写到了如何在CSS中实现三角函数,在此表示感谢functionfact(number){value:1;ifnumber0{forifrom1throughnumber{value:valuei;}}returnvalue;}functionpow(number,exp){value:1;ifexp0{forifrom1throughexp{value:valuenumber;}}elseifexp0{forifrom1throughexp{value:valuenumber;}}returnvalue;}functionrad(angle){unit:unit(angle);unitless:angle(angle01);ifunitdeg{unitless:unitless180pi();}returnunitless;}functionpi(){return3。14159265359;}functionsin(angle){sin:0;angle:rad(angle);Iterateabunchoftimes。forifrom0through20{sin:sinpow(1,i)pow(angle,(2i1))fact(2i1);}returnsin;}functioncos(angle){cos:0;angle:rad(angle);Iterateabunchoftimes。forifrom0through20{cos:cospow(1,i)pow(angle,2i)fact(2i);}returncos;}functiontan(angle){returnsin(angle)cos(angle);}例子
以下的几个动画特效演示了上面数学函数的作用一维交错动画初始状态
创建一排元素,用内部阴影填充,准备好我们的数学函数。。。(此处省略14个listitem)body{display:flex;justifycontent:center;alignitems:center;minheight:100vh;margin:0;background:222;}:root{bluecolor1:6ee1f5;}(这里复制粘贴上文所有的数学公式)。list{n:16;display:flex;flexwrap:wrap;justifycontent:spaceevenly;item{p:2vw;gap:1vw;bg:var(bluecolor1);forifrom1through16{:nthchild({i}){i:{i};}}padding:var(p);margin:var(gap);boxshadow:inset000var(p)var(bg);}}
应用动画
这里用了2个动画:grow负责将元素缩放出来;melt负责融化元素(即消除阴影的扩散半径)。。。(此处省略14个listitem)。list{。growmelt{。listitem{t:2s;animationname:grow,melt;animationduration:var(t);animationiterationcount:infinite;}}}keyframesgrow{0{transform:scale(0);}50,100{transform:scale(1);}}keyframesmelt{0,50{boxshadow:inset000var(p)var(bg);}100{boxshadow:inset0000var(bg);}}
交错动画计算出元素下标的中位数计算每个元素id到这个中位数的距离根据距离算出比例根据比例算出delay。。。(此处省略14个listitem)。list{。middlestagger{。listitem{m:{middle(var(n))};中位数,这里是7。5imdist:{dist1d(var(i),var(m))};计算每个id到中位数之间的距离ratio:calc(var(imdist)var(m));根据距离算出比例delay:calc(var(ratio)var(t));根据比例算出delayndelay:calc((var(ratio)2)var(t));负delay表示动画提前开始animationdelay:var(ndelay);}}}
地址:SymmetricLineAnimation〔2〕二维交错动画初始状态
如何将一维的升成二维?应用网格系统即可。。。(此处省略62个griditem)。grid{row:8;col:8;row:{row};col:{col};gap:0。25vw;display:grid;gap:var(gap);gridtemplaterows:repeat(var(row),1fr);gridtemplatecolumns:repeat(var(col),1fr);item{p:2vw;bg:var(bluecolor1);foryfrom1throughrow{forxfrom1throughcol{k:col(y1)x;:nthchild({k}){x:{x};y:{y};}}}padding:var(p);boxshadow:inset000var(p)var(bg);}}
应用动画
跟上面的动画一模一样。。。(此处省略62个griditem)。grid{。growmelt{。griditem{t:2s;animationname:grow,melt;animationduration:var(t);animationiterationcount:infinite;}}}
交错动画计算出网格行列的中位数计算网格xy坐标到中位数的距离并求和根据距离算出比例根据比例算出delay。。。(此处省略62个griditem)。grid{。middlestagger{。griditem{m:{middle(var(col))};中位数,这里是7。5xmdist:{dist1d(var(x),var(m))};计算x坐标到中位数之间的距离ymdist:{dist1d(var(y),var(m))};计算y坐标到中位数之间的距离distsum:calc(var(xmdist)var(ymdist));距离之和ratio:calc(var(distsum)var(m));根据距离和计算比例delay:calc(var(ratio)var(t)0。5);根据比例算出delayndelay:calc((var(ratio)2)var(t)0。5);负delay表示动画提前开始animationdelay:var(ndelay);}}}
地址:SymmetricGridAnimation〔3〕另一种动画
可以换一种动画shuffle(穿梭),会产生另一种奇特的效果。。。(此处省略254个griditem)。grid{row:16;col:16;row:{row};col:{col};gap:0。25vw;item{p:1vw;transformorigin:bottom;transform:scaleY(0。1);}。shuffle{。griditem{t:2s;animation:shufflevar(t)infiniteeaseinoutalternate;}}}keyframesshuffle{0{transform:scaleY(0。1);}50{transform:scaleY(1);transformorigin:bottom;}50。01{transformorigin:top;}100{transformorigin:top;transform:scaleY(0。1);}}
地址:ShuffleGridAnimation〔4〕余弦波动动画初始状态
创建7个不同颜色的(这里直接选了彩虹色)列表,每个列表有40个子元素,每个子元素是一个小圆点
让这7个列表排列在一条线上,且z轴上距离错开,设置好基本的delay。。。(此处省略39个listitem)。。。(此处省略6个list)。lists{listcount:7;colors:red,orange,yellow,green,cyan,blue,purple;position:relative;width:34vw;height:2vw;transformstyle:preserve3d;perspective:800px;。list{position:absolute;top:0;left:0;display:flex;transform:translateZ(var(z));forifrom1throughlistcount{:nthchild({i}){bg:{nth(colors,i)};z:{i1vw};basicdelayratio:{ilistcount};}}item{w:0。6vw;gap:0。15vw;width:var(w);height:var(w);margin:var(gap);background:var(bg);borderradius:50;}}}
余弦排列
运用上文的三角函数公式,让这些小圆点以余弦的一部分形状进行排列。lists{。list{item{itemcount:40;offset:pi()0。5;wavelength:21vw;forifrom1throughitemcount{:nthchild({i}){i:{i};ratio:(i1)(itemcount1);angleunit:pi()ratio;wave:cos(angleunitoffset);singlewavelength:calc({wave}var(wavelength));nsinglewavelength:calc(var(singlewavelength)1);}}transform:translateY(var(nsinglewavelength));}}}
波动动画
对每个小圆点应用上下平移动画,平移的距离就是余弦的波动距离。lists{。list{item{t:2s;animation:wavevar(t)infiniteeaseinoutalternate;}}}keyframeswave{from{transform:translateY(var(nsinglewavelength));}to{transform:translateY(var(singlewavelength));}}
交错动画
跟上面一个套路,计算从中间开始的delay,再应用到动画上即可。lists{。list{item{n:{itemcount1};m:{middle(var(n))};imdist:{dist1d(var(i),var(m))};ratio:calc(var(imdist)var(m));square:calc(var(ratio)var(ratio));delay:calc(calc(var(square)var(basicdelayratio)1)var(t));ndelay:calc(var(delay)1);animationdelay:var(ndelay);}}}
CSS数学函数能实现的特效远不止于此,希望通过本文能激起大家创作特效的灵感参考资料
〔1〕在CSS中使用三角函数绘制曲线图形及展示动画:https:github。comchokcocoiCSSissues72
〔2〕SymmetricLineAnimation:https:codepen。ioalphardexpenvYmqvpe
〔3〕SymmetricGridAnimation:https:codepen。ioalphardexpenzYwgdZO
〔4〕ShuffleGridAnimation:https:codepen。ioalphardexpenYzVmYaV
〔5〕RainbowSine:https:codepen。ioalphardexpenGREKJbL
美的集团副总裁伏拥军美的新能源车部件战略将从高举高打转向全线每经记者:陈鹏丽每经编辑:董兴生1月6日,随着美的工业技术旗下威灵汽车部件安庆新能源汽车零部件战略新基地(以下简称威灵安庆基地)宣布一期正式投产,美的新能源业务再进一城。……
坚定信仰,走好新时代的长征路今年是红军长征胜利85周年。85年前,我们党领导红军,以非凡的智慧和大无畏的英雄气概,战胜千难万险,付出巨大牺牲,胜利完成震撼世界、彪炳史册的长征。以史为鉴,可以知兴替。回望这……
杨紫角色适配度2004年至今,细数杨紫出演过的作品,作为童星她,一直在突破自己,演技也一直在进步,她以一部部优秀的作品打破别人给她固定好的人设。无论是什么类型的角色,杨紫都可以演绎并诠释得很……
暗示自己已经恋爱的句子暗暗表达自己有对象的文案1。那就留在我身边,我买雪糕时给你带包烟。2。响应国家号召,降低单身人口比例,为我国现代化主义建设献出微薄之力。3。我喜欢看山,看海,看鲜花,看黄昏,看日出日落,看……
众神之所万神殿万神殿亦称万神庙,是供奉众神的地方,亦是古罗马遗存下来较完整的古建筑之一。万神殿的神奇之在于:它是近乎于2000年前建造的大跨度混凝土穹顶建筑。穹顶主厅高度相当于现在的1……
胃肠湿热型便秘有哪些症状?便秘在临床很常见,中医通过辨证将便秘分为不同的类型,其中主要包括胃肠湿热便秘、气滞便秘、气虚便秘、阳虚便秘、肠燥便秘等。胃肠湿热型便秘是由于肠道气机不利,传输功能受到阻滞……
烟台自驾游小众线路攻略推荐烟台最美丽的城市,各岛有各岛的特色风景,在蓝天碧海间呈现出一片秀丽的江南景色!这周我们自驾游的目的地是烟台!一、烟台栈桥栈桥全长624米,宽10米,由引桥、游艇码头……
江瀚新材成功登陆沪主板积极完善有机硅烷产业链布局2023年1月31日,湖北江瀚新材料股份有限公司(以下简称江瀚新材)正式登陆上交所主板,公司股票简称:江瀚新材,股票代码:603281。本次公开发行股票数量为66,666,66……
Linux9自动化部署Zookeeper集群ApacheZooKeeper是一个开源服务,可以实现高度可靠的分布式协调。它常被应用于分布式系统中,管理配置信息、命名服务、分布式同步、法定人数和状态。此外,一些分布式系统依……
记者凯恩确实有明显吸引力,但理想情况下曼联更想得到奥斯梅恩直播吧1月23日讯随着凯恩和热刺的合同将进入最后一年,英格兰人的未来引发了诸多猜测,而曼联被认为是可能的下家之一,尤其在红魔急需在今夏补强锋线的情况下。天空体育记者梅丽莎雷迪(……
点外卖,怎么最大保证餐品安全?目前,随着线上经济的发展,很多人已经适应了点外卖来解决自己的饮食问题。点外卖具有方便灵活等优势。但是,有时我们也会在订购外卖中,有不好的体验感,如遇到不卫生的外卖等。下面,我们……
一波未平一波又起,CDC追踪一种具有潜在危险的冠状病毒变体就在大家开始认为疫情可能即将结束时,美国疾病预防控制中心警告他们正在跟踪另一种新的潜在危险的冠状病毒变种,称为OrthrusCH。1。1。这个变体和它的名字首先由澳大利亚的变异……