多选下拉框tag标签的“删除态”需用javascript控制is-removing类配合css过渡实现,不可单靠css;bem仅描述结构,状态管理应以data属性为主,类名仅负责样式。

多选下拉框的Tag标签删除态不是纯CSS能独立控制的状态
“删除态”在 BEM 命名中常被误写为 is-deleted 或 --deleted,但实际它不是一种静态样式状态,而是交互触发后的临时视觉反馈(比如鼠标悬停在 × 上、或点击后标签淡出)。BEM 本身不定义行为,只描述结构关系。真正需要处理的是:何时加类、何时移除、是否需过渡、是否要保留 DOM 节点。
正确做法是用 JavaScript 控制 is-removing 类 + CSS 过渡
原生 <select multiple></select> 不支持 Tag 标签,所以这里讨论的是自定义组件(如 formSelects、Metro UI 的 tag-input 或 jQuery 自研方案)。所有可靠实现都靠 JS 动态添加/移除类来驱动删除动画:
-
is-removing是最推荐的修饰符名,语义清晰且避免与可访问性属性aria-hidden冲突 - 不要用
is-deleted:该类若提前移除 DOM,会导致键盘焦点丢失或屏幕阅读器跳过过渡提示 - CSS 中必须配
transition: opacity .2s ease, transform .2s ease,否则is-removing无视觉效果 - 动画结束后再调用
element.remove(),否则 transition 不会触发
IE11 下 is-removing 类可能失效的两个原因
formSelects 在 IE11 中删除按钮错位是已知问题,但若你发现 is-removing 类加上后没反应,大概率是以下两者之一:
- IE11 不支持
transform: translateX(100%)配合opacity: 0的复合过渡,得拆成两个独立 transition 规则 - 父容器用了
display: flex但未设flex-wrap: wrap,导致标签被强制压缩,is-removing的 transform 偏移量计算异常 - 更隐蔽的坑:Metro UI 的
tag-input默认监听input元素的change事件,而 IE11 对动态插入的标签不触发该事件,需手动dispatchEvent(new Event('change'))
别把 BEM 类名当钩子,用 data 属性做真实状态标记
很多团队在 JS 里写 el.classList.contains('is-removing') 判断是否正在删除,这耦合太重。更健壮的做法是:
- 用
data-state="removing"替代is-removing类做逻辑判断(类只管样式) - 删除完成回调中统一清理:
el.removeAttribute('data-state'),而不是靠 classList 操作 - 如果要用 BEM 类,只用于 CSS:比如
.tag--removing定义动画,.tag__remove:hover定义悬停态
复杂点在于:同一个标签可能同时处于 “正在输入中”、“等待提交”、“已提交但服务端失败回滚” 多种状态,仅靠 BEM 类无法承载全部语义。data 属性才是状态管理的主干道。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











