Tengo problemas para anidar en Sass. Digamos que tengo el siguiente HTML:
<p href="#" class="item">Text</p>
<p href="#" class="item">Text</p>
<a href="#" class="item">Link</a>
Cuando intento anidar mis estilos en lo siguiente, aparece un error de compilación:
.item {
color: black;
a& {
color:blue;
}
}
¿Cómo hago referencia a un selector de tipo antes del selector principal cuando es parte del mismo elemento?
sass
css-selectors
McShaman
fuente
fuente
.item a.item
por alguna razón. Intenté hacerloa#{&}
solo también y sigue siendo el mismo resultado.El
@at-root
método -only no resolverá el problema si tiene la intención de extender el selector más cercano en la cadena. Como ejemplo:Se compilará para:
¿Qué sucede si necesita unir su etiqueta a en
.element
lugar de#id
?Hay una función en Sass llamada
selector-unify()
que resuelve esto. Usando esto con@at-root
es posible apuntar.element
.Se compilará para:
fuente
#id > .element #id > div.element { color: blue; }
. Otro enfoque sería usarselector_replace
,#id { > .element { @at-root #{selector-replace(&,'.element', 'div.element')} { color: blue;}}}
. Aquí hay una esencia para una mejor legibilidad.selector-replace
también es otra forma de hacerlo, pero requiere saber qué es el selector. Elselector-unify
método tiene la ventaja de ser utilizado en mixins.Para empezar, (al momento de escribir esta respuesta) no hay una sintaxis sass que use selector & . Si fuera a hacer algo así, necesitaría un espacio entre el selector y el ampersand. Por ejemplo:
La otra forma de usar el ampersand es probablemente lo que está buscando (incorrectamente):
Esto le permite extender los selectores con otras clases, ID, pseudo-selectores, etc. Desafortunadamente para su caso, esto teóricamente se compilaría en algo como .itema que obviamente no funciona.
Es posible que desee reconsiderar cómo está escribiendo su CSS. ¿Hay algún elemento principal que pueda utilizar?
De esta manera, podría escribir fácilmente su SASS de la siguiente manera:
(Nota al margen: debería echar un vistazo a su html. Está mezclando comillas simples y dobles Y poniendo atributos href en etiquetas p).
fuente
href
etiqueta en unp
escriba CSS que funcione..item { a& }
y no hay una sintaxis sass para eso (hasta donde yo sé, sugerí que probablemente estaba buscando algo como la sintaxis ampersand que describiste, que se usa con bastante regularidad en Sass. Sin embargo, basándose en el ejemplo de OP,.item { &a }
es no válida y se compilará a.itema
.. al igual que dije en mi respuesta es que hay algo que me falta?.item { a& { ... } }
que ahora se puede hacer como señala @Blaine con.item { @at-root a#{&} { ... } }
. El punto es que si tiene una clase en el elemento, es fácil hacerlo,.item { &.class { ... } }
¿por qué no debería poder hacer lo mismo con un elemento html sin formato? El hecho de que no hubiera forma de hacerlo en el momento en que OP publicó no significa que no haya sido correcto querer que la funcionalidad lo haga.AFAIK En caso de que desee combinar el ampersand para la clase y las etiquetas al mismo tiempo, debe utilizar esta sintaxis:
se compilará para
Otros usos (como usar la clase antes
@at-root
o usar múltiples@at-root
s) conducirán a errores.Espero que te sea de utilidad
fuente
#{&}
que básicamente está engañando al compilador, ¿¡o esto siempre funcionará en el futuro !?#{}
se evalúa todo lo que hay dentro . También&
significa selector de corriente. Por lo que#{&}
se evalúa.c1
.&
Esta función ha llegado a la versión más reciente de Sass,
3.3.0.rc.1
(Maptastic Maple)
Las dos características estrechamente relacionadas que necesitará usar son el programable
&
, que puede interpolar dentro de estilos anidados para hacer referencia a elementos principales, y la@at-root
directiva, que coloca el selector o bloque de CSS inmediatamente siguiente en la raíz (no lo hará). tener padres en el css generado)Consulte este problema de Github para obtener más detalles.
fuente