Mercredi 10/08/11

Vignettes façon thumbnail en CSS 3

Sur CSS débutant j'avais, il y a bieeeen longtemps, mis en ligne un tutoriel sur la façon de zoomer des vignettes façon thumbnail.. Ce tutoriel était bien entendu basé sur des CSS 2.1.

Les CSS3 offrent de nouvelles possibilités et j'ai voulu modifier ce tuto pour le mettre à la sauce transform:scale() et transition.

Côté compatibilité avec les navigateurs, transform fonctionne avec tous les navigateurs récents, même IE9. Par contre transition n'est pas pris en charge par IE9, mais on s'en moque un peu : cet effet n'est pas crucial en soi, c'est juste pour donner de la fluidité à l'agrandissement.

J'ai constaté par contre une non prise en charge de transform sur la pseudo classe :focus par chrome. C'est bien dommage car cela permet d'obtenir un zoom en tabulant avec le clavier et pas seulement au survol de la souris.
Opera a aussi un comportement un peu sacadé en fin de transition.
Cependant, on va se garder de crier après les navigateurs "déficients" : la spec du W3C étant encore à l'état de brouillon, les navigateurs font ce qu'ils peuvent avec les moyens du bord.

Voici de quoi tester ce que ça donne avec quelques magnifiques photos de mes magnifiques vacances en Bretagne :

Le code (x)html utilisé est des plus simples :

<div class="zoom" id="zoom" >
<p>
<a href="#zoom"><img src="mine.jpg" alt="" /></a> 
<a href="#zoom"><img src="port-navallo.jpg" alt="" /></a>
<a href="#zoom"><img src="eau.jpg" alt="" /></a>
</p>
</div>

Oui, je sais : l'utilisation des liens fictifs, c'est discutable. Mais ça permet donc le zoom au clavier et aussi d'adapter quelque chose pour IE6, même s'il meurt inexorablement...

Par défaut l'agrandissement se fait à partir du centre de l'image. On peut le modifier grâce à transform-origin qui admet les mots clés top, bottom, left, right, ou un pourcentage, ou encore une longueur.

Il convient tout de même de faire attention à la taille globale de la page. En effet, l'image zoomée peut déborder de la fenêtre. Donc à moins que ce soit le clavier qui ait été utilisé et qui donc "fixe" l'image à l'écran, on ne peut pas atteindre l'ascenceur pour la voir entièrement.

L'option transform:translate() ne donne hélas pas, d'autre part, de résultats satisfaisants pour tenter de recadrer l'image dans la page. L'image peut en effet "s'échapper" du contrôle de la souris. Dans ce cas, soit on n'arrive pas à retenir l'image agrandie, soit on a des sauts intempestifs très désagréables.

Code CSS

.zoom p img {
width:120px;
height:90px;	    
display:inline-block;
}
.zoom p a {
outline:none
}
.zoom p a:hover img, .zoom p a:focus img {	
/*webkit*/
-webkit-transform:scale(5);	
-webkit-transform-origin:top left;
-webkit-transition:all 0.7s linear;	 
-webkit-box-shadow:1px 1px 10px dimgray;
/*mozilla*/
-moz-transform:scale(5);
-moz-transform-origin:top left;
-moz-transition:all 0.7s linear;
-moz-box-shadow:1px 1px 10px dimgray;
/*internet explorer*/
-ms-transform:scale(5);
-ms-transform-origin:top left;
-ms-transition:all 0.7s linear;
/*opera*/
-o-transform:scale(5);
-o-transform-origin:top left;
-o-transition:all 0.7s linear;
/*w3c*/
transform:scale(5);
transform-origin:top left;
transition:all 0.7s linear;	
box-shadow:1px 1px 10px dimgray; 
}

Pour les versions antérieures à IE9, on rajoutera le code suivant dans un commentaire conditionnel excluant IE9 :

.zoom p {
position:relative;
}
.zoom p a:hover img, .zoom p a:focus img {
position:absolute;
width:600px;
height:400px;
}

