styled-components實現(xiàn)骨架屏加載動畫

背景概述

很多應(yīng)用在加載數(shù)據(jù)的時候,為了避免頁面過于空白,都會用骨架屏的方式來預(yù)告將會有內(nèi)容載入,從而提升用戶體驗


image.png

接下來簡單講解一下如何在react應(yīng)用中,通過styled-components實現(xiàn)骨架屏的效果,大致可以分為 靜態(tài)框架 + 動畫效果 兩個部分

靜態(tài)框架

在這個部分,我們需要根據(jù)實際的內(nèi)容,預(yù)先設(shè)置好各個區(qū)塊的寬度、高度以及背景顏色

// Skeleton/index.js
import React, {Component} from 'react'
import {
  Item,
  Info
} from './style'

class Skeleton extends Component {
  constructor(props) {
    super(props)
  }

  render(){
    return (
      <Item>
          <div className="img-wrapper" />
          <Info>
            <div className="loading name"></div>
            <div className="loading desc"></div>
            <div className="loading delivery"></div>
          </Info>
        </Item>
    )
  }
}

export default Skeleton

CSS部分如下:

import styled, {keyframes} from 'styled-components'

export const Item = styled.div`
  width: 94%;
  min-height: 100px;
  margin: 0 auto 5px;
  padding: 3%;
  border-radius: 5px;
  border: .5px solid #E8E8E8;
  box-sizing: border-box;
  background-color: white;
  .img-wrapper {
    display: block;
    float: left;
    width: 99px;
    min-height: 74px;
    background-color: #ededed;
  }
`

export const Info = styled.div`
  display: block;
  float: left;
  width: 58%;
  margin-left: 15px;
  .name {
    width: 100%;
    min-height: 18px;
    margin-bottom: 8px;
    background-color: #ededed;
  }
  .desc {
    width: 100%;
    min-height: 16px;
    margin-bottom: 8px;
    background-color: #ededed;
  }
  .delivery {
    width: 100%;
    min-height: 16px;
    background-color: #ededed;
  }
`

動畫效果

靜態(tài)值如下:

.loading {
    background-color: #ededed;
    background: linear-gradient(
      100deg,
      rgba(255,255,255,0) 40%,
      rgba(255,255,255,.5) 50%,
      rgba(255,255,255,0) 60%
    ) #ededed;
    background-size: 200% 100%;
    background-position-x: 160%;
    animation: 1s ${skeletonLoading} ease-in-out infinite;
  }

動畫定義如下:

const skeletonLoading = keyframes`
  to {
    background-position-x: -20%;
  }
`

編寫動畫樣式時,別忘了在文件頂部對 { keyframes } 進行引入

下面就對部分關(guān)鍵的CSS屬性值進行簡單講解:

1、linear-gradient:

表示漸變軸位于 水平方向順時針旋轉(zhuǎn)100度的位置
從rgba(255,255,255,0)漸變到rgba(255,255,255,.5)再漸變到rgba(255,255,255,0)

2、background-size:寬度,高度

可以理解為光柱運動場地的范圍大小
我們想讓光柱在水平方向移動,可用百分比設(shè)置它

3、background-position-x:

小于等于0%表示光柱在右邊緣(或者更右邊),大于等于100%表示光柱在左邊緣(或者更左邊)
由大數(shù)值改變成小數(shù)值就可以實現(xiàn)光柱從左向右移動的效果

4、動畫

background-position-x從160%移動到-20%
例如:原來的區(qū)塊寬度為 100px,高度為50px
background-size設(shè)置為 200% 100%后,光柱的運動場地大小為:200px 50px
動畫開始時,光柱位于 距離原區(qū)塊 左邊緣60px的地方
動畫結(jié)束時,光柱位于 距離原區(qū)塊 右邊緣20px的地方

實現(xiàn)方法

我們可以通過一個flag變量來控制組件的切換
當(dāng)數(shù)據(jù)未載入時,渲染Skeleton組件
當(dāng)數(shù)據(jù)載入后,渲染原來的組件即可

詳細(xì)教程請參考視頻:【CSS】骨架屏效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 1.一些開放性題目 1.自我介紹:除了基本個人信息以外,面試官更想聽的是你與眾不同的地方和你的優(yōu)勢。 2.項目介紹...
    55lover閱讀 644評論 0 6
  • 介紹css的盒子模型 css的盒子模型有兩種:IE盒子模型,W3C盒子模型盒子模型:內(nèi)容(content),內(nèi)邊距...
    5b5072cc2c5b閱讀 556評論 0 0
  • 一、CSS中的屬性和取值 1.文本類屬性: text-align屬性:此標(biāo)簽內(nèi)容的水平對齊方式,內(nèi)容須為具體文字/...
    劉遠舟閱讀 522評論 0 1
  • display: none; 與 visibility: hidden; 的區(qū)別 聯(lián)系:它們都能讓元素不可見 區(qū)別...
    紋小艾閱讀 1,622評論 0 1
  • # CSS樣式規(guī)則overflow 使用HTML時,需要遵從一定的規(guī)范。CSS亦如此,要想熟練地使用CSS對網(wǎng)頁進...
    低調(diào)迷人的反派角色閱讀 1,021評論 0 1