8 techniques CSS


« Faire ça en Javascript, c'est bien ; le faire en CSS, c'est de l'Art ! »

On m'a dit ça une fois, je crois que c'était Rochdi…

Sommaire

  1. Le menu déroulant (voir)
  2. Image pop-up pour zoomer sur une image (voir)
  3. Les blocs transparents (arrière plan transparent) (voir ici & )
  4. Une image entourée de texte. (voir)
  5. Une bulle popup tout en CSS (voir ici & )
  6. Les colonnes de même hauteur (voir ici, et )
  7. Créer une double bordure. (voir ici)
  8. Des titres numérotés de manière automatiques (ici et )
  9. Astuce Bonus : un antispam ! (voir ici & )
  10. Quelques liens avec des trucs en CSS assez incroyables…

Sommaire

Dans ce tuto, je vous donnerais le code CSS et xHTML pour faire des choses que l'on fait normalement en JavaScript par exemple.
Si vous voyez des des effets étranges sur ce site, vous les retrouverez ici.

Je précise que la plus part du temps, je n'ai rien inventé. Je me suis inspiré de choses déjà existantes et je mettrait mes sources, cependant, j'ai amélioré à ma guise le code.

J'ai indiqué la compatibilité suivant les navigateurs. Les versions testés sont : Firefox 3 & 3.5, Internet Explorer 8,7 Opera 10, Safari 4, Chrome 3.

Permettez moi de vous donner deux fichiers PDF qui sont pour moi les couteaux-suisses du codeur HTML/CSS : Ils montrent en une page la quasi-totalité des codes HTML et CSS2 :
PDF sur le HTML (archive zip : 1.8Mio)
PDF sur les CSS (fichier pdf : 42Kio)

Pourquoi faire ça en CSS alors que l'on peut le faire en JavaScript ? En clair : pourquoi faire simple quand on peut faire compliqué ?

J'ai récemment lu une réponse à certaines de ces astuces qui disait « le css sert avant tout au design, pour le reste il faut prendre les JavaScript. » Je suis d'accord mais, tout comme une grande partie des internautes bloquent les fenêtres intempestives ou les publicités (Adblock, dans Firefox par exemple), beaucoup bloquent les scripts. Dont les JavaScript.

Pour vous donner une idée, les deux extensions les plus utilisées pour Firefox sont Adblock Plus (pour effacer les pub) et no-scripts (qui bloque les scripts). Si les scripts sont bloqués, plus de JavaScript. Les CSS peuvent se désactiver (désactivation des styles), mais ça ne sert à rien (sauf éventuellement les personnes malvoyantes). Les CSS ne sont pas dangereux : les CSS ne peuvent pas êtres des codes malveillants.

Voilà pourquoi je préfère utiliser les CSS plutôt que du JavaScript. En plus, c'est plus classe :-)

Ce que cette page est censé apporter, ce sont des bouts de codes, quelques explications ainsi que des exemples à chaque fois.

Sommaire


Mon menu est inspiré de : cette page ; cela dit… Désormais je fais mes menus déroulants sans aide.

Compatibilité :
firefoxsafarichromeoperaie

Principe : on utilise une liste <ul> dont les éléments <li> seront placés horizontalement les un à coté des autres grâce à la propriété float. Les <li> sont affichés en block (display: block) et avec une largeur fixe.
On ajoute ensuite les sous menus (les sous listes) dans chaque <li> du menu.

Ces sous-listes, pour n'êtres visible que lors du passage de la souris seront caché : l'élément conteneur, le <li> du menu aura une hauteur défini et on cache se qui dépasse (overflow: hidden). On utilisera ensuite le pseudo-classe :hover sur les <li> de la liste principal auquel on applique une hauteur automatique height: auto.

