Les deux pseudos classes :after et :before permettent de générer du contenu avant ou après le contenu d'un élément (et non pas avant ou après l'élément en lui même).
Elles s'utilisent toujours avec la propriété content, je ne vais pas détailler ici les différentes valeurs possibles pour cette propriété mais plutôt voir l'utilisation pratique que l'on pourra faire des deux pseudos classes.
Pour une liste de prix par exemple, au lieu de devoir à chaque fois indiquer la devise, on pourrait se contenter de ne donner que les chiffres et les faire suivre automatiquement par l'indication de devise.
Par exemple, pour un catalogue contenu dans un tableau, si tous les prix sont affichés dans la troisième colonne et dernière colonne, ajouter des guillemets dans les blocs de citation, ou encore simuler une bordure qui aura une taille indépendante de celle de l'élément :
td+td+td:after {
content: " euros";
}
cite:after {
content: open-quote;
}
cite:before {
content: close-quote;
}
Autre exemple, pour un pied de page présent sur tout le site, plutôt que le remettre à chaque page, il peut simplement être généré en css :
body:after {On peut ici placer du texte mais pas de contenu html avec des balises pour y mettre un lien par exemple.
content: "Tous droits réservés";
}
Un des reproches souvent fait au positionnement à l'aide de flottants et l'utilisation fréquente d'élément ayant la propriété clear:both qui permet de restaurer le flux (pour que la couleur de fond de l'élément parent soit prise en compte par exemple), celle-ci engendrant l'utilisation d'une balise superflue.
Dans certains cas, :after, permettra de générer ce clear:both automatiquement et garder ainsi un code non surchargé par des balises destinées uniquement à la mise en forme de la page. Ceci ne fonctionnera pas forcément pour chaque cas d'utilisation des flottants, mais pourra par exemple convenir pour le cas ou le clear:both intervient pour que la hauteur des blocs flottants soient prise en compte par leur élément conteneur.
Pour ce code par exemple :
#global {Le clear:both sert à rétablir le flux, afin que les hauteurs des deux autres div soient prises en compte et que la hauteur du cadre s'y adapte. Mais hormis pour la mise en page, cet élément div est totalement inutile et superflus dans la page.
background-color:#CC3399;
}
div.flottant {
width: 150px;
height: 100px;
float: left;
}
.....
<div id="global">
<div class="flottant">bloc flottant</div>
<div class="flottant">bloc flottant</div>
<div style="clear:both"></div>
</div>
Avec :after et pour un même résultat, on aura le code suivant :
#global {
border: 1px #9b9b9b solid;
}
#global:after {
content: "";
display: block;
clear: both;
}
#global div {
width: 150px;
height: 100px;
float: left;
border: 1px #c06 solid;
}
.....
<div id="global">
<div>bloc flottant</div>
<div>bloc flottant</div>
</div>
Pour faire un cadre arrondi à hauteur variable, il faut soit insérer des images directement dans le bloc, soit utiliser par exemple les balises dl/dt/dd, soit jouer sur des balises imbriquées.
Ici, on peut directement inclure les images à l'aide des css et en n'utilisant qu'une balise div unique :
#cadre:before {
content:url(haut.png);
}
#cadre:after {
content:url(bas.png);
}
#cadre {
background-color:#b9b9b9;
width:200px;
}
Attention, si l'on applique un padding au bloc cadre, alors les images seront elles aussi décalées par ce padding, pour repositionner les images on pourra alors user de marges négatives par exemple.
Il y a évidemment beaucoup d'autres utilisations pour :after et :before et internet explorer ne les interprète pas encore mais ces exemples donnent déjà un aperçu des possibilités offertes.
voir la page contenant les exemples
Mais où vas-tu chercher tout ça ???
Et hop, un billet bien mérité !
Superbe, bravo pour ces idées originales mais salvatrices !
J'ime particulièrement le coup du clear:both, très propre.
Travail très ingénieux, chapeau
Je me permettrais deux réserves :
Pour l'utilisation de :after pour le clear des flottants, voir le classique http://www.positioniseverything.net/easyclearing.html , qui pose bien les divers problèmes rencontrés dans IE Win et Mac.
Mais surtout, l'utilisation d'un contenu généré dans :before et :after doit se faire avec beaucoup de précautions : ce contenu n'existera que dans un navigateur graphique. L'exemple de l'unité de prix donné ci-dessus n'aura plus aucun sens dans un navigateur graphique avec CSS désactivé, dans un navigateur texte, dans une traduction automatisée de la page, aux yeux d'un moteur de recherche...
"Automatiser" un contenu répétitif peut se faire au niveau serveur de manière beaucoup plus satisfaisante pour l'interopérabilité et l'accessibilité.
Ah... J'oublais : il y a toujours des recoin des spécifications un peu poussiéreux qu'on ne visite pas assez : sur le problème du "clear", la spécification HTML4.01 contient une intéressante propriété obsolète de l'élément <br>, et surtout un exemple beaucoup plus amusant de ce qu'il convient de faire en CSS: http://www.w3.org/TR/html401/present/graphics.html#adef-clea... ... BR#mybr { clear: left }
Moi sur le coup de la balise superflu à ajouter pour le clear: both; et le fait qu'il faut en mettre partout, je suis pas d'accord, on a bien souvent un pied de page, à qui on peut appliquer le clear: both et ça roule, et je ne vois pas pourquoi il faudrait en mettre partout des clear: both; mes pages en flottant ne nécessitent pas de balise suplémentaire, et un seul clear: both; sur le footer est nécessaire.
Et avec ta technique (très bonne par ailleurs), tu te retrouveras avec une petite cata sous IE...
Pas tout à fait la cata sous IE, ElMoustiko : il arrive à celui-ci d'enfreindre quelques règles, et notamment celles sur la prise en compte de la hauteur des flottants dans la hauteur du conteneur (voir l'article mentionné dans mon commentaire précédent)
On en apprend tout les jours, merci pour l'indication Laurent.
Pratique aussi le after pour indiquer la langue d'un lien externe
J'utilise a:after dans les feuilles de style destinées à l'impression, pour donner avec un minimumu de formatage (entre des crochets par exemples) l'URL d'un lien.
C'est pratique quand je mets en ligne des cours comportant des hyperliens (normal
, et que je dois en donner une copie papier à mes étudiants.
L'utilisation de :before et :after couplé avec content est fortement déconseillée quand à générer du contenu textuel pour des raisons d'accessibilité. Les navigateurs type lynx ne supportant pas les css ou simplement qqun qui a désactivé les css perdera l'info fourni par le texte.
Pour l'utilisation de :after dans le clear l'utilisation optimal cross navigateur allez voir là: http://www.positioniseverything.net/easyclearing.html
Tes trouvailles sont très astucieuses, sous réserve d'avoir constamment présent à l'esprit un souci d'accessibilité et d'interopérabilité, comme l'explique Laurent.
Pour situer la ligne à ne pas franchir dans ce domaine, je visualise toujours mes pages sans aucune feuille de style. C'est l'épreuve de vérité. Je regarde si comme cela, elles sont facilement lisibles, notamment quant à l'ordre d'apparition des boîtes (div), o justement quant à la prise en charge de certains éléments par la css (images en background, before, after).
A ce sujet, l'utilisation des lignes séparatrices sur lesquelles on porte un clear:both est intéressante, et leur présence et emplacement dans le code ne doit pas être négligé : dans un affichage sans feuille de style, elles permettent d'aérer judicieusement la présentation, de séparer les différents ensembles de la page, et elles sont faites pour ça !
Le look de ton blog est très joli. Chapeau ! Dommage qu'on ne puisse pas faire de trackbacks ;-(
Il est vrai qu'on s'habitue vite au luxe du trackback
Donc à défaut de trackback, un lien vers une réaction sur le fond de tout ceci : http://blog-and-blues.org/weblog/2004/10/24/322-before-et-af...
Ainsi que vers cette réflexion plus synthétique de David Latapie : http://www.teaser.fr/~lcolombet/empyree/dotclear/?2004/10/25...
Et, à tout hasard, une lien vers ce billet sur la pertinence de l'outil "trackbacks" à mon sens :
http://www.pascal-grouselle.net/blog/index.php/2004/10/25/34...
Ce blog est fait à la main (comme le mien) et j'ai fait comme Nanoum, pas de trackback, c'est pas évident à mettre en place je trouve, enfin de les coder en les comprenant du moins, enfin je parle pour moi, qui suis débutant. J'imagine que Nanoum ne les a pas utilisés pour les même raisons non ?
"Primitive" est une solution de trackbacks pour les outils de publication ne supportant pas les trackbacks ou pour ceux qui écrivent leur blog à la main : http://cendres.net/primitive/
Je l'ai utilisé naguère pour feu L'Ephéméride de Ndeko. Pas de problème particulier.
avec un peu de retard, en réaction à tout ce qui s'est dit ici et dans le désordre :
- je n'ai jamais voulu inciter à une utilisation exessive des content
il est vrai que j'aurais du compléter mon discours en mettant en garde contre les abus et dérives possibles, mais bon, cela a été finalement fait dans les réactions et c'est très bien
- concernant les trackbacks, c'est vrai qu'il n'y en a pas ici mais le blog n'est pas réellement encore fini et je vais me pencher dessus
peut être aussi un deuxième fil rss qui reprendra également les commentaires
si dailleurs vous avez d'autres remarques/critiques sur le blog en lui même, n'hésitez pas
Il faudrait corriger les problèmes des liens comportant des ancres et ceux trop long qui "déforme" ton beau design... enfin tu le sais déjà
Merci pour les liens
Sinon pour en venir au contenu du billet et plus particulièrement sur les arrondis, vivement que le border-radius des CSS 3 sois implémenté dans les navigateurs, ca fera moins bidouillage. Comme le -moz-border-radius qui ne fonctionne que sous mozilla (humm le libre qui fait du propriétaire maintenant)
Salut, j'aimerais mettre le caractère › avant mes liens.
Comment puis-je passer ce code dans l'attribut 'content' de ma class ?
j'ai essayer ceci, mais ça ne fonctionne pas :
.linkplus:before {
content: '›';
}
Merci,
Bouda.
Comme l'a indiqué nanoum, les codes html ne sont pas interpréter dans la balise content et donc › non fonctionnera pas. Il faut mettre directement le caractère.
Il ne faut pas non plus oublier que ces propriétés ne fonctionnent pas avec ce vieil internet explorer.
Autant pour moi, j'ai mal lu.
Merci,
Bouda.
Bonsoir, re moi
si ça intérésse quelqu'un j'ai trouver comment faire, il faut utiliser les codes ISO-10646 :
.linkplus:before {
content: '\203A ';
}
Bouda.
Un dernier lien pour les contours arrondis :
http://www.virtuelvis.com/gallery/css/rounded/
Et une autre façon de faire mumuse avec before/after :
http://www.alsacreations.com/articles/onglets/onglets.htm
bonjour,
j'ai utilisée votre methode des coins arrondis pour mon forum, mais il se trouve que les images se repetent.
apres avoir essayé :
background-repeat:no-repeat;
toujours pas de resultat
auriez vous une idée ?
merci
ici, les images sont insérées dans les balises, il ne s'agit pas d'image en background
attention à bien cibler la balise où l'on désire les voir apparaitre
attention aussi au fait que before/after ne fonctionnera pas sous internet explorer
Commentaires momentanément fermés. Merci de votre compréhension.