28221 sujets

CSS et mise en forme, CSS3

Bonjour à tous

J'ai du code (généré par JS) de la forme

<span class="radio">
    <label><input type="radio" name="type" value="programme"><span>Programme></label>
     <label><input type="radio" value= "concerts"><span>Concert</span></label>
    .....
    .....
</span>

et
span.radio {
  display: flex;
  flex-direction: column;
}

J'obtiens ceci
upload/1753891850-48769-radio-list.png
Pourquoi le bouton radio de "Autres" est-il plus grand que les autres ?
Modifié par PapyJP (30 Jul 2025 - 18:12)
Modérateur
Salut,

Tout simplement que ton code n'est pas valide !

1. l'élément <span> est de type inline. Ce qui veut dire que span > label > input (type inline block) n'est pas très cohérent. Si tu veux être plus pertinent, <fieldset> + <legend> sont plus appropriés Smiley cligne
2. cette ligne n'est pas du tout valide :

<label><input type="radio" name="type" value="programme"><span>Programme></label>


___
w3c validator est un ami Smiley cligne
Modifié par Niuxe (30 Jul 2025 - 18:43)
Modérateur
Bonjour PapyJP,

Comme le souligne @Niuxe, l'extrait de code présenté n'est pas valide.
Tu as probablement un cafouillage dans la structure HTML et l'application des styles. Ton gros bouton radio, se retrouve probablement en enfant direct d'une grille (flex ou grid), du coup il se trouve étiré sur toute la hauteur disponible de la cellule de grille qu'il occupe.

Par ailleurs,
je vois que tu utilise flex en colonne , autant se servir de grid qui se déroule en colonne par défaut et sera bien plus efficace.
Le résultat visuel attendu, ne nécessite pas l'usage de span si tu utilise un système de grille. Le code peut-être réduit aux éléments de formulaire distribués dans une grille.

Je te propose de nettoyer ton code de ces span et de distribuer en 2 colonnes les label et input via display:grid plutôt que flex.

coté HTML
1er option : label et input liés mais séparés :
  <fieldset>
    <legend> Affectez une catégorie à cette idée</legend>
    <input type="radio" id="idea1" name="idea1"> 
    <label for="idea1"> idée 1 </label>
    
    <!-- etc. -->
    
    <input type="submit" value="ok" >
  </fieldset>

2eme option reprenant ta structure avec les input dans les labels:
<fieldset>
    <legend> Affectez une catégorie à cette idée</legend>
     
    <label for="idea7"><input type="radio" id="idea7" name="idea7"> idée 7 </label>
    
    <!-- (liaison via for peut-être redondante) etc. -->
    
    <input type="submit" value="ok" >
  </fieldset>


Coté CSS
Pour la première et base de la seconde option:
fieldset {
  display:grid;/* au lieu flex column */
  grid-template-columns: 2em auto; /* 2 colonne pour label + input */
  align-items:center;/* alignement vertical, pas d'etirement */
  gap:.6em .2em; /* espacement entre les cellules */
}
legend {
  padding-inline:1em;
  font-weight:bolder;
}
[type="submit"] {
  grid-column:1/-1;
  margin-inline-end:auto;
}


Surcharge pour la seconde option: Les label reprennent la grille principale
#option2 label {
  display:grid;
  grid-column:1/-1;
  grid-template-columns:subgrid;
  align-items:center;
}


Tu peut voir et jouer avec ces codes ici https://codepen.io/gc-nomade/pen/VYvPMQp

Cdt
Merci pour cette réponse
Comme je l'ai dit plus haut, le code HTML est généré par JavaScript en modifiant le DOM.
Cela garantit normalement que le code est (à peu près) correct mais en contrepartie le code généré est parfois étrange.
Pour en avoir le cœur net j'ai remplacé le <span class="radio"> par <div class"radio"> et modifié le CSS en conséquence.
Le résultat est encore pire que le précédent
upload/1753951239-48769-radio-list2.png
Comme l'indique @gcyrillus la raison de cet aspect bizarre est l'utilisation de flex.
Jusqu'à présent je n'ai jamais utilisé grid, j'ai déjà du mal à m'y retrouver dans l'utilisation de flex, mais ça peut être une bonne occasion de m'y mettre.

La raison pour laquelle je n'ai pas utilisé <fieldset> au lieu de <span> ou <div> c'est que cet élément se trouve lui-même dans un <fieldset> qui inclut le bouton OK en bas et qu'on ne peut pas mettre un <fieldset> dans un <fielset> me semble-t-il.
Modifié par PapyJP (31 Jul 2025 - 10:47)