CSS伪类如:hover、:focus、:valid在内联样式中语法非法,浏览器直接忽略;内联样式仅支持property: value形式,伪类只能在外部CSS或块中定义并受元素类型、状态机及文档模式约束。

CSS伪类(如 :hover、:focus、:valid)在内联样式中根本不可用,不是“不生效”,而是语法非法——浏览器直接忽略。
内联样式写 :hover 会直接被浏览器丢弃
内联样式只能写属性-值对,不能包含选择器或伪类。例如:<div style=":hover { color: red; }"> 这种写法在 HTML 中完全无效,浏览器解析时会跳过整个声明,控制台通常无报错但也不生效。
<ul>
<li>
<code>style 属性只接受 property: value 形式,比如 color: red;:hover 是选择器的一部分,不属于该上下文
el.style.hover = 'color: red' 同样无效——el.style 对象没有 hover 这个可写属性style="is-hover: true"),也改变不了它不是 CSS 选择器的事实,无法触发样式计算外部样式表和 <style></style> 块是伪类唯一合法载体
只有在 CSS 规则块中,伪类才能被正确解析和应用。但即便如此,仍受加载与作用域限制:
- 外部 CSS 文件必须通过
<link rel="stylesheet">引入;@import在<style></style>块里虽能用,但会阻塞渲染,且不能在内联style标签里嵌套使用 -
<style></style>块内写button:hover { background: blue }是有效的,但若该<style></style>被 JS 插入到 Shadow DOM 内部,而按钮在 Light DOM,则伪类可能因作用域隔离失效 - 某些构建工具(如 Tailwind)默认不提取未在 content 配置中出现的伪类工具名,
hover:bg-blue-500写在 HTML 里却没出现在最终 CSS 中,本质是“规则没生成”,不是“规则没生效”
:focus 和 :active 对元素类型有硬性要求
即使样式表加载正常、选择器语法正确,伪类仍可能“静默失败”,因为浏览器根本不允许某些元素响应它们:
立即学习“前端免费学习笔记(深入)”;
<div> 默认不支持 <code>:focus,除非加tabindex属性;否则div:focus { outline: 2px solid }永远不会触发-
:active在 IE7 中需注意选择器权重——仅用类名(如.btn:active)可能被忽略,得配合元素名(button.btn:active)或 ID(#submit:active)才能生效 -
:valid/:invalid要求输入控件具备约束验证能力:必须是<input>、<select></select>或<textarea></textarea>,且带required、type="email"等属性,空载页面时状态也可能为假阴性
真正容易被忽略的点在于:伪类不是“开关式样式”,而是依赖浏览器内部状态机驱动的响应机制。路径对了、语法对了、引入方式对了,只是必要条件;元素是否可交互、是否已触发校验、是否处于正确的文档模式(比如 Quirks Mode 会禁用部分伪类),才是决定它动不动的关键。


















