28230 sujets

CSS et mise en forme, CSS3

Pages :
(reprise du message précédent)

Hello,

Le nombre de colonnes dépend de la taille de l'écran.

Avec les media queries, il me semble que la logique est la suivante :

Si place pour 9 colonnes (en gros 1800px)
grid-template-columns: repeat(9, var(--col-size));

Si place pour 8 colonnes (en gros 1600px)
grid-template-columns: repeat(8, var(--col-size));

etc...

Donc 9 media queries à aligner.

Ai-je bien compris ?
Administrateur
En retournant le problème je peux trouver une piste en inline-block ou inline-flex mais tu perdras l'avantage des colonnes de même hauteur :

#ced {
  width: fit-content; /* s'adapte à son contenu */
}

ul {
  display: inline-flex; /* s'adapte à son contenu */
  gap: 20px;
  padding: 0;
  justify-content: center;
  justify-items: center;
  border: 1px solid red;
}

li {
  display: flex;
  flex-direction: column;
  width: 200px;
}
Raphael a écrit :
mais tu perdras l'avantage des colonnes de même hauteur


Ne puis-je pas imposer une hauteur fixe aux li, puis à chacun des deux flex-items, de façon à trouver un équivalent à cette déclaration ?

div#ced > ul > li {display: grid; grid-template-rows: 20px 260px}


Je fais l'essai et reviens au plus vite.
Modifié par boteha_2 (21 Sep 2025 - 16:35)
Hello,

Codepen vite fait avec flex.

Les cartouches ont bien toutes la même hauteur mais ce n'est pas responsive.

Excuse-moi de te déranger encore mais vois-tu l'erreur ?
Hello,

Autrement, en version GRID dans la vie réelle j'ai testé cette déclaration :

div#ced > ul {--col-size: 170px; margin: 45px 0 0 0; display: inline-grid; column-gap: 20px; row-gap: 45px; justify-items: center;

@media (width <= 1000px) {/* mise en page petit écran */}
@media (width > 1000px) {grid-template-columns: repeat(2, var(--col-size))}
@media (width > 1190px) {grid-template-columns: repeat(3, var(--col-size))}
@media (width > 1380px) {grid-template-columns: repeat(4, var(--col-size))}
@media (width > 1570px) {grid-template-columns: repeat(5, var(--col-size))}
@media (width > 1760px) {grid-template-columns: repeat(6, var(--col-size))}
@media (width > 1950px) {grid-template-columns: repeat(7, var(--col-size))}
@media (width > 2140px) {grid-template-columns: repeat(8, var(--col-size))}
@media (width > 2330px) {grid-template-columns: repeat(9, var(--col-size))}
}


Un peu lourdaud mais cela fonctionne bien.
Ah oui, je crois me souvenir que px n'est pas la meilleure unité pour les media queries, peut-être faut-il transformer en rem ?
Administrateur
boteha_2 a écrit :
Excuse-moi de te déranger encore mais vois-tu l'erreur ?
Hello, oui il faut autoriser le flex-wrap dans un container flex pour pouvoir passer à la ligne.

boteha_2 a écrit :
Ah oui, je crois me souvenir que px n'est pas la meilleure unité pour les media queries, peut-être faut-il transformer en rem ?
Ce n'est pas une obligation mais une bonne pratique en général : ça permet plus facilement de s'adapter aux personnes qui augmentent leur taille de textes.
Bonjour Raphaël,

Encore merci pour le suivi.

Raphael a écrit :
Hello, oui il faut autoriser le flex-wrap dans un container flex pour pouvoir passer à la ligne.


J'ai corrigé le codepen.

Cela passe à la ligne, le résultat n'est pas merveilleux, fit-content est assez largué, mais je m'en fiche un peu car la solution des media queries elle fonctionne parfaitement.
Donc ce n'est peut-être pas la peine d'aller plus loin, je suis proche de cocher Résolu.

Pour le passage des px en rem c'est noté.

D'après votre guideline :

1rem = 16px

Est-ce une constante ou cela peut-il varier selon les réglages du navigateur client ?
Modifié par boteha_2 (22 Sep 2025 - 20:55)
Administrateur
boteha_2 a écrit :
1rem = 16px
Est-ce une constante ou cela peut-il varier selon les réglages du navigateur client ?

