Toon posts:

Sass "&" uitbreiden inplaats van nesten.

Pagina: 1
Acties:

Vraag


  • Ed Vertijsment
  • Registratie: Juli 2014
  • Laatst online: 05-06 13:35
Mijn vraag

Kan ik in sass (scss) een selector uitbreiden met de parent (&) zonder interpolation?

Ik vind het lastig de vraag goed te formuleren (dat maakt zoeken ook wat lastiger) maar hier een wat uitgebreidere beschrijving:

Ik heb deze code structuur (versimpelt):
SCSS:
1
2
3
4
5
6
7
8
9
10
11
12
@mixin bar {
  @at-root .root & {
     font-family: foobar;
  }
}

.one,
.two {
  .foo {
    @include bar;
  }
}


Gecompileerd ziet dit er als volgt uit:
Cascading Stylesheet:
1
2
3
4
.root .one .foo,
.root .two .foo {
  font-family: foobar;
}


Nu is het echter zo dat .one en .two op hetzelfde element worden gezet als .root en dus niet genest zijn. De selector zou dus ".root.one .foo, .root.two .foo" moeten zijn.

Het komt wel vaker voor dat je in (minder ideale) scenario's een selector wilt uitbreiden met het geen er in een variabele of in de parent (&) zit. In dat geval kan je interpolation "#{&}" gebruiken aangezien direct aansluiten (".root&") niet mag. Maar als ik dat die in scss:
SCSS:
1
2
3
4
5
6
7
8
9
10
11
12
@mixin bar {
  @at-root .root#{&} {
     font-family: foobar;
  }
}

.one,
.two {
  .foo {
    @include bar;
  }
}


Krijg ik:
Cascading Stylesheet:
1
2
3
.root.one .foo, .two .foo {
  font-family: foobar;
}


En dat gaat dus mis: ".two .foo" heeft niet ".root" meegekregen. Waarschijnlijk door de volgorde waarin "&" expressies worden geëvalueerd.

Nu heb ik een workaround gevonden voor dit specifieke probleem maar ik vraag mij of er nou echt geen betere manier om "&" aan een selector te pakken zonder interpolations wat ik sowieso al lelijk vindt.

Relevante software en hardware die ik gebruik
node-sass 4.9.0 (Wrapper) [JavaScript]
libsass 3.5.4 (Sass Compiler) [C/C++]
Wat ik al gevonden of geprobeerd heb

Sass documentatie, google zoekopdrachten, en old-school trial and error, geen antwoord gevonden.

Alle reacties


  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

.root& mag niet, maar &.root mag wel en is in dit geval hetzelfde

Ah toch niet, sorry

[Voor 14% gewijzigd door Tsjilp op 28-10-2018 18:21]

Raar... Is zo gek nog niet


  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 25-05 13:32
Ed Vertijsment schreef op vrijdag 26 oktober 2018 @ 15:06:
[...]
En dat gaat dus mis: ".two .foo" heeft niet ".root" meegekregen. Waarschijnlijk door de volgorde waarin "&" expressies worden geëvalueerd.
[...]
Of het is een bug in libsass. Heb je het hun al gevraagd?

Full-stack webdeveloper in Groningen


  • Ed Vertijsment
  • Registratie: Juli 2014
  • Laatst online: 05-06 13:35
Spinal schreef op maandag 29 oktober 2018 @ 09:01:
[...]

Of het is een bug in libsass. Heb je het hun al gevraagd?
Het lijkt me niet da, dat het geval is. Als ik het met verschillende sass compilers probeer krijg ik iedere keer hetzelfde: https://www.sassmeister.c...b3b6b146f7551801fd65a8403

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

Ik denk dat het min of meer 'by design' is. De @at-root selector stapt gewoon uit de huidige scope en plaatst alleen alles in de root, en plempt je css selectors daar gewoon achter, maar houdt geen rekening met multiple selectors.
Ik ben bang dat je het anders aan zult moeten vliegen.

Kun je uitleggen waarom je het specifiek zo nodig hebt? Is er niet een andere oplossing voorhanden?

Raar... Is zo gek nog niet


  • Ed Vertijsment
  • Registratie: Juli 2014
  • Laatst online: 05-06 13:35
Tsjilp schreef op maandag 29 oktober 2018 @ 11:39:
Ik denk dat het min of meer 'by design' is. De @at-root selector stapt gewoon uit de huidige scope en plaatst alleen alles in de root, en plempt je css selectors daar gewoon achter, maar houdt geen rekening met multiple selectors.
Ik ben bang dat je het anders aan zult moeten vliegen.

Kun je uitleggen waarom je het specifiek zo nodig hebt? Is er niet een andere oplossing voorhanden?
In mij oorspronkelijk post gaf ik al aan dat voor dit specifieke probleem al een oplossing had gevonden. Ik vraag mij gewoon af of er een betere manier is om hiermee om te gaan aangezien in ik interpolation an sich al een lelijke manier van werken vindt.

De workaround:

SCSS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@mixin bar {
  $this: &;
  
  @at-root .root {
    &#{$this} {
     font-family: foobar;
    }
  }
}

.one,
.two {
  .foo {
    @include bar;
  }
}

Cascading Stylesheet:
1
2
3
.root.one .foo, .root .two .foo {
  font-family: foobar;
}


Update, hey, two lijkt nog steeds stuk...
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee