Contents

As diferenças entre CSS nativo e Sass Nesting

Desde o seu lançamento, o CSS tem-se recusado obstinadamente a suportar uma sintaxe para aninhar selectores. A alternativa sempre foi usar um pré-processador CSS como o Sass. Mas hoje, o aninhamento é oficialmente parte do CSS nativo. Pode experimentar esta funcionalidade diretamente nos browsers modernos.

Ao fazer a transição do Sass para o CSS nativo, é essencial ter em atenção as discrepâncias nas convenções de aninhamento utilizadas por cada sintaxe. Estas distinções podem ter um impacto considerável na estrutura do seu código e no estilo geral, pelo que é imperativo que se familiarize com estas variações antes de efetuar a mudança.

Você precisa usar “&” com seletores de elementos em CSS nativo

CSS Nesting ainda é um rascunho de especificação, com suporte variável do navegador. Certifique-se de que consulta sites como caniuse.com para obter informações actualizadas.

Aqui está uma demonstração do tipo de estrutura aninhada que pode ser empregue em Sass utilizando a sintaxe SCSS:

 .nav {
  ul { display: flex; }
  a { color: black; }
}

O trecho de código fornecido refere-se a regras de estilo para a barra de navegação de um documento HTML. Especificamente, determina que quaisquer listas ordenadas contidas num elemento com a classe “nav” devem ser apresentadas num alinhamento flexível (coluna). Além disso, determina que qualquer texto com hiperligação que apareça dentro desses elementos deve ter uma cor preta.

Nas CSS nativas, a forma de aninhamento acima referida é considerada inaceitável. Para que esta estrutura funcione eficazmente, é necessário incorporar o símbolo do E comercial (&) antes de cada elemento incluído, conforme ilustrado abaixo:

 .nav {
  & ul { display: flex; }
  & a { color: black; }
} 

Antes de uma alteração recente, a iteração inicial das Folhas de estilo em cascata (CSS) não permitia a inclusão de selectores de tipo. No entanto, com o último ajuste em vigor, é agora possível omitir a utilização do símbolo “&” ao incluir selectores de tipo. No entanto, os utilizadores devem ter em atenção que as iterações mais antigas de navegadores Web, como o Google Chrome e o Apple Safari, podem ainda não ser compatíveis com esta metodologia revista.

Nos casos em que um seletor começa com um símbolo, como um seletor de classe, é permitido excluir o e comercial ao escrever código CSS ou Sass. Isto significa que a sintaxe fornecida funcionará corretamente tanto em CSS convencional como em Sass.

 .nav {
  .nav-list { display: flex; }
  .nav-link { color: black; }
}

Não é possível criar um novo seletor usando “&” no CSS nativo

Um dos aspectos atraentes do Sass que você pode apreciar é sua capacidade de facilitar a geração de código por meio de construções como a demonstrada abaixo:

 .nav {
  &-list { display: flex; }
  &-link { color: black; }
}

O código Sass acima mencionado, após a compilação, produz a saída CSS não processada subsequente:

 .nav-list {
  display: flex;
}

.nav-link {
  color: black;
}

No CSS padrão, a utilização do símbolo “&” para criar um novo seletor não é suportada. No entanto, ao utilizar o Sass, o compilador substitui efetivamente o “&” pelo elemento envolvente, como “.nav”, evitando assim a formação de um seletor composto impróprio que produziria resultados diferentes dos pretendidos.

Esta instância de código deve funcionar corretamente utilizando a sintaxe CSS nativa:

 .nav {
  &.nav-list { display: flex; }
  &.nav-link { color: black; }
}

O código fornecido funciona devido à correspondência entre os selectores utilizados no mesmo. O primeiro seletor corresponde a elementos com nomes de classe “nav-list” ou “nav-link”, enquanto o segundo seletor visa especificamente os elementos com um nome de classe “nav-link”. A colocação de um espaço entre o símbolo “&” e o seletor subsequente (por exemplo, “nav .nav-list”) resultaria num erro de sintaxe inválido, uma vez que criaria um novo grupo constituído pelas classes “nav” e “.nav-list”, em vez de visar elementos que possuem ambas as classes.

No CSS nativo, a utilização de um símbolo de E comercial da forma demonstrada abaixo resultará num erro semântico:

 .nav {
  &__nav-list { display: flex; }
  &__nav-link { color: black; }
}

