Metodologias CSS (y 5): Conclusiones

Vemos que los esquemas de lo que clásicamente se han considerado  “buenas practicas” de css resulta que no lo son siempre ni para todo el mundo y hay sangrientas  peleas  entre hermanos del frontend acerca de si es mejor añadir una clase al html  o poner un selector en el css.

 Dios nos dio el poder de resolver un problema con css de mil formas distintas y se nos ha ido de las manos 🙂

Hemos visto una forma de estructurar el css (Smacss) y tres metodologias para la nomenclatura/organización de las clases (BEM, DRY, Atomic).
Estas metodologias sirven para solucionar con distintas estrategias  una serie de problemas que da el css al escalar, basicamente:

  • Guerras de especificidad
  • Herencias no deseadas
  • Ligazon html-css

Desde mi punto de vista, si no tienes estos problemas, tu proyecto es pequeño, etc. quizá es mejor no utilizar ninguna y seguir las practicas clásicas, ya que cada metodología tiene sus inconvenientes acarreados. Planificando bien no debería uno tener ningún problema de los anteriores, es más, la herencia y especificidad pueden jugar a tu favor.

Otra cosa es un proyecto con mil y pico archivos scss y 94 developers como he leido que tiene Linkedin, eso no hay planificación previa que lo organice y ahi si que traerá ventajas adoptar un sistema de nomenclatura u otro.
¿Mejor añadir clases al html o selectores al css? ¿Tengo libre acceso al html? ¿lo tengo al css?¿Voy a usar preprocesadores? ¿somos un equipo pequeño o grande?
En función de las respuestas se elige uno, o ninguno y se adopta un mix de soluciones.

¿Tengo que compartir un único css entre muchos sitios con distintos htmls?
Quizá ATOMIC

¿Tengo que compartir un único html entre muchos sitios con distintos css sin acceso al html?
Quizá DRY

¿Tengo que mantener un sitio muy complejo con varios developers trabajando en el html/css ?
Quiza BEM

Todos los sistemas son un punto de compromiso distinto entre las distintas opciones que nos planteamos al hacer un css y las dos principales vias de ligar css y html:

-Clases semánticas acerca del contenido (.autor_bio), el CSS depende del HTML.
El HTML es “reestilable” sin tocarlo, pero el css no se puede reutilizar. (EJ: CSS Zen Garden)

-Clases semanticas acerca del diseño (.white_panel”), el HTML depende del CSS. 
El CSS es reutilizable pero el html no se puede reestilar sin tocarlo. (Bootstrap)

Aquí esta la experiencia de un hombre que conforme el proyecto creia se encontró con el problema que yo temo de BEM (entre otros), hay que hacer cientos de clases muy parecidas, acabo así:
https://medium.engineering/simple-style-sheets-c3b588867899

After more thought and some experimentation, we found a middle way: get rid of modifiers, leave non-atomic CSS only for low-level interface components (buttons, links, lists, and so on) and have the rest use these very specific atomic classes.

Al final esta es la via, tomar de cada sistema lo que a uno le interese cuando le interese. Nos podemos quedar con la jerarquia de css paralela que propone BEM, con el uso avanzado de grupos de DRY, con las utility class de Atomic y montar un sistema mixto adaptado a lo que se necesite.

Porque no me gusta BootStrap

En mi actual puesto de trabajo se utilizaba BS por doquier, y progresivamente lo vamos retirando y ahora las paginas son más  sencillas  y fáciles de mantener al estar basadas las plantillas y soluciones propias, solo con el código que necesitamos y NO MÁS de lo que necesitamos,  el código extra, aunque “no haga nada”, siempre molesta y obliga a mantenimiento de una forma u otra.

Entiendo que BS tiene su uso adecuado (al principio el propio BS recomendaba no usarlo en producción, solo para prototipar), pero se ha universalizado y se usa en sitios donde causa más problemas que ventajas.
En mi opinión BS tiene su utilidad para gente que no sabe CSS, te ofrece un sistema sencillo de utilizar donde no te tienes que pelear con los paddings, plantear un grid, etc. Sigues sus normas y te aseguras un resultado aceptable y consistente, pero si eres mínimamente competente con CSS, no hay motivo para usar BS por los siguientes problemas (en mi opinión, ojo). Vaya por delante que hablo de la versión 3 de BootStrap, que es la que conozco y la que se usa mayoritariamente.

