Información del post ⇣

Excepciones y variantes con @mixins

Las excepciones en los estilos fomentan la pérdida de control de las hojas de estilo (css).

Una forma de mantener el control de estas excepciones es mediante @mixins.

En sass podemos definir fácilmente "mixins", que nos permiten crear variantes de un estilo evitando las excepciones.

La excepción

Tenemos un @mixin para los titulares.

@mixin title(){
	color: blue;
	font-size: 3em;
}

Sería muy fácil crear la excepción en la misma declaración donde se usa el @include pero perdemos el control del estilo "title" y generamos más código del necesario ya que sobrescribimos el valor de la propiedad color .

	.title__bg-dark{
		@include title();
		color: white;
	}

Css resultante:

.title__bg-dark {
  color: blue;
  font-size: 3em;
  color: white;
}

Pasar valores con variables no es la solución

También podríamos pasar un valor con una variable al @mixin, pero estaríamos en un caso muy similar ya que el valor lo definimos en cada declaración y sigue siendo difícil de controlar.

	@mixin title($color: blue){
		color: $color;
		font-size: 3em;
	}

	.title__bg-dark{
		@include title($color: white);
	}

Variantes para las excepciones

La solución pasa por crear variantes para cada excepción.

	@mixin title($has-background: default) {
		font-size: 3em;
		
		@if $has-background == default{
		    color: blue;
		} @else if $has-background == dark {
			color: white;
		}
	}

Entonces aplicamos la variante donde nos convenga. Si definimos en el @mixin que el comportamiento por defecto sea "default" @mixin title($background: default){...} no necesitaremos declararlo en el @include para usarlo

	.title__default{
		@include title();
	}
	
	.title__bg-dark{
		@include title($has-background: dark);
	}

El escenario ideal

Para mi, el escenario ideal sería cuando a una declaración le asignamos un @include y este incluye todas las opciones de estilo necesarias y solo necesitamos declarar las propiedades de posicionamiento fuera del @include.

No es conveniente añadir excepciones de posicionamiento a los @mixins de estilo, ya que el posicionamiento viene determinado por los elementos que lo rodean y las variantes podrían ser infinitas.

	.title{
		@include title();
		grid-column: 2;
		margin-block-start: 2em;
		padding-inline: 1em;
	} 

Todo esto nos facilita ver todas las versiones de un estilo, los titulares en este caso, solo mirando el código del @mixin title(); ahora el trabajo es mantener ese @mixin, solo declarando las variantes necesarias y dividiéndolo en otros "@mixins" más pequeños si se hace difícil de entender o mantener.