5分鐘實現漂亮的CSS加載動畫,純CSS實現加載動畫

2021-02-19 AlbertYang

目錄

1 視頻

2 知識點

2.1 CSS calc() 函數

2.2 CSS var() 函數

2.3 CSS3 box-shadow 屬性

2.4 CSS3 box-sizing 屬性

2.5 CSS3 filter(濾鏡) 屬性

2.6 CSS3動畫(animation)

3 參考代碼

3.1 HTML

3.2 CSS

1 視頻

視頻地址:https://www.bilibili.com/video/BV1D5411H7Tc

2 知識點2.1 CSS calc() 函數

CSS calc() 函數用於動態計算長度值。

語法

calc(expression)

描述

expression

必須,一個數學表達式,結果將採用運算後的返回值。

需要注意的是,運算符前後都需要保留一個空格,例如:width: calc(100% - 10px); 

任何長度值都可以使用calc()函數進行計算;

calc()函數支持 "+", "-", "*", "/" 運算; 

calc()函數使用標準的數學運算優先級規則; 

支持版本:CSS3

2.2 CSS var() 函數

var() 函數用於插入自定義的屬性值,如果一個屬性值在多處被使用,可以使用該方法。

支持版本:CSS3

語法

var(custom-property-name, value)

描述

custom-property-name

必需。自定義屬性的名稱,必需以 -- 開頭。

value

可選。備用值,在屬性不存在的時候使用。

2.3 CSS3 box-shadow 屬性

box-shadow屬性可以設置一個或多個下拉陰影的框。

默認值:none繼承:no版本:CSS3JavaScript 語法:object.style.boxShadow="10px 10px 5px #888888"

語法

box-shadow: h-shadow v-shadow blur spread color inset;

注意:boxShadow 屬性把一個或多個下拉陰影添加到框上。該屬性是一個用逗號分隔陰影的列表,每個陰影由 2-4 個長度值、一個可選的顏色值和一個可選的 inset 關鍵字來規定。省略長度的值是 0。

值說明h-shadow必需的。水平陰影的位置。允許負值v-shadow必需的。垂直陰影的位置。允許負值blur可選。模糊距離spread可選。陰影的大小color可選。陰影的顏色。inset可選。從外層的陰影(開始時)改變陰影內側陰影

 

2.4 CSS3 box-sizing 屬性

Box-sizing 屬性允許你以某種方式定義某些元素,以適應指定區域。

例如,假如您需要並排放置兩個帶邊框的框,可通過將 box-sizing 設置為 "border-box"。這可令瀏覽器呈現出帶有指定寬度和高度的框,並把邊框和內邊距放入框中。

默認值:content-box繼承:no版本:CSS3JavaScript 語法:object.style.boxSizing="border-box"

語法

box-sizing: content-box|border-box|inherit:

值說明content-box這是 CSS2.1 指定的寬度和高度的行為。指定元素的寬度和高度(最小/最大屬性)適用於box的寬度和高度。元素的填充和邊框布局和繪製指定寬度和高度除外border-box指定寬度和高度(最小/最大屬性)確定元素邊框。也就是說,對元素指定寬度和高度包括了 padding 和 border 。通過從已設定的寬度和高度分別減去邊框和內邊距才能得到內容的寬度和高度。inherit指定 box-sizing 屬性的值,應該從父元素繼承

 

2.5 CSS3 filter(濾鏡) 屬性

filter 屬性定義了元素(通常是<img>)的可視效果(例如:模糊與飽和度)。

默認值:none繼承:no動畫支持:是。版本:CSS3JavaScript 語法:object.style.WebkitFilter="grayscale(100%)"

CSS 語法

filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() | url();

提示: 使用空格分隔多個濾鏡。

Filter 函數

注意: 濾鏡通常使用百分比 (如:75%), 當然也可以使用小數來表示 (如:0.75)。

Filter描述none默認值,沒有效果。blur(px)給圖像設置高斯模糊。"radius"一值設定高斯函數的標準差,或者是屏幕上以多少像素融在一起, 所以值越大越模糊;

如果沒有設定值,則默認是0;這個參數可設置css長度值,但不接受百分比值。brightness(%)給圖片應用一種線性乘法,使其看起來更亮或更暗。如果值是0%,圖像會全黑。值是100%,則圖像無變化。其他的值對應線性乘數效果。值超過100%也是可以的,圖像會比原來更亮。如果沒有設定值,默認是1。contrast(%)調整圖像的對比度。值是0%的話,圖像會全黑。值是100%,圖像不變。值可以超過100%,意味著會運用更低的對比。若沒有設置值,默認是1。drop-shadow(h-shadow v-shadow blur spread color)

