Files
xk-doctor-wx/subPackages/sub_business_shared/components/ListSkeleton.vue

157 lines
3.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<!--
列表骨架屏 type 模拟订单卡等放在业务分包以控制主包体积
order 类型对齐商品订单卡片结构顶栏/正文/底栏
-->
<view class="list-skeleton" :class="'list-skeleton--' + type">
<view
v-for="i in rowCount"
:key="i"
class="sk-row"
:class="'sk-row--' + type"
>
<template v-if="type === 'order'">
<view class="sk-order-head">
<view class="sk-line sk-line--md sk-shimmer"></view>
<view class="sk-line sk-line--xs sk-shimmer"></view>
</view>
<view class="sk-order-body">
<view class="sk-line sk-line--lg sk-shimmer"></view>
<view class="sk-line sk-line--sm sk-shimmer"></view>
<view class="sk-line sk-line--md sk-shimmer"></view>
</view>
<view class="sk-order-foot">
<view class="sk-line sk-line--xs sk-shimmer"></view>
<view class="sk-line sk-line--price sk-shimmer"></view>
</view>
</template>
<template v-else>
<view class="sk-line sk-line--lg sk-shimmer"></view>
<view class="sk-line sk-line--md sk-shimmer"></view>
<view class="sk-line sk-line--sm sk-shimmer"></view>
</template>
</view>
</view>
</template>
<script>
export default {
name: 'ListSkeleton',
props: {
/** 骨架样式order=订单卡default=通用三行 */
type: {
type: String,
default: 'order',
validator(v) {
return ['order', 'default'].indexOf(v) !== -1
},
},
/** 行数 */
rows: {
type: [Number, String],
default: 4,
},
},
computed: {
rowCount() {
const n = Number(this.rows)
return n > 0 ? n : 4
},
},
}
</script>
<style lang="scss" scoped>
.list-skeleton {
width: 100%;
padding: 0 24rpx 24rpx;
box-sizing: border-box;
}
.sk-shimmer {
background: linear-gradient(90deg, #ebebeb 25%, #f5f5f5 50%, #ebebeb 75%);
background-size: 400% 100%;
animation: sk-shimmer 1.4s ease infinite;
}
@keyframes sk-shimmer {
0% {
background-position: 100% 0;
}
100% {
background-position: 0 0;
}
}
.sk-row--order {
background: #fff;
border-radius: 20rpx;
padding: 28rpx 24rpx;
margin-bottom: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.03);
}
.sk-order-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
}
.sk-order-body {
margin-bottom: 24rpx;
}
.sk-order-foot {
display: flex;
justify-content: space-between;
align-items: center;
}
.sk-row--default {
background: #fff;
border-radius: 16rpx;
padding: 28rpx 24rpx;
margin-bottom: 20rpx;
}
.sk-line {
height: 24rpx;
border-radius: 6rpx;
margin-bottom: 16rpx;
&:last-child {
margin-bottom: 0;
}
}
.sk-line--lg {
width: 70%;
}
.sk-line--md {
width: 50%;
}
.sk-line--sm {
width: 90%;
}
.sk-line--xs {
width: 120rpx;
height: 22rpx;
margin-bottom: 0;
}
.sk-line--price {
width: 140rpx;
height: 32rpx;
margin-bottom: 0;
}
.sk-order-head .sk-line--md {
width: 45%;
margin-bottom: 0;
}
</style>