HTML中的焦点管理

前言

焦点作为页面交互中的重要一环,涉及到的知识点也比较多,有必要做一个统一的总结。

HTML 中的可获取焦点的元素

  • 具有 href 属性的 HTMLAnchorElement/HTMLAreaElement
  • 非禁用态的 HTMLInputElement/HTMLSelectElement/HTMLTextAreaElement/HTMLButtonElement
  • HTMLIFrameElement(虽然将其聚焦没有任何有用的效果)
  • 具有 tabindex 属性的任何元素。

焦点的获取

HTML 规范中将 focus 聚焦性分为三种类型:"编程可聚焦"、"单击可聚焦"和"顺序可聚焦"。

  • document 加载完成会获取到焦点
  • 用户点击获取焦点
  • 通过 js 的 element.focus()方法获取
  • 添加了 tabindex 的元素可通过 tab 切换获取焦点

其中,元素上 tabindex 的值设置有一定的考究:

CSS 中的焦点伪类

这里提一下, 聚焦的元素可以通过 css 中的:focus 与:focus-within 伪类来进行样式调整.

css 复制代码
/* 元素获取焦点时的样式 */
input:focus {
  border-color: #ff5733;
  outline: none;
}

/* 容器内有元素获得焦点时的样式 */
.container:focus-within {
  background-color: #f0f0f0;
}

在线效果预览

JS 获取当前聚焦元素

  • document.hasFocus(): 判断当前文档是否被聚焦
  • document.activeElement: 获取当前文档内的聚焦元素

失去焦点

blur()方法的作用是从元素中移走焦点。

  • 调用 blur()方法时,并不会把焦点转移到某个特定的元素上;仅仅是将焦点从调用这个方法的元素上面移走而已

  • focus 了 A 元素的时候其他元素会自动失去焦点

js 复制代码
document.querySelector("#btn1").addEventListener("click", () => {
  document.querySelector("#div1").focus();
});
document.querySelector("#btn2").addEventListener("click", () => {
  document.querySelector("#div1").blur();
});

焦点事件

不会冒泡的事件: focus, blur

会冒泡的事件: focus-in, focus-out

参考

相关推荐
shawxlee20 分钟前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
用户059540174461 小时前
把记忆存储的回归测试从手工换成 Playwright + GitHub Actions,线上缺陷降低 80%
前端·css
触底反弹1 小时前
🚀 从 DOM0 级到 React 合成事件:前端事件监听的 20 年演进史
前端·react.js·面试
kyriewen1 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试
颜酱1 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端
郝亚军3 小时前
如何安装webstorm、Node.js和vue CLI
前端·javascript·vue.js
IT_陈寒3 小时前
React的useEffect依赖项把我坑惨了
前端·人工智能·后端
东方小月3 小时前
从零开发一个Coding Agent:monorepo项目搭建
前端·后端·node.js
葬送的代码人生3 小时前
别再让 AI 瞎写代码了!Vibe Coding 三步法教你写出靠谱代码
前端·设计模式·架构
Shirley~~3 小时前
Code-Review-Graph:面向 AI 辅助代码审查的结构化上下文引擎
前端·ai编程