406 votes

Inclure une autre classe dans SCSS

Je l'ai dans mon fichier SCSS :

.class-a{
  display: inline-block;
  //some other properties
  &:hover{
   color: darken(#FFFFFF, 10%);
 }  
}

.class-b{

 //Inherite class-a here

 //some properties
}

Dans la classe B, j'aimerais hériter de toutes les propriétés et déclarations imbriquées de class-a . Comment faire ? J'ai essayé d'utiliser @include class-a mais cela provoque une erreur lors de la compilation.

1 votes

Comment faire si la classe se trouve dans un autre fichier ?

791voto

F21 Points 7685

On dirait que @mixin et @include ne sont pas nécessaires dans un cas aussi simple que celui-ci.

On peut se contenter de le faire :

.myclass {
  font-weight: bold;
  font-size: 90px;
}

.myotherclass {
  @extend .myclass;
  color: #000000;
}

52 votes

@extend fonctionne bien, mais ne fonctionnera pas si l'une des classes se trouve dans une directive (généralement une requête média) ; à moins qu'elles ne se trouvent toutes deux dans la même directive.

21 votes

Voir ici pour quelques faits amusants sur @extend - il y a des effets secondaires délicats dont vous devez être conscient : stackoverflow.com/questions/30744625/

2 votes

Merci @ToniLeigh, les PlaceHolder sont intéressants car ils permettent d'économiser de la place pour la génération suivante. un sélecteur CSS supplémentaire si le sélecteur parent n'est utilisé que pour l'extension (il n'est utilisé nulle part). Comme dans l'exemple ci-dessus .myclass n'est utilisé nulle part ailleurs (je suppose) en dehors de .myotherclass il est donc préférable d'avoir .myclass défini comme %myclass et étendu en .myotherclass comme @extend %myclass; . Il sera généré comme .myotherclass{ font-weight: bold; font-size: 90px; color: #000000; }

73voto

Ashwin Points 1382

Essayez ceci :

  1. Créer une classe de base de remplacement (%base-class) avec les propriétés communes propriétés
  2. Étendez votre classe (.my-base-class) avec cet espace réservé.
  3. Vous pouvez désormais étendre %base-class à n'importe laquelle de vos classes (par exemple, .my-class).

    %base-class {
       width: 80%;
       margin-left: 10%;
       margin-right: 10%;
    }
    
    .my-base-class {
        @extend %base-class;
    }
    
    .my-class {
        @extend %base-class;
        margin-bottom: 40px;
    }

1 votes

@Yevgeniy Afanasyev Non, on n'étend pas directement une classe, mais on peut étendre directement un placeholder.

1 votes

@Yevgeniy Afanasyev étendre la classe directement (réponse la plus populaire) n'a pas fonctionné pour moi, mais étendre un placeholder a fonctionné. C'est pourquoi j'ai posté la réponse puisque ce n'est pas la même.

3 votes

Je vous remercie d'avoir publié une réponse alternative, mais votre réponse n'indique pas clairement pourquoi nous en avons besoin. Si vous pouviez ajouter plus de raisonnement pour clarifier un cas d'utilisation ou les avantages de cette approche, ce serait apprécié. Je vous remercie de votre attention.

28voto

mcmaxwell Points 327

Il s'agit de toutes les règles de .someclass en .myclass

.myclass {
    @extend .someclass;
}

42 votes

Bien que ce code puisse répondre à la question, le fait de fournir un contexte supplémentaire concernant le pourquoi et/ou le comment de cette réponse améliore sa valeur à long terme.

5 votes

@extend #{'.my-class', '.my-other-class'};

5 votes

Quelle est la signification du hashbang ici ?

17voto

Ari Points 937

L'utilisation de @extend est une bonne solution, mais il faut être conscient du fait que le code CSS compilé brisera la définition de la classe. Toutes les classes qui étendent le même placeholder seront regroupées et les règles qui ne sont pas étendues dans la classe seront dans une définition séparée. Si plusieurs classes sont étendues, il peut devenir difficile de trouver un sélecteur dans la css compilée ou dans les outils de développement. Alors qu'un mixin dupliquera le code du mixin et ajoutera tous les styles supplémentaires.

Vous pouvez voir la différence entre @extend et @mixin dans ce qui suit sassmeister

8voto

Khanji Points 151

Une autre option consisterait à utiliser un sélecteur d'attributs :

[class^="your-class-name"]{
  //your style here
}

Alors que toutes les classes commençant par "votre-nom-de-classe" utilisent ce style.

Dans votre cas, vous pourriez donc procéder de la manière suivante :

[class^="class"]{
  display: inline-block;
  //some other properties
  &:hover{
   color: darken(#FFFFFF, 10%);
 }  
}

.class-b{
  //specifically for class b
  width: 100px;
  &:hover{
     color: darken(#FFFFFF, 20%);
  }
}

En savoir plus sur les sélecteurs d'attributs sur w3Schools

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X