极简骨架

skeleton · minimal · 灵感来源:Skeleton Screen 模式 + 本站材质配方

数据到达后整块替换,不闪烁。

复用卡

Skeleton Screen · 极简骨架 · 骨架 / Minimal

规格 · 术语提示词(给 AI 用)

做一个 Skeleton Screen(极简骨架):
- role=status + aria-busy,占位块全部 aria-hidden,读屏只播一句加载状态
- avatar + lines 还原最终版式;行宽递减,最后一行天然变短
- 静态占位不闪烁,减少动效下无需额外降级
- 单一凹陷灰,没有边框、阴影与模糊
用这些 CSS 变量:--color-text-muted --glass-recess
灵感参考:Skeleton Screen 模式 + 本站材质配方

参数(CSS 变量)

--color-text-muted --glass-recess

必缺状态

(无必缺状态)

整页场景

(尚未接进整页场景)

安装(一条链接)

参考(本站可核对)

调研笔记

极简骨架

拆解

  • role="status" + aria-busy="true" + aria-label;占位块全部 aria-hidden
  • avatar 控制头像位,lines 控制正文行数;行宽 100 / 86 / 72 … 递减
  • 静态占位,不闪烁;加载状态只用形状表达,不和时间赛跑

材质

  • 占位块:--glass-recess 单一凹陷灰,没有边框、没有阴影、没有模糊
  • 头像与正文行同色;和极简卡片的白底只差一层灰

边界

  • 只适合最终版式已知的容器
  • 不做 shimmer;减少动效下无需额外处理
  • 行数只是占位,不承诺最终内容

变量:--glass-recess。

实现

skeleton/minimal
interface Props {
  /** 正文行数 */
  lines?: number;
  /** 左侧头像位 */
  avatar?: boolean;
  label?: string;
  className?: string;
}

/**
 * 极简骨架:加载中的占位块。
 * 保持最终版式的高度与节奏,数据到达后整块替换;不做闪烁。
 */
export function MinimalSkeleton({
  lines = 3,
  avatar = false,
  label = '加载中',
  className = '',
}: Props) {
  return (
    <div
      role="status"
      aria-busy="true"
      aria-label={label}
      className={`flex items-start gap-3 ${className}`}
    >
      {avatar && (
        <span
          aria-hidden="true"
          className="size-10 shrink-0 rounded-full bg-[var(--glass-recess)]"
        />
      )}
      <div className="flex-1 space-y-2.5 pt-0.5">
        {Array.from({ length: lines }).map((_, i) => (
          <span
            key={i}
            aria-hidden="true"
            className="block h-3 rounded-full bg-[var(--glass-recess)]"
            style={{ width: `${Math.max(42, 100 - i * 14)}%` }}
          />
        ))}
      </div>
    </div>
  );
}

元信息

标识
skeleton/minimal
状态
done
最后提交
2026-11-01
风格轴
minimal
依赖 token
--color-text-muted --glass-recess
在工作台打开 源码与 notes 都在 src/components/skeleton/minimal/