2009-06-12 6 views
1

J'ai une question sur la façon de présenter des données structurées en HTML.Utilisation du HTML pour présenter des données structurées

J'ai des données arborescentes, que vous pourriez normalement présent à l'aide de sections et sous-sections (à savoir <h1>, <h2>, etc.) et/ou en utilisant des listes imbriquées (à savoir les listes dont les éléments contiennent des listes de sous-éléments).

Un exemple de ces données est une liste de tâches, qui comporte des tâches comprenant des sous-tâches et des sous-sous-tâches.

Chacune de ces données a également des propriétés associées, par exemple:

  • bool completed;
  • DateTime completionDate;
  • Priority priority;

Ma question est, que proposez-vous comme un bon moyen de présenter ces données sur une page, en utilisant le HTML?


Ma première idée est de le présenter comme une table:

  • L'une des colonnes de la table montre la tâche ou sous-tâche
  • D'autres colonnes de chaque ligne montrent les valeurs des propriétés (par exemple "terminé", etc.) associé à cette tâche

Mon problème avec ceci est que montrer toutes les tâches et sous-tâches dans une colonne de table perdrait l'information sur la façon dont les tâches sont n ested: par exemple, il ne montrerait pas que la deuxième ligne est réellement une sous-tâche de la première rangée. Pouvez-vous suggérer un moyen de contourner ce problème? Je pensais à la décoration des articles avec un nombre variable de Chevrons comme « > » pour montrer à quel point imbriqué chaque élément est, par exemple:

TASK     COMPLETED 

Some major task   No 
> A subtask    Yes 
> Another subtask   Yes 
> > A sub-subtask   Yes 
Next major task   No 

Certains problèmes avec ce sont cependant:

  • Il pourrait ressembler laid, et je ne suis pas sûr que c'est aussi intuitivement compréhensible et aussi lisible que possible. Un autre ornement, ou simplement un retrait d'espace blanc de longueur variable, pourrait-il être meilleur?
  • Je ne vois pas une façon élégante de l'encoder en HTML + CSS; par exemple, inséreriez-vous l'ornement en utilisant le HTML, ou insérez-le en utilisant CSS; et si vous utilisez CSS, serait-ce en ajoutant quelque chose comme class="level1" à class="level6" pour afficher le niveau d'imbrication?

Une autre façon serait de le présenter sous forme de texte qui circule verticalement, par exemple ...

<h1>Some major task</h1> 
<p>Completed: no.</p> 
<h2>A subtask</h2> 
...etc... 

... que je vais faire aussi bien, mais je veux aussi qui permet au lecteur d'analyser la colonne des valeurs de propriété, ce qui est plus facile lorsque les valeurs de la propriété sont alignées dans une colonne au lieu d'être intercalées avec un autre texte.


Il s'agit plus de la conception de l'interface utilisateur que du codage, mais ...Je ne suis sûrement pas la première personne à vouloir afficher ce type de données, mais je ne me souviens pas avoir vu d'exemples, alors j'aimerais vous poser la question.

+0

Le titre de la question n'est pas très descriptif/spécifique: s'il vous plaît ne hésitez pas à l'améliorer si vous le pouvez. – ChrisW

Répondre

3

Le composant d'interface utilisateur souhaité est appelé TreeTable (ou TreeTable). Il y en a various implementations en Javascript/HTML. Voici one qui utilise Javascript. Voici another one qui est pur HTML/CSS (mais ne pas réduire/développer)

+0

Merci beaucoup. – ChrisW

+0

Wow, je suppose qu'il y a une bonne réponse après tout. +1 pour comprendre la question qui, rétrospectivement, est parfaitement logique. :-) –

+0

On l'appelle aussi un "arbre de colonnes", par ex. http://www.google.ca/search?hl=fr&q=column+tree et http://extjs.com/deploy/dev/examples/tree/column-tree.html – ChrisW

0

UL, OL et LI sont bons à cette fin. Structurer comme JSON est encore mieux. Vous pouvez rendre le code HTML de JSON comme vous le souhaitez.

0

