Aller au menu - Aller au contenu

Icône Customisons notre diaporama… (2/2)

Avatar
Mise à jour : 18/12/2010
Difficulté : Facile Facile Durée d'étude : 1 heure
933 visites depuis 7 jours, dont 38 sur ce chapitre classé 134/786
Vous voulez plus de maîtrise sur votre diaporama ? C'est parti !
Nous allons tranquillement rendre cela possible en pratiquant.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Abracadabra, transparentes-toi !

Il existe une propriété CSS époustouflante appelée opacity. Grâce à elle, il est possible de rendre transparent du texte, des images et des boîtes !

Elle n'est pas valide CSS2.1, mais elle est bien valide CSS3 ! C'est bizarre, je sais… renseignez-vous un peu sur Internet si le cœur vous en dit.


Opacity


L'idée pour notre diaporama serait de rendre toutes nos images transparentes jusqu'à ce que le curseur de la souris se déplace sur l'une d'elles, ce qui aurait pour effet, en plus de faire apparaître l'agrandissement, d'enlever l'effet de transparence. Vous allez voir, c'est bluffant !

Tout se passe dans le CSS bien sûr, voyons cela tout de suite.

opacity prend une valeur comprise entre 0 et 1 (0.1, 0.2, etc.). À 0, l'élément auquel elle est appliquée est invisible et à 1, il n'est plus transparent du tout, on dit qu'il est opaque. Toutes les valeurs entre 0 et 1 sont des états de transparence.

Ça marche si je mets opacity:0,5; ?

Non ! Il faut utiliser le point et non la virgule !


Rendre nos miniatures transparentes


Voyons maintenant où mettre opacity. Essayez ceci :

Code : CSS
1
2
3
4
#diaporama img {opacity:0.4; 
}


Vous verrez que vos miniatures sont bien transparentes. Mais le problème, c'est que les agrandissements le sont aussi ! Il va falloir trouver un moyen de régler ça.
Et en plus, on voit le texte à travers ; mais ça va être corrigé, ne vous inquiétez pas !

Garder nos agrandissements opaques


Essayez par vous-mêmes de rendre les agrandissements opaques et quand vous pensez avoir trouvé, comparez avec ma solution :

Secret (cliquez pour afficher)
Code : CSS
1
2
3
4
#diaporama div img:hover + .grande {opacity:1;
}


C'est simple, non ? En même temps que de rendre l'agrandissement apparent, on le rend aussi opaque.

Rendre la miniature survolée opaque elle aussi


Mais il reste une grande amélioration esthétique en attente. Je voudrais que la miniature sur laquelle je pointe devienne elle aussi opaque, comment faire ?

Secret (cliquez pour afficher)
Code : CSS
1
2
3
#diaporama img:hover {
    opacity:1; 
}

C'est ça, bravo, bien joué !

C'est tout ce que j'avais à vous dire sur opacity, vous trouverez plus d'informations ici.

Un peu de border-radius pour faire joli


On peut rapidement et facilement arrondir les coins de nos miniatures et agrandissements.

J'omets volontairement les préfixes -moz et autres -webkit par souci de clarté.

Donnons à nos images un aspect plus doux et un fond noir :

Code : CSS
1
2
3
4
#diaporama img {border-radius:10px;
}

Si vous ne voyez pas les bords des images s'arrondir, alors cela veut dire que votre navigateur ne supporte pas encore cette propriété, désolé. Si vous tenez absolument à voir ce que cela donne, je ne saurais trop vous conseiller d'installer Google Chrome ou Chromium pour ça.

Et si on donne à border-radius la moitié du côté d'un carré, le carré devient un… un… ?

Code : CSS
1
2
3
4
#diaporama img {border-radius:25px;
}

Tout ça en CSS…

Secret (cliquez pour afficher)
Image utilisateur


Vous pouvez aussi très bien appliquer un border-radius différent à vos agrandissements, essayez !

Ajouter des bordures

Nous allons ajouter des bordures autour de nos miniatures et agrandissements pour donner du cachet à notre diaporama.

Un peu de maths


