Element 2 组件源码剖析之Skeleton骨架屏

简介

骨架屏组件Skeleton 常用于在需要等待加载内容的位置提供一个占位图形组合,可以被 Loading 完全代替,但是在可用的场景下可以提供更好的视觉效果和用户体验。

  • 网络较慢,需要长时间等待加载处理的情况下。
  • 图文信息内容较多的列表/卡片中。
  • 只在第一次加载数据的时候使用

本文将分析其源码实现,耐心读完,相信会对您有所帮助。 组件文档 Skeleton gitee源码

更多组件剖析详见 Element 2 源码剖析组件总览

组件源码

组件的 prop 声明,各属性功能说明详见官方文档skeleton#attributes 。

根组件 index.vue

根组件定义了两个部分,用于加载占位和真实DOM之间的切换:

  1. 用于展示骨架屏,提供具名template插槽用于自定义占位符。
  2. 用于展示真实组件UI,使用匿名插槽。

组件使用了v-bind="$attrs"实现了透传Attributes,用于父子组件的Attributes 继承。

// packages\skeleton\src\index.vue

骨架屏占位元素渲染通过内部属性uiLoading进行控制,该属性逻辑稍后详细介绍。

属性animated 用于生成样式类is-animated,控制占位元素是否动画效果。

.el-skeleton.is-animated .el-skeleton__item {
   background: linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);
   background-size: 400% 100%;
   animation: el-skeleton-loading 1.4s ease infinite
}

@keyframes el-skeleton-loading {
  0% {
    background-position: 100% 50%;
  }
  100% {
    background-position: 0 50%;
  }
}

占位元素渲染

默认情况下组件会渲染一条记录(属性count默认值为1),包含四个占位元素(属性rows默认值为4),默认为标签p样式。

首行会被渲染一个长度 33% 的段首;多行时末行会被渲染一个长度 61% 的段尾。

.el-skeleton__p.is-last {
  width: 61%;
}
.el-skeleton__p.is-first {
  width: 33%;
}

渲染效果如下图:

Element 2 组件源码剖析之Skeleton骨架屏_第1张图片

当渲染多条数据时,若未未自定义占位元素,会出现相邻记录的段尾和段首会出现在一行中(因为使用了