variable style sibling multiple classes child based sass

sibling - sass style parent based on child



Sass ampersand, ¿seleccionar padre inmediato? (4)

¿Hay una manera en Sass de usar el signo y seleccionar el padre inmediato, en lugar del selector principal de todo el grupo? Por ejemplo:

.wrapper{ background-color: $colour_nav_bg; h1{ color: $colour_inactive; .active &{ color: red; } } }

compila a

.wrapper h1{ color: grey; } .active .wrapper h1{ color: red }

pero lo que realmente quiero es:

.wrapper .active h1{ color: red; }

¿Es la única opción para escribir el SCSS así?

.wrapper{ background-color: $colour_nav_bg; h1{ color: $colour_inactive; } .active h1{ color: red; } }

El HTML se ve así:

<ul class="wrapper"> <li class="active"> <h1>blah</h1> </li> </ul>


A menudo he querido hacer lo que me estás pidiendo y es un no ir. Sin embargo, escuché que puedes hacer ese tipo de cosas en Stylus. Pero hay otra cosa que puedes probar: usar @at-root para teletransportarse fuera de tu árbol de anidamiento. Por ejemplo:

.wrapper{ h1{ @at-root .wrapper .active h1 { color: red; } } }

Esto debería compilar hasta lo siguiente:

.wrapper .active h1 { color: red; }

Lo bueno es que usted mantiene su selector donde lógicamente tiene sentido en la estructura de anidamiento para propósitos de organización.


A partir de este momento, no hay un selector de Sass para el padre directo en lugar del padre de la raíz de un elemento. Hay & que (como usted sabe) selecciona la raíz principal. También hay % selectores de marcadores de posición que ocultan una regla hasta que se ha extended .

Sass es de open-sourced , por lo que podría contribuir con un nuevo selector "directo principal".


Necesitas envolver el contenido @ at-root en {}

.wrapper { h1 { @at-root { .wrapper .active h1 { color: red; } } } }


Puedes solucionar esto hoy con una mezcla como esta:

@mixin if-direct-parent($parent-selector) { $current-sequences: &; $new-sequences: (); @each $sequence in $current-sequences { $current-selector: nth($sequence, -1); $prepended-selector: join($parent-selector, $current-selector); $new-sequence: set-nth($sequence, -1, $prepended-selector); $new-sequences: append($new-sequences, $new-sequence, comma); } @at-root #{$new-sequences} { @content; } }

Dado que & es esencialmente una lista de listas, puede usar las funciones de lista ( nth , set-nth , join y append ) para crear la secuencia de selección que desee. Luego use @at-root para generar el nuevo selector en el nivel de raíz. Así es como lo usarías:

.grandparent-1, .grandparent-2 { color: red; .child { color: blue; @include if-direct-parent(''.parent'') { color: green; } } }

Que saldrá:

.grandparent-1, .grandparent-2 { color: red; } .grandparent-1 .child, .grandparent-2 .child { color: blue; } .grandparent-1 .parent .child, .grandparent-2 .parent .child { color: green; }