You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome 64后如何获取元素未计算的原始CSS样式属性值?

Chrome 64+ 获取原始CSS样式值的方法

针对你提到的两个问题——Chrome64之后怎么获取未计算的原始CSS属性值,以及stylesheets.cssRules访问受限的情况,我整理了几个可行的方案:

一、先明确:Chrome64的cssRules限制是什么?

其实Chrome64并没有完全禁用document.styleSheets.cssRules,只是对跨域加载的样式表增加了访问限制:如果样式表是从其他域名加载的,直接访问cssRules会抛出安全错误;但同域的样式表(包括内联样式、同域外部样式文件)依然可以正常访问cssRules。

二、获取原始CSS属性值的具体方案

方案1:遍历同域样式表的cssRules(最直接)

如果你的样式表是同域的,直接遍历样式表规则,找到目标选择器对应的属性即可,这个方法能准确拿到原始定义值:

$(function() {
  // 先执行你的修改操作
  $('.a').css('font-size','100px');

  // 遍历所有样式表
  for (const sheet of document.styleSheets) {
    try {
      // 尝试访问cssRules,跨域表会抛错,所以用try-catch包裹
      for (const rule of sheet.cssRules) {
        // 找到目标选择器.a
        if (rule.selectorText && rule.selectorText.trim() === '.a') {
          // 获取原始的font-size值
          const originalFontSize = rule.style.fontSize;
          console.log('原始font-size:', originalFontSize); // 输出 "2vw"
          break;
        }
      }
    } catch (err) {
      console.warn('跳过跨域样式表:', err.message);
    }
  }
});

方案2:解析样式表的原始文本(兼容跨域/复杂场景)

如果样式表是跨域的,或者你不想依赖cssRules,可以直接获取样式表的原始文本,再解析出目标属性:

针对内联样式表

$(function() {
  $('.a').css('font-size','100px');

  // 找到页面内的<style>标签
  const styleTags = document.querySelectorAll('style');
  styleTags.forEach(tag => {
    const cssText = tag.textContent;
    // 用正则匹配.a的font-size(简单场景够用,复杂场景建议用CSS解析库)
    const match = cssText.match(/\.a\s*\{\s*font-size\s*:\s*([^;]+)\s*;/);
    if (match) {
      console.log('原始font-size:', match[1].trim()); // 输出 "2vw"
    }
  });
});

针对同域外部样式表

如果是同域的外部样式文件,可以用fetch获取文本后解析:

$(function() {
  $('.a').css('font-size','100px');

  for (const sheet of document.styleSheets) {
    // 只处理同域的外部样式表
    if (sheet.href && sheet.href.startsWith(window.location.origin)) {
      fetch(sheet.href)
        .then(res => res.text())
        .then(cssText => {
          const match = cssText.match(/\.a\s*\{\s*font-size\s*:\s*([^;]+)\s*;/);
          if (match) {
            console.log('原始font-size:', match[1].trim());
          }
        });
    }
  }
});

方案3:使用CSS解析库(复杂场景推荐)

如果你的CSS有嵌套、媒体查询等复杂结构,正则解析容易出错,推荐用专门的CSS解析库(比如CSSOM或PostCSS)来处理。以CSSOM为例:

// 先引入CSSOM(可通过npm安装后引入,或使用本地引入方式)
// 假设已经引入了CSSOM
$(function() {
  $('.a').css('font-size','100px');

  const styleTags = document.querySelectorAll('style');
  styleTags.forEach(tag => {
    const cssText = tag.textContent;
    const stylesheet = CSSOM.parse(cssText);
    // 遍历所有规则
    for (const rule of stylesheet.cssRules) {
      if (rule.selectorText === '.a') {
        console.log('原始font-size:', rule.style.fontSize); // 输出 "2vw"
        break;
      }
    }
  });
});

注意事项

  • 跨域样式表:由于浏览器的同源策略,跨域样式表的cssRules无法直接访问,也无法通过fetch获取(除非服务器配置了CORS允许),这种情况下如果必须获取,只能让后端帮忙转发样式文件到同域。
  • 行内样式 vs 原始样式:我们上面的方案都是从样式表中获取原始定义,和元素的行内样式(通过.css()修改的内容)是完全分离的,所以即使修改了行内样式,也不影响获取原始CSS值。

内容的提问来源于stack exchange,提问作者Mizok.H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:14:32