BEM的块名必须对应真实DOM结构,如header、product-card等语义化容器节点,确保可追溯、防样式穿透;修饰符需依附基础块/元素,子元素命名重职责轻视觉,层级限1层,便于调试与重构。
为什么BEM的块名必须对应真实DOM结构
BEM的
不是随便起的,它得是页面里真实存在的、有明确语义的容器节点。比如
、
、
——这些名字能直接在HTML里找到对应元素。如果硬套一个不存在的“逻辑块”(比如叫
但DOM里只有
),后续重构时根本没法反向追溯样式来源。
常见错误现象:
写得好好的,结果发现HTML里
只是个
,没加class;或者多个不相关的区域共用同一个块名,导致样式意外穿透。
检查方式:打开浏览器开发者工具,选中元素,看它的class是否以
开头(即块名),且该class确实存在于该元素上
重构友好做法:块名尽量和组件文件名、路由路径或数据模型字段对齐,比如React组件叫
,对应CSS块就用
避免用抽象词如
、
、
作块名,除非它们在项目约定中已有明确定义
修饰符(Modifier)不能脱离元素独立存在
这种写法看起来简洁,但如果HTML里只写
而漏了
,样式就失效——因为BEM修饰符是强依赖关系,它只是对某个
的补充状态,不是新组件。
使用场景:按钮禁用、卡片折叠、表单校验失败等临时状态变更。这类状态往往需要JS控制class增删,所以必须保证基础类始终存在。
立即学习
“
前端免费学习笔记(深入)
”;
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
正确写法:
,而不是
参数差异:
和
可以共存(
),但不要嵌套修饰符(禁止
)
容易踩的坑:用Sass写
时,若父选择器没定义
本身,编译后规则无效
子元素(Element)命名要反映职责,而非视觉位置
比
更安全,因为前者描述的是“菜单里的可操作单元”,后者一旦换成按钮或带图标的区块就名不副实。
也比
更通用,毕竟不是所有卡片都模仿Bootstrap的
结构。
性能影响不大,但语义偏差会显著拖慢重构节奏:当你想替换
为Flex布局时,发现它其实还承担着标题分隔线功能,而名字完全没提示这点。
判断标准:把
替换成“的”,读出来是否自然——
→ “表单的提交按钮”,合理;
→ “表单的底部栏”,模糊,建议改为
避免用
/
/
等方位词,布局方向可能随RTL或媒体查询变化
嵌套层级严格限制为1层:允许
?不允许。应为
,因为
属于
这个元素,不是
的子元素
如何用BEM快速定位一段失效样式的源头
当某个
的边框颜色没生效,别急着查CSS文件,先看它class是什么:
。这两个class已经锁定了三件事:它属于
块、是其中的
元素、当前处于
状态。接下来只需打开对应CSS文件,搜
,大概率10秒内找到目标规则。
相比传统命名(如
),BEM把上下文直接编码进名字里,省去了“这个class到底用在哪个模块”的推理过程。
调试技巧:在浏览器控制台输入
,快速验证是否命中预期规则
VS Code推荐插件:
,支持从HTML class跳转到SCSS中对应的选择器定义
最容易被忽略的一点:BEM本身不解决样式污染,仍需配合CSS Modules或Shadow DOM才能真正隔离;光靠命名规范,无法阻止
被全局重置样式覆盖
blockheaderproduct-cardsearch-formmain-sectiondiv.user-info__avataruser-infodiv class="container"xxxOrderSummary.jsxorder-summarysectionwrapperitembutton--disabledclass="button--disabled"buttonelementclass="button button--disabled"class="button--disabled"--large--primarybutton button--large button--primarybutton--primary--disabled{&--disabled { opacity: 0.5; }buttonmenu__itemmenu__linkcard__contentcard__bodycard-bodycard__footer__form__submit-buttonform__bottom-barform__actionsleftrighttoplist__item__textlist__item-texttextitemiteminputsearch-form__input search-form__input--errorsearch-forminputerrorsearch-form__input.input-errorgetComputedStyle(document.querySelector('.xxx__yyy')).borderColorBEM Tools.button--disabled