CSS3提供了丰富的动画类属性,使我们可以不通过flash甚至JavaScript,就能实现很多动态的效果。它们主要分为三大类:transform(变换),transition(过渡),animation(动画)。其中transform又分为2D变换和3D变换,它赋予了我们不通过专业设计软件制作平面或者立体图形的能力。

一  过渡

  通过给元素设置transition属性设置它的过渡效果。过渡实际定义的是元素从一种状态变成另一种状态的过程,比如宽度从100px变成300px,背景颜色从red变成orange等等。

 div{
width:200px;
height:200px;
background-color:red;
transition-property:width,background-color;
/*该属性指定需要变换的元素属性,不同属性用逗号隔开*/
transition-duration:1s;
/*该属性指定整个过程花费的时间,如需单独为每个变化的属性设置时间,请使用逗号隔开*/
transition-timing-function:ease;
/*该属性设置变化的速度曲线,默认值即是ease,表示慢-快-慢,还有几个其他的取值:linear,匀速;ease-in,慢-快,ease-out,快-慢,ease-in-out,慢-快-慢,肉眼效果和ease相似*/
transition-delay:1s;
/*延迟时间*/
}

  元素的属性设置好以后,需要某些操作触发了指定属性的变化才能看到效果,比如:hover,或者JS事件。

  另外,transition实际是一个复合属性,多个属性过渡可以简写:

 div{
width:200px;
height:200px;
transition:width 2s 1s,background-color 2s;
/*transition-property和transition-duration是必须的,另外两个是可选的*/
}
div:hover{
width:400px
}

  当有多个属性需要设置过渡,并且持续事件,速度曲线,延迟时间均相同时,你可以如下简写:

 div{
/*some code*/
transition:all 2s;
/*所有发生变化的属性都设置过渡效果*/
}

二  动画

  动画其实和过渡一样,都是用来给元素设置动态效果的,不同的是,过渡需要人为的触发才能被执行,而动画不需要人为触发。

  在给元素设置动画之前,我们首先应该创建一个动画效果,即开始是什么状态,结束是什么状态。

 @keyframes sport{/*通过@keyframs 定义一个动画,sport是动画的名称,可以自定义*/
from{
width:200px;
}
to{
width:400px;
}
/*除了使用from...to的方式,你还可以使用百分比创建更加丰富的动画过程,0%表示开始时,100%表示结束时*/
}

  创建好动画之后,你就可以为元素设置诸如动画持续时长,速度曲线,重复次数等属性了。

 div{
animation-name:sport;
/*规定元素需要执行的动画名称,即使用@keyframs创建的那个*/
animation-duration:5s;
/*规定动画完成一个周期所花费的秒或毫秒*/
animation-timing-function:ease;
/*规定动画的速度曲线,可选值同过渡*/
animation-delay:3s;
/*规定动画延迟时间*/
animation-iteration-count:;
/*规定动画被播放的次数,infinite表示一直循环播放*/
animation-direction:alternate;
/*规定动画是否在下一周期逆向地播放,normal是默认取值,表示不逆向播放,逆向播放一次也会在animation-iteration-count属性值中减1*/
animation-play-state:paused;
/*规定动画是否正在运行或暂停,默认值是running,表示正在运行*/
animation-fill-mode:forwards;
/*规定动画结束后元素的状态,forwards,保持动画停止时的状态,backwards,回到开始时的状态,none,保持默认。一般没有指定该属性时,动画结束后会回到开始时的状态。不同浏览器可能有不同表现*/
}

  animation 也是一个复合属性,可以如下简写:

 div{
animation:sport 5s ease 2s infinite alternate forwords;
}
/* animation-play-state 一般通过伪类或JS来动态的控制动画的暂停或继续 */

三  2D变换

  通过给元素设置 transform 属性,可以对元素进行2D变换。很多地方把 transform 翻译成转换,该单词在英语中的含义是使改变,使变形。我更倾向于把它翻译成变换,通过CSS变换,我们可以对元素进行移动、缩放、转动、拉伸等操作。

  1,translate(x,y) 

 div{
transform:translate(50px,100px);
}
/*div在水平方向基于原位置移动50px,垂直方向移动100px*/

  translate方法接收两个参数,分别表示在水平和垂直正方向上的偏移量,可以接收负值,表示向反方向偏移。

  2,rotate(deg)

 div{
transform:rotate(30deg);
}
/*顺时针方向旋转元素30度*/

  rotate方法接收一个参数,表示元素旋转的角度,可以接收负值,表示逆时针方向旋转。rotate方法实际是通过修改元素的坐标系来达到旋转元素的目的,比如:

 div{
transform:rotate(45deg) translate(50px,0);
/*多属性复合形式写法*/
}
/*元素先旋转45度,然后向浏览器x轴正方向偏下45度的方向移动50px*/

  默认情况下,元素都是以自己的中心点为圆心旋转,我们可以通过transform-origin属性修改该参考点。

 div{
width:200px;
height:200px;
transform:rotate(30deg);
transform-origin:0px 0px;/*以左上角为圆点旋转*/
/*取值200px 0px即以右上角为圆点旋转。改属性取值也可以是百分比或关键字。top,botton,left,right,center*/
}

  

  3,scale(x,y)

 div{
transform:scale(2,3);
}
/*元素宽度放大2倍,高度放大3倍*/

  scale方法接收两个参数,分别表示元素宽高需要缩放的比例,如果参数介于0到1之间则表示缩小,如果小于0,实际效果相当于翻转元素,感兴趣的朋友可以自行测试,观察效果。

  

  4,skew(x,y)

 div{
transform:skew(30deg,30deg);
}
/*元素在水平和垂直方向均倾斜30度*/

  skew方法接收两个参数,分别表示X轴和Y轴倾斜的角度,如果第二个参数为空,则默认为0,参数为负表示向相反方向倾斜。

