【问题标题】:CSS3's attr() doesn't work in major browsersCSS3 的 attr() 在主流浏览器中不起作用
【发布时间】:2012-02-04 21:18:36
【问题描述】:

我的 HTML 文档中有这个:

<a class="wbutton tint" data-tint="rgba(255,0,0,.5)" href="#">This should be red, with an opacity of 0.5</a>

这在 CSS 文件中:

.window > .content .wbutton.tint {
    border: solid thin attr(data-tint, color);
    box-shadow: inset 0 0 50px attr(data-tint, color);
}

Firefox 在 Firebug 中返回 CSS 错误。我做错了吗?

根据W3C specs for the attr() function,它应该可以工作。

(另外,还有a page about attr() in the MDN Wiki,所以我认为它至少应该可以在 Firefox 中使用)

【问题讨论】:

  • 我很确定 "attr()" 不是 CSS3 或任何其他 CSS 的一部分,即使它,CSS3 仍然是一个草案,甚至最新的浏览器也没有完整的还支持。
  • @Hosh Sadiq:是的。看我的回答。
  • attr()目前仅支持content属性,可用于伪元素(如:before:after)。
  • @RobW 根据 MDN,你指的 attr() 函数是 CSS2.1 的函数,我指的是 CSS3 函数。
  • 对 W3C (CSS3) 规范感兴趣的人:dev.w3.org/csswg/css-values/#attr

标签: css


【解决方案1】:

查看规范中给出的语法:

attr( <attr-name> <type-or-unit>? [ , <fallback> ]? )

属性名和要使用的单位之间的逗号好像需要去掉:

.window > .content .wbutton.tint {
    border: solid thin attr(data-tint color);
    box-shadow: inset 0 0 50px attr(data-tint color);
}

然而,即使你有正确的语法,它也不会起作用。事实证明,截至 2012...2020 年,没有已知的 3 级版本的 attr() 实现。更糟糕的是,it's still at-risk as of the latest editor's draft of the spec

但并非全部丢失:如果您希望在即将推出的浏览器中实现此功能,仍有时间在相关反馈渠道中提出建议!以下是目前已经提出的建议:

作为记录,基本的Level 2.1 version 在所有主要浏览器的最新版本中得到完全支持,包括 IE8+ 和 Firefox 2+,并且与 :before:after 伪的 content 属性一起使用生成内容的元素。 MDN浏览器兼容性表仅适用于该版本,不适用于CSS3版本。

【讨论】:

  • 此外,您不能假设浏览器实现了 CSS3 功能,直到模块已经或至少在 CR 阶段完成。作为草案,任何事情都可以来来去去。事实上,有人猜测attr() 函数可能会在 CR 阶段被删除......但实际上,我也不会打赌这种情况会发生。就个人而言,我只是拭目以待。
  • 您知道,CSS3 现在已经达到 CR。 calc() 现在支持除 Opera 之外的所有主流浏览器(在 Webkit 浏览器上以 -webkit- 为前缀,其余不支持),attr() AFAIK 尚不可用。 :(
  • @m_gol:希望他们尽快实施,否则会反弹到 LCWD,浪费时间。这很烦人。
  • @Marnen Laibow-Koser:那是 CSS2.1 attr(),就像我说的,所有浏览器都完全支持。我们谈论的是 CSS3 attr(),它不支持超出 CSS2.1 允许的范围。
  • @BoltClock 哦,我明白了。我不知道 attr() 甚至存在于 CSS 2.1 中,但再次查看规范后,我发现它只是 CSS 3 中新增的多参数形式。抱歉造成混淆!
【解决方案2】:

截至目前,CSS3 中的attr() 仅支持从HTML5 的data 属性中获取值来设置元素的content。有一个很好的fiddle 显示了它。

我已经在 Google Chrome 35、Mozilla Firefox 30 和 Internet Explorer 11 中对其进行了测试。

如果您想在 CSS3 中为不同的事物使用 HTML5 数据属性,例如设置元素的 widthheight,那么您需要一个额外的 JavaScript 库。

Fabrice Weinberg 写了一个 CSS3 attr() Polyfill 来处理 data-widthdata-height。您可以在这里找到 Fabrice 的 GitHub 存储库:cssattr.js

【讨论】:

  • 感谢您的解释。在示例 JS fiddle 中您可能要考虑的一个考虑是有一个注释说明您如何期望宽度样式得到更新,因为有些人(比如我自己)可能首先希望看到宽度在阅读您的完整答案之前生效。
  • 不限于 HTML5 数据属性。它可以与任何属性一起使用,无论是标准的还是非标准的。唯一的限制是它与 CSS content 属性一起使用。
  • 请避免使用 exact 时间术语,例如“截至今天”,因为这些与 Stackoverflow 问题无关。你的“今天”已经是多年前的过去了。
【解决方案3】:

我发现了黑客。这不是属性,而是直接对样式进行操作。在 Chrome Canary 中,您可以使用自定义 css 属性和 JS 来操作属性。

在 CSS 中:

.some { background-position: var(--x) 0; } 

在 JS 中:

element.style.setProperty("--x", "100px", "");
//With same success you can set attribute. 

测试用例:https://jsfiddle.net/y0oer8dk/

火狐:https://jsfiddle.net/0ysxxmj9/2/

【讨论】:

    【解决方案4】:

    它确实有效,但不是你想的那样。它不是通过变量发送的值,而是作为触发器然后分配一个值。正因为如此,最好使数据属性独特而简单。 一个小例子可能会有所帮助:

    <div class="data"><span data-width="80" data-tint="lime"></span></div>
    

    然后在你的css中你会放:

    .data {height: 50px; width: 100%; background-color: #eee;}
    .data > span {display: block; height: 100%;}
    .data > span[data-width="80"] {width: 80%;}
    .data > span[data-tint="lime"] {background-color: rgba(118, 255, 3, 0.6);}
    

    如果你在小规模上做这件事是没有意义的,但在更大的范围内,在 SCSS 的帮助下,有些事情会变得更容易,比如..

    @for $i from 1 through 100 {
        &[data-width="#{$i}"] {
            .data > span {
                width: calc(#{$i} * 1%);
            }
        }
    }
    

    这将编译成所有百分比可能性的 CSS,允许您使用 data-width 设置跨度宽度。

    Check out the fiddle

    【讨论】:

    • “这不是通过变量发送的值” - 但这就是 W3C 规范所说的字面意思。
    • 你能给我们那个链接吗,因为我一直在 developer.mozilla.org/en-US/docs/Learn/HTML/Howto/… 那里找不到类似的东西。
    • 这是我问题中的第一个链接。
    • 好的。我之前没有读过,根据我使用数据属性的经验,它只适用于内容中的伪元素。它特别说颜色必须是十六进制值或标识 css 标记,我将其理解为 css 理解的颜色名称,因此 rgba 不起作用,当我尝试它时,它不适用于十六进制或名称要么。
    • 事情就是这样:W3C 说它应该这样工作,但没有一个浏览器这样做。即使是现在,在我问这个问题 6 年多之后。
    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多