Sommaire
Dans ce tuto, je vous donnerais le code CSS et xHTML pour faire des choses que l'on fait normalement en JavaScript, comme des menus déroulants ou des lightbox.
J'ai indiqué la compatibilité suivant les navigateurs. Les versions testés sont : Firefox 4.0/3.6, Internet Explorer 9,8, Opera 11.10, Safari 4, Chrome 10 ainsi que Konqueror 4.2.2.
Ce que cette page est censé apporter, ce sont des bouts de codes, quelques explications ainsi que des exemples à chaque fois.
Sauf mention contraire, les astuces visibles ici ne font appel qu'à du CSS. Aucun code JavaScript, ni d'images animés ou autres ne sont nescéssaires.
Compatibilité :
Les menus sont souvent faits avec des listes <ul>, <li>. Ici je ferais de même.
On fait une liste ou chaque <li> contient lui même une liste. La liste extérieur contiendra les liens à survoller, et les listes intérieurs seront la partie qui se déroule :
Grace à des float: left; et une largeure fixe on placera les élements de la liste principale les un à coté des autres. On supprime aussi les puces et on le met en position absolue pour que le déroulement des listes se fasse par dessus le reste du texte (c'est obligatoire).
ul.menu { list-style-type: none; position: absolute; } ul.menu > li { float: left; width: 80px; border: 1px black solid; }
Ensuite, on va cacher les sous listes, et à l'aide d'un hover, on les affiche uniquement quand ils sont survolés.
ul.menu > li { float: left; width: 80px; height: 30px; overflow: hidden; } ul.menu > li:hover { height: auto; }
Finalement, il ne suffit que de rajouter une bordure et un fond aux éléments de listes et une petite marge pour les séparrer. On obtient finalement :
Voilà. Normalement vous savez comment ça marche. Il vous suffit d'arange tout ça comme bon vous semble avec des décorations en tout genre.
Le menu du la page d'accueil utilise exactement ce principe
D'autres exemples :
Compatibilité :
(IE 8,9)
Dans le principe, c'est vraiment très simple : une section div avec une image dedans.
L'image est affiché en petit sur le page : il aura 100% de la taille d'un petit div :
div.popup { height: 140px; width: 120px; } div.popup > img { height: 100%; width: 100%; }
Et ce n'est que lorsque l'on maintient le clic (avec la pseudo-classe "active") sur l'image que l'on l'affiche en grand (taille auto).
Pour éviter que la page se déforme, on place l'image en "relative" :
div.popup > img:active { height: auto; width: auto; position: relative; }
En ajoutant un peu de styles là dessus, comme une bordure sur l'image, et un curseur de souris incitant au clic (la petite main), on arrive à ça :
Compatibilité :
(3+) (10) (IE 9 seulement)
RGBA signifie Red, Green, Blue, Alpha. Où "Alpha" singifie le canal de la transparence.
En Css3, la nouvelle propriété rgba(xxx, xxx, xxx, .x) permet, comme vous le devinez, d'utiliser directement la transparence.
Cette solution marche avec la plupart des navigateurs. Le problème c'est que si vous affichez votre page dans un navigateur qui ne prend pas, le rgba() sera ignoré ! Transparence totale donc. On doit donc mettre deux fonds :
background-color: rgba(255,255,0,0.5)!important; background-color: rgb(255,250,0);
Cela forcera le navigateur à utiliser le alpha si possible, sinon il utilisera la couleur sans transparence.
Compatibilité :
Cette technique compliquée permet à IE de surporter les fonds transparents. L'inconvénient, c'est qu'il faut intervenir sur le HTML.
On crée un premier <div> contenant le texte. Au début de ce <div> on va placer un autre <div> qui sara vide :
C'est le div vide qui est important ici : c'est lui à qui on donnera la couleur de fond et l'opacité :
div.transparent { background-color: #00f; filter:alpha(opacity=40); }
Le div est vide. On va l'étirer à la taille du div conteneur, et on va le placer derière, avec un z-index et un positionnement absolu. Il sera nescéssaire de placer le div conteneur en relative avec un z-index supérieur.
Au final : le texte ne sera pas transparent, mais la couleur de fond sera semi-transparente (elle est assurée par le div placé dérière) :
div.transparent { position: absolute; z-index: -1; top: 0; right: 0; bottom: 0; left: 0; }
En fait, c'est tout !
Ça marche comme ça.
Je vous donne le code CSS en entier :
Pour les puristes, sachez que la propriété "filter:alpha()" n'est pas officielle mais qu'elle est propre à IE.
Si vous voulez, la propriété CSS3 "opacity" est officielle, déjà suportée par tous les bon navigateurs et est officielle :
filter:alpha(opacity=40);par
opacity: 0.4;
Utiliser une image semi transparente pour image de fond. (comme si personne n'y avait pensé :D)
Compatibilité :
Je ne sait pas si le titre de ce paragraphe est assez clair, donc je vous propose directement mon exemple pour comprendre de quoi je parle.
En fait, si on a une image ronde, on voudrait que le texte entoure l'image de façon circulaire, et non carrée. Cette astuce simplissime permet cela.
Principe : il suffit de découper l'image en plusieurs parties et de les recoller manuellement.
Chaque morceau d'image à donc une largeur différente qui fait que le texte s'adaptera à chaque image et non à l'image de départ.
Le code est super simple : il suffit de mettre chaque image en float d'un coté et de leurs donner une marge nulle en haut et en bas :
Un autre exemple ici.
Compatibilité :
Inspiré de commentcamarche.net/[…]popup-en-css-sans-javascript
On fait deux <span> l'un dans l'autre. Celui à l'intérieur ne sera affiché que lorsque le souris passe au dessus de celui qui la contient :
Le span intérieur est caché. Il n'est visible que lors du hover sur le span extérieur :
.bulle span { display: none; } .bulle:hover span { display: block; }
On a dores et déjà l'effet du hover.
Il suffit de mettre le span caché en position absolue lors du survol et on le décore un peu avec un fond coloré.
Le span extérieur sera aussi mis en positionnement relative, pour permettre à la bulle de se placer au bon endroit.
span.bulle { position: relative; } span.bulle:hover span { left: 0px; display: block; position: absolute; border: 1px black solid; background-color: teal; }
Au final, on ajoute le petit curseur et voilà le code complet :
Évidement, si c'est pour faire ça, autant utiliser l'attribut "title", qui fait le même chose.
Mais le popup que j'ai fait ici est autrement plus personalisable, et ont peut faire ce que l'on veut :comme ici.
Alors celle là… Un vrai casse tête !
Ce ne sont pourtant pas les techniques qui manquent, mais chacune d'elles ont des avantages et des inconvénients. À ce jour, seule l'utilisation d'un tableau permet d'avoir un design hautement personnalisable et très bien supporté par les navigateurs. Mais… Les tableaux ne sont pas recommandés par le W3C pour le design.
Voici donc plusieurs alternatives :
Compatibilité :
Principe. Cette technique est connue : on met la petit colonne en flottant à gauche, sans bordure, largeur fixe.
On ajoute une colonne de droite à largeur variable avec une marge à gauche de la taille de la petite colonne.
Ensuite, on met le tout dans une autre boîte <div> (elle contient donc la colonne et la partie principale). Cette boite aura une image de fond, mais seulement sur le coté gauche !et c'est cette image qui simulera le fond et la décoration de la petite colonne.
Pourquoi ça marche ?Cette astuce marche car on applique une image de fond au <div> contenant les deux colonnes. Or, ce <div> là prendra toujours la hauteur de la colonne la plus grande (à condition de mettre un petit <br/> avec un clear: right; à cause de la colonne flottante). Or n'est-ce pas ce que nous voulons ?
Le code, je ne le donnerais pas ici, cette astuce est si connue que le web regorge de tutoriels pour celle là. De même que d'exemples.
Compatibilité :
(IE toutes versions)
Principe : cette technique est directement inspirée de http://woorkup.com/[…]height-columns/. Elle utilise la bordure de la grande colonne comme fond de la petite. Pas besoin d'image. Il faut mettre le fond de la petite colonne de la même couleur que le bord de la grande. Le bord de la grande est de même dimension que la largeur de la petite colonne.
Le code est fourni sur le lien, mais je la remet ici, en entier :
(ici la colonne de gauche n'a pas exactement la même largeur que la bordure car il faut compter en plus les marges (margin & padding))
<div class="conteneur"> <div class="principal"> Contenu de la partie principale. </div> <div class="colonne_gauche"> la colonne de gauche. </div> </div>Code : CSS
.conteneur { margin: 0 auto; width: 600px; text-align: justify; } .colonne_gauche { background-color: white; margin-right: 400px; position: absolute; width: 180px; padding: 10px; } .principal { border-left: solid 200px white; position: absolute; width: 400px; padding: 10px; }
Compatibilité :
(IE 8,9 seulement)
Principe :On sait que les tableaux permettent une personnalisation très puissante et ont justement des colonnes de même hauteurs. Cependant, le W3C préfère qu'on ne les utilise pas pour la mise en page.
Bon, ils ne veulent pas de tableau en html ? Très bien : fessons-les en CSS !
On utilise des <div> : un que l'on transformera en tableau et les autres en cellules du tableau à l'aide des display: table et display: table-cell. Ça peut paraître minable comme solution, mais elle existe.
Compatibilité :
Principe : On utilise, un positionnement absolu pour la petite colonne, et une marge sur le côté pour la grande. Le tout est placé dans une <div> afin que le haut des deux soit commune. La suite ? Étirer la colonne la plus petite jusqu'en bas graçe à un bottom: 0; top: 0;. La colonne possède également une largeur fixe.
<div class="conteneur"> <div class="colonne_gauche"> la colonne de gauche. </div> <div class="principal"> la partie principale. </div> </div>Code : CSS
.conteneur { position: relative; } .colonne_gauche { position: absolute; top: 0px; bottom: 0px; width: 200px; } .principal { position: relative; margin-left: 220px; }
Compatibilité :
(IE 8,9)
Principe : On utilise une double bordure : l'une formée par la propriété border, et l'autre par la propriété mal connue “outline”. Cette dernière permet d'afficher une bordure supplémentaire à l'élément.
Attention, si vous utilisez une bordure arrondie, il faut aussi mettre l'outline en arrondi. Pour le moment, seul Firefox permet cela. Il suffit d'utiliser -moz-border-radius: 15px;, et -moz-outline-radius: 17px; pour arrondir le “outline”.
On pourra remarquer que j'ai mis 17px pour l'outline, et non 15. Pour un effet optimal, la rayon de l'outline doit être égale au rayon du border + 2 × l'épaisseur du bordure (ceci afin de compenser le fait que l'outline doit entourer 2px de plus : ceux de la bordure !)
Compatibilité :
(IE 8,9 seulement)
Un titre pour ses paragraphes, c'est simple à faire, il existe les balises <h1>, <h2> jusqu'à <h6> exprès pour cela. Mais comment les numéroter sans avoir à écrire les chiffres à la main ?
Je vais vous montrer une astuce très peu connue mais qui existe ! Elle est facilement compréhensible.
Le CSS permet d'appliquer un compteur sur chaque élément. Chaque fois que l'élément apparaître à l'écran, le compteur s'incrémentera. La valeur de compteur peut ensuite être affichée à l'écran si on le veux. Nous placerons ce numéro devant chaque titre. Ainsi, votre numérotation sera faite de manière automatique !
Les compteurs sont nommés comme on veut. Je les ait nommé count0 et count1. Voici le code expliqué rapidement ligne par ligne :
On peut mettre autant de compteurs que l'on veut. Il suffit de ne pas se perdre. Mieux : on peut même faire des listes comme « II.A.1 » en mettant tous les niveaus des puces en même temps. Par exemple, voilà le CSS et un exemple (même HTML que ci dessus)
Je vous ai dit que l'on mettait ce que l'on voulait dans content() : on peut très bien mettre les deux compteurs.
Compatibilité :
(IE 9 seulement)
Faire une light box pour ses images, c'est beau, c'est class. En général, on fait ça en JavaScript, mais celle-ci fait tout en HTML/CSS et très simplement. Elle utilise la pseudo-class peu connue ":target". (je sais pas si c'est CSS2.1 ou 3).
Principe : Pour faire des ancres (des liens internes à une page) on peut utiliser l'attribut ID qui sert de cible à l'ancre. Ainsi, un lien du genre "#chap1" vous enverra directement sur l'élément de la page portant l'id "chap1".
Lorsque l'on se trouve sur cet élément (après avoir cliqué sur l'ancre), l'élément en question est dit "la cible". Or, cette situation correspond à la pseudo class "target". (le CSS avec le ":target" ne sera effectif que lorsque l'élément en question est la clible.)
Pour la light box :
On créera un lien-image qui pointera sur une ancre. Nous allons masquer cette cible (display: none;), et ne l'afficher en avant plan, centré et fixe que lorsqu'il est ciblé (avec ":target").
La cible ne sera donc affiché que quand on clic sur le lien. Pour revenir et fermer la light-box, on mettre dans la cible un lien qui nous fera revenir à une ancre0. L'ancre 1 ne sera alors plus la cible, donc elle redeviendra invisible, et l'ancre 0 nous fera revenir à la galerie d'image.
La principe est compliqué, mais le code est super simple :
Compatibilité :
(IE 9 seulement)
Principe : il s'agit d'utiliser la technique ci-dessus : avec des :target.
On met un lien : pointant vers l'ancre #id. Quand on clic dessus, le #id est ciblé : on utiliser un height:auto; et un height:0; s'il n'est pas ciblé. On prend soin d'ajouter un lien retour, pour décibler le #id et le cacher à nouveau.
On applique ce système également aux deux liens (cacher/afficher) afin de n'afficher que celui qui nous faut.
Ci dessous, l'élément ciblé est le #container. L'élément qui devient spoiler, c'est le #content
Il est possible (et recommandé, si vous ne voulez pas d'un truc trop moche) d'améliorrer tout ça. Notamment avec des CSS3 tel que la transition, puisqu'il y'a une variation de la hauteur.
L'exemple ci dessous présente deux spoilers : un simple et l'autre amélioré (transition pour la hauteur ; gradient pour les liens).
Inconvéniant : il n'est pas possible d'ouvrir deux spoilers à la fois.
Compatibilité :
Pour centrer un élement horizontalement, on lui donne une largeur fixe, et une marge extérieure "automatique" sur les cotés. Le navigateur fera en sorte que les marges sur les cotés seront de même taille, donc de façon à center l'élément.
Pour le centrage vertical, c'est une autre histoire. Biensûr, on connait la propriété vertical-align, mais elle ne marche pas pour centrer par exemple un dans un autre >div< (elle ne marche que dans les tableaux et dans les éléments de type inline quand une hauteur de ligne est déclarée).
Alors comment faire ?
Ce que l'on veut, c'est centrer un bloc, par exemple un >div<. Pour être plus précis, on veut que le point central du bloc (l'intersection des diagonales) soit au milieu de la fenêtre du navigateur.
Or, ce que l'on fait quand on met un margin: 50% auto auto 50%;, c'est placer le coin supérieur du bloc au centre de la page :
Maintenant, observez le point central du bloc bleu : la distance centre-du-bloc-blue / centre-de-la-page est exactement égale à la moitié du bloc bleu :
Alors ?
Alors on va mettre une marge négative au bloc bleu : une marge en haut et à gauche qui vaut exactement la moitié de la taille du bloc bleu :
En terme de code, c'est très simple :
D'autres techniques (plus propres) sont montrés ici : www.alsacreations.com/xmedia/tuto/exemples/vertical/demos.html
Compatibilité :
Cet astuce vous permet de mettre votre adresse E-mail dans une page web sans risquer de vous faire spammer !
J'ai trouvé les deux premières techniques sur la page http://techblog.tilllate.com/[…]-compared/. Il y en a deux en CSS.
Celle-ci est super simple : par exemple on écrit « ruojnoB » et ça affiche « Bonjour ». En CSS on peut inverser l'ordre des lettres : à l'écran, le texte sera visible correctement, mais un robot ne verra que le texte à l'envers.
<span class="inverse"> ruojnoB </span>Code : CSS
span.inverse { unicode-bidi: bidi-override; direction: rtl; }
Le fait d'avoir écrit « ruojnoB » permettra de voir « Bonjour » à l'écran. En revanche, un robot qui explore le code source ne verra que le texte à l'envers. Si l'on applique cela à une adresse E-mail, le robot ne trouvera pas votre adresse et vous ne risquez absolument rien !
Simple aussi : on écrit le début de notre adresse Mail, on insère quelques lettres bidons puis la fin de l'adresse. En CSS, on cache le texte bidon, fessant en sorte de n'afficher que notre adresse, qui, encore une fois ne se retrouve jamais tel quel dans le code source.
toto<span class="cache">NonNonNon</span>@crétin.orgCode : CSS
span.cache { display: none; }
Ici le texte à l'intérieur du span n'est pas affiché à l'écran, il sert juste à scinder notre E-mail en deux, pour qu'il ne soit pas affiché en clair dans le code source !
Compatibilité :
(IE 8,9 uniquement)
Il s'agit ici d'afficher le code, pas en html mais en CSS à l'aide de la propriété “content”.
Dans le HTML, on ouvre un <span>, on met un arobase dedans et en CSS, à l'aide des pseudo classes :before et :after on affiche ce qui manque :
<span class="mail">@</span>Code : CSS
span.at:before { content: "timovneerden"; } span.at:after { content: "gmail.com"; }
Voici des liens utiles quand on fait des CSS : le validateur CSS du W3C, ou des sites d'apprentissage comme Alsa Creations. Mais surtout, voici tout un tas de liens avec des effets plus ou moins beaux :
Page créée en septemble 2009
Mis à jour le jeudi 7 avril 2011.
Icônes des navigateurs de Morcha