Il serait maladroit de se lancer sans réfléchir. Voici quelques questions à se poser…

Où va venir se mettre la bordure si j'applique ceci ?

Code : CSS
1
2
3
4
#diaporama img {border:2px solid black;
}

Réponse :

Secret (cliquez pour afficher)
Autour de chaque image, la bordure ajoute de la largeur et de la hauteur.

Il faut donc prendre une décision. Est-ce qu'on veut que l'ajout de bordures vienne augmenter la taille de notre diaporama ou est-il préférable de modifier la taille de nos miniatures de sorte que la taille du diaporama ne change pas ?

Je préfère pour ma part ne pas modifier la taille du diaporama. Pour l'instant ça ne changerait pas grand-chose, mais dans la partie II ça aura son importance. Nous allons donc redimensionner les miniatures !

Pour une bordure de 2 pixels, de combien de pixels faudra-t-il réduire la largeur et la hauteur des miniatures pour que le total image + bordures tienne dans l'espace actuel de nos miniatures ?

Réponse :

Secret (cliquez pour afficher)
La nouvelle largeur est égale à la largeur actuelle de la miniature sans bordures moins le double de la largeur de la bordure.
C'est-à-dire que si on a une largeur de miniature de 50 pixels et qu'on décide d'ajouter une bordure de 2 pixels, il faudra donner aux miniatures une largeur de 50 moins 2 × 2, soit 46 pixels.

Pourquoi deux fois la bordure ?
Bah parce que la bordure se retrouve deux fois dans la largeur, et de même pour la hauteur !


Une bordure dans le diaporama


Donc, pour appliquer une bordure de 2 pixels, on fera ainsi :

Code : CSS
1
2
3
4
5
#diaporama img {width:46px;
    height:46px;
    border:2px solid black;
}

Mais ça ne suffit pas !

Le cas de l'agrandissement


Si nous laissons les choses telles qu'elles sont, nous aurons mal fait notre travail. En haut et à gauche, tout va bien. Mais en bas et à droite, c'est loin d'être parfait !

Si on met des bordures, il faut qu'elles soient égales partout, sinon ça ne fait pas joli.
Et en appliquant une bordure aux miniatures, on réduit la zone de l'agrandissement puisque celui-ci aussi doit être réduit pour accueillir des bordures (toutes les images ont reçu des bordures, même nos agrandissements).

Il faut donc réduire l'agrandissement de 4 pixels également en hauteur et en largeur :

Code : CSS
1
2
3
4
#diaporama div img:hover + .grande {
    width:396px;
    height:396px;
}

Voilà qui est mieux. ^^

Encore quelques détails


Tout à l'air de bien aller dans notre diaporama… jusqu'à ce qu'on décide d'attribuer une couleur de fond au diaporama différente de celle de body :

Code : CSS
1
2
3
4
5
6
7
8
#diaporama {background-color:white;
}
#diaporama img {border:2px solid white;
}

Promenez votre curseur sur les miniatures et regardez la bordure entre les miniatures, puis entre les miniatures et les agrandissements. Il y a partout 4 pixels. Mais entre les miniatures et l'extérieur de diaporama, il n'y en a que 2 !

Cela est dû au fait que les miniatures, entre elles, ont doublé la largeur de la bordure, alors qu'elles n'avaient personne avec qui doubler la bordure sur les bords du diaporama.

Modifions donc la bordure du diaporama :

Code : CSS
1
2
3
4
5
#diaporama {background-color:white;
    border:2px solid white;
}

C'est bien, mais maintenant, notre diaporama mesure 4 pixels de plus, il n'est donc plus exactement centré.

Code : CSS
1
2
3
4
5
#diaporama {margin-left:-252px;     /* On retire 2 pixels de décalage horizontal */
    margin-top:-252px;      /* Et encore 2 pixels de décalage vertical */
}

Là, c'est mieux ! :D

Mais ce n'est pas encore fini…

Modifiez la couleur du centre :

Code : CSS
1
2
3
4
#diaporama .centre {background-color:black;
}