給圖像設置一個陰影效果。陰影是合成在圖像下面,可以有模糊度的,可以以特定顏色畫出的遮罩圖的偏移版本。函數接受<shadow>(在CSS3背景中定義)類型的值,除了"inset"關鍵字是不允許的。該函數與已有的box-shadow box-shadow屬性很相似;不同之處在於,通過濾鏡,一些瀏覽器為了更好的性能會提供硬體加速。<shadow>參數如下:

<offset-x> <offset-y> (必須)

這是設置陰影偏移量的兩個 <length>值. <offset-x> 設定水平方向距離. 負值會使陰影出現在元素左邊. <offset-y>設定垂直距離.負值會使陰影出現在元素上方。查看<length>可能的單位.
如果兩個值都是0, 則陰影出現在元素正後面 (如果設置了 <blur-radius> and/or <spread-radius>,會有模糊效果).

<blur-radius> (可選)

這是第三個code><length>值. 值越大,越模糊,則陰影會變得更大更淡.不允許負值 若未設定,默認是0 (則陰影的邊界很銳利).

<spread-radius> (可選)

這是第四個 <length>值. 正值會使陰影擴張和變大,負值會是陰影縮小.若未設定,默認是0 (陰影會與元素一樣大小). 
注意: Webkit, 以及一些其他瀏覽器 不支持第四個長度,如果加了也不會渲染。

 

<color> (可選)

查看 <color>該值可能的關鍵字和標記。若未設定,顏色值基於瀏覽器。在Gecko (Firefox), Presto (Opera)和Trident (Internet Explorer)中, 會應用colorcolor屬性的值。另外, 如果顏色值省略,WebKit中陰影是透明的。

grayscale(%)

將圖像轉換為灰度圖像。值定義轉換的比例。值為100%則完全轉為灰度圖像,值為0%圖像無變化。值在0%到100%之間,則是效果的線性乘子。若未設置,值默認是0;

hue-rotate(deg)

給圖像應用色相旋轉。"angle"一值設定圖像會被調整的色環角度值。值為0deg,則圖像無變化。若值未設置,默認值是0deg。該值雖然沒有最大值,超過360deg的值相當於又繞一圈。

invert(%)

反轉輸入圖像。值定義轉換的比例。100%的價值是完全反轉。值為0%則圖像無變化。值在0%和100%之間,則是效果的線性乘子。若值未設置,值默認是0。

opacity(%)

轉化圖像的透明程度。值定義轉換的比例。值為0%則是完全透明,值為100%則圖像無變化。值在0%和100%之間,則是效果的線性乘子,也相當於圖像樣本乘以數量。若值未設置,值默認是1。該函數與已有的opacity屬性很相似,不同之處在於通過filter,一些瀏覽器為了提升性能會提供硬體加速。

saturate(%)

轉換圖像飽和度。值定義轉換的比例。值為0%則是完全不飽和,值為100%則圖像無變化。其他值,則是效果的線性乘子。超過100%的值是允許的,則有更高的飽和度。若值未設置,值默認是1。

sepia(%)

將圖像轉換為深褐色。值定義轉換的比例。值為100%則完全是深褐色的,值為0%圖像無變化。值在0%到100%之間,則是效果的線性乘子。若未設置,值默認是0;

url()

URL函數接受一個XML文件,該文件設置了 一個SVG濾鏡,且可以包含一個錨點來指定一個具體的濾鏡元素。

例如:

