不该。BEM修饰符应描述组件自身状态差异,而侧边栏缩写是父级布局控制的响应式行为,需通过.sidebar--collapsed统一控制子元素显隐与样式,避免在元素名上硬加--collapsed导致耦合与维护困难。
--collapsed 修饰符不应该。BEM 的 --modifier 仅用于体现同一组件处于不同状态时的视觉或行为差异。缩写并非侧边栏自身状态,而是由父容器(如 .layout)控制的整体布局响应式切换结果,因此应让父级修饰符向下影响子元素,不应为每个菜单项强行添加 --collapsed。
常见的错误写法是:.sidebar__item--collapsed,其后果包括样式产生耦合、无法统一批量控制,以及响应式断点逻辑分散。
.sidebar--collapsed 作为整体的修饰符,然后通过后代选择器限制内部表现:.sidebar--collapsed .sidebar__logo、.sidebar--collapsed .sidebar__item
.sidebar__label 是否显示,而不是重新命名元素.sidebar--collapsed 上设 transition,子元素即可自然参与,不必重复声明核心是分离「结构」与「状态」:菜单项结构固定为 <div class="sidebar__item"><span class="sidebar__icon"></span><span class="sidebar__label">仪表盘</span></div>,缩写逻辑全由 .sidebar--collapsed 驱动。
CSS 示例片段:
立即学习前端免费学习笔记(深入);
.sidebar__label { opacity: 1; width: auto; overflow: hidden; white-space: nowrap;}.sidebar--collapsed .sidebar__label { opacity: 0; width: 0; padding: 0; margin: 0;}
opacity + width + padding/margin 组合完成平滑收起,相比单纯 display: none 更适合实现过渡动画.sidebar--collapsed .sidebar__icon,而不是另建一个 .sidebar__icon--collapsed
.sidebar--collapsed
媒体查询不负责手动添加类名,监听应交给 JavaScript resize 类一旦切换不当,服务端渲染便可能无法保持一致,同时还会遗漏并产生抖动。可靠性更高的是 @media 配合 prefers-reduced-motion 若环境支持,也能采用 CSS 容器查询,以容器宽度为依据;现阶段更常见的做法则是 class 切换 + JS 控制。
<body> 或 <div id="app">)监听窗口变化,并依据 window.innerWidth 判断是否 ≤ 768px,再为 .sidebar 添加或移除 --collapsed
resize 事件,以免窗口拖拽或页面滚动触发大量重排,进而产生卡顿matchMedia 回调不适合用来更改 DOM 类:监听器不易清理,执行时机也无法得到保证.sidebar__item-icon 比 .sidebar__icon 更容易产生问题因为 __item-icon 表达的是每个菜单项单独拥有一个图标,但图标实际上通常来自可高度复用的统一图标字体或 SVG sprite;缩写后若要统一居中并保持等宽,这类嵌套层级会缩小样式作用域并增加覆盖成本。
.sidebar__icon 按照 BEM 的原则,元素归块所有而不依赖父元素,因此命名应当保持扁平并便于复用.sidebar__icon--main、.sidebar__icon--sub,不能依靠层级进行区分.sidebar--collapsed .sidebar__icon 统一设 width/height,比逐一编写大量 .sidebar__item--collapsed .sidebar__item-icon 清楚得多.sidebar--collapsed 是否存在一并考虑,否则会产生可访问性问题。