En bougeant le curseur entre l'extérieur du diaporama et les miniatures, vous vous apercevrez qu'il lui manque de la bordure au centre…
Et si on lui ajoute de la bordure, il faut réduire ses dimensions, sinon le diaporama va déborder !

Code : CSS
1
2
3
4
5
6
#diaporama .centre {width:396px;
    height:396px;
    border:2px solid white;
}


Voilà, il fallait faire tout cela pour bien comprendre le mécanisme des bordures dans notre diaporama. Si ça vous embête, n'en mettez pas, mais nous y reviendrons de toute manière dans cette partie et aussi dans la suivante. C'était pour vous garder captivés que je vous ai donné beaucoup de liens, j'espère n'avoir perdu personne en route !

Récapitulatif sur les bordures


Pour bien terminer sur les bordures, et pour que vous puissiez vous y référer plus tard, voici un récapitulatif des actions à mener pour bien appliquer une bordure dans notre diaporama. Avec des commentaires, des formules passe-partout, tout ça… :-°

[ b ] représente la bordure dans les formules et doit être remplacée par le nombre de pixels qu'on a décidé d'appliquer. Ce nombre doit être constant tout au long du code. Une bordure de 2 pixels aux images puis de 3 pixels au reste romprait l'équilibre et l'esthétique du diaporama.

Il faut bien comprendre aussi qu'une bordure de 1 pixel, si toutes les consignes sont respectées, résultera en une bordure de 2 pixels entre tous les éléments. La quantité de pixels donnée sera toujours doublée, c'est la nature de notre diaporama et les règles du CSS qui le veulent, on ne peut rien y changer.

Code : CSS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#diaporama {
    position:absolute;
    width:500px;
    left:50%;
    margin-left:-252px;		/* On retire la bordure en plus pour garder notre diaporama centré [ - largeur / 2 - b ] */
    height:500px;
    top:50%;
    margin-top:-252px;		/* On retire la bordure en plus pour garder notre diaporama centré [ - hauteur / 2 - b ] */
    border:2px solid white;	/* On applique la bordure qui sera doublée [ b ] */
}
#diaporama div img:hover + .grande {
    display:inline;
    position:absolute;
    width:396px;		/* Il faut réduire la taille de nos agrandissements de [ largeur - 2 b ] */
    left:50%;
    margin-left:-200px;
    height:396px;		/* Il faut réduire la taille de nos agrandissements de [ hauteur - 2 b ] */
    top:50%;
    margin-top:-200px;
    z-index:1;
}
#diaporama img {
    float:left;
    width:46px;			/* Il faut retirer deux fois la bordure [ largeur - 2 b ] */
    height:46px;		/* Il faut retirer deux fois la bordure [ hauteur - 2 b ] */
    border:2px solid white;	/* On applique la bordure (qui sera doublée) sur TOUTES nos images [ b ] */
}
#diaporama .centre {
    float:left;
    width:396px;		/* Il faut retirer deux fois la bordure du centre [ largeur - 2 b ] */
    height:396px;		/* Il faut retirer deux fois la bordure du centre [ hauteur - 2 b ] */
    border:2px solid white;	/* Bordure (elle sera doublée) [ b ] */
}

Je n'ai mentionné que les sélecteurs concernés par les bordures en leur enlevant tout ce qui n'était pas nécessaire, comme les propriétés border-radius et opacity.
Ceux qui souhaiteraient récupérer les codes HTML et CSS de certains exemples peuvent le faire avec un clic droit sur la page → Afficher le code source.

Ça y est cette fois c'est fini ! Toutes les dimensions qui n'ont pas été commentées ne seront pas modifiées par le fait d'avoir ajouté une bordure, quelle que soit sa largeur.

Changer de résolution en un clic

On sait tout faire maintenant, qu'est-ce que tu veux nous montrer encore ?

Ce qui est bon avec un diaporama centré comme le nôtre, c'est qu'on peut appeler un autre diaporama dont seules les dimensions diffèrent. Quel effet cela donnerait alors ? Un agrandissement ou un rétrécissement de diaporama, eh oui ! Enfin, un changement de résolution de diaporama pour être plus exact. Même notre texte ne bougera pas d'un iota pendant le changement de résolution !

