Volver un grid responsive y algo más semántico y cómodo con un poco de LESS

(Si con esta entrada no me llevo el premio al título más aburrido, ya no sé cómo hacerlo…)

Lo confieso: hasta hace un par de semanas el responsive y yo nos conocíamos, pero no teníamos la confianza deseable y los preprocesadores de CSS eran un concepto interesante pero a explorar. Afortunadamente, hace poco me ha surgido la oportunidad de hacer una web (muy en estado de work in progress, ahora mismo) que ha supuesto el momento perfecto para, si no aprender, al menos darme un chapuzón en el tema…

En las pocas ocasiones en que me ha tocado hacer una web, y no limitarme a parchear un tema de WordPress (de la última vez ya hace un año y medio) mi modus operandi habitual ha sido comenzar a base de un grid (para puristas, rejilla o cuadrícula, desde luego) generado con una herramienta bastante abandonada pero funcional, Boks. Una de las cosas que me atrae de la herramienta (a parte de la simplicidad de uso) es que cuenta con una herramienta en la que uno especifica qué ancho de página quiere en píxels, y cuántas columnas para la rejilla, y te ofrece todas las posibles alternativas:

Captura de pantalla de la herramienta boks
En el fondo, no es más que resolver una ecuación diofántica, pero uno es comodón…

Si sólo quieres hacer un diseño sencillo (y ya lo tienes en mente), en cinco minutos acabas con una estructura como esta:

Ejemplo de una cuadrícula generada con Boks
No va a ganar un premio de diseño, pero he visto cosas peores…

Boks te genera en un santiamén el HTML y el CSS (a partir del framework Blueprint) y a partir de ahí te pones a aplicarle un poco de diseño a las órdenes de alguien que sepa más del tema que tú.

Naturalmente, la cosa tiene limitaciones más que evidentes:

  • Por un lado, Blueprint te lo deja todo definido en píxels, con lo que el responsive queda muy lejos.
  • Por otro, y diría que como con casi todos los frameworks, el aspecto no se aplica exclusivamente desde el CSS: también necesitamos una ensalada de clases presentacionales en nuestro HTML: así, para la captura que tenéis ahí arriba, la cabecera se lleva un span-12 last, las caja grande un clear span-8, la de la derecha un span-4 last y las cajas pequeñas un span-4 que acompañamos de clear y last dependiendo de su posición… (La «sintaxis» de Blueprint, por cierto, se vuelve bastante intuitiva bastante deprisa, por cierto. No sé si otros frameworks son tan «naturales», pero es algo a tener muy en cuenta a la hora de seleccionar uno).

Dicen los proponentes del object oriented CSS que unas cuantas clases presentacionales no nos van a matar y que permitirán reutilizar código y ser más eficientes. Pero estaremos todos de acuerdo que para lo que tenemos ahí arriba no nos hace falta y, además, que por debajo de una cierta resolución vamos a querer que los ítems de la barra de la derecha sean más bien span-6 y que los ítems a los que querremos aplicar clears y lasts no van a ser siempre los mismos…

Con todo ello en mente, unos abre el CSS y comienza a hacer cambios. El más evidente, desde luego, es cambiar el width: 960px; del contenedor por un max-width: 960px; y añadir el dichoso meta name="viewport" content="width=device-width, height=device-height" para que smartphones y demás dispositivos presuntamente inteligentes se den aludidos.

Pero luego viene el arduo trabajo de explorar el CSS a la caza de anchos en píxels y pasarlos a porcentajes… Con un poco de calculadora y mucha paciencia acabaremos convirtiendo cosas como

.span-1  {width: 69px;}
.span-2  {width: 150px;}
.span-3  {width: 231px;}
.span-4  {width: 312px;}
.span-5  {width: 393px;}
.span-6  {width: 474px;}
...
.span-12  {width: 960px;}

en

.span-1  {width: 7.1875%;}
.span-2  {width: 15.625%;}
.span-3  {width: 24.0625%;}
.span-4  {width: 32.5%;}
.span-5  {width: 40.9375%;}
.span-6  {width: 49.375%;}
...
.span-12  {width: 100%;}

