Exrtait du chapitre 5

Transcription

Exrtait du chapitre 5
5
Effets
Pouvoir modifier les couleurs et les polices est certes déjà intéressant, mais, c’est bien connu, on
en veut toujours plus ; on recherche de l’éclat, du panache, du clinquant. Il est probablement
quelque peu exagéré de réunir tout cela dans une rubrique “effets”, mais le sujet de ce chapitre
est si vaste qu’il est difficile de faire autrement. Vous allez voir comment obtenir des angles
arrondis, faire ressortir des boîtes, simuler des filtres de distorsion, faire coulisser des images
dans des onglets, créer un effet de parallaxe, etc.
Complexspiral
Il s’agit là d’un vieux succès, en toute modestie évidemment. À l’époque où je l’ai créé, en 2001,
cet effet était appelé démonstration “complexspiral”. Même si sa principale utilisation a été
depuis éclipsée par les images PNG avec transparence et les couleurs RVBa, il recèle encore
quelques points intéressants.
Pour le mettre en œuvre, vous avez besoin d’au moins deux images d’arrière-plan (voir
Figure 5.1).
Ensuite, affectez l’une d’elles à l’arrière-plan de l’élément body, l’autre à l’arrière-plan d’un élément div dans lequel est placé le contenu de la page (voir Figure 5.2). Voici les styles CSS et un
squelette HTML :
body {background: white url(shell.jpg) top left no-repeat fixed;}
div#main {background: white url(shell-rippled.jpg) top left no-repeat fixed;}
<body>
<div id="main">
(...contenu...)
</div>
</body>
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 141
01/06/2011 14:12:07
142
CSS – Techniques professionnelles pour une mise en page moderne
Figure 5.1 : Les deux images utilisées.
Figure 5.2 : Le résultat final.
Le secret réside dans le mot clé fixed. Dans les deux règles, il permet de positionner les images
d’arrière-plan de sorte que leur angle supérieur gauche corresponde à l’angle supérieur gauche
de la zone d’affichage (dans ce cas, la fenêtre du navigateur), sans qu’elles puissent en bouger,
même lors du défilement du document. Elles se trouvent donc toujours l’une par-dessus l’autre.
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 142
01/06/2011 14:12:08
Effets
Chapitre 5 143
Pour comprendre ce que cela signifie, examinons un exemple plus simple dans lequel deux
images d’arrière-plan de taille différente sont positionnées de manière fixe dans l’angle supérieur gauche de la fenêtre d’affichage (voir Figure 5.3).
html, body {background: transparent top left no-repeat fixed;}
html {background-image: url(red-box.gif);}
body {background-image: url(green-box.gif);}
Figure 5.3 : Deux images en position fixe dans la fenêtre d’affichage.
Vous remarquerez que les images restent dans l’angle supérieur gauche de la fenêtre même dans
le cas d’un défilement jusqu’à environ la moitié de la page. Elles sont fixes (fixed) par rapport à
la fenêtre d’affichage. En aucun cas elles ne bougent.
Pour la démonstration complexspiral, nous prenons deux images de taille identique que nous
alignons parfaitement. Nous les positionnons afin que l’une chevauche l’autre là où son élément
existe et coïncide avec l’emplacement de l’image. C’est pourquoi la coquille floue est visible dans
le div principal, alors que l’image nette de la coquille est visible dans l’arrière-plan de l’élément
body qui l’entoure. L’image d’arrière-plan du div n’est pas aligné avec son angle supérieur
gauche, mais avec celui de la fenêtre d’affichage. Vous ne voyez que l’intersection avec le div luimême (voir Figure 5.4).
Supposons à présent que vous souhaitiez créer un troisième effet de distorsion pour les titres du
contenu. Il suffit d’impliquer une autre image (voir Figure 5.5).
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 143
01/06/2011 14:12:08
144
CSS – Techniques professionnelles pour une mise en page moderne
Figure 5.4 : L’effet de flou sur la coquille suit le défilement.
Figure 5.5 : Ajouter une troisième image.
En l’ajoutant aux titres à l’aide de la règle suivante, nous obtenons l’effet illustré à la Figure 5.6 :
div#main h2 {background: url(shell-traced.jpg) top left no-repeat fixed;}
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 144
01/06/2011 14:12:09
Effets
Chapitre 5 145
Figure 5.6 : Ajouter une troisième image pour les titres.
L’effet ne se limite pas à des images d’arrière-plan non répétées. Vous pouvez facilement constituer des couches superposées de motifs répétés (voir Figure 5.7) ; peut-être pas ces motifs précis,
mais vous comprenez l’idée.
Figure 5.7 : Répéter des motifs.
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 145
01/06/2011 14:12:10
146
CSS – Techniques professionnelles pour une mise en page moderne
La démonstration complexspiral d’origine se fondait sur une même image déclinée dans des
teintes dégradées pour obtenir un effet d’arrière-plan semi-transparent. En 2001, cette solution
représentait l’état de l’art : très peu de navigateurs prenaient en charge le format PNG avec
couche alpha et aucun n’était capable de traiter les couleurs avec canal alpha comme le format
RVBa. Depuis, en raison de l’adoption complète du format PNG, cette solution est obsolète (la
page correspondante existe toujours, à l’adresse http://meyerweb.com/eric/css/edge/complexspiral/demo.html).
En revanche, la solution “déformée” décrite dans cette section reste d’actualité. Il s’agit simplement d’une autre manière d’arriver au même effet.
Fenêtres pop-up en CSS
Si vous faites preuve d’imagination, voici un effet qui vous mènera aux menus contextuels (pour
les détails, voir la section suivante). Dans le cadre d’une utilisation simple, vous pouvez l’employer pour faire apparaître et disparaître des informations lorsque le pointeur de la souris entre
et sort d’un élément, tout cela sans écrire une seule ligne de code JavaScript.
Supposons que vous souhaitiez afficher un petit texte explicatif pour chaque lien placé dans une
barre latérale, mais que vous ne vouliez pas employer les info-bulles car leur présentation est
incohérente entre les navigateurs et leur aspect ne peut pas (encore) être modifié. Le balisage de
base est comparable au suivant :
<ul class="toc">
<li>
<a href="1.html">Chapitre 1 <i>Dans lequel un dragon apparaît.</i></a>
</li>
<li>
<a href="2.html">Chapitre 2 <i>Dans lequel un chevalier est convoqué.</i></a>
</li>
<li>
<a href="3.html">Chapitre 3 <i>Dans lequel une princesse est déçue.</i></a>
</li>
</ul>
Que viennent faire ici les éléments i ? Ne doivent-ils pas être réservés à la présentation ? C’est
vrai et nous sommes dans ce cas. Vous pourriez employer tout aussi facilement des éléments
span, mais i est plus court à saisir et, plus important, si l’application des styles CSS échoue pour
une raison ou pour une autre, le texte sera au moins affiché en italique. À mon avis, cette solution de repli est acceptable.
Revenons aux fenêtres pop-up. Nous commençons par annuler l’affichage des éléments i et ne
les révélons que lors du survol du lien parent (voir Figure 5.8) :
ul.toc li {position: relative;}
ul.toc li a i {display: none;}
ul.toc li a:hover i {display: block; width: 6em;
position: absolute; top: 0; left: 100%;
margin: -1em 0 0 1em; padding: 1em;
background: #CDE; border: 1px solid gray;}
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 146
01/06/2011 14:12:10
Effets
Chapitre 5 147
Figure 5.8 : Du texte dans une fenêtre pop-up à côté des liens.
Et voilà de petites fenêtres pop-up ! Elles sont positionnées relativement aux éléments li parents
en raison de la déclaration position: relative (première ligne des règles CSS précédentes). Si
vous souhaitez les placer relativement au bloc de liens, il suffit d’appliquer le positionnement
relatif à l’élément ul et d’ajuster leur emplacement. Par exemple, voici comment les déplacer
sous le dernier lien de la liste (voir Figure 5.9) :
ul.toc {position: relative;}
ul.toc li a i {display: none;}
ul.toc li a:hover i {display: block; width: 6em;
position: absolute; top: 100%; right: 0;
margin: 1em 0 0 1em; padding: 1em;
background: #CDE; border: 1px solid gray;}
Figure 5.9 : Du texte dans une fenêtre pop-up sous les liens.
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 147
01/06/2011 14:12:11
148
CSS – Techniques professionnelles pour une mise en page moderne
En développant cette technique, nous sommes en mesure de créer des menus imbriqués sur
plusieurs niveaux, ce qui constitue l’objet de la section suivante.
Menus en CSS
Si vous le souhaitez, vous pouvez exploiter le principe des fenêtres pop-up CSS pour créer des
menus contextuels imbriqués sur plusieurs niveaux (personnellement, je n’aime pas les menus
contextuels, mais je n’aime pas non plus le chocolat, le café, les boissons pétillantes ou n’importe
quelle forme d’alcool, alors, mon avis compte peu). Cette technique précise a le grand avantage
de montrer que les effets de survol ne sont pas l’apanage des liens hypertextes.
Voici le balisage de référence, avec des URL simplifiées pour faciliter la lecture (voir Figure 5.10) :
<ul class="menu">
<li class="sub"><a href="/s1/">Section 1</a>
<ul>
<li><a href="/s1/ss1/">Sous-section 1</a></li>
<li><a href="/s1/ss2/">Sous-section 2</a></li>
<li><a href="/s1/ss3/">Sous-section 3</a></li>
</ul>
</li>
<li class="sub"><a href="/s2/">Section 2</a>
<ul>
<li><a href="/s2/ss1/">Sous-section 1</a></li>
<li><a href="/s2/ss2/">Sous-section 2</a></li>
</ul>
</li>
(…etc…)
</ul>
Figure 5.10 : Les sous-menus révélés.
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 148
01/06/2011 14:12:11
Effets
Chapitre 5 149
Jusque-là, tout est normal. Masquons à présent les sous-menus :
li.sub ul {display: none;}
Il nous faut évidemment un moyen de les réafficher. Voici la solution la plus simple et, tout au
moins visuellement, satisfaisante :
li.sub:hover > ul {display: block;}
Elle déclenche l’affichage des sous-menus à leur place, en repoussant tous les éléments qui suivent vers le bas. Grâce à un positionnement, vous pouvez les faire apparaître juste à côté de
l’élément parent (voir Figure 5.11), sans qu’ils interviennent sur la mise en page de la suite du
document :
li.sub {position: relative;}
li.sub:hover > ul {display: block; position: absolute; top: 0; left: 100%;
margin: 0; background: white;}
Figure 5.11 : Le menu contextuel.
Le nombre de niveaux de menus imbriqués n’est pas limité. Si vous le souhaitez, vous pouvez en
créer dix-sept. Vous devriez probablement avoir honte d’un tel désir, mais vous pouvez néanmoins le satisfaire.
Quant à l’emplacement des menus, vous êtes limité uniquement par les deux dimensions de la
page et par votre imagination. Vous pouvez placer les menus de premier niveau en travers de la
partie supérieure de la page, avec les sous-menus de premier niveau placés en dessous (voir
Figure 5.12), et les menus des niveaux suivants apparaissant à côté. Il s’agit simplement d’écrire
les règles CSS appropriées. Vous pouvez commencer avec les suivantes :
ul.menu > li {display: inline; position: relative;}
ul.menu ul {display: none;}
ul.menu li.sub:hover > ul {display: block; position: absolute; white-space:
nowrap;}
ul.menu > li.sub:hover > ul {top: 100%; left: 0;}
ul.menu ul li.sub:hover > ul {top: 0; left: 100%;}
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 149
01/06/2011 14:12:11
150
CSS – Techniques professionnelles pour une mise en page moderne
Figure 5.12 : Menus déroulants.
Dans ce cas, seuls les menus de premier niveau sont déroulants. Les suivants se placent à droite
de leur parent.
Technique de boxpunching
Vous voudrez parfois apporter une certaine fantaisie à la page. La technique de boxpunching,
qui consiste à retirer de la vue certaines parties d’une boîte, pourra vous y aider. Elle fonctionne
uniquement avec des arrière-plans de couleur unie ou des images d’arrière-plan fixes, mais elle
ouvre la porte à de nombreuses possibilités.
Sous sa forme la plus simple, le boxpunching consiste à placer une boîte dans l’angle d’une autre
(voir Figure 5.13), en faisant en sorte que son arrière-plan corresponde au contenu englobant,
non à celui du parent :
body {background: #C0FFEE;}
div.main {background: #BAD;}
.punch {background: #C0FFEE; font-size: 500%;
float: left; margin: 0 0.1em 0.1em 0; padding: 0.1em;}
<div class="main">
<h1 class="punch">Hi.</h1>
(…contenu…)
</div>
Dans une utilisation plus complexe, vous pouvez appliquer un arrière-plan à la boîte décalée et
ajouter une bordure épaisse pour la séparer du reste de la boîte (voir Figure 5.14) :
body {background: #C0FFEE;}
div.main {background: #BAD;}
.punch {background: #987; font-size: 500%;
float: left; margin: 0 0.1em 0.1em 0; padding: 0.1em;
border: 0.2em solid #C0FFEE; border-width: 0 0.2em 0.2em 0;}
© 2011 Pearson Education France – CSS – Eric A. Meyer
Livre 1.indb 150
01/06/2011 14:12:12