Обтікання сіткою CSS


126

Чи можна зробити обгортання сітки CSS без використання медіа-запитів?

У моєму випадку я маю недетерміновану кількість елементів, які я хочу розмістити у сітці, і я хочу її обернути. Використовуючи Flexbox, я не в змозі надійно просторувати речі. Я також хотів би уникнути купу медіа-запитів.

Ось приклад коду :

.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>

А ось GIF-зображення:

GIF-зображення того, що я бачу

Як зауваження, якщо хтось може сказати мені, як я міг би уникнути вказівки ширини всіх предметів, таких як я, grid-template-columnsце було б чудово. Я вважаю за краще, щоб діти вказували власну ширину.


2
grid-template-columns: auto auto auto auto;чи працює в цьому випадку? =)
Якуб Хлебович

Відповіді:


219

Використовуйте auto-fillабо auto-fitяк номер повторення repeat()позначення.

repeat( [ <positive-integer> | auto-fill | auto-fit ] , <track-list> )

auto-fill

Коли 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>

Сітка повторить якомога більше доріжок, не переповнюючи її контейнер.

Використовуючи автоматичне заповнення як номер повторення нотації повтор ()

У цьому випадку, враховуючи приклад вище (див. Зображення) , лише 5 доріжок можуть помістити сітку-контейнер без переповнення. У нашій сітці всього 4 елементи, тому п'ятий створюється як порожній трек у межах залишку.

Решта місця, що залишився, доріжка № 6, закінчує явну сітку. Це означає, що не було достатньо місця для розміщення ще однієї доріжки.


auto-fit

auto-fitКлючове слово поводиться так само , як auto-fill, за винятком того, що після алгоритму розміщення елемент сітки або порожні доріжки в межах простору, що залишилося будуть згорнуті в 0.

.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>

Сітка все одно повторить якомога більше треків, не переповнюючи її контейнер, але порожні доріжки будуть згорнуті на 0.

Згорнутий трек вважається функцією фіксованого розміру доріжки 0px.

Використання функції автоматичної підгонки як номер повторення позначення повтор ()

На відміну від auto-fillприкладу зображення, порожній п'ятий трек згортається, що закінчується явною сіткою відразу після 4-го елемента.


auto-fill проти auto-fit

Різниця між ними помітна при використанні minmax()функції.

Використовуйте minmax(186px, 1fr)ієрархію елементів з 186pxдо 186pxплюс частина залишковим простору в контейнері сітки.

При використанні auto-fillелементи виростатимуть, коли не буде місця для розміщення порожніх треків.

.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>

При використанні auto-fitелементи виростуть, щоб заповнити залишився простір, оскільки всі порожні доріжки згортаються на 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>


Ігровий майданчик:

CodePen

Перевірка автозаповнення доріжок

автоматичне заповнення


Огляд доріжок із автоматичною підгонкою

автоматична підгонка


3
Чи є якийсь спосіб зробити так, щоб він був центром тих, що перебувають у наступному рядку?
kentcdodds

Так само, як і у флексі, при display: gridвикористанні елементаjustify-content: center
Spittal

Шановний @Ricky Як зробити так, щоб перша властивість minmax, напр. repeat(auto-fill, minmax(186px, 1fr));це не пікселі, а так само, поки у div є текст всередині?
mesqueeb

1
@mesqueeb Це неможливо, потрібен певний розмір. Ви можете переглянути цю відповідь для отримання більш детальної інформації.
Рікі

1
Чи є спосіб зробити так, що, коли йому доведеться перейти до наступного рядка, два елементи знизяться замість лише одного? Так як від 4 до 2 до 1, а не має 4 до 3 до 2 до 1?
sammiepls

16

Ви хочете виконувати функцію auto-fitабо auto-fillвсередині неї repeat():

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

Різниця між ними стає очевидною, якщо ви також використовуєте a, minmax()щоб дозволити гнучкі розміри стовпців:

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

Це дозволяє вашим стовпцям згинати розміри, починаючи від 186 пікселів до стовпців однакової ширини, що тягнуться по всій ширині контейнера. auto-fillстворить стільки стовпців, скільки поміститься по ширині. Якщо, скажімо, підходить п'ять стовпців, хоча у вас є лише чотири елементи сітки, буде п'ятий порожній стовпець:

Введіть тут опис зображення

Використання auto-fitнатомість запобігає появі порожніх стовпців, при необхідності розтягне їх:

Введіть тут опис зображення


7

Ви можете шукати auto-fill:

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

Демо: http://codepen.io/alanbuchanan/pen/wJRMox

Щоб більш ефективно використовувати доступний простір, ви можете використовувати minmaxта передавати autoяк другий аргумент:

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

Демо: http://codepen.io/alanbuchanan/pen/jBXWLR

Якщо ви не хочете порожніх стовпців, ви можете використовувати auto-fitзамість них auto-fill.


2
Чи є якийсь спосіб зробити так, щоб він був центром тих, що перебувають у наступному рядку?
kentcdodds

3

У мене була схожа ситуація. Зверху на те, що ви зробили, я хотів зосереджувати свої стовпці в контейнері, не дозволяючи порожнім стовпцям для них ліворуч або праворуч:

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

Re «не дозволяючи порожні стовпці для них» : Ви маєте в виду «не дозволяючи порожні стовпці або для них» ( дотежабо )? Або «не дозволяючи порожні стовпці для них» (без до )? Або щось інше (воно, здається, не обчислює)?
Пітер Мортенсен

1

Ось моя спроба. Вибачте, пуху, я почувався зайвим творчим.

Мій метод - це батько divз фіксованими розмірами . Решта - це просто вміщення вмісту всередині цього діла відповідно.

Це дозволить змінити масштаб зображень незалежно від пропорції. Там не буде ніякого жорсткого підрізання або.

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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.