合法的是 loading--spinner 和 loading--skeleton,前提是 loading 是已定义的独立 Block 且 CSS 中存在对应选择器;error--network 不合法,因 error 缺乏业务语义,应使用 form--error 或 search-form--error 等带明确上下文的命名。

loading--spinner 和 loading--skeleton 哪个合法?
合法的是 loading--spinner 和 loading--skeleton,但前提是 loading 是一个已定义的独立 Block,且 CSS 中存在对应选择器 .loading--spinner 和 .loading--skeleton。
常见错误是把 loading 当成通用前缀乱用:比如给按钮加 loading--spinner 却没声明 .loading 块,结果样式不生效——浏览器只认选择器,不认“听起来像加载”的名字。
-
loading必须是封装了状态逻辑和动画的独立组件块(如一个占位容器),不能是泛义工具名 - 不能写成
btn--loading-spinner这种跨块修饰符,它混淆了按钮和加载的职责边界 - 如果加载态依附于具体组件(如
user-card),应使用user-card--loading,而非硬塞loading--xxx
error--network 和 form--error 哪个该用?
form--error 合法,error--network 不合法——因为 error 不是一个 Block 名,它缺少业务语义和独立复用能力。
BEM 要求 Block 必须带明确业务含义(如 search-form、user-profile),不能是抽象状态词。直接用 error 作 Block 名,等于放弃样式隔离,极易被其他模块的 .error 覆盖。
立即学习“前端免费学习笔记(深入)”;
- 正确写法是
search-form--error(表单整体进入错误态)或search-form__input--error(仅输入框出错) - 修饰符名要可预测、可组合:
--error✅,--v2❌,--network-failed❌(太具体,难复用) - 不要用
form__error-message这类伪 Element——如果错误提示需复用,就抽成独立 Blockerror-banner,再用error-banner--inline控制形态
animation-name 怎么和 BEM 类名对齐?
直接绑定,不绕路。animation-name 的值必须和 @keyframes 名称完全一致,而这个名称最好就叫 loading-spinner 或 form-error-shake,和 BEM 修饰符同名。
这样 JS 控制时逻辑最直:添加类 loading--spinner → 触发 animation-name: loading-spinner → 动画播放。不用额外映射或拼字符串。
- 避免
@keyframes spin + loading--spinner这种错位,容易漏改一处导致动画静默 - 多个动画共存时(如
skeleton+fade-in),用逗号分隔:animation-name: loading-skeleton, fade-in,但需确保每个都定义且无名冲突 - 别用数字开头的动画名,如
@keyframes 2x-spin——CSS 标准禁止 IDENT 以数字开头,animation-name会解析失败
为什么不能用 loading--fetching 或 button--submitting?
因为 --fetching 和 --submitting 描述的是后台过程,不是可感知的 UI 形态;BEM 修饰符必须对应视觉上可识别、可复用的状态表现,而不是服务端响应阶段。
用户看不到 “fetching”,只能看到 “转圈” 或 “骨架屏”;按钮不会显示 “submitting”,只会显示 “禁用态 + spinner”。修饰符一旦脱离视觉反馈,就失去 BEM 的可调试性和协作确定性。
-
loading--spinner✅(有明确动效形态) -
button--loading✅(按钮整体进入加载态,内部自动渲染 spinner) -
button--submitting❌(无法在 DevTools 里一眼确认它对应什么 UI 变化) - 真要区分提交阶段,应在 JS 层控制不同修饰符组合:
button--loading button--submitting是冗余的,应由button--loading统一承载视觉逻辑
真正容易被忽略的,是修饰符必须和 Block 同时出现——单独写 loading--spinner 没有意义,它永远得搭配 loading 才能生效;而这个前提,在多人协作或组件拆分时最容易被遗忘。


















