Html5 : des boutons bien justifiés
vendredi 14 octobre 2011
Voici un premier tutoriel html5, enfin presque. C’est plutôt un exercice de développement sur le principe html + css + javascript, qui est à la base de l’approche html5.
Récemment je me suis demandé comment faire pour afficher une suite de boutons (html <button> tag) dans un conteneur, tout en garantissant une mise en page de type paragraphe justifié. Exemple de code html de départ :
Si on utilise uniquement une propriété CSS text-align : justify, on peut facilement avoir ce rendu graphique :

Si on souhaite avoir un rendu un peu plus harmonieux et évolué, il faut ajouter du code javascript. Je veux obtenir moins de trous entre les boutons et que la dernière ligne soit justifiée également. Dans cet exemple je me sers de jQuery.

Le code source javascript que je propose ci-dessous s’exécute au chargement complet de la page, évènement onload sur <body>.
- function myOnLoad()
- {
- // pour récupérer la largeur de div en valeur numérique (de pixels)
- var divButtonsWidth = parseInt($("#buttons").css("width"), 10);
- // pour récupérer la valeur numérique des marges appliquées aux boutons
- var buttonPadding = parseInt($("#buttons button:eq(0)").css("padding-left"), 10);
- var buttonMargin = parseInt($("#buttons button:eq(0)").css("margin-left"), 10);
- var currentWidth = 0;
- var prevWidth = 0;
- var currentOffsetTop = $("#buttons button:eq(0)").offset().top;
- var buttonWidth = 0;
- var firstIndexLine = 0;
- var widthGrow = 0;
- var nbButtons = 0;
- // itération sur tous les boutons de la div
- $("#buttons button").each(function (i)
- {
- // on récupère la largeur du bouton = largeur du texte du bouton uniquement
- buttonWidth = $(this).width();
- // on cumule les valeurs de position + de largeur + de marges pour avoir la largeur totale de la ligne.
- currentWidth = $(this).offset().left + buttonWidth + (buttonPadding + buttonMargin);
- // ce test permet de savoir si on a changé de ligne, si oui il faut justifier les boutons de la ligne précédente
- // c'est la ligne avant le bouton actuel.
- if ($(this).offset().top > currentOffsetTop)
- {
- // on calcule le nombre de boutons par ligne (car on a mémorisé l'index du premier bouton de la ligne).
- nbButtons = i - firstIndexLine;
- // astuce : prevWidth c'est la largeur cumulée juste avant le bouton actuel, c'est donc la largeur de la ligne à justifier
- // Il faut augmenter la taille de tous les boutons d'une valeur égale à la largeur qui reste pour compléter la ligne, divisée par le nombre de boutons.
- widthGrow = Math.floor((divButtonsWidth - prevWidth) / nbButtons);
- // itération sur tous les boutons de la ligne à justifier
- for (j=firstIndexLine; j<i;j++)
- {
- // cacul de la largeur du bouton = largeur du texte + largeur de la marge entourant le texte.
- buttonWidth = $("button:eq(" + j +")").width() + 2 * (buttonPadding);
- // application de la nouvelle largeur en ajoutant widthGrow
- $("button:eq(" + j +")").width(buttonWidth + widthGrow);
- }
- // réinitialisation des valeurs pour servir à la ligne suivante
- firstIndexLine = i;
- currentWidth = $(this).width();
- currentOffsetTop = $(this).offset().top;
- }
- prevWidth = currentWidth;
- });
- // cas de la dernière ligne, on refait le traitement
- var indexFin = $("#buttons button").length - 1;
- nbButtons = indexFin + 1 - firstIndexLine;
- widthGrow = Math.floor((divButtonsWidth - prevWidth) / nbButtons);
- for (j=firstIndexLine; j<=indexFin;j++)
- {
- buttonWidth = $("button:eq(" + j +")").width() + 2 * (buttonPadding);
- $("button:eq(" + j +")").width(buttonWidth + widthGrow);
- }
- }
Cet exemple qui aborde finalement quelques fondamentaux de jQuery est un point de départ possible pour se plonger dans html5. J’espère qu’il pourra vous être utile. Vous pouvez voir ce code en action dans la page de démo.
Merci à web designer wall pour le code source CSS3 des boutons.