trans* 指
- transition
- transform
- translate*()
对于 CSS3 的介绍 ,通常都会提到 CSS3 中出现的动画和过渡两个元素。
关于动画 animation 这个属性,在之前的这篇文章中有 (极其) 基础的介绍,以及 MDN 的文档也能帮助很多。
本文先介绍一下过渡[transition]、 变形[transform]、以及变性属性中的部分 trans 开头的属性值[translate*( )]。
这里的 translate*() 包括 translate(x,y) translate3d(x,y,z) translateY(x) translateX(x) translateZ(z) 。
当然啦 transform 的属性值远不止这几个 translate*(),可以参考以下教程。
W3school - CSS3 transform 属性
还有就是本文的编写原因
- 复习累了
- 没从真正的总结过 transition
- splatoon - game modes (需要科学上网) 之前在访问这个网站的时候就有这个想法了。
transition
该属性也是一个复合(简写)属性。包括 transition-property,transition-duration,transition-timing-function 和 transition-delay 四个属性。
简单来说,这个属性的作用,看起来和 animation 有一定的相似度(从效果和定义上来看,都是会动的(?),以及一小部分属性值也很类似,具体的功能就是允许CSS的属性值在一定的时间区间内平滑地过渡。
transition-property
值为需要进行过渡的属性名或 none 或 all。
all 就是针对所有可被动画的属性都表现出过渡动画。
none 就是指没有过渡动画。
可能不太好理解什么是要过渡的属性,举个例子:
1 | .demoDiv { |
在上面这个例子中偷懒使用了 scss 语法。
可以看到 transition-property 的属性值为 "margin-top" ,而 margin-top 就是需要过渡的属性名
上面这个例子中过渡的效果就是当 .demoDiv 被鼠标覆盖时 margin-top 会在 2s 内由 100px 变成 200px 。
所以当有别的属性需要进行过渡时,把 "margin-top" 替换掉就可以了。
transition-duration
这个好理解 ,就是为过渡的实现进行定时。
单位可以是 s 也可以是 ms。
默认值是 0s。就是默认不发生过渡动画。
注意:当属性值是默认值时,实现的效果是没有过渡动画而不是就不发生转变了,就是说转变会立刻完成,而不会有明显的过渡效果。
在上一个例子中 transition-duration 的值就是 2s , 所以过渡效果会在 2s 内完成。
transition-timing-function
这个属性的值,与 animation-timing-function 很像。属性值也有很高的重复率。
而且这个属性相对其他三个 transition- 属性来说更为的抽象。
CSS属性受到 transition effect的影响,会产生不断变化的中间值,而 CSS transition-timing-function 属性用来描述这个中间值是怎样计算的。实质上,通过这个函数会建立一条加速度曲线,因此在整个transition变化过程中,变化速度可以不断改变。
大概来说就是这个值会影响过渡动画进行时的变化速度。也就是说 transition-duration 定义了过渡的时间,而 transition-timing-function 则定义在这个时间内过渡效果要怎么完成。
属性值有:
- ease (default)
- ease-in
- ease-out
- ease-in-out
- linear
- step-start
- step-end
- steps(n, end)
- cubic-bezier()
举两个例子:
1 | <style type="text/css"> |
实现的效果图如下。(帧数有点低
可以看到 transition 不仅对过渡动画的**进行**有作用,对过渡动画的**撤销**也有效果。从上面的红块的变动可以看出变长时的动画先缓慢后加速,鼠标移开之后变回原样也是先慢后变快。
demo 的效果不是特别好,可以参考 MDN 的 transition-timing-function 示例。传送门
ease-in / ease-out / ease-in-out 这三个很好理解,分别是 过渡刚开始时较缓慢、过渡快结束时较缓慢以及最后一个过渡刚开始、快结束都会较缓慢。
하지만!
可能会误认为 ease 是整个过渡动画均速进行。其实这个是 linear (线性) 才会有的效果。
而 ease 和 ease-in-out 才是相似的。
区别在哪里呢,这就要用到 cubic-bezier() 这个定时函数了。ease 等于 cubic-bezier(0.25,0.1,0.25,1),而 ease-in-out 等于 cubic-bezier(0.42,0,0.58,1)。
step-start / step-end 这两个 一个是在过渡计时开始时(step-start)直接完成转变,一个是在过渡计时结束时(step-end)直接完成转变。
steps(n, end) 相对来说最为复杂(抛开 cubic-bezier 不谈)。 n 是整数,第二个参数可以是 end / start / jump-start / jump-end / jump-none / jump-both 。举个例子:steps(4, end) 过渡效果不是线性的,而是点状的跳 4 下完成过渡。当然啦不是保持同一个状态跳 4 下然后突然完成过渡。
cubic-bezier(num1,num2,num3,mun4)的介绍传送门
transition-delay
规定了在过渡效果开始作用之前需要等待的时间。
也是以 s / ms 作为单位。
默认值也是 0s 。默认不进行延迟。
tips
一个 transition 属性可以为多个 CSS 属性指定过渡效果 ,多个属性的过渡效果之间使用 "," 隔开。
举个 MDN 的例子
1 | .box { |
例子进行了一些删减 ( 删除了不相关的 CSS 属性
有两个之前没有提到的地方。
- 就是 chrome/safari 浏览器的适配前缀(-webkit-)
- transform 属性也可以使用 transition 进行过渡。前面的例子都是使用的 hover 伪类来达成过渡条件。
transform
transform 属性允许旋转,缩放,倾斜或平移给定元素。这是通过修改CSS视觉格式化模型的坐标空间(?)来实现的。
属性值:
- none
- 一个或多个 transform-function
none 就是不应用任何的变形。
transform-funtion 指包括后面提到的一系列 translate() / translate3d() 等函数在内的转换函数。
下面举一些常见的可作为属性值的函数。
rotate( )
只有一个参数,用于表示角的大小。
从 y 轴正向开始顺时针偏移 (就是说当值大于 0 时,向着第一象限的方向偏移,值大于 90 度则会进入第四象限
- 度(degrees) 单位 deg 。一个完整的圆是 360 deg。
- 百分度(gradians) 单位 grad 。一个完整的圆是 400 grad。
- 弧度(radians) 单位 rad。 一个完整的圆的弧度是 2π ,约等于 6.28 rad。
- 圈数(turns) 单位 turn。 一个完整的圆是 1 trun。
举个例子:
90deg = 100grad = 0.25turn ≈ 1.5708rad
↑ 上面这张图用到了 "transform: rotate(-3deg)" 这条样式语句。
scale( )
用于修改元素的大小。
参数 sx / sy 当且仅当 sx 等于 sy 时,可以只写一个。
同时这个函数可以看做是 scaleX(sx) scaleY(sy) 函数的整合。
有一个例子,先看代码
1 | <style> |
打开开发者工具检查一下就可以看出 scale() 这个函数进行了什么样的处理。
将内容为 demo 3 的这个 div 包括 margin 在内的状态进行了二维平面内的发展。
注意: 可以看到这个红色和绿色的 div 并没有显示全,按理来说应该是正方形的,是因为扩大是基于 x y 轴中心的,而代码中的 margin-top: 5vh; 使得三个方块进行了 5vh 的下移。能够看得更清楚。
scale() 是仅适用于在二维平面上的变换的。
要进行 3D 变换可以使用 scale3d(sx,sy,sz) 参数中多了一个 z 轴的参数,
原理与 scale() 类似。
skew( )
前面的 rotate() 和 scale() 分别用于旋转和依据x/y[/z]轴修改大小。
而这个函数实现的功能则是歪斜变换。
与 scale() 类似, skew() 也可看成是 skewX(ax) 与skewY(ay) 的合成函数。
有两个参数 ax / ay 表示在每个方向的倾斜量。
注意:与 scale() 的两个参数不同的是,当 skew() 函数只有一个参数是,默认 ay等于0 而不是默认 ay等于ax
该变换是剪切(指的是会损失像素点)映射(横向),其在水平和垂直方向上将像素点扭曲一定角度。每个点的坐标根据新点与指定角度成比例的值和到原点的距离决定;因此,距离原点越远,添加的值就越大。
ax 和 ay 的值与 rotate() 参数一致,用于表示角度,单位为 deg / grad / rad /turn
translate*()
这一系列的函数通常作为 transform 的参数使用
有如下成员
- translate()
- translateX()
- translateY()
- translate3d()
- translateZ()
和 rotate() 很像,有 x/y/z 以及 3d 版本。
对于图形的旋转、倾斜、大小变化都已经介绍了,translate() 实现的功能则是平移。
translate( )
translate(tx, ty)
有两个参数,当只给一个参数时,如同 skew() 一般,默认 ty 为 0 ,而不是等同于 tx 。
tx / ty 就是常规的长度数据,单位可以是 em / px / vh 等等。
举个例子:
1 | <div style='width: 60px; height: 60px; background-color: #f34141;'>demo 1</div> |
translate3d( )
translate3d(tx,ty,tz) 具有三个参数,相比 translate() 多了 tz 参数。
举一个例子:
1 | <div style="width: 60px; height: 60px; background-color: skyblue;">demo 1</div> |
tips
translate3d() 可以说是 translateX(tx) / translateY(ty) / translateZ(tz) 的复合函数
translate() 可以说是 translateX(tx) / translateY(ty) 的复合函数
两个函数的区别如同 rotate() / scale() 一样,不带 3d 字眼时,作用于二维平面。
那这里就不在多介绍 X/Y/Z三个子函数(应该不能称为子函数,但是应该也能理解到是什么hhh)了。
好嘞,那收工啦!
2019-07-02 更新
今天看了一些文献(没错 在准备面试),对于上面提到的 transform 和 transition 有两个补充。
transform-origin
上面总结了 transform 是在不影响正常文档流的情况下允许修改元素的外观或位置。
但是没有提到变形惨遭的原点(因为默认是中心点了
默认的原点确实在元素的中心位置
但是可以通过 transform-origin 属性改变原点位置。
transform-origin 的属性值有可以有一、二、三个。分别代表 x 轴 ,y 轴 ,z 轴的偏移量。
参数可以是长度值(单位为 px、em 这些)、百分比(这里的百分比参照的是这块区域的宽高)、以及关键字(left/bottom/top/right/center) , 当有第三个元素的时候只能使用长度值,用于表示 z 轴偏移量。
注意:这里的偏移是相对起始点的。而默认的起始点在内边距的左上角。
transition 触发条件
上面并没有提到 transition 的触发条件。
主要有三个
- CSS 伪类触发。
比如上面举的例子的触发条件都是 :hover - 媒体查询触发
@meida 当窗口尺寸变动时触发。 - JavaScript触发
上面有提到 transform 也是可以使用过渡的(但是当时我测试的时候,并没有看到过渡的效果。
现在终于知道了。。。举个例子:1
2
3
4
5
6
7<div id='transistion'></div>
<style>
window.onload = function() {
let div = document.getElementById('transistion')
div.style.transform = 'rotate(30deg)'
}
</style>