Comme vous pouvez le voir, rien n'a été laissé au hasard. :) C'est parti !

Le résultat que nous voulons obtenir


  • Nous allons utiliser un diaporama sans artifices (pour y voir clair) et mettre dans la zone du milieu un lien vers un autre diaporama.
  • Cet autre diaporama présentera les mêmes photos mais dans une résolution différente, ainsi qu'un lien vers le fichier qui l'a appelé.
  • La taille des miniatures sera augmentée de 50 % (si vous préférez réduire de 50 % la résolution, c'est aussi très bien !).
  • Il y aura très peu de différences entre les fichiers HTML qui appelleront la même feuille CSS.
  • Les changements à faire dans le CSS seront quant à eux assez nombreux, mais resteront simples.


Comment nous y prendre


Cet exercice demande de l'organisation et une bonne compréhension du résultat attendu.

Nos fichiers


Nous aurons trois fichiers :
  • resolution.css ;
  • grand.html ;
  • petit.html.


Notre XHTML


Nos fichiers HTML auront un contenu très similaire, voici leurs quelques différences.
  • Il faut s'assurer que les deux fichiers s'appellent mutuellement, sinon on n'irait pas bien loin !
  • Pour les liens, choisissez quelque chose de parlant. J'utiliserai « Agrandir » et « Réduire » dans mon diaporama.
  • L'id du diaporama doit changer pour pouvoir appliquer un style différent à chacun. Par exemple, #grand et #petit.
  • Il faudrait aussi pouvoir appliquer du style en même temps à #petit et à #grand, je vous propose donc de leur attribuer, en plus d'un id, une classe .diaporama.


Notre CSS


Le CSS sera facile à traiter, voici ce qui va se passer.
  • Jusqu'à présent, nous avons toujours essayé d'avoir le code le plus concis possible, et nous allons continuer.
  • On va commencer par remplacer toutes les occurences de #diaporama par .diaporama, ainsi, ce qui est commun aux deux diaporamas ne sera écrit qu'une fois pour un seul sélecteur.
  • On répétera ensuite les propriétés CSS qui sont concernées par le changement de résolution et elles seules (car on leur applique pour l'instant le style qui convient à #petit) sous l'id #grand afin d'apporter les modifications nécessaires à notre changement de résolution.

Comprenez bien qu'il est plus simple, concis et rapide d'assumer que les valeurs de base sont pour l'un des diaporamas et ensuite de modifier ce qui doit l'être pour l'autre que de tout mettre en double (il y aurait des redondances).

Ici, on donne les valeurs pour #petit puis on adapte pour #grand. On aurait aussi bien pu commencer avec les valeurs de #grand et modifier ce qui devait l'être pour #petit. Cela ne ferait strictement aucune différence !

Roulez jeunesse !

S'il vous plaît, on se calme dans la classe ! Je vous ai donné un exercice et je ramasse les copies dans quinze minutes !


… …
… … …

Correction !



Le HTML


Secret (cliquez pour afficher)
Il suffit que les deux fichiers appellent le même fichier resolution.css, en ne changeant que l'id du diaporama (#petit pour l'un, #grand pour l'autre)…
Bon d'accord, je vous donne le début d'un de mes fichiers pour être bien certain qu'on parle effectivement de la même chose :

Code : HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head> 
        <title>Tikal</title> 
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
        <link rel="stylesheet" type="text/css" href="resolution.css" />
    </head>
    <body>
    <div id="petit" class="diaporama">
        <div class="haut">
            <img src="votre_chemin/1.jpg" alt="…" /><img class="grande" src="votre_chemin/1.jpg" alt="…" />
            <img src="votre_chemin/2.jpg" alt="…" /><img class="grande" src="votre_chemin/2.jpg" alt="…" />
            <img src="votre_chemin/3.jpg" alt="…" /><img class="grande" src="votre_chemin/3.jpg" alt="…" />


Le CSS


Pour les explications, il faudra vous référer aux commentaires. Vous êtes doués maintenant !

Secret (cliquez pour afficher)
Code : CSS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
.diaporama{				/* Tout ce qui est modifié ici l'est pour #petit et pour ce qui est commun avec #grand */
	position:absolute;
	width:500px;
	left:50%;
	margin-left:-250px;
	height:500px;
	top:50%;
	margin-top:-250px;
}
#grand {				/* Voici ce qu'il faut modifier pour que #grand s'affiche correctement */
	width:750px;
	margin-left:-375px;
	height:750px;
	margin-top:-375px;
}
.diaporama div img + .grande{		/* On cache les agrandissements des deux diaporamas en une ligne */
	display:none;
}
.diaporama div img:hover + .grande{	/* Dimensionnement et positionnement de #petit et ce qui est commun aux deux diaporamas */
	display:inline;	
	position:absolute;
	left:50%;
	width:400px;
	margin-left:-200px;
	top:50%;
	height:400px;
	margin-top:-200px;
	z-index:1;
}
#grand div img:hover + .grande {	/* Ceci dimensionnera et placera les agrandissements de #grand  */
	width:600px;
	margin-left:-300px;
	height:600px;
	margin-top:-300px;
}
.diaporama img {			/* Positionnement et taille des miniatures de #petit */
	float:left;
	width:50px;
	height:50px;
}
#grand img {				/* Positionnement et taille des miniatures de #grand, sans répéter le float */
	width:75px;
	height:75px;
}
#petit .haut {				/* Dimensionnement de .haut de #petit */
	width:500px;
	height:50px;
}
#grand .haut {				/* Positionnement et taille du bloc .haut de #grand */
	width:750px;
	height:75px;
}
.diaporama .gauche {			/* Positionnement et dimensionnement de .gauche de #petit */ 
	float:left;
	width:50px;
	height:400px;
}
#grand .gauche {			/* Positionnement et dimensionnement de .gauche de #grand sans répéter le float */ 
	width:75px;
	height:600px;
}
.diaporama .centre {			/* Positionnement et dimensionnement de .centre de #petit */ 
	float:left;
	width:400px;
	height:400px;
}
#grand .centre {			/* Positionnement et dimensionnement de .centre de #grand sans répéter le float */ 
	width:600px;
	height:600px;
}
.diaporama .centre .contenu{		/* Tout ce qui est modifié concernant .contenu l'est pour #petit et pour ce qui est commun avec #grand */
	position:absolute;
	width:400px;
	top:50%;
	margin-top:-120px;
	font-family: Tahoma, Geneva, Kalimati, sans-serif; 
	text-align:center;
}
#grand .centre .contenu {		/* Une seule ligne diffère entre le .contenu de #grand et celui de #petit */
	width:600px;
}
.diaporama a{				/* Les liens sont modifiés une fois pour toutes pour nos deux diaporamas */
	text-decoration:none;
	font-weight:bold;
	color:orange;
	font-size:1.5em;
}