Code HTML <ul class="menu">
   <li><a href="#">un</a>
      <ul>
         <li><a href="#">1.un</a></li>
         <li><a href="#">1.deux</a></li>
         <li><a href="#">1.trois</a></li>
         <li><a href="#">1.quatre</a></li>
      </ul>
   </li>
   <li><a href="#">deux</a>
      <ul>
         <li><a href="#">2.un</a></li>
   <li><a href="#">2.deux</a></li>
         <li><a href="#">2.trois</a></li>
         <li><a href="#">2.quatre</a></li>
      </ul>
   </li>
   <li><a href="#">trois</a>       <ul>
         <li><a href="#">3.un</a></li>
         <li><a href="#">3.deux</a></li>
         <li><a href="#">3.trois</a></li>
         <li><a href="#">3.quatre</a></li>
      </ul>
   </li>
   <li><a href="#">quatre</a>       <ul>
         <li><a href="#">4.un</a></li>
         <li><a href="#">4.deux</a></li>
         <li><a href="#">4.trois</a></li>
         <li><a href="#">4.quatre</a></li>
      </ul>
   </li>
</ul>
Code CSS ul.menu {
   list-style-type: none;
   text-align: center;
   position: absolute;
   }
ul.menu ul {
   list-style-type: none;
   text-align: left;
   }
ul.menu > li {
   float: left;
   width: 80px;
   border: 1px black solid;
   margin: 1px;
   height: 30px;
   overflow: hidden;
   background-color: #faa;
   }
ul.menu > li:hover {
   height: auto;
   }
ul.menu ul li {
   margin-left: -20px; /*On corrige un décalage de la liste intérieure*/
   }

Essayer

J'ai utilisé un positionnement “absolute” pour que le déroulement du menu se fasse par dessus le reste de la page, sinon, il repousse le reste du document.
Il faut en tenir compte dans le placement du reste de la page !


Sommaire


Compatibilité :
firefoxsafarichromeoperaIE (IE 8 seulement)

Ce popup de zoom fonctionne aussi avec IE7 si on remplace active par hover.

Principe : mon popup est tout bête : on affiche l'image en petit (taille fixe), et lorsque l'on maintient le clic dessus, on l'affiche en grand (taille auto).
Pour éviter que toute page se déforme, il est nécessaire aussi de créer un <div> contenant l'image, ayant les dimensions de l'image en petit. Ce <div> sera en positionnement relatif, tout comme l'image devra l'être lors du maintient du clic :

Code HTML <div class="popup">
   <img src="mon_image" alt="texte_alternatif" title="Cliquez pour voir en grand !" />
</div>
Code CSS div.popup {
   height: 140px;
   width: 120px;
   }
div.popup > img {
   height: 100%;
   width: 100%;
   cursor: pointer;
   }
div.popup > img:active {
   height: auto;
   width: auto;
   position: relative;
   border: black solid 1px;
   }

Essayer

  • J'ai utilisé la pseudo-classe active : elle correspond au maintient du clic ; autrement dit une action de la part de l'utilisateur. On peut aussi mettre simplement un hover, ainsi l'utilisateur n'a qu'à passer la souris dessus pour voir en grand, mais, cela devient très vite gênant dans le cas où nous ne voulons pas voir l'image en grand…

  • Notez aussi que l'image n'est (avec ce code) pas affichable via la navigation au clavier.

  • Enfin, la taille réduite de l'image est celle donnée au <div>. Il faut faire en sorte que les dimensions réduites soient à l'échelle.
