Incluyendo otra clase en SCSS


309

Tengo esto en mi archivo SCSS:

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

.class-b{

 //Inherite class-a here

 //some properties
}

En la clase b, me gustaría heredar todas las propiedades y declaraciones anidadas de class-a. ¿Cómo se hace esto? Intenté usarlo @include class-a, pero eso solo arroja un error al compilar.

Respuestas:


624

Parece @mixiny @includeno es necesario para un caso simple como este.

Uno solo puede hacer:

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

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

40
@extend funciona bien, pero no funcionará si alguna de las clases está dentro de una directiva (generalmente una consulta de medios); a menos que ambos estén en la misma directiva.
MartinAnsty

13
vea aquí algunos datos divertidos sobre @extend- hay algunos efectos secundarios difíciles que debe tener en cuenta: stackoverflow.com/questions/30744625/…
Toni Leigh

2
Gracias @ToniLeigh, los PlaceHolder son interesantes ya que ahorran la generación de un selector CSS adicional si el selector principal solo se usa para extender (no se usa en ninguna parte). Al igual que en el ejemplo anterior, .myclassno se usa en ningún otro lugar (supongo) aparte de .myotherclass, entonces es mejor haber .myclassdefinido %myclassy extendido .myotherclasscomo @extend %myclass;. Se generará como.myotherclass{ font-weight: bold; font-size: 90px; color: #000000; }
Abhijeet


@MartinAnsty Bueno, eso apesta.
Abram

51

Prueba esto:

  1. Crear una clase base de marcador de posición (% base-class) con las propiedades comunes
  2. Extienda su clase (.my-base-class) con este marcador de posición.
  3. Ahora puede extender% clase base en cualquiera de sus clases (por ejemplo, mi clase).

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

Creo que esta respuesta es la misma que la más popular. Estoy en lo cierto?
Yevgeniy Afanasyev

1
@Yevgeniy Afanasyev No, no extiende una clase directamente, pero puede extender directamente un marcador de posición.
Ashwin

Nunca se le preguntó :(
Yevgeniy Afanasyev

1
@Yevgeniy Afanasyev extender la clase directamente (la respuesta más popular) no funcionó para mí, pero extender un marcador de posición hizo el trabajo. Por lo tanto, publiqué la respuesta, ya que no es la misma respuesta.
Ashwin

3
Gracias por publicar una respuesta alternativa, pero no está claro en su respuesta por qué la necesitamos. Si puede agregar más razonamientos para aclarar un caso de uso o las ventajas de este enfoque, se lo agradeceríamos. Gracias.
Yevgeniy Afanasyev

16

Usar @extend es una buena solución, pero tenga en cuenta que el CSS compilado romperá la definición de la clase. Cualquier clase que extienda el mismo marcador de posición se agrupará y las reglas que no se extiendan en la clase se definirán por separado. Si se amplían varias clases, puede resultar desordenado buscar un selector en el css compilado o en las herramientas de desarrollo. Mientras que un mixin duplicará el código mixin y agregará cualquier estilo adicional.

Puedes ver la diferencia entre @extend y @mixin en este sassmeister


El enlace sassmeister está roto.
LexieHankins

11
@extend .myclass;
@extend #{'.my-class'};

22
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
adiga

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

2
¿Cuál es el significado del hashbang aquí?
Konrad Viltersten

7

Otra opción podría ser usar un selector de atributos:

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

Mientras que cada clase que comienza con "your-class-name" usa este estilo.

Entonces, en su caso, podría hacerlo así:

[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%);
  }
}

Más información sobre los selectores de atributos en w3Schools

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.