Usando Mixins en LESS

El tema de los preprocesadores de CSS, es un tema el cual no habia tocado en Código Adicto y es bien interesante usar preprocesadores de CSS para definir nuestras hojas de estilo, organizar mejor el código y utilizar los mixins lo cual es una maravilla. Resulta mas eficiente cuando se trabaja con grandes proyectos por la forma de trabajar con cada uno.

Actualmente entre los Pre-procedasadores de CSS más comunes se encuentra LESS, SASS y Stylus por ponerlos en orden alfabético, cada uno tiene sus ventajas y desventajas pero no es de eso de lo vamos hablar aquí sino de como usar los Mixins que son como funciones que aceptan parámetros que usan los pre-procesadores para agilizar el trabajo cuando estamos declarando propiedades en nuestro código de CSS.

En mi opinión personal el pre-procesador que mas me gusta usar es LESS por el fácil manejo y lo tan parecido que es a CSS. Para abordar el caso imaginemos que queremos hacer que los enlaces de nuestro sitio tengan una transición :hover al posicionarnos sobre ellos haciendo que estos cambien de color, comencemos por algo bien sencillo.

Esto es un ejemplo en CSS.

a {
  color: red;
  -webkit-transition: all .3s ease;
  -moz-transition: all .3s ease;
  -ms-transition: all .3s ease;
  -o-transition: all .3s ease;
  transition: all .3s ease;
}

a:hover {
  color: blue;
}

He indicado los prefijos para soportar la mayoría de los navegadores. Si me preguntan esto resulta muy fastidioso, cada ves que queremos usar propiedades de CSS3 tenemos que estar indicando los prefijos de diferentes navegadores para soportarlos. En LESS usando los Mixins esto solo tenemos que indicarlo solo una ves.

.Transitions {
  -webkit-transition: all .3s ease;
  -moz-transition: all .3s ease;
  -ms-transition: all .3s ease;
  -o-transition: all .3s ease;
  transition: all .3s ease;
}

a {
  color: red;
  .Transitions;
}

El resultado será tal y como lo hicimos con CSS al principio, pero ¿Qué pasa si queremos usar parámetros y no solo propiedades fijas?. Solo tenemos que modificar ligeramente el código.

.Transitions(@duration: 0.2s, @ease: ease-out) {
  -webkit-transition: all @duration @ease;
  -moz-transition: all @duration @ease;
  -o-transition: all @duration @ease;
  transition: all @duration @ease;
}

Para usarlo:

a {
  color: red;
  // pasando los parámetros para las propiedades
  .Transitions(.3s, ease-in);
}

Hay muchas cosas mas que se pueden implementar usando los Mixins en LESS como los border-radius, box-shadow, transform, gradients que resulta muy complicado usarlos solo con CSS, etc. Para ello te dejo unos fragmentos de código que uso para trabajar eficientemente con LESS y no desperdiciar tanto tiempo escribiendo propiedades y prefijos absurdos.

Usando los Mixins de LESS Elements

Estos Mixins pertenecen al proyecto LESS Elements.

