BEM的核心是让类名自带语义边界,不依赖DOM层级,每个类名只描述单一职责,严格遵循block__element--modifier三段式结构,确保组件自治与可复用性。为什么改HTML就崩样式?BEM不是加前缀那么简单根本原因是传统CSS选择器过度依赖DOM层级,比如 .sidebar .item a:hover 这种写法,一旦把 a 换成 button,或者把 .item 提到 .sidebar 外层,样式立刻失效。BEM要解决的不是"怎么起名",而是让每个类名自带语义边界,不靠父容器、不靠兄弟关系、不靠标签类型。block__element--modifier 这套命名到底怎么落地关键在「每个类名只描述一个职责」,且三段式结构必须严格对应组件层级。常见错误是把状态(如 is-active)和视觉变体(如 --large)混在同一层,或者给 __element 套嵌套选择器。block 必须是独立可复用的组件,比如 header、card、form-field__element 只能是 block 的直属子内容,不能跨级,例如 card__title 合法,card__title__icon 违规(应拆成 card__title-icon 或新 block)--modifier 只改变当前 block 或 __element 的表现,不触发布局重排,比如 button--primary、nav-item--disabled绝对不用 div.card__title 这类标签+类组合,所有样式只绑定类名遇到嵌套组件时,BEM怎么避免类名爆炸真实页面里常有 card 里套 list 再套 avatar,如果硬套三层BEM,类名会变成 card__content-list__item-avatar ------ 这已经违背BEM初衷。正确做法是承认「组件自治」:每个子组件保持自己完整的BEM结构。card 内部用 <div class="list"></div>,而不是 <div class="card__list"></div>子组件的样式完全独立,list 的CSS文件不引用 card 的任何变量或选择器若需微调(如 card 里 list 的间距),用 modifier 控制: <div class="list list--in-card"></div>,而非加深选择器工具链上可用 PostCSS 插件(如 postcss-bem)自动补全,但别依赖它生成嵌套类名CSS-in-JS 或 Tailwind 下,BEM还有没有意义有,但作用点变了。BEM在传统CSS里防样式污染,在现代方案里更多是统一团队对「什么算一个UI单元」的认知。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
ltl4 分钟前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuningttod_qzstudio17 分钟前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 staticjufeng13071 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 1 篇】灯澜忆梦2 小时前
【MySQL10】进阶篇 | 索引_#2性能优化月光船幽幽2 小时前
影子模式下保护 logits 不被修改C++ 老炮儿的技术栈3 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链MC皮蛋侠客3 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构_oP_i4 小时前
python 后缀 mjs文件北斗落凡尘5 小时前
如何使用LangGraph(1)zt1985q5 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问