filter: url(svg-url#element-id): url(svg-url#element-id)

initial

設置屬性為默認值。

inherit從父元素繼承該屬性。
2.6 CSS3動畫(animation)

動畫是 CSS3 中最具顛覆性的特徵之一,可通過設置多個節點來精確的控制一個或者一組動畫,從而實現複雜的動畫效果。

動畫的基本使用:

1 定義動畫

2 調用定義好的動畫

定義動畫語法

@keyframes 動畫名稱 {  0% {    width: 100px;  }  100% {    width: 200px  }}

使用動畫語法

div {    /* 調用動畫 */    animation-name: 動畫名稱;    /* 持續時間 */   animation-duration: 持續時間;}

動畫序列

0% 是動畫的開始,100 % 是動畫的完成,這樣的規則就是動畫序列

在 @keyframs 中規定某項 CSS 樣式,就由創建當前樣式逐漸改為新樣式的動畫效果

動畫是使元素從一個樣式逐漸變化為另一個樣式的效果,可以改變任意多的樣式任意多的次數

用百分比來規定變化發生的時間,或用 from 和 to,等同於 0% 和 100%

動畫常見屬性

下面的表格列出了 @keyframes 規則和所有動畫屬性:

動畫簡寫方式

動畫簡寫方式

/* animation: 動畫名稱 持續時間 運動曲線 何時開始 播放次數 是否反方向 起始與結束狀態 */

animation: name duration timing-function delay iteration-count direction fill-mode

知識要點

簡寫屬性裡面不包含 animation-paly-state

暫停動畫 animation-paly-state: paused; 經常和滑鼠經過等其他配合使用

要想動畫走回來,而不是直接調回來:animation-direction: alternate

盒子動畫結束後,停在結束位置:animation-fill-mode: forwards

代碼演示

animation: move 2s linear 1s infinite alternate forwards;

速度曲線細節

animation-timing-function: 規定動畫的速度曲線,默認是ease。

值描述linear動畫從頭到尾的速度是相同的。ease默認。動畫以低速開始,然後加快,在結束前變慢。ease-in動畫以低速開始。ease-out動畫以低速結束。ease-in-out動畫以低速開始和結束。cubic-bezier(n,n,n,n)在 cubic-bezier 函數中自己的值。可能的值是從 0 到 1 的數值。

 

3 參考代碼3.1 HTML
<!DOCTYPE html><html>  <head>    <meta charset="utf-8">    <title>加載動畫:公眾號AlbertYang</title>    <link rel="stylesheet" type="text/css" href="style.css"/>  </head>  <body>    <div class="loader">      <div style="--x:0"></div>      <div style="--x:1"></div>      <div style="--x:2"></div>      <div style="--x:3"></div>      <div style="--x:4"></div>      <div style="--x:5"></div>    </div>  </body></html>

3.2 CSS

* {  margin: 0;  padding: 0;  box-sizing: border-box;} body {  display: flex;  justify-content: center;  align-items: center;  background: #edf1f4;  min-height: 100vh;} .loader {  display: flex;  flex-direction: row;} .loader div {  position: relative;  width: 40px;  height: 200px;  margin: 20px;  overflow: hidden;  border-radius: 50px;  background: linear-gradient(to bottom, rgba(0, 0, 0, 0.05), #edf1f4);  border: 2px solid #edf1f4;  box-shadow: 15px 15px 20px rgba(0, 0, 0, 0.1),    -15px -15px 20px #fff,    inset -5px -5px 5px rgba(255, 255, 255, 0.5),    inset 5px 5px 5px rgba(0, 0, 0, 0.05);} .loader div::before {  content: "";  position: absolute;  top: 0;  left: 0;  width: 100%;  height: 100%;  z-index: 100;  border-radius: 50px;  box-shadow: 15px 15px 20px rgba(0, 0, 0, 0.1),    -15px -15px 20px #fff,    inset -5px -5px 5px rgba(255, 255, 255, 0.5),    inset 5px 5px 5px rgba(0, 0, 0, 0.05);} .loader div::before {  content: "";  position: absolute;  top: 0;  left: 0;  width: 36px;  height: 36px;  border-radius: 50%;  box-shadow: inset -5px -5px 5px rgba(0, 0, 0, 0.1),    0 420px 0 400px #2196f3;  animation: animate 2.5s ease-in-out infinite;  animation-delay: calc(var(--x) * -0.3s);  transform: translateY(160px);} @keyframes animate {  0% {    transform: translateY(160px);    filter: hue-rotate(0deg);  }   50% {    transform: translateY(0px);    filter: hue-rotate(180deg);  }   100% {    transform: translateY(160px);    filter: hue-rotate(360deg);  }}

今天的學習就到這裡了,由於本人能力和知識有限,如果有寫的不對的地方,還請各位大佬批評指正。如果想繼續學習提高,歡迎關注我,每天學習進步一點點,就是領先的開始,加油。如果覺得本文對你有幫助的話,歡迎轉發,評論,點讚!!!

相關焦點

  • 巧用css圓角實現有點意思的加載動畫
    css的圓角屬性來實現有點意思的加載動畫.如果想學習更多css實用技巧, 可以參考筆者以下的文章:css的border屬性和border-radius屬性筆者在前面的文章中也分享過了如何利用border來實現不同的形狀, 比如三角形, 如下為原理圖:利用這個原理我們只要把元素的border-radius 設置為圓形(比如50%), 我們是不是就能實現一個餅圖了呢? 我們來看看效果:
  • 使用簡單 好看的CSS加載動畫源碼
    今天小編分享的css-spinners,它自帶的CSS加載樣式很漂亮,圖案色彩豐富,花樣多多,就算不用它的CSS,也可以按它的動畫來做成GIF圖像。loading樣式有花形、心形、指針、圓形旋轉、進度條以及常見的菊花加載圖案:使用教程CSS Spinners除了輕量級外,使用也十分的簡單,下面來看看教學:STEP 1: 引入CSS文件加載動畫樣式有單個以及全部,如果用戶只需要一個加載動畫,就選擇對應的CSS文件。
  • 《前端5分鐘》之使用純css實現網站換膚和焦點圖切換動畫
    你將收穫網站換膚設計方案介紹:target偽類介紹和用法以及如何使用css實現網站換膚transition動畫以及如何用純css實現焦點圖動畫效果展示1.網站換膚2.焦點圖動畫實現思路1.網站換膚通常我們實現網站換膚都基於如下方式實現:方案一: 使用OOCSS模式,通過js動態切換公共類名來達到換膚效果方案二
  • 10個CSS和jQuery的加載中(loading)動畫效果實現
    10個CSS和jQuery的加載中(loading)動畫效果實現 以往web開發中都使用Gif來實現加載中的效果,但是隨著技術的發展我們也可以使用jQuery和CSS來實現加載中的效果
  • 精通react/vue組件設計教你實現一個極具創意的加載(Loading)組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第八篇文章, 今天帶大家用5分鐘實現一個極具創意的加載(loading)組件.涉及的核心知識點主要是css3相關特性, 如果大家非常熟悉,可直接跳過介紹直接看正文.時刻問自己:是否具備創造力?
  • 盤點web前端動畫技術,css動畫是通過什麼實現的?
    、網頁樣式(css)、網頁互動(JavaScript)三部分組成,對於新手來說理解他們之前的關係有些困難,我們可以把網頁前端比成一座房子,html代表房子的基礎和架構、css表示房子的裝修風格是中式、歐式還是其他風格的,JavaScript代表這個房子中能夠產生交互的東西,比如門和窗戶它們都有打開和關閉的動作。
  • Vue中使用animate.css實現動畫效果
    在實際開發過程中,有些頁面需要一些炫酷的動畫效果這時我們可以通過animate來實現Animate是一個非常實用的動畫庫官網: https://animate.style/Animate動畫庫裡面有很多實用的動畫效果展示如下:應用實例效果展示:使用方法:在vue中使用animate.css第一步:安裝
  • 8 個超炫酷的純 CSS3 動畫及源碼分享
    1、純CSS3實現大象走路動畫 之前我們分享過一款純CSS3人物行走動畫,效果相當震撼。這一次要給大家介紹的是一款純CSS3實現的大象走路動畫,大象走路時的形態表現的十分逼真,你可能不會想到,這麼給力的動畫居然是用純CSS3實現的,很可愛的大象,下載源碼自己去研究吧。
  • 利用CSS、JavaScript及Ajax實現圖片預加載的三大方法
    方法一:用CSS和JavaScript實現預加載實現預加載圖片有很多方法,包括使用CSS、JavaScript及兩者的各種組合。這些技術可根據不同設計場景設計出相應的解決方案,十分高效。方法二:僅使用JavaScript實現預加載上述方法有時確實很高效,但我們逐漸發現它在實際實現過程中會耗費太多時間。相反,我更喜歡使用純JavaScript來實現圖片的預加載。下面將提供兩種這樣的預加載方法,它們可以很漂亮地工作於所有現代瀏覽器之上。
  • 推薦9款使用CSS3實現的超酷動畫效果
    本周極客社區推薦9款使用CSS3實現的超酷前端動畫效果。希望對大家有所幫助!CSS3的Hover效果類庫 - Hover.cssHover.css是由Ian Lunn開發的一個開源的CSS3懸浮效果類庫,這些強大的懸浮效果可以應用到按鈕,logo,圖片等等上。非常容易應用到你自己的元素上,或者作為創意展示。支持CSS和SASS。如何使用?
  • 10 個 GitHub 上超火的 CSS 技巧項目,找到寫 CSS 的靈感!
    You-need-to-know-css該項目是 CSS 的各種效果實現,尤其是動畫效果。筆者把自己的收穫和工作中常用的一些 CSS 小樣式總結成這份文檔。比如:巧用 CSS 實現酷炫的充電動畫匯集了實現各種加載效果的 CSS 代碼片段。
  • 前端工程師必備的css3動畫技巧
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文是筆者之前文章用css3實現驚豔面試官的背景即背景動畫(高級附源碼)的續篇也是介紹css3技巧的文章,因為css這塊知識難點不是很多,更多的在於去熟悉css3的新特性和基礎理論知識。
  • 有趣的CSS小示例:好看的皮囊千篇一律,有趣的靈魂萬裡挑一
    文字加載...動畫html正在加載中<dot>...原來是dot元素,沿著Y軸在循環位移,隱藏掉就讓你看到了加載的動畫效果。border 實現邊框當你需要這樣一個上傳文件,按鈕時,你考慮的是找設計弄個圖片,還是自己寫一個???其實CSS寫,也很簡單的。
  • 如何用純css打造類materialUI的按鈕點擊動畫並封裝成react組件
    正文首先我們看一下materialUI的按鈕點擊效果:本質上也是用了css3動畫的特性, 筆者查看原始碼和通過點擊發現materialUI會根據點擊位置不同而作不同位置的動畫,這個有點意思.我們先不講這麼複雜的例子,下面通過css3的方案來實現一個類似的效果.筆者實現的效果如下:
  • css 表單效果,純div+css實現
    純div+css實現,大家可以參考下,也許有一些問題,大家可以修正下<!lis[i].style.left = initleft + i*100 + "px";}}</script><style type="text/css
  • 瀏覽器加載解析渲染網頁原理
    通過DOM解析發現頁面中有css外部樣式表需要加載,就立即通過CSS加載器執行加載。解析到img元素發現需要加載圖片,就立即通過圖片加載器執行加載,這個過程不會等待前面加載的資源加載完成才啟動第二個加載,而是通過異步的方法開啟多個加載線程,並且瀏覽器底層會開啟多個進程來處理這些線程(Chrome會開啟五個進程)。同樣解析到了script元素時發現需要外部js資源會立即加載js文件資源。
  • css實現元素旋轉效果
    下圖可以看出圓圈是有一個旋轉的效果在實際的開發過程中,這種效果也是經常出現的所以如何實現這種效果呢?1.定義animate 樣式/*rot : 定義的動畫名稱1s : 動畫時間linear : 動畫以何種運行軌跡完成一個周期infinite :規定動畫應該無限次播放
  • 面試整理(三)CSS部分
    優點:a- 減少 HTTP 請求數,極⼤地提⾼⻚⾯加載速度b- 增加圖⽚信息重複度,提⾼壓縮⽐,減少圖⽚⼤⼩c- 更換⻛格⽅便,只需在⼀張或⼏張圖⽚上修改顏⾊或樣式即可實現 缺點:a- 圖⽚合併麻煩b- 維護麻煩,修改⼀個圖⽚可能需要從新布局整個圖⽚,樣式
  • 面試題聯盟之CSS篇
    預處理器(sass/less/stylus/postcss)這些都是類css語言,通過webpack編譯可以轉成瀏覽器可讀的css,並且賦予css更強大的功能。動畫transition -- 過渡動畫transition: property duration timing-function delay;animation -- 可以定義每一幀的動畫animation: keyframe-name duration timing-function delay iteration-count
  • 五大頂級CSS性能優化工具,值得一試!
    2、尋求最佳做法實現  3、統一編碼風格,如每個CSS規則中的一致間距等。  4、支持新的頂級CSS語法  5、使用stylefmt自動修復一些警告,一種格式化CSS規則的工具  ......  合成操作是瀏覽器執行的最廉價操作,如果你的CSS動畫的代碼反覆觸發合成和重繪操作的屬性,則很難將60fps(每秒幀數)作為平滑網頁動畫的關鍵數字。  Cssnano  當使用CSS呈現頁面的關鍵路徑時,使用精簡的、結構良好的樣式表文檔就變得很重要。