J'ai du mal à nicher à Sass. Disons que j'ai le code HTML suivant:
<p href="#" class="item">Text</p>
<p href="#" class="item">Text</p>
<a href="#" class="item">Link</a>
Lorsque j'essaye d'imbriquer mes styles dans ce qui suit, j'obtiens une erreur de compilation:
.item {
color: black;
a& {
color:blue;
}
}
Comment référencer un sélecteur de type avant le sélecteur parent lorsqu'il fait partie du même élément?
sass
css-selectors
McShaman
la source
la source
.item a.item
pour une raison quelconque. J'ai essayé de faire moia#{&}
-même aussi et toujours le même résultat.La
@at-root
méthode -only ne résoudra pas le problème si vous avez l'intention d'étendre le sélecteur le plus proche de la chaîne. Par exemple:Compilera pour:
Que faire si vous devez joindre votre balise au
.element
lieu de#id
?Il y a une fonction dans Sass appelée
selector-unify()
qui résout ce problème. En utilisant ceci avec@at-root
il est possible de cibler.element
.Compilera pour:
la source
#id > .element #id > div.element { color: blue; }
. Une autre approche serait d'utiliserselector_replace
,#id { > .element { @at-root #{selector-replace(&,'.element', 'div.element')} { color: blue;}}}
. Voici un résumé pour une meilleure lisibilité.selector-replace
c'est aussi une autre façon de le faire, mais cela nécessite de savoir ce qu'est le sélecteur. Laselector-unify
méthode a l'avantage d'être utilisée dans les mixins.Pour commencer, (au moment de la rédaction de cette réponse), il n'y a pas de syntaxe sass qui utilise le sélecteur & . Si vous deviez faire quelque chose comme ça, vous auriez besoin d'un espace entre le sélecteur et l'esperluette. Par exemple:
L'autre façon d'utiliser l'esperluette est probablement ce que vous recherchez (à tort):
Cela vous permet d'étendre les sélecteurs avec d'autres classes, ID, pseudo-sélecteurs, etc. Malheureusement pour votre cas, cela se compilerait théoriquement en quelque chose comme .itema qui ne fonctionne évidemment pas.
Vous voudrez peut-être simplement repenser la façon dont vous écrivez votre CSS. Y a-t-il un élément parent que vous pourriez utiliser?
De cette façon, vous pouvez facilement écrire votre SASS de la manière suivante:
(Note latérale: vous devriez jeter un oeil à votre html. Vous mélangez des guillemets simples et doubles ET mettez des attributs href sur les balises p.)
la source
href
balise sur unp
pour écrire du CSS fonctionnel..item { a& }
et il n'y a pas de syntaxe sass pour cela (pour autant que je sache. J'ai suggéré qu'il recherchait probablement quelque chose comme la syntaxe de l'esperluette que vous avez décrite et qui est utilisée assez régulièrement dans Sass. Cependant, en s'appuyant sur l'exemple d'OP,.item { &a }
c'est non valide et je compilerais.itema
. Comme je l'ai dit dans ma réponse. Y a-t-il quelque chose qui me manque?.item { a& { ... } }
ce qui peut maintenant être fait comme le souligne @Blaine.item { @at-root a#{&} { ... } }
. Le fait est que si vous avez une classe sur l'élément, il est facile de le faire,.item { &.class { ... } }
alors pourquoi ne devriez-vous pas pouvoir faire la même chose avec un élément html brut. Ce n'est pas parce qu'il n'y avait aucun moyen de le faire au moment de la publication de l'OP qu'il avait tort de vouloir que la fonctionnalité le fasse réellement.AFAIK Si vous souhaitez combiner une esperluette pour la classe et les balises en même temps, vous devez utiliser cette syntaxe:
compilera en
D'autres utilisations (comme utiliser la classe avant
@at-root
ou utiliser plusieurs@at-root
s) entraîneront des erreurs.J'espère que ça sera utile
la source
#{&}
c'est essentiellement duper le compilateur - ou cela fonctionnera toujours à l'avenir !?#{}
est évalué. Signifie également&
le sélecteur de courant. Donc#{&}
est évalué à.c1
.&
Cette fonctionnalité a atterri dans la dernière version de Sass,
3.3.0.rc.1
(Maptastic Maple)
Les deux fonctionnalités étroitement liées que vous devrez utiliser sont le scriptable
&
, que vous pouvez interpoler dans un style imbriqué pour référencer les éléments parents, et la@at-root
directive, qui place le sélecteur ou le bloc de css immédiatement suivant à la racine (il ne sera pas avoir des parents dans le css produit)Voir ce problème Github pour plus de détails
la source