Я пытаюсь использовать переменные CSS в медиа-запросе, и это не работает.
:root {
--mobile-breakpoint: 642px;
}
@media (max-width: var(--mobile-breakpoint)) {
}
Я пытаюсь использовать переменные CSS в медиа-запросе, и это не работает.
:root {
--mobile-breakpoint: 642px;
}
@media (max-width: var(--mobile-breakpoint)) {
}
Ответы:
Из спецификации ,
Так что нет, вы не можете использовать его в медиа-запросах.
И в этом есть смысл. Потому что вы можете установить,
--mobile-breakpoint
например:root
, на<html>
элемент, а оттуда унаследовать его другим элементам. Но медиа-запрос не является элементом, он не наследуется<html>
, поэтому не может работать.Это не то, чего пытаются добиться переменные CSS. Вместо этого вы можете использовать препроцессор CSS.
источник
Как ответил Ориол , в настоящее время CSS-переменные уровня 1
var()
не могут использоваться в медиа-запросах . Однако в последнее время появились разработки, которые позволят решить эту проблему. Через несколько лет, когда уровень 1 модуля переменных среды CSS будет стандартизирован и реализован, мы сможем использоватьenv()
переменные в медиа-запросах во всех современных браузерах.Если вы прочитали спецификацию и у вас возникли сомнения, или если вы хотите выразить свою поддержку варианта использования медиа-запроса, вы все равно можете сделать это в GitHub w3c / csswg-drafts # 1693 или в любой проблеме CSS GitHub с префиксом «[ css-env-1] » .
Исходный ответ 09.11.2017 : Недавно рабочая группа CSS решила, что переменные CSS уровня 2 будут поддерживать использование переменных среды, определяемых пользователем
env()
, и попытаются сделать их действительными в медиа-запросах . Группа решила эту проблему после того, как Apple впервые предложила стандартные свойства пользовательского агента , незадолго до официального анонса iPhone X в сентябре 2017 года (см. Также WebKit: «Разработка веб-сайтов для iPhone X» Тимоти Хортона ). Затем другие представители браузеров согласились, что они будут в целом полезны на многих устройствах, например на телевизионных дисплеях и при печати чернилами с размытыми краями. (env()
раньше называлсяconstant()
, но теперь это устарело. Вы все еще можете увидеть статьи, в которых упоминается старое название, например, эта статья Питера-Пола Коха .) Через несколько недель Кэмерон МакКормак из Mozilla понял, что эти переменные среды можно использовать в медиа-запросах, а Таб Аткинс младший затем компания Google поняла, что определяемые пользователем переменные среды будут особенно полезны в качестве глобальных непереопределяемых корневых переменных, используемых в медиа-запросах. Теперь декан «Дино» Джексон из Apple присоединится к Аткинсу для редактирования Уровня 2.Вы можете подписаться на обновления по этому поводу в
w3c/csswg-drafts
выпуске GitHub # 1693 . (Чтобы получить особенно важные исторические сведения, разверните журналы встреч, встроенные в решения CSSWG Meeting Bot, и выполните поиск по запросу «MQ», что означает «медиа-запросы».)Я планирую обновить этот вопрос в будущем, когда появятся новые разработки. Будущее захватывающее.
Обновление 2018-02-08 : Safari Technology Preview 49 добавила поддержку синтаксического анализа
calc()
в медиа-запросах, что также может быть прелюдией к их поддержкеenv()
.Обновление 2018-04-27 : команда Chromium в Google решила начать работу
env()
. В ответ Аткинс начал указыватьenv()
в отдельном неофициальном проекте стандарта: модуль переменных среды CSS уровня 1 . (См. Его комментарий на GitHub в w3c / csswg-drafts # 1693 и его комментарий в w3c / csswg-drafts # 1817. ) Черновик вызывает переменные в медиа-запросах в качестве явного варианта использования:Если вы прочитали спецификацию и у вас возникли опасения, или если вы хотите выразить свою поддержку варианта использования медиа-запроса, вы все равно можете сделать это в GitHub w3c / csswg-drafts # 1693 или в любой проблеме CSS GitHub с префиксом «[ css-env-1] » .
Обновление 2019-07-06 : Работа над спецификациями продолжается. GitHub выпуск № 2627 и GitHub вопрос # 3578 посвящены пользовательские переменные окружения в запросах медиа.
источник
Однако вы МОЖЕТЕ сделать @media запросить ваш оператор: root!
Полностью работает в Chrome, Firefox и Edge, по крайней мере, в последних производственных версиях на момент публикации.
источник
var
, чтобы его можно было использовать в вычислениях где-то в другом местеcss
, для этого все равно потребуется поместить «магическое значение» (здесь 479 пикселей) в два места: медиа-запрос и объявление var.По-видимому, просто невозможно использовать такие собственные переменные CSS. Это одно из ограничений .
Умный способ использовать это - изменить ваши переменные в медиа-запросе, чтобы повлиять на весь ваш стиль. Я рекомендую эту статью .
источник
Один из способов добиться желаемого - использовать пакет npm
postcss-media-variables
.Если вас устраивает использование пакетов npm, вы можете посмотреть документацию здесь
пример
источник
Как вы можете прочитать другие ответы, это все еще невозможно .
Кто-то упомянул пользовательские переменные окружения (
env()
вместо них похожие на пользовательские переменные cssvar()
), и принцип верен, хотя есть еще две основные проблемы:источник
Короткий ответ
Вы можете использовать JavaScript, чтобы изменить значение медиа-запросов и установить для него значение переменной css.
Длинный ответ
Я написал небольшой скрипт, который вы можете разместить на своей странице. Он заменяет все правила СМИ со значением
1px
со значением переменной Css--replace-media-1px
, правила со значением2px
с--replace-media-2px
и так далее. Это работает для запросов СМИwith
,min-width
,max-width
,height
,min-height
иmax-height
даже тогда , когда они связаны с использованиемand
.JavaScript:
CSS:
источник