Si vous utiliser une très grande image, vous devez faire attention à 2 chose :
  • Si votre image est trop grande, il n'est pas possible de la déplacer, et l'image peut ne pas tenir sur toute la largeur de l'écran… Tout le monde n'a pas un écran 30 pouces en résolution élevé (surtout avec la prolifération des mini-portables !).
    (une solution : mettre la pseudo-classe ”focus” et une image agrandie de taille fixe au lieu du “100%”. On rajoute ensuite simplement un overflow: scroll sur l'image avec le focus. Cette technique ne marche pas dans tous les navigateurs et demande un clic pour dézoomer.)

  • Une image énorme signifie aussi une image très lourde. Ici, l'image grande et l'image en petit sont une seule et unique image. Si elle fait 3Mo, la miniature aussi ! Dans ces cas là, mieux faut opter pour créer une miniature avec un lien vers l'image en grand ! (Tout le monde n'a pas non plus de fibre optique à 100MB/s.
Voir cette astuce pour une solution stylée (en flash) pour des images de très grande taille.

Sommaire


le fond transparent

Solution Css3 : RGBA

Compatibilité :
safarifirefox (3+) chromeopera (10) not IE

Rien de plus simple. En Css3, la nouvelle propriété rgba(xxx, xxx, xxx, .x) permet d'utiliser directement la transparence.

RGBA signifie Red, Green, Blue, Alpha. (Rouge, Vert, Bleu, Alpha)

Cette solution marche avec la plupart des navigateurs à jours (sauf IE, évidement). Le problème c'est que si vous affichez votre page dans une autre navigateur, le rgba() sera ignoré ! Transparence totale donc. On doit donc mettre deux fonds : une pour les navigateurs compatibles que le navigateur en priorité et une autre utilisée le cas échéant.

Code CSS 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.


Utiliser l'opacité.

Cette technique compliquée ajoute le navigateur Opera 9.x à la liste des navigateurs compatibles. L'inconvénient, c'est qu'il faut intervenir sur le HTML (ajout d'un <div> vide).

La transparence RGBA est une fonction permettant d'ajouter une composante sur la couleur.
L'opacité joue sur la transparence de tout l'élément (le <div> et son contenu).

Il est important de bien faire la différence.

Cette technique est directement inspirée de : http://www.hedgerwow.com/360/dhtml/css-opacity-inherit.html, je ne fais ici que l'explication, quelque peu sogrenue….

Compatibilité :
safarifirefoxchromeoperanot IE

Principe :On crée un premier <div> contenant le texte mais sans couleur de fond. Au début de ce <div> on va en placer un autre que l'on fermera tout de suite. C'est lui que l'on va étirer au bord du premier et via un z-index: -1, on le placera en arrière du texte et on lui donnera une couleur de fond, ainsi que l'opacité réduite.
De cette manière, le <div> semi-opaque sera sous le <div> contenant le texte : au final, on aura l'impression d'avoir un seul <div< avec un fond transparent comme s'il s'agissait du RGBA.

Question : pourquoi ne pas appliquer la propriété opacity directement au premier div ?
Réponse : si on fait ça, le div sera bien transparent, mais son contenu (texte, images…) aussi !! Pour lire, ce n'est pas vraiment le mieux.

Voici un exemple pour vous aider à comprendre.

Vous voyez que l'opacité appliquée directement au conteneur du texte n'est pas l'idéal, d'où le fait de passer par un autre “div” placée derrière.
Code HTML <div class="main">
   <div class="transparent"></div>
       <<  Votre contenu (texte, image…) içi  >>
</div>
Code CSS div.main {
   position: relative;
   z-index: 10;
   }
div.transparent {
   position: absolute;
   z-index: -1;
   background-color: #00f;
   opacity: 0.3;
   top: 0;
   right: 0;
   bottom: 0;
   left: 0;
   }

Essayer

Sommaire


Solution pour IE

Compatibilité :
IE Cette technique marche pour IE 7 & 8.

IE ne reconnais pas la propriété opacity. Elle connais cependant une propriétée non officiel qui fait le même effet : filter:alpha().
Cette propriété marche comme la technique de l'opacité (on doit créer un <div> supplémentaire).
Pour l'utiliser, c'est très simple : remplacez simplement

Code CSS    opacity: 0.4;

par

Code CSS    filter: alpha(opacity=40);
Merci à Fayçal qui m'a signalé que cette propriété filter:alpha() marchait aussi dans les autres navigateurs. Même si elle n'est pas officielle, elle serait surement préférable à opacity: 0.x… Pour l'instant :-)

Solution simple pour tous

