:focus 伪类生效需元素可聚焦且未被禁用或只读,常见失效原因包括 disabled/readonly 状态、缺少 tabindex 或被高优先级样式覆盖;推荐统一处理 input:focus, textarea:focus, select:focus 并清除 outline,兼顾可访问性时可用 :focus-visible 回退方案。
直接用 :focus 就能生效,但浏览器默认焦点样式(比如 Chrome 的蓝色外框)常会干扰设计,必须显式覆盖;否则即使写了 :focus 样式,也可能被用户完全看不到。
:focus 却没反应?最常见原因是:输入框被禁用(disabled)、只读(readonly),或元素本身不可聚焦(比如没加 tabindex 且不是原生表单控件)。另外,某些 CSS 框架(如 Bootstrap)会重置 :focus 样式,需检查是否被更高优先级规则覆盖。
tabindex="0" 或是原生可聚焦元素(<input>、<textarea>、<button> 等)input:focus —— 若有多种输入类型(type="email"、type="number"),建议用 input:focus, textarea:focus, select:focus 统一处理:focus 和 :focus-visible 怎么选?:focus 在任何方式获得焦点时都触发(鼠标点击、Tab 键、JS .focus()),而 :focus-visible 只在“明确由键盘操作触发”时生效(例如按 Tab),对鼠标点击无效。这对可访问性很关键:你可能只想给键盘用户强化视觉反馈,而不干扰鼠标用户的界面干净度。
:focus,但记得同时清除默认 outline:outline: none
:focus-visible,且建议配合 :focus 回退(因为旧浏览器不支持):input:focus { outline: none;}input:focus-visible { outline: 2px solid #007bff;}
:focus 样式组合单纯改边框颜色容易被忽略,尤其在深色背景或小尺寸屏幕上。推荐组合使用边框、阴影和背景微调,确保对比度达标(WCAG AA 要求至少 3:1)。
立即学习“前端免费学习笔记(深入)”;
border-color,加上 box-shadow 提升辨识度:box-shadow: 0 0 0 2px rgba(0, 123, 191, 0.25)
background: #eef7ff),可能影响文字可读性;若真要改背景,用极浅透明色更稳妥:focus 触发较保守,有时需加 input:focus { outline: none; } + -webkit-appearance: none 才稳定生效:focus 是在元素自身上生效,不是父容器真正难的不是写对 :focus,而是判断什么时候不该用它:比如表单校验错误时,焦点样式该和错误态叠加还是分离?这时候往往得靠 JS 控制 class 切换,而不是只依赖伪类。