Estou tentando combinar o uso de uma variável Sass com consultas @media da seguinte maneira:
$base_width:1160px;
@media screen and (max-width: 1170px) {$base_width: 960px;}
@media screen and (min-width: 1171px) {$base_width: 1160px;}
$base_width
é então definido em vários pontos nas medidas baseadas em porcentagem da largura da folha de estilo para produzir layouts fluidos.
Quando faço isso, a variável parece ser reconhecida corretamente, mas as condições para a consulta de mídia não. Por exemplo, o código acima produz um layout de 1160px, independentemente da largura da tela. Se eu inverter as instruções @media assim:
@media screen and (min-width: 1171px) {$base_width: 1160px;}
@media screen and (max-width: 1170px) {$base_width: 960px;}
Ele produz um layout de 960px, novamente independentemente da largura da tela. Observe também que, se eu remover a primeira linha, $base_width: 1160px;
ele retornará um erro para uma variável indefinida. Alguma ideia do que estou perdendo?
sass
media-queries
Jeremy S.
fonte
fonte
Respostas:
Isso simplesmente não é possível. Já o gatilho
@media screen and (max-width: 1170px)
acontece no lado do cliente.Alcançar o resultado esperado só seria possível se o SASS pegasse todas as regras e propriedades em sua folha de estilo contendo sua
$base_width
variável e as copiasse / alterasse de acordo.Uma vez que não funcionará automaticamente, você pode fazê-lo manualmente desta forma:
Isso não é realmente SECO, mas o melhor que você pode fazer.
Se as alterações forem as mesmas todas as vezes, você também pode preparar um mixin contendo todos os valores alterados, portanto, não será necessário repeti-lo. Além disso, você pode tentar combinar o mixin com mudanças específicas. Gostar:
E o Mixin ficaria assim
fonte
$foo: 1rem; @media (min-width: 10rem) {$foo: 2rem} .class {font-size: $foo} .class2 {padding: $foo}
resultaria em.class {font-size: 1rem} .class2 {padding: 1rem} @media (min-width: 10rem) (.class {font-size: 2rem} .class2 {padding: 2rem}}
Semelhante à resposta de Philipp Zedler, você pode fazer isso com um mixin. Isso permite que você tenha tudo em um único arquivo, se desejar.
fonte
Edit: Por favor, não use esta solução. A resposta por ronen é muito melhor.
Como uma solução DRY, você pode usar a
@import
instrução dentro de uma consulta de mídia, por exemplo, assim.Você define todos os elementos responsivos no arquivo incluído usando as variáveis definidas na consulta de mídia. Portanto, tudo o que você precisa repetir é a instrução import.
fonte
Isso não é possível com SASS, mas é possível com variáveis CSS (ou propriedades personalizadas CSS ). A única desvantagem é o suporte do navegador - mas na verdade existe um plugin PostCSS - postcss-css-variables - que "nivela" o uso de variáveis CSS (que também oferece suporte para navegadores mais antigos).
O exemplo a seguir funciona muito bem com SASS (e com postcss-css-variables você obtém suporte para navegadores mais antigos também).
Isso resultaria no seguinte CSS. As consultas de mídia repetitivas aumentam o tamanho do arquivo, mas descobri que o aumento geralmente é insignificante depois que o servidor da web é aplicado
gzip
(o que geralmente acontece automaticamente).fonte
Com a ótima resposta de @ronen e um mapa, existe algum poder real disponível:
Agora é possível ter muito mais consultas de mídia DRY direcionadas
.myDiv
com vários valores diferentes.Documentos do mapa: https://sass-lang.com/documentation/functions/map
Exemplo de uso de mapa: https://www.sitepoint.com/using-sass-maps/
fonte
Eu tive o mesmo problema.
A
$menu-width
variável deve ser 240px na visualização móvel@media only screen and (max-width : 768px)
e 340px na visualização desktop .Então, simplesmente criei duas variáveis:
E aqui está como eu usei:
fonte
Duas recomendações
1 Escreva suas instruções CSS "padrão" para telas pequenas e use apenas consultas de mídia para telas maiores. Normalmente, não há necessidade de uma
max-width
consulta à mídia.Exemplo (supondo que o elemento tenha a classe "contêiner")
2 Use variáveis CSS para resolver o problema, se puder .
Nota:
Uma vez que terá a largura de 1160 px quando a janela tem uma largura de 1170 px, pode ser melhor usar uma largura de 100% e largura máxima de 1160 px, e o elemento pai pode ter um preenchimento horizontal de 5 px, contanto que a propriedade box-sizing é definida como border-box. Existem várias maneiras de resolver o problema. Se o pai não for um contêiner flexível ou de grade, você poderá usar
.container { margin: auto }
.fonte