css transform、transition、animate的区别

阅读数:78 评论数:0

跳转到新版页面

分类

html/css/js

正文

css中写动画时,经常会用到这几个属性。

一、transform 变形效果

transform属性是静态属性,需要配合transition和animation才能展现出动画效果。

正常变换矩阵是$\left[ \begin{array}{3} a &b &tx\\ c &d &ty \\ u &v &w \end{array} \right] $

但在二维空间中操作,u v w都为1.0,所以transform中的matrix函数使用6个参数:

matrix(a,b,c,d,tx,ty)。

属性 描述 CSS
transform 向元素应用 2D 或 3D 转换。 3
transform-origin 允许你改变被转换元素的位置。 3
transform-style 规定被嵌套元素如何在 3D 空间中显示。 3
perspective 规定 3D 元素的透视效果。 3
perspective-origin 规定 3D 元素的底部位置。 3
backface-visibility 定义元素在不面对屏幕时是否可见。 3

1、转换操作

(1)平移 translate(tx,ty)

$\left[ \begin{array}{3} 1 &0 &tx\\ 0 &1 &ty \\ 0 &0 &1 \end{array} \right] $

transform:translateX(100px)    /*向右边移动100px*/
transform:translateX(-100px)    /*向左边移动100px*/

transform:translateY(100px)     /*向下边移动100px*/
transform:translateY(-100px)       /*向上边移动100px*/
 
transform:translate(100px,-100px)     /*向右上角移动100px*/
transform:translate(-100px,100px)       /*向左下角移动100px*/

(2)缩放 scale(sx,sy)

scale缩放所占的原始尺寸不变,只在当前元素进行重绘。

$\left[ \begin{array}{3} sx &0 &0\\ 0 &sy &0 \\ 0 &0 &1 \end{array} \right] $

tranform:scale(0.5)     /*整体缩小到原来的一半*/
tranform:scale(2)       /*整体放大到原来的一半*/

tranform:scaleX(0.5)     /*宽缩小到原来的一半*/
tranform:scaleX(2)       /*宽放大到原来的一半*/


tranform:scaleY(0.5)     /*高缩小到原来的一半*/
tranform:scaleY(2)     /*高放大到原来的一半*/

 /*好像看不出变化*/
tranform:scaleZ(0.5)     
tranform:scaleZ(2)    

(3)旋转 rotate(q)

$\left[ \begin{array}{3} cos(q) &sin(q) &0\\ -sin(q) &cos(q) &0 \\ 0 &0 &1 \end{array} \right] $

transform:rotate(50deg);    /*设置为平面旋转(二维旋转)50度*/

transform:rotateX(360deg)   /*以X轴为旋转中心旋转360度(三维旋转)*/

transform:rotateY(180deg)   /*以Y轴为旋转中心旋转180度(三维旋转)*/

transform:rotateZ(90deg)    /*以Z轴为旋转中心旋转90度(三维旋转)效果和rotate一样*/

transform:rotateX(45deg)rotateY(45deg)rotateZ(45deg)    /*向X、Y、Z方向各偏45度*/

transform:scale(0.5) rotateY(45deg) rotateZ(45deg);    /*缩小0.5倍,并且旋转Y和Z轴45度*/

(4)倾斜或裁剪 skew(skx,sky) (2.5D效果)

$\left[ \begin{array}{3} 0 &sky &0\\ skx &0 &0 \\ 0 &0 &1 \end{array} \right] $

skew(ax, ay)
1. ax 表示在x轴上的倾斜角度,单位为 deg。
2. ay 表示在y轴上的倾斜角度,单位为 deg。

transform:skew(30deg,45deg)  /*向x轴偏移3度,向y轴偏移45度*/
transform:skewX(45deg);     /*向X轴倾斜45度角,向左边倾斜45度*/
transform:skewY(90deg);      /*向Y轴倾斜90度角,相对于是靠右倾斜,直到于y轴成为一条线*/

2、指定转换的起点transform-origin

transform-origin: x-axis y-axis z-axis;
描述
x-axis

定义视图被置于 X 轴的何处。可能的值:

● left

● center

● right

● length

● %

y-axis

定义视图被置于 Y 轴的何处。可能的值:

● top

● center

● bottom

● length

● %

z-axis 定义视图被置于 Z 轴的何处。可能的值:length

接受两个参数,前一个参数表示水平产坐标,后一个参数表示垂直坐标,初始值为 50% 50%。

值可以是百分比、长度值,也可以几个关键字。

第一个参数关键字可以是left center right,后一个参数的关键字可以是top middle bottom。

3、transform-style

transform-style: flat | preserve-3d 

其中flat值为默认值,表示所有子元素均在2D平面呈现,即使子元素沿着X轴或Y轴做了旋转有了3D效果也不呈现出来,preserve-3d表示所有子元素的3D效果能呈现出来。

4、perspective

定义 3D 元素距视图的距离,以像素计。该属性允许您改变 3D 元素查看 3D 元素的视图。

5、perspective-origin

定义 3D 元素所基于的 X 轴和 Y 轴。该属性允许您改变 3D 元素的底部位置。

定义时的perspective -Origin属性,它是一个元素的子元素,透视图,而不是元素本身。

perspective-origin: x-axis y-axis;

6、backface-visibility