四  3D变换

  要想使元素以3D效果呈现,你需要给元素的父元素添加transform-style属性

 .father{
transform-style:preserve-3d;
}
.son{
/*some code*/
}

  transform-style属性的默认值是flat,即平面的意思。通过设置其值为preserve-3d即可让子元素以3D模式呈现。

  事实上,我们是通过配合使用rotate方法,最终实现3D立体效果的。

  我们知道,在2D空间,坐标轴只有x和y两根轴,而在3D空间,一共有x,y,z三根轴。我们上面讲解的rotate方法实际上都是围绕z轴在旋转,这也是该方法的默认方式。另外,其实我们还可以通过rotateX(),rotateY(),改变元素默认的旋转轴向。改变旋转轴向配合perspective属性使用效果更佳。

 .father{
perspective:500px;
/*perspective属性取值是一般是一个像素值,设置后可以实现旋转后元素近大远小的效果*/
}
.son{
width:200px;
height:200px;
transform:rotateX(45deg);
}
/*注意,perspective属性需要设置在旋转元素的祖先元素上,通常我们把它设置在其父元素上。*/

  下面是两个3D立方体的示例代码:

  HTML部分:

 <div class="D3">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
</div>

  CSS部分:

 body{
background-color: #ccc;
perspective: 800px;
}
.D3{
width:550px;
height: 200px;
margin:100px auto;
}
@keyframes sport{
from{
transform: rotateX(0deg) rotateY(0deg);
}
to{
transform: rotateX(360deg) rotateY(360deg);
}
}
.D3 ul{
width: 200px;
height: 200px;
position: relative;
transform-style: preserve-3d;
transform: rotateX(0deg) rotateY(0deg);
animation: sport 10s linear infinite alternate;
display: inline-block;
margin-left:50px;
}
.D3 ul li{
list-style: none;
width:200px;
height: 200px;
position: absolute;
opacity: 0.3;
font-size: 100px;
line-height: 200px;
text-align: center;
}
.D3 ul li:nth-child(1){
background-color: red;
transform:translateZ(100px);
}
.D3 ul li:nth-child(2){
background-color: blue;
transform: rotateX(90deg) translateZ(100px);
}
.D3 ul li:nth-child(3){
background-color: yellow;
transform: rotateX(180deg) translateZ(100px);
}
.D3 ul li:nth-child(4){
background-color: pink;
transform: rotateX(270deg) translateZ(100px);
}
.D3 ul li:nth-child(5){
background-color: purple;
transform: rotateY(90deg) translateZ(-100px);
}
.D3 ul li:nth-child(6){
background-color: green;
transform: rotateY(90deg) translateZ(100px);
}
/*还记得吗?rotate方法是通过改变坐标系来达到旋转的目的哦!*/

五  transform对其他元素的影响

  1,提高显示优先级

  我们知道,在标准文档流中,如果使用负的margin值可以使一个元素覆盖在另一个元素上,正常情况下是写在后面的元素覆盖前面的。但是设置了transform属性的元素会覆盖其他元素。

 .top{
width: 100px;
height: 100px;
background-color: red;
transform: rotate(0deg);
}
.bottom{
width: 100px;
height: 100px;
background-color: blue;
margin-top:-50px;
}
/*红色的会覆盖蓝色的div 50px*/

  

  2,改变fixed定位的相对对象

  通常情况下,使用了position:fixed;属性的元素都会相对浏览器窗口定位,不受滚动条的影响。但是当我们给其父元素设置了transform属性后,这一状况被改变了。

 .father{
width: 500px;
height: 500px;
margin-left: 100px;
margin-top: 100px;
border: 1px solid #000;
transform: rotate(0deg);
}
.son{
position: fixed;
top: 50px;
left:50px;
width: 100px;
height: 100px;
background-color: red;
}
/*.son不再以浏览器窗口作为参考点,而是以其父元素.father作为按参考点了*/

  

  3,改变absolute定位元素的宽度

  以前,如果一个元素设置了绝对定位,并且宽度设置为100%,那么该元素的实际宽度是第一个有定位属性的祖先元素的宽度,没有则是body的宽度。现在,如果第一个有定位属性的祖先元素和绝对定位元素之间,有一个设置了transform属性的元素,那么绝对定位元素的宽度继承链将在该transform祖先元素处被截断,最终绝对定位的元素宽度将继承自transform元素。

 .grand{
width: 500px;
height: 500px;
border: 1px solid #000;
position: absolute;
}
.father{
width: 100px;
height: 100px;
background-color: red;
transform:rotate(0deg);
}
.son{
width: 100%;
height: 200px;
position: absolute;
background-color: yellow;
}
/*.son的宽度不是500px,而变成了100px*/

  

  写在最后,transform是CSS3才引入的属性,不同浏览器对它的实现也可能有差异,上面介绍的内容并不能保证在所有浏览器上均有相同的表现,具体情况请大家自行测试(我仅在Chrome 76测试)。

