28172 sujets

CSS et mise en forme, CSS3

Bonjour,

Dans son livre sur Grid Raphaël donne un exemple de galerie d'images fluide sans Media Queries (TP 7).

grid-template-colums: repeat (auto-fit, minmax(250px, 1fr))


Le nombre de colonne s'adapte automatiquement à la taille de l'écran.

Mon problème est que je dois être limité à deux colonnes quand l'écran est assez grand, puis passer en une colonne.

Il s'agit d'un bloc de boutons, actuellement dans une table, voir le codepen

Pour compliquer un peu les choses la largeur des éléments est définie par leur contenu.

Merci de votre aide.
Modifié par boteha_2 (07 May 2023 - 21:05)
Bonsoir,

Oui, mais là du coup il s'agit de la mise en forme d'un tableau non ? Un tableau est une structure bien particulière qui n'a rien à voir avec les autres éléments html. Pour ces derniers on pourra les positionner avec l'API Grid Layout ; pour les tableaux, c'est une autre paire de manche...
Bonjour,

Je peux changer la structure html, aucun problème.

Par exemple une DIV et des p, c'est fait sur le codepen.

Je peux passez en 2 colonnes, facile.
Mais comment faire pour passer en une colonne sans Media Queries ?

Je veux dire jamais plus de 2 colonnes et une seule colonne si pas la place.
Modifié par boteha_2 (07 May 2023 - 21:06)
Modérateur
Bonsoir,

CSS peut faire les deux, mais pas en même temps Smiley cligne

auto-fill ou fit en grid, ne permet pas de déterminer un nombre de colonnes maximum , CSS column peut s'en passer en n'indiquant qu'une largeur (approximative) et tout deux auront besoin d'un max-width pour palier au mediaqueries que tu ne veut pas.

rapidement et pas bien pensé, voici quelques exemples pour donner des idées de départ : https://codepen.io/gc-nomade/pen/abRqVRM mais la seule façon qui tiendra la route c'est avec des mediaqueries à mon humble avis avec grid ou un tableau .

Les mediaqueries passent partout ... sauf cas rare, je suis surpris que tu veuilles en faire l'impasse. (firefoxe me propose de corrigé l'orthographe de mediaqueries en merd@...ue! , aucun rapport j'imagine Smiley smile )

cdt
Modérateur
Bonjour,

Il me semble que la propriété css columns fait très bien ça.

Quand on met par exemple un columns: 20rem 2; sur un conteneur, les éléments sont répartis en 2 colonnes (mais pas plus que 2) s'il y a assez de place (c'est à dire ici si la largeur du conteneur est d'au moins 40rem), et s'il n'y a pas assez de place, ils sont affichés sur 1 seule colonne.

Exemple:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<style>
.container {
	columns: 20rem 2;
}
</style>
</head>
<body>
<div class="container">
<p><a href="#" class="av">Terminer la commande</a></p>
<p><a href="#" class="ar">Modifier le panier</a></p>
<p><a href="#" class="ar">Modifier l'identité</a></p>
<p><a href="#" class="pa">Nouvelle recherche</a></p>
<p><a href="#" class="su">Supprimer commande</a></p>
</div>
</html>

Amicalement,
Bonjour,

Merci de votre suivi.

gcyrillus a écrit :
Les mediaqueries passent partout ... sauf cas rare, je suis surpris que tu veuilles en faire l'impasse


Je n'ai rien contre les Media Queries, je les utilise beaucoup.
Mon problème est que comme la largeur est définie par le contenu je ne la connais pas.
Mais comme le contenu est connu la largeur peut être mesurée, je suppose, et indépendante du navigateur.
Pas besoin de faire le calcul dynamique avec JS, je mesure la largeur et crée la media querie au pixel près.
Je pense que c'est la piste la plus sûre.

Cela dit ce pourrait être un développement intéressant de GRID, une sorte de wrap pour apssage à la ligne si manque de place.

parsimonhi a écrit :
Il me semble que la propriété css columns fait très bien ça.


Je connais cette propriété très intéressante.

Mais là cela ne me semble pas adapté à cause des cellules vides que j'ai besoin de supprimer dans le passage en une colonne.
Modérateur
boteha_2 a écrit :
Bonjour,

Merci de votre suivi.

....
Cela dit ce pourrait être un développement intéressant de GRID, une sorte de wrap pour apssage à la ligne si manque de place.


... CSS column
Je connais cette propriété très intéressante.

Mais là cela ne me semble pas adapté à cause des cellules vides que j'ai besoin de supprimer dans le passage en une colonne.

Ces deux là ont cette incompatibilité similaire pour ton cas. (que j'ai essayé de démontré dans le codepen approximatif Smiley smile )
* impossible de réduire à 2 colonnes maximum (sauf à utilisé un mediaquerie ou un max-width approximatif)
* l'obligation de données au mieux une largeur minimale aux colonnes (largeur à la louche)

Quelle pistes te restent t-il ?
Les mediaqueries et grid ou un tableau en switchant le nombre de colonne(grid) ou display.

Une autre piste peut-être un tableau ou un grid de 2 colonnes en width:max-content et une pointe de javascript qui compare la largeur de la grille et la largeur disponible au chargement de la page (le onresize n'est pas forcement nécessaire). https://codepen.io/gc-nomade/pen/QWZQzYz
Dans l'exemple, j'y ajoute un container querie qui pointe le bout de son nez :
/* CONTAINER QUERIE  de l'exemple linker similaire au js*/
.parent {
  container: parent / inline-size;
}
@container parent (max-width: 350px) {
  div.grille {
    grid-template-columns: auto;
  }
}


C'est prometteur :
support actuel : https://caniuse.com/css-container-queries
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries

Cdt
Modifié par gcyrillus (08 May 2023 - 14:47)
gcyrillus,

Merci pour ces nouvelles pistes, c'est très intéressant.

Mais comme je peux mesurer la largeur du tableau, même si aucune largeur n'est fixée, je penche plutôt pour la piste d'un GRID avec media queries.

Je m'y mets dès que j'ai le temps, je vous tiens informés.
Bonjour,

J'ai bêtement estimé la largeur de la table puis déclaré un media queries quand la fenêtre atteint la largeur de la table.

@media screen and (max-width: 320px)
{
table tr {display: grid}
}


L'inconvénient est qu'il faut calculer la largeur de la table, cette largeur pouvant changer si le contenu de la table est modifié, mais cette solution me semble simple et robuste.

Voir le codepen.

Merci de votre aide.

Je coche Résolu.