Utiliser une image semi transparente pour image de fond. (comme si personne n'y avait pensé :D)


Une image entourée de texte

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.

Compatibilité :
firefoxsafarichromeoperaIE (IE toutes versions)

Principe : on a une grande image et que l'on veut que le texte entoure bien l'image : 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 :
Il faut cependant réduire la largeur de l'image en retirant les « blancs » inutiles.

Code HTML <img src="image_part1.png" class="coupe" alt="image"/>
<img src="image_part2.png" class="coupe" alt="image"/>
<img src="image_part3.png" class="coupe" alt="image"/>
<img src="image_part4.png" class="coupe" alt="image"/>
<img src="image_part5.png" class="coupe" alt="image"/>
<img src="image_part6.png" class="coupe" alt="image"/>
Code CSS img.coupe {
   float: right;
   margin: 0 0 0 15px;
   clear: right;
   }

Essayer

Un autres exemple ici.

Sommaire


Inspiré de http://www.commentcamarche.net/faq/sujet-19477-popup-en-css-sans-javascript

Compatibilité :
firefoxsafarichromeoperaIE (IE 7, 8)

Principe : pour faire une bulle sur un texte ou autre, on connait la propriété HTML title. Le problème, c'est que cette bulle n'est absolument pas personnalisable.

Ce que l'on fait, c'est faire la même bulle, mais à l'aide d'un <span> qui lui est totalement personnalisable !

En fait, on crée deux <span> l'un dans l'autre. Celui à l'intérieur est caché via CSS. Lorsque l'on passe la souris au dessus du <span> extérieur, on affiche le <span> intérieur. Simple. Il faut juste appliquer les bon positionnements… et il fallait y penser !

Code HTML <span class="bulle"> Texte à survoler <span> Texte à afficher au survol </span></span>
Code CSS span.bulle {
   position: relative;
   z-index: 24;
   cursor: pointer;
   }
span.bulle:hover {
   z-index: 25;
   }
span.bulle span {
   display: none;
   }
span.bulle:hover span {
   left: 0px;
   width: 200px;
   display: block;
   position: absolute;
   border: 1px black solid;
   background-color: lightblue;
   }

Essayer

Évidement, nous avons là un popup très basique, mais on peut aller bien plus loin et ajouter couleurs, images et bordures. Les possibilités sont énormes et n'ont de limites que votre imagination. En attendant, voici ce que donne la mienne, d'imagination : exemple 9.

Sommaire


Les colonnes de même hauteur

Alors celle là… Un vrai casse tête !
On pourrait penser que mettre deux colonnes de hauteur identique est simple, mais il n'en est rien ! 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 :

Pour ce tuto, je part du principe que la petite colonne sera à gauche et que la partie principale de la page (la grande colonne) sera à droite.

Les colonnes factices

Compatibilité :
firefoxsafarichromeoperaie(IE toutes versions)

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 ?

L'avantage principal de cette astuce est qu'elle marche très bien, sur tous les navigateurs, et qu'elle est simple à comprendre.
Par contre, on doit utiliser une image. À cause de cette image, la taille de la colonne factice ne peut changer qu'en modifiant l'image elle même (à moins d'utiliser des CSS3, avec background-stretch, quelque chose comme ça)

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.

Sommaire


La colonne fait d'une bordure…

Compatibilité :
firefoxsafarichromeoperaie(IE toutes versions)

Principe : cette technique est directement inspirée de http://woorkup.com/2009/10/11/really-simple-css-trick-for-equal-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))

Code HTML <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;
   }

Essayer

Avantages : cela fonctionne avec toutes les navigateurs, il n'y a pas besoin d'image et surtout, la taille des colonnes peuvent varier : la colonne gauche aura toujours un fond quelque soit la hauteur de celle de droite.
Si l'on met une couleur de fond à la partie principale (comme sur l'exemple), et que la colonne gauche est plus grande, celle-ci n'aura pas la même hauteur ! (on résout cela en ajoutant un <div> entourant les deux colonnes avec un fond de même couleur que la grande colonne
La personnalisation reste assez limitée : on ne peut pas séparer les deux colonnes par un espace, ni leurs donner une bordure fine (comme sur la page d'accueille de ce site).

Sommaire


Simuler un tableau

Compatibilité :
firefoxsafarichromeoperaie(IE 8 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.

Code HTML <div class="conteneur">
   <div class="colonne_gauche">
       la colonne de gauche.
   </div>
   <div class="principal">
       la partie principale.
   </div>
</div>
Code CSS .conteneur {
   display: table;
   border-spacing: 10px;
   border: 1px black solid;
   margin: 10px;
   }
.collone_gauche {
   display: table-cell;
   border: 1px black solid;
   width: 180px;
   padding: 10px;
   }
.principal {
   display: table-cell;
   border: 1px black solid;
   padding: 10px;
   }

Essayer

L'avantage de cette solution : elle offre la puissance de personnalisation des tableaux, mais en restant conformes aux demandes du W3C (c'est tout de même un peu capilotracté (tiré par les cheveux) je pense…).
Inconvénient : pour Internet Explorer, seul IE 8 supporte cette fonction, les autres versions afficheront les <div> les uns sous les autres.

Sommaire


Étirer la plus petite colonne jusqu'en bas

Compatibilité :
firefoxsafarichromeoperaie

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.

Code HTML <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;
   }