La question n'a pas de bonne ou de mauvaise réponse. Mais je vais répondre à cette question dans une question.

Si vous utilisez CSS, serait-ce en ajoutant quelque chose comme class = "niveau1" par class = "Level6" pour montrer le niveau d'imbrication ?

Non. Vous utiliseriez le sélecteur approprié dans CSS.

li { 
    // level one style 
} 

li li 
{ 
    // level two style 
} 

etc. 
+0

Je pensais avoir un attribut de classe que je pourrais ajouter au qui contient le titre de section. Je n'avais pas vu comment utiliser des listes imbriquées combinées avec des propriétés de type table-colonne. – ChrisW

+1

Voici un exemple d'une liste tabulaire: http://www.tbrown.org/ideas/tabularlist/ Bien que je pense que je n'utiliserais que des listes pour les branches, et utiliser des tableaux pour les feuilles. –

1

Vous parlez d'imbrication dans la structure hiérarchique de HTML. De par sa nature, vous n'avez pas vraiment besoin de faire un travail spécial.

Une liste simple et récursive est tout ce dont vous avez besoin, sans aucune considération particulière pour la profondeur ou quoi que ce soit. Vous pouvez même ajouter des fonctionnalités expand-collapse à n'importe quel niveau si vous le souhaitez sans trop de travail supplémentaire.

<ul> 
    <li> 
    <div class="task-group"> 
     <span class="task-title">Task 1</span> 
     <span class="task-status">Complete</span> 
     <ul> 
     <li> 
      <div class="task-group"> 
      <span class="task-title">Task 1a</span> 
      <span class="task-status">Complete</span> 
      </div> 
     <li> 
      <div class="task-group"> 
      <span class="task-title">Task 1b</span> 
      <span class="task-status">Incomplete</span> 
      </div> 
     </li> 
     </ul> 
    </div> 
    </li> 
</ul> 

Ensuite, vous le style que chaque tâche groupe d'avoir une marge par rapport à son parent de sorte que l'imbrication devient récursive. Configurez des puces sophistiquées (ou non) pour les tâches avec le style de li, et personnalisez le positionnement de la classe task-status pour le faire se présenter comme vous le souhaitez.

Vous pouvez également obtenir des sous-tâches inférieures pour hériter de façon récursive de la plus petite taille de texte en définissant une taille de texte relative dans le CSS. Quelque chose comme .75em, de sorte que chaque niveau est trois quarts plus petit que le niveau précédent.

Quelque chose comme ceci:

.task-group { 
    font-size: .75em; 
    margin-left: 1em; 
} 
.task-title { 
    text-decoration: underline; 
    float: left; 
} 
.task-status { 
    float: right; 
} 
+0

Cela ressemble à une réponse soignée; mais comment changeriez-vous le 'float: left' et le 'float: right' pour qu'il y ait plus de deux colonnes (par exemple 4 colonnes, composées d'un titre et de trois propriétés différentes)? Et, les objets flottants devraient-ils avoir une largeur explicite? – ChrisW

+0

@ChrisW, bien, dans le cas où vous avez plus de quelques colonnes, vous ne pouvez évidemment pas utiliser flotter de manière fiable.Aussi, je laisse des largeurs de cueillette et autres joyeusetés. Mon point était simplement que la nature hiérarchique de HTML rend ce genre d'imbrication très simple. Cependant, je crois que la réponse de Ykaganovich est la bonne. – Welbog

+0

Merci d'avoir répondu. Il est dommage que votre suggestion ne fonctionne pas pour plus de deux colonnes, parce que c'est attrayant: parce que, il semble que cela permettrait d'utiliser le même HTML à la fois pour la (première) mise en page et pour le (second) texte comme la mise en page, avec seulement un changement de CSS. En supposant que je puisse et que je spécifie une largeur pour chaque objet, pourquoi dites-vous que je "ne peux évidemment pas utiliser flottant de manière fiable"? Un exemple de flottement de plus de deux éléments semble être http://css.maxdesign.com.au/floatutorial/introduction09.htm – ChrisW

Questions connexes