vue cli3 之 skeleton plugin

前言


前人栽樹后人乘涼菠齿,骨架屏到現(xiàn)在已經(jīng)非常多的解決方案佑吝,用之即可 ···

方式


  • 安裝插件vue-skeleton-webpack-plugin
  • vue.config.js配置
const path = require('path')
const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');
module.exports = {
  css: {
    // css拆分ExtractTextPlugin插件,默認(rèn)true - 骨架屏需要為true
    extract: true,
  },
  configureWebpack: (config)=>{
    // vue骨架屏插件配置
    config.plugins.push(new SkeletonWebpackPlugin({
      webpackConfig: {
        entry: {
          app: path.join(__dirname, './src/config/skeleton.js'),
        },
      },
      minimize: true,
      quiet: true,
    }))
  },
}
  • 新增一個(gè)骨架屏注入js文件绳匀,這里命名為skeleton.js芋忿,放置在config文件夾下
import Vue from 'vue';
import Skeleton from '../static/skeleton/skeleton-2';

export default new Vue({
  components: {
    Skeleton,
  },
  render: h => h(Skeleton),
});
<template>
  <div class="skeleton page">
    <div class="skeleton-nav"></div>
    <div class="skeleton-swiper"></div>
    <ul class="skeleton-tabs">
      <li v-for="i in 8" class="skeleton-tabs-item"><span></span></li>
    </ul>
    <div class="skeleton-banner"></div>
    <div v-for="i in 6" class="skeleton-productions"></div>
  </div>
</template>

<style>
.skeleton {
  position: relative;
  height: 100%;
  overflow: hidden;
  padding: 15px;
  box-sizing: border-box;
  background: #fff;
}
.skeleton-nav {
  height: 45px;
  background: #eee;
  margin-bottom: 15px;
}
.skeleton-swiper {
  height: 160px;
  background: #eee;
  margin-bottom: 15px;
}
.skeleton-tabs {
  list-style: none;
  padding: 0;
  margin: 0 -15px;
  display: flex;
  flex-wrap: wrap;
}
.skeleton-tabs-item {
  width: 25%;
  height: 55px;
  box-sizing: border-box;
  text-align: center;
  margin-bottom: 15px;
}
.skeleton-tabs-item span {
  display: inline-block;
  width: 55px;
  height: 55px;
  border-radius: 55px;
  background: #eee;
}
.skeleton-banner {
  height: 60px;
  background: #eee;
  margin-bottom: 15px;
}
.skeleton-productions {
  height: 20px;
  margin-bottom: 15px;
  background: #eee;
}

.skeleton {
  padding: 10px;
}
 
.skeleton .skeleton-head,
.skeleton .skeleton-title,
.skeleton .skeleton-content {
  background: rgb(194, 207, 214);
}
 
.skeleton-head {
  width: 100px;
  height: 100px;
  float: left;
}
 
.skeleton-body {
  margin-left: 110px;
}
 
.skeleton-title {
  width: 500px;
  height: 60px;
  transform-origin: left;
  animation: skeleton-stretch .5s linear infinite alternate;
}
 
.skeleton-content {
  width: 260px;
  height: 30px;
  margin-top: 10px;
  transform-origin: left;
  animation: skeleton-stretch .5s -.3s linear infinite alternate;
}
 
@keyframes skeleton-stretch {
  from {
    transform: scalex(1);
  }
  to {
    transform: scalex(.3);
  }
}
</style>
<template>
  <div class="skeleton">
    <div class="skeleton-head"></div>
    <div class="skeleton-body">
      <div class="skeleton-title"></div>
      <div class="skeleton-content"></div>
    </div>
  </div>
</template>

<style>
.skeleton {
  padding: 10px;
}

.skeleton .skeleton-head,
.skeleton .skeleton-title,
.skeleton .skeleton-content {
  background: rgb(194, 207, 214);
}

.skeleton-head {
  width: 100px;
  height: 100px;
  float: left;
}

.skeleton-body {
  margin-left: 110px;
}

.skeleton-title {
  width: 500px;
  height: 60px;
  transform-origin: left;
  animation: skeleton-stretch 0.5s linear infinite alternate;
}

.skeleton-content {
  width: 260px;
  height: 30px;
  margin-top: 10px;
  transform-origin: left;
  animation: skeleton-stretch 0.5s -0.3s linear infinite alternate;
}

@keyframes skeleton-stretch {
  from {
    transform: scalex(1);
  }
  to {
    transform: scalex(0.3);
  }
}
</style>
  • 為了加載效果更佳,避免瀏覽器加載css阻塞拟枚,在main.js新增如下配置
const app = new Vue({
  store,
  router,
  render: h => h(App)
})

// 骨架屏: 全局記錄掛在方法
window.mountApp = () => {
  app.$mount("#app");
};

// 骨架屏:如果js晚于css加載完成宣渗,那直接執(zhí)行渲染
if (process.env.NODE_ENV == "development" || window.STYLE_READY) {
  window.mountApp();
}


備注


到此骨架屏就完成了,這僅僅是固定樣式的骨架屏梨州,有時(shí)間再研究運(yùn)行時(shí)渲染方案
附:移動(dòng)端和pc端項(xiàng)目結(jié)構(gòu)

malk 2018-12-6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痕囱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暴匠,更是在濱河造成了極大的恐慌鞍恢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件每窖,死亡現(xiàn)場離奇詭異帮掉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窒典,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蟆炊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瀑志,你說我怎么就攤上這事涩搓。” “怎么了劈猪?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵昧甘,是天一觀的道長。 經(jīng)常有香客問我战得,道長充边,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任常侦,我火速辦了婚禮浇冰,結(jié)果婚禮上贬媒,老公的妹妹穿的比我還像新娘。我一直安慰自己肘习,他們只是感情好际乘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著井厌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪致讥。 梳的紋絲不亂的頭發(fā)上仅仆,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音垢袱,去河邊找鬼墓拜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛请契,可吹牛的內(nèi)容都是我干的咳榜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼爽锥,長吁一口氣:“原來是場噩夢啊……” “哼涌韩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氯夷,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤臣樱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腮考,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雇毫,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年踩蔚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棚放。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馅闽,死狀恐怖飘蚯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情福也,我是刑警寧澤孝冒,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拟杉,受9級特大地震影響庄涡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搬设,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一穴店、第九天 我趴在偏房一處隱蔽的房頂上張望撕捍。 院中可真熱鬧,春花似錦泣洞、人聲如沸忧风。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狮腿。三九已至抚官,卻和暖如春德崭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沛励。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工甩挫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贴硫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓伊者,卻偏偏與公主長得像英遭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子亦渗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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