Les posts de la catégorie Tips

Centrer verticalement un élément aux dimensions inconnues

Le centrage vertical en CSS est certainement l'une des plus grandes frustrations du quotidien d'un intégrateur. Ce fonctionnement n'est en effet pas réalisable de manière simple (au contraire du centrage horizontal, par exemple) et, si il existe des astuces ou des moyens détournés pour le reproduire, ils ne sont jamais pleinement satisfaisants.

On aurait pu penser que les récentes avancées du langage CSS apporteraient une solution à cela, mais en 2014, il semblerait que ce ne soit toujours pas d'actualité.

En théorie, vous savez déjà tout ça.
De même, vous devez connaitre plus d'une technique pour centrer verticalement du texte ou un élément.
Cependant, la plupart de ces techniques fonctionnent uniquement dans des cas particuliers : lorsque l'élément parent ou l'élément cible ont des dimensions connues et fixes.

À l'heure du responsive design, ce n'est plus suffisant.

Centrer l'inconnu

Heureusement pour nous, il existe aussi des techniques pour centrer verticalement lorsque les dimensions ne sont pas connues à l'avance ou sont amenées à changer. Elles sont moins nombreuses (j'en compte 3) mais relativement efficaces :

  1. En utilisant display:table et display:table-cell,
  2. En utilisant position:relative et transform:translateY() (visible ici),
  3. En utilisant un élément « fantôme ».

Malheureusement pour moi, j'ai été confronté à un cas où les 2 premières solutions ne fonctionnaient pas :

La technique avec display:table et display:table-cell m'obligeait à ajouter des balises supplémentaires (ce qui n'est pas insurmontable, mais pas optimal) et la deuxième (avec position:relative et transform:translateY()) ne fonctionne pas sur WebKit lorsqu'elle est appliquée dans un élément parent en position absolue (bon à savoir).

J'ai donc décidé de faire une recherche sur Google pour voir si les usages avaient évolué et c'est là que j'ai pris connaissance de la 3ème technique au détour d'un article de CSS Tricks.
L'article date de 2011 (!), c'est donc une très vieille technique et pourtant je ne l'avais jamais croisée auparavant, ce qui est bien dommage car elle me parait être la meilleure.

Au niveau du support, on est au même niveau que la technique avec display:table (IE8+) et donc bien mieux que celle avec transform:translateY() (IE9+).
Au niveau markup, c'est une des plus légères car elle utilise un pseudo-élément et il est facile d'en faire un objet CSS pour pouvoir la réutiiser facilement.
Et pour finir, elle est utilisable dans le cas mentionné plus haut.

Voilà comment je compte l'utiliser à l'avenir :

/**
 * .v-align-wrap>.v-align
 */
.v-align-wrap {
	letter-spacing: -0.31em;
}
.v-align-wrap:before {
	content: ""; 
	display: inline-block; 
	height: 100%; 
	vertical-align: middle;
}
.v-align {
	display: inline-block; 
	vertical-align: middle; 
	letter-spacing: normal;
}

Simuler le rendu d'un écran retina dans votre navigateur

J'ai découvert un peu par hasard que Firefox simule le rendu d'un écran à haute densité de pixels — ou retina — lorsqu'un certain niveau de zoom est atteint (apparemment, c'est 150%. Soit 4x le zoom normal.)

Cela va donc reproduire le rendu flou des images (sauf si vous utilisez du SVG ou une icon-font), mais cela peut aussi déclencher les media queries correspondantes.

Par exemple, la media query suivante se déclenche en zoomant sur Firefox :

@media (min--moz-device-pixel-ratio: 1.5),
    (-o-min-device-pixel-ratio: 3/2),
    (-webkit-min-device-pixel-ratio: 1.5),
    (min-device-pixel-ratio: 1.5),
    (min-resolution: 144dpi),
    (min-resolution: 1.5dppx) {
            // Vos styles retina
}

Voir la démo (ctrl++ pour déclencher le zoom)

Cela peut s'avérer pratique si vous devez tester rapidement le bon fonctionnement d'un fix pour écran retina sans avoir l'appareil adéquat sous la main.

