Разрешить строке сетки CSS заполнить доступное пространство

Я работаю с CSS-сетками и хочу, чтобы последняя строка моей CSS-сетки использовала все оставшееся пространство в оболочке, но в то же время я хочу, чтобы все остальные строки следовали стратегии min-content-strategy.

CSS для обертки:

.grid {
  width: 100%;
  height: 100%;
  display: grid;
  grid-template-columns: 100px auto;
  grid-auto-rows: min-content;
  row-gap: 7px;
  justify-items: start;
  align-items: start;
}

Моя первоначальная идея, как добиться этого, заключалась в том, чтобы просто добавить margin-top: auto к кнопке, как это можно сделать с помощью flexbox. Я также пытался установить grid-auto-rows: auto для оболочки сетки, но это тоже не работает.

Редактировать: Пример кода: https://jsfiddle.net/xt139o2g/ (я хочу, чтобы кнопка отображалась в правом нижнем углу div-оболочки)

.wrapper {
  border: 1px solid blue;
  height: 300px;
  width: 250px;
  padding: 10px;
}

.grid {
  width: 100%;
  height: 100%;
  display: grid;
  grid-template-columns: 100px auto;
  grid-auto-rows: min-content;
  row-gap: 7px;
  justify-items: start;
  align-items: start;
}

.button {
  grid-column: 1 / -1;
  justify-self: end;
  align-self: end;
}
<div class = "wrapper">
  <div class = "grid">
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div>
      R2C1
    </div>
    <div>
      R2C2
    </div>
    <div class = "button">
      Button
    </div>
  </div>
</div>

Заранее спасибо!

Можете ли вы добавить рабочий фрагмент?

Daniel_Knights 16.12.2020 09:19
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
1
767
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать функцию repeat, чтобы установить для первых двух строк минимальное содержание:

grid-template-rows: repeat(2, min-content);

Затем используйте display: flex на .button и сдвиньте его содержимое в правый нижний угол с помощью justify-content и align-items:

display: flex;
align-items: flex-end;
justify-content: flex-end;

Демонстрация: (я добавил границы, чтобы продемонстрировать расстояние.)

.wrapper {
  border: 1px solid blue;
  height: 300px;
  width: 250px;
  padding: 10px;
}

.grid {
  width: 100%;
  height: 100%;
  display: grid;
  grid-template-columns: 100px auto;
  grid-template-rows: repeat(2, min-content);
  row-gap: 7px;
}

.grid>div {
  width: 100%;
  height: 100%;
  border: 1px solid;
}

.button {
  display: flex;
  align-items: flex-end;
  justify-content: flex-end;
  grid-column: 1 / -1;
}
<div class = "wrapper">
  <div class = "grid">
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div>
      R2C1
    </div>
    <div>
      R2C2
    </div>
    <div class = "button">
      Button
    </div>
  </div>
</div>

Спасибо! Это действительно решает проблему, но я бы предпочел более динамичное решение, в котором можно обращаться только к последней строке, можно ли использовать что-то вроде grid-template-rows: repeat(rows-1, min-content);?

quieri 16.12.2020 10:25

Я не думаю, что есть тривиальный способ добиться этого, но вы можете приблизиться к нему, как показано ниже:

.wrapper {
  display:inline-block;
  border: 1px solid blue;
  height: 300px;
  width: 200px;
  padding: 10px;
}

.grid {
  width: 100%;
  height: 100%;
  display: grid;
  grid-template-columns: 100px auto;
  grid-template-rows:repeat(100,min-content) 1fr; /* big number here*/
}
.grid *:not(:last-child) {
  margin-bottom:7px; /* replace the gap */
}

.button {
  grid-column: 1 / -1;
  grid-row: 101; /* place it at the 1fr template */
  margin:auto 0 0 auto;
}
<div class = "wrapper">
  <div class = "grid">
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div>
      R2C1
    </div>
    <div>
      R2C2
    </div>
    <div class = "button">
      Button
    </div>
  </div>
</div>

<div class = "wrapper">
  <div class = "grid">
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div class = "button">
      Button
    </div>
  </div>
</div>

<div class = "wrapper">
  <div class = "grid">
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div>
      R1C1
    </div>
    <div>
      R1C2
    </div>
    <div class = "button">
      Button
    </div>
  </div>
</div>

Другие вопросы по теме