定义当元素不面向屏幕时是否可见。如果在旋转元素不希望看到其背面时,该属性很有用。

backface-visibility: visible|hidden;

二、transition

是一个简单的动画属性,非常简单非常容易用。可以说它是animation的简化版本。

transition: transition-property transition-duration transition-timing-function transition-delay;

1、transition-property

transition-property: none | all | property;

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 100px;
            border: 3px solid black;
            margin: 10px 0px 0px 10px;
            transition-property: width, background;
        }
        div:hover {
            width: 200px;
            background-color: blue;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

指定要进行过渡的属性的名称,指定多个时,中间使用逗号隔开。

2、transition-duration

过渡时长,单位可以s、ms,为负值时,被认为是0。

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 100px;
            border: 3px solid black;
            margin: 10px 0px 0px 10px;
            transition-property: width, background;
            transition-duration: .25s, 1s;
        }
        div:hover {
            width: 200px;
            background-color: blue;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

3、transition-timing-function

过渡时间曲线。

(1)cubic-bezier(x1,y1,x2,y2)

(2)linear 同等于cubic-bezier(0,0,1,1)

(3)ease 同等于cubic-bezier(0.25,0.1,0.25,1)

(4)ease-in 同等于cubic-bezier(0.42,0.1,1,1)

(5)ease-out 同等于cubic-bezier(0,0,0.58,1)

(6)ease-in-out同等于cubic-bezier(0.42,0,0.58,1)

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 100px;
            border: 3px solid black;
            margin: 10px 0px 0px 10px;
            transition-property: width, background;
            transition-duration: .25s, 1s;
            transition-timing-function: ease;
        }
        div:hover {
            width: 200px;
            background-color: blue;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

4、transition-delay

延迟多长执行。

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 100px;
            border: 3px solid black;
            margin: 10px 0px 0px 10px;
            transition-property: width, background;
            transition-duration: .25s, 1s;
            transition-delay: 3s;
        }
        div:hover {
            width: 200px;
            background-color: blue;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

三、transform对其它元素渲染的影响

transform和z-index没有正负值的定位元素是一层叠顺序,比普通元素要高。

1、对包含块的影响

position为absolute或fixed的元素,其包含块也可能是最近的transform不为none的祖先元素,而其百分比值定位是根据包含块计算的,所以其尺寸和位置可能受transform祖先的影响。

(1)transform会让fixed子元素变成类似absolute的效果。

fixed原本可以让元素不随浏览器滚动条进行滚动,但如果这个fixed元素的祖先元素中有一个设置了transform属性,该元素就会随滚动条滚动。

2、对overflow的影响

This property specifies whether content of a block container element is clipped when it overflows the element’s box. It affects the clipping of all of the element’s content except any descendant elements (and their respective content and descendants) whose containing block is the viewport or an ancestor of the element.

简单的说,就是当overflow修饰block下的子元素其包含块如果是viewport或是block的祖先,且overflow不生效。

(1)transform会改变overflow对absolute元素的限制

<!-- html -->
<div class="overfolw">
	<div class="absolute"></div>
</div>

/* css */
.overfolw {
	width: 200px;
	height: 200px;
	border: 10px solid lightblue;
	overflow: hidden;
}
.absolute {
	width: 300px;
	height: 200px;
	background-color: pink;
	position: absolute;
}

此时overflow对这个absolute子元素不生效的。

<!-- html -->
<div class="overfolw transform">
	<div class="absolute"></div>
</div>

/* css */
.overfolw {
	width: 200px;
	height: 200px;
	border: 10px solid lightblue;
	overflow: hidden;
}
.transform {
	transform: scale(1);
}
.absolute {
	width: 300px;
	height: 200px;
	background-color: pink;
	position: absolute;
}

这样添加了transform属性,overflow对absolute子元素有效。

 




相关推荐

一、概述 overflow属性用于当一个元素太大而无法适应父级窗口的大小时行为。具体又可以分为: overflow-x 属性规定是否对内容的左/右边缘进行裁剪 - 如果溢出元素内容区域的话。 over

一、基本介绍 animate.css是一个十分强大的css3动画库,里面预设了很多常见的动画,省云了我们手动编写css过滤代码的工作。 <a href="http

一、ReactCSSTransitionGroup React 官方提供了两个插件用于处理动画效果:一个是偏底层的 react-addons-transition-group,

一、概述 background是css简写属性,可有一个或多个值,且可以按任意顺序放置: background: <bg-color> <bg-image> <position/bg-size>

前提是定义了background-image属性,然后用background-attachment

局部作用域 css的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。产生局部作用域的唯一方法,就是使用一个独一无二的class的名字,不会与其他选择器重名,但是当我们

less作为css的一种形式的扩展,它并没有阉割CSS的功能,而是在现有的CSS语法 上,添加了很多额外的功能。 变量 在less中利用@符号进行变量的定义</p

css预处理器是一种语言用来为css增加一些编程的特性,无需考虑浏览器的兼容性问题,最为普遍的三款

module.exports = { "plugins": { "postcss-import": {},

Less是一个CSS的超集,Less允许我们定义变量,使用嵌套式声明,定义函数等。严格说Less包含两部分:(1)Less的语法 (2)Less预处理器。浏览器终究只认识CSS,所以Less文件