C'est facile, simple et efficace.
On appelle un autre diaporama et ce qui se voit, c'est un changement de résolution : sympa !

Une image de fond et un menu transparent

Dans la famille « inutile, O.K., mais joli », je demande « l'image de fond » !

Insérer une image de fond n'est pas si simple


Si je vous demande comment appliquer une image de fond à notre .centre, vous me dites en chœur :

Tu n'as qu'à utiliser background-image:url('mon_chemin.jpg');.

Et je vous réponds : Non ! Enfin si, mais seulement dans des cas précis, donc non, sauf cas particulier où alors, oui. Je m'explique.

background-image permet d'appliquer une image de fond à un élément, ça, d'accord.
Mais si par exemple je le fais dans mon cas, voici ce que ça me donne :

Code : CSS
1
#diaporama .centre { background-image:('mon_chemin.jpg'); }

Image utilisateur

Alors que moi, ce que je veux, c'est ça :

Image utilisateur


Quel est le problème ?

Secret (cliquez pour afficher)
L'image utilisée comme image de fond est plus grande (600 × 600 pixels) que le fond (400 × 400 pixels), il manque donc une partie à droite et en bas.
Et il n'est pas possible de modifier la taille d'une image que l'on place avec background-image.

Heureusement, il existe un moyen de contourner le problème !

