加载内容之前显示的占位符(骨架)UI 组件。 添加光线流畅运行的微光动画可以让用户在心理上感觉等待时间更短。
它是假设现代 Web 应用程序中经常使用的卡片式布局而创建的。
<div class="skeleton-card">
<div class="skeleton-header">
<div class="skeleton-avatar skeleton-shimmer"></div>
<div class="skeleton-title-container">
<div class="skeleton-title skeleton-shimmer"></div>
<div class="skeleton-subtitle skeleton-shimmer"></div>
</div>
</div>
<div class="skeleton-body">
<div class="skeleton-text skeleton-shimmer"></div>
<div class="skeleton-text skeleton-shimmer"></div>
<div class="skeleton-text short skeleton-shimmer"></div>
</div>
</div>
/* 整体卡片风格 */
.skeleton-card {
width: 100%;
max-width: 360px;
background: #ffffff;
border-radius: 16px;
padding: 24px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);
display: flex;
flex-direction: column;
gap: 20px;
}
/* ダークモード対応 */
[data-theme="dark"] .skeleton-card {
background: #1a1a2e;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
}
/* スケルトンのベースとアニメーションの起点 */
.skeleton-shimmer {
background-color: #e0e0e0;
border-radius: 8px;
position: relative;
overflow: hidden;
}
[data-theme="dark"] .skeleton-shimmer {
background-color: #2a2a40;
}
/* シマー(光が走る)エフェクト */
.skeleton-shimmer::after {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
transform: translateX(-100%);
background-image: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0,
rgba(255, 255, 255, 0.4) 20%,
rgba(255, 255, 255, 0.6) 60%,
rgba(255, 255, 255, 0)
);
animation: shimmer 2s infinite;
}
[data-theme="dark"] .skeleton-shimmer::after {
background-image: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0,
rgba(255, 255, 255, 0.05) 20%,
rgba(255, 255, 255, 0.1) 60%,
rgba(255, 255, 255, 0)
);
}
@keyframes shimmer {
100% {
transform: translateX(100%);
}
}
/* ヘッダー部分(アバターとタイトル) */
.skeleton-header {
display: flex;
align-items: center;
gap: 16px;
}
.skeleton-avatar {
width: 48px;
height: 48px;
border-radius: 50%;
flex-shrink: 0;
}
.skeleton-title-container {
flex-grow: 1;
display: flex;
flex-direction: column;
gap: 10px;
}
.skeleton-title {
height: 16px;
width: 60%;
}
.skeleton-subtitle {
height: 12px;
width: 40%;
}
/* ボディ部分(テキスト行) */
.skeleton-body {
display: flex;
flex-direction: column;
gap: 12px;
}
.skeleton-text {
height: 14px;
width: 100%;
}
.skeleton-text.short {
width: 80%;
}