有趣的 CSS 数学函数

html-css022

有趣的 CSS 数学函数,第1张

前言

之前一直在玩three.js ,接触了很多数学函数,用它们创造过很多特效。于是我思考:能否在 CSS 中也用上这些数学函数,但发现 CSS 目前还没有,据说以后的新规范会纳入,估计也要等很久。

然而,我们可以通过一些小技巧,来创作出一些属于自己的CSS 数学函数,从而实现一些有趣的动画效果。

让我们开始吧!

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

绝对值就是正的还是正的,负的变为正的

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

原数减 1 并乘以一半即可

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

其实这个也不会实现~不过之前看到过 一篇文章[1] 写到了如何在 CSS 中实现三角函数,在此表示感谢

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

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

这里用了 2 个动画:

地址: Symmetric Line Animation[2]

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

跟上面的动画一模一样

地址: Symmetric Grid Animation[3]

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

地址: Shuffle Grid Animation[4]

创建7 个不同颜色的(这里直接选了彩虹色)列表,每个列表有 40 个子元素,每个子元素是一个小圆点

让这7 个列表排列在一条线上,且 z 轴上距离错开,设置好基本的 delay

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

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

跟上面一个套路,计算从中间开始的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

过渡(transition)

​多个属性间使用,隔开

​如果所有属性都需要过渡,则使用all关键字

​大部分属性都支持过渡效果,注意过渡时必须是从一个有效数值向另外一个有效数值进行过渡(auto不是有效数值,过渡动画效果不会生效)

时间单位:s 和 ms 1s = 1000ms

指定过渡的执行的方式

可选值:

transition-delay: 2s

可以同时设置过渡相关的所有属性,只有一个要求,如果要写延迟,则两个时间中第一个是持续时间,第二个是延迟

动画和过渡类似,都是可以实现一些动态的效果,不同的是过渡需要在某个属性发生变化时才会触发, 动画可以自动触发动态效果。

关键帧语法:

animation-name: 要对当前元素生效的关键帧的名字

animation-name: test

animation-duration: 4s

animation-delay: 2s

可选值:

可选值:

可选值:

可选值:

animation: test 2s 2 1s alternate 和transition 的简写类似 ,执行时间和延时时间顺序注意

变形就是指通过CSS来改变元素的形状或位置.

变形不会影响到页面的布局

transform 用来设置元素的变形效果

transform: translateY(-100px)

平移:平移元素,百分比是相对于自身计算的(px,100%)

z轴平移,调整元素在z轴的位置,正常情况就是调整元素和人眼之间的距离,距离越大,元素离人越近

z轴平移属于立体效果(近大远小),默认情况下网页是不支持透视,如果需要看见效果

, 必须要设置网页的视距

/* 设置当前网页的视距为800px,人眼距离网页的距离 */

perspective: 800px

通过旋转可以使元素沿着x y 或 z旋转指定的角度 开视距效果明显

rotateX()

rotateY()

rotateZ()

单位 角度 deg、 n turn(圈)

**是否显示元素的背面 **

backface-visibility: hidden