<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://css.britoweb.info/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>CSS - Britoweb - CSS 2.1</title>
  <link>http://css.britoweb.info/</link>
  <atom:link href="http://css.britoweb.info/feed/category/css-2-1/rss2" rel="self" type="application/rss+xml"/>
  <description>Le Web à la sauce standard</description>
  <language>fr</language>
  <pubDate>Thu, 03 May 2012 16:48:44 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Créer des colonnes de même hauteur en CSS</title>
    <link>http://css.britoweb.info/post/Creer-des-colonnes-de-meme-hauteur-en-CSS</link>
    <guid isPermaLink="false">urn:md5:0731ed42c403a347e3e65e6f288a0588</guid>
    <pubDate>Thu, 22 Jan 2009 17:26:00 +0100</pubDate>
    <dc:creator>Victor Brito</dc:creator>
        <category>CSS 2.1</category>
            
    <description>&lt;p&gt;Pour créer &lt;strong&gt;deux ou plusieurs colonnes de même hauteur, quelle que soit la longueur de leur contenu, en CSS&lt;/strong&gt;, il existe plusieurs méthodes, dont celle des colonnes factices. Ici, nous présentons la méthode consistant à simuler le comportement d'une cellule de tableau.&lt;/p&gt;    &lt;p&gt;Dans cet article, nous partons du bout de code HTML suivant&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;&amp;lt;div id=&quot;conteneur&quot;&amp;gt;
  &amp;lt;div id=&quot;bloc-1&quot;&amp;gt;
    &amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed aliquam est at lorem. Ut eget orci. Sed tortor. Sed sapien metus, vulputate a, ornare quis, faucibus id, libero. Quisque elementum lobortis orci. Aliquam vehicula. Suspendisse vestibulum tempor enim. Sed eu tortor eget mauris gravida volutpat. Morbi ornare, mauris nec aliquet commodo, eros magna interdum odio, sed dictum eros est id nisl. Proin varius leo sit amet neque. Aliquam elementum est et urna. Sed a ante id nunc consequat vehicula.&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Sed ligula augue, volutpat eget, vehicula sit amet, auctor non, velit. Nunc sodales blandit elit. Vestibulum et urna. Vivamus suscipit, ligula et fringilla tincidunt, turpis leo pellentesque erat, quis elementum est est id mauris. Pellentesque sem turpis, mattis sed, rhoncus quis, blandit vel, sem. Nulla sed nisi non lorem lobortis egestas. Suspendisse elit diam, iaculis a, dapibus in, vehicula a, dui. Nulla facilisi. Vivamus rutrum euismod nunc. Praesent non arcu in enim sagittis rhoncus.&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Fusce lorem nisi, feugiat ut, rutrum sit amet, porttitor vel, est. Proin a nunc vel augue blandit consectetur. Donec non urna. Fusce vel dui. Duis quis ante. Duis non orci. Nullam vestibulum dolor. Quisque vulputate porta lorem. Vivamus hendrerit. Vivamus quam. Mauris lacinia. Proin hendrerit. In hac habitasse platea dictumst. Morbi leo odio, porta in, tincidunt eget, sagittis nec, est. Ut imperdiet, lacus a luctus laoreet, arcu erat viverra quam, eget elementum dolor ipsum vel lectus. Ut ac urna et urna feugiat dictum. Phasellus bibendum eros scelerisque nunc. Donec at sem id ante sagittis ultricies. Morbi ut velit.&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Curabitur auctor commodo lectus. Phasellus augue justo, interdum vel, ultricies nec, venenatis sed, dolor. Donec et leo. Fusce leo velit, faucibus ut, aliquam quis, elementum in, nisl. Praesent nec nulla et ligula dapibus bibendum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus mollis. Aenean mauris nisi, imperdiet quis, placerat id, hendrerit in, purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum facilisis. Morbi vulputate odio non mi. Nulla facilisi.&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Maecenas quis turpis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In dignissim mauris. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi pellentesque velit a elit. Quisque volutpat dictum lorem. Morbi quis felis. Etiam odio. Etiam faucibus, diam ac laoreet semper, elit tortor accumsan magna, quis mollis orci tortor malesuada odio. Aliquam pharetra. Nunc laoreet ullamcorper tortor. In libero. Praesent non nunc eget sem lobortis ultricies.&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;bloc-2&quot;&amp;gt;
    &amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed aliquam est at lorem. Ut eget orci. Sed tortor. Sed sapien metus, vulputate a, ornare quis, faucibus id, libero. Quisque elementum lobortis orci. Aliquam vehicula. Suspendisse vestibulum tempor enim. Sed eu tortor eget mauris gravida volutpat. Morbi ornare, mauris nec aliquet commodo, eros magna interdum odio, sed dictum eros est id nisl. Proin varius leo sit amet neque. Aliquam elementum est et urna. Sed a ante id nunc consequat vehicula.&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;bloc-3&quot;&amp;gt;
    &amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed aliquam est at lorem. Ut eget orci. Sed tortor. Sed sapien metus, vulputate a, ornare quis, faucibus id, libero. Quisque elementum lobortis orci. Aliquam vehicula. Suspendisse vestibulum tempor enim. Sed eu tortor eget mauris gravida volutpat. Morbi ornare, mauris nec aliquet commodo, eros magna interdum odio, sed dictum eros est id nisl. Proin varius leo sit amet neque. Aliquam elementum est et urna. Sed a ante id nunc consequat vehicula.&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Sed ligula augue, volutpat eget, vehicula sit amet, auctor non, velit. Nunc sodales blandit elit. Vestibulum et urna. Vivamus suscipit, ligula et fringilla tincidunt, turpis leo pellentesque erat, quis elementum est est id mauris. Pellentesque sem turpis, mattis sed, rhoncus quis, blandit vel, sem. Nulla sed nisi non lorem lobortis egestas. Suspendisse elit diam, iaculis a, dapibus in, vehicula a, dui. Nulla facilisi. Vivamus rutrum euismod nunc. Praesent non arcu in enim sagittis rhoncus.&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Fusce lorem nisi, feugiat ut, rutrum sit amet, porttitor vel, est. Proin a nunc vel augue blandit consectetur. Donec non urna. Fusce vel dui. Duis quis ante. Duis non orci. Nullam vestibulum dolor. Quisque vulputate porta lorem. Vivamus hendrerit. Vivamus quam. Mauris lacinia. Proin hendrerit. In hac habitasse platea dictumst. Morbi leo odio, porta in, tincidunt eget, sagittis nec, est. Ut imperdiet, lacus a luctus laoreet, arcu erat viverra quam, eget elementum dolor ipsum vel lectus. Ut ac urna et urna feugiat dictum. Phasellus bibendum eros scelerisque nunc. Donec at sem id ante sagittis ultricies. Morbi ut velit.&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;Nous lui appliquons d'ores et déjà une feuille de style, afin de fixer la largeur des trois éléments &lt;code&gt;div&lt;/code&gt; adjacents et de leur attribuer chacun une couleur d'arrière-plan différente, afin que le résultat recherché soit bien visible.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#conteneur div&lt;/span&gt; {
  width: 200px;
}
&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#bloc-1&lt;/span&gt; {
  background-color: yellow;
}
&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#bloc-2&lt;/span&gt; {
  background-color: teal;
}
&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#bloc-3&lt;/span&gt; {
  background-color: silver;
}&lt;/pre&gt;
&lt;p&gt;Soit dit en passant, rien ne vous empêche d'utiliser des unités relatives pour fixer la largeur des colonnes.&lt;/p&gt;
&lt;h3&gt;Des colonnes de même hauteur&amp;nbsp;: un équivalent des cellules de tableau&lt;/h3&gt;
&lt;p&gt;La méthode la plus facile (et pas forcément la mieux respectueuse du balisage sémantique) pour créer des colonnes de même hauteur est de passer par un tableau en HTML. En effet, dans une même rangée, les cellules de tableau ont la même hauteur, quelle que soit la longueur de leur contenu, la hauteur adoptée étant, par défaut, celle nécessaire pour la cellule ayant le plus de contenu.&lt;/p&gt;
&lt;p&gt;En CSS, il est tout à fait possible de faire qu'un élément qui ne soit pas un élément de tableau se comporte comme s'il en était un, grâce à la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt;. Ainsi, pour qu'un élément qui n'est ni un &lt;code&gt;th&lt;/code&gt; ni un &lt;code&gt;td&lt;/code&gt; se comporte comme une cellule de tableau, il suffit de lui appliquer la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt; avec la valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;table-cell&lt;/code&gt;. Ainsi, pour les trois &lt;code&gt;div&lt;/code&gt;, nous appliquons la règle suivante&amp;nbsp;:&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#conteneur div&lt;/span&gt; {
  display: table-cell;
}&lt;/pre&gt;
&lt;p&gt;Et c'est tout&amp;nbsp;! En effet, les trois &lt;code&gt;div&lt;/code&gt; adjacents s'affichent non seulement côte à côte, formant trois colonnes, mais ils ont la même hauteur, comme en témoignent leurs couleurs d'arrière-plan respectives, qui se répètent jusqu'à ce que, parmi les trois contenus, le plus long s'arrête. Il n'y a pas même besoin d'expliciter une hauteur, fût-elle fixe ou minimale. En somme, c'est une méthode très pratique, qui ne nécessite que peu de règles CSS et qui est testée avec succès sous Firefox 2 et 3, Opera, Safari, Konqueror et Internet Explorer 8.&lt;/p&gt;
&lt;h3&gt;Correctifs pour Internet Explorer 6 et 7&lt;/h3&gt;
&lt;p&gt;L'inconvénient est qu'Internet Explorer, jusqu'à la version 7, ne comprend pas &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;display: table-cell&lt;/code&gt;. Pour cela, il faudra recourir à une recette plus classique, pour laquelle l'élément &lt;code&gt;div&lt;/code&gt; conteneur (celui dont l'attribut &lt;code&gt;id&lt;/code&gt; est &lt;code&gt;&quot;conteneur&quot;&lt;/code&gt;) est utile.&lt;/p&gt;
&lt;p&gt;Nous créons une feuille de style ciblant les versions d'&lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; antérieures à la 8 (et appelée au moyen du commentaire conditionnel &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&amp;lt;!--[if lte IE 7]&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/code&gt;). Dans cette feuille de style, nous recourons au positionnement flottant pour afficher les trois &lt;code&gt;div&lt;/code&gt; adjacents côte à côte.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#conteneur div&lt;/span&gt; {
  float: left;
}&lt;/pre&gt;
&lt;p&gt;Étant donné que les éléments flottants débordent de leur élément conteneur et que tout élément suivant ledit conteneur risque d'épouser l'espace éventuellement laissé libre par les éléments flottants, nous allons créer un contexte de formatage, de façon à ce que les éléments flottants ne débordent pas de leur conteneur.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#conteneur&lt;/span&gt; {
  overflow: hidden;
}&lt;/pre&gt;
&lt;p&gt;Pour que ce contexte de formatage soit bien compris d'IE 6, il faut doter le conteneur d'un &lt;em xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;haslayout&lt;/em&gt; (pour en savoir plus sur ce concept propre à IE, supprimé à partir de la version 8, vous pouvez lire un &lt;a href=&quot;http://www.test.blog-and-blues.org/haslayout/trad_temp.html&quot; title=&quot;Article de Laurent Denis expliquant le concept de haslayout dans Internet Explorer&quot;&gt;article de Laurent Denis&lt;/a&gt; à ce sujet). À cette fin, une autre feuille de style supplémentaire (appelée au moyen du commentaire conditionnel &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&amp;lt;!--[if lte IE 6]&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/code&gt;) comporte la règle CSS suivante&amp;nbsp;:&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#conteneur&lt;/span&gt; {
  height: 1%;
}&lt;/pre&gt;
&lt;p&gt;À présent que les colonnes s'affichent bien côte à côte et n'entraînent pas de bouleversement dans les éléments voisins, reste à faire en sorte qu'elles soient de même hauteur. Pour cela, nous reprenons la feuille de style qui cible les versions d'IE antérieures à la 8, à laquelle nous ajouterons la règle suivante&amp;nbsp;: nous ajoutons une marge interne inférieure (&lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;padding-bottom&lt;/code&gt;) d'une très grande épaisseur, dont nous annulons l'effet par une marge externe inférieure (&lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;margin-bottom&lt;/code&gt;) &lt;strong&gt;négative de la même épaisseur&lt;/strong&gt;.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;&lt;span xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;#conteneur div&lt;/span&gt; {
  padding-bottom: 2000em;
  margin-bottom: -2000em;
}&lt;/pre&gt;
&lt;p&gt;J'ai choisi comme valeur 2000&amp;nbsp;em&amp;nbsp;; mais, rien ne vous empêche d'utiliser le pixel comme unité. En tout cas, le résultat recherché est au rendez-vous&amp;nbsp;: les trois colonnes ont bel et bien la même hauteur. À noter que &lt;strong&gt;la technique de la double marge, interne positive et externe négative, ne marche que s'il y a un élément conteneur auquel on applique un contexte de formatage&lt;/strong&gt; (en effet, sans l'&lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;overflow: hidden&lt;/code&gt;, le &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;margin-bottom&lt;/code&gt; n'est pas appliqué).&lt;/p&gt;
&lt;h3&gt;Page de test&lt;/h3&gt;
&lt;p&gt;Vous pouvez consulter la &lt;a href=&quot;http://css.britoweb.info/public/css-21-colonnes-de-meme-hauteur/&quot; rel=&quot;nofollow&quot;&gt;page de test de création de colonnes de même hauteur en CSS&lt;/a&gt; pour avoir un aperçu du résultat sous votre navigateur.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Générer du contenu en CSS</title>
    <link>http://css.britoweb.info/post/Generer-du-contenu-en-CSS</link>
    <guid isPermaLink="false">urn:md5:c8019f79f1a7ba3d16fbbbaf2c6c1391</guid>
    <pubDate>Sun, 18 Jan 2009 17:54:00 +0100</pubDate>
    <dc:creator>Victor Brito</dc:creator>
        <category>CSS 2.1</category>
            
    <description>&lt;p&gt;Il est tout à fait possible de générer du contenu en CSS, grâce aux pseudo-éléments &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:before&lt;/code&gt; et &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:after&lt;/code&gt; et à la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt;.&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Cette fonctionnalité n'est pas implémentée par Internet Explorer jusqu'à la version 7. Par conséquent, ce qui suit ne concerne que la version 8 d'&lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt;, ainsi que Firefox, Opera, Safari, Konqueror et tout autre navigateur implémentant les pseudo-éléments &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:before&lt;/code&gt; et &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:after&lt;/code&gt;, ainsi que la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Afficher la valeur d'un attribut HTML en CSS&lt;/h3&gt;
