<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://openweb.eu.org/dtd/docbkx42/docbookx.dtd">

<article lang="fr" role="article" id="tableaux_css">
  <articleinfo>
    <title>Habillage de tableaux avec des <acronym>CSS</acronym>
    </title>
    <pubdate>2003-10-24</pubdate>
    <date>2003-10-24</date>
    <author>
      <firstname>Pascale</firstname>
      <surname>Lambert</surname>
      <email>pascale.lambert@openweb.eu.org</email>
    </author>
    <legalnotice>
      <para>Cet article est sous licence <ulink url="http://creativecommons.org/licenses/by-sa/1.0/legalcode">Creative Commons Attribution-ShareAlike</ulink>.</para>
    </legalnotice>
    <abstract>
      <para>Faire des tableaux de données accessibles et respectant les standards avec les CSS</para>
    </abstract>
    <subjectset>
      <subject role="profil">
        <subjectterm>debutant</subjectterm>
        <subjectterm>expert</subjectterm>
      </subject>
      <subject role="theme">
        <subjectterm>mise_en_page</subjectterm>
      </subject>
      <subject role="technologie">
        <subjectterm>css</subjectterm>
      </subject>
    </subjectset>
  </articleinfo>
  <section>
    <title>En-tête, cellules et accessibilité</title>
    <section>
      <title>Avertissement préliminaire</title>
      <para>Avec le support du positionnement <acronym>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.</para>
      <para>Afin de compléter ce point de vue, lire l'article <ulink url="/articles/problemes_tableaux/">Les problèmes de la mise en page par tableaux</ulink>.</para>
    </section>
    <section>
      <title>Différentes balises</title>
      <section>
        <title>Balises élémentaires</title>
        <itemizedlist>
          <listitem><para><sgmltag class="starttag">table</sgmltag>&#160;: crée un tableau</para></listitem>
          <listitem><para><sgmltag class="starttag">caption</sgmltag>&#160;: légende du tableau (optionnel)</para></listitem>
          <listitem><para><sgmltag class="starttag">tr</sgmltag>&#160;: ligne du tableau</para></listitem>
          <listitem><para><sgmltag class="starttag">th</sgmltag>&#160;: cellules d'en-tête du tableau</para></listitem>
          <listitem><para><sgmltag class="starttag">td</sgmltag>&#160;: cellules du tableau</para></listitem>
        </itemizedlist>
      </section>
      <section>
        <title>Balises complémentaires</title>
        <itemizedlist>
          <listitem><para><sgmltag class="starttag">thead</sgmltag>&#160;: groupe de cellules d'en-tête</para></listitem>
          <listitem><para><sgmltag class="starttag">tbody</sgmltag>&#160;: groupe de cellules de corps de tableau</para></listitem>
          <listitem><para><sgmltag class="starttag">tfoot</sgmltag>&#160;: groupe de cellules de pied de tableau</para></listitem>
        </itemizedlist>
      </section>
    </section>
    <section>
      <title>Accessibilité</title>
      <para>Pour les navigateurs textuels, brailles ou vocaux pouvant être utilisés par les déficients visuels, il convient d'ajouter l'attribut <sgmltag class="attribute">summary</sgmltag> pour expliquer le contenu du tableau. Cet attribut s'applique à l'élément <sgmltag>table</sgmltag>.</para>
    </section>
  </section>
  <section>
    <title>Tableau simple</title>
    <para>Le code <acronym>(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&#160;:</para>
    <programlisting>
&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;
</programlisting>
    <para>Dans ce contexte, toute la mise en forme du tableau et de ses cellules est à déclarer par le biais des <acronym>CSS</acronym>.</para>
    <para>Remarque&#160;: on peut indiquer <token>border="1"</token> dans l'élément <token>table</token> afin les cellules du tableau soient tout de même bordées avec les navigateurs graphiques plus anciens acceptant pas ou mal les CSS.</para>
    <para>Choisissons les options d'un cadre de tableau en trait continu (<token>solid</token>), noir (<token>#000000</token>) et d'épaisseur moyenne (<token>medium</token>) ; et des bordures de cellules en traits continus (<token>solid</token>) fins (<token>thin</token>) et bleus ciel (<token>#6495ed</token>). Le code <acronym>CSS</acronym>, à indiquer dans une feuille de style externe ou dans l'en-tête de la page entre des balises <token>&lt;style type="text/css"&gt;&lt;/style&gt;</token>, sera celui-ci&#160;:</para>
    <programlisting>
table {
border: medium solid #000000;
width: 50%;
}
td, th {
border: thin solid #6495ed;
width: 50%;
}
</programlisting>
    <para>L'aspect du tableau sera ainsi le suivant&#160;:</para>
    <para>
      <inlinemediaobject>
        <imageobject>
          <imagedata fileref="annexes/tab1.png"/>
        </imageobject>
        <textobject>
          <phrase>exemple de tableau basique</phrase>
        </textobject>
      </inlinemediaobject>
    </para>
    <para>
      <phrase>Remarque 1</phrase>&#160;: on préférera les tailles (<token>width:</token>) 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.</para>
    <para>
      <phrase>Remarque 2</phrase>&#160;: l'épaisseur des traits peut aussi être exprimée en pixels (px), points (pt), pica (pc)&#8230;, de même que leur apparence peut être en tirets (<token>dashed</token>), en pointillés (<token>dotted</token>), en relief (<token>outset</token> ou <token>inset</token>) etc.</para>
    <para>Si on désire que les bordures de tour de tableau et de cellules soient confondues, on rajoutera <token>border-collapse: collapse</token> dans les styles de <sgmltag>table</sgmltag>.</para>
    <para>L'aspect du tableau pourra alors être le suivant&#160;:</para>
    <para>
      <inlinemediaobject>
        <imageobject>
          <imagedata fileref="annexes/tab2.png"/>
        </imageobject>
        <textobject>
          <phrase>exemple de tableau avec bordures fusionnées</phrase>
        </textobject>
      </inlinemediaobject>
    </para>
    <para>Dans les navigateurs actuels, le texte présent dans les cellules définies par les balises <sgmltag>th</sgmltag> est en gras et centré par défaut.</para>
    <para>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.</para>
    <section>
      <title>Exemple</title>
      <programlisting>
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;
}
</programlisting>
      <para>
        <inlinemediaobject>
          <imageobject>
            <imagedata fileref="annexes/tab3.png"/>
          </imageobject>
          <textobject>
            <phrase>exemple de tableau d'aspect un peu plus élaboré</phrase>
          </textobject>
        </inlinemediaobject>
      </para>
      <para>Voir les différents exemples décrits&#160;: <ulink url="annexes/annexe.html">document annexe 1</ulink>.</para>
    </section>
  </section>
  <section>
    <title>Centrage d'un tableau dans une page</title>
    <para>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.</para>
    <para>Avec <ulink url="http://www.microsoft.com/windows/ie_intl/fr/ie6sp1.mspx"><acronym>MSIE</acronym> 6</ulink>, <ulink url="http://www.telechargement.netscape.fr/telechargement/">Netscape 6 et +</ulink>, <ulink url="http://frenchmozilla.sourceforge.net/install/">Mozilla</ulink>, <ulink url="http://www.mozilla.org/products/firefox/">Firefox</ulink> ou <ulink url="http://www.opera.com/download/">Opera 5 et +</ulink>, l'attribut <token>margin: auto</token>, à inclure dans les styles <acronym>CSS</acronym> de <sgmltag>table</sgmltag>, centre automatiquement le bloc.</para>
    <para>Mais les versions antérieures à MSIE 6 ne le reconnaissent hélas pas. L'astuce est alors d'encadrer le tableau par des balises <token>&lt;div style="text-align:center"&gt;&lt;/div&gt;</token>, 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.</para>
  </section>
  <section>
    <title>Tableaux plus élaborés</title>
    <para>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 <sgmltag>thead</sgmltag>, <sgmltag>tfoot</sgmltag> et <sgmltag>tbody</sgmltag>, citées en début d'article&#160;:</para>
    <programlisting>
&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;
</programlisting>
    <para>Ce qui donne ce résultat peu attrayant&#160;:</para>
    <para>
      <inlinemediaobject>
        <imageobject>
          <imagedata fileref="annexes/tab4.png"/>
        </imageobject>
        <textobject>
          <phrase>tableau plus elaboré sans mise en forme</phrase>
        </textobject>
      </inlinemediaobject>
    </para>
    <para>La spec du W3C précise que les <sgmltag>thead</sgmltag> et
    <sgmltag>tfoot</sgmltag> doivent être déclarés avant le(s) <sgmltag>tbody</sgmltag>.
    Le navigateur interpretera de lui-même le bon emplacement des différents groupes
    de cellules.</para>
    <para>Dans un premier temps, fusionnons les cellules d'articles et d'auteurs identiques. Pour les cellules en lignes on ajoutera l'attribut <token>colspan="n"</token> ; pour celles en colonnes, c'est <token>rowspan="n"</token> qui sera utilisé, <varname>n</varname> étant de le nombre de cellules fusionnées.</para>
    <para>Le code <acronym>(X)HTML</acronym> devient&#160;:</para>
    <programlisting>
&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;
</programlisting>
    <para>Résultat&#160;:</para>
    <para>
      <inlinemediaobject>
        <imageobject>
          <imagedata fileref="annexes/tab5.png"/>
        </imageobject>
        <textobject>
          <phrase>Tableau sans mise en forme avec cellules fusionnées</phrase>
        </textobject>
      </inlinemediaobject>
    </para>
    <para>Reste à améliorer la présentation visuelle pour rendre l'ensemble plus agréable à l'aide des <acronym>CSS</acronym>&#160;:</para>
    <programlisting>
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;
}
</programlisting>
    <para>Résultat&#160;:</para>
    <para>
      <inlinemediaobject>
        <imageobject>
          <imagedata fileref="annexes/tab6.png"/>
        </imageobject>
        <textobject>
          <phrase>exemple de mise en forme visuelle de tableau</phrase>
        </textobject>
      </inlinemediaobject>
    </para>
  </section>
  <section>
    <title>Compléments</title>
    <itemizedlist>
      <listitem>
        <para>Comme la largeur de colonnes, la hauteur de chaque ligne peut aussi être définie. L'attribut <token>height:</token> sera indiqué pour l'élément <sgmltag>tr</sgmltag>.</para>
      </listitem>
      <listitem>
        <para>L'alignement vertical du texte présent dans chaque cellule peut-être modifié à l'aide de l'attribut <token>vertical-align:</token> qui peut prendre les valeurs&#160;: <token> baseline | top | middle | bottom</token>. Cet attribut peut-être indiqué pour les éléments <sgmltag>td</sgmltag> ou <sgmltag>th</sgmltag>.</para>
      </listitem>
      <listitem>
        <para>Pour positionner la légende du tableau l'attribut <token>caption-side</token>, à indiquer pour l'élément <sgmltag>table</sgmltag> peut prendre les valeurs <token>top | bottom | left | right</token>. (Ne fonctionne pas avec <acronym>MSIE</acronym>).</para>
      </listitem>
    </itemizedlist>
    <para>Voir les différents exemples décrits&#160;: <ulink url="annexes/annexe2.html">document annexe 2</ulink>.</para>
  </section>
</article>
