Renovació de la web del W3C

20 octubre 2009 per Ramon Vilar Gavaldà

Acabo de veure que per fi s’ha llançat la nova web del W3C, encara que sembla ser que la seva estrena fou el passat 13 d’octubre. Ha estat el final del camí després que al març del 2009 es va llançar el lloc en beta obert a qualsevol tipus de contribució i comentari.

El nou lloc és força més intuïtiu, amb un disseny lleuger centrant l’atenció en el contingut i no tant en la forma de mostrar-lo. Al contrari de l’anterior lloc, sembla que en aquest s’hagin parat un moment i hagin rumiat l’arquitectura de la informació, ja que tots els continguts de la web estan categoritzats en diferents seccions de fàcil identificació i la navegació entre els diferents apartats es fa de forma força intuïtiva.

Com a nota irònica, al seu blog es comenta que el CSS usat no passa el seu validador. Segons argumenten, la majoria d’errors són per temes de hacks, regles pròpies d’alguns navegadors, etc.

Doncs res, nous aires pel W3C que ja tocava!

Protegir pàgines amb l’event onbeforeunload

9 setembre 2009 per Ramon Vilar Gavaldà

No us ha passat mai que mentre esteu acabant d’omplir un formulari, sense adonar-vos, feu clic allà on no toca i perdeu tot el que heu introduït? Doncs bé, hi ha una senzilla manera per evitar al màxim aquests errors: l’event onbeforeunload.

Cap allà als mitjans dels noranta, Internet Explorer 4.0 introduí aquest event no estàndard, però a diferència d’altres ocasions, aquest cop feu una cosa útil i els navegadors amb motor Gecko ho acabaren introduint a la versió 1.7 de Mozilla (Firefox 1.0).

Aquest event, tal i com resa el seu nom, es dispara just abans de l’event onunload, és a dir, abans que es descarregui el contingut actual de la pàgina, i per tant, ens permet executar algun tipus d’acció en aquest moment.

A diferència dels altres events, aquest funciona força diferent: per tal de mostrar un missatge a l’usuari abans de descarregar la pàgina, el que cal fer és retornar una cadena amb el missatge que es vulgui mostrar. Un exemple podria ser:


window.onbeforeunload = function(e) {
  return "No heu enviat el formulari. Si tanqueu la pàgina perdreu tots els canvis fets fins ara.";
}

Així, en cas d’abandonar la pàgina, se’ns mostraria un quadre amb el missatge:

Esteu segur que voleu sortir d’aquesta pàgina?

No heu enviat el formulari. Si tanqueu la pàgina perdreu tots els canvis fets fins ara.

Premeu D’acord per a continuar, o cancel·la per a romandre a la pàgina actual

Les frases que hi ha just abans i després de les nostres les posa el navegador (en aquest cas Firefox) i no es poden eliminar, substituir ni evitar de cap tipus de les maneres.

Val a dir que en cas que el navegador no tingui implementat aquest event, aquests simplement l’ignoraran i no mostraran pas el missatge a l’usuari.

Pàgines protegides

Recapitulem. La raó principal d’aquest article és que fa poc a la feina em varen demanar que implementés una funcionalitat per a protegir pàgines: volien poder mostrar un missatge quan un usuari intentés abandonar la pàgina enmig d’un formulari dins d’un procés amb un cert flux o bé intentés abandonar una pàgina, la construcció de la qual fos molt costosa. Un exemple ideal per a treure l’event onbeforeunload de la nostra cartera de recursos. Anem a construir-ho.

Per tal de poder marcar si una pàgina la tractem com a protegida o no, és a dir, si registrem l’event onbeforeunload per mostrar un missatge a l’usuari en cas d’abandonar la pàgina, afegirem la classe protected a l’element /body de la pàgina:

<body class="protected">

Així, si usem jQuery, podem afegir les següents línies de codi per a tenir-ho fet:

$('body.protected').each(function () {
  window.onbeforeunload = function(e){
    return "Si abandones, ho perdràs tot per sempre!";
  };
});

