bootstrap 5+用d-{breakpoint}-none控制响应式隐藏,如d-md-none表示仅在中等屏及以上隐藏;d-sm-block d-md-none实现仅小屏显示;d-sm-none在≥576px生效,故手机上仍显示。

用 d-{breakpoint}-none 控制响应式隐藏最直接
Bootstrap 5+ 彻底移除了 .hidden-xs、.visible-lg 这类旧名,统一用 d- 前缀的 display 工具类。想“只在中等屏及以上隐藏”,就写 d-md-none;想“仅小屏显示”,得组合 d-sm-block d-md-none——先让小屏生效,再在更大断点主动关掉。
常见错误是写了 d-sm-none 却发现手机上元素还在:因为 d-sm-none 只在 ≥576px(即 sm 断点起始)时生效,而多数手机屏幕宽度 d-none d-sm-block(默认全隐藏,仅 sm+ 显示),或明确排除 xs。
-
d-none:所有尺寸都隐藏,慎用——它会覆盖后续任何d-{breakpoint}-*类 -
d-sm-none:仅当视口 ≥576px 时隐藏 -
d-md-block:仅当视口 ≥768px 时设为display: block,常配合d-none使用 - 多个类可共存,CSS 层叠按断点顺序生效,高断点类优先级更高
d-none 和 invisible 的本质区别在哪
两者触发的是完全不同的 CSS 属性:d-* 类操作 display,invisible 操作 visibility: hidden。这意味着前者从布局流中彻底消失,后者仍占位、仍影响 margin/padding/flex 排列,甚至会让 getBoundingClientRect() 返回非零值。
用错会导致布局跳动或键盘焦点异常。比如做“切换显示/隐藏但不希望周围元素上移”,invisible 更合适;但若目标是“表单提交后彻底移除整个步骤区块”,d-none 更干净。
ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键
-
d-none:不占空间、不可聚焦、子元素不渲染、读屏器不可见 -
invisible:仍占文档流位置、可被聚焦(除非额外加tabindex="-1")、读屏器仍能访问 - 别混用——
invisible的优先级高于d-sm-none,可能覆盖响应式行为
为什么手写 display: none 有时不生效
因为 Bootstrap 的响应式工具类(如 d-md-block)默认带 !important(v5.3+),你自定义的 div { display: none; } 很可能被覆盖。更糟的是,如果加载顺序不对,或者媒体查询断点值没对齐(比如你写 @media (min-width: 769px),而 Bootstrap 的 md 是从 768px 开始),行为就会错位。
最稳妥的做法是坚持用原生类组合,比如 d-none d-lg-block 实现“仅桌面显示”。必须手写媒体查询时,直接抄 Bootstrap 的断点值:xs: 0、sm: 576px、md: 768px、lg: 992px、xl: 1200px、xxl: 1400px,且 max-width 要留 0.02px 余量,避免边界像素(如 992px)出现双显或双隐。
- 自定义样式需加
!important才可能赢过 Bootstrap 类 - 原生媒体查询必须严格对齐断点数值,否则响应逻辑失效
- 内联
style="display: none"会破坏响应式断点控制,应避免
JS 动态切换 d-none 容易踩的坑
用 el.classList.add('d-none') 看似简单,但容易和已有响应式类冲突。比如元素已带 d-sm-none 和 d-lg-block,你加了 d-none 后又删掉,它在小屏依然隐藏——因为 d-sm-none 还在。
更隐蔽的问题出在 SSR 场景:服务端根据 UA 判断是手机并加了 d-none,客户端 JS 却按桌面逻辑运行,水合时就会 mismatch,报错类似 “Text content does not match server-rendered HTML”。调试时可临时禁用 JS,看纯 HTML 是否符合预期。
- 动态切换前,建议先
el.classList.remove(...)清掉所有d-类再设置新组合 - 检查是否生效,别依赖
offsetHeight,用el.offsetParent === null更可靠 - SSR 项目中,权限或设备判断逻辑必须服务端与客户端一致,不能依赖 localStorage
d-xs-none、d-mobile-none 这类根本不存在;动画过渡不支持 display 直接切换,想淡出得配 opacity + visibility;d-none 会阻止表单字段提交,隐藏但需保留值的场景该用 visually-hidden 或 aria-hidden="true" 配合绝对定位。










