CSS3 動畫基本使用
css 使用 transition
(平滑過渡) 、animation
(動畫) 、transform
(轉換)實現動畫效果。
transition 過渡
CSS3 過渡是元素樣式改變的效果,需要規定希望將效果新增到的CSS屬性和效果的時長。
屬性 | 描述 |
---|---|
transition |
簡寫屬性,用於在一個屬性中設定四個過渡屬性。 |
transition-property |
規定應用過渡的 CSS 屬性的名稱。 |
transition-duration |
定義過渡效果花費的時間。預設是 0。 |
transition-timing-function |
規定過渡效果的時間曲線。預設是 "ease"。 |
transition-delay |
規定過渡效果何時開始。預設是 0。 |
-
transition
transition:transition-property transition-duration transition-timing-function transition-timing-delay
transion:transition-property transition-duration
-
transition-property
-
transition-timing-function
值 描述 linear 規定以相同速度開始和結束的過渡效果(等同於cubic-bezier(0,0,1,1))。 ease 慢速開始,然後變快,然後慢速結束(等同於cubic-bezier(0.25,0.1,0.25,1))。 ease-in 以慢速開始(等同於cubic-bezier(0.42,0,1,1))。 ease-out 以慢速結束(等同於cubic-bezier(0,0,0.58,1))。 ease-in-out 以慢速開始和結束(等同於cubic-bezier(0.42,0,0.58,1))。 cubic-bezier(n,n,n,n) 在 cubic-bezier 函式中定義自己的值。可能的值是 0 至 1 之間的數值。
例項:
應用於寬度屬性的過渡效果,時長為 2 秒。
div{ width:100px; height:100px; background:yellow; transition:width 2s; -moz-transition:width 2s; /* Firefox 4 */ -webkit-transition:width 2s; /* Safari 和 Chrome */ -o-transition:windth 2s; /* Opera */ -ms-transition:width 2s; /* IE 9 */ } div:hover{ width:300px; }
CSS 屬性改變的典型時間是滑鼠指標位於元素上時,當指標移出元素時,逐漸變回原來的樣式。
animation 動畫
使用 @keyframe 規則建立動畫。在@keyframe中規定某項CSS樣式,結合animation屬性實現動畫效果。
屬性 | 描述 |
---|---|
@keyframes |
規定動畫。 |
animation |
所有動畫屬性的簡寫屬性。除了animation-paly-state 。 |
animation-name |
@keyframe 動畫名稱 |
animation-duration |
完成一個週期所花費的秒或毫秒 |
animation-timing-function |
動畫的速度曲線,預設ease |
animation-delay |
動畫何時開始 |
animation-iteration-count |
動畫被播放的次數,預設1 |
animation-direction |
動畫是否在下一週期逆向地播放。預設normal |
animation-play-state |
動畫是否正在執行或暫停。預設running |
animation-fill-mode |
動畫時間之外的狀態 |
-
@keyframe
定義和語法建立動畫的原理是將一套css 逐漸改變為另一套css。
以百分比來規定改變的時間,或者通過關鍵字
from
和to
,等價於 0% 和 100%語法:
@keyframes name { keyframe-selector {css-styles;} }
@-moz-keyframes mymove /* Firefox */ @-webkit-keyframes mymove /* Safari 和 Chrome */ @-o-keyframes mymove /* Opera */
值 描述 name 必填。動畫名稱 keyframe-selector 必填。動畫時長的百分比。合法值:0 - 100%、from(等同0%)、to(等同100%) css-styles 必須。一個或多個合法css屬性 例項:
/* 兩秒內將div寬度從200px 改變到 300px */ /* 語法一 */ @keyframe widthChange{ from{ width:200px;}, to{ width:300px;} } /* 語法二 */ @keyframe widthChange{ 0% { width:200px;}, 50% { width:250px;}, 100%{ width:300px;} } div{ width:200px; height:200px; background-color:#fff; animation:widthChange 2s; }
-
animation
按照屬性表中屬性的順序,可以是兩個或者多個。
例如:
animation:animation-name animation-duration
、animation:animation-name animation-duration animation-timing-function
-
animation-timing-function
同
transition-timing-function
值相同。 -
animation-direction
值 描述 normal
預設值。動畫正常播放 alternate
動畫逆向播放 -
animation-play-state
值 描述 paused 規定動畫已暫停。 running 規定動畫正在播放。 -
animation-fill-mode
值 描述 none 不改變預設行為。 forwards 當動畫完成後,保持最後一個屬性值(在最後一個關鍵幀中定義)。 backwards 在 animation-delay 所指定的一段時間內,在動畫顯示之前,應用開始屬性值(在第一個關鍵幀中定義)。 both 向前和向後填充模式都被應用。
transform 轉換
通過轉換,能夠對元素進行移動、縮放、轉動、拉伸或拉長。
新的轉換屬性
下面的表格列出了所有的轉換屬性:
屬性 | 描述 |
---|---|
transform |
向元素應用 2D 或 3D 轉換。 |
transform-origin |
允許你改變被轉換元素的位置。 |
2D轉換
函式 | 描述 | 示例 |
---|---|---|
matrix(n,n,n,n,n,n) | 定義 2D 轉換,使用六個值的矩陣。 | matrix() 方法需要六個引數,包含數學函式,允許您:旋轉、縮放、移動以及傾斜元素。 |
translate(x,y) | 定義 2D 轉換,沿著 X 和 Y 軸移動元素。 | 值 translate(50px,100px) 把元素從左側移動 50 畫素,從頂端移動 100 畫素。 |
translateX(n) | 定義 2D 轉換,沿著 X 軸移動元素。 | |
translateY(n) | 定義 2D 轉換,沿著 Y 軸移動元素。 | |
scale(x,y) | 定義 2D 縮放轉換,改變元素的寬度和高度。 | 值 scale(2,4) 把寬度轉換為原始尺寸的 2 倍,把高度轉換為原始高度的 4 倍。 |
scaleX(n) | 定義 2D 縮放轉換,改變元素的寬度。 | |
scaleY(n) | 定義 2D 縮放轉換,改變元素的高度。 | |
rotate(angle) | 定義 2D 旋轉,在引數中規定角度。 | 值 rotate(30deg) 把元素順時針旋轉 30 度。 |
skew(x-angle,y-angle) | 定義 2D 傾斜轉換,沿著 X 和 Y 軸。 | 值 skew(30deg,20deg) 圍繞 X 軸把元素翻轉 30 度,圍繞 Y 軸翻轉 20 度。 |
skewX(angle) | 定義 2D 傾斜轉換,沿著 X 軸。 | |
skewY(angle) | 定義 2D 傾斜轉換,沿著 Y 軸。 |
3D轉換
Opera 不支援 3D 轉換。
-
轉換屬性
下面的表格列出了所有的轉換屬性:
屬性 描述 transform
向元素應用 2D 或 3D 轉換。 transform-origin
允許你改變被轉換元素的位置。 transform-style
規定被巢狀元素如何在 3D 空間中顯示。 perspective
規定 3D 元素的透視效果。 perspective-origin
規定 3D 元素的底部位置。 backface-visibility
定義元素在不面對螢幕時是否可見。 -
3D 轉換方法
函式 描述 matrix3d(n,n,n,n,n,n, n,n,n,n,n,n,n,n,n,n) 定義 3D 轉換,使用 16 個值的 4x4 矩陣。 translate3d(x,y,z) 定義 3D 轉化。 translateX(x) 定義 3D 轉化,僅使用用於 X 軸的值。 translateY(y) 定義 3D 轉化,僅使用用於 Y 軸的值。 translateZ(z) 定義 3D 轉化,僅使用用於 Z 軸的值。 scale3d(x,y,z) 定義 3D 縮放轉換。 scaleX(x) 定義 3D 縮放轉換,通過給定一個 X 軸的值。 scaleY(y) 定義 3D 縮放轉換,通過給定一個 Y 軸的值。 scaleZ(z) 定義 3D 縮放轉換,通過給定一個 Z 軸的值。 rotate3d(x,y,z,angle) 定義 3D 旋轉。 rotateX(angle) 定義沿 X 軸的 3D 旋轉。 rotateY(angle) 定義沿 Y 軸的 3D 旋轉。 rotateZ(angle) 定義沿 Z 軸的 3D 旋轉。 perspective(n) 定義 3D 轉換元素的透視檢視。
樣例
滿屏泡泡
滿屏泡泡主要是實現不同大小的多個 3D 球體在螢幕上從下到上的運動的效果。
實現步驟:
-
畫3D球體
- 先畫圓
- 加徑向漸變
-
動畫
-
js控制
-
控制每個球體動畫的延遲時間和一個週期時間
-
控制不同球體的位置、大小、徑向漸變
-
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>泡泡全屏動畫-demo</title>
<style type="text/css">
body{
background-color: #050647;
overflow: hidden;
}
.circle{
position: absolute;
border-radius: 50%;
top: 100%;
animation-name: move;
animation-iteration-count: infinite; /* 一直迴圈運動 */
animation-timing-function: linear;
}
/* 動畫-改變球體的top屬性 */
@keyframes move{
from{ top:100%; }
to{ top:-40px; }
}
@-webkit-keyframes move{
from{ top:100%; }
to{ top:-40px; }
}
</style>
</head>
<body>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<script type="text/javascript">
var colors = ['#e22571','#8A2BE2','#985525','#45832a','#90afe2'];
//遍歷每個球體
var divs = document.querySelectorAll('.circle');
for (var i = 0; i < divs.length; i++) {
var index = Math.ceil(Math.random()*colors.length);
var color = colors[index];
//設定徑向漸變
divs[i].style.background = 'radial-gradient(circle at 15px 15px,' + colors[index] + ', #aa2c9e)';
//設定大小和位置
var wh = (Math.random()*40 + 10) + 'px';
divs[i].style.width = wh;
divs[i].style.height = wh;
divs[i].style.left = Math.ceil(Math.random()*100) + '%';
//設定動畫何時開始
divs[i].style.animationDelay = Math.ceil(Math.random()*6) + 's';
//設定動畫的一個週期時間
divs[i].style.animationDuration = Math.ceil(Math.random()*5) + 's';
}
</script>
</body>
</html>
心跳
實現步驟:
-
畫心形
大概畫圖步驟,先畫一個固定大小的div,使用偽類
after
、before
和position:absolute
構建兩個長方形,之後長方形上邊兩個角使用border-radius:50% 50% 0 0
控制,然後做 2D旋轉一定角度(transform:rotate(45deg)
),最後再填充背景色即可。 -
動畫
控制心形在1s內放大兩次。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>心跳</title>
<style type="text/css">
.heart{
margin: 25%;
width: 200px;
height: 200px;
animation: heart 1s infinite;
}
.heart:before,.heart:after{
content: '';
position: absolute;
width: 130px;
height: 200px;
background: red;
border-radius:50% 50% 0 0;
}
.heart:before{
right: 0;
transform: rotate(49deg);
}
.heart:after{
transform: rotate(-49deg);
}
@keyframes heart{
0% {transform: scale(1,1); }
30% {transform: scale(1.1,1.1); }
50% {transform: scale(1,1); }
75% {transform: scale(1.1,1.1); }
80% {transform: scale(1,1); }
100% {transform: scale(1,1); }
}
</style>
</head>
<body>
<div class="heart"></div>
</body>
</html>