| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- <template>
- <view class="client-skeleton" :class="[`client-skeleton--${variant}`]">
- <view v-if="variant === 'hero-list'" class="hero shimmer" />
- <view v-if="variant === 'hero-list'" class="block card">
- <view class="line line-lg shimmer" />
- <view class="line line-md shimmer" />
- </view>
- <template v-if="variant === 'list'">
- <view class="block card" v-for="i in rows" :key="`row-${i}`">
- <view class="row">
- <view class="thumb shimmer" />
- <view class="meta">
- <view class="line line-lg shimmer" />
- <view class="line line-md shimmer" />
- <view class="line line-sm shimmer" />
- </view>
- </view>
- </view>
- </template>
- <view v-if="variant === 'detail'" class="hero shimmer" />
- <view v-if="variant === 'detail'" class="block card">
- <view class="line line-xl shimmer" />
- <view class="line line-md shimmer" />
- <view class="line line-sm shimmer" />
- </view>
- </view>
- </template>
- <script setup>
- defineProps({
- variant: {
- type: String,
- default: 'list'
- },
- rows: {
- type: Number,
- default: 3
- }
- })
- </script>
- <style scoped lang="scss">
- .client-skeleton {
- width: 100%;
- display: block;
- min-width: 100%;
- padding: 24rpx 32rpx calc(24rpx + env(safe-area-inset-bottom, 0px));
- box-sizing: border-box;
- background: var(--c-bg, #f5f8f7);
- }
- .hero {
- height: 280rpx;
- width: 100%;
- border-radius: 24rpx;
- margin-bottom: 20rpx;
- background: #e8f1ed;
- }
- .block {
- width: 100%;
- margin-bottom: 16rpx;
- }
- .card {
- border: 1rpx solid #dcebe4;
- background: #fff;
- border-radius: 24rpx;
- padding: 18rpx;
- }
- .row {
- display: flex;
- gap: 16rpx;
- }
- .thumb {
- width: 132rpx;
- height: 132rpx;
- border-radius: 16rpx;
- background: #e8f1ed;
- flex-shrink: 0;
- }
- .meta {
- flex: 1;
- min-width: 0;
- }
- .line {
- height: 22rpx;
- border-radius: 999rpx;
- background: #e8f1ed;
- margin-bottom: 12rpx;
- }
- .line-xl {
- width: 78%;
- height: 34rpx;
- }
- .line-lg {
- width: 72%;
- }
- .line-md {
- width: 52%;
- }
- .line-sm {
- width: 38%;
- margin-bottom: 0;
- }
- .shimmer {
- position: relative;
- overflow: hidden;
- }
- .shimmer::after {
- content: '';
- position: absolute;
- inset: 0;
- transform: translateX(-100%);
- background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.55), rgba(255, 255, 255, 0));
- animation: skeleton-slide 1.15s infinite;
- }
- @keyframes skeleton-slide {
- 100% {
- transform: translateX(100%);
- }
- }
- </style>
|