咱們眼前所看到圖像正在以每秒60次的頻率刷新,因爲刷新頻率很高,所以你感受不到它在刷新。而動畫本質就是要讓人眼看到圖像被刷新而引發變化的視覺效果,這個變化要以連貫的、平滑的方式進行過渡。javascript
transition: property duration timing-function delaycss
div{
height: 200px;
width: 200px;
background: green;
transition: background 2s ease,transform 2s ease-in 1s;
}
div:hover{
transform:rotate(180deg) scale(.5);background:red
}
複製代碼
請看demojava
transition的優勢在於簡單易用,可是它有幾個很大的侷限。css3
(1)transition須要事件觸發,因此無法在網頁加載時自動發生。web
(2)transition是一次性的,不能重複發生,除非一再觸發。數組
(3)transition只能定義開始狀態和結束狀態,不能定義中間狀態,也就是說只有兩個狀態。瀏覽器
(4)一條transition規則,只能定義一個屬性的變化,不能涉及多個屬性。函數
animation: name duration timing-function delay iteration-count direction;佈局
#myDiv {
width:200px;
height:200px;
background:green
}
.play {
animation: fancy 2s ease infinite alternate;
/* animation: fancy 2s ease alternate forwards; */
}
@keyframes fancy {
0% { transform: none; background:green;}
40% { transform: scale(0.75) rotate(90deg); }
100% { transform: scale(0.5) rotate(180deg);background:red }
}
複製代碼
@keyframes fancy1 {
0% { transform: none;background:green }
40% { transform: scale(0.75) rotate(90deg); }
/* 45% {background:blue} */
100% { transform: scale(0.5) rotate(180deg);background:red }
}
.restart {
animation: fancy1 2s ease infinite alternate;
}
複製代碼
function restart(){
if (myDiv.classList.contains('play')) {
myDiv.className = 'restart';
}else {
myDiv.className = 'play';
}
}
複製代碼
.pause {
animation-play-state: paused;
}
複製代碼
function pause(){
if (myDiv.classList.contains('play')) {
myDiv.className = 'pause play';;
}else {
myDiv.className = 'pause restart';
}
}
複製代碼
.faster{
animation: fancy 1s ease infinite alternate;
}
複製代碼
function faster(){
if (myDiv.classList.contains('play')) {
myDiv.className = 'faster';
}else {
myDiv.className = 'faster restart';
}
}
複製代碼
請看demo若是須要多個動畫須要隨時的暫停,播放,反向播放,動態改變播放速率,監聽到動畫的完成和取消,須要用js來爲css animation增長不一樣的樣式從而改變更畫,會讓css文件和js文件太過於「笨重」性能
Web Animations API爲開發者打開瀏覽器的動畫引擎,讓開發者能夠經過JavaScript進行操做。該API旨在成爲CSS動畫和CSS過渡的實現的基礎,併爲將來的動畫效果留下了空間。它是支持Web的動畫最高效的方法之一,讓瀏覽器能夠本身進行內部優化而不須要hacks,強制或Window.requestAnimationFrame()。
經過Web Animations API,咱們能夠將交互式動畫從樣式表移動到JavaScript,將表現與行爲分開。咱們再也不須要依賴DOM-heavy的技術,例如編寫CSS屬性和將類做用於元素以控制播放方向。與純粹的聲明性CSS不一樣,JavaScript還容許咱們動態地將值從屬性設置爲持續時間。
其核心在於提供了:Element.animate(frames, timing);
兩個參數
var options = {
iterations: Infinity, // 動畫的重複次數,默認是 1
iterationStart: 0, // 用於指定動畫開始的節點,默認是 0
delay: 0, // 動畫延遲開始的毫秒數,默認 0
endDelay: 0, // 動畫結束後延遲的毫秒數,默認 0
direction: 'alternate', // 動畫的方向 默認是按照一個方向的動畫,alternate 則表示交替
duration: 700, // 動畫持續時間,默認 0
fill: 'forwards', // 是否在動畫結束時回到元素開始動畫前的狀態
easing: 'ease-out', // 緩動方式,默認 "linear"
};
複製代碼
pause() – 暫停動畫
play() – 播放動畫
reverse() – 反向播放
finish() – 當即結束動畫
cancel() – 取消動畫並回到初始狀態
playbackRate – 播放速度(負數的話將致使動畫反向運行)
var myDiv = document.getElementById('myDiv');
var keyframes=[
{transform: 'translateX(0)' },
{transform: 'translateX(500px)'}
]
var timing={
duration: 2000,
// iterations: Infinity,
direction: 'alternate'
}
let myAnimation=myDiv.animate(keyframes,timing);
// 播放動畫
function play(){
myAnimation.play();
}
// 暫停動畫
function pause(){
myAnimation.pause();
}
// 反向播放
function reverse(){
myAnimation.reverse();
}
// 當即結束動畫
function finish(){
myAnimation.finish();
}
// 取消動畫並回到初始狀態
function cancel(){
myAnimation.cancel();
}
// 2倍速
function faster(){
myAnimation.playbackRate = 2;
}
// 反向運行動畫
function back(){
myAnimation.playbackRate = -1;
}
// 設置當前動畫播放的毫秒數
function currentTime(){
//currentTime返回動畫當前所在的毫秒數,讀/寫
myAnimation.currentTime=0;
}
複製代碼
請看demo
spinnerAnimation.addEventListener('finish', function() {
// Animation has completed or .finish() has been called.
doSomething();
});
spinnerAnimation.addEventListener('cancel', function() {
// Animation has been canceled.
doSomething();
});
複製代碼
能夠引進 polyfill (web-animations-js),但也只能兼容到ie>=11
移動端瀏覽器,Android 5.0以上的Android Browser和Chrome for Android自己就已經支持WAAPI了,加上Polyfill以後,iOS的Safari也支持了。
1,在css animation中animation-timing-function適用於關鍵幀之間
2,在web animation中animation-timing-function適用於整個動畫過程
3,若是想要在web animation中animation-timing-function也適用於關鍵幀之間,能夠在關鍵幀上加上easing屬性(能夠不一樣)
請看demo
Try to animate transform and opacity
對於動畫的每一幀,瀏覽器都要從新計算元素的形狀位置(reflow),把新狀態渲染出來(repaint),再顯示到屏幕上,而transform和opacity這兩個屬性有其特殊性:
1,does not affect the document’s flow,(不影響佈局)
2,does not depend on the document’s flow,(不受佈局影響)
3,does not cause a repaint.(變化不會致使其它部分須要repaint)
因此瀏覽器能百分百確定transform和opacity的變化與佈局無關,不受佈局影響,其變化也不會影響現有佈局