在实际开发中,我们常常需要与页面样式打交道。Ja vaScript 提供了 document.styleSheets 这样一个属性,用来获取当前页面中所有已加载的样式表——包括外部 link 引入的、内部 style 定义的,甚至通过脚本动态插入的那些。它返回的是一个 CSSStyleSheet 对象的类数组(StyleSheetList),并且严格按文档中间出现顺序排列。

获取所有样式表的基本方法
访问方式很简单,document.styleSheets 是只读属性,直接拿来用就行。但有几个关键点需要注意:
- 它按照文档中间出现的先后顺序排列,不管你是
引入的外部文件,还是直接用标签写的内联样式。 - 跨域的外部样式表(比如从 CDN 加载的)可能会因为 CORS 限制,导致部分属性不可读。最典型的例子就是
cssRules——直接访问会抛出安全错误。 - 动态创建并插入到 DOM 中的
或,只要已经加入文档,同样会出现在列表中。
遍历并检查样式表信息
每个 CSSStyleSheet 对象都携带了不少有用的属性,方便我们识别和调试。几个比较常用的:
href:外部样式表的 URL。如果是内联样式表,这里就是null。title:对应或的 title 属性。这个属性在实现首选样式表切换或主题机制时特别有用。disabled:布尔值,一看就知道当前样式表是不是被禁用的状态。ownerNode:指向触发了这个样式表加载的 DOM 节点(或元素)。cssRules(或者老式浏览器里的rules):这个样式表中定义的具体 CSS 规则列表。前面说了,跨域场景下访问它会遇到麻烦。
来个简单的遍历示例:
for (let i = 0; i < document.styleSheets.length; i++) { const sheet = document.styleSheets[i]; console.log({ index: i, href: sheet.href, title: sheet.title, disabled: sheet.disabled, owner: sheet.ownerNode.tagName });}
安全读取 cssRules 的注意事项
这里要特别提醒一句:直接访问 sheet.cssRules,在某些情况下是会翻车的——尤其是当样式表来自跨域的外部链接(比如 CDN 资源)时。浏览器会毫不客气地抛出一个 SecurityError。
所以,稳妥的做法是:
- 用
try...catch把读取逻辑包起来。 - 或者先检查
sheet.href是不是同源 URL,再决定要不要读。 - 旧版 IE 用的是
sheet.rules,可以用sheet.cssRules || sheet.rules做兼容处理。
一个安全读取的示例:
function getRules(sheet) { try { return sheet.cssRules || sheet.rules; } catch (e) { return null; // 跨域或权限不足时返回 null }}
筛选特定样式表(如带 title 的)
假如页面中用了 alternate 样式表或者实现了主题切换功能,借助 title 属性可以精准定位到目标样式表。比如想找到暗色主题的样式,可以这样:
Array.from(document.styleSheets).filter(s => s.title === 'dark-theme')- 配合
disabled属性,就能判断当前激活的是哪个主题。 - 直接修改
disabled的值,可以动态启用或禁用某个样式表,而且这操作不会对 DOM 结构造成任何影响。
启用指定样式表的示例:
const darkSheet = Array.from(document.styleSheets) .find(s => s.title === 'dark-theme');if (darkSheet) darkSheet.disabled = false;
