動畫在前端開發中是經常遇到的場景之一,加入動畫後頁面可以極大的提升用户體驗。
絕大多數簡單的動畫場景可以直接通過CSS實現,對於一些特殊場景的動畫可能會使用到JS計算實現,通過本文的學習,可以讓你在一些看似需要使用JS實現的動畫場景,使用純CSS一樣可以實現,並且更方便快捷。
先看一個簡單的例子:一個方塊的位置隨着滑條滑動的位置改變
這個場景實現起來很簡單,滑條值改變後,使用JS計算方塊應該移動的距離,然後將方塊定位到指定位置即可。代碼如下:
.box {
height: 50px;
width: 50px;
background-color: aquamarine;
}
<div class="box"></div>
<input type="range" min="0" max="1" step="0.01"/>
<script>
const input = document.querySelector("input");
const box = document.querySelector(".box");
input.addEventListener('input', (e) => {
const value = e.target.value;
box.style.transform = `translateX(${200 * value}px)`;
})
</script>
現在稍微增加一些動畫效果:
- 方塊在中間位置時縮放為原來的一半大小
- 方塊在中間位置時變成球形
- 方塊從紅色變為綠色
對於大小和圓角,同樣可以使用簡單的JS進行計算實現,但是對於顏色變化,使用JS計算將會是一個非常複雜的過程。
先拋開動畫跟隨滑條運動這個要求,如果使用CSS實現上面從0-1的動畫過程是一個很簡單的事:
.box {
height: 50px;
width: 50px;
background-color: aquamarine;
transform: translateX(0);
animation: run 1s linear forwards;
}
@keyframes run {
0% {
transform: translateX(0) scale(1);
border-radius: 0%;
background: red;
}
50% {
transform: translateX(100px) scale(.5);
border-radius: 50%;
}
100% {
transform: translateX(200px) scale(1);
border-radius: 0%;
background: green;
}
}
利用CSS動畫幫我們可以很輕鬆的計算出每個時間點時的狀態,現在的問題就變成如何讓動畫停留在指定的時間點,這就需要使用到動畫的兩個屬性:
annimation-play-state:設置動畫是運行還是暫停,有兩個屬性值runing、paused
annimation-delay:設置動畫開始時間的偏移量,如果是正值,則動畫會延遲開始;如果是負值(-d),動畫會立即開始,開始位置在動畫(d)s時所處的位置。
有了這兩個屬性,現在將上面的動畫停留在50%的位置
假設整個動畫過程需要1s,50%的位置則需要將延遲值設置為-0.5s,這樣動畫就會停留在0.5s的位置。
.box {
height: 50px;
width: 50px;
background-color: aquamarine;
transform: translateX(0);
animation: run 1s -0.5s linear forwards infinite paused;
}
接下來只需要將滑條的值與動畫延遲的值關聯起來即可,這裏可以通過CSS變量來實現:
.box {
--duration: -0.5s; // 定義延遲變量
height: 50px;
width: 50px;
background-color: aquamarine;
transform: translateX(0);
animation: run 1s var(--duration) linear forwards infinite paused;
}
@keyframes run {
0% {
transform: translateX(0) scale(1);
border-radius: 0%;
background: red;
}
50% {
transform: translateX(100px) scale(.5);
border-radius: 50%;
}
100% {
transform: translateX(200px) scale(1);
border-radius: 0%;
background: green;
}
}
<script>
const input = document.querySelector("input");
const box = document.querySelector(".box");
// 綁定滑條輸入值變化
input.addEventListener('input', (e) => {
const value = e.target.value;
// 設置變量
box.style.setProperty('--duration', `-${e.target.value}s`)
})
</script>
應用場景
利用CSS延遲動畫可以輕鬆實現很多交互場景,例如:跟隨鼠標滾動界面發生反饋動畫、根據當天時間界面從日出到日落、根據不同分值出現不同表情變化等等。
最後,歡迎到我的個人網站(www.dengzhanyong.com)
關注我的公眾號,不錯過每一篇推送
回覆 CSS延遲動畫 獲取上述案例全部源碼