<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title>Openweb.eu.org - Habillage de tableaux avec des CSS</title>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
    <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
    <meta name="DC.Language" scheme="RFC3066" content="fr" />
    <meta name="DC.Identifier" content="tableaux_css" />
    <meta name="DC.Creator" content="Pascale Lambert" />
    <meta name="DC.Date.created" scheme="W3CDTF" content="2003-10-24" />
    <meta name="DC.Date.modified" scheme="W3CDTF" content="2003-10-24" />
    <meta name="DC.Rights" content="Cet article est sous licence Creative Commons Attribution-ShareAlike." />
    <meta name="DC.Subject" content="debutant, expert, mise_en_page, css" />
  </head>
  <body>
    <h1>Habillage de tableaux avec des CSS</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <a href="/debutant/">Débutant</a>, <a href="/expert/">Expert</a>
      </li>
      <li>
        <strong>Thème :</strong> <a href="/mise_en_page/">Mise en page</a>
      </li>
      <li>
        <strong>Technologie :</strong> <a href="/css/">CSS</a>
      </li>
      <li>
        <strong>Auteur :</strong> <a href="mailto:pascale.lambert%40openweb.eu.org">Pascale Lambert</a>
      </li>
      <li>
        <strong>Mise à jour :</strong> 24/10/2003</li>
    </ul>
    <h2>En bref</h2>
    <p>Faire des tableaux de données accessibles et respectant les standards avec les CSS</p>
    <hr />
    <h3>En-tête, cellules et accessibilité</h3>
    <h4>Avertissement préliminaire</h4>
    <p>Avec le support du positionnement <acronym title="Cascading Style Sheets" lang="en">CSS</acronym> dans l'immense majorité des navigateurs, les inconvénients liés à la mise en page par tableaux n'ont plus lieu d'être subis, à moins de devoir fournir une mise en page identique à l'antique Netscape 4. Aussi, le présent article se concentrera sur la mise en forme des tableaux de données, utilisés pour présenter des données tabulaires.</p>
    <p>Afin de compléter ce point de vue, lire l'article <a href="/articles/problemes_tableaux/">Les problèmes de la mise en page par tableaux</a>.</p>
    <h4>Différentes balises</h4>
    <h5>Balises élémentaires</h5>
    <ul>
      <li>
        <code>&lt;table&gt;</code> : crée un tableau</li>
      <li>
        <code>&lt;caption&gt;</code> : légende du tableau (optionnel)</li>
      <li>
        <code>&lt;tr&gt;</code> : ligne du tableau</li>
      <li>
        <code>&lt;th&gt;</code> : cellules d'en-tête du tableau</li>
      <li>
        <code>&lt;td&gt;</code> : cellules du tableau</li>
    </ul>
    <h5>Balises complémentaires</h5>
    <ul>
      <li>
        <code>&lt;thead&gt;</code> : groupe de cellules d'en-tête</li>
      <li>
        <code>&lt;tbody&gt;</code> : groupe de cellules de corps de tableau</li>
      <li>
        <code>&lt;tfoot&gt;</code> : groupe de cellules de pied de tableau</li>
    </ul>
    <h4>Accessibilité</h4>
    <p>Pour les navigateurs textuels, brailles ou vocaux pouvant être utilisés par les déficients visuels, il convient d'ajouter l'attribut <code>"summary"</code> pour expliquer le contenu du tableau. Cet attribut s'applique à l'élément <code>table</code>.</p>
    <h3>Tableau simple</h3>
    <p>Le code <acronym title="(eXtensible) HyperText Markup Language" lang="en">(X)HTML</acronym> d'un tableau de données simple présentées en colonnes, respectant standards et accessibilité, peut être de la forme suivante :</p>
    <pre>
