В чем разница между «экраном» и «только экраном» в медиа-запросах?

341

В чем разница между "экраном" и "единственным экраном" в запросах мультимедиа?

<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" />

Почему мы должны использовать ' Только. Не позволяет ли screen предоставлять достаточную информацию только для экрана?

Я видел множество отзывчивых сайтов. Некоторые используют

@media screen and (max-width:632px)

Некоторые

@media (max-width:632px)

и некоторые

@media only screen and (max-width:632px)
Теги:
media-queries

4 ответа

427

Разделите свои примеры один за другим.

@media (max-width:632px)

Это говорит для окна с max-width из 632px, которое вы хотите применить к этим стилям. При этом в большинстве случаев вы говорите о чем-либо меньшем, чем экран рабочего стола.

@media screen and (max-width:632px)

Это говорит для устройства с screen, а окно с max-width из 632px применяет стиль. Это почти идентично приведенному выше, за исключением того, что вы указываете screen в отличие от других доступных типов носителей, наиболее распространенным из которых является print.

@media only screen and (max-width:632px)

Вот цитата прямо из W3C, чтобы объяснить это.

Ключевое слово "only" также может использоваться для скрытия таблиц стилей от более старых пользовательских агентов. Пользовательские агенты должны обрабатывать медиа-запросы, начиная с "только как если бы" единственное ключевое слово не было ".

Поскольку такого типа носителя, как "только", нет, таблица стилей должна игнорироваться более старыми браузерами.

Здесь ссылка на эту цитату, которая показана в примере 9 на этой странице.

Надеюсь, это проливает свет на медиа-запросы.

EDIT:

Обязательно просмотрите @hybrids отличный ответ о том, как действительно выполняется ключевое слово only.

  • 19
    Для тех, кто искал лучшее объяснение того, почему only ключевое слово будет скрывать таблицы стилей от старых браузеров, см. Ответ @hybrid ниже. Он объясняет это очень хорошо.
  • 1
    Гибридный ответ хорош, но мне также нравится этот ответ, потому что он обращается к медиа-запросам внутри CSS, а не только к media атрибуту элемента link .
Показать ещё 4 комментария
170

Ниже приведено Документы Adobe.


В спецификации медиа-запросов также содержится ключевое слово only, которое предназначено для сглаживания медиа-запросов из старых браузеров. Подобно not, ключевое слово должно появиться в начале объявления. Например:

media="only screen and (min-width: 401px) and (max-width: 600px)"

Браузеры, которые не распознают медиа-запросы, ожидают список типов медиафайлов, разделенных запятыми, и спецификация говорит, что они должны урезать каждое значение непосредственно перед первым неальфанумерным символом, который не является дефисом. Таким образом, старый браузер должен интерпретировать предыдущий пример следующим образом:

media="only"

Поскольку такого типа носителя не существует, таблица стилей игнорируется. Аналогично, старый браузер должен интерпретировать

media="screen and (min-width: 401px) and (max-width: 600px)"

как

media="screen"

Другими словами, он должен применять правила стиля ко всем экранным устройствам, даже если он не знает, что означают медиа-запросы.

К сожалению, IE 6-8 не смог правильно реализовать спецификацию.

Вместо применения стилей ко всем экранным устройствам он полностью игнорирует таблицу стилей.

Несмотря на это поведение, он по-прежнему рекомендуется префиксным запросам в СМИ, только если вы хотите скрыть стили от других, менее распространенных браузеров.


Итак, используя

media="only screen and (min-width: 401px)"

и

media="screen and (min-width: 401px)"

будет иметь тот же эффект в IE6-8: оба будут препятствовать использованию этих стилей. Тем не менее, они будут загружены.

Кроме того, в браузерах, поддерживающих мультимедийные запросы CSS3, обе версии будут загружать стили, если ширина области просмотра больше, чем 401px, а тип носителя - экран.

Я не совсем уверен, какие браузеры, которые не поддерживают мультимедийные запросы CSS3, нуждаются в версии only

media="only screen and (min-width: 401px)" 

в отличие от

media="screen and (min-width: 401px)"

чтобы убедиться, что он не интерпретируется как

media="screen"

Это был бы хороший тест для тех, кто имеет доступ к лаборатории устройств.

  • 3
    Так что, если мы говорим о медиа-запросах в CSS-файлах, мы можем отбросить «только», потому что старые браузеры вообще не понимают медиа-запросы, не так ли?
  • 0
    Хороший, очень ясный ответ. Спасибо!
Показать ещё 2 комментария
34

Чтобы создать стиль для многих смартфонов с меньшими экранами, вы можете написать:

@media screen and (max-width:480px) { … } 

Чтобы заблокировать старые браузеры от просмотра таблицы стилей iPhone или Android, вы можете написать:

@media only screen and (max-width: 480px;) { … } 

Прочтите эту статью для более http://webdesign.about.com/od/css3/a/css3-media-queries.htm

  • 3
    Я до сих пор не очень ясно об этом. Я тоже обновил свой вопрос. Можете привести пример?
  • 4
    Что если вы используете подход Mobile First? Итак, сначала у нас есть мобильный CSS, а затем мы используем минимальную ширину для таргетинга на большие сайты. Мы не должны использовать only ключевое слово в этом контексте, верно?
Показать ещё 2 комментария
8

Ответа на этот вопрос @hybrid довольно информативно, за исключением того, что я не объясняю цель, упомянутую @ashitaka "Что делать, если вы используете подход Mobile First? Итак, сначала у нас есть мобильный css, а затем используйте min-width для цели более крупные сайты. В этом контексте мы не должны использовать единственное ключевое слово?"

Хотите добавить здесь, что цель состоит в том, чтобы предотвратить использование не поддерживающих браузеров этого стиля другого устройства, как если бы он начинался с "экрана", без него он будет отображаться на экране, где, как если бы он начинался с "только", стиль будет игнорировать.

Отвечая на аситаку, рассмотрим этот пример

<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)" />

Если мы не будем использовать только "только", он все равно будет работать, так как стиль рабочего стола также будет использоваться с поразительными стилями Android, но с лишними накладными расходами. В этом случае, если браузер не поддерживает его, он вернется к второму стилю, игнорируя первый.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню