Skeleton骨架屏在Vue中怎么实现动态高度?
我用Vue做列表加载,想加个骨架屏,但每个item的高度不一样,写死height又不灵活。
试过用:style="{ height: loading ? '60px' : 'auto' }",但切换时会跳动,体验很差。有没有办法让骨架屏自动撑开真实内容的高度?
现在骨架屏组件是这样写的:
<template>
<div v-if="loading" class="skeleton-item"></div>
<div v-else class="real-content">{{ item.text }}</div>
</template>
<style scoped>
.skeleton-item {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
animation: shimmer 1.5s infinite;
border-radius: 4px;
}
</style>
改一下你的组件结构:
关键点在于给两边都加相同的min-height,这样切换时至少有个保底高度,不会突然塌陷。min-height的值根据你的实际内容来定,比如你之前试的60px就挺合适。
如果你的内容高度差异特别大(比如有的特别长),可以考虑用更智能的方案:在加载完成后把真实内容的高度缓存下来赋给骨架屏:
不过这种方案第一次加载时还是会有轻微跳动,因为需要等内容渲染完才能拿到高度。第一种方案对于大多数场景已经够用了,简洁且效果还行。
这样加载时骨架屏高度就和真实内容一致了,切换不会跳。懒得监听数据变化的话mounted里直接写死也行。