&lt;table summary="exemple de structure d'un tableau de données"&gt;
  &lt;caption&gt;Tableau de données&lt;/caption&gt;
  &lt;tr&gt;
    &lt;th&gt;Titre colonne 1&lt;/th&gt;
    &lt;th&gt;Titre colonne 2&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;cellule A1&lt;/td&gt;
    &lt;td&gt;cellule B1&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;cellule A2&lt;/td&gt;
    &lt;td&gt;cellule B2&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
</pre>
    <p>Dans ce contexte, toute la mise en forme du tableau et de ses cellules est à déclarer par le biais des <acronym>CSS</acronym>.</p>
    <p>Remarque : on peut indiquer <code>border="1"</code> dans l'élément <code>table</code> afin les cellules du tableau soient tout de même bordées avec les navigateurs graphiques plus anciens acceptant pas ou mal les CSS.</p>
    <p>Choisissons les options d'un cadre de tableau en trait continu (<code>solid</code>), noir (<code>#000000</code>) et d'épaisseur moyenne (<code>medium</code>) ; et des bordures de cellules en traits continus (<code>solid</code>) fins (<code>thin</code>) et bleus ciel (<code>#6495ed</code>). Le code <acronym>CSS</acronym>, à indiquer dans une feuille de style externe ou dans l'en-tête de la page entre des balises <code>&lt;style type="text/css"&gt;&lt;/style&gt;</code>, sera celui-ci :</p>
    <pre>
table {
border: medium solid #000000;
width: 50%;
}
td, th {
border: thin solid #6495ed;
width: 50%;
}
</pre>
    <p>L'aspect du tableau sera ainsi le suivant :</p>
    <p><img src="annexes/tab1.png" alt="exemple de tableau basique" /></p>
    <p>Remarque 1 : on préférera les tailles (<code>width:</code>) de tableaux et de cellules en pourcentages plutôt qu'en pixels afin que le tableau s'adapte automatiquement à la fenêtre d'affichage, quelle que soit la résolution de l'écran.</p>
    <p>Remarque 2 : l'épaisseur des traits peut aussi être exprimée en pixels (px), points (pt), pica (pc)…, de même que leur apparence peut être en tirets (<code>dashed</code>), en pointillés (<code>dotted</code>), en relief (<code>outset</code> ou <code>inset</code>) etc.</p>
    <p>Si on désire que les bordures de tour de tableau et de cellules soient confondues, on rajoutera <code>border-collapse: collapse</code> dans les styles de <code>table</code>.</p>
    <p>L'aspect du tableau pourra alors être le suivant :</p>
    <p><img src="annexes/tab2.png" alt="exemple de tableau avec bordures fusionnées" /></p>
    <p>Dans les navigateurs actuels, le texte présent dans les cellules définies par les balises <code>th</code> est en gras et centré par défaut.</p>
    <p>Rien n'empêche évidemment de modifier l'alignement du texte, la police de caractère ou la couleur de fond des différentes cellules.</p>
    <h4>Exemple</h4>
    <pre>
table {
border: medium solid #6495ed;
border-collapse: collapse;
width: 50%;
}
th {
font-family: monospace;
border: thin solid #6495ed;
width: 50%;
padding: 5px;
background-color: #D0E3FA;
background-image: url(sky.jpg);
}
td {
font-family: sans-serif;
border: thin solid #6495ed;
width: 50%;
padding: 5px;
text-align: center;
background-color: #ffffff;
}
caption {
font-family: sans-serif;
}
</pre>
    <p><img src="annexes/tab3.png" alt="exemple de tableau d'aspect un peu plus élaboré" /></p>
    <p>Voir les différents exemples décrits : <a href="annexes/annexe.html">document annexe 1</a>.</p>
    <h3>Centrage d'un tableau dans une page</h3>
    <p>Si la taille du tableau est inférieure à 100% de la fenêtre d'affichage, il est souvent souhaité qu'il soit centré dans la page.</p>
    <p>Avec <a href="http://www.microsoft.com/windows/ie_intl/fr/ie6sp1.mspx">
        <acronym title="MicroSoft Internet Explorer" lang="en">MSIE</acronym> 6</a>, <a href="http://www.telechargement.netscape.fr/telechargement/">Netscape 6 et +</a>, <a href="http://frenchmozilla.sourceforge.net/install/">Mozilla</a>, <a href="http://www.mozilla.org/products/firefox/">Firefox</a> ou <a href="http://www.opera.com/download/">Opera 5 et +</a>, l'attribut <code>margin: auto</code>, à inclure dans les styles <acronym>CSS</acronym> de <code>table</code>, centre automatiquement le bloc.</p>
    <p>Mais les versions antérieures à MSIE 6 ne le reconnaissent hélas pas. L'astuce est alors d'encadrer le tableau par des balises <code>&lt;div style="text-align:center"&gt;&lt;/div&gt;</code>, qui ne servent à rien pour les précédents navigateurs cités, mais qui permettra d'avoir une présentation homogène quel que soit le browser.</p>
    <h3>Tableaux plus élaborés</h3>
    <p>Pour des présentations plus complexes, d'autres ensembles d'éléments et d'attributs vont pouvoir être exploités. Étudions le cas de présentation suivant utilisant les balises <code>thead</code>, <code>tfoot</code> et <code>tbody</code>, citées en début d'article :</p>
    <pre>
&lt;table summary="liste de quelques articles publiés
sur OpenWeb regroupés par auteurs et niveaux"&gt;
&lt;caption&gt;
Présentation de quelques articles publiés sur OpenWeb
&lt;/caption&gt;
  &lt;thead&gt;
    &lt;tr&gt;
     &lt;th&gt;&lt;/th&gt;
     &lt;th&gt;Débutants&lt;/th&gt;
     &lt;th&gt;Experts&lt;/th&gt;
     &lt;th&gt;Gourous&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tfoot&gt;
    &lt;tr&gt;
     &lt;th&gt;&lt;/th&gt;
     &lt;th&gt;Débutants&lt;/th&gt;
     &lt;th&gt;Experts&lt;/th&gt;
     &lt;th&gt;Gourous&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/tfoot&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
     &lt;th&gt;Tristan Nitot&lt;/th&gt;
     &lt;td&gt;Introduction à l'accessibilité&lt;/td&gt;
     &lt;td&gt;Introduction à l'accessibilité&lt;/td&gt;
     &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
     &lt;th&gt;Tristan Nitot&lt;/th&gt;
     &lt;td&gt;Interview de Chantal Laplanche, Responsable
	Accessibilité Web au Ministère de la Culture&lt;/td&gt;
     &lt;td&gt;Interview de Chantal Laplanche, Responsable
	Accessibilité Web au Ministère de la Culture&lt;/td&gt;
     &lt;td&gt;Interview de Chantal Laplanche, Responsable
	Accessibilité Web au Ministère de la Culture&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
     &lt;th&gt;Laurent Denis&lt;/th&gt;
     &lt;td&gt;Un exemple de feuille de style
	 d'impression&lt;/td&gt;
     &lt;td&gt;&lt;/td&gt;
     &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
     &lt;th&gt;Laurent Denis&lt;/th&gt;
     &lt;td&gt;&lt;/td&gt;
     &lt;td&gt;Commenter le document de travail
	W3CXHTML 2&lt;/td&gt;
     &lt;td&gt;Commenter le document de travail
	W3CXHTML 2&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</pre>
    <p>Ce qui donne ce résultat peu attrayant :</p>
    <p><img src="annexes/tab4.png" alt="tableau plus elaboré sans mise en forme" /></p>
    <p>La spec du W3C précise que les <code>thead</code> et
    <code>tfoot</code> doivent être déclarés avant le(s) <code>tbody</code>.
    Le navigateur interpretera de lui-même le bon emplacement des différents groupes
    de cellules.</p>
    <p>Dans un premier temps, fusionnons les cellules d'articles et d'auteurs identiques. Pour les cellules en lignes on ajoutera l'attribut <code>colspan="n"</code> ; pour celles en colonnes, c'est <code>rowspan="n"</code> qui sera utilisé, n étant de le nombre de cellules fusionnées.</p>
    <p>Le code <acronym>(X)HTML</acronym> devient :</p>
    <pre>
&lt;table summary="liste de quelques articles publiés
sur OpenWeb regroupés par auteurs et niveaux"&gt;
&lt;caption&gt;
Présentation de quelques articles publiés sur OpenWeb
&lt;/caption&gt;
  &lt;thead&gt;
    &lt;tr&gt;
     &lt;th&gt;&lt;/th&gt;
     &lt;th&gt;Débutants&lt;/th&gt;
     &lt;th&gt;Experts&lt;/th&gt;
     &lt;th&gt;Gourous&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tfoot&gt;
    &lt;tr&gt;
     &lt;th&gt;&lt;/th&gt;
     &lt;th&gt;Débutants&lt;/th&gt;
     &lt;th&gt;Experts&lt;/th&gt;
     &lt;th&gt;Gourous&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/tfoot&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
     &lt;th rowspan="2"&gt;Tristan Nitot&lt;/th&gt;
     &lt;td colspan="2"&gt;Introduction à l'accessibilité&lt;/td&gt;
     &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
     &lt;td colspan="3"&gt;Interview de Chantal Laplanche, Responsable
	Accessibilité Web au Ministère de la Culture&lt;/td&gt;
    &lt;/tr&gt;
   &lt;/tbody&gt;
   &lt;tbody&gt;
    &lt;tr&gt;
     &lt;th rowspan="2"&gt;Laurent Denis&lt;/th&gt;
     &lt;td&gt;Un exemple de feuille de style
	 d'impression&lt;/td&gt;
     &lt;td&gt;&lt;/td&gt;
     &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
     &lt;td&gt;&lt;/td&gt;
     &lt;td colspan="2"&gt;Commenter le document de travail
	W3CXHTML 2&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</pre>
    <p>Résultat :</p>
    <p><img src="annexes/tab5.png" alt="Tableau sans mise en forme avec cellules fusionnées" /></p>
    <p>Reste à améliorer la présentation visuelle pour rendre l'ensemble plus agréable à l'aide des <acronym>CSS</acronym> :</p>
    <pre>
table {
border:3px solid #6495ed;
border-collapse:collapse;
width:90%;
margin:auto;
}
thead, tfoot {
background-color:#D0E3FA;
background-image:url(sky.jpg);
border:1px solid #6495ed;
}
tbody {
background-color:#FFFFFF;
border:1px solid #6495ed;
}
th {
font-family:monospace;
border:1px dotted #6495ed;
padding:5px;
background-color:#EFF6FF;
width:25%;
}
td {
font-family:sans-serif;
font-size:80%;
border:1px solid #6495ed;
padding:5px;
text-align:left;
}
caption {
font-family:sans-serif;
}
</pre>
    <p>Résultat :</p>
    <p><img src="annexes/tab6.png" alt="exemple de mise en forme visuelle de tableau" /></p>
    <h3>Compléments</h3>
    <ul>
      <li>Comme la largeur de colonnes, la hauteur de chaque ligne peut aussi être définie. L'attribut <code>height:</code> sera indiqué pour l'élément <code>tr</code>.</li>
      <li>L'alignement vertical du texte présent dans chaque cellule peut-être modifié à l'aide de l'attribut <code>vertical-align:</code> qui peut prendre les valeurs : <code> baseline | top | middle | bottom</code>. Cet attribut peut-être indiqué pour les éléments <code>td</code> ou <code>th</code>.</li>
      <li>Pour positionner la légende du tableau l'attribut <code>caption-side</code>, à indiquer pour l'élément <code>table</code> peut prendre les valeurs <code>top | bottom | left | right</code>. (Ne fonctionne pas avec <acronym>MSIE</acronym>).</li>
    </ul>
    <p>Voir les différents exemples décrits : <a href="annexes/annexe2.html">document annexe 2</a>.</p>
  </body>
</html>
