293 votes

Habillage de la grille CSS

Est-il possible de faire un habillage de grille CSS sans utiliser de media queries ?

Dans mon cas, j'ai un nombre non déterministe d'éléments que je veux placer dans une grille et je veux que cette grille soit enveloppante. En utilisant Flexbox, je ne parviens pas à espacer les éléments de manière fiable. J'aimerais également éviter de recourir à un grand nombre de media queries.

Voici quelques exemples de code :

.grid {
  display: grid;
  grid-gap: 10px;
  grid-auto-flow: column;
  grid-template-columns: 186px 186px 186px 186px;
}

.grid > * {
  background-color: green;
  height: 200px;
}

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Et voici une image GIF :

GIF image of what I'm seeing

Au passage, si quelqu'un peut me dire comment éviter de spécifier la largeur de tous les éléments comme je le fais avec grid-template-columns ce serait génial. Je préférerais que les enfants spécifient leur propre largeur.

2 votes

grid-template-columns: auto auto auto auto; fonctionne dans ce cas ? =)

512voto

Ricky Points 8950

Utilisez soit auto-fill ou auto-fit comme premier argument de la méthode repeat() la notation.

<auto-repeat> variante de la repeat() la notation :

repeat( [ auto-fill | auto-fit ] , [ <line-names>? <fixed-size> ]+ <line-names>? )

auto-fill

Lorsque auto-fill est donné comme le numéro de répétition, si la grille a un définitif taille ou la taille maximale dans l'axe concerné, alors le nombre de répétitions est le plus grand nombre entier positif possible qui ne fait pas déborder la grille de son conteneur.

https://www.w3.org/TR/css-grid-1/#valdef-repeat-auto-fill

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

La grille répétera autant de pistes que possible sans déborder de son conteneur.

Using auto-fill as the repetition number of the repeat() notation

Dans ce cas, étant donné l'exemple ci-dessus (voir image) Si l'on utilise la grille, seules 5 pistes peuvent être placées dans le conteneur de la grille sans déborder. Il n'y a que 4 éléments dans notre grille, donc un cinquième est créé comme une piste vide dans l'espace restant.

Le reste de l'espace restant, la piste n°6, termine la grille explicite. Cela signifie qu'il n'y avait pas assez d'espace pour placer une autre piste.


auto-fit

Le site auto-fit se comporte de la même manière que auto-fill sauf que qu'après placement des éléments de la grille toutes les pistes répétées vides sont réduites.

https://www.w3.org/TR/css-grid-1/#valdef-repeat-auto-fit

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

La grille répétera toujours autant de pistes que possible sans déborder de son conteneur, mais les pistes vides seront réduites à 0 .

Une voie effondrée est traitée comme ayant une fonction de dimensionnement de voie fixe de 0px .

Using auto-fit as the repetition number of the repeat() notation

Contrairement à la auto-fill Par exemple, la cinquième piste vide est effondrée, ce qui met fin à la grille explicite juste après le quatrième élément.


auto-fill vs auto-fit

La différence entre les deux est perceptible lorsque les minmax() est utilisée.

Utilisez minmax(186px, 1fr) pour classer les éléments de 186px à un fraction de l'espace restant dans le conteneur de la grille .

Lorsque vous utilisez auto-fill les articles grandiront lorsqu'il n'y aura plus d'espace pour placer des pistes vides.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Lorsque vous utilisez auto-fit les éléments vont s'agrandir pour remplir l'espace restant car toutes les pistes vides seront réduites en 0px .

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Terrain de jeux :

CodePen

Inspection des pistes de remplissage automatique

auto-fill


Inspection des chenilles auto-fit

auto-fit

13 votes

Y a-t-il un moyen de centrer ceux qui sont sur la ligne suivante ?

8 votes

Comme vous le feriez avec une boîte flexible, sur l'écran display: grid utilisation des éléments justify-content: center

3 votes

Cher @Ricky Comment faire pour que la première propriété de minmax, par exemple. repeat(auto-fill, minmax(186px, 1fr)); n'est pas de l'ordre du pixel, mais juste du moment que le div contient du texte ?

25voto

keithjgrant Points 4319

Vous voulez soit auto-fit ou auto-fill à l'intérieur de la repeat() fonction :

grid-template-columns: repeat(auto-fit, 186px);

La différence entre les deux devient apparente si vous utilisez également une fonction minmax() pour permettre des tailles de colonnes flexibles :

grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));