Essayer

L'avantage : cette technique est simple est pas trop dure à mettre en place. Il ne faut juste pas oublier de mettre la grande colonne aussi en positionnement relatif, ainsi que le <div> conteneur de l'ensemble.

Cette technique, permet une très grande personnalisation aussi : couleurs, fond, bordures. Elle est utilisée sur la page de garde de ce site.
Attention ! Avec cette technique, c'est la petite colonne qui s'étire à la taille de la grande. Mais pas l'inverse. Si la colonne étirée est plus haute que la grande, elle dépassera !

Pour contrer cela, sur la page de garde de ce site par exemple, j'ai mis une hauteur minimale (min-height) à la grande colonne. Cette hauteur minimale est calculé en fonction de la hauteur minimale requise par la colonne de gauche, qui ne varie pas du tout sur ce site.

Sommaire


Créer une double bordure.

Compatibilité :
operasafarifirefoxchromeie (IE 8 seulement, mais absolument sans incidence pour IE6 & 7. Simplement de l'esthétique.)

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.

Code HTML <div class="entoure">
       Le contenu du <div> ici
</div>
Code CSS .entoure {
   border: 1px solid gray;
   outline: 1px solid silver;
   }

Essayer

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 mi 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 !)

Sommaire


Une astuce pour des titres numérotés.

Compatibilité :
operafirefoxiesafarichrome (IE 8 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 ?

Il est évidement possible de mettre directement les numéros dans le titre, en les tapant simplement au clavier, mais cela vous oblige à changer tous les titres une par un si un jour vous ajoutez un chapitre en plein milieu ! C'est pas très pratique…

Je vais vous montrer une astuce très peu connue mais qui existe ! Elle est un peu technique mais 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 placée devant chaque menu. Ainsi, votre numérotation sera faite de manière automatique !

Code HTML <h1>Chapitre</h1>
<h2>Chapitre</h2>
      […]
<h2>Chapitre</h2>
      […]
<h2>Chapitre</h2>
      […]
<h1>Chapitre</h1>
<h2>Chapitre</h2>
      […]
<h2>Chapitre</h2>
      […]

Et le CSS qui va avec :

Code CSS body {
   counter-reset: count0;
   }
h1:before {
   counter-increment: count0;
   content: counter(count0,upper-roman)" - ";
   }
h1 {
   counter-reset: count1;
   }
h2:before {
   counter-increment: count1;
   content:counter(count1) " - ";
   }

Essayer

Les compteurs sont nommés comme on veut. Je les ait nommé count0 et count1. Voici le code expliqué rapidement ligne par ligne :

  1. body : La mise à zéro du compteur initial. On l'applique à body car il faut une référence 0 pour toute la page.
  2. h1:before : on incrémente le compteur 0 (il gagnera 1 à chaque titre h1). Dans la propriété css content() on peut mettre ce qu'on veut. Ici, on mettre donc la valeur du compteur. Les nombres seront en chiffres romains majuscules (upper-roman
  3. h1 : le titre 1 est aussi le moment où il faut remettre le compteur des titres 2 à zéro.
  4. h2:before : on incrémente le compteur 2, et on le place devant.

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 ça dessus)

Code CSS body {
   counter-reset: count0;
   }
h1:before {
   counter-increment: count0;
   content: counter(count0,upper-roman)" - ";
   }
h1 {
   counter-reset: count1;
   }
