txw/txw-mhzc-web/src/pages/index/components/SkeletonCard.vue
liulujian 2e4e544f38 refactor: 全局圆角收小,适配政府平台正式风格
卡片/面板/侧边栏/入口卡/统计卡: 12px/16px→6px
组件(EmptyState/SkeletonCard/StatsSummary): 12px/10px→6px
变量文件: @market-card-radius/@market-filter-radius/@gxnlpt-* 等
标签/按钮等小元素保持3-6px不变

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-05 00:11:08 +08:00

119 lines
2.1 KiB
Vue

<template>
<div class="skeleton-grid">
<div
v-for="n in count"
:key="n"
class="skeleton-card"
aria-hidden="true"
>
<div class="skeleton-line skeleton-line--title"></div>
<div class="skeleton-line skeleton-line--meta"></div>
<div class="skeleton-line skeleton-line--desc"></div>
<div class="skeleton-line skeleton-line--desc skeleton-line--short"></div>
<div class="skeleton-tags">
<div class="skeleton-tag"></div>
<div class="skeleton-tag"></div>
<div class="skeleton-tag skeleton-tag--small"></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'SkeletonCard',
props: {
/** 骨架卡片数量,默认 6 */
count: { type: Number, default: 6 },
},
};
</script>
<style lang="less" scoped>
.skeleton-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 24px;
}
.skeleton-card {
display: flex;
flex-direction: column;
min-height: 180px;
padding: 20px;
background: #fff;
border-radius: 6px;
}
.skeleton-line {
height: 14px;
border-radius: 4px;
background: linear-gradient(
90deg,
#f0f0f0 25%,
#e4e4e4 50%,
#f0f0f0 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s ease-in-out infinite;
&--title {
width: 55%;
height: 18px;
margin-bottom: 14px;
}
&--meta {
width: 35%;
height: 13px;
margin-bottom: 16px;
}
&--desc {
width: 90%;
height: 13px;
margin-bottom: 8px;
&--short {
width: 60%;
}
}
}
.skeleton-tags {
display: flex;
gap: 8px;
margin-top: 16px;
}
.skeleton-tag {
width: 48px;
height: 24px;
border-radius: 4px;
background: linear-gradient(
90deg,
#f0f0f0 25%,
#e4e4e4 50%,
#f0f0f0 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s ease-in-out infinite;
&--small {
width: 36px;
}
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
@media (max-width: 768px) {
.skeleton-grid {
grid-template-columns: 1fr;
gap: 12px;
}
}
</style>