Cela permet à vos colonnes d'être flexibles en taille, allant de 186 pixels à des colonnes de largeur égale s'étendant sur toute la largeur du conteneur. auto-fill créera autant de colonnes que la largeur le permet. Si, par exemple, cinq colonnes tiennent, même si vous n'avez que quatre éléments de grille, il y aura une cinquième colonne vide :

Enter image description here

Utilisation de auto-fit au lieu de cela, empêchera les colonnes vides, en étirant davantage la vôtre si nécessaire :

Enter image description here

0 votes

Comment puis-je faire le contraire de "186 pixels pour des colonnes de largeur égale", c'est-à-dire que je veux que le système s'adapte automatiquement à des colonnes de largeur égale. jusqu'à des colonnes d'une largeur maximale de 186px ? -

19voto

alanbuchanan Points 1306

Vous recherchez peut-être auto-fill :

grid-template-columns: repeat(auto-fill, 186px);

Démonstration : http://codepen.io/alanbuchanan/pen/wJRMox

Pour utiliser l'espace disponible de manière plus efficace, vous pourriez utiliser minmax et passer dans auto comme deuxième argument :

grid-template-columns: repeat(auto-fill, minmax(186px, auto));

Démonstration : http://codepen.io/alanbuchanan/pen/jBXWLR

Si vous ne voulez pas des colonnes vides, vous pouvez utiliser auto-fit au lieu de auto-fill .

2 votes

Y a-t-il un moyen de centrer ceux qui sont sur la ligne suivante ?

2voto

farrellw Points 171

J'ai eu une situation similaire. En plus de ce que vous avez fait, je voulais centrer mes colonnes dans le conteneur tout en empêchant les colonnes vides de les déplacer vers la gauche ou la droite :

.grid { 
    display: grid;
    grid-gap: 10px;
    justify-content: center;
    grid-template-columns: repeat(auto-fit, minmax(200px, auto));
}

0 votes

Re "tout en n'autorisant pas les colonnes vides à leur place" : Voulez-vous dire " tout en n'autorisant pas les colonnes vides soit pour eux" ( à trop soit ) ? Ou "tout en ne leur permettant pas d'avoir des colonnes vides" (sans à ) ? Ou autre chose (cela ne semble pas calculer) ?

-4voto

I haz kode Points 319

Voici ma tentative. Excusez le superflu, Je me sentais très créatif.

Ma méthode est un parent div avec Correction de dimensions . Le reste consiste simplement à adapter le contenu de cette division en conséquence.

Cela permettra redimensionner les images, quel que soit le rapport d'aspect. Il y aura pas de recadrage difficile soit.

body {
    background: #131418;
    text-align: center;
    margin: 0 auto;
}

.my-image-parent {
    display: inline-block;
    width: 300px;
    height: 300px;
    line-height: 300px; /* Should match your div height */
    text-align: center;
    font-size: 0;
}

/* Start demonstration background fluff */
    .bg1 {background: url(https://unsplash.it/801/799);}
    .bg2 {background: url(https://unsplash.it/799/800);}
    .bg3 {background: url(https://unsplash.it/800/799);}
    .bg4 {background: url(https://unsplash.it/801/801);}
    .bg5 {background: url(https://unsplash.it/802/800);}
    .bg6 {background: url(https://unsplash.it/800/802);}
    .bg7 {background: url(https://unsplash.it/802/802);}
    .bg8 {background: url(https://unsplash.it/803/800);}
    .bg9 {background: url(https://unsplash.it/800/803);}
    .bg10 {background: url(https://unsplash.it/803/803);}
    .bg11 {background: url(https://unsplash.it/803/799);}
    .bg12 {background: url(https://unsplash.it/799/803);}
    .bg13 {background: url(https://unsplash.it/806/799);}
    .bg14 {background: url(https://unsplash.it/805/799);}
    .bg15 {background: url(https://unsplash.it/798/804);}
    .bg16 {background: url(https://unsplash.it/804/799);}
    .bg17 {background: url(https://unsplash.it/804/804);}
    .bg18 {background: url(https://unsplash.it/799/804);}
    .bg19 {background: url(https://unsplash.it/798/803);}
    .bg20 {background: url(https://unsplash.it/803/797);}
/* end demonstration background fluff */

.my-image {
    width: auto;
    height: 100%;
    vertical-align: middle;
    background-size: contain;
    background-position: center;
    background-repeat: no-repeat;
}

<div class="my-image-parent">
    <div class="my-image bg1"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg2"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg3"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg4"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg5"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg6"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg7"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg8"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg9"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg10"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg11"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg12"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg13"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg14"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg15"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg16"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg17"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg18"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg19"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg20"></div>
</div>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X