Bootstrap liga contenidos y presentación.

Aunque últimamente esta en discusión, o simplemente desechada, me sigue gustando el viejo paradigma de no ligar el marcado HTML a un diseño determinado, el “enfoque Css Garden”.
En el código html solo debería haber referencias a la función de los contenidos, no a su presentación, eso es tarea del CSS.  En el html un titular deberia bastar con poco mas que un <h1> y alguna clase que nos informe de su función en un momento dado, como si titular de un destacado, del cuerpo de una noticia, etc., no deberiamos añadirle clases para indicar si es de un determinado color, o se alinea a un lado u otro. BS nos devuelve a los tiempos en que se usaba <center> para centrar un contenido o <font> para indicar el color de un texto. Con BS, si trabajas de la forma correcta,  tienes que editar el html para cambiar la presentación, lo que, en ámbitos empresariales por ejemplo,  a veces implica la intervención extra de un programador, aprobación por parte de terceros del cambio de contenidos, etc. complicando una labor que debería ser sencilla y trivial.

Bootstrap es poco eficiente.

Las soluciones de amplio espectro nunca son eficientes, como una navaja suiza, son validas para situaciones de emergencia (prototipos)  pero no para resolver un problema real (producción). Con bootstrap arrastras cientos de clases que no vas a utilizar nunca y que añaden Kb a la fase mas importante de la carga de la pagina, html, js y css. Te puedes beneficiar del CDN, pero difícilmente no necesitaras ningún cambio ni clase extra. Casi “obligatoriamente” tendrás que usar una versión propia de BS o añadir una nueva hoja de estilos, con lo que esta ventaja se pierde

El responsive funciona a saltos fijos y está anticuado.

Se ha quedado muy anticuado en este aspecto, y el responsive está pensado en unos saltos de ancho que pueden convenirte o no según tu target. Quizá quieras más atención a los formatos móvil y para tu público apenas sean importantes las pantallas de escritorio y quisieras refinarlo mas en esos tramos. Por ejemplo bootstrap trata igual a todas las pantallas por debajo de 480px y a veces conviene afinar mas en segun que targets.
Ademas las medidas son en pixels, y apenas se utilizan soluciones “fluidas”, propiedades como flex ni siquera están incorporadas, etc.
Entiendo que algunas de estas cosas se pueden corregir pero…

Es DIFÍCIL de modificar.

Como pasa muchas veces con los css producidos con preprocesadores como less, sass, etc. las clases en BS están hiperdefinidas. Las herencias son enrevesadas y si modificas directamente una clase, nunca puedes estar muy seguro de que repercusiones puede tener en otras partes de la web o con otras combinaciones de clases. No esta pensado para realizar modificaciones directamente en el css, o machacando propiedades con un css posterior, sino editando su archivo less, pero me extrañaria que uses bootstrap si usas preprocesadores css a no ser que estes en una situación muy especifica.

Bootstrap es un desarrollo ajeno.

Con todo lo que ello conlleva, puede ser positivo o negativo. Puede ser positivo porque te beneficias de las actualizaciones y soporte de un sistema estandarizado. O negativo cuando anuncian la versión 4 y no es compatible con la anterior. Y todo el aprendizaje que requiere BS, que no es difícil pero si necesario, ya no sirve para nada. Si quieres actualizar tus webs a los “nuevos tiempos” tendrás que rehacer el código por completo. Es mejor dedicar ese aprendizaje y ese tiempo en un sistema propio adaptado a tus necesidades que puedas ir actualizando rutinariamente.

Complica el código

En BS para utilizar una columna tienes que meterla dentro de un div con la clase .row para que se anulen mutuamente sus paddings positivos/negativos. Ese div.row no existe para indicar una categorización del contenido, ni tiene otra función que corregir un problema de diseño (el centrado visual correcto de las columnas). Usando BS te obligas a introducir código html extra para resolver tareas de diseño, y una ristra de clases para cada etiqueta que tampoco tiene sentido (fuera de la obligación de usar una solución de amplio espectro)