Però tenim un petit inconvenient: si fem clic en un enllaç o si enviem el formulari fent clic a un botó, se’ns mostrarà el missatge, cosa que volem evitar. Això es pot resoldre inhabilitant l’event en cas de fer clic a certs elements:

$('body.protected p.botons input, body.protected a.sense-onbeforeunload', context).click(function () {
  window.onbeforeunload = null;
});

I així de fàcil obtenim el que busquem. Fàcil, oi? I segur que a més d’un li sembla útil, i fins i tot, més que necessari en alguna situació quotidiana.

Recursos

CSS Mastery. Advanced web standards solutions

27 agost 2009 per Ramon Vilar Gavaldà

Portada del llibre CSS MasteryEn el seu moment, quan em vaig llegir aquest llibre, va marcar un abans i un després en els meus coneixements sobre maquetació web.

Si en el seu moment vaig recomanar el llibre Bulletproof Web Design per aquells que volen entrar al món de la maquetació web, recomano ara el CSS Mastery per tots aquells que volen accedir a uns coneixements més avançats d’aquest món, i poder passar així a fer projectes més complexes.

Andy Budd ens avisa des d’un principi: això no és pas un llibre per a novells, sinó que està fet per aquells que vulguin donar una volta més de cargol a la maquetació web. Ho diu amb raó, ja que el llibre comença amb un primer capítol de repàs, però ràpidament accelera per donar pas als següents capítols per entrar en tècniques més complexes, trucs usuals i sobretot, els hacks que no ens podem treure mai de damunt.

És un llibre fàcil de seguir si tenim uns mínims coneixements de CSS i HTML, però sobretot, és fàcil aprendre coses noves i fàcil poder-les posar en pràctica, ja que el llibre bé carregat d’exemples, explicacions de casos d’ús i amb alguna que altra referència de casos reals disponibles a la xarxa. En definitiva, un llibre molt més que recomanable: imprescindible!

Al revisar una mica l’índex, podem veure que el llibre està distribuït en onze capítols, nou dels quals són exposició de tècniques (separades per temàtica) i els dos darrers són l’elaboració de dos exemples o casos d’estudi amb tota la informació adquirida al llarg del llibre:

Setting the foundations
En aquest capítol, com ja he comentat abans, l’autor fa una petita introducció repassant conceptes com els d’especificitat, organització dels documents, els diferents tipus de selectors, etc. Es recomana una lectura, encara que sigui en diagonal, per tal d’entrar en matèria.
Visual formatting model recap
Repàs als diferents models de caixa, flotats i posicionament absolut/relatiu. Problema del doble marge i d’altres trucs.
Background images and image replacement
Repàs al concepte d’imatge de fons. Caixes amb cantonades arrodonides, tècniques per a la simulació d’ombres i repàs a diferents tècniques de reemplaçament d’imatges.
Styling links
Tal i com indica el títol, en aquest capítol es repassen diferents tècniques per a donar estils als enllaços, des d’estilitzar enllaços externs, tècniques per a l’ús d’sprites com a imatges de fons entre d’altres coses.
Styling lists and creating nav bars
En aquest capítol s’aborden diferents tècniques per a realitzar barres de navegació, tan verticals com horitzontals (tècnica d’sliding doors). També explica com crear un mapa d’imatge entre d’altres temes.
Styling forms and data tables
Un dels capítols d’on vaig treure més suc en el seu moment. No només explica temes de CSS sinó que també exposa conceptes sobre el marcat correcte per una taula, estructuració i accessibilitat a formularis i més moltes més coses.
Layout
El típic tema de tot llibre de CSS: layout fix, elàstic, líquid i combinat.
Hacks and filters
Capítol força interessant on s’exposen les tècniques per a separar fulls d’estils per diferents medis o navegadors, trucs per aplicar regles a certs clients, etc.
Bugs and bug fixing
Un altre capítol interessant i força inusual. S’hi recullen els bugs més importants dins del món de la maquetació i diferents tècniques per a identificar tant a aquests com d’altres que no estiguin documentats encara.
Case study 1: More than doodles
És el capítol més llarg de tot el llibre. En ell s’hi descriuen tots els passos que cal seguir per acabar construint la maqueta d’una pàgina, a simple vista força complexa. S’usen molts dels conceptes exposats al llibre, i sobretot s’hi fa especial atenció al tema de les llistes i del model de caixes.
Case study 2: Tuscany luxury resorts
Un exemple força interessant de pàgina amb layout fluid. A més a més, s’apliquen tècniques de posicionament de caixes força interessants i de reemplaçament de text per imatges que cal tenir força en compte.

