CSS动画,2D和3D模块
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模块的更多相关文章
- css3动画2D、3D转换
css3动画的2D.3D转换代码: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- CSS动画实例:3D立方体
CSS3支持3D转换,与3D转换有关的属性有: transform:向元素应用 2D或3D 转换. transform-origin:改变被转换元素的位置. transform-style:规定被嵌套 ...
- css动画实现吃豆豆
话不多说,直接上代码:(作为一个初学者写的代码,多么0基础都能看的懂吧.) HTML部分 <!DOCTYPE html> <html lang=en> <head> ...
- transform做2d和3d变形(css动画一)
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 有段时间我是没理清transform.translate.transition和animation之间的关 ...
- css3的过渡、动画、2D、3D效果
浏览器的内核: 谷歌的内核是:webkit 火狐的内核是:gecko Ie的内核是:trident 欧鹏的内核是:presto 国内浏览器的内核:webkit css3针对同一样式在不同的浏览器的兼容 ...
- Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。
Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...
- CSS 3 学习——transform 3D转换渲染
以下内容根据官方规范翻译,没有翻译关于SVG变换的内容和关于矩阵计算的内容. 一般情况下,元素在一个无景深无立体感的平面(flat plane)上渲染,这个平面就是其包含块所处的平面.同时,页面上的其 ...
- 【Web动画】CSS3 3D 行星运转 && 浏览器渲染原理
承接上一篇:[CSS3进阶]酷炫的3D旋转透视 . 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家. CSS3 3D 行星运转 demo 页面请戳:Demo.(建议使用Chrome打开 ...
- 简单的转盘抽奖——CSS动画优化
前言 前两天去一家公司面试,被问到一些小游戏的东西.面试官提到了刷红包还有抽奖这些怎么实现,当时简单说了下思路,回来之后想想还是说的太轻描淡写了,干说不做就是耍流氓,所以就做了一个(Demo & ...
随机推荐
- 牛客暑假多校第二场 F trade
题意: 白兔有n个仓库,每个仓库有啊ai个货物,在每个仓库白兔可以装上任意数量的货物,也可以卸下任意数量的货物,现在有k个圆形信号阻隔器,然后有m个顾客下个一个订单,每个顾客的收货量有一个上限, 在每 ...
- atcoder D - Game on Tree(树形dp+尼姆博弈)
题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_d 题解:简单的树上的尼姆博弈,这个应该看的出来然后就是简单的树形dp然后异或一下就行. #inc ...
- codeforces 465 C. No to Palindromes!(暴力+思维)
题目链接:http://codeforces.com/contest/465/problem/C 题意:给出一个不存在2个或以上回文子串的字符串,全是由小写字母组成而且字母下表小于p,问刚好比这个字符 ...
- 洛谷 题解 P3871 【[TJOI2010]中位数】
这题先定义一个大根堆(maxn)维护mid(n为奇数mid+1)的元素.再定义一个小根堆(minn)维护mid(n为奇数mid+1)到n的元素.然后对于插入元素的情况进行分类讨论. 当add x时 一 ...
- Pipenv的简单使用
安装 $ pip install pipenv 安装虚拟环境 pipenv install 新建一个准备当环境的文件夹pipenvtest,并cd进入该文件夹: - pipenv --three 会使 ...
- JSQL查询
JSQL 其特征与原生soL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性. sql:查询的是表和表中的字段 jpql:查询的是实体类和类中的属性 查询全部 >> ...
- Kafka入门宝典(详细截图版)
1.了解 Apache Kafka 1.1.简介 官网:http://kafka.apache.org/ Apache Kafka 是一个开源消息系统,由Scala 写成.是由Apache 软件基金会 ...
- [DP]换钱的最小货币数
题目一 给定数组arr,数组中有N个元素,其中所有的之都为整数且不重复.每个只代表一种面值的货币,每种面值的货币可以使用任意张,在给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 解法 依 ...
- 深入理解 ThreadLocal
前言 上篇文章 深入理解 Handler 消息机制 中提到了获取线程的 Looper 是通过 ThreadLocal 来实现的: public static @Nullable Looper myLo ...
- Python二元操作符
def quiz_message(grade): outcome = 'failed' if grade<50 else 'passid' print ('grade', grade, 'out ...