Estou tendo problemas com aninhamento em Sass. Digamos que eu tenha o seguinte HTML:
<p href="#" class="item">Text</p>
<p href="#" class="item">Text</p>
<a href="#" class="item">Link</a>
Quando tento aninhar meus estilos no seguinte, recebo um erro de compilação:
.item {
color: black;
a& {
color:blue;
}
}
Como faço referência a um seletor de tipo antes do seletor pai quando ele faz parte do mesmo elemento?
sass
css-selectors
McShaman
fonte
fonte
.item a.item
por algum motivo. Eu tentei fazera#{&}
por conta própria também e ainda deu o mesmo resultado.O
@at-root
método -only não resolverá o problema se você pretende estender o seletor mais próximo para cima na cadeia. Como um exemplo:Compilará para:
E se você precisar inserir sua tag em em
.element
vez de#id
?Existe uma função no Sass chamada
selector-unify()
que resolve isso. Usando isso com@at-root
é possível direcionar.element
.Compilará para:
fonte
#id > .element #id > div.element { color: blue; }
. Outra abordagem seria a utilizaçãoselector_replace
,#id { > .element { @at-root #{selector-replace(&,'.element', 'div.element')} { color: blue;}}}
. Aqui está um resumo para melhor legibilidade.selector-replace
também é outra maneira de fazer isso, mas requer saber o que é o seletor. Oselector-unify
método tem a vantagem de ser usado em mixins.Para começar, (no momento em que escrevi esta resposta) não há sintaxe sass que usa o seletor & . Se você fosse fazer algo assim, precisaria de um espaço entre o seletor e o E comercial. Por exemplo:
A outra maneira de usar o E comercial é provavelmente o que você está procurando (incorretamente):
Isso permite que você estenda os seletores com outras classes, IDs, pseudo-seletores, etc. Infelizmente para o seu caso, isso teoricamente compilaria para algo como .itema que obviamente não funciona.
Você pode apenas querer repensar como está escrevendo seu CSS. Existe um elemento pai que você poderia usar?
Dessa forma, você poderia facilmente escrever seu SASS da seguinte maneira:
(Observação: você deve dar uma olhada em seu html. Você está misturando aspas simples e duplas E colocando atributos href em tags p.)
fonte
href
tag em ump
escreva CSS funcional..item { a& }
e não há sintaxe sass para isso (tanto quanto eu sei. Sugeri que ele provavelmente estava procurando por algo como a sintaxe do e comercial que você descreveu, que é usada regularmente no Sass. No entanto, basear-se no exemplo do OP,.item { &a }
é não é válido e seria compilado.itema
. Exatamente como eu disse na minha resposta. Há algo que estou perdendo?.item { a& { ... } }
que agora pode ser feito como @Blaine aponta.item { @at-root a#{&} { ... } }
. A questão é que, se você tem uma classe no elemento, é fácil de fazer,.item { &.class { ... } }
então por que você não deveria ser capaz de fazer a mesma coisa com um elemento html bruto. Só porque não havia maneira de fazer isso no momento em que o OP postou, não significa que ele estava errado em querer que a funcionalidade realmente fizesse isso.AFAIK No caso de você querer combinar "e" comercial para a classe e as tags ao mesmo tempo, você precisa usar esta sintaxe:
irá compilar para
Outros usos (como usar a classe antes
@at-root
ou usar vários@at-root
s) levarão a erros.Espero que seja útil
fonte
#{&}
está basicamente enganando o compilador - ou isso sempre funcionará no futuro !?#{}
é avaliado. Também&
significa seletor de corrente. Então#{&}
é avaliado para.c1
.&
Esse recurso chegou na versão mais recente do Sass,
3.3.0.rc.1
(Maptastic Maple)
Os dois recursos intimamente relacionados que você precisará usar são o script
&
, que você pode interpolar em estilos aninhados para fazer referência a elementos pais, e o@at-root
diretiva, que coloca o seletor imediatamente seguinte ou bloco de css na raiz (não tem algum pai no css gerado)Veja este problema no Github para mais detalhes
fonte