parent
0c5aa2ba6a
commit
923e854bd0
@ -0,0 +1,270 @@ |
||||
<template> |
||||
<view> |
||||
<view v-if="loading" class="skeleton" :class="{ animate: animate,margin16:!isClassify }" :style="{ justifyContent: flexType}"> |
||||
<!-- 轮播图 --> |
||||
<view |
||||
v-if="imgTitle" |
||||
class="skeleton-imgTitle" |
||||
style="width: 95%;border-radius: 10px;height: 100px;display: block;" |
||||
></view> |
||||
<!-- 头像图 --> |
||||
<view |
||||
v-if="showAvatar && !imgTitle" |
||||
class="skeleton-avatar" |
||||
v-for="(item, index) in nameRow" |
||||
:key="index" |
||||
:class="[avatarShape]" |
||||
:style="{ width: avatarSize, height: avatarSize}" |
||||
></view> |
||||
<!-- 文字条 --> |
||||
<view class="skeleton-content" v-if="showTitle && !imgTitle"> |
||||
<view class="skeleton-title" :style="{ width: titleWidth }"></view> |
||||
<view class="skeleton-rows"> |
||||
<view |
||||
class="skeleton-row-item" |
||||
v-for="(item, index) in rowList" |
||||
:key="index" |
||||
:style="{ width: item.width }" |
||||
></view> |
||||
</view> |
||||
</view> |
||||
|
||||
<view v-if="isClassify" |
||||
class="classify-avatar" |
||||
> |
||||
<view class="top dis-flex"> |
||||
<view class="top-con" v-for="(item,index) in [1,2,3,4,5,6,7,8,9]" :key="index"> |
||||
<view class="img"> |
||||
|
||||
</view> |
||||
<view class="title"></view> |
||||
</view> |
||||
|
||||
</view> |
||||
<view class="dis-flex boto"> |
||||
<view class="left"> |
||||
|
||||
</view> |
||||
<view class="right flex-1 dis-flex"> |
||||
|
||||
<view class="ri-top"> |
||||
|
||||
</view> |
||||
<view class="dis-flex ri-item"> |
||||
<view class="skeleton-avatar "></view> |
||||
<view class="skeleton-rows"> |
||||
<view |
||||
class="skeleton-row-item" |
||||
v-for="(item, index) in rowList" |
||||
:key="index" |
||||
:style="{ width: item.width }" |
||||
> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
</view> |
||||
<view v-else><slot></slot></view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
const DEFAULT_ROW_WIDTH = '100%' |
||||
const DEFAULT_LAST_ROW_WIDTH = '80%' |
||||
|
||||
export default { |
||||
props: { |
||||
loading: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
isClassify:{ |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
imgTitle: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
nameRow:{ |
||||
type: Number, |
||||
default: 1, |
||||
}, |
||||
flexType:{ |
||||
type: String, |
||||
default: 'flex-start', // center 居中 √ space-between 两端对齐 √ space-around 子元素拉手分布 √ flex-start 居左 flex-end 居右 |
||||
}, |
||||
showAvatar: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
avatarSize: { |
||||
type: String, |
||||
default: '50px', |
||||
}, |
||||
avatarShape: { |
||||
type: String, |
||||
default: 'round', // square | round |
||||
}, |
||||
showTitle: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
titleWidth: { |
||||
type: String, |
||||
default: '40%', |
||||
}, |
||||
row: { |
||||
type: Number, |
||||
default: 3, |
||||
}, |
||||
animate: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
}, |
||||
data() { |
||||
return {} |
||||
}, |
||||
computed: { |
||||
rowList() { |
||||
let list = [] |
||||
for (let i = 0; i < this.row; i++) { |
||||
list.push({ |
||||
width: i === this.row - 1 && i !== 0 ? DEFAULT_LAST_ROW_WIDTH : DEFAULT_ROW_WIDTH, |
||||
|
||||
}) |
||||
} |
||||
return list |
||||
}, |
||||
}, |
||||
} |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
|
||||
.classify-avatar{ |
||||
height: calc(100vh - 60px); |
||||
} |
||||
.boto{ |
||||
height: calc(100% - 150rpx); |
||||
} |
||||
.top{ |
||||
height: 150rpx; |
||||
overflow: hidden; |
||||
.top-con{ |
||||
height: 100%; |
||||
padding: 0 15rpx; |
||||
text-align: center; |
||||
|
||||
} |
||||
.img{ |
||||
width: 80rpx; |
||||
height: 80rpx; |
||||
padding: 2rpx; |
||||
margin: 0 0 10rpx; |
||||
background:var(--bg-color); |
||||
border-radius: 50% !important; |
||||
} |
||||
.title{ |
||||
height: 16px; |
||||
width: 80rpx; |
||||
border-radius: 8px; |
||||
background:var(--bg-color) ; |
||||
} |
||||
|
||||
} |
||||
|
||||
.left{ |
||||
width: 200rpx; |
||||
height: 100%; |
||||
background:var(--bg-color) ; |
||||
box-sizing: border-box; |
||||
margin: 0 20rpx; |
||||
border-radius: 8px; |
||||
} |
||||
.right{ |
||||
|
||||
padding: 16px; |
||||
height: 100%; |
||||
|
||||
.ri-top{ |
||||
|
||||
} |
||||
.ri-item{ |
||||
|
||||
} |
||||
|
||||
} |
||||
/* */ |
||||
.skeleton { |
||||
display: flex; |
||||
|
||||
--bg-color: #f2f3f5; |
||||
--row-height: 16px; |
||||
--row-margin-top: 16px; |
||||
} |
||||
|
||||
.margin16{ |
||||
margin: 16px 16px 0 16px; |
||||
} |
||||
|
||||
.skeleton-imgTitle { |
||||
flex-wrap: wrap; |
||||
background: var(--bg-color); |
||||
margin: 10px auto; |
||||
|
||||
} |
||||
.skeleton-avatar { |
||||
flex-shrink: 0; |
||||
background: var(--bg-color); |
||||
margin-right: 8px; |
||||
} |
||||
.skeleton-avatar.round { |
||||
border-radius: 50%; |
||||
} |
||||
|
||||
.skeleton-content { |
||||
width: 100%; |
||||
} |
||||
|
||||
.skeleton-title { |
||||
background-color: var(--bg-color); |
||||
height: var(--row-height); |
||||
} |
||||
|
||||
.skeleton-title + .skeleton-rows { |
||||
margin-top: var(--row-margin-top); |
||||
} |
||||
|
||||
.skeleton-rows { |
||||
} |
||||
|
||||
.skeleton-row-item { |
||||
background-color: var(--bg-color); |
||||
height: var(--row-height); |
||||
} |
||||
.skeleton-row-item:not(:first-child) { |
||||
margin-top: var(--row-margin-top); |
||||
} |
||||
|
||||
.skeleton.animate { |
||||
animation: skeleton-blink 1.2s ease-in-out infinite; |
||||
} |
||||
|
||||
@keyframes skeleton-blink { |
||||
0% { |
||||
opacity: 1; |
||||
} |
||||
50% { |
||||
opacity: 0.6; |
||||
} |
||||
100% { |
||||
opacity: 1; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,77 @@ |
||||
# skeleton |
||||
感谢原作者 https://ext.dcloud.net.cn/plugin?id=852 |
||||
|
||||
自己项目非常需要骨架,正好原作者发布了1.0 根据自己项目 自己修改了下。 |
||||
|
||||
目前仅支持: |
||||
1.轮播图 |
||||
2.分类栏 |
||||
3.头像 |
||||
4.文章条 |
||||
5.动态心情 |
||||
|
||||
以上是根据自己项目修改的,后续再拓展,或者自己根据自己项目修改,原作者写的还是很灵活的,修改方便! |
||||
|
||||
|
||||
## 属性说明 |
||||
|
||||
|属性名|类型|默认值|说明| |
||||
| -- | -- | --|--| |
||||
| loading | Boolean | true | 是否显示占位图 | |
||||
| flexType | String | flex-start | 排列方式 center 居中 √ space-between 两端对齐 √ space-around 子元素拉手分布 √ flex-start 居左 flex-end 居右 | |
||||
| imgTitle | Boolean | false | 轮播图占位图 | |
||||
| showAvatar | Boolean | true | 是否显示头像占位图 | |
||||
| nameRow | Number | 1 | 显示头像圆1个 | |
||||
| avatarSize | String | 50px | 头像站占位图大小 | |
||||
| avatarShape | String | round | 头像形状,可选值:round, square | |
||||
| showTitle | Boolean | true | 是否显示标题占位图 | |
||||
| titleWidth | String | 40% | 标题占位图宽度 | |
||||
| row | Number| 3 | 标题段落占位图行数 | |
||||
| animate | Boolean | true | 是否开启动画 | |
||||
|
||||
## 使用示例 |
||||
|
||||
```html |
||||
<skeleton |
||||
:loading="loading" |
||||
:avatarSize="skeleton1.avatarSize" |
||||
:row="skeleton1.row" |
||||
:showTitle="skeleton1.showTitle" |
||||
> |
||||
<view class="section-content">我是段落1</view> |
||||
</skeleton> |
||||
``` |
||||
|
||||
```javascript |
||||
import Skeleton from '../components/skeleton/index.vue' |
||||
export default { |
||||
components: { |
||||
Skeleton |
||||
}, |
||||
data() { |
||||
return { |
||||
loading: true, |
||||
skeleton1 : { |
||||
avatarSize: '52px', |
||||
row: 3, |
||||
showTitle: true, |
||||
} |
||||
} |
||||
}, |
||||
created() { |
||||
this.reloadData() |
||||
}, |
||||
methods: { |
||||
reloadData() { |
||||
this.loading = true |
||||
setTimeout(() => { |
||||
this.loading = false |
||||
}, 3000) |
||||
}, |
||||
}, |
||||
} |
||||
``` |
||||
|
||||
## 效果图 |
||||
|
||||
![](http://images.alisali.cn/img_20191014113211.png) |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue