Не дозволяйте вмісту розширювати елементи сітки


153

TL; DR: Чи є щось подібне table-layout: fixedдо сіток CSS?


Я спробував створити календар з переглядом на рік з великою сіткою 4х3 на місяці, і в ній вкладено сітки 7х6.

Календар повинен заповнювати сторінку, тому контейнер з сіткою року отримує ширину та висоту 100% кожен.

.year-grid {
  width: 100%;
  height: 100%;

  display: grid;
  grid-template: repeat(3, 1fr) / repeat(4, 1fr);
}

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
}

Ось робочий приклад: https://codepen.io/loilo/full/ryXLpO/

Для простоти, кожен місяць у цій ручці є 31 день і починається в понеділок.

Я також обрав смішно невеликий розмір шрифту, щоб продемонструвати проблему:

Елементи сітки (= клітинки дня) досить стислі, оскільки на сторінці їх є кілька сотень. І як тільки мітки денних номерів стануть занадто великими (сміливо пограйте з розміром шрифту в ручці за допомогою кнопок в лівій верхній частині) сітка просто збільшиться в розмірі і перевищить розмір тіла сторінки.

Чи є спосіб запобігти такій поведінці?

Спочатку я оголосив, що сітка року на 100% шириною та висотою, тому, мабуть, із цього слід почати, але я не змогла знайти жодних властивостей CSS, пов’язаних із сіткою, які б відповідали цій потребі.

Відмова: Я знаю, що існують досить прості способи стилю цього календаря без використання CSS Grid Layout. Однак це питання скоріше стосується загальних знань з теми, ніж вирішення конкретного прикладу.


Що ви хочете, щоб це сталося натомість? Шрифт у кожній комірці може бути будь-якого розміру, і це ніколи не призводить до збільшення розміру комірки сітки?
Майкл Кокер

1
Саме так. В основному більш зручний спосіб того, що буде, якщо я встановити розміри елементів сітки відповідно до відсоткових значень замість дробів.
Лойло

Я в основному шукаю версію таблиці-верстки таблиці: виправлена ​​(див .: codepen.io/loilo/pen/dvxpvq?editors=1100 )
Loilo

7
Це найбільший біль за всю специфікацію CSS Grid. Їх потрібно встановити, коли ділянки сітки не можуть уникнути розмірів жодного з батьківських контейнерів сітки! Так, це кошмар для глибоко вкладених сітчастих структур.
Lonnie Best

Відповіді:


263

За замовчуванням елемент сітки не може бути меншим за розмір вмісту.

Елементи сітки мають початковий розмір min-width: autoі min-height: auto.

Ви можете перевизначити цю поведінку, встановлюючи елементи сітки в min-width: 0, min-height: 0або overflowз будь-яким значенням, крім visible.

З специфікації:

6.6. Автоматичний мінімальний розмір елементів сітки

Щоб забезпечити більш розумний мінімальний розмір за замовчуванням для елементів сітки, ця специфікація визначає, що autoзначення min-width/ min-heightтакож застосовує автоматичний мінімальний розмір у зазначеній осі до елементів сітки, overflowє visible. (Ефект аналогічний автоматичному мінімальному розміру, накладеному на гнучкі елементи).

Ось більш детальне пояснення, що стосується гнучких елементів, але воно також стосується елементів сітки:

Ця публікація також охоплює потенційні проблеми з вкладеними контейнерами та відомі відмінності щодо відображення серед основних браузерів .


Щоб виправити макет, внесіть ці корективи у свій код:

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;
  min-height: 0;  /* NEW */
  min-width: 0;   /* NEW; needed for Firefox */
}

.day-item {
  padding: 10px;
  background: #DFE7E7;
  overflow: hidden;  /* NEW */
  min-width: 0;      /* NEW; needed for Firefox */
}

переглянутий кодек


1fr проти minmax(0, 1fr)

Наведене вище рішення працює на рівні елемента сітки. Про рішення рівня контейнера див. У цій публікації:


3
Ого. Це захоплююче і цікаве водночас, і я б точно не придумав цього, просто спробувавши. Ви просто зазирнули в специфікацію для цієї інформації? Тому що після того, як не знав, для чого шукати Google, це те, що я намагався раніше, але в кінцевому підсумку прочитав неправильний розділ (після висновку про неправильну причину проблеми).
Лойло

1
Я раніше стикався з цією проблемою за допомогою гнучких предметів . Оскільки існує багато подібностей між елементами flex та grid, я подумав, що поведінка може бути однаковою та нульовою в цьому розділі специфікації.
Майкл Бенджамін

1
Він фіксує висоту, але продовжує рости в горизонтальному напрямку, min-width: 0;не допомагає. Я щось пропускаю?
користувач

2
Для вкладених сіток нам потрібно застосувати це на всіх рівнях. Але я дійсно прийшов сюди, щоб подякувати та подякувати ..
Стук


57

Попередня відповідь досить гарна, але я також хотів зазначити, що для сіток є фіксований макет, еквівалентний, вам потрібно просто написати minmax(0, 1fr)замість 1frрозміру доріжки.


6
Я рекомендую такий підхід щодо попередньої, прийнятої відповіді.
Тьєррі Прост

Хоча це працює, я його трохи не розумію ... Не могли б ви пояснити, чому це працює? Що робить minmax (0, 1fr)? Чи не завжди це має бути 0? Я розгублений :(
BAERUS

2
minmax(0, 1fr)працює, оскільки 1frце дійсно скорочення minmax(auto,1fr), що не є правильним значенням для початкового питання.
Мікко Ранталайнен

Додаткову інформацію див. У розділі github.com/w3c/csswg-drafts/isissue/1777
Mikko Rantalainen

1

Існуючі відповіді вирішують більшість випадків. Однак я зіткнувся з випадком, коли мені потрібен зміст комірки сітки overflow: visible. Я вирішив це, абсолютно розташувавшись в обгортці (не ідеально, але найкраще, що я знаю), як це:


.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;  
}

.day-item-wrapper {
  position: relative;
}

.day-item {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 10px;

  background: rgba(0,0,0,0.1);
}

https://codepen.io/bjnsn/pen/vYYVPZv


0

простіше зробити так, щоб встановити максимальну ширину елемента сітки так:

//for the container
.gridContainer{
    display: grid;
    grids-templates-column: repeat (12, 1fr);
 }

 //for the grid item
 .gridItem{
       max-width: 100%;
       grid-column: span 4  //4 can be any number from1-12 as we specified in the grid template
  }

Я маленький біт розгублений, якщо чесно. Ваш код взагалі не нагадує початкове запитання, і застосування максимальної ширини: 100% до елементів сітки (замість мінімальної ширини: 0 від прийнятого рішення) не вирішить питання ...
Loilo

Максимальна ширина не дозволить йому скоригуватися відносно ширини дитини
Pedro JR

Я спробував відтворити ваш код, і він насправді працює, але, здається, це не через максимальну ширину: 100%, а через колонку сітки: span 4; без визначення стартової колонки. Визначте початковий стовпчик (наприклад, використовуючи сітку-стовпчик: 1 / span 4;), і він знову порушить макет. (Така поведінка начебто дивна, але я впевнений, що в специфікації, де це визначено, є куточок.)
Лойло,

добре, звучить добре. але ви все ще не вважаєте довірою для мене
Педро JR

Якщо бути прямо відвертим: 1. Це було вирішеною проблемою вже протягом трьох років. 2. Ваша відповідь не перевірена належним чином (ваш CSS містить кілька помилок, які потрібно виправити, перш ніж браузер навіть розпізнає вашу сітку). І ваша відповідь насправді не стосується прикладу мого запитання (інакше ви зрозуміли б, що ваше рішення не працює з цим). - Так, ні, вибачте, але я не розглядаю нагороди.
Лойло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.