Los que tengáis buena vista habréis notado que he usado columnas de 69 píxels y canales (gutters, si preferís el anglicismo) de 12, que convertimos a porcentajes dividiendo por 960 (el ancho total al que estaba trabajando) y multiplicando por 100: 69 pasa a convertirse en 7.1875%, 12 en 1.25% y… paciencia, que nos tocará arreglar así, además de los span-n, unos cuantos append-, prepend- y demás clases que use nuestro framework.

Pero claro… seguimos teniendo esas clases presentacionales que no nos van a ayudar nada cuando nos pongamos con el responsive… ¿Qué se le ocurre a uno? Pues bien, si tenemos un div (sí, debería haber usado articles y sections… prometo que estoy en ello) con clases div span-4 last itemagenda, ¿no podríamos buscar el CSS que aplican las presentacionales clear y span-4 y aplicarlo desde la muy semántica itemagenda? De hecho, sí podemos, y acabamos con algo como

#itemagenda {
    /* span-4 */
        float: left;
        /* margin-right: 1.25%; */
        width: 32.5%;
    /* last */
        margin-right: 0%;
}

Así resultará más fácil, además, aplicar una media query que, pongamos por caso, coja esos ítems de agenda que ahora viven a la derecha de los destacados en fila de a uno y los ponga, si la resolución baja de 800 píxels, bajo esos mismos destacados, en fila de a dos (aplicando clears y lasts según convenga a base de pseudoclases :nth-of-type).

¿Y no habrá una forma más eficiente?

Porque si a estas alturas estás pensando que esto es picar piedra de muy mala manera… de hecho tienes razón. Para esto se han inventado los preprocesadores de CSS.

Ahora mismo el «mercado» de los preprocesadores lo copan Sass y LESS. Me gustaría poder decir que elegí uno tras un detallado análisis de sus respectivas ventajas y desventajas, pero voy a confesar que opté por LESS porque encontré muy fácilmente la manera de usarlo con mi editor favorito del momento, el gratuito Komodo Edit. En cualquier caso, queda aclarar que Sass resuelve tan bien como LESS (tengo entendido :-)) los problemas que detallo a continuación:

No copies y pegues tú

#itemagenda {
    /* span-4 */
        float: left;
        /* margin-right: 1.25%; */
        width: 32.5%;
    /* last */
        margin-right: 0%;
}

…no es terrible, pero seguro que te gusta más…

#itemagenda {
    .span-4
    .last
}

¿Verdad? El preprocesador de turno ya se encargará de ir a buscar qué hay definido en span-4 y last y hacer con ello lo que convenga (ahora mismo LESS añadirá tanto el margin-right: 1.25%; como el margin-right: 0%; y te tocará a ti limpiarlo más tarde (o no), cosa que no resulta especialmente elegante, pero me han pasado cosas más graves).

Todas esas divisiones

Sé que estoy usando columnas de 7.1875% y canales de 1.25%. Sé que un span-4 son cuatro columnas y tres canales… ¿por qué debería hacer yo todas las divisiones? ¿No se supone que para esto están los ordenadores? Efectivamente. Con LESS (y con Sass también) podemos definir un par de variables

@column-width: 7.1875%;
@gutter-width: 1.25%;

(por si en algún momento queremos cambiar las dimensiones de la cuadrícula), después definir

.span( @columns )  {
    width: (@columns * @column-width) + ((@columns - 1) * @gutter-width)}
}

y finalmente usar

#itemagenda {
    .span(4)
    .last
}

para conseguir exactamente el mismo resultado que antes, pero con mucho menos dolor e inútil picado de teclas… :-)


Y hasta aquí mis primeros pinitos con las cuadrículas responsive y los preprocesadores. Seguro que hay muchas cosas que podría hacer mucho mejor, y para eso están los comentarios :-). Me gustaría decir, eso sí, que me he inclinado por tomar Blueprint como fuente porque ya me lo conocía, pero también que no he elegido ninguno de los frameworks responsive que corren por ahí porque los que he visto tienden a definirte unos breakpoints dados y a decidir por ti qué hacen con la cuadrícula a medida que cae la resolución, cosa que no me gusta nada. Si alguien sabe de algún framework (tiene que haberlos, sencillamente es que no he buscado mucho) responsive que no imponga tales limitaciones, que avise :-).

Los tuits de la semana (58, edición web)

Van pasando las semanas desde el último ‘tuits de la semana’, y toca edición recopilatorio de temas web, antes de que se pierdan en la inmensidad el océáno Twitter…

