Holi, soy Nuzkito

y me dedico al desarrollo de software

Mixins y funciones en Stylus

En Stylus, las funciones y los mixins se declaran de la misma forma. La principal diferencia es que los mixins se comportan como si fuesen declaraciones de CSS. Las funciones, sin embargo, pueden devolver un valor.

Funciones

Las funciones pueden recibir parámetros, operar con ellos y devolver un resultado.

suma(a, b, u = false)
  if u
    return unit(a + b, u)
  else
    return a + b

Aquí definimos una función suma que puede recibir 3 parámetros, los dos sumandos y la unidad. Al declarar una función no es necesario agregar la palabra function como en muchos otros lenguajes. Simplemente se pone el nombre de la función seguido de los parámetros que reciba. Se pueden indicar parámetros opcionales asignándoles un valor por defecto dentro de la declaración, como en el caso de u.

La función hace lo siguiente: Suma los 2 valores, y si se le pasa una unidad, añade esa unidad al valor:

suma(20,30) // 50
suma(20, 30, px) // 50px
suma(20, 30, \%) // 50%

Fijémonos en el último ejemplo. Como el signo % es en realidad un operador, necesitamos escaparlo usando el caracter \. Si no, Stylus mostrará error de sintaxis.

return

Stylus permite eliminar el return de las funciones. Es capaz de detectar dónde debe poner un return de forma que no es necesario que lo especifiquemos:

suma(a, b, u = false)
  if u
    unit(a + b, u)
  else
    a + b

La regla es simple. Stylus pone un return por nosotros cuando el resultado de una operación no se asigna a una variable. Pero cuidado, si hay varios return, el último es el que se aplica:

suma(a, b)
  a + b
  a - b

suma(10, 5) // Devuelve 5.

Si escribes el return, se comportará correctamente:

suma(a, b)
  return a + b
  return a - b

suma(10, 5) // Devuelve 15.

Por lo que para evitar errores es recomendable escribir siempre el return en las funciones.

Argumentos

Tanto las funciones como los mixins tienen una variable local llamada arguments. Esta variable almacena en un array todos los valores pasados como argumentos:

function()
  arguments

function(10, 'string', #252) // 10 'string' #252

Podemos acceder a cada valor de arguments mediante su índice:

arguments[0] // 10
arguments[1] // 'string'
arguments[2] // #252

Esto nos permite poder crear funciones que acepten infinitos parámetros:

suma()
  total = 0
  for n in arguments
    total = total + n
  return total

suma(3, 2) // Devuelve 5
suma(1, 2, 3, 4, 5) // Devuelve 15

Mixins

Los mixins son muy útiles sobretodo a la hora de aplicar prefijos propietarios, como veremos en el siguiente ejemplo:

box-sizing()
  -webkit-box-sizing arguments
  -moz-box-sizing arguments
  box-sizing arguments

div
  box-sizing border-box

Sin embargo los mixins pueden ser útiles en otras ocasiones. Podemos aprovecharlos para evitar la repetición de código, que en CSS sucede muy a menudo. Si en nuestro código tenemos muchas cajas que necesitamos centrar horizontalmente, podemos crear un mixin para ello:

centered()
  margin-left auto
  margin-right auto

.centrado
  centered()
.otra-caja
  centered()

Esto nos dará el siguiente resultado:

.centrado {
  margin-left: auto;
  margin-right: auto;
}
.otra-caja {
  margin-left: auto;
  margin-right: auto;
}

Creando mixins para todas esas situaciones al final tendremos un desarrollo más agil, pues no necesitamos repetir tanto código una y otra vez.

También podemos usarlos para autogenerar partes más complejas de nuestro código, con el objetivo de reutilizarlos en los nuevos proyectos. En el próximo artículo veremos cómo crear estos mixins más avanzados, tratando de ver la utilidad de todas las propiedades y funciones que nos ofrece Stylus para ello.