usar - declaring css variable
Las variables nativas de CSS no funcionan en consultas de medios (6)
Estoy tratando de usar variables CSS en la consulta de medios y no funciona.
:root {
--mobile-breakpoint: 642px;
}
@media (max-width: var(--mobile-breakpoint)) {
}
Aparentemente, simplemente no es posible usar variables CSS nativas como esa. Es una de las limitations .
Una forma inteligente de usarlo es cambiar sus variables en la consulta de medios, para impactar todo su estilo. Recomiendo este artículo
:root {
--gutter: 4px;
}
section {
margin: var(--gutter);
}
@media (min-width: 600px) {
:root {
--gutter: 16px;
}
}
Como
Oriol ha respondido
, actualmente,
spec
.
Sin embargo, ha habido desarrollos recientes que abordarán este problema.
En unos años, una vez que
el Nivel 1 del Módulo de Variables de Entorno CSS
esté estandarizado e implementado, podremos usar variables
env()
en consultas de medios en todos los navegadores modernos.
Si lee la especificación y tiene alguna inquietud, o si desea expresar su apoyo al caso de uso de consultas de medios, aún puede hacerlo en GitHub w3c / csswg-drafts # 1693 o en cualquier problema de CSS GitHub con el prefijo "[ css-env-1] " .
Respuesta original
09-11-2017
: Recientemente, el
Grupo de trabajo CSS decidió
que las
Variables CSS Nivel 2 admitirán variables de entorno definidas por el usuario utilizando
env()
, e intentarán que sean válidas en las consultas de los medios
.
El Grupo resolvió esto
después de que Apple propuso por primera vez las propiedades estándar de agente de usuario
, poco antes del anuncio oficial del iPhone X en septiembre de 2017 (ver también
WebKit: "Diseño de sitios web para iPhone X" por Timothy Horton
).
Otros representantes del navegador acordaron que serían generalmente útiles en muchos dispositivos, como pantallas de televisión e impresión de tinta con bordes de sangrado.
(
env()
solía llamarse
constant()
, pero ahora ha quedado en desuso. Aún puede ver artículos que hacen referencia al nombre anterior, como
este artículo de Peter-Paul Koch
). Después de algunas semanas,
Cameron McCormack de Mozilla se dio cuenta de
que estas variables de entorno serían utilizables en consultas de medios, y
Tab Atkins, Jr., de Google, se dio cuenta de
que las variables de entorno definidas por el usuario serían especialmente útiles como variables raíz globales, no reemplazables, utilizables en consultas de medios.
Ahora,
Dean "Dino" Jackson de Apple se unirá a Atkins
en la edición del Nivel 2.
Puede suscribirse a las actualizaciones sobre este asunto en
w3c/csswg-drafts
GitHub número # 1693
.
(Para obtener detalles históricos especialmente relevantes, expanda los registros de la reunión integrados en las
resoluciones
del
CSSWG Meeting Bot
y busque "MQ", que significa "consultas de medios".)
Planeo actualizar esta pregunta en el futuro cuando ocurran más desarrollos. El futuro es emocionante.
Actualización
08/02/2018
:
Safari Technology Preview 49
ha agregado soporte para analizar
calc()
en consultas de medios, lo que también puede ser un preludio para admitir
env()
en ellas.
Actualización
27/04/2018
: el equipo de Chromium en Google decidió comenzar a trabajar en
env()
.
En respuesta, Atkins comenzó a especificar
env()
en un borrador de estándar no oficial separado: el
Módulo de Variables de Entorno CSS Nivel 1
.
(Consulte
su comentario de GitHub en w3c / csswg-drafts # 1693
y
su comentario en w3c / csswg-drafts # 1817.
) El borrador menciona las variables en las consultas de los medios como un caso de uso explícito:
Debido a que las variables de entorno no dependen del valor de nada extraído de un elemento en particular, se pueden usar en lugares donde no hay un elemento obvio del cual extraer, como en las reglas
@media
, donde la funciónvar()
no sería válido.
Si lee la especificación y tiene alguna inquietud, o si desea expresar su apoyo al caso de uso de consultas de medios, aún puede hacerlo en GitHub w3c / csswg-drafts # 1693 o en cualquier problema de CSS GitHub con el prefijo "[ css-env-1] " .
Actualización 2019-07-06 : El trabajo continúa en las especificaciones. El número 2627 de GitHub está dedicado a las variables ambientales personalizadas.
Como puede leer otras respuestas, aún no es posible hacerlo.
Alguien mencionó variables ambientales personalizadas (similares a las variables css personalizadas
env()
lugar de
var()
), y el principio es sólido, aunque todavía hay 2 problemas principales:
- soporte de navegador débil
- hasta ahora no hay forma de definirlos (pero probablemente lo será en el futuro, ya que hasta ahora solo es un borrador no oficial)
De la spec ,
La función
var()
se puede usar en lugar de cualquier parte de un valor en cualquier propiedad de un elemento. La funciónvar()
no se puede usar como nombres de propiedad, selectores o cualquier otra cosa además de los valores de propiedad. (Hacerlo generalmente produce una sintaxis no válida o, de lo contrario, un valor cuyo significado no tiene conexión con la variable).
Entonces no, no puede usarlo en una consulta de medios.
Y eso tiene sentido.
Debido a que puede establecer
--mobile-breakpoint
por ejemplo
:root
, es decir, el elemento
<html>
, y desde allí se heredará a otros elementos.
Pero una consulta de medios no es un elemento, no se hereda de
<html>
, por lo que no puede funcionar.
Esto no es lo que las variables CSS intentan lograr. Puede usar un preprocesador CSS en su lugar.
Sin embargo, lo que PUEDE hacer es consultar a @media su: declaración raíz.
/* 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) {}
Totalmente funciona en Chrome, Firefox y Edge al menos las últimas versiones de producción a partir de esta publicación.
Una forma de lograr lo que desea es usar el paquete
postcss-media-variables
.
Si está de acuerdo con el uso de paquetes npm, puede consultar la documentación aquí.
Ejemplo
:root {
/* desktop vars */
}
@media screen and (max-width: 479px) {
:root {
/* mobile vars */
}
}