Ne suffirait-il pas de redimensionner l'image avec un éditeur graphique, de sorte qu'elle corresponde au fond de .centre ?

En théorie, si ! Mais dans la pratique, cela a des inconvénients :
  • il faut modifier des images et donc augmenter leur nombre, ce qui n'est pas pour nous faire plaisir ;
  • pire : il faudra redimensionner des images pour chaque diaporama dans toutes les résolutions offertes !

Aïe ! Ça voudrait dire que si notre diaporama compte quatre séries de photos et qu'on offre quatre résolutions, il nous faudra redimensionner et ajouter seize photos. Donc de la bande passante et du travail en plus… On devrait pouvoir faire plus simple. ^^

Exercice


Je vous demande donc de trouver comment faire pour qu'il suffisse de choisir une image afin :
  • qu'elle s'applique au fond de .centre ;
  • qu'elle soit entière ;
  • qu'elle occupe tout l'espace de .centre.

Il n'y a rien de nouveau, vous savez déjà tout faire.


… …
… … …

Le HTML


Secret (cliquez pour afficher)
Côté HTML, c'est très court, il suffit d'ajouter une image (âprement choisie :) ) à l'intérieur de .centre. Par exemple :
Code : HTML
1
2
3
4
5
<div class="centre">
    <img class="imagefond" src="tikal/29.jpg" alt="background" />
    <div class="contenu">

Mais ça va chambouler tout notre diaporama, ça !

Vous avez raison… sauf si on modifie le positionnement de notre image.


Le CSS


Secret (cliquez pour afficher)
Qu'est-ce qu'il faut faire pour afficher une image de fond toujours entière sans avoir à la redimensionner manuellement ?

D'abord, on positionne l'image en absolu, ensuite on lui donne les dimensions de son contenant :

Code : CSS
1
2
3
4
5
#diaporama .centre img {
	position:absolute;
	width:400px;
	height:400px;
}

Quelques remarques :
  • puisque .contenu arrive après .centre, son texte s'affiche au-dessus de l'image ;
  • nous n'aurons pas besoin de lui appliquer la propriété z-index, les agrandissements sont déjà prioritaires (à 1) et il faut que nous voyions le texte, donc tout va bien ;
  • il faudrait cependant rendre notre texte plus visible…


Ne nous arrêtons pas en si bon chemin


Afin de donner plus de visibilité au texte, je vous propose plusieurs autres choses :
  • donner une couleur de fond blanche à .contenu ;
  • réduire la largeur de .contenu et le centrer horizontalement, de sorte que l'on voie l'image de fond tout autour.

Et pour ce qui est des propriétés CSS3 que nous avons vues (je rappelle qu'elles sont invalides CSS2) :
  • rendre .contenu un petit peu transparent ;
  • arrondir ses angles.


… …
… … …

Résultat :

Secret (cliquez pour afficher)
Code : CSS
1
2
3
4
5
6
7
8
#diaporama .centre .contenu {width:300px;			/* Réduction de la largeur de 100 pixels */
	margin-left:50px;		/* Centrage de .contenu */
	background-color:white;		/* Application de la couleur de fond */
	opacity:0.7;			/* Transparence légère */
	border-radius:15px;		/* Arrondissement des angles */
}

Ça devient de plus en plus beau, vous ne trouvez pas ? ;)
Je pense que tout cela ne vous a posé aucun problème… Passons à la suite !
Vous vous êtes accrochés et vous voilà déjà à la fin de la première partie de ce TP. Bravo !
Oh et, au fait, bonne nouvelle : vous savez maintenant tout faire…

Merci de laisser un commentaire si vous avez rencontré des difficultés ou si quelque chose ne vous paraît pas clair.
Chapitre précédent Sommaire Chapitre suivant

Partager

Il n'y a pas encore de commentaire pour ce tuto.

Ce tutoriel a été corrigé par les zCorrecteurs.