&lt;p&gt;Un exemple pratique est d'afficher la valeur d'un attribut HTML, comme celle de l'attribut &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;hreflang&lt;/code&gt; de l'élément &lt;code&gt;a&lt;/code&gt;, qui permet de signaler que le lien mène à une page dans une langue différente de celle utilisée par la page contenant le lien en question. Autrement dit, prenons le bout de code HTML suivant&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;&amp;lt;p&amp;gt;Du texte comportant un lien vers une page en langue étrangère,
comme la &amp;lt;a href=&quot;http://www.w3.org&quot; hreflang=&quot;en&quot;&amp;gt;page d'accueil du &lt;acronym title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/acronym&gt;&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&lt;/pre&gt;
&lt;p&gt;Nous souhaitons afficher, après le texte du lien, que ce dernier mène vers une page en anglais. Pour cela, nous recourons au sélecteur d'attribut (afin de vérifier que l'élément &lt;code&gt;a&lt;/code&gt; contient bel et bien un attribut &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;hreflang&lt;/code&gt;), au pseudo-élément &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:after&lt;/code&gt; (pour générer du contenu &lt;em&gt;après&lt;/em&gt; l'élément sélectionné) et, pour la valeur de la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt;, à la fonction CSS &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;attr()&lt;/code&gt;, qui retourne, sous forme de chaîne de caractères, la valeur de l'attribut mentionné dans son paramètre. Ce qui, en CSS, donne la règle suivante&amp;nbsp;:&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;a[hreflang]:after {
  content: &quot;\0000a0(&quot;attr(hreflang)&quot;)&quot;;
}&lt;/pre&gt;
&lt;p&gt;La fonction &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;attr()&lt;/code&gt; est entourée, de part et d'autre, par une chaîne de caractères, délimitée par des guillemets (qui peuvent être simples ou doubles). La première chaîne de caractères comporte un code hexadécimal à six chiffres, précédé d'une barre oblique inverse&amp;nbsp;: c'est une façon de coder les caractères spéciaux, comme l'espace insécable dans ce cas, selon la norme ISO 10646.&lt;/p&gt;
&lt;p&gt;La règle ci-dessus ajoutera donc au texte du lien une espace insécable, suivie d'une parenthèse ouvrante, de la chaîne &lt;code&gt;en&lt;/code&gt; (la valeur de l'attribut &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;hreflang&lt;/code&gt;) et d'une parenthèse fermante, soit «&amp;nbsp;&amp;nbsp;(en)&amp;nbsp;».&lt;/p&gt;
&lt;p&gt;Nous pourrions très bien ne pas vérifier que l'élément &lt;code&gt;a&lt;/code&gt; possède l'attribut désiré. Mais, avec une règle CSS n'utilisant pas de sélecteur d'attribut, comme suit&amp;nbsp;:&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;a:after {
  content: &quot;\0000a0(&quot;attr(hreflang)&quot;)&quot;;
}&lt;/pre&gt;
&lt;p&gt;n'importe quel élément &lt;code&gt;a&lt;/code&gt; sera concerné, y compris ceux qui sont dépourvus de l'attribut &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;hreflang&lt;/code&gt;, auquel cas la fonction &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;attr()&lt;/code&gt; retournera une chaîne vide, ce qui générera le contenu «&amp;nbsp;&amp;nbsp;()».&lt;/p&gt;
&lt;p&gt;Le contenu généré est parfaitement compris par Firefox, Opera, Safari, Konqueror et IE 8.&lt;/p&gt;
&lt;h3&gt;Générer une image en CSS&lt;/h3&gt;
&lt;p&gt;Il est également possible du contenu en CSS à partir d'une &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;, comme une image, par exemple pour orner un lien externe d'une image évoquant ce type de lien.&lt;/p&gt;
&lt;pre&gt;&amp;lt;p&amp;gt;Du texte, avec un lien externe orné d'une image&amp;amp;nbsp;:
&amp;lt;a href=&quot;http://www.victor-brito.fr&quot; rel=&quot;&lt;span xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;external&lt;/span&gt;&quot;&amp;gt;Victor Brito, intégrateur et développeur Web&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&lt;/pre&gt;
&lt;p&gt;Nous affichons pour tous les éléments &lt;code&gt;a&lt;/code&gt; ayant un attribut &lt;code&gt;rel&lt;/code&gt; de valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;external&lt;/code&gt; une image suggérant qu'il s'agit d'un lien externe, ce qui, en CSS, donne le code suivant&amp;nbsp;:&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;a[rel=&quot;external&quot;]:after {
  content: url('&lt;span xml:lang=&quot;fr&quot; lang=&quot;en&quot;&gt;lien-externe.png&lt;/span&gt;');
  margin-left: 1ex;
}&lt;/pre&gt;
&lt;p&gt;Soit dit en passant, une marge à gauche est ajoutée, afin d'éviter que l'image ne colle au texte du lien.&lt;/p&gt;
&lt;p&gt;L'image est bel et bien affichée.&lt;/p&gt;
&lt;h3&gt;Générer du texte en CSS, sauf dans certains cas&lt;/h3&gt;
&lt;p&gt;Prenons un autre cas plus complexe. Nous avons une liste de tags et partons du bout de code HTML suivant&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;&amp;lt;ul id=&quot;tags&quot;&amp;gt;
  &amp;lt;li&amp;gt;CSS&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;génération de contenu&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;pseudo-éléments&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/pre&gt;
