85 lines
1.8 KiB
Vue
85 lines
1.8 KiB
Vue
<template>
|
||
<!-- 首屏骨架:形状跟页面走,动画吃 effect.skeleton -->
|
||
<view class="sk" :class="'sk--' + mode">
|
||
<view
|
||
v-for="n in bars"
|
||
:key="n"
|
||
class="sk-bar"
|
||
:style="barStyle(n)"
|
||
/>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import { getActiveLayout, getActiveVars } from '@/utils/theme'
|
||
|
||
export default {
|
||
name: 'ThemeSkeleton',
|
||
props: {
|
||
/** home | catalog | product | cart | mine */
|
||
page: { type: String, default: 'catalog' },
|
||
count: { type: Number, default: 0 },
|
||
},
|
||
computed: {
|
||
mode() {
|
||
const effect = (getActiveLayout().effect) || {}
|
||
return effect.skeleton || 'shimmer'
|
||
},
|
||
vars() {
|
||
return getActiveVars()
|
||
},
|
||
bars() {
|
||
if (this.count > 0) return this.count
|
||
const map = { home: 6, catalog: 6, product: 4, cart: 3, mine: 3 }
|
||
return map[this.page] || 4
|
||
},
|
||
},
|
||
methods: {
|
||
barStyle(n) {
|
||
const soft = this.vars['--color-surface-soft'] || this.vars['--color-border'] || '#E7DFD3'
|
||
const tall = this.page === 'catalog' && n % 2 === 0
|
||
return {
|
||
background: soft,
|
||
height: tall ? '300rpx' : (n === 1 && this.page === 'home' ? '240rpx' : '80rpx'),
|
||
}
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.sk {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 16rpx;
|
||
padding: 16rpx;
|
||
}
|
||
.sk-bar {
|
||
width: 100%;
|
||
border-radius: 12rpx;
|
||
}
|
||
.sk--catalog .sk-bar {
|
||
width: calc(50% - 8rpx);
|
||
}
|
||
.sk--shimmer .sk-bar {
|
||
background-size: 200% 100%;
|
||
animation: sk-shimmer 1.6s linear infinite;
|
||
}
|
||
.sk--pulse .sk-bar {
|
||
animation: sk-pulse 1.8s ease-in-out infinite;
|
||
}
|
||
.sk--none .sk-bar {
|
||
animation: none;
|
||
opacity: 0.55;
|
||
}
|
||
@keyframes sk-shimmer {
|
||
0% { opacity: 0.55; }
|
||
50% { opacity: 0.95; }
|
||
100% { opacity: 0.55; }
|
||
}
|
||
@keyframes sk-pulse {
|
||
0%, 100% { opacity: 0.55; }
|
||
50% { opacity: 1; }
|
||
}
|
||
</style>
|