Flux et ordre d'affichage
Certaines valeurs spécifiques du modèle d’affichage sous forme de tableau modifient l’ordre d’affichage des éléments empilés verticalement :
-
Un élément déclaré en
table-header-groupse placera avant ses frères tabulaires. -
Un élément en
table-footer-groupse positionnera à la suite de ses frères tabulaires. -
Un élément en
table-captionapparaîtra par défaut tout en haut de la pile, mais peut être déplacé tout en bas s’il est accompagné d’une déclarationcaption-side: bottom.
Illustration : un élément en table-caption s'affiche avant son frère, la boîte anonyme table construite autour des 3 blocks :
Affublé d'un caption-side: bottom, l'élément table-caption se place en dessous :
Des éléments table-header-group et table-footer-group s'affichent ainsi :
Les éléments anonymes
Chaque élément de rendu tableau en CSS crée automatiquement des objets de table anonymes autour de lui-même, c’est-à-dire que les éléments de structure manquants sont créés par le navigateur.
Ce concept est assez complexe à appréhender et pourtant essentiel pour bien comprendre les subtilités des positionnements tabulaires.
Construction anonyme descendante :
-
Si le parent d’éléments frères
table-celln’est pas untable-row, alors un objet anonymetable-rowest créé autour des frèrestable-cell -
Si le parent d’éléments frères
table-row(ou équivalents) n’est pas untable, alors un objet anonymetableest créé autour des frèrestable-rowou équivalents
Illustration : un élément table-cell construit autour de lui un objet table-row et table, ses frères blocks ne sont pas concernés :
Un objet table-row + table se construit autour de 2 frères table-cell :
Même schéma pour trois frères puis quatre frères (illustrations ci-dessous) :
Construction anonyme ascendante :
-
Un parent
table(ou équivalent) construit un objet anonymetable-rowautour de l'ensemble de ses enfants directs qui ne sont pastable-rowou équivalents -
Un parent
table-row(ou équivalent) construit un objet anonymetable-cellautour de l'ensemble de ses enfants directs qui ne sont pastable-cell
Illustration : un parent table construit autour des 4 blocks un objet table-cell + table-row :
Un des éléments est un table-cell; autour des 3 blocks frères se construit un table-cell également, puis un table-row se contruit autour des 2 table-cell (celle de gauche et celle - anonyme - de droite) :
Dans les illustrations suivantes, un élément table-cell anonyme est construit autour des éléments frères blocks, puis un table-row anonyme se construit autour des cellules réelles ou imaginaires :
Spécificités des éléments tabulaires
Propriétés incompatibles
Les valeurs de rangées (table-row et équivalents) présentent des particularités liées à leur rendu :
-
table-rowne comprend pas la propriétépadding, nimargin,position,width,min/max-width,min/max-height,vertical-align,borderetoverflow. -
Plus globalement, il n’est pas possible d’appliquer la propriété
paddingaux élément endisplay: table-row-group,table-header-group,table-footer-group,table-row,table-column-groupettable-column. -
Enfin, il ne peut y avoir qu’un seul
table-captionau sein d’un tableau.
Positionnement
Selon les spécifications, positionner ou rendre flottant une cellule de tableau *peut* modifier son comportement, ne plus être considérée comme une cellule et affecter l’alignement et les dimensions de la table.
En pratique, il n’est pas possible de faire bénéficier les éléments tabulaires de la position relative sur certains navigateurs (Firefox par exemple), ce qui peut être gênant puisqu’ils ne peuvent ainsi pas servir de référents pour des contenus positionnés en absolu.
L'élément "choucroute" est positionné en position: absolute à right: 0 et top: 0. Logiquement, il se positionne hors du tableau :
Lorsque le conteneur global (display: table) est en position: relative, il devient un référent pour "choucroute" :
Par contre, lorsque l'un des élements en display: table-cell est en position: relative, il ne devient pas un référent pour "choucroute" sur certains navigateurs.
Génération de contenu
Il est possible de générer du contenu en CSS sur des éléments tabulaires à l’aide des pseudo-éléments CSS3 ::before et ::after (ou leurs versions CSS2 :before et :after).
Particularité pittoresque : les éléments générés sont susceptibles de participer eux aussi au grand jeu de la construction d’objets anonymes (voir précédemment), et se voir inclus dans des éléments table-cell ou table-row.
div {display: table}
div:before {
content: "div:before";
display: table-cell;
width: 33%;
padding: 3px;
background: orange;
}
div:after {
content: "div:after";
display: table-cell;
width: 33%;
padding: 3px;
background: #39f;
}
Si les éléments sont générés directement sur le parent en display: table, alors un objet anonyme table-cell se crée autour de chacun des éléments individuels générés en :before et :after :
Si les éléments générés sont eux-mêmes en display: table-cell, ils participent avec leur troisième frère table-cell à la construction d'un conteneur anonyme commun table-row :
Considérations d'accessibilité
Quelques tests de lecteurs d’écran ont révélé que certains outils d’accessibilité traitent les éléments en display: table (et variantes) comme de vrais éléments tablulaires HTML, même s’il s’agit de div ou de paragraphes.
Cela peut créer des gênes, voire des soucis d’accessibilité, lorsque ces éléments sont porteurs de sens tels que des éléments de navigation par exemple ou des niveaux de titres.
Aux dernières nouvelles, la grande majorité (Window-eye, Jaws, Voice-over et NVDA sur IE) se comportent correctement. Le problème (s'il s'agit vraiment d'un problème) n'apparaît que sur certains dispositifs tels que NVDA sur Firefox et ORCA.
Plus d’information : http://www.456bereastreet.com/archive/201110/using_displaytable_has_semantic_effects_in_some_screen_readers/
Commentaires
Bien présenté, bien écrit, super agréable à lire. Merci d'avoir rempli ma tête d'informations que j'ignorais totalement.
Merci Raphaël de mettre encore et toujours ses compétences au service des autres.
Je ne comprends pas l'utilité des pseudo-éléments? Dans quels cas peut-on y avoir recours.
Il y a mille et un usages possibles des pseudo-éléments, en voici un par exemple : codepen.io/raphaelgoetter/pen/dGxvL
Merci Raphaël.
Voilà au moins un usage, pour les mille autres, je garderai l'oeil ouvert.:)
Bon week-end.
Bonjour et merci pour cet article très instructif !!
J'ai une question sur un des points : les propriétés "display: table-header-group" par exemple - dont la position dans le flux semble puissante - peut elle être utilisée dans le cadre d'une chorégraphie de contenus telle qu'imaginée par Trent Walton ?
La compatibilité mobile de ces propriétés est excellente, et ce pourrait être une ingénieuse solution à certaines questions existentielles des intégrateurs en ce moment !
Merci pour la lecture en tout cas, les détails sont croustillants comme on aime !
... quid des webmails et outils tels que Thunderbird, Outlook, Mail (macOs) ? Faut-il garder nos vieux tableaux pour les newsletters ?
Pour ceux qui voudraient une version pdf (bricolée) de ce tuto, c'est par là : http://perso.jojaba.fr/Web-utilisation-develo... ;)
@Ten : en effet, de belles choses sont promises à ces valeurs de table qui modifient l'ordre d'affichage (en attendant flexbox bien plus poussé dans ce domaine). Mais attention à l'accessibilité de ces techniques !
@cynic- : les clients mails sont toujours aussi réfractaires aux styles CSS "évolués", il faut donc toujours se fier aux "vrais" tableaux HTML pour eux :(
Je ne suis pas expert en accessibilité mais je sens que ça va être mon nouveau seau dans le bac à sable, c'est l'occasion d'apprendre !!
Merci pour la réponse éclairée.