h2:before {
   counter-increment: count1;
   content:counter(count0) ". " counter(count1) " - ";
   }

Essayer

Je vous ait dis que l'on mettais ce que l'on voulait dans content() : on peut très bien mettre les deux compteurs.

On peut voir très simplement si un code est généré en HTML ou CSS : en HTML, l'élément est selectionnable. Pas en CSS : pensez aux images de fond, un copier coller ne les prends pas en compte. De même pour les éléments des listes à puces… Et évidement nos nombres générés par les compteurs : ils ne sont pas sélectionnables non plus.

Essayer

Sommaire


Une image avec légendes

Sommaire


Centrer verticalment

Compatibilité :
operafirefoxiesafarichrome

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 :c'est le coin NO qui est centré !
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 : la distance entre les deux centres est égale à la moitié du bloc ! 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 : le bloc est centré !

En terme de code, c'est très simple :

Code HTML <div class="bloc">
       Contenu du bloc
</div>

Et le CSS qui va avec :

Code CSS .bloc {
   position: absolute;
   top: 50%;
   left: 50%;

   height: 256px;
   margin-top: -128px;

   width: 512px;
   margin-left: -256px;
   }

Essayer

Sommaire


Astuce bonus l'antispam

Compatibilité :
operafirefoxsafarichromeie (IE 6,7,8)

Cet astuce vous permet de mettre votre adresse E-mail dans une page web sans risquer de vous faire spammer ! En effet, il ne faut jamais poster votre E-mail dans une page web : les spammeurs fabriquent des logiciels qui cherchent tout ce qui ressemble à une adresse E-mail, et y envoient des tonnes de spam… ! On a différentes solutions contre ça :

J'ai trouvé ces techniques sur la page http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/. Il y en a deux en CSS. On les utilise séparément (d'après le test décrit dans le lien, elles sont toutes les deux très efficaces contre le spam). En bas de cette page, vous voyez mon E-mail. J'ai fusionné les deux solutions pour encore plus de sécurité (mais encore une fois, IE n'affiche pas ça correctement, et je dois mettre une solution de rechange pour lui. Je n'expliquerais ici que les méthodes séparés, si vous êtes curieux, regardez le code source de ma page :-)

Solution 1

Celle-ci est super simple : par exemple on écrit « ruojnoB » et ça affiche « Bonjour ». En CSS on peut inverser l'ordre des lettres.

Code HTML <span class="inverse"> ruojnoB </span>
Code CSS span.inverse {
   unicode-bidi: bidi-override;
   direction: rtl;
   }

Essayer

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 !

À aucun moment votre adresse mail ne se retrouve à l'endroit dans le code source !

Attention, si vous copiez-collez un texte inversé via CSS, il se retrouvera aussi inversé lorsque vous collez !!

Solution 2

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.

Code HTML toto<span class="cache">NonNonNon</span>@crétin.org
Code CSS span.cache {
   display: none;
   }

Essayer

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 !

Là encore, si vous copiez-collez ce texte la partie cachée sera affichée  Faites donc bien attention à ce que le visiteur de votre site n'envoie pas un mail à la « fausse » adresse !

On peut par exemple mettre un texte assez grand et le cacher, ainsi l'on se rendra compte que l'adresse n'est pas bonne…

Sommaire


Notes

Note de l'auteur
Il est possible de faire des choses très belles simplement en CSS (sans JavaScript). Parfois même très impressionnantes.

Cependant, le code peut ne pas être supporté par tous les navigateurs. Notamment IE.
Faites attention à ce que l'ajout d'une fonction n'entrave pas la navigation de votre site avec des navigateurs différents des vôtres. Mes pages sont fait avec Firefox, mais je m'assure quand même qu'ils sont navigables avec les autres.
Et ça ne compte pas seulement pour une fonction en CSS !

Sommaire

Quelques liens

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 :

CCL'ensemble de ce site est sous licence Creative Commons "Paternité".
moche le Spam!! (.liamg) Mort au sp@m!! ne riez pas. Vais pas prendre des pincettes, et le Spam, je vomi dessus.t    -   http://lehollandaisvolant.net/

Icônes des navigateurs de Morcha