Собственные переменные CSS не работают в запросах мультимедиа
Я пытаюсь использовать переменные CSS в медиа-запросе, и это не работает.
:root {
--mobile-breakpoint: 642px;
}
@media (max-width: var(--mobile-breakpoint)) {
}
4 ответов
С spec,
на
var()
функция может использоваться вместо любой части значения в любое свойство элемента. Thevar()
функция не может использоваться как имена свойств, селекторы или что-либо еще, кроме значений свойств. (При этом обычно создается недопустимый синтаксис или значение, которое значение не имеет связи с переменной.)
так что нет, вы не можете использовать его в медиа-запросе.
и что делает чувство. Потому что вы можете установить --mobile-breakpoint
, например,:root
, то есть <html>
element, и оттуда наследуются другим элементам. Но медиа-запрос не является элементом, он не наследуется от <html>
, так что это не может работать.
это не то, что переменные CSS пытаются выполнить. Вместо этого можно использовать препроцессор CSS.
As Ориоль ответил в настоящее время CSS переменные 1-го уровня var()
не может использоваться в запросах мультимедиа. Однако в последнее время произошли изменения, которые позволят решить эту проблему. через несколько лет, после того как CSS переменные среды модуль Уровень 1 стандартизирован и реализован, мы сможем использовать env()
переменные в медиа-запросов.
если вы читали спецификация и беспокойство, или если вы хотите озвучить свою поддержку варианта использования медиа-запроса, вы все равно можете сделать это в GitHub w3c / csswg-черновики#1693 или любая проблема CSS GitHub с префиксом " [css-env-1]".
оригинальный ответ 2017-11-09:
В последнее время рабочая группа CSS решила это переменные CSS Уровень 2 будет поддерживать пользовательские переменные среды с помощью env()
, и они попытаются сделать их действительными в медиа-запросы. Группа решила это после того, как Apple впервые предложила стандартные свойства пользовательского агента, незадолго до официального анонса iPhone X в сентябре 2017 года (см. также WebKit:" Разработка веб-сайтов для iPhone X " Тимоти Хортона). Затем другие представители браузера согласились с тем, что они будут в целом полезны для многих устройств, таких как телевизионные дисплеи и чернильная печать с кровоточащими краями. (env()
называли constant()
, но это уже сейчас устарел. Вы все еще можете видеть статьи, которые ссылаются на старое имя, например эта статья Петра-Павла Коха.) Прошло несколько недель,Кэмерон Маккормак из Mozilla понял что эти переменные среды будут использоваться в запросах мультимедиа и Tab Аткинс-младший из Google тогда понял что пользовательские переменные среды будут особенно полезны в качестве глобальных, не переопределяемых корневых переменных, используемых в запросах мультимедиа. Теперь,Дина "Дино" Джексон из Apple присоединится к Atkins на уровне редактирования 2.
вы можете подписаться на обновления по данному вопросу в w3c/csswg-drafts
выпуск GitHub #1693. (Для особенно важных исторических сведений разверните журналы собраний, встроенные в резолюции CSSWG встреча бота и поиск "MQ", что означает"медиа-запросы".)
я планирую обновить этот вопрос в будущем, когда произойдет больше событий. Будущее это интересно.
обновление 2018-02-08:
Предварительный Просмотр Технологии Safari 49 добавлена поддержка парсинга calc()
в медиа-запросов, которые могут быть прелюдией к поддержке env()
в них также.
обновление 2018-04-27:
Команда Chromium в Google решила начать работу над env()
. В ответ, Аткинс начал указывать env()
в отдельном неофициальном проекте стандарта: CSS переменные среды модуль Уровень 1. (См.его комментарий GitHub в w3c / csswg-черновики#1693 и его комментарий в w3c / csswg-черновики#1817.) Проект вызывает переменные в медиа-запросах как явный вариант использования:
поскольку переменные среды не зависят от значения чего-либо, взятого из определенного элемента, их можно использовать в местах, где нет очевидного элемента для рисования, например в
@media
правила, гдеvar()
функция не будет действительной.
если Вы читаете спецификацию и имеете беспокойство, или если вы хотите озвучить свою поддержку варианта использования медиа-запроса, вы все равно можете сделать это в GitHub w3c / csswg-черновики#1693 или любая проблема CSS GitHub с префиксом " [css-env-1]".
один из способов достичь желаемого-использовать пакет npm postcss-media-variables
.
Если вы в порядке с использованием пакетов npm, то вы можете посмотреть documentatoin для того же здесь
пример
/* input */
:root {
--min-width: 1000px;
--smallscreen: 480px;
}
@media (min-width: var(--min-width)) {}
@media (max-width: calc(var(--min-width) - 1px)) {}
@custom-media --small-device (max-width: var(--smallscreen));
@media (--small-device) {}
по-видимому, просто невозможно использовать собственные переменные CSS. Это один из ограничения.
умный способ использовать его-изменить ваши переменные в медиа-запросе, чтобы повлиять на весь ваш стиль. Я рекомендую в этой статье.
:root {
--gutter: 4px;
}
section {
margin: var(--gutter);
}
@media (min-width: 600px) {
:root {
--gutter: 16px;
}
}