Non ce n'est pas une constante.

1rem = la taille de police de la racine du document (élément HTML) : dans la plupart des cas *et* si l'utilisateur n'a pas modifié ses réglages de taille par défaut, elle correspond à 16px.
Modérateur
Bonjour,

La piste avec fit-content et auto-fill et tes mediaqueires peut être adapter à ce que tu veut faire en gérant la taille du titre de la boite .

L'idée est de se servir du titre pour donner une largeur au conteneur principal via les mediaqueries valider par le nombre d'enfant disponible dans la grille, pour ne pas avoir de cellules vides.

Voici un exemple, qui utilise calc() et var() pour donner une largeur de X colonnes au titre (cela peut-être un autre conteneur ou un pseudo-element.

https://codepen.io/gc-nomade/pen/JoGoBmx

Base HTML reprise de démo:
<section>
  <h1>Titre</h1>
  <ul class="grid">
    <li>card 1</li>
    <li>card 2</li>
    <li>card 3</li>
    <li>card 4</li>
    <li>card 5</li>
  </ul>
</section>

Le CSS:
MediasQueries:
* {
  box-sizing: border-box;
}
/* reglage du nombre de colonnes via fit-content et largeur de H1 en fonction du nombre d'enfant */
:root {
  --qw: 1;
  @media (width > 1000px) {
    section:has(ul.grid li:nth-child(2)) {
      --qW: 2;
    }
  }
  @media (width > 1190px) {
    section:has(ul.grid li:nth-child(3)) {
      --qW: 3;
    }
  }
  @media (width > 1380px) {
    section:has(ul.grid li:nth-child(4)) {
      --qW: 4;
    }
  }
  @media (width > 1570px) {
    section:has(ul.grid li:nth-child(5)) {
      --qW: 5;
    }
  }
  @media (width > 1760px) {
    section:has(ul.grid li:nth-child(6)) {
      --qW: 6;
    }
  }
  @media (width > 1950px) {
    section:has(ul.grid li:nth-child(7)) {
      --qW: 7;
    }
  }
  @media (width > 2140px) {
    section:has(ul.grid li:nth-child(8)) {
      --qW: 8;
    }
  }
  @media (width > 2330px) {
    section:has(ul.grid li:nth-child(9)) {
      --qW: 9;
    }
  }
}

CSS de base

/* reduction de la largeur au contenu */
section {
  width: fit-content;
}
ul {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(12.5rem, 1fr));
  grid-auto-rows: 1fr;
}
h1 {
  color: gray;
  text-align: center;
  border-bottom: double;
  /* largeur minimale du conteneur */
  min-width: calc(12.5rem * var(--qW));
}


cdt
Bonjour,

Merci de votre suivi.

gcyrillus a écrit :
L'idée est de se servir du titre pour donner une largeur au conteneur principal via les mediaqueries valider par le nombre d'enfant disponible dans la grille, pour ne pas avoir de cellules vides.


Très intéressant comme toujours, mais, dans la mesure où l'on échappe pas au paquet de media queries, penses-tu qu'il existe un avantage par rapport à la solution de Raphaël qui fonctionne très bien ?

Raphael a écrit :
1rem = la taille de police de la racine du document (élément HTML) : dans la plupart des cas *et* si l'utilisateur n'a pas modifié ses réglages de taille par défaut, elle correspond à 16px.


Y a-t-il quelque chose à paramétrer dans le :root de la feuille CSS ?
Ce sujet doit être bien documenté, je vais chercher un peu, je reviens vers vous si nécessaire.
Modérateur
boteha_2 a écrit :
Bonjour,

Merci de votre suivi.

Très intéressant comme toujours, mais, dans la mesure où l'on échappe pas au paquet de media queries, penses-tu qu'il existe un avantage par rapport à la solution de Raphaël qui fonctionne très bien ?


Bonsoir, non, c'est une approche légèrement différente à partir de ce qui il y avait déjà dans le fil de la discussion pour garder le grid-layout et une hauteur similaire de lignes en lignes.

cdt