Bibliographie scientifique en CSS : horrible hack
Par Celui le mercredi 9 avril 2008, 18:21 - Geek - Lien permanent
Le but est d'avoir une jolie bibliographie sur ma page professionnelle qui reprend les us scientifiques, ça doit ressembler à ça :
[ABCD08] Titre de l'article
Noms des auteurs
Références exacte de l'article
Liens, etc.
[CDE07] Titre de l'article
Noms des auteurs
Références exacte de l'article
Liens, etc.
[Celui07] Titre de l'article
Noms des auteurs
Références exacte de l'article
Liens, etc.
J'ai voulu faire ça bien, genre je suis un gourou du web sémantique, xhtml et CSS. Seulement, ce n'est pas mon rayon, l'informatique théorique est assez éloignée des bonnes pratiques du web.
Voila à quoi ressemble[1] mon code HTML :
<ol class="publications">
<li id="ABCD08">
Titre<br />
Auteurs<br />
Références<br />
Autre
</li>
<li id="CDE07">
Titre<br />
Celui et al.<br />
Références<br />
Autre
</li>
<li id="Celui07">
Titre<br />
Celui<br />
Références<br />
Autre
</li>
</ol>
Puisque j'ai besoin d'utiliser des attributs id pour faire des
ancres, autant utiliser les ids des papiers, après tout, ils sont fait pour
ça.[2] Et puisque j'ai les id, pas la peine de les
réécrire.
Donc à ce point là, je me suis dit : Chouette, il suffit d'utiliser
l'attribut
id comme "bullet" pour mes items de liste, et c'est
gagné. En plus, c'est le navigateur qui va gérer la "tabulation" comme il le
fait pour les numérotations, ça va être trop simple.
Sauf que je n'ai pas trouvé comment faire,[3] et c'est là que commence le vilain hack CSS. Bon ça marche, mais si quelqu'un sait faire mieux, je suis preneur.
L'idée est de générer l'id de l'article et le placer grace au pseudo-element
:before. Seulement celui-ci fait parti intégrante de
<li> et n'est donc pas facilement manipulable. C'est
pourquoi j'utilise pour lui display: block ce qui a pour
conséquence de lui donner une ligne rien que pour lui. On place tout ce beau
monde en jouant sur les marges négatives.
Voici mon code CSS :
.publications {
list-style-type: none;
line-height: 2.5ex;
padding: 0;
margin: 0;
}
.publications > li:before {
display: block;
width: 8em;
margin-left: -8em;
margin-bottom: -2.5ex;
content: "[" attr(id) "]";
}
.publications > li {
padding-left: 8em;
}
Moralité : ce serait bien de pouvoir faire quelque chose du genre
list-style-text: child.attr(id);
(ou que j'apprenne mieux le CSS)
Notes
[1] j'ai simplifié ce qu'il y a dans les <li>
[2] L'attribut id ne peut pas commencer par
[
[3] Sur A List Apart il y a une astuce pour faire ça si le texte du "bullet" a une longueur fixe, ce qui n'est pas mon cas
Commentaires
Bonsoir Celui. Je ne suis ton blog que depuis quelques semaines mais il est fort sympathique.
Pour ce qui est de ton code, le problème vient plutôt de ton balisage xHTML. Dans ton cas, il convient d'utiliser une liste de définition, elles sont exactement faites pour cela. Voilà ce que cela pourrait donner :
<dl class="publications">
</dl>
Ensuite tu peux appliquer un css du genre :
dt {
float : left /* maintient du code à gauche */
}
dd {
margin-left : 10ex; /* déclalage des autres infos en ex pour etre extensible selon la longueur du code*/
clear : both; /* on evite les débordements disgracieux */
}
Je n'ai pas testé ce code-ci car écrit à la volée mais je peux garantir que l'idée générale est fonctionnelle
Les listes de définition sont peu utilisées, pourtant on peut faire des choses vraiment mignones avec. Des exemples cool :
http://www.pompage.net/pompe/listes...
Bon, ok, il y a toujours mieux à faire dans la vie qu'aligner ses balises au pixel près. Mais un design clean et valide en plus d'être beau, ça fait plaisir non ?
e-satis, merci beaucoup. Je vais utiliser les listes de définitions qui, en effet, semblent plus adaptées à mes besoins. Mon idée de base était d'éviter les doublons une ligne du genre :
<dt id="ABCD08">[ABCD08]</dt>Mais, après tout, ce n'est pas bien grave...
J'aurais tout de même tendance à penser que le dt devrait être réservé au titre de l'article. J'ai un peu de mal avec l'idée que l'objet de la définition soit un acronyme abscons. À moins qu'on y rajoute une balise acronym ?
@be-rewt : Oui il serait en effet plus sémantique de mettre le titre dans le dt. Ensuite on peut jouer sur les positions en relatif ou faire une combo float right et float left pour obtenir l'effet désiré. Après, est-ce que ça vaut le coup de passer 3h dessus ? L'informatique, c'est toujours un ratio travail / résultat à évaluer. Personnellement je préfère qu'il nous ponde un article dans le meme temps :-)
Bon, on ne peut pas éditer ses précédents post alors je double.
Je viens d'apprendre qu'on pouvait associer plusieurs <dt> à un <dd>. Le xHTML est plein de surprise ;-) Du coup ça résout notre problème. Et au passage un des miens que j'ai eu pas plus tard que cette semaine : comment caractériser dans une liste un élément donc le titre et l'image sont de meme importance ?
Bonne continuation !
@BeRewt, je ne vois pas le problème de mettre l'acronyme abscon dans le <dt> puisque justement il y a tous les <dd> ensuite pour bien le définir.
À quoi bon utiliser <acronym> alors que cette balise disparait dans les brouillons de HTML5 et XHTML2 au profit de <abbr> ?
@e-satis, Je ne blogue jamais au boulot ;-) donc le temps "perdu" sur mes questions sémantiques n'empiettent pas sur le temps de rédaction des prochains billets....
(Je viens d'apprendre au passage que le WHATWG avait un twitter)