媒体查询中"屏幕"和"仅屏幕"之间有什么区别?

Jit*_*yas 456 css css3 media-queries

媒体查询中"屏幕"和"仅屏幕"之间有什么区别?

<link media="screen and (max-device-width: 480px)" rel="stylesheet" href="m.css" />
<link media="only screen and (max-device-width: 480px)" rel="stylesheet" href="m.css" />
Run Code Online (Sandbox Code Playgroud)

为什么我们要求使用' Only '.难道screen不是本身提供足够的信息仅适用于屏幕呈现?

我见过很多响应式网站.一些使用

@media screen and (max-width:632px)
Run Code Online (Sandbox Code Playgroud)

一些

@media (max-width:632px)
Run Code Online (Sandbox Code Playgroud)

还有一些

@media only screen and (max-width:632px)
Run Code Online (Sandbox Code Playgroud)

Mat*_*een 518

让我们一个一个地分解你的例子.

@media (max-width:632px)
Run Code Online (Sandbox Code Playgroud)

这个是说max-width你想要应用这些样式的632px 的窗口.在这种情况下,在大多数情况下,你会谈论比桌面屏幕小的任何东西.

@media screen and (max-width:632px)
Run Code Online (Sandbox Code Playgroud)

这个是说一个设备有一个screen和一个max-width632px 的窗口应用风格.这几乎与上述相同,除了您指定的screen是与其他可用媒体类型相反 的最常见的其他媒体类型print.

@media only screen and (max-width:632px)
Run Code Online (Sandbox Code Playgroud)

以下是W3C直接引用的解释.

关键字"仅"也可用于隐藏旧用户代理的样式表.用户代理必须处理以"仅"开头的媒体查询,就好像"仅"关键字不存在一样.

由于没有"仅"这样的媒体类型,旧版浏览器应该忽略样式表.

这是该页面上示例9中显示的引用链接.

希望这能为媒体查询提供一些启示.

编辑:

请务必查看关于如何真正处理关键字的@hybrids优秀答案only.

  • 对于那些正在寻找更好解释*为什么*'only`关键字将隐藏旧浏览器样式表的人,请参阅下面的@hybrid的答案.他解释得非常好. (23认同)
  • @Kokodoko那些不需要的人.但严重的是,打印机和屏幕阅读器不一定有屏幕.以及当前或未来的任何其他不识别为"屏幕"的内容,例如其他媒体类型中列出的任何内容. (3认同)
  • hybrid 的答案很好,但我也喜欢这个答案,因为它解决了 CSS* 内的媒体查询,而不是只解决了 `link` 元素的 `media` 属性。 (2认同)
  • 什么设备没有屏幕? (2认同)

hyb*_*rid 218

以下内容来自Adobe docs.


媒体查询规范还提供了关键字only,用于隐藏旧浏览器的媒体查询.比如not,关键字必须出现在声明的开头.例如:

media="only screen and (min-width: 401px) and (max-width: 600px)"
Run Code Online (Sandbox Code Playgroud)

不识别媒体查询的浏览器需要以逗号分隔的媒体类型列表,并且规范说它们应该在不是连字符的第一个非字母数字字符之前截断每个值.因此,旧浏览器应将前面的示例解释为:

media="only"
Run Code Online (Sandbox Code Playgroud)

因为没有这样的媒体类型,所以忽略样式表.同样,旧的浏览器应该解释

media="screen and (min-width: 401px) and (max-width: 600px)"
Run Code Online (Sandbox Code Playgroud)

media="screen"
Run Code Online (Sandbox Code Playgroud)

换句话说,它应该将样式规则应用于所有屏幕设备,即使它不知道媒体查询的含义.

不幸的是,IE 6-8未能正确实现规范.

它不是将样式应用于所有屏幕设备,而是完全忽略样式表.

尽管存在这种行为,但仍建议仅在您希望隐藏其他不太常见的浏览器的样式时才为媒体查询添加前缀.


所以,使用

media="only screen and (min-width: 401px)"
Run Code Online (Sandbox Code Playgroud)

media="screen and (min-width: 401px)"
Run Code Online (Sandbox Code Playgroud)

将在IE6-8中具有相同的效果:两者都将阻止使用这些样式.但是,它们仍将被下载.

此外,在支持CSS3媒体查询的浏览器中,如果视口宽度大于401px且媒体类型为屏幕,则两个版本都将加载样式.

我不完全确定哪些不支持CSS3媒体查询的浏览器需要该only版本

media="only screen and (min-width: 401px)" 
Run Code Online (Sandbox Code Playgroud)

而不是

media="screen and (min-width: 401px)"
Run Code Online (Sandbox Code Playgroud)

确保它不被解释为

media="screen"
Run Code Online (Sandbox Code Playgroud)

对于有权访问设备实验室的人来说,这将是一个很好的测试.

  • 因此,如果我们在谈论CSS文件中的媒体查询,我们可以"仅"删除,因为旧浏览器无法理解媒体查询,不是吗? (3认同)
  • @Hasim,我用过去时态写了我的评论:“我经常使用它”:) 如今,没有必要支持这种过时的设备。我只是想说“仅屏幕”很有用,实际上是避免由于悲惨的 CSS3 支持而导致页面损坏的唯一方法。 (3认同)

san*_*eep 40

要为许多具有较小屏幕的智能手机设置样式,您可以写:

@media screen and (max-width:480px) { … } 
Run Code Online (Sandbox Code Playgroud)

要阻止旧浏览器查看iPhone或Android手机样式表,您可以写:

@media only screen and (max-width: 480px;) { … } 
Run Code Online (Sandbox Code Playgroud)

阅读本文了解更多信息http://webdesign.about.com/od/css3/a/css3-media-queries.htm

  • 如果您使用Mobile First方法怎么办?因此,我们首先使用移动css,然后使用最小宽度来定位更大的站点.我们不应该在该上下文中使用`only`关键字,对吧? (4认同)
  • 我还不是很清楚.我也更新了我的问题.你能举一个例子吗? (3认同)
  • 答案中的链接似乎只是在这个意义上没有提到这个词...... (3认同)

小智 16

@hybrid的回答是非常有用的,除了它没有解释@ashitaka提到的目的"如果你使用Mobile First方法怎么办?所以,我们首先使用移动CSS,然后使用min-width来定位更大的网站.我们不应该在这种情况下使用唯一的关键字,对吧?"

想要在这里添加,目的只是为了防止非支持浏览器使用那种其他设备风格,就好像它从"屏幕"开始而没有它将它用于屏幕,就好像它从"仅"风格开始将被忽略.

回答ashitaka考虑这个例子

<link rel="stylesheet" type="text/css" 
  href="android.css" media="only screen and (max-width: 480px)" />
<link rel="stylesheet" type="text/css" 
  href="desktop.css" media="screen and (min-width: 481px)" />
Run Code Online (Sandbox Code Playgroud)

如果我们不使用"only"它仍然可以工作,因为桌面风格也将使用引人注目的Android风格,但有不必要的开销.在这种情况下,如果浏览器不支持它将回退到第二个样式表忽略第一个.