CSS动画,2D和3D模块的更多相关文章

  1. css3动画2D、3D转换

    css3动画的2D.3D转换代码: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  2. CSS动画实例:3D立方体

    CSS3支持3D转换,与3D转换有关的属性有: transform:向元素应用 2D或3D 转换. transform-origin:改变被转换元素的位置. transform-style:规定被嵌套 ...

  3. css动画实现吃豆豆

    话不多说,直接上代码:(作为一个初学者写的代码,多么0基础都能看的懂吧.) HTML部分 <!DOCTYPE html> <html lang=en> <head> ...

  4. transform做2d和3d变形(css动画一)

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 有段时间我是没理清transform.translate.transition和animation之间的关 ...

  5. css3的过渡、动画、2D、3D效果

    浏览器的内核: 谷歌的内核是:webkit 火狐的内核是:gecko Ie的内核是:trident 欧鹏的内核是:presto 国内浏览器的内核:webkit css3针对同一样式在不同的浏览器的兼容 ...

  6. Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。

    Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...

  7. CSS 3 学习——transform 3D转换渲染

    以下内容根据官方规范翻译,没有翻译关于SVG变换的内容和关于矩阵计算的内容. 一般情况下,元素在一个无景深无立体感的平面(flat plane)上渲染,这个平面就是其包含块所处的平面.同时,页面上的其 ...

  8. 【Web动画】CSS3 3D 行星运转 && 浏览器渲染原理

    承接上一篇:[CSS3进阶]酷炫的3D旋转透视 . 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家. CSS3 3D 行星运转 demo 页面请戳:Demo.(建议使用Chrome打开 ...

  9. 简单的转盘抽奖——CSS动画优化

    前言 前两天去一家公司面试,被问到一些小游戏的东西.面试官提到了刷红包还有抽奖这些怎么实现,当时简单说了下思路,回来之后想想还是说的太轻描淡写了,干说不做就是耍流氓,所以就做了一个(Demo & ...

随机推荐

  1. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  2. Constructing Roads HDU 1102

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  3. JavaScript中的Cookie 和 Json的使用

    JavaScript中的Cookie 和 Json的使用 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.采用的是完全独立于编程语言的文本格式来存 ...

  4. MariaDB数据库自学一

    在CentOS下安装Mariadb 数据库,命令: yum -y mariadb mariadb.server 等待几分钟后就可以自动完成安装了,然后启动对应的服务: systemctl  start ...

  5. MATLAB之基本语法

    常用命令 dir:列出当前目录下的所有文件 clc:清除命令窗 clear all:清除环境(从内存中清除所有变量) who:将内存中的当前变量以简单形式列出 close all: 关闭所有的 Fig ...

  6. #umn 来美国近一个月的简单见闻

    时光如梭,到美国已经快要一个月了,从最初12+4飞行的劳累,到一开始每天吃了上顿没下顿的担心,到后来开始上课的不适,现如今生活已经基本步入了正轨,每天上上课写写作业,去rec center打打球健健身 ...

  7. 基于 HTML5 的 PID-进料系统可视化界面

    前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...

  8. netcore 基于 DispatchProxy 实现一个简单Rpc远程调用

    前言 netcore 发布以来,一直很关注netcore的进程.目前在公司负责的网站也历经波折的全部有.net framework 4.0 全部切换到netcore 2.2 版本中.虽然过程遇到的坑不 ...

  9. Python集训营45天—Day03

    目录 1. 分支结构 1.1 初步介绍 1.2 使用案例 1.3 练习 2.循环结构 1.1 初步介绍 1.2 使用案例 1. 分支结构 1.1 初步介绍 至今,我们所写的Python代码都是顺序执行 ...

  10. 将dos格式文件转换为unix格式

    在windows下换行符是\r\n,表示回到行首并换到下一行 而unix系统中换行符是\n 这样就存在一个问题,在windows上的文档到了unix上可能就无法使用了 针对这个情况有几种解决办法: 1 ...