:focus-within生效需父容器可聚焦,应加tabindex="-1"或使用原生可聚焦元素;子元素须真正获焦,避免display:contents等阻断;高亮推荐outline或box-shadow,禁用影响布局的属性。

直接写在父容器上,且该容器必须能参与焦点流——否则样式永远不会生效。
为什么:focus-within写在上却没反应
纯 <div> 默认不可聚焦,<code>:focus-within 无法触发。浏览器只会在“可聚焦上下文”中检测后代焦点,而原生 <div> 不属于该上下文。
<ul>
<li>✅ 正确做法:给父容器加 <code>tabindex="-1"(仅需一次,不干扰 tab 顺序)
❌ 错误写法:<div class="form-group"><input></div> + .form-group:focus-within,但没设 tabindex
⚠️ 注意:<form></form>、<fieldset></fieldset>、<label></label> 等原生可聚焦元素可直接用,无需额外加 tabindex
怎么确保子元素真能获得焦点
即使父容器加了 tabindex="-1",如果子 <input> 被阻断,:focus-within 仍不会匹配。
- 检查
<input> 是否被套了 display: contents 或 visibility: hidden 的 wrapper —— 这些会让浏览器无法确认焦点落点
- 确认没有意外设置
tabindex="-1" 或 pointer-events: none 在中间层 <div> 上
<li>在 DevTools 中点击输入框后,看 <code>:focus 是否真正落在 <input> 上(而非外层容器)
- React/Vue 自定义组件要透传
tabIndex,并确保渲染出的原生 <input> 没被拦截
高亮样式别改布局,优先用 outline 或 box-shadow
在 :focus-within 规则里修改 height、margin 或 display 容易引发重排,尤其在表格或嵌套结构中会跳动或错位。
- ✅ 推荐:
outline: 2px solid #007bff —— 不占空间、无重排、键盘导航友好
- ✅ 替代方案:
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25) —— 避免用 inset,否则会往里缩盖住文字
- ❌ 避免:
border: 2px solid #007bff 单独使用 —— 若原 border 是 1px,宽度变化会撑开容器;统一设 box-sizing: border-box 可缓解但不根治
- ⚠️ 别同时用
outline 和 border,视觉上容易糊成一团
别在
纯 <div> 默认不可聚焦,<code>:focus-within 无法触发。浏览器只会在“可聚焦上下文”中检测后代焦点,而原生 <div> 不属于该上下文。
<ul>
<li>✅ 正确做法:给父容器加 <code>tabindex="-1"(仅需一次,不干扰 tab 顺序)
<div class="form-group"><input></div> + .form-group:focus-within,但没设 tabindex
<form></form>、<fieldset></fieldset>、<label></label> 等原生可聚焦元素可直接用,无需额外加 tabindex
怎么确保子元素真能获得焦点
即使父容器加了 tabindex="-1",如果子 <input> 被阻断,:focus-within 仍不会匹配。
- 检查
<input>是否被套了display: contents或visibility: hidden的 wrapper —— 这些会让浏览器无法确认焦点落点 - 确认没有意外设置
tabindex="-1"或pointer-events: none在中间层<div> 上 <li>在 DevTools 中点击输入框后,看 <code>:focus是否真正落在<input>上(而非外层容器) - React/Vue 自定义组件要透传
tabIndex,并确保渲染出的原生<input>没被拦截 - ✅ 推荐:
outline: 2px solid #007bff—— 不占空间、无重排、键盘导航友好 - ✅ 替代方案:
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25)—— 避免用inset,否则会往里缩盖住文字 - ❌ 避免:
border: 2px solid #007bff单独使用 —— 若原border是1px,宽度变化会撑开容器;统一设box-sizing: border-box可缓解但不根治 - ⚠️ 别同时用
outline和border,视觉上容易糊成一团
高亮样式别改布局,优先用 outline 或 box-shadow
在 :focus-within 规则里修改 height、margin 或 display 容易引发重排,尤其在表格或嵌套结构中会跳动或错位。