.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) {
  background: @color;
  background: -webkit-gradient(linear,
                               left bottom,
                               left top,
                               color-stop(0, @start),
                               color-stop(1, @stop));
  background: -ms-linear-gradient(bottom,
                                  @start,
                                  @stop);
  background: -moz-linear-gradient(center bottom,
                                   @start 0%,
                                   @stop 100%);
}
.bw-gradient(@color: #F5F5F5, @start: 0, @stop: 255) {
  background: @color;
  background: -webkit-gradient(linear,
                               left bottom,
                               left top,
                               color-stop(0, rgb(@start,@start,@start)),
                               color-stop(1, rgb(@stop,@stop,@stop)));
  background: -ms-linear-gradient(bottom,
                                  rgb(@start,@start,@start) 0%,
                                  rgb(@start,@start,@start) 100%);
  background: -moz-linear-gradient(center bottom,
                                   rgb(@start,@start,@start) 0%,
                                   rgb(@stop,@stop,@stop) 100%);
}
.bordered(@top-color: #EEE, @right-color: #EEE, @bottom-color: #EEE, @left-color: #EEE) {
  border-top: solid 1px @top-color;
  border-left: solid 1px @left-color;
  border-right: solid 1px @right-color;
  border-bottom: solid 1px @bottom-color;
}
.drop-shadow(@x-axis: 0, @y-axis: 1px, @blur: 2px, @alpha: 0.1) {
  -webkit-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha);
  -moz-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha);
  box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha);
}
.rounded(@radius: 2px) {
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
  border-radius: @radius;
  -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 
}
.border-radius(@topright: 0, @bottomright: 0, @bottomleft: 0, @topleft: 0) {
  -webkit-border-top-right-radius: @topright;
  -webkit-border-bottom-right-radius: @bottomright;
  -webkit-border-bottom-left-radius: @bottomleft;
  -webkit-border-top-left-radius: @topleft;
  -moz-border-radius-topright: @topright;
  -moz-border-radius-bottomright: @bottomright;
  -moz-border-radius-bottomleft: @bottomleft;
  -moz-border-radius-topleft: @topleft;
  border-top-right-radius: @topright;
  border-bottom-right-radius: @bottomright;
  border-bottom-left-radius: @bottomleft;
  border-top-left-radius: @topleft;
  -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 
}
.opacity(@opacity: 0.5) {
  -moz-opacity: @opacity;
  -khtml-opacity: @opacity;
  -webkit-opacity: @opacity;
  opacity: @opacity;
}
.transition-duration(@duration: 0.2s) {
  -moz-transition-duration: @duration;
  -webkit-transition-duration: @duration;
  transition-duration: @duration;
}
.rotation(@deg:5deg){
  -webkit-transform: rotate(@deg);
  -moz-transform: rotate(@deg);
  transform: rotate(@deg);
}
.scale(@ratio:1.5){
  -webkit-transform:scale(@ratio);
  -moz-transform:scale(@ratio);
  transform:scale(@ratio);
}
.transition(@duration:0.2s, @ease:ease-out) {
  -webkit-transition: all @duration @ease;
  -moz-transition: all @duration @ease;
  -o-transition: all @duration @ease;
  transition: all @duration @ease;
}
.inner-shadow(@horizontal:0, @vertical:1px, @blur:2px, @alpha: 0.4) {
  -webkit-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha);
  -moz-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha);
  box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha);
}
.box-shadow(@arguments) {
  -webkit-box-shadow: @arguments;
  -moz-box-shadow: @arguments;
  box-shadow: @arguments;
}
.columns(@colwidth: 250px, @colcount: 0, @colgap: 50px, @columnRuleColor: #EEE, @columnRuleStyle: solid, @columnRuleWidth: 1px) {
  -moz-column-width: @colwidth;
  -moz-column-count: @colcount;
  -moz-column-gap: @colgap;
  -moz-column-rule-color: @columnRuleColor;
  -moz-column-rule-style: @columnRuleStyle;
  -moz-column-rule-width: @columnRuleWidth;
  -webkit-column-width: @colwidth;
  -webkit-column-count: @colcount;
  -webkit-column-gap: @colgap;
  -webkit-column-rule-color: @columnRuleColor;
  -webkit-column-rule-style: @columnRuleStyle;
  -webkit-column-rule-width: @columnRuleWidth;
  column-width: @colwidth;
  column-count: @colcount;
  column-gap: @colgap;
  column-rule-color: @columnRuleColor;
  column-rule-style: @columnRuleStyle;
  column-rule-width: @columnRuleWidth;
}
.translate(@x:0, @y:0) {
  -moz-transform: translate(@x, @y);
  -webkit-transform: translate(@x, @y);
  -o-transform: translate(@x, @y);
  -ms-transform: translate(@x, @y);
  transform: translate(@x, @y);
}

Mas Lecturas de Referencias

Siempre es recomendable pasarse por algunos sitios y leerse buenos artículos como esto que nos ayudan a ampliar nuestro conocimientos con las mejores practicas posibles.

Useful CSS3 LESS Mixins
A Comprehensive Introduction To LESS Mixins
A Collection Of Mixins for LESS

Recomendado