暗黑模式
Skeleton 骨架屏 1.2
手机扫码预览
21:26
组件名:rice-skeleton、rice-skeleton-item
在需要等待加载内容的位置设置一个骨架屏,给用户更好的体验。
平台兼容性
uni-app x
| Android | Android(Vapor) | iOS | iOS(Vapor) | HarmonyOS | HarmonyOS(Vapor) | 微信小程序 | h5 |
|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ |
基础用法
- 通过
rows配置骨架屏段落数量; show-title为true时,显示的数量会多1行, 首行会被渲染一个长度 33% 的段首,可以通过css变量(--rice-skeleton-title-width)自定义首行的宽度
html
<rice-skeleton :rows="2" show-title />
<!-- 通过css变量自定义首行show-title的宽度 -->
<rice-skeleton show-title style="--rice-skeleton-title-width:50%"/>动画效果
可选:- gradient(渐变,Android、iOS的非蒸汽模式不支持)/ flashed(闪烁渐隐渐现)/ none(无动画)
html
<!-- #ifdef VUE3-VAPOR || MP || WEB || APP-HARMONY -->
<rice-skeleton animate="gradient" show-title :rows="2" />
<!-- #endif -->自定义配置
通过 skeleton 插槽可以自定义配置大多数的结构
单元格骨架屏
vue
<template>
<rice-skeleton animate="gradient" v-for="item in 2" :key="item" style="margin-bottom:22px">
<template #skeleton>
<view class="skeleton-cell">
<rice-skeleton-item type="circle" />
<view class="skeleton-cell-item">
<rice-skeleton-item type="p" style="width: 50%;margin-bottom: 12px;" />
<rice-skeleton-item type="p" />
</view>
</view>
</template>
</rice-skeleton>
</template>
<style scoped lang="scss">
.skeleton-cell {
flex-direction: row;
align-items: center;
&-item {
flex: 1;
margin-left: 12px;
}
}
</style>宫格骨架屏
vue
<template>
<rice-skeleton animate="none">
<template #skeleton>
<view class="skeleton-grid">
<view v-for="item in 5" :key="item">
<rice-skeleton-item type="rect" class="skeleton-grid-rect" />
<rice-skeleton-item type="p" />
</view>
</view>
</template>
</rice-skeleton>
</template>
<style scoped lang="scss">
.skeleton-grid {
flex-direction: row;
align-items: center;
justify-content: space-between;
&-rect{
width: 52px;
height: 52px;
margin-bottom: 8px;
}
}
</style>图文骨架屏
vue
<template>
<rice-skeleton>
<template #skeleton>
<view class="skeleton-pic">
<view class="skeleton-pic-item" v-for="item in 2" :key="item">
<rice-skeleton-item type="image" image-icon-size="32px" style="width: 100%;height: 160px;" />
<rice-skeleton-item type="p" style="margin: 12px 0 8px;" />
<rice-skeleton-item type="p" style="width: 70%;" />
</view>
</view>
</template>
</rice-skeleton>
</template>
<style scoped lang="scss">
.skeleton-pic {
flex-direction: row;
align-items: center;
justify-content: space-between;
&-item {
width: 48%;
}
}
</style>显示子组件
当 loading 结束之后,可以通过 loading 属性的值来控制是否显示加载后的 DOM。
- 可以通过具名插槽 default 来构建 loading 结束之后需要展示的真实 DOM 结构;
- 也可以通过
v-if隐藏 骨架屏组件;
vue
<template>
<rice-skeleton :loading="!isLoaded" animate="flashed">
<template #skeleton>
<view class="skeleton-cell2">
<rice-skeleton-item type="image" class="logo-skeleton" />
<view class="skeleton-cell2-item">
<rice-skeleton-item type="p" style="width: 40%" />
<rice-skeleton-item type="p" style="margin-top: 8px;" />
<rice-skeleton-item type="p" style="margin: 8px 0;" />
<rice-skeleton-item type="p" style="width: 80%;" />
</view>
</view>
</template>
<!-- 真实 DOM 结构 -->
<template #default>
<view class="skeleton-cell2">
<image src="/static/images/logo.png" class="logo"></image>
<view class="skeleton-cell2-item">
<text class="title">RiceUI</text>
<text class="desc">基于 uniapp x 开发的多平台UI框架,同时兼容Android、iOS、HarmonyOS、微信小程序、h5;兼容APP端的蒸汽模式。
</text>
</view>
</view>
</template>
</rice-skeleton>
</template>
<script setup>
const isLoaded=ref(false)
</script>
<style scoped lang="scss">
.skeleton-cell2 {
flex-direction: row;
&-item {
flex: 1;
margin-left: 12px;
}
}
.logo-skeleton {
border-radius: 99px;
width: 55px;
height: 55px;
}
.logo {
width: 35px;
height: 35px;
}
</style>API
Skeleton Props
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| rows | Number | 配置骨架屏段落数量 | 3 |
| animate | String | 动画效果,可选:gradient(渐变,Android、iOS的非蒸汽模式不支持)/ flashed(闪烁)/ none(无动画) | flashed |
| showTitle | Boolean | 是否显示首行,首行会被渲染一个长度 33% 的段首,自定义skeleton插槽时无效 | false |
| loading | Boolean | 是否处于加载中 | true |
SkeletonItem Props
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| type | String | 可选:p/circle/rect/image | p |
| imageIconSize | String/Number | type 为 image 时,图标的大小 | 26px |
Slots
| 名称 | 说明 | 参数 |
|---|---|---|
| skeleton | 渲染 skeleton 模板的内容 | - |
| default | 真正渲染的DOM | - |
类型定义
组件导出如下类型
ts
// 组件类型
const skeletonRef=ref<RiceSkeletonComponentPublicInstance|null>(null)
const skeletonItemRef=ref<RiceSkeletonItemComponentPublicInstance|null>(null)