Hello!小夥伴!
很是感謝您閱讀海轟的文章,假若文中有錯誤的地方,歡迎您指出~
自我介紹ଘ(੭ˊᵕˋ)੭
暱稱:海轟
標籤:程序猿|C++選手|學生
簡介:因C語言結識編程,隨後轉入計算機專業,有幸拿過國獎、省獎等,已保研。目前正在學習C++/Linux(真的真的太難了~)
學習經驗:紮實基礎 + 多作筆記 + 多敲代碼 + 多思考 + 學好英語!css
【動畫消消樂】 平時學習生活比較枯燥,無心之間對一些網頁、應用程序的過渡/加載動畫產生了濃厚的興趣,想知道具體是如何實現的? 便在空閒的時候學習下如何使用css實現一些簡單的動畫效果,文章僅供做爲本身的學習筆記,記錄學習生活,爭取理解動畫的原理,多多「消滅」動畫!html
HTML編程
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="style.css"> <title>Document</title> </head> <body> <section><span></span></section> </body> </html>
CSS學習
html, body { margin: 0; height: 100%; } body { display: flex; justify-content: center; align-items: center; background: #ed556a; /* background-color: #82466e; */ animation: backColor 4s infinite; } section { width: 650px; height: 300px; padding: 10px; position: relative; display: flex; align-items: center; justify-content: center; border: 2px solid white; } span { width: 48px; height: 48px; background-color: goldenrod; display: inline-block; position: relative; transform: rotate(45deg); } span::before { content: ''; width: 24px; height: 24px; position: absolute; left: 0; top: -24px; animation: loading_1 4s ease infinite; } span::after { content: ''; position: absolute; left: 0; top: 0; width: 24px; height: 24px; background: rgba(255, 255, 255, 0.85); box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); animation: loading_2 2s ease infinite; } @keyframes loading_1 { 0% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } 12% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } 25% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } 37% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 0) } 50% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1) } 62% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1) } 75% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1) } 87% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 1) } 100% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } } @keyframes loading_2 { 0% { transform: translate(0, 0) rotateX(0) rotateY(0) } 25% { transform: translate(100%, 0) rotateX(0) rotateY(180deg) } 50% { transform: translate(100%, 100%) rotateX(-180deg) rotateY(180deg) } 75% { transform: translate(0, 100%) rotateX(-180deg) rotateY(360deg) } 100% { transform: translate(0, 0) rotateX(0) rotateY(360deg) } }
使用span標籤,設置爲flex
span { width: 48px; height: 48px; background-color: goldenrod; position: relative; }
效果圖以下:動畫
使用span::before僞元素,設置爲ui
span::before { content: ''; width: 24px; height: 24px; position: absolute; background-color: #fff; left: 0; top: -24px; }
效果圖以下:spa
使用box-shadow爲span::before設置四個陰影3d
span::before { box-shadow: 0 24px red, /* 陰影1 */ 24px 24px orange, /* 陰影2 */ 24px 48px yellow, /* 陰影3 */ 0px 48px green; /* 陰影4 */ }
四個陰影位置關係以下:code
注:這裏爲了視覺顯示區分四個陰影,每一個陰影採用了不一樣的顏色,在實際中其實每一個陰影都設置爲白色。
爲span::before的四個陰影添加動畫loading_1
每一個陰影只有兩種狀態:顯示 與 不顯示
顯示與不然是經過設置顏色的透明級別爲0或1
好比
關鍵有 九幀
第一幀
box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0);
效果圖以下:
第二幀
box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0);
效果圖以下:
第三幀
box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0);
效果圖以下:
第四幀
box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 0);
效果圖以下:
第五幀
box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1);
效果圖以下:
第六幀
box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1);
效果圖以下:
第七幀
box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1);
效果圖以下:
第八幀
box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 1);
效果圖以下:
第九幀
box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0);
效果圖以下:
設置動畫animation使得從第一幀平穩過渡至第九幀
animation: loading_1 4s ease infinite;
@keyframes loading_1 { 0% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } 12% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } 25% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } 37% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 0) } 50% { box-shadow: 0 24px rgba(255, 255, 255, 1), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1) } 62% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 1), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1) } 75% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 1), 0px 48px rgba(255, 255, 255, 1) } 87% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 1) } 100% { box-shadow: 0 24px rgba(255, 255, 255, 0), 24px 24px rgba(255, 255, 255, 0), 24px 48px rgba(255, 255, 255, 0), 0px 48px rgba(255, 255, 255, 0) } }
效果圖以下:
取消span::before的背景色
將此時造成的動畫定義爲動畫1
先忽略span::before造成的動畫,暫時註釋掉
使用span::after僞元素,設置爲
span::after { content: ''; position: absolute; left: 0; top: 0; width: 24px; height: 24px; background: rgba(255, 255, 255, 0.85); box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
效果圖以下:
爲span::after添加動畫
有5個關鍵幀
第一幀(初始狀態)
transform: translate(0, 0) rotateX(0) rotateY(0)
第二幀(相對於初始狀態)
transform: translate(100%, 0) rotateX(0) rotateY(180deg)
第一幀 過渡至 第二幀 效果圖以下
第三幀 (相對於初始狀態)
transform: translate(100%, 100%) rotateX(-180deg) rotateY(180deg)
第二幀 過渡至 第三幀 效果圖以下
第四幀(相對於初始狀態)
transform: translate(0, 100%) rotateX(-180deg) rotateY(360deg)
第三幀 過渡至 第四幀 效果圖以下
第五幀(相對於初始狀態)
transform: translate(0, 0) rotateX(0) rotateY(360deg);
第四幀 過渡至 第五幀 效果圖以下
設置動畫從第一幀過渡至第五幀
animation: loading_2 2s ease infinite;
@keyframes loading_2 { 0% { transform: translate(0, 0) rotateX(0) rotateY(0) } 25% { transform: translate(100%, 0) rotateX(0) rotateY(180deg) } 50% { transform: translate(100%, 100%) rotateX(-180deg) rotateY(180deg) } 75% { transform: translate(0, 100%) rotateX(-180deg) rotateY(360deg) } 100% { transform: translate(0, 0) rotateX(0) rotateY(360deg) } }
將此動畫定義爲動畫2
效果圖以下
動畫1爲:
動畫2爲:
將動畫1與動畫2疊加
效果圖以下
將span旋轉45度
span { transform: rotate(45deg); }
效果圖以下:
取消span背景色
獲得最終效果
文章僅做爲學習筆記,記錄從0到1的一個過程
但願對您有所幫助,若有錯誤歡迎小夥伴指正~
我是海轟ଘ(੭ˊᵕˋ)੭,若是您以爲寫得能夠的話,請點個贊吧
謝謝支持❤️