upload/1537878428-72578-sanstitre.jpg Une question sans doute basique mais qui me perd depuis plusieurs jours (mes excuses pour la rédaction, je n'y connais rien en code, j'apprends par tâtonnements et tutoriels et c'est laborieux). J'utilise par ailleurs SPIP pour la création du site donc mon code contient des balises spécifiques à ce CMS (merci de m'orienter si c'est plutôt vers SPIP que se trouve la solution par ailleurs). Mon problème: garnir une cellule de tableau avec un contenu variable, de telle sorte que tout le contenu quel que soit le nombre d'éléments soit intégré dans une cellule unique, avec tous les éléments en "span" les uns à la suite des autres . La hauteur de la cellule doit s'adapter au nombre d'éléments rencontrés, mais pas la largeur, fixe. Le nombre d'éléments n'est pas connu à l'avance donc je ne peux pas définir un "colspan=x" en attribut du <code><td></code>.
Voici le rendu souhaité (index du site Le Monde diplomatique, site qui me sert de modèle! voir : https://www.monde-diplomatique.fr/index/sujet
Mon code actuel en html: <code><B_alphabet>
#SET{alphabet, #VALEUR}
<BOUCLE_alphabet(DATA){enum A,Z}>
<a href="##VALEUR">#VALEUR</a>
</BOUCLE_alphabet>
</B_alphabet>
<table>
<caption>
<div id="haut">
<span>[(#GET{alphabet})]</span>
<div style="clear:both;"></div></div>
</caption>
[(#REM) tab mots (invisible), stocke tous les mots-cles ]
<BOUCLE_tableaux(MOTS){tout}{par titre}{id_groupe=16} >
[(#SET{onelettre,[(#TITRE|onelettre)]})]
[(#SET{beginby[(#GET{onelettre}|unique)],#ARRAY})]
[(#SET{beginby[(#GET{onelettre})],[(#GET{beginby[(#GET{onelettre})]}|array_merge{#ARRAY{#TITRE,#ID_MOT}})]})]
</BOUCLE_tableaux>
[(#GET{onelettre}|foreach)]


<BOUCLE_alpha3(DATA){enum A,Z}>
<B_data>
<tbody>
<tr>
<td id="#VALEUR" class="lettre">[(#VALEUR)]</td>

<BOUCLE_data(DATA){source tableau, #GET{beginby#VALEUR}}{par cle}>

<td class="lesmots">

<span><a href="#URL_MOT{#VALEUR}" hreflang="#LANG">#CLE</a>• </span>


</td>

</BOUCLE_data>

</tr>
</B_data>
</tbody>
</BOUCLE_alpha3>
</table></code>
Le CSS associé (un extrait) :
<code>table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
table-layout: fixed;
}
tbody {
display: table-row-group ;
font-size: 100%;
vertical-align: baseline;
margin: 0px;
padding: 0px;
border-width: 0px;
border-style: initial;
border-color: initial;
border-image: initial;
outline: 0px;
background: transparent;
}
td.lesmots {
vertical-align: middle;
line-height: 1.4em;
padding: 20px 0px;
}
td, th {
display: table-cell;
}
</code> upload/1537878366-72578-lmd.jpg
Actuellement le contenu se réparti avec 1 item dans une cellule, et l'affichage est tronqué.
Je pose la question en dernier recours après des centaines d'essais sur le code et plusieurs semaines... Merci par avance de bien vouloir m'éclairer. en pj le rendu actuel, et le rendu sur Le Monde Diplomatique que je souhaite obtenir.
Modifié par Felipe (26 Sep 2018 - 09:26)
Administrateur
Bonjour,

en l'absence d'entêtes de ligne et de colonne, un tableau n'est pas le plus adapté mais ce n'est pas non plus contre-indiqué : ça fera l'affaire Smiley smile
Le code SPIP n'est pas nécessaire ici et il manque les règles CSS des span et a qui manifestement s'appliquent parce que sinon je n'explique pas le rendu actuel !
Pourrais-tu nous partager le code HTML généré (extrait de code source ou avec Firefox Examine l'élément table, Copier l'extérieur du code HTML) et les règles CSS appliquées à span et a s'il te plait ?
Il y a un display: inline-block ou flex qui traîne (sur td dans ce dernier cas, il serait un flex container que ça m'étonnerait pas vu que l'affichage est forcé sur 1 ligne…). Tente d'ajouter td { flex-wrap: wrap; } pour voir ?
Bonjour, merci infiniment pour votre réponse. Effectivement je n'avais pas défini quoi que ce soit pour le span, à part un ajout hier soir tentant à nouveau quelque chose:
 { span.after, span.before : box-sizing:unset; } 
qui me donne l'affichage surprenant aujourd'hui de toutes les lignes superposées. Il semble bien que la solution soit du côté du CSS. Par ailleurs s'ajoute un paramètre issu d'un plugin (que je n'ai pas appelé dans le html) pour générer facilement des tableaux et qui ajoute ceci :
[code-css]cimulti_colonnes_sans_marge *::before, *::after {
box-sizing: border-box;
}[/code]

J'ai rajouté comme suggéré un td flex-wrap mais ça n'a pas l'air de modifier quoi que ce soit. (j'avais tenté de me former sur les flex et grid mais j'ai eu beaucoup de mal à maîtriser tout cela et abandonné l'utilisation).
Pour préciser, il s'agit d'un index des mots-clés utilisés, l'en-tête du tableau est représentée par l'alphabet en haut (dont il faut que je change la présentation effectivement) et le clic sur une lettre amène à la ligne correspondante (ça au moins, ça marche!). Les balises SPIP me servent à faire des boucles sur les mots-clés de manière "propre". Le fichier html généré fait plus de 500 lignes je vous le joins en pj ainsi que le CSS en l'état actuel. Merci, je continue les essais.
[edit: je n'ai pas réussi à joindre les pdf alors mes excuses pour la longueur du message, ci-dessous le html et le css]



/* Archives / Index des mots-cles
-------------------------------------*/
/* Page des tags (art2486 / rubrique Archives) */
.minitags {
margin-top: 0.5em;
}
/* Page index, tri alphabetique des themes */
/* alphabet */
table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
table-layout: fixed;
}
table #haut {
margin: 0 0 20px ;
}
table #haut a{font-size:1.2em;border:0;color:#333;border-radius:20px;margin:0 -4px;padding:6px
10px;line-height:1.1em;display:inline-block;min-width:.8em}
table #haut .tags a {
font-size: 1.1em ;
color: #1b1b1b ;
line-height: 1.1em;
display: inline-block;
min-width: 0.8em;
border-width: 0px !important;
border-style: initial;
border-color: initial;
border-image: initial;
border-radius: 20px !important;
margin: 0px -4px;
padding: 6px 10px;
}
table #haut a:hover{color:#fff;background:#d4a66a !important;}
.tags a {
white-space: pre;
}
table .lettre{
font-size:4.5rem !important;
font-family: "Lucida Sans", "Lucida Sans Unicode", Helvetica, Arial, sans-serif;
font-weight:800 !important;
color: #dec887;
vertical-align:middle !important;
padding:0 20px 0 30px;
}
/* liste de mots-cles */
td.lesmots{padding:20px 0;vertical-align:middle;line-height:1.4em;}
.tags table{color:#ccc;}
.tags table td a,.tags table td a:hover{
background:none;
border:0;
color:#333;

font-size:1.1em;
line-height:1.4em;
margin:0;
padding:0;
}.
tags table td a:hover{color:#dec887;}
.tags table {
border-collapse: collapse;
border-spacing: 0px;
display: table;
}
tbody {
display: table-row-group ;
font-size: 100%;
vertical-align: baseline;
margin: 0px;
padding: 0px;
border-width: 0px;
border-style: initial;
border-color: initial;
border-image: initial;
outline: 0px;
background: transparent;
}
caption {
display: table-caption;
text-align: -webkit-center;
}
tr {
display: table-row ;
}
td.lesmots {
vertical-align: middle;
line-height: 1.4em;
padding: 20px 0px;
}
td, th {
display: table-cell;
}
td {
flex-wrap: wrap;
}
@media (max-width:959px)
.tags {
font-size:1.1rem;
}
@media (max-width:755px)
.tags {
font-size:1rem;
margin: 25px 0px;
}@
media (max-width: 959px)
.tags table td.lesmots a {
white-space: normal;
}
-2-
new 3 mercredi 26 septembre 2018 11:24
.tags table td a, .tags table td a:hover {
color: #1b1b1b !important;
font-size: 1rem;
line-height: 1.4em;
background: none;
border-width: 0px;
border-style: initial;
border-color: initial;
border-image: initial;
margin: 0px;
padding: 0px;
}.
lesmots span:after, .lesmots span:before {
color: #777;
/*box-sizing: unset;*/
}







<div class="tags">
<a href="#A">A</a>
<a href="#B">B</a>
<a href="#C">C</a>
<a href="#D">D</a>
<a href="#E">E</a>
<a href="#F">F</a>
<a href="#G">G</a>
<a href="#H">H</a>
<a href="#I">I</a>
<a href="#J">J</a>
<a href="#K">K</a>
<a href="#L">L</a>
<a href="#M">M</a>
<a href="#N">N</a>
<a href="#O">O</a>
<a href="#P">P</a>
<a href="#Q">Q</a>
<a href="#R">R</a>
<a href="#S">S</a>
<a href="#T">T</a>
<a href="#U">U</a>
<a href="#V">V</a>
<a href="#W">W</a>
<a href="#X">X</a>
<a href="#Y">Y</a>
<a href="#Z">Z</a>
<table>
<caption>

<div id="haut">
<span></span>
<div style="clear:both;"></div></div>
</caption>
<tbody>
<tr>
<td id="A" class="lettre">A</td>
<td class="lesmots">
<span><a href="spip.php?mot84" hreflang="fr">A.T.A.</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot69" hreflang="fr">Arts</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot30"
hreflang="fr">AstraZeneca</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot57" hreflang="fr">Attentats</a>•
</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="B" class="lettre">B</td>
<td class="lesmots">
<span><a href="spip.php?mot14" hreflang="fr">B.S.A.</a>•
</span>
</td>
</tr>
</tbody>

<tbody>
<tr>
<td id="C" class="lettre">C</td>
<td class="lesmots">
<span><a href="spip.php?mot11" hreflang="fr">C.P.I</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot82" hreflang="fr">Commission
Volcker</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot51" hreflang="fr">Commission on
wartime contracting (CWC)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot50" hreflang="fr">Committee on
Appropriations</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot68" hreflang="fr">Congrès</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot44" hreflang="fr">Corruption</a>•
</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="D" class="lettre">D</td>
<td class="lesmots">

<span><a href="spip.php?mot15" hreflang="fr">Département
d’Etat (DoS)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot17" hreflang="fr">Département de
la Défense (DoD)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot16" hreflang="fr">Département de
la Justice (DoJ)</a>• </span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="E" class="lettre">E</td>
<td class="lesmots">
<span><a href="spip.php?mot198" hreflang="fr">Economie</a>•
</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="G" class="lettre">G</td>
<td class="lesmots">
<span><a href="spip.php?mot31" hreflang="fr">General
Electric</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot79" hreflang="fr">Gouvernement

américain</a>• </span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="H" class="lettre">H</td>
<td class="lesmots">
<span><a href="spip.php?mot9" hreflang="fr">Hezbollah</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot26" hreflang="fr">House of
Representatives</a>• </span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="I" class="lettre">I</td>
<td class="lesmots">
<span><a href="spip.php?mot70" hreflang="fr">Industries de
santé</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot81" hreflang="fr">Institutions
américaines</a>• </span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="J" class="lettre">J</td>
<td class="lesmots">

<span><a href="spip.php?mot10" hreflang="fr">Jaysh
al-Mahdi</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot58" hreflang="fr">Johnson &amp;
Johnson</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot67" hreflang="fr">Justice</a>•
</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="L" class="lettre">L</td>
<td class="lesmots">
<span><a href="spip.php?mot63" hreflang="fr">Laboratoires
pharmaceutiques</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot53"
hreflang="fr">Littérature</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot73" hreflang="fr">Lutte
anti-corruption</a>• </span>
</td>

<td class="lesmots">
<span><a href="spip.php?mot80" hreflang="fr">Législatif
américain</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot85" hreflang="fr">Législation
américaine</a>• </span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="M" class="lettre">M</td>
<td class="lesmots">
<span><a href="spip.php?mot35" hreflang="fr">Milices </a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot33" hreflang="fr">Motion</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot55" hreflang="fr">Musique</a>•
</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="O" class="lettre">O</td>

<td class="lesmots">
<span><a href="spip.php?mot12" hreflang="fr">O.A.T.</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot83" hreflang="fr">ONG</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot74" hreflang="fr">Organismes
anti-corruption</a>• </span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="P" class="lettre">P</td>
<td class="lesmots">
<span><a href="spip.php?mot28" hreflang="fr">Pfizer</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot32" hreflang="fr">Plainte</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot86" hreflang="fr">Politique</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot91" hreflang="fr">Politique
américaine</a>• </span>

</td>
<td class="lesmots">
<span><a href="spip.php?mot88" hreflang="fr">Politique
américaine (intérieure)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot87" hreflang="fr">Politique
américaine (étrangère)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot92" hreflang="fr">Politique
iraquienne</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot90" hreflang="fr">Politique
iraquienne (intérieure)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot89" hreflang="fr">Politique
iraquienne (étrangère)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot54" hreflang="fr">Poésie</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot199" hreflang="fr">Pétrole</a>•
</span>
</td>
</tr>

</tbody>
<tbody>
<tr>
<td id="R" class="lettre">R</td>
<td class="lesmots">
<span><a href="spip.php?mot34" hreflang="fr">Recours</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot29" hreflang="fr">Roche</a>•
</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="S" class="lettre">S</td>
<td class="lesmots">
<span><a href="spip.php?mot13" hreflang="fr">SIGIR</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot78" hreflang="fr">Santé</a>•
</span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot48" hreflang="fr">Secrétaire
d’Etat</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot52" hreflang="fr">Senate

Democratic policy Committee (DPC)</a>• </span>
</td>
<td class="lesmots">
<span><a href="spip.php?mot27" hreflang="fr">Sénat</a>•
</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td id="T" class="lettre">T</td>
<td class="lesmots">
<span><a href="spip.php?mot76" hreflang="fr">Terrorisme</a>•
</span>
</td>
</tr>
</tbody>
</table>
</div>

ps: ne pas tenir compte de la ligne "new -2- mercredi..." dans le css, j'ai recopié le contenu du fichier pdf que j'avais créé dans le but de vous le mettre en pj et omis d'effacer cette ligne. Elle ne figure pas dans le fichier css.
Administrateur
Il y a une cellule TD par mot, ce n'est probablement pas souhaité et en tout cas ne figure pas dans l'exemple du Monde Diplo où il y a 2 TD par ligne TR de tableau et 1 à plusieurs span par cellule TD (et non toujours invariablement 1 span par TD généré).
Du coup c'est un problème de boucle SPIP (trop de TD)

Pour voir les éléments générés par SPIP, je recommande bordures et couleurs de fond ; ça facilite tellement le débogage Smiley smile

tr {
  border: 1px dotted red;
}
td {
  border: 1px solid #000;
}
td > span {
  margin: 3px;
  background-color: yellow;
}

Modifié par Felipe (26 Sep 2018 - 17:06)
Administrateur
En reprenant le code SPIP (comme quoi… Smiley rolleyes ), une fois la 1ère cellule créée, il ne faudrait pas que l'autre TD soit dans une boucle puisqu'il en faut toujours qu'une mais autour de la boucle

<tr>
<td id="#VALEUR" class="lettre">[(#VALEUR)]</td>
<BOUCLE_data(DATA){source tableau, #GET{beginby#VALEUR}}{par cle}>
<td class="lesmots">

<span><a href="#URL_MOT{#VALEUR}" hreflang="#LANG">#CLE</a>• </span>
</td>
</BOUCLE_data>


Dans chaque paire de lignes, il faudrait inverser la 1ère et la 2e
Modifié par Felipe (26 Sep 2018 - 17:10)
Meilleure solution
Effectivement, merci d'avoir cherché la source du problème. Suite à votre premier message concernant l'idée du "wrap" je suis en train de chercher comment l'intégrer, quelque chose comme ceci :

<td class="lesmots">
								[(#CLE|wrap{#COMPTEUR_BOUCLE|=={#TOTAL_BOUCLE}|?{<span><td>,<span>}})]				
								<span><a href="#URL_MOT{#VALEUR}" hreflang="#LANG">#CLE</a>• </span>
															
							
						 </td>

Pour le moment cela ne fonctionne pas mais la solution est proche! Merci de votre aide.
Je n'avais pas bien saisi votre message précédent : cela FONCTIONNE !! Hourra !! merci infiniment, c'était bien un problème d'ordre de déclaration de la boucle. Ah quel bonheur, merci beaucoup.
et en rajoutant un paramètre css : " width: 20%" à " table .lettre", le résultat est impeccable. Merci encore.