La noticia, desde luego, es el cambio pontecialmente sísmico provocado por el abandono de WebKit por parte de Google…

RT @brucelBy me: Hello Blink, the new engine that will power Opera’s browsers and Chrome henceforth http://www.brucelawson.co.uk/2013/hello-blink/

RT @antonello Chromium Blog: Blink: A rendering engine for the Chromium project http://bit.ly/17dDwzg al final parece que no habrá monocultivo webkit

from May 2010: «Dear Google: Please fork WebKit» (via @brucel) http://obm.as/16rilq6

:-| WebKit fracture puts a pinch on open-source browser efforts (Webware, CNET) http://obm.as/12tiRnd

RT @robertclariso RT ‏@softmodeling: RT @zef: Code Hard or Go http://hypercritical.co/2013/04/12/code-hard-or-go-home (on WebKit and forking in open source projects)

Contenidos en castellano, para que no se diga (pero, en serio, si te dedicas a esto y no lees inglés con facilidad, te lo estás perdiendo casi todo):

la webmaster academy de google, ahora en español http://obm.as/YkETJ0

HTML5 se sigue moviendo…

RT @iandevlin<hgroup> removed from the #HTML5 specification: http://lists.w3.org/Archives/Public/public-html-admin/2013Apr/0003.html (link via @cgiffard)

Y CSS, y las técnicas para trabajar con CSS, ni te cuento…

Working with flexbox (Adobe Developer Connection, via @webmonkey) http://obm.as/YYiqy5

RT @htmlboySimpletastic, a Sass-based grid framework by the talented @mrrocks: https://github.com/mrrocks/simpletastic

RT @p7rOnce you realise you can make a Bootstrap framework theme to make your site look like Geocities, this is inevitable http://divshot.github.com/geo-bootstrap

RT @brucel ptb/flexgrid: a flexbox-based CSS grid in 3.6k, non-flex browsers get fluid Bootstrap 3 layout, IE6, 7 fixed layout http://bit.ly/15ByJsk

@kazuhito CSS Architectures: Scalable and Modular Approaches http://bit.ly/13LnFow

RT @WPMigrations RT @speckyboy: Write less, do more: CSS Style http://ow.ly/jDHWE

BEM, la metodología de yandex para ‘desarrollar sitios de forma efectiva’ http://obm.as/11izp5e

LayoutIt! – Interface Builder for Bootstrap http://obm.as/15LwhQ3

Una gota de tipografía…

Why You Should Consider A Ligature Icon Font For Your Next Project http://obm.as/14p89mE

…una de usabilidad…

@brad_frost Usability Checklist http://userium.com/ This is fantastic.

…algo sobre diseño ‘touch’…

RT @kazuhito LukeW | An Event Apart: Designing for Touch http://bit.ly/16s5INe

…y una ración completa de accesibilidad:

RT @WPMigrations RT @speckyboy: Making accessible icon buttons http://ow.ly/jDHDw

YDN Blog: Accessible Data Tables http://obm.as/11PFEdT

RT ‏@UOCicommunity RT @AccessiQ: Part II of the ultimate accessible HTML and CSS checklist for developers is now live http://bit.ly/htmlcsschecklistpartii #a11y

RT @UOCicommunity RT @dennisl: Results of @WebAIM survey of #web users with #lowvision http://webaim.org/projects/lowvisionsurvey/ #a11y #stats #ux

RT @mundoaccesibleGuía Breve de Accesibilidad Web http://www.w3c.es/Divulgacion/GuiasBreves/Accesibilidad

Un poco de WordPress…

RT @WPMigrationsRT @wpengine: Free WordPress Framework Guide – Get a Rundown of the 7 Best | @wpmudev http://bit.ly/10sqsmu

QueryPosts.com . better WordPress code reference. via @WPMigrations http://obm.as/11kBfvT

Consejos para mejorar la seguridad de WordPress. via @qmarcos http://obm.as/ZHzSqU

…y, ya para acabar, una herramienta interesante:

Codassium, un editor de texto colaborativo más un chat de vídeo basado en WebRTC http://obm.as/10NHslc

Un día de estos, más.

Los tuits de la semana (56)

