【问题标题】:Using attr to set css variable inline that work with CSP使用 attr 设置与 CSP 一起使用的 css 变量内联
【发布时间】:2020-10-29 08:28:02
【问题描述】:

我在想如何在不使用内联样式的情况下使用 css 变量。我认为我可以使用这个:

[data-color] {
    --color: attr(data-color color, green);
}
* {
    color: var(--color, blue);
}
<div data-color="red">hello</div>

似乎 attr 仅适用于伪选择器(并且可能仅适用于 content: 属性),但 MDN attr page 说:

attr() CSS 函数用于检索所选元素的属性值并在样式表中使用它。它也可以用于伪元素,在这种情况下,返回伪元素的原始元素的属性值。

甚至还有演示,但它在 Linux 上的 Chrome 中不起作用,所以它对我没用。它甚至无法在 Linux 上的 Firefox 中运行。

有没有其他方法可以使用没有内联样式且无需编写动态<style></style> 和nonce 的css 变量?

【问题讨论】:

    标签: css content-security-policy css-variables


    【解决方案1】:

    还没有。在同一个链接中,您可以阅读:

    注意:attr() 函数可以与任何 CSS 属性一起使用,但对内容以外的属性的支持是实验性的,对 type-or-unit 参数的支持是稀疏的。

    仍然没有浏览器支持 attr() 用于不同于内容的属性,也不支持类型或单元。

    值得注意的是,您可以在 CSS 变量中使用 attr(),但它需要稍后与内容一起使用。 CSS 变量只是一个中间体,因此我们不会根据变量评估支持,而是根据将使用该变量的属性。

    [data-color] {
      --color: attr(data-color);
    }
    
    *::before {
      content: var(--color, "default");
      color:blue;
    }
    <div data-color="red">hello</div>

    【讨论】:

    • 谢谢,可能只是content: var(attr(data-color), "default"); attr 没有在--color: 内部展开,直接用作var 内容中的字符串。
    【解决方案2】:

    CSS attr 属性的一个有趣用途,但正如问题所述,在伪元素属性之外对它的支持很少见例如https://developer.mozilla.org/en-US/docs/Web/CSS/attr

    实际上比那更糟,因为如果你有:

    * {
        color: var(--color, blue);
    }
    [data-color] {
        --color: green;
        --color: attr(data-color);
    }
    <div data-color="red">hello</div>

    与问题中的类似,但为了更明确而分开。 --color: attr(data-color) 不会标记警告并被忽略并使用绿色。相反,它被接受并将 --color 设置为字符串。就好像浏览器可以识别 attr 并且它应该对它做一些事情但实际上并没有完全做到。

    【讨论】:

      【解决方案3】:

      对于仍然想在 HTML 上管理 CSS 变量的每个人,您都可以这样做:

      * {
          color: var(--color, blue);
      }
      <div style="--color: red">hello</div>
      <div>hello</div>

      【讨论】:

      • 你读过这个问题吗? Is there any other way to use css variables without inline styles and without writing dynamic &lt;style&gt;&lt;/style&gt; and nonce? 我需要这个,因为 CSP 需要验证每个 CSS。
      • 我的错,没看到那部分
      • 线索在标题that work with CSP 内联样式需要生成nonce才有效,我想避免它。
      • 对不起:/ 我创建了一个问题,因为我想从 HTML 处理 CSS var,我的问题被删除了,因为与你的问题相似(即使我已经阅读它并且没有找到我想要的)。之后我发现了这个技巧......所以我想与大家分享它(如果将来有人需要它)。抱歉,如果它不适合您的情况:/
      • 哦,太糟糕了。它被删除或关闭了吗?因为您应该编辑问题以更清楚地表明这不是您问题的答案。我有时会发生在我身上,我需要澄清为什么我的问题不同。
      猜你喜欢
      • 2014-09-01
      • 1970-01-01
      • 2018-03-17
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多