css中过渡与动画的使用
1.css实现过渡效果
CSS3中新增的transform属性,可以实现元素在变换过程中的过渡效果,实现了基本的动画。
transition的语法:transition: transition-property || transition-duration ||transition-timing-funciton || transition-delay ;
其参数的取值说明如下:
<transition-property>:定义用于过渡的属性;
<transition-duration>:定义过渡过程需要的时间(必选,否则不会产生过渡效果)
<transition-timing-function>:定义过渡的方式;
<transition-delay>:定义开始过渡的延迟时间;
使用transition属性定义一组过渡效果,需要以上四个参数。transition属性可以同时定义
两组或两组以上的过渡效果,组与组之间用逗号分隔。
基于webkit内核的私有属性是:-webkit-transition;
基于gecko内核的私有属性是:-moz-transition;
基于prestot内核的私有属性是:-o-transition;
例子:
HTML部分
<div :style="{zIndex:zIndex,height:height,width:width}" class="pan-item">
<div class="pan-info">
<div class="pan-info-roles-container">
<slot />
</div>
</div>
<!-- eslint-disable-next-line -->
<div :style="{backgroundImage: `url(${image})`}" class="pan-thumb"></div>
</div>
CSS部分
.pan-thumb {
width: 100%;
height: 100%;
background-position: center center;
background-size: cover;
border-radius: 50%;
overflow: hidden;
position: absolute;
transform-origin: 95% 40%; //设置旋转元素的基点位置
transition: all 0.3s ease-in-out;
}
.pan-item:hover .pan-thumb {
transform: rotate(-110deg);
}
详细讲解一下各个属性的设置
(1)指定过渡的属性 ( transition-property属性 )
transition-property的语法:transition-property:none | all | <property> ;
其取值说明如下:
none:表示没有任何CSS属性有过渡效果;
all:为默认值,表示所有的CSS属性都有过渡效果;
property:指定一个用逗号分隔的多个属性,针对指定的这些属性有过渡效果。
例子:
.pan-thumb {
width: 100%;
height: 100%;
background-position: center center;
background-size: cover;
border-radius: 50%;
overflow: hidden;
position: absolute;
transform-origin: 95% 40%; //设置旋转元素的基点位置
transition: transform 0.3s ease-in-out;
}
注意 : 这里不是rotate,而是transform
(2)指定过渡的时间(transition-duration)
transition-duration属性:用于定义过渡过程所需要的时间。
transition-duration语法:transition-duration: time;
其取值说明:
time指定一个用逗号分隔的多个时间值,单位是秒(s)或毫秒(ms)。默认值是0,即是看不到过渡效果。
(3)指定过渡延迟时间(transition-delay):
transition-delay:用于定义过渡的延迟时间;
transition-delay语法:transition-delay:time;
其取值说明如下:time的取值可以为秒(s)或毫秒(ms)。默认值为0,即是没有时间延迟,立即开始过渡效果。
(4)指定过渡方式(transition-timing-function)
transition-timing-function属性用于定义过渡的速度曲线,即是过渡方式。
transition-timing-function语法:transition-timing-function: ease | linear | ease-in | ease-out | ease-in-out | cubiz-bezier(n,n,n,n);
其取值的说明如下:
linear: 表示匀速过渡;
ease: 默认值,表示过渡的速度先慢,再快,最后非常慢;
ease-in: 表示过渡的速度先慢,后越来越快,直至结束;
ease-out: 表示过渡的速度先快,后越来越慢,直至结束;
ease-in-out: 表示过渡的速度在开始和结束时都很慢;
cubic-bezier(n,n,n,n): 自定义贝塞尔曲线的效果,其中的四个参数为从0到1的数字。
2.CSS3 animation实现逐帧动画效果
动画属性
动画属性包括:①animation-name,②animation-duration,③animation-timing-function,④animation-delay,⑤animation-iteration-count,⑥animation-direction,⑦animation-fill-mode,⑧animation-play-state
用例子说明:
(1)animation-name:指定要绑定到选择器的关键帧的名称。
(2)animation-duration:定义动画完成一个周期需要多少秒或毫秒
(3)animation-timing-function:指定动画将如何完成一个周期。
值 | 说明 |
linear | 动画从头到尾的速度是相同的。 |
ease | 默认。动画以低速开始,然后加快,在结束前变慢。 |
ease-in | 动画以低速开始。 |
ease-out | 动画以低速开始和结束。 |
ease-in-out | 动画以低速结束。 |
cubic-bezier(n,n,n,n) | 在 cubic-bezier 函数中自己的值。可能的值是从 0 到 1 的数值。 |
step-start | 在变化过程中,都是以下一帧的显示效果来填充间隔动画 |
step-end | 在变化过程中,都是以上一帧的显示效果来填充间隔动画 |
steps() | 可以传入两个参数,第一个是一个大于0的整数,他是将间隔动画等分成指定数目的小间隔动画,然后根据第二个参数来决定显示效果。第二个参数设置后其实和step-start,step-end同义,在分成的小间隔动画中判断显示效果。 |
(4)animation-delay:属性定义动画什么时候开始。
4.1 单位可以是秒(s)或毫秒(ms)。
4.2 单位可以是负值,-2s表示动画立马开始,但跳过 2 秒进入动画,即前2秒的动画不执行,直接跳过前2秒进入动画。
栗子:
HTML部分
<div class="spinner">
<div class="line1"></div>
<div class="line2">
</div><div class="line3">
</div><div class="line4">
</div><div class="line5">
</div></div>
css部分
.spinner{
width:60px;
height:50px;
margin:100px auto;
text-align:center;
}
.spinner>div{
display:inline-block;
width:6px;
margin-left:3px;
margin-right:3px;
height:100%;
background:green;
animation:strechdelay 1.2s infinite ease-in-out;
-webkit-animation:strechdelay 1.2s infinite ease-in-out;
}
.spinner .line2{
animation-delay:-1.1s;
-webkit-animation-delay:-1.1s;
}
.spinner .line3{
animation-delay:-1.0s;
-webkit-animation-delay:-1.0s;
}
.spinner .line4{
-webkit-animation-delay:-0.9s;
}
.spinner .line5{
animation-delay:-0.8s;
-webkit-animation-delay:-0.8s;
}
@keyframes strechdelay {
0%,40%,100%{
transform:scaleY(.4);
-webkit-transform:scaleY(.4);
}
20%{
transform:scaleY(1);
-webkit-transform:scaleY(1);
}
}
@-webkit-keyframes strechdelay {
0%,40%,100%{
-webkit-transform:scaleY(.4);
}
20%{
-webkit-transform:scaleY(1);
}
}
效果图
(5)animation-iteration-count :定义动画应该播放多少次。
值 | 说明 |
n | 一个数字,定义应该播放多少次动画 |
infinite | 指定动画应该播放无限次(永远) |
(6)animation-direction:定义是否循环交替反向播放动画。
值 | 说明 |
normal | 默认值。动画按正常播放。 |
reverse | 动画反向播放。 |
alternate | 动画在奇数次(1、3、5…)正向播放,在偶数次(2、4、6…)反向播放。 |
alternate-reverse | 动画在奇数次(1、3、5…)反向播放,在偶数次(2、4、6…)正向播放。 |
initial | 设置该属性为它的默认值。 |
inherit | 从父元素继承该属性。 |
(7)animation-fill-mode:规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。
值 | 说明 |
none | 默认值。动画在动画执行之前和之后不会应用任何样式到目标元素。 |
forwards | 在动画结束后(由 animation-iteration-count 决定),动画将应用该属性值。 |
backwards | 动画将应用在 animation-delay 定义期间启动动画的第一次迭代的关键帧中定义的属性值。这些都是 from 关键帧中的值(当 animation-direction 为 “normal” 或 “alternate” 时)或 to 关键帧中的值(当 animation-direction 为 “reverse” 或 “alternate-reverse” 时)。 |
both | 动画遵循 forwards 和 backwards 的规则。也就是说,动画会在两个方向上扩展动画属性。 |
initial | 设置该属性为它的默认值。 |
inherit | 从父元素继承该属性。 |
7.1 默认情况下,CSS 动画在第一个关键帧播放完之前不会影响元素,在最后一个关键帧完成后停止影响元素。animation-fill-mode 属性可重写该行为。
7.2 forwads表示让动画停留在结束状态,即停留在最后一帧。
7.3 backwords:
7.3.1 当 animation-direction 为 “normal” 或 “alternate” 时,回到第一帧。
7.3.2 当 animation-direction 为 “reverse” 或 “alternate-reverse” 时,停留在最后一帧。
(8)animation-play-state:指定动画是否正在运行或已暂停。
在JavaScript中使用此属性在一个周期中暂停动画。
值 | 说明 |
paused | 指定暂停动画。 |
running | 指定正在运行的动画。 |
栗子
HTML部分
<div id="div1"></div>
<div>鼠标悬浮在线条上看看</div>
CSS部分
#div1 {
width:10px;
height:80px;
background-color:#ff9137;
margin:100px auto;
animation: spin 1s linear infinite;
animation-play-state: paused;
}
#div1:hover {
animation-play-state: running;
}
@keyframes spin {
0%{
transform:rotate(0deg);
-webkit-transform:rotate(0deg);
}
50%{
transform:rotate(180deg);
-webkit-transform:rotate(180deg);
}
100%{
transform:rotate(360deg);
-webkit-transform:rotate(360deg);
}
}
@-webkit-keyframes spin {
0%{
transform:rotate(0deg);
-webkit-transform:rotate(0deg);
}
50%{
transform:rotate(180deg);
-webkit-transform:rotate(180deg);
}
100%{
transform:rotate(360deg);
-webkit-transform:rotate(360deg);
}
}
效果图就不放了,大家可以把代码复制下来,自己看效果.
动画相关
(1)、animation的简写(即上述属性的介绍顺序)
animation: name duration timing-function delay iteration-count direction fill-mode play-state;
具体化可以记成一下形式:
animation:myAnim 1s linear 1s infinite alternate both running;
(2)、keyframes:定义动画规则,关键帧。
值 | 说明 |
animationname | 必需的。定义animation的名称。 |
keyframes-selector | 必需的。动画持续时间的百分比 |
css-styles | 必需的。一个或多个合法的CSS样式属性 |
指定的变化时发生时使用%,或关键字"from"和"to",这是和0%到100%相同。以下两段代码效果相同。
@keyframes myAnim{
from { background: #f00; }
50% { background: #0f0; }
to { background: yellowgreen; }
}
@keyframes myAnim{
0% { background: #f00; }
50% { background: #0f0; }
100% { background: yellowgreen; }
}
如果省略某个状态,浏览器会自动推算中间状态。但是,为了获得最佳的浏览器支持,应该始终定义0%和100%的选择器。
@keyframes rainbow {
50% { background: orange }
to { background: yellowgreen }
}
@keyframes rainbow {
to { background: yellowgreen }
}
可以将多个状态写在一行
@keyframes myAnim{
0%,100% { background: #f00; }
50% { background: #0f0;
}
浏览器前缀
div{
animation:myAnim 1s;
-webkit-animation:myAnim 1s;
}
@keyframes myAnim{
0% { background: #f00; }
50% { background: #0f0; }
100% { background: yellowgreen; }
}
@-webkit-keyframes myAnim{
0% { background: #f00; }
50% { background: #0f0; }
100% { background: yellowgreen; }
}
注意:定义动画时,必须定义动画的名称和动画的持续时间。如果省略持续时间,动画将无法运行,因为默认值是0。
下面直接写个应用animation属性的小例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>04心跳</title>
<style>
img{
width: 400px;
height: auto;
/* animation:动画名称 花费时间 运动曲线 何时开始 播放次数 是否反方向 */
animation: heart 0.5s infinite;
}
div{
width: 100px;
height: 100px;
background-color: pink;
margin: 100px auto;
animation: heart 0.5s infinite;//一个叫heart的动画 每隔0.5s执行动画 无限次
}
@keyframes heart{
0%{
transform: scale(1);
}
50%{
transform: scale(1.1);
}
100%{
transform: scale(1);
}
}
</style>
</head>
<body>
<img src="../images/1.jpg" height="744" width="800" alt="loading" />
<div></div>
</body>
</html>
效果