跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何通过HTML的CSS :focus-within检测容器内任意子元素获得焦点的状态

:focus-within 能检测容器内任意可聚焦子元素是否获焦,无需 JS;但子元素必须真正可聚焦,如被 pointer-events: none、contain: layout、tabindex="-1" 或 disabled 等阻止则失效。 :focus-within 能直接检测容器内任意可聚焦子元素是否获得焦点,无需 JS,但必须确保子元素真能拿到焦点,否则它永远不触发。 子元素必须实际可聚焦,不是“看起来像能点” 常见失效场景是:input 被 pointer-events: none 挡住、父层加了 contain: layout、或子元素本身 tabindex="-1" 或 disabled。这些都会让浏览器判定“焦点没进入”,:focus-within 就不会匹配。
input
、
textarea
、
button
、
select
默认可聚焦;
div
、
span
等非表单元素需显式加
tabindex="0"
避免在祖先链上设置
contain: layout
或
contain: paint
,某些 Chrome/Firefox 版本会截断焦点传播 移动端 Safari 15.4–16.3 对
input[type="search"]
+
overflow: hidden
组合有 bug,建议降级为监听
focusin
:focus-within 匹配的是整个祖先链,不是只限直系父元素 如果 HTML 是
,那么点击
input
时,
form:focus-within
、
.card:focus-within
、
.field:focus-within
全部生效——不是只有最近一层父容器。 这能用来做嵌套菜单展开(如外层
.dropdown
+ 内层
.dropdown-menu
同时响应) 但要注意样式优先级:若
.field:focus-within input
和
input:focus
冲突,后者权重更高,可能覆盖前者 不要误以为
.card:focus-within
只在
.card
自身被 Tab 进去时才触发——它只看后代有没有焦点 和 JavaScript 的 focusin 事件不是一回事,别混用 :focus-within 是纯 CSS 状态,由浏览器同步维护;
focusin
是事件,能捕获脚本调用的
element.focus()
,但需要手动绑定、清理,且存在冒泡被阻止的风险。 使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件 如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更 下载 立即学习 “ 前端免费学习笔记(深入) ”; 仅改样式(边框、背景、阴影)→ 无条件选
:focus-within
,零成本、无内存泄漏、天然支持键盘导航 要记录埋点、清空其他区域错误提示、或控制第三方组件 → 必须用
focusin
监听在容器上,再用
event.target
判断是不是你关心的子元素 混用风险:比如 JS 主动
input.focus()
后立刻读
getComputedStyle(container).borderColor
,Safari 15.6 下可能有 1 帧延迟,值还是旧的 最易被忽略的一点::focus-within 不关心焦点“怎么来”,只认“有没有”。鼠标点、Tab 进、JS 调用 focus(),它都响应。但它也极度诚实——子元素只要没真正进入焦点管理树(哪怕只是被
visibility: hidden
遮住),它就沉默到底。

相关文章