skeletonizer 原型

1 · 文字骨头:skz-text 与 skz-text-mode

同一份内容,每个元素都标了 skz-text;四个根各自写不同的 skz-text-mode,文字统一用 <span skz-text> 包在块元素内层;round(默认,行内元素每行圆角,直接标在块元素上则是整块圆角矩形,见右下角对照;浏览器不支持 box-decoration-break 时自动退回 clip)、clip、underline、leaf(顶部「文字模式」不影响本节;显式 skz-text 要档位 ≥「第 1 档」才出条)。看粗细、垂直位置、不同字号、混合文字、嵌套、最后一行。已知局限:雅黑 / Segoe UI / system-ui 下 round 的条比 clip 高约 0.1~0.16em;line-height 1.2 时多行条可能相互叠出凹口。

round(默认)

clip

underline

leaf(叶子背景)

round 下:标在块元素 vs 内包 span

① <p skz-text> 直接标在块元素上:整块圆角矩形,看不出文字长短。

这是一段比较长的正文,在窄容器里折成好几行,整块的条完全看不出最后一行有多长。

② <p><span skz-text> 内包 span(推荐):每行一条,最后一行较短。

这是一段比较长的正文,在窄容器里折成好几行,每行一条,最后一行明显比前面短。

2 · 卡片:skz-text 容器 + skz-bone

头像(Bone.image 透明图)、星标图标、按钮写 skz-bone;昵称、时间、简介的文字各包一层 skz-text。卡片自己的边框背景保留。

3 · 媒体:skz-bone

img(透明 mock 图 / 真实图片)、内联 svg、video、canvas、input、button 都写 skz-bone。观察真实图片能否被藏起来;小标题写 skz-ignore,保持可读。

img · Bone.image(160,100)

img · 真实图片(没 mock)

svg

video

canvas

input / button


4 · 标记:skz-text / skz-bone / skz-leaf / skz-ignore

skz-text:写在行内元素(span)上,整个子树的文字按行出条;skz-bone:整块当骨头;skz-leaf:整块并藏起子树;skz-ignore:原样显示、可交互。

skz-ignore(Logo 保持原样)

⌘ Brand Logo

这段会变骨头:欢迎回来,今天也要加油。

skz-leaf(整块合并)

订单 #8841
3 件商品 · ¥ 128.00
预计明天送达

skz-bone(装饰 div 当骨头)

上面是渐变装饰条,没有标记时不会被识别。

skz-text(行内元素上标一次,覆盖混合内容)

价格:¥ 5.00 起,包邮。外层 斜体中的 加粗 内容 收尾,换行时最后一行会变短。

5 · Web Component(Shadow DOM)

demo-card 内部有 shadow DOM。给宿主写 skz-host 标记:宿主 visibility:hidden + ::before 铺骨头,样式是 CSS 里静态写好的。

5.4 · shimmer 光带行程对照(even 模式)

顶部效果选 shimmer、光带模式选 even 时看:两排都是宽 420px 的根里放几个小骨头,只差光带一轮的行程参考宽度(100cqw)。第一排没有容器,100cqw 等于视口宽,屏越宽空等越久;第二排根上写了 container-type: inline-size,按根自己的宽度走,几乎不空等。

没有容器:100cqw 等于视口宽(与以前的 100vw 相同)

根上 container-type: inline-size:按根的内容宽度(约 390px)走

5.5 · <skz-box> 自定义元素(skeletonizer/element)

不调用 enable():宿主 <skz-box> 只认自己的 loading / effect / text / engine 等属性,skz 落在它的第一个元素子节点上。顶部开关通过 el.loading 与属性同步过来;需要先 import "skeletonizer"(或 lite)再 defineSkzBox()。

<skz-box> 包着的卡片

由 defineSkzBox() 注册

宿主只负责开关,骨架状态作用在里面这张卡片上。

6/7 · 动画与 Bone mock

顶部切换 fade(默认,根级 opacity,几乎零成本)/ solid / pulse / shimmer。下面的文字全部由 Bone 生成(确定性、不用 Math.random),写 skz-text 出条;小标题写 skz-ignore。

8 · skz-auto 写在根上的边界场景

根自身写了 skz-auto,档位切换在这里才有效果:切到「无推导」时这里什么都不显示(骨头全靠推导规则)。根的直接子元素依次是:普通块 / 绝对定位悬浮角标 / display:contents 包装 / canvas / 裸文字。

普通块:直接子元素一
NEW

display:contents 包装里的段落一

段落二

这是直接放在根下的裸文字,没有被元素包住。

9 · fit:不撑出滚动条

同一个 100 项列表骨架放进三种容器——固定高度滚动容器(300px overflow:auto)、无确定高度的普通 div(靠页面/视口)、应用壳布局(固定高度的 flex 列,标题下面 flex:1 的区域负责滚动,常见于后台/App 页面);每个带 fit 开关对比。每个列表项里用 <span skz-text> 包文字。开启 fit 后骨架不会把容器撑出滚动条,多余项会被 display:none。本区在页面靠后(首屏以下),页面本来就能滚,所以「普通 div」放宽为一屏高;容器内的两个贴着容器底边。

固定高度 (300px overflow:auto)

普通 div (靠页面/视口)

应用壳:标题 + flex:1 滚动区

10 · skz-auto:第三方组件

左:无法加标记的第三方组件,外层写 skz-auto,按标签清单推导(档位切换在这里有效)。已知局限:清单外的裸文字(div / code / 自定义元素里直接写的文字)在 round / clip 下不可见,空 div 做的头像 / 色块不识别,要自己写 skz-text / skz-bone 补上。中、右:忽略区放在 skz-text 元素里,它的文字会压在骨头条上(不再关掉祖先的下划线);想要干净的忽略区,拆成兄弟元素。

第三方组件(外层 skz-auto)

裸 div 里的标题文字

段落文字会出骨头,行内 span 也会。

code 里的裸文字:不可见

忽略区在 skz-text 内

价格 实时 ¥ 5.00 起,包邮

整行都有骨头条,实时那段的真实文字压在条上。

推荐:拆成兄弟元素

价格 实时 ¥ 5.00 起,包邮

骨头条和忽略区互不重叠。