5 回答
问题是“为什么过滤器不能处理 IE8 中的伪元素?” 以下是我所能收集到的最接近明确的答案。它来自此页面上的信息。
过滤器gradient
是一个“程序表面”(与 一起alphaimageloader
)。程序曲面定义如下:
程序表面是显示在对象内容和对象背景之间的彩色表面。
仔细阅读。它本质上是您可以在对象的内容和该对象的背景之间说的另一个“层”。你看到问题的答案了吗?:before
和创造了什么:after
……是的!内容。具体如MSDN 注释:
::before 和 ::after 伪元素指定文档树中元素之前和之后的内容位置。content 属性与这些伪元素一起指定插入的内容。
生成的内容与其他框交互,就好像它们是插入到相关元素中的真实元素一样。
现在,如果生成的是内容,那么它就不是包含内容的“对象”,而是内容本身(恰好具有类似于可能包含内容的元素对象的某些行为)。
因此,不存在包含“内容”(因为它是内容)的“对象”,它们之间filter
可以放置由伪元素(即“假元素”)生成的内容的程序表面。必须将Agradient
应用于对象,然后将程序表面放置在它和内容之间。
关于-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 控件”。
我已经给出了我首选的解决方案(使用 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
所以简短的回答是,在你的样式表中使用这两个版本,你会没事的。
哇,这是一个艰难的过程。
在查看此图表,确认IE8 仅喜欢其伪元素上的单冒号,阅读此可能相关的博客文章,并在 jsFiddle 中进行了大量测试后(尽管与您的 73?? jsFiddles 相比,它很少),我会不得不断定这是IE8中的一个bug。
IE9 可以在伪元素上做渐变(用 base64 废话),但 IE8 被顽固地破坏了。
您是否考虑过使用CSS3Pie而不是filter
为此使用 IE 的样式?
这是一个 IE 脚本,增加了对标准 CSSbox-shadow
和渐变的支持,因此您可以在所有浏览器中编写相同的代码,而不必拥有所有那些 IE 特定的样式。