&lt;p&gt;D'abord, nous alignons la présentation des différents tags. Nous en profitons également pour supprimer les puces et les marges par défaut des éléments &lt;code&gt;li&lt;/code&gt;.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;#tags {
  list-style: none;
}
#tags li {
  display: inline;
  padding: 0;
  margin: 0;
}&lt;/pre&gt;
&lt;p&gt;Nous souhaitons que la liste des tags soit identifiée en tant que telle. Pour cela, nous générons le texte «&amp;nbsp;Tags&amp;nbsp;:&amp;nbsp;», en l'appliquant avant l'élément &lt;code&gt;ul&lt;/code&gt;, au moyen du pseudo-élément &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:before&lt;/code&gt;.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;#tags:before {
  content: &quot;Tags\0000a0: &quot;;
}&lt;/pre&gt;
&lt;p&gt;En outre, nous voulons bien distinguer les différents tags en intercalant un caractère imprimable (par exemple, un tiret) encadré de deux espaces. Nous générons le tout avant chaque élément &lt;code&gt;li&lt;/code&gt;, ce qui donne, en CSS&amp;nbsp;:&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;#tags li:before {
  content: &quot; - &quot;;
}&lt;/pre&gt;
&lt;p&gt;Chaque tag est, ainsi, précédé d'un tiret, &lt;em&gt;y compris le premier&lt;/em&gt;. Dans ce dernier cas, la génération de contenu donne un résultat plutôt laid («&amp;nbsp;Tags&amp;nbsp;: - CSS&amp;nbsp;»). Heureusement, il est possible d'annuler l'application du contenu généré&amp;nbsp;; pour cela, nous sélectionnons le premier élément &lt;code&gt;li&lt;/code&gt; au moyen de la pseudo-classe &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:first-child&lt;/code&gt;, qu'on peut cumuler avec d'autres pseudo-classes et des pseudo-éléments. Quant à la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt;, nous l'utilisons encore, cette fois-ci avec la valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt;.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;#tags li&lt;strong&gt;:first-child&lt;/strong&gt;:before {
  content: none;
}&lt;/pre&gt;
&lt;p&gt;Lorsque la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt; a pour valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt;, cela signifie que le pseudo-élément n'est pas généré, quoi qu'il contienne. Toutefois, cette valeur n'est pas comprise par Firefox 2, Opera et Safari (ainsi que Google Chrome, qui, rappelons-le, utilise le même moteur de rendu que Safari pour les CSS). Or, comme nous utilisons l'un des deux pseudo-éléments &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:before&lt;/code&gt; et &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:after&lt;/code&gt;, il est possible d'utiliser la valeur par défaut de &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt;, à savoir &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;normal&lt;/code&gt;&amp;nbsp;: en effet, la &lt;a href=&quot;http://www.w3.org/TR/CSS21/&quot; hreflang=&quot;en&quot;&gt;spécification CSS 2.1 du W3C&lt;/a&gt;, à la &lt;a href=&quot;http://www.w3.org/TR/CSS21/generate.html#content&quot; hreflang=&quot;en&quot; title=&quot;Section sur la propriété content de la spécification CSS 2.1 du W3C&quot;&gt;section sur la propriété &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt;&lt;/a&gt;, dit ceci à propos de la valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;normal&lt;/code&gt;&amp;nbsp;: &lt;q cite=&quot;http://www.w3.org/TR/CSS21/generate.html#x10&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;computes to '&lt;code&gt;none&lt;/code&gt;' for the &lt;code&gt;:before&lt;/code&gt; and &lt;code&gt;:after&lt;/code&gt; pseudo-elements&lt;/q&gt;, ce qui veut dire que la valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;normal&lt;/code&gt; se comporte comme la valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt; lorsqu'elle est appliquée aux pseudo-éléments &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:before&lt;/code&gt; et &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;:after&lt;/code&gt;. Nous pouvons donc corriger la règle CSS précédente comme suit&amp;nbsp;:&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;#tags li:first-child:before {
  content: &lt;strong&gt;normal&lt;/strong&gt;;
}&lt;/pre&gt;
&lt;p&gt;Seulement voilà&amp;nbsp;: Safari ne comprend pas la valeur &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;normal&lt;/code&gt; et continue à afficher un tiret avant le premier tag. Pour corriger ce problème, il est possible d'indiquer comme valeur à &lt;code xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;content&lt;/code&gt; une chaîne vide.&lt;/p&gt;
&lt;pre xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;#tags li:first-child:before {
  content: &lt;strong&gt;&quot;&quot;&lt;/strong&gt;;
}&lt;/pre&gt;
&lt;h3&gt;Génération de contenu en CSS et accessibilité&lt;/h3&gt;
&lt;p&gt;Même si cette fonctionnalité paraît pratique, voire sympathique, il vaut mieux éviter d'en abuser si l'on souhaite générer du contenu textuel. En effet, &lt;strong&gt;une page Web doit rester consultable lorsque les feuilles de style sont désactivées ou ne sont pas prises en charge (même partiellement)&lt;/strong&gt;, que l'on utilise un navigateur graphique ou que l'on recoure à des aides techniques, qui peuvent ne pas prendre en charge les CSS, fût-ce partiellement. Par conséquent, il faut veiller à ce que le contenu généré en CSS ne soit pas du contenu &lt;em&gt;essentiel&lt;/em&gt; à la page Web consultée et à sa &lt;em&gt;compréhension&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Page de test&lt;/h3&gt;
&lt;p&gt;Vous pouvez consulter la &lt;a href=&quot;http://css.britoweb.info/public/css-21-generation-de-contenu/&quot; rel=&quot;nofollow&quot;&gt;page de test de génération de contenu en CSS&lt;/a&gt; pour avoir un aperçu du résultat sous votre navigateur.&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>