[Edit 11/08]

  1. Florian, qui se gausse qu'on puisse encore s'intéresser à IE6 en 2011 (die IE6, die), propose d'attribuer un tabindex pour donner un focus aux images, plutôt que de mettre des liens fictifs. Effectivement, c'est une solution ;
  2. Pour Chrome, déclarer les tailles des images en pourcentages donne des résultats incohérents... Je ne comprends pas bien quel calcul il fait, mais les images sont complètement déformées si on déclare width et height en %. Il y a un cours de math sur les % qui a du mal passer au niveau des développeurs clin d'oeil ;
  3. Opera windows ne semble pas du tout aimer le line-height hérité d'une déclaration sur les paragraphes. Cela donne des résultats... surprenants. La solution : enlever <p> du code s'il y a un line-height de déclaré quelque part.

L'effet est sympa !

Le top du top serait d'ajouter une ancre juste au-dessus des photos.
Là quand on clique sur les photos on remonte en haut de page c'est perturbant :)

Sébastien

Sébastien Delorme - 10-08-2011 - 19:16

Ah mais oui, une ancre tout simplement. Mais il y a des moments je me demande où j'ai la tête ! Etonnant, non ?
Voilà, j'ai rajouté un id="zoom" pour l'ancrage. Merci Sébastien :)

Pascale - 10-08-2011 - 19:32

J'avais découvert aussi il y a peu.
Dommage que l'on ne puisse pas charger une miniature puis changer le src sur le hover.

tfe - 10-08-2011 - 21:50

Un truc comme ça ? http://www.ie7nomore.com/fun/slideshow/ (utilisation de :target)

Pascale - 11-08-2011 - 12:08

Hello,

Une petite remarque concernant la suggestion de Florent de retirer les liens pour ajouter un tabindex directement sur les images.

En l'état les images sont dans des liens et possèdent une alternative vide. On se retrouve donc avec des liens vides qui sont annoncés à l'utilisateur (avec un lecteur d'écran, sans CSS par une bordure...). Le problème est que ces liens ne pointent nulle part, ils peuvent s'avérer perturbants.

Le tabindex est - je trouve - une très bonne idée également du point de vue de l'accessibilité.


Avec ou sans alternative sur les images (selon le contexte d'utilisation), la solution sera pertinente.

Sébastien Delorme - 13-08-2011 - 10:18

Hey :)

J'ai découvert ce site depuis peu et j'avoue que j'y ai trouvé une grande inspiration ;)

Merci pour ces explications que je vais mettre en oeuvre sur le site sur lequel je travail actuellement :)

Encore une fois merci !

Nico'

HS : Y'aurais-t-il un genre d'alerte mail pour les nouveau article publié ??

Nicolas - 05-09-2011 - 21:04

Merci Nico' sourire

Il n'y a pas de liste de diffusion, mais des fils RSS auxquels on peut s'abonner (va falloir effectivement que je fasse quelque chose de plus clair pour pouvoir y accéder).
Celui-ci http://www.mammouthland.net/rss_open2.xml regroupe tous les articles ou tutoriels publiés sur les CSS que ce soit ici ou sur CSS Débutant.

Pascale - 05-09-2011 - 21:52

:)

Hmmm, je me heurte au message suivant en allant sur ton lien : "This XML file does not appear to have any style information associated with it. The document tree is shown below."

C'est pas que j'aime pas le code mais c'est légèrement chiant de devoir différencier le code du texte réel Etonnant, non ?

Nicolas - 06-09-2011 - 17:03

Mon Dieu, mais qu'utilises-tu comme navigateur ? ;-D
Ce message est normal, sauf qu'un navigateur récent doit surtout te proposer un abonnement.

Un flux RSS n'est pas fait pour être lu avec un navigateur, mais avec un agrégateur. Thunderbird fait ça très bien, mais tu peux aussi utiliser des services comme netvibes, ou google reader ou que sais-je encore. les services ad-hoc, ce n'est pas ce qui manque clin d'oeil
http://www.commentcamarche.net/faq/3339-agregateurs-rss-lecteurs-de-fils-rss
http://www.journaldunet.com/solutions/intranet-extranet/selection/10-lecteurs-de-flux-rss-pour-ameliorer-sa-veille/10-lecteurs-de-flux-rss-pour-ameliorer-sa-veille.shtml

Pascale - 06-09-2011 - 20:42

Les commentaires de ce billet sont fermés.

| Avant | Archives | Haut de page |