dropdown菜单项默认无激活阴影,其:focus状态是添加阴影的唯一可靠入口;需清除默认focus ring并注意移动端聚焦延迟及父容器阴影干扰。

Dropdown菜单项本身没有激活阴影,别白改
Bootstrap 的 .dropdown-item 默认没有任何 box-shadow,无论 :active、:focus 还是 .active 状态。你看到的“阴影”大概率是误判:要么是父容器 .dropdown-menu 的整体阴影透出,要么是浏览器默认焦点环(outline + box-shadow)被当成 item 自身阴影。直接给 .dropdown-item:active 写 box-shadow 不会生效——因为没东西可盖。
真要加阴影,得用:focus或自定义class
Bootstrap 5 对 .dropdown-item 的视觉反馈逻辑是:点击后焦点保留在元素上,靠 :focus 触发样式(包括背景色和 focus ring)。所以想让“激活态”有阴影,必须作用于 :focus,而不是 :active:
-
.dropdown-item:focus是唯一可靠入口;:active只在鼠标按下瞬间存在,人眼几乎不可见 - 必须同时写
outline: none和box-shadow: none清掉 Bootstrap 默认 focus ring,否则新阴影会被覆盖 - 如果项目用了深色模式,建议用 CSS 变量控制:
--bs-dropdown-link-focus-box-shadow(Bootstrap 5.3+ 支持,旧版不生效) - 示例写法:
.dropdown-item:focus { outline: none; box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.25); }
移动端真机测试不能跳过
iOS Safari 和部分 Android 浏览器对 :focus 的触发逻辑和桌面不同:点击可能不立即聚焦,或聚焦延迟 300ms 以上,导致阴影“卡顿”或根本不出。解决办法只有两个:
- 给
.dropdown-item加tabindex="0",强制它可获得焦点(尤其对非<a></a>标签) - 放弃纯 CSS 方案,用 JS 监听
click或shown.bs.dropdown事件,动态加 class 并配阴影样式 - 真机测试时重点看点击后是否立刻响应——模拟器常骗人
别忘了 .dropdown-menu 的阴影会干扰效果
即使你给 .dropdown-item:focus 加了阴影,如果父级 .dropdown-menu 本身有强阴影(比如 box-shadow: 0 8px 20px rgba(0,0,0,.15)),item 的小阴影会被吃掉或视觉混淆。实际调试时得关掉 .dropdown-menu 的 box-shadow 单独验证 item 效果,再按需调和两者层级关系。