Au niveau compatibilité, j'ai noté que cette fonctionnalité était aussi présente sur Chrome (attention, il faut rafraichir la page pour déclencher la media query) et Internet Explorer.

Ouvrir un accordion jQuery en fonction de l'URL

Récemment, lors de la refonte d'un vieux projet, j'ai décidé de mettre à jour jQuery.
Le projet datait d'il y a plus de 2 ans et avait pas mal de versions de retard, donc il était temps de repartir sur une base saine avec jQuery 1.9.

J'ai malheureusement eu la désagréable surprise de découvrir qu'il y avait certains changements dans l'API de jQuery UI, notamment sur le widget « Accordion » avec la disparition pure et simple de l’option navigation qui permettait d’ouvrir la partie de l’ « accordion » comprenant un lien vers la page actuelle.

Ça pouvait notamment être très utile en utilisant des #mots-clés en fin d’URL pour ouvrir les différents éléments de l’ « accordion ».

J’ai donc cherché sur Internet une alternative à cette option, en accord avec la nouvelle API ; mais mes recherches se sont avérées infructueuses, donc j’ai retroussé mes manches et voici la solution !

Tout d’abord le HTML :

<div id="accordion">
    <h2><a href="#accordeon1">Titre 1</a></h2>
    <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></div>
    <h2><a href="#accordeon2">Titre 2</a></h2>
    <div><p>Pellentesque lectus tellus, ullamcorper vitae leo ut, egestas tristique mi.</p></div>
    <h2><a href="#accordeon3">Titre 3</a></h2>
    <div><p>Maecenas neque nibh, porta sit amet pulvinar eu, porta nec enim. Nulla et laoreet ipsum.</p></div>
</div>

Ici, le lien est situé au niveau du header mais ça peut aussi marcher avec un lien dans le contenu.

Et pour le JS :

// On récupère l’URL de la page actuelle. 
// Ici c'est un hash car on reste sur la même URL, mais si vous utilisez une URL différente pour chaque élément, vous pouvez utiliser `window.location.pathname` par exemple
var current = window.location.hash; 

// On cherche si il y a un lien qui correspond à l'URL de la page, puis on récupère son parent. Le parent doit être le premier descendant de l'accordéon, ici c'est un `H2`.
var findToggler = $('#accordion a[href$="' + current +'"]').parent('h2');

var indexToggler;
if(findToggler.length) { // Si on a trouvé un élément correspondant
    indexToggler = findToggler.index('h2'); // On récupère son index - l'index est indispensable pour définir l'onglet à ouvrir
} else {
    indexToggler = 0; // Si on est sur une autre page, on ouvre le premier onglet. On peut éventuellement en ouvrir aucun en utilisant `false`.
}
$('#accordion').accordion({
    heightStyle: "content", 
    active: indexToggler // On utilise la variable pour définir quel élément ouvrir.
});

Et voilà !

Améliorer le mode « Vue adaptative » de Firefox

Update 10/09/2014 : Ajout des dimensions pour l'iPhone 6 et 6 Plus

Lorsque je dois intégrer un design responsive ou un site mobile, j'utilise le mode « vue adaptative » de Firefox (Outils > Développeur web > Vue adaptative).

Je le trouve plus pratique que les différents bookmarklets qu’on trouve un peu partout (ici, ou encore ), mais dans l’absolu ils se valent tous plus ou moins.

Une chose qui fait cependant défaut à l’outil de Firefox, ce sont les tailles prédéfinies — les presets. On y retrouve en effet les résolutions les plus répandues sur le marché, sans plus d’indications, notamment sur la correspondance avec les appareils.

Qu’à cela ne tienne, étant donné que l’on peut créer et sauvegarder ses propres presets, je me suis attelé à ajouter les différentes résolutions du marché, en me basant sur le projet de Stefanie Hatcher, Mobile + Tablet devide dimensions.

Et voilà le résultat !

