On Github nahuelsotelo / edu.css-architecture
Hola, soy Nahuel Sotelo
Frontend developer en Schibsted Spain y Profesor de la asignatura Programación Frontend en el Master de Diseño Web de Bau.
¿Por qué es importante cuidar el código y tener buenas prácticas?
Esto nos permitirá trabajar en una parte concreta de nuestra aplicación sin afectar al resto
Una guía de estilos:
Estas guías también van muy bien como herramienta de aprendizaje para ver cómo trabaja otra gente.
Existen herramientas que nos ayudarán a que todos los miembros del equipo sigan las pautas definidas.
Es recomendable centralizar los estilos en un ùnico fichero (main.css, style.css) que no contenga reglas, únicamente @import a otros ficheros.
Puede haber más de uno dependiendo las necesidades. Por ejemplo en una guía de estilos, si tenemos soporte para algun navegdor concreto o si tenemos estilos que sólo se cargan en una página.
Comentar sobre HTTP2.
Podemos encontrar varias arquitecturas en internet pero es importante conseguir una que se adapte a las necesidades de nuestro proyecto.
La clave está en tener claro la función de cada selector que utilicemos y ubicarlo en el archivo correspondiente.
7 carpetas, 1 archivo:
sass/ | |– base/ | |– _reset.scss | |– _typography.scss | ... | |– components/ | |– _buttons.scss | |– _carousel.scss | |– _cover.scss | |– _dropdown.scss | ... | |– layout/ | |– _navigation.scss | |– _grid.scss | |– _header.scss | |– _footer.scss | |– _sidebar.scss | |– _forms.scss | ... | |– pages/ | |– _home.scss | |– _contact.scss | ... | |– themes/ | |– _theme.scss | |– _admin.scss | ... | |– utils/ | |– _variables.scss | |– _functions.scss | |– _mixins.scss | |– _helpers.scss | |– vendors/ | |– _bootstrap.scss | |– _jquery-ui.scss | ... | | `– main.scss
base/
Es el punto de partida del proyecto (reset, tipografía, etc). Los selectores de esta carpeta tendrán una especificidad muy baja, probablemente la mayoría serán selectores de tipo.
layout/
Todo aquello referente al layout de nuestro sitio: grid, header, footer, sidebar, etc. Aquellos componentes que se repiten página a página.
components/
El core de nuestra web. Todos aquellos componentes reutilizables que utilizaremos a lo largo de nuestra web.
pages/
Estilos específicos para una página en concreto.
themes/
Si nuestro sitio tiene algun tipo de sistema de theming, podemos hacer uso de esta carpeta. En caso contrario puede omitirse.
utils/
Variables, funciones, mixins o cualquier otro tipo de helper. Lo normal es que los contenidos de esta carpeta no se compilen en el fichero .css.
vendors/
Estilos que no hemos creado nosotros: librerías como Bootstrap o estilos que acompañen algún plugin que estemos utilizando.
Recomendar el adaptar esta estructura a las necesidades de nuestro proyecto (enfoque Lean).
Comentar la arquitectura que estoy usando ahora (components / utils / vendors).
@import 'utils/variables'; @import 'utils/functions'; @import 'utils/mixins'; @import 'utils/placeholders'; @import 'vendors/bootstrap'; @import 'vendors/jquery-ui'; @import 'base/reset'; @import 'base/typography'; @import 'layout/navigation'; @import 'layout/grid'; @import 'layout/header'; @import 'layout/footer'; @import 'layout/sidebar'; @import 'layout/forms'; @import 'components/buttons'; @import 'components/carousel'; @import 'components/cover'; @import 'components/dropdown'; @import 'pages/home'; @import 'pages/contact'; @import 'themes/theme'; @import 'themes/admin';
“It's a repeating visual pattern, that can be abstracted into an independent snippet of HTML, CSS and possibly JavaScript.”
- Nicole SullivanSeparados del layout. Su relación con el contexto se gestiona por separado.
El CSS de un componente tiene que tener una logica interna, que debe apreciarse leyendo el código.
En CSS, la especificidad, es lo que determina que estilo será el que acabará aplicandose a un elemento determinado.
Cuando a un elemento se le aplica más de un selector con reglas que actúan sobre la misma propiedad, es la especificidad la encargada de resolver este conflicto.
A grandes rasgos podemos ordenar los diferentes tipos de selectores de menor a mayor peso específico de la siguiente manera:
Selectores de elemento Selectores contextuales Clases IDs0,0,0,0
p { color: red; }
0,0,0,1
.text { color: red; }
0,0,1,0
#main strong { color: red; }
0,1,0,1
header ul#main-nav .sub-menu li.child a:hover { color: red; }
0,1,3,4
<p style="color: red">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
1,0,0,0
p { color: red !important; }
0,0,0,1 0,0,0,0
El gráfico de especificidad es una representación de cómo se distribuye la misma a lo largo de una hoja de estilo.
Es recomendable que la especificidad vaya aumentando gradualmente, empezando con estilos más genéricos (selectores de elemento) y acabando con casos más específicos.
The Specificity Graph - Harry Roberts
Intentar mantener los selectores lo más cortos posibles (evitar nesting) nos ayudará a que nuestros componentes no estén atados a un contexto determinado y sean independientes del HTML.
/* Cuidado! */ #main-header nav ul > li .nav-link:first-child { ... } /* 0, 1, 2, 3 */ /* Mejor */ .MainNav-link--first { ... } /* 0, 0, 1, 0 */
.nombre-del-bloque { ... } .nombre-del-bloque__elemento { ... } .nombre-del-bloque--modificador { ... }
.nombre-del-bloque { ... &__elemento { ... } &--modificador { ... } }
.nombre-del-bloque { ... } .nombre-del-bloque__elemento { ... } .nombre-del-bloque--modificador { ... }
Refactorizando:
.tab-group { ... } /* 0, 0, 1, 0 */ .tab-group > li { ... } /* 0, 0, 1, 1 */ .tab-group a { ... } /* 0, 0, 1, 1 */ .tab-group a.selected { ... } /* 0, 0, 2, 1 */
.tab-group { ... } /* 0, 0, 1, 0 */ .tab-group__tab { ... } /* 0, 0, 1, 0 */ .tab-group__link { ... } /* 0, 0, 1, 0 */ .tab-group__link--selected { ... } /* 0, 0, 1, 0 */
Es importante seguir leyendo y mirando los diferentes frameworks o soluciones que va creando la comunidad pero siempre adaptándolos a nuestras necesidades. No al copy-paste.
Aplicar las buenas prácticas siempre que se pueda, la mayoría son universales y no dependen del tamaño o naturaleza del proyecto.
Intentar repartir nuestro código en pequeños trozos manejables. Evitar los archivos de 2000 líneas.
Dejar nuestro código bien documentado nos ayudará a volver sobre nuestros proyectos pasado un tiempo sin perder la razón, además de ayudar a otros developers que trabajen con el mismo.
Documentar también nos ayuda a reflexionar sobre lo que hemos hecho y fijar conceptos.
No tener miedo al refactor siempre y cuando se haga con las precauciones adecuadas. Si hemos seguido buenas prácticas refactorizar no debería ser muy costoso.