"@media screen and (-webkit-min-device-pixel-ratio:0)" 的语义是什么?

17

我曾经根据http://www.webmonkey.com/2010/02/browser-specific_css_hacks/中提供的方法,使用以下CSS hack来针对基于WebKit的浏览器。

@media screen and (-webkit-min-device-pixel-ratio:0) {
    #my-id { height: 100%; }
}

这段代码在我的开发环境下是可以工作的。但是,后来我发现它在生产环境下无法正常运行。我发现这是由于CSS优化器将 and 后面的空格删除导致的。以下CSS在Chrome中无法识别。

@media screen and(-webkit-min-device-pixel-ratio:0) {
    #my-id { height: 100%; }
}

那么,@media screen and (-webkit-min-device-pixel-ratio:0) 到底是什么意思?

我知道 @media screen,但我以前没有在CSS文件中使用过 and

为什么在 and 后面需要有空格?


1
从技术上讲,我不认为那是CSS黑客。虽然它并不完全符合这些语言特性的预期用途,但由于其使用了“-webkit-min-device-pixel-ratio:0”,它相当有效地识别了WebKit。这是一种不太狡猾的黑客技巧之一。 - Paul D. Waite
请参见https://dev59.com/b2855IYBdhLWcg3wynmC。 - Paul D. Waite
3个回答

24

就像你所说的那样,媒体查询本身用于过滤WebKit,因为它使用了-webkit-属性。

Chrome仅仅是在你说它无法识别时有点严格而已。

@media screen and(-webkit-min-device-pixel-ratio:0)

这是无效的CSS,因为在 and 关键字后面的空格是有意义的。这在CSS3媒体查询规范中已明确说明:

EXAMPLE 20

以下是格式不正确的媒体查询,因为在“and”和表达式之间没有空格不被允许。(这个保留给函数符号语法。)

@media all and(color) { … }
函数表示法是指像url()rgb()rgba()这样的东西。正如您所看到的,在这些示例中,函数名和开括号之间没有空格。 and不是一个函数,而只是一个关键字,用于表示媒体查询必须匹配您指定的媒体,并且布局引擎必须满足您放置在其后的表达式。括号-webkit-min-device-pixel-ratio:0只是将其标记为表达式。 补充说明:是的,这意味着您的CSS优化器存在错误 ;)

2
我想我刚刚遇到了同样的错误 - YUI压缩器。 - Matt Ball
@Matt Ball:哦,也许你应该提交一份报告。 - BoltClock
1
刚刚完成了这个任务(http://yuilibrary.com/projects/yuicompressor/ticket/2528087),但显然我在编写“WikiSyntax”方面很蠢...我需要到处使用MarkDown,该死的。 - Matt Ball
@MattBall - YUI也有同样的问题。 - Peter Ajtai

13

1
+1 对这个快速修复。我正在使用的是 'yuicompressor-maven-plugin',它仍在使用2.4.2版本。 - Jan
修复与AjaxMinifier很搭配...非常感谢。语法:@media screen/!/and/!/(-webkit-min-device-pixel-ratio:0) - MK.

0

只使用这个:

@media(-webkit-min-device-pixel-ratio:0) {

}

1
请解释一下? - Rooster242
使用此代码仅为基于WebKit的浏览器应用CSS,可以将其视为 if (webkit) {执行某些操作}。 - Fareed Alnamrouti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接