Si ça vous intéresse, je vous donne la marche à suivre :

  1. Dans le mode « vue adaptative », sélectionner une résolution et cliquer sur « Ajouter la préselection »
  2. Ouvrir un nouvel onglet et taper about:config (n’allez pas y faire n’importe quoi par contre !)
  3. Taper « preset » dans le moteur de recherche. Normalement, vous devriez voir apparaitre deux lignes :
    • devtools.responsiveUI.presets
    • devtools.responsiveUI.currentPreset
  4. Ouvrir devtools.responsiveUI.presets et coller le code suivant :
[{"key":"266x533","name":"HTC EVO","width":266,"height":533},{"key":"320x480","name":"iPhone 3GS - 4 - 4S","width":320,"height":480},{"key":"320x533","name":"Galaxy SII - HTC Desire - Nokia Lumia 710","width":320,"height":533},{"key":"320x568","name":"iPhone 5","width":320,"height":568},{"key":"360x640","name":"Galaxy Note II - Galaxy SIII, SIV - HTC One","width":360,"height":640},{"key":"375x667","name":"iPhone 6","width":375,"height":667},{"key":"414x738","name":"iPhone 6 Plus","width":414,"height":738},{"key":"384x640","name":"Nexus 4 - Nokia Lumia 920 - BlackBerry Z10","width":384,"height":640},{"key":"400x640","name":"Galaxy Note","width":400,"height":640},{"key":"480x800","name":"Galaxy S","width":480,"height":800},{"key":"533x853","name":"Kindle Fire HD - Galaxy Tab","width":533,"height":853},{"key":"600x1024","name":"Galaxy Tab 1 & 2","width":600,"height":1024},{"key":"601x962","name":"Nexus 7","width":601,"height":962},{"key":"720x1280","name":"Surface Pro","width":720,"height":1280},{"key":"720x1366","name":"Surface","width":720,"height":1366},{"key":"768x1024","name":"iPad","width":768,"height":1024},{"key":"800x1280","name":"Kindle Fire HD 9 - Galaxy Note 10 - Galaxy Tab 2 10 - Nexus 10","width":800,"height":1280},{"key":"980x1280","width":980,"height":1280},{"key":"1280x600","width":1280,"height":600},{"key":"1920x900","width":1920,"height":900}]

Attention, cette opération effacera les tailles existantes ! Donc si jamais vous en aviez ajouté, il faut les sauvegarder avant de coller ce code.

Le zoom navigateur est le nouveau « Vider le cache »

Ça vous est déjà probablement arrivé : déclencher par inadvertance le zoom de votre navigateur (ctrl+ ou ctrl-, ctrl+0 pour revenir à la normale) et ne même pas vous en rendre compte.

Je vois de plus en plus ce petit « accident » devenir la source de bugs relevés par les clients ou les équipes. Vous savez, ce bug qui n’arrive que chez la personne en question, semble bien réel, mais que vous n’arrivez pas à expliquer ou à reproduire.

Le zoom navigateur est assez traître, car il ne crée en général que des problèmes de mise en forme très localisés.
Pour le reste, le site apparait en plus gros dans son ensemble — un zoom, quoi — mais si vous n’avez pas la version originale pour comparer, il peut être difficile de s’en rendre compte.

Auparavant, on avait le cache du navigateur comme explications des différences entre le poste du client et le notre, maintenant il faudra aussi penser à vérifier si le zoom est activé !

Faut-il conserver les préfixes pour les dégradés ?

Lea Verou a décidé de se pencher sur la question sur son blog en se basant sur les navigateurs qui supportent les dégradés sans préfixes et les statistiques d'utilisation de ceux qui les nécessitent.

TL;DR

  • Le préfixe -ms- est tout à fait inutile car il n'a jamais été utilisé sur une version stable d'Internet Explorer.
  • Le préfixe -moz- n'est plus nécessaire, sauf si vous souhaitez assurer le support pour les versions 3.6 à 16 de Firefox.
  • Le préfixe -o- de même, sauf pour les versions antérieures à 12.10 (0,25% d'utilisateurs dans le monde)
  • Le préfixe -webkit- est à conserver. Les dégradés non préfixés ne sont pas supportés par Safari, mais surtout par les navigateur mobiles utilisant WebKit (et ils sont nombreux).

Point important à retenir : n'oubliez pas d'ajouter une couleur de fond en fallback pour éviter les soucis !