内容属性应如何从其容器继承到:before或:after伪元素?

时间:2015-05-21 23:19:00

标签: html css google-chrome internet-explorer firefox

考虑这个HTML / CSS场景:

p { content:'x'; }
p:before, p:after { content:inherit; }
<p></p>

在Firefox中,将显示“xx”。在Chrome和IE中没有显示任何内容。

在评估我认为应该发生什么时,我已经考虑了CSS 2.1规范中的以下片段:

  

12.1 The :before and :after pseudo-elements

     

:before和:after伪元素继承任何可继承的   来自文档树中元素的属性   连接。

因此,一般来说,将属性继承到:before和:after伪元素来自其包含元素应该可以工作(并且它确实适用于其他属性)。

  

12.2 The 'content' property

     

'内容'       价值:正常|没有| [| | | attr()|公开引用| close-quote |没有公开引用|   no-close-quote] + |继承

因此“inherit”是内容属性的有效值

  

计算值:在元素上,始终计算为“正常”。 On:before和:after,如果指定'normal',则计算为'none'。否则,对于URI值,绝对URI;对于attr()值,结果字符串;对于其他关键字,如指定的那样。

这里重要的是讨论属性的计算值。另请注意,示例中<p>元素等元素的计算值应为normal

  

适用于:: before和:after伪元素

     

1.4.2.3 Applies to

     

此部分列出了属性适用的元素。所有   元素被认为具有所有属性,但具有一些属性   对某些类型的元素没有渲染效果。 ...

所以“适用于”是一个渲染规则,并不确定该属性对该元素是否有意义,因为所有CSS属性总是有意义的。

  

6.2.1 The 'inherit' value

     

每个属性也可能具有级联值'inherit',这意味着   对于给定元素,该属性采用相同的指定值   作为元素父级的属性。 '继承'值可以是   用于强制继承值,它也可以用于   通常不会继承的属性。

请注意,它是继承的指定的值,而不是计算值。对于示例的<p>元素,content属性的指定值为“x”。

现在,在IE的DOM检查器中,p元素的内容的计算值是normal,取自指定的值“x”。这似乎对规范是正确的,但伪元素不会继承指定的值。

在Chrome的DOM检查器中,p元素的内容的计算值根本不显示!为什么Chrome应该省略任何属性,我不知道。在元素上调用window.getComputedStyle(el).content会返回“x”。与Firefox一样,规范似乎不正确。

在Firefox的DOM检查器中,p元素的内容计算值为“x”。根据规范,这似乎是不正确的,它说计算的值应该是normal。但是,伪元素将继承指定的值。

所以我得出结论,Firefox,IE和Chrome的所有三个行为都有某些方面的错误,但Firefox在示例方案中显示“xx”是正确的。

我错过了任何相关的内容吗?

1 个答案:

答案 0 :(得分:-1)

根据这位绅士对可以继承的样式的回答,内容不是继承的属性。 Which CSS properties are inherited?

同样在你引用的w3.org网站上,没有关于如何处理继承属性的描述,而有关所有其他可能值的注释,似乎是`

> [ <string> | <uri> | <counter> | attr(<identifier>) | open-quote |
> close-quote | no-open-quote | no-close-quote ]+`

对我来说,这意味着继承可能是一个有效的值,但它没有实际用途。或者它可能是一个错字......?

似乎有些浏览器会对继承值进行操作,但它看起来不一致且不可靠,因此我建议避免使用它。您可以使用数据属性实现相同的功能。

我要补充的一点是,考虑到分层如何与伪元素一起工作,我或许会期望:after伪元素继承以下内容:before,if:before将其内容设置为其他内容办法。 https://css-tricks.com/pseudo-element-roundup/

但是现在没有浏览器以这种方式运行。如果你尝试这个小提琴,firefox是你看到的唯一一个,它继承自base元素。 http://jsfiddle.net/8Lsp7c7j/1/