En definitiva, i per tancar la ressenya, un llibre que cal comprar i llegir per ser un bon expert en el tema.

Mentre estava acabant de redactar l’article he vist que tot just demà surt a la venda la segona edició d’aquest llibre. Actualment encara no es pot consultar la taula de continguts del llibre, però segons he pogut llegir, actualitza els seus continguts i exposa nous temes sobre CSS3.

Com fer un plugin per a jQuery. Contingut tabulat en pestanyes

22 juliol 2009 per Ramon Vilar Gavaldà

Durant el meu dia a dia professional, treballo (i força) amb jQuery, una meravellosa biblioteca JavaScript (s’entreveuen les meves preferències, oi?). Doncs bé, la segona cosa que cal saber quan s’entra en el món jQuery és desenvolupar, o com a mínim conèixer l’estructura bàsica, d’un plugin.

Per a exemplificar la construcció, crearem un petit giny per a construir contingut tabulat en pestanyes.

Partim d’un fragment HTML com el següent:

<div class="pestanyes">
  <h2>Pestanya 1</h2>
  <div>
    ...contingut...
  </div>
  <h2>Pestanya 2</h2>
  <div>
    ...contingut de la segona...
  </div>
  <h2>Pestanya 3</h2>
  <div>
    ...i una mica més...
  </div>
</div>

Si ens centrem en el giny, podríem redactar una petita explicació funcional com la següent:

  • En estat de repòs, es mostren les pestanyes amb la primera activa i només es mostra el contingut relacionat amb aquesta.
  • Una vegada cliquem a una pestanya, aquesta passa a ser l’activa i el contingut que es mostra passa a ser el relacionat amb aquesta.

Ara només falta traduir això a codi JavaScript.

Comencem creant l’estructura general del plugin:

$('.pestanyes').each(function() {
  ...
});

I les estructures necessàries per a crear el giny. Primer de tot caldrà amagar les capçaleres i el contingut d’aquestes i crear l’estructura per a les pestanyes que a nosaltres ens sigui còmode de treballar-hi. Per exemple una d’ideal seria una senzilla llista <ul><li>...</li></ul>.

Anem a passar tot això a codi JavaScript:

