35
4

5 回答 5

41

问题是“为什么过滤器不能处理 IE8 中的伪元素?” 以下是我所能收集到的最接近明确的答案。它来自此页面上的信息。

过滤器gradient是一个“程序表面”(与 一起alphaimageloader)。程序曲面定义如下:

程序表面是显示在对象内容和对象背景之间的彩色表面。

仔细阅读。它本质上是您可以在对象的内容和该对象的背景之间说的另一个“层”。你看到问题的答案了吗?:before和创造了什么:after……是的!内容。具体如MSDN 注释

::before 和 ::after 伪元素指定文档树中元素之前和之后的内容位置。content 属性与这些伪元素一起指定插入的内容。

生成的内容与其他框交互,就好像它们是插入到相关元素中的真实元素一样。

现在,如果生成的是内容,那么它就不是包含内容的“对象”,而是内容本身(恰好具有类似于可能包含内容的元素对象的某些行为)。

因此,不存在包含“内容”(因为它内容)的“对象”,它们之间filter可以放置由伪元素(即“假元素”)生成的内容的程序表面。必须将Agradient应用于对象,然后将程序表面放置在它和内容之间。

于 2012-05-20T01:00:04.467 回答
6

关于-ms-filter-a 的同义词filter- 的文档指出:

对象必须具有过滤器才能呈现的布局。

我的第一个猜测是:before内容没有hasLayout设置为真。虽然它可能未设置为 true ,但也可能未设置为 false。对于初学者,当我按照hasLayout 文档强制获取内容时hasLayout = true(请参阅jsfiddle),它没有解决任何问题。

所以我会说这既不是真的也不是假的。相反,它可能是undefined。我在同一文档中提到了该属性的来源:

对象.currentStyle.hasLayout

如果我们查看有关 content 属性的 W3 文档,它会说:

生成的内容不会改变文档树。特别是,它不会被反馈给文档语言处理器(例如,用于重新解析)。

因此,可能的结论是生成的内容不是object,因此它没有currentStyle属性,因此也没有hasLayout设置为true。这就是过滤器对生成的内容不起作用的原因,因此可以回答问题。


乍一看,我以为我在上面小提琴的控制台中找到了提示:

document.querySelectorAll('div')[0].currentStyle.hasLayout; 
// true

document.querySelectorAll('div:before')[0].currentStyle.hasLayout
// Unable to get value of the property 'currentStyle': 
// object is null or undefined

但正如@BoltClock 的评论中提到的那样:querySelectorAll 无法访问 pseudo-elements


在这个 msdn 关于过滤器的介绍filter中可以找到另一个不适用于伪元素的提示(尽管 - 再次 - 只不过是一个提示),说明(强调我的):

过滤器通过 filter 属性应用于HTML 控件

虽然我不确定“HTML 控件”是什么意思,但我不希望:before伪元素生成的内容被视为“HTML 控件”。

于 2012-05-19T22:50:32.557 回答
0

我已经给出了我首选的解决方案(使用 CSS3Pie),但我会将其作为单独的答案发布。

IE8 无法与 IE7 兼容的可能原因filter是 IE8 更改了filter.

filter是一种特定于 IE 的专有风格。当微软发布 IE8 时,他们强调要“符合标准”。支持非标准样式的“符合标准”的方式是给它一个供应商前缀,这就是微软所做的。

因此,在 IE8 中,您需要执行以下操作:

-ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#80ffffff', endColorstr='#00ffffff',GradientType=0 )";

IE7 不支持这种语法,所以你需要它们。

在某些情况下,IE8 实际上确实可以使用旧语法。它不起作用的情况往往是您使用progid:语法的情况。原因是后面的冒号导致它是无效的 CSS 语法,这就是为什么 MS 在 IE8版本progid的整个薄周围添加引号的原因。-ms-filter

所以简短的回答是,在你的样式表中使用这两个版本,你会没事的。

于 2012-05-05T10:55:44.893 回答
0

哇,这是一个艰难的过程。

在查看此图表,确认IE8 仅喜欢其伪元素上的单冒号,阅读此可能相关的博客文章,并在 jsFiddle 中进行了大量测试后(尽管与您的 73?? jsFiddles 相比,它很少),我会不得不断定这是IE8中的一个bug。

IE9 可以在伪元素上做渐变(用 base64 废话),但 IE8 被顽固地破坏了。

于 2012-05-19T03:38:31.547 回答
0

您是否考虑过使用CSS3Pie而不是filter为此使用 IE 的样式?

这是一个 IE 脚本,增加了对标准 CSSbox-shadow和渐变的支持,因此您可以在所有浏览器中编写相同的代码,而不必拥有所有那些 IE 特定的样式。

于 2012-05-04T08:19:57.523 回答