Llevaba tanto tiempo sin limpiar de enlaces mi cuenta de Twitter que la cosa se me ha acumulado bastante. Me quedo sólo con las cosas relacionadas con diseño y desarrollo web…

Una herramienta a probar:

John Nack on Adobe : Come download Reflow, Adobe’s new responsive-Web design tool http://obm.as/12TxPpo

HTML:

Introducing the New HTML5 <main> Element http://obm.as/X2rWPE

CSS:

RT @WPMigrations RT @devseo: http://is.gd/vCSogm – Roole – A Language that Compiles to CSS

CSS Explain (una especie de calculadora de especificidad) http://obm.as/YsJPgh

GitHub’s CSS Performance (via @lucascepeda) http://obm.as/V4Ctep

SMACSS: Scalable and Modular Architecture for CSS. A flexible guide to developing sites small and large. http://obm.as/UNqFi3

En algún momento me preguntaron por dónde empezaría si tuviese que ponerme a aprender HTML y CSS hoy. Mi respuesta en dos tuits:

yo recomiendo tomar el tiempo de seguir http://mosaic.uoc.edu/ac/le/es :-)

…pero probablemente comenzaría por http://learn.shayhowe.com/html-css/ si el inglés no es problema

Accesibilidad:

RT @EasyChirp Excellent! Accessible University 2.0, fictional pages to teach web accessibility http://www.washington.edu/accesscomputing/AU/ HT @webaxe @pauljadam #a11y

Accessible HTML5 Media Players and More http://obm.as/14FtzIo

RT @kazuhito Manual Accessibility Testing as Part of Your 360˚ Approach to Web Testing http://bit.ly/Vinaxc

JavaScript:

Introducing Collie: A high-performance animation library for JavaScript http://obm.as/YaLqAW

Numeric Javascript. cálculo numérico en javascript. #yalohevistotodo #cuandoyoerajovenestosehacíaenfortran77 http://obm.as/VQfx1c

#muyinteresante cgSceneGraph is a powerful cross-platform easy-to-use animation framework for <canvas> (via @juanfrasr) http://obm.as/UXfOVd

Mistakes is a tool for teaching Javascript to people, mostly on projectors. http://obm.as/127IeJf

emulador de 6502 en javascript o.O http://obm.as/126Deon

MathBox is a library for rendering presentation-quality math diagrams in a browser using WebGL http://obm.as/10DQ8tj

PolyCrypt: A WebCrypto API Polyfill In JavaScript Funded by the US Department of Homeland Security http://obm.as/TszIXe

Developing in HTML5 with JavaScript and CSS3 Jump Start – Microsoft Virtual Academy /via @rakelka http://obm.as/102D804

Audio5js is a library-agnostic, cross-browser Javascript API for HTML5 Audio, with a Flash fallback http://obm.as/V9qujj

Form Follows Function. preciosos experimentos ‘HTML5’ http://obm.as/W0Z0Iu

*muy* chulo, Flowtime.js, para hacer presentaciones con soporte web. de @marcolago, via @xeotico http://obm.as/UX3X6c

BLK, a voxel world tech demo. con el código abierto en github http://obm.as/ZaGGkX

WordPress:

de cero a WordPress corriendo sobre Amazon Web Services EC2 via @antonello http://obm.as/Wbehrg

RT @WPMigrations RT @FreelanceWP: FAQ My site was hacked « WordPress Codex http://su.pr/1TN3Z9

bastante buena pinta: >Generate WP provides tools for developers to create advanced systems built on WordPress. http://obm.as/Wx5EZn

#omg se cumplen DIEZ años (y un día) de la entrada de blog de la que saldría una pequeña herramienta llamada #WordPress http://obm.as/W4PtCR

.htaccess codes to secure your WordPress site (via @WPMigrations) http://obm.as/VWipMv

De interfaces:

interesante concepto en diseño de interfaces: Progressive Reduction http://obm.as/XRKOSZ

Sobre la muerte de Presto (protagonista de nuestra anterior entrada):

Bruce Lawson on Opera’s Move to WebKit http://obm.as/VVi5eo