$('div.pestanyes').each(function () {
  // creem una referència a les capçaleres i al contingut de les pestanyes
  var $headings = $('h2', this);
  var $content = $headings.next();

  // amaguem les capçaleres i els continguts
  $headings.hide();
  $content.hide();

  // creem l'estructura de les pestanyes
  var tabHtml = '';
  $headings.each(function() {
    tabHtml += '<li>' + $(this).text() + '<\/li>';
  });

  // i l'afegim al document
  $(this).prepend('<ul class="tabs">' + tabHtml + '<\/ul>');
}

Una vegada creada l’estructura, només queda marcar l’estat inicial amb la primera pestanya i el seu contingut relacionat com a actius:

var $tabs = $('ul.tabs li');
$tabs.eq(0).addClass('active');
$content.eq(0).show();

Ara només ens queda centrar-nos en la interacció amb les pestanyes. Quan un usuari faci clic en una pestanya, cal resetejar l’estat actual (eliminar la marca d’actiu) i marcar la pestanya que s’ha clicat com a activa, juntament amb el seu contingut relacionat.

$tabs.click(function() {
  // eliminem la classe i amaguem el contingut
  $tabs.removeClass('active');
  $content.hide();

  // marquem la pestanya activa i mostrem el contingut que calgui
  $(this).addClass('active');
  var tabIndex = $tabs.index(this);
  $content.eq(tabIndex).show();
});

Si ho posem tot junt, podem veure el resultat i una aplicació a un cas a l’exemple.

Però fins aquí no hem fet res de res per construir un plugin. Posem-nos a treballar-hi.

Adaptació del codi per a ser un plugin vàlid

Quan pensem en crear un plugin jQuery, el que ens ve al cap és crear una funcionalitat reutilitzable dins del domini d’un objecte jQuery, és a dir, estendre l’objecte. Així, si ens centrem en el nostre exemple, la idea és acabar creant un codi tal que per poder crear un contingut tabulat, hàgim d’escriure simplement:

$('div.pestanyes').tabs();

Si el que volem és estendre l’objecte jQuery el que haurem de fer, igual que en qualsevol altre objecte JavaScript, és afegir una nova propietat al seu objecte prototype. Així, una cosa d’aquest tipus seria vàlid:

$.prototype.tabs = function () {
  // el nostre codi
}

Però si hagués decidit fer-ho així, ja s’hauria acabat l’entrada, i aquesta no és pas la idea.

Si mirem les primeres línies de la biblioteca jQuery, podem veure la creació d’un alies força interessant:

jQuery.fn = jQuery.prototype

Així, si volem usar aquesta notació, podem ampliar directament l’objecte tot fent:

$.fn.tabs = function () {
  // el meu codi
  return this;
}

S’ha afegit el retorn del propi objecte per a poder permetre l’encadenament de crides:

$('#element')
  .tabs()
  .mesCoses();

El plugin que estem construint és força senzill, però què passaria si tinguéssim variables globals, funcions auxiliars i demés? Alguna cosa com aquesta:

var foo = 0;
$.fn.myPlugin = function () {
  foo += 5;
  myMethod();
  return this;
}
function myMethod() {
  ...
}

Amb aquest escenari, algú sense gaires llums (o amb ganes de tocar la pera) podria usar el plugin des la següent forma (i des de l’espai global de noms):

var myMethod = 'bar';
$('#element').myPlugin();

Però per sort, nosaltres tenim un as sota la màniga anomenat closure. Així, podem englobar tot el codi del nostre plugin dins d’una funció anònima:

(function () {
  var foo = 0;
  $.fn.myPlugin = function () {
    foo += 5;
    myMethod();
    return this;
  }
  function myMethod() {
    ...
  }
}) ();

Sembla que tot ja està fet, no? Queda un últim punt. Per a assegurar la compatibilitat amb d’altres biblioteques, no podem usar l’àlies de l’objecte jQuery $ així com així, sinó que hauríem d’usar jQuery com a mètode d’accés a l’objecte. Però això no és gaire còmode, no? Tranquils! Aprofitant que tenim la funció anònima englobant el nostre codi, podem crear un àlies segur per a jQuery fàcilment passant-lo com a paràmetre d’aquesta:

(function($) {
  ...
})(jQuery);

Ara ja estem en condicions de crear el nostre primer plugin. Podeu veure el codi resultant a l’exemple.

Ampliacions

Una vegada que tenim el plugin funcionant, ens podem centrar en fer-lo més real. El primer que ens podem preguntar és: què és un plugin sense opcions? Doncs si en volem, només cal donar-li un parell de voltes i fet.

Considerem dues opcions de configuració:

  • Pestanya activada per defecte, que serà un enter (per defecte 0) que indicarà l’index de la pestanya (activatedIndex)
  • Efecte visual al canviar de pestanya, que serà el nom d’una funció (per defecte null) dins l’espai de noms de l’objecte jQuery (animation)

I si ho afegim al codi que ja tenim:

$.fn.tabs = function (options) {
  var config = $.extend({
    activatedIndex: 0,
    animation: null
  }, options || {});

  ...
}

Ara el mètode tabs accepta un paràmetre que és un objecte de configuració. S’usa el mètode $.extend per tal d’estendre un objecte amb els valors per defecte amb els passats com a paràmetre.

Ara, els únics canvis que cal fer són força trivials. Pel cas de l’índex de la pestanya a activar:

// marquem la pestanya i el contingut desat a la configuració com actiu
var $tabs = $('ul.tabs li');
$tabs.eq(config.activatedIndex).addClass('active');
$content.eq(config.activatedIndex).show();

I pel cas de l’animació al canviar de pestanya:

if(config.animation) {
  $content.eq(tabIndex)[config.animation]();
} else {
  $content.eq(tabIndex).show();
}

I per acabar, només falta veure-ho tot ajuntat i funcionant al seu exemple corresponent.

Fonts

No creieu pas que sóc un geni. Ni molt menys. Aquesta entrada està basada en una de molt millor del meu amic Choan, el qual em va iniciar en el meravellós món del JavaScript. Només he volgut explicar-ho des de la meva òptica, usant alguna que altra alternativa de notació i amb un exemple ben diferent.

Cal deixar ben clar que això no és pas un plugin oficial ni res per l’estil. El codi el teniu disponible per tocar i jugar, però no s’acceptaran cap tipus de culpa per l’ús d’aquest en algun entorn productiu.

El que sí que s’accepten són notes, comentaris i tot el que vulgueu fer sobre el que aquí s’ha exposat.

Separar la forma del contingut (nom de les classes)

29 juny 2009 per Ramon Vilar Gavaldà

Es ben sabut per tots els que ens dediquem a la programació d’interfícies web (també anomenats maquetadors o programadors front end) que cal tenir ben present que sempre s’ha de separar el document (HTML) de la seva presentació en un medi concret (CSS) i dels components amb comportament que pugui tenir (JavaScript). Així, és fàcil veure que el següent fragment d’un document és completament incorrecte pel que fa a aquests cànons:


<div style="margin: 5px;">
    <em>Aquest contingut el vull en lletra cursiva</em>
    <small><a onclick="window.location='/lipsum'" href="http://www.example.com">Lorem ipsum dolor</a></small>
</div>

Normalment la majoria de programadors som ben conscients de la incorrecció del fragment anterior, però sovint ens trobem incorreccions d’aquest tipus completament encobertes, i sempre seguint el mateix patró: el mal ús dels noms de classe dels elements.

Usaré exemples de la xarxa per a il·lustrar el que vull dir. Si anem a la portada de la pàgina d’una institució molt important del país podem trobar coses així (canvio els texts per centrar l’atenció):


<ul id="ul_home">
	<li><a class="vermell_nobullet_2" href="http://www.example.com">Ipse quat erimo</a></li>
	<li><a class="vermell_nobullet_2" href="http://www.example.com/dog">Sailer due rit</a></li>
</ul>

<div class="marge_superior">
    <h2><span id="actualitat" class="titol_seccio">Lorem ipsum</span></h2>
</div>
<div id="altres_serveis" class="border_top">
    <div class="border_bottom">
        <a class="text_gris" href="http://www.example.com/bird">Dolor et sumum</a>
    </div>
</div>

El valor de l’atribut @class d’alguns dels elements ja ens dóna informació de com s’estilitzaran al veure-ho associat al seu full d’estils.

Però sovint no es veu tan fàcilment la incorrecció a l’assignació dels noms de les classes. Per exemple, és ben normal trobar-nos sempre al fragment de descripció de l’organització d’un document, classes del tipus:


<body class="3-columnes">
    <div class="columna-esquerra">
        Lorem ipsum
    </div>
    <div class="columna-central">
        Dolor set
    </div>
    <div class="columna-dreta">
        Icse et luopir
    </div>
</body>

Hi veieu res d’estrany? Per saber si les classes són reveladores de la forma final, només cal que us feu la següent pregunta: podríeu saber quina és la forma final de la pàgina només llegint l’HTML? Si la resposta és sí, les classes són errònies. Si és no, doncs la cosa ja està millor.

Per exemple, una forma correcte de fer la divisió del document podria ser:


<body class="layout-complet">
    <div class="contingut-primari">
        Lorem ipsum
    </div>
    <div class="contingut-secundari">
        Dolor set
    </div>
    <div class="contingut-terciari">
        Icse et luopir
    </div>
</body>

Oi que ara ja no us espereu com serà el document final?

Per tant, cal anar amb compte a l’hora d’assignar els noms a les classes. Sempre cal tenir ben present de separar la forma o presentació del contingut i anar una mica amb peus de plom a l’hora de cercar els valors. Així aconseguirem que els nostres documents siguin 100% independents de la forma en que es visualitzen.