Estoy tratando de combinar el uso de una variable Sass con consultas @media de la siguiente manera:
$base_width:1160px;
@media screen and (max-width: 1170px) {$base_width: 960px;}
@media screen and (min-width: 1171px) {$base_width: 1160px;}
$base_width
luego se define en varios puntos en las medidas basadas en porcentajes de ancho de la hoja de estilo para producir diseños fluidos.
Cuando hago esto, la variable parece reconocerse correctamente, pero no las condiciones para la consulta de medios. Por ejemplo, el código anterior produce un diseño de 1160 px independientemente del ancho de la pantalla. Si cambio las declaraciones de @media así:
@media screen and (min-width: 1171px) {$base_width: 1160px;}
@media screen and (max-width: 1170px) {$base_width: 960px;}
Produce un diseño de 960 px, nuevamente independientemente del ancho de la pantalla. También tenga en cuenta que si elimino la primera línea $base_width: 1160px;
, devuelve un error para una variable indefinida. ¿Alguna idea de lo que me estoy perdiendo?
fuente
Respuestas:
Esto simplemente no es posible. Dado que el desencadenante
@media screen and (max-width: 1170px)
ocurre en el lado del cliente.Lograr el resultado esperado solo sería posible si SASS tomara todas las reglas y propiedades en su hoja de estilo que contiene su
$base_width
variable y las copiara / cambiara en consecuencia.Como no funcionará automáticamente, puede hacerlo a mano de esta manera:
Esto no es realmente SECO, pero es lo mejor que puede hacer.
Si los cambios son los mismos cada vez, también puede preparar un mixin que contenga todos los valores cambiantes, por lo que no tendrá que repetirlo. Además, puede intentar combinar el mixin con cambios específicos. Me gusta:
Y el Mixin se vería así
fuente
$foo: 1rem; @media (min-width: 10rem) {$foo: 2rem} .class {font-size: $foo} .class2 {padding: $foo}
daría como resultado.class {font-size: 1rem} .class2 {padding: 1rem} @media (min-width: 10rem) (.class {font-size: 2rem} .class2 {padding: 2rem}}
Similar a la respuesta de Philipp Zedler, puede hacerlo con un mixin. Eso le permite tener todo en un solo archivo si lo desea.
fuente
Editar: No utilice esta solución. La respuesta de ronen es mucho mejor.
Como solución DRY, puede utilizar la
@import
declaración dentro de una consulta de medios, por ejemplo, como esta.Defina todos los elementos de respuesta en el archivo incluido utilizando las variables definidas en la consulta de medios. Entonces, todo lo que necesita repetir es la declaración de importación.
fuente
Esto no es posible con SASS, pero es posible con variables CSS (o propiedades personalizadas de CSS ). El único inconveniente es la compatibilidad con el navegador, pero en realidad hay un complemento PostCSS, postcss-css-variables , que "aplana" el uso de variables CSS (lo que también le brinda soporte para navegadores antiguos).
El siguiente ejemplo funciona muy bien con SASS (y con postcss-css-variables también obtiene soporte para navegadores más antiguos).
Esto daría como resultado el siguiente CSS. Las consultas de medios repetitivas aumentarán el tamaño del archivo, pero he descubierto que el aumento suele ser insignificante una vez
gzip
que se aplica el servidor web (lo que suele suceder automáticamente).fuente
Con la gran respuesta de @ ronen y un mapa, hay algo de poder real disponible:
Ahora es posible tener muchas más consultas de medios DRY dirigidas
.myDiv
con un montón de valores diferentes.Documentos del mapa: https://sass-lang.com/documentation/functions/map
Ejemplo de uso del mapa: https://www.sitepoint.com/using-sass-maps/
fuente
Yo tuve el mismo problema.
La
$menu-width
variable debe ser de 240 px en la vista móvil@media only screen and (max-width : 768px)
y 340 px en la vista de escritorio .Así que simplemente he creado dos variables:
Y así es como lo he usado:
fuente
Dos recomendaciones
1 Escriba sus declaraciones CSS "predeterminadas" para que sean para pantallas pequeñas y use solo consultas de medios para pantallas más grandes. Por lo general, no es necesario realizar una
max-width
consulta de medios.Ejemplo (asumiendo que el elemento tiene la clase "contenedor")
2 Utilice variables CSS para resolver el problema, si puede .
Nota:
Dado que tendrá un ancho de 1160px cuando la ventana tenga un ancho de 1170px, puede ser mejor usar un ancho de 100% y un ancho máximo de 1160px, y el elemento principal puede tener un relleno horizontal de 5px, siempre que la propiedad box-sizing se establece en border-box. Hay muchas formas de resolver el problema. Si el padre no es un contenedor flexible o de cuadrícula, puede usar
.container { margin: auto }
.fuente