RT @brucel Please don’t remove -o- vendor prefixes (very few: http://bit.ly/12xrQCi ) Presto browsers will still be in market for a while in TV, cars

RT @sideshowbarker Wondering whether browser-engine diversity really matters? It does: http://robert.ocallahan.org/2013/02/and-then-there-were-three.html Today’s news is a loss for the Web, not a win.

RT @jaffathecake You probably underestimated Presto – Some waffling about the Opera announcement https://plus.google.com/116237864387312784020/posts/iRRPVaaPQvo

Puñetitas personales:

con todo el respeto por A List Apart (o no), pero si usas <p class=»question»>, ¿para qué tienes RSS, si va a ser inusable?

De tipografía:

RT @aza Googling for «kerning» gives a funny hidden joke for typography geeks: https://www.google.com/search?q=kerning

(tentado de usar el polyfill *ya*) Adobe Proposes New Standard for Better Web Typography http://obm.as/X08NRE

Grid­lover. Scale & Rhythm for Your Web Type http://obm.as/VQicto

gran charla de Jason Santa Maria introduciendo el tema de la tipografía en la web http://obm.as/V3WWnz

Réquiem por Presto

La bomba ha explotado hoy, pero la liebre saltó hace casi un mes:

Sí. Opera, los noruegos del navegador que casi nadie conoce (en mi entorno: Chris Mills nos contaba en Mosaic, hace dos años largos, que en mercados como Rusia, Bielorrusia y Ucrania tenían un share nada desdeñable (una entrevista en la que yo halagaba la capacidad de desarrollo de los noruegos, por cierto)) pero que, entre otras cosas, dio a luz el elemento de interfaz sin el que no podríamos pensar en los navegadores (las pestañas) y una tecnología sin la que la web no habría podido llegar a donde ha llegado (CSS, nada más y nada menos)… se proponía lanzar un navegador sustituyendo su motor de rendering, Presto, por el que ‘anima’ a Chrome y Safari: Webkit. Hell. Freezes. Over.

Pero si aquello sonaba cataclismático, lo de hoy ha ido mucho más allá…

Opera va a abandonar Presto y Carakan, su excelente motor de JavaScript, por WebKit y V8, el motor JavaScript de Chrome y su hermano de código abierto, Chromium. Quizá no sea tan doloroso como el día que murió Netscape, pero dentro de nada vamos a pasar de tener cuatro grandes motores de rendering (Presto, Webkit, Gecko y Trident) a tres (y lo mismo pasará con los motores JavaScript). La biodiversidad del entorno se ha reducido en un 25%. Eso, en cualquier ecosistema, es, ya usaba la palabra antes, un cataclismo.

Como dice Bruce Lawson, Presto va a seguir vivo una buena temporada:

https://twitter.com/brucel/status/301741861163384832

(buena parte del negocio de Opera se alimenta de los navegadores embebidos en teles y otros dispositivos)… pero si ese tuit no suena a entierro, so sé qué lo hará…

Si hay que buscar culpables, la lista va a ser inacabable:

Mientras para muchísimos desarrolladores sólo exista Webkit primero (en la forma de Chrome y Safari, principalmente), y Firefox y el inevitable Internet Explorer (que se mueve muy lento y es víctima de muchísimas inercias imparables, pero hoy en día es un navegador más que aceptable, en sus últimas versiones) después, y ni dios tenga en cuenta el resto, la vida de Opera dependiendo de respetar los estándares pasaba por decisiones tan controvertidas como las de ‘adoptar’ los prefijos -webkit- (y pensar que creímos que el ruido que oímos entonces era el del infierno congelándose…). Y eso, aceptémoslo, era insostenible.

Como sucede en todos los sepelios, ahora resulta que el muerto era un tipo fantástico:

Lo jodido (disculpad el vocabulario, pero es que todo esto me ha dolido bastante) es que el muerto de verdad era un tipo fantástico. Personalmente, durante mucho tiempo ignoré Opera tan absolutamente como cualquier otro. Pero un Mac con sólo 2 gigas de RAM y una época de versiones Firefox especialmente voraces me llevaron a adoptar al navegador noruego durante unos meses. Al final dos gigas de RAM más y una moderación del apetito de Firefox hicieron que volviese a los orígenes (la cabra tira al monte, y ahora se siente culpable), pero durante aquel periodo tuve la oportunidad de comprobar que Opera era, efectivamente, un software fantástico… maltratado hasta la saciedad por propios y extraños (con el coloso Google a la cabeza del pelotón) con prácticas como el sniffing de agentes de usuario implementado con el culo (se me vuelve a descontrolar el vocabulario, me temo que me vais a tener que aguantar). La rendición de Opera me duele como al que más, pero no queda más remedio que aceptar (hasta aplaudir, con dolor) la decisión…

Para los que no veáis la dureza del mazazo que se llevan hoy los estándares web (que se culmina hoy, quizá habría que decir mejor), el tuit que, creo, dice más en menos:

Apenas ha hecho ruido fuera de una comunidad de freaks, pero hoy ha sido un muy mal día para la web. Descansa en paz, Presto.


Una recopilación de artículos sobre el tema:

Los tuits de la semana (55)

(Última edición de 2012. Con lo de «semana» entre comillas, como casi siempre…)

Los de diseño y desarrollo web

Progressive jpegs: a new best practice (via @WPMigrations) http://obm.as/UvLduA

Interactive Guide to Blog Typography http://obm.as/YkkSD5

Better Web Typography with CSS Hyphens (webmonkey) http://obm.as/11eF1Jm

redondeos, responsive y floats relativos al contenedor. via @brucel http://obm.as/UOj7Zz

Firefox para Android comienza a soportar H.264 (Ars Technica) http://obm.as/Ydpxrq

Parallax Scrolling @ the BBC (interesenante aunque odies las páginas parallax) http://obm.as/111JBvx

RT @RobertoTbts Ya conocen #Animatable de @LeaVerou ? One property, two values, endless possiblities – http://goo.gl/bvVwp #CSS

RT @softmodeling RT @newsycombinator: 10 Easy Things All Web Developers Should Do For Accessibility http://j.mp/YoIfH6

Herramientas:

Moonbase es una herramienta visual para hacer pequeñas animaciones web… #apuntamaneras http://moonbase.com

Fontello – easy icon font composer (via @carlescv) http://obm.as/ZPmeWV

#cosasaprobar #noséyo… in5, un exportador de InDesign a HTML+CSS http://obm.as/TWw8iG

Demo: New CSS export from Photoshop CS6 (no sé yo si será buena idea…) http://obm.as/T7uUCq

Cosas que se pueden hacer con la web:

RT @nytgraphics Just published the full version — all six chapters — of Snow Fall: The Avalanche at Tunnel Creek http://nyti.ms/VcnGuQ

¿qué pasa si le añades un poco de física a una página web? :-D http://obm.as/UW2zRU

parece ser que se acerca WebRTC y la comunicación p2p entre navegadores http://obm.as/TDHbjp

Liviz.js (JSViz). visualización de grafos en vivo y en JavaScript http://obm.as/SwaR0m

De JavaScript y similares:

Ejecta is a fast, open source Canvas+Audio iOS implementation. Think of it as a browser that can only display a canvas http://obm.as/YCrUP8

The Best Way to Learn JavaScript (via @nahuelsotelo) http://obm.as/Yd7hcb

se me acaba de fundir el cerebro. estamos a uno o dos ciclos de moore de… http://scriptedamigaemulator.net

Para leer con calma

Designing for the social customer – confused of calcutta http://obm.as/WQsn4u

Ars Technica: The music industry dropped DRM years ago. So why does it persist on e-books? http://obm.as/Zv8stL

Why You Should Want to Pay for Software, Instagram Edition (Alexis C. Madrigal, The Atlantic, via @WPMigrations) http://obm.as/V4BgVs

Google’s Lost Social Network. The sad, surprising story of Google Reader. http://obm.as/Z93uBw

68 años de la muerte de Paul Otlet, uno de los visionarios que imaginó una web en los años 30 http://obm.as/RkNpX6

Any password-reset system that will be acceptable to a 65-year-old user will fall in seconds to a 14-year-old hacker. http://obm.as/YxPOzx

cuando el coche viene con una API. *muy* interesante (Ars Technica) http://obm.as/SnjQAP

El cacharrito

*muy* interesante, el prototipo de YotaPhone con su segunda pantalla de tinta electrónica hreflang=»en»

El navideño

vale, el año que viene si pongo árbol de Navidad en casa… http://obm.as/12MUeCk

Y el audiovisual de cierre

(Que esta vez nos ha salido un poco largo, aunque lo merece…)

RT ‏@rakelka La magia del montaje, un documental sobre la edición de cine http://vimeo.com/54383151

http://vimeo.com/54383151