É o mesmo que escrever isto:

 __nav-list.nav {
  display: flex;
}

__nav-link.nav {
  color: black;
}

Pode ser inesperado, dado que ambos os elementos e residem no seletor .nav . No entanto, o e comercial ( & ) posiciona efetivamente os elementos aninhados antes do seu elemento pai.

A especificidade pode ser diferente

Vale a pena mencionar o efeito na precisão que ocorre com a sintaxe aninhada do Sass, em oposição à sua contraparte no CSS padrão, que merece atenção.

De facto, assumindo que existe um elemento principal e um elemento de artigo na sua estrutura HTML, a utilização do estilo CSS fornecido resultaria em que qualquer etiqueta h2 contida nesses elementos respectivos fosse apresentada com um tipo de letra serif.

 #main, article {
  h2 {
    font-family: serif;
  }
}

O CSS resultante gerado a partir do código Sass mencionado acima aparece da seguinte forma:

 #main h2,
article h2 {
  font-family: serif;
}

Em contraste com a utilização de selectores aninhados no CSS nativo, a utilização de uma estrutura equivalente através da mesma sintaxe produzirá um resultado comparável.

 :is(#main, article) h2 {
  font-family: serif;
}

O seletor is() em LESS difere ligeiramente do seu homólogo em Sass no que diz respeito ao tratamento das regras de especificidade. Em particular, quando se utiliza :is() , a especificidade do seletor é automaticamente elevada para a do elemento mais específico da lista de parâmetros fornecidos.

A ordem dos elementos pode alterar o elemento selecionado

O ato de aninhar no CSS nativo tem o potencial de alterar o significado pretendido de um determinado seletor, acabando por selecionar um elemento totalmente distinto.

Considere o seguinte HTML, por exemplo:

 <div class="dark-theme">
  <div class="call-to-action">
    <div class="heading"> Hello </div>
  </div>
</div>

E o seguinte CSS:

 body { font-size: 5rem; }

.call-to-action .heading {
  .dark-theme & {
    padding: 0.25rem;
    background: hsl(42, 72%, 61%);
    color: #111;
  }
}

A utilização do Sass como pré-processador de CSS produz o seguinte resultado:

/pt/images/screenshot-of-the-page.jpg

Num contexto HTML, se o elemento com a designação de classe “dark-theme” for inserido no contentor principal denotado pela classificação “call-to-action”, os critérios de seleção resultantes utilizados pelo Sass (um pré-processador CSS) tornar-se-ão disfuncionais. No entanto, ao abrigo da convenção CSS convencional (ou seja, sem recurso a pré-processadores CSS), as propriedades de estilo associadas permanecerão inalteradas e eficazes.

O comportamento resulta da forma como a pseudo-classe :is() funciona internamente, resultando na geração da subsequente representação CSS sem adornos mostrada abaixo:

 .dark-theme :is(.call-to-action .heading) {
  /* CSS code */
}

O cabeçalho em questão é um descendente tanto do elemento .dark-theme como do elemento .call-to-action , mas a sua ordem específica não afecta a sua funcionalidade. Desde que o título seja um descendente de ambos os elementos, o facto de estarem numa determinada ordem não afecta o resultado.

Neste cenário específico, trata-se de um caso menos comum, mas a compreensão do mecanismo intrínseco do seletor :is() pode melhorar a proficiência de alguém no que diz respeito a elementos aninhados em CSS. Além disso, esse conhecimento facilita o processo de resolução de problemas de CSS de forma mais eficaz.

Saiba como usar o Sass no React

Como resultado de sua capacidade de compilar para CSS, o Sass é compatível com uma ampla gama de estruturas de IU devido à sua compatibilidade com praticamente qualquer estrutura desse tipo. Sua instalação em várias plataformas, incluindo Vue, Preact, Svelte e React, é fácil, oferecendo uma experiência de integração perfeita em diferentes tecnologias.

A utilização do Sass no contexto do React oferece várias vantagens, nomeadamente a capacidade de criar estilos bem organizados e reutilizáveis através da implementação de variáveis e mixins. A proficiência nesta tecnologia pode aumentar significativamente a capacidade de produzir código refinado e engenhoso, promovendo o crescimento profissional como um programador React.