Ячейка минимального содержимого CSS Grid расширяется на основе соседа

У меня есть сетка CSS, состоящая из двух столбцов и пяти строк (при разрешении выше 768 пикселей). Для всех строк установлено значение «min-content», за исключением последнего, для которого установлено значение auto.
Я определил области сетки шаблона, по одной для каждой «ячейки», за исключением одной, которая охватывает строки с 3-й по 5-ю во втором столбце — с именем a6 (в примере кода)

Ячейка минимального содержимого CSS Grid расширяется на основе соседа

Когда контента в a6 мало или совсем нет, сетка ведет себя именно так, как я хочу. Однако, если добавить к а6 немного больше контента, области а5 и а7 увеличатся по высоте, несмотря на то, что их содержимое не изменится.

CSS:

    html,
    body {
      height: 100vh;
      padding: 0;
      margin: 0;
    }

    .maingrid {
      height: 100%;
      padding-left: 15px;
      padding-right: 15px;
      background-color: red;
      display: grid;
      grid-template-rows: min-content min-content min-content min-content min-content min-content min-content auto;
      grid-template-areas: 'a1' 'a2' 'a3' 'a4' 'a5' 'a6' 'a7' 'a8';
      grid-row-gap: .2em;
    }

    @media only screen and (min-width:768px) {
      .maingrid {
        grid-template-columns: 9fr 3fr;
        grid-template-rows: min-content min-content min-content min-content auto;
        grid-template-areas: 'a1 a2' 'a3 a4' 'a5 a6' 'a7 a6' 'a8 a6';
        background-color: darkcyan;
      }
    }

    .maingrid div {
      background-color: black;
    }

    .a1 {
      grid-area: a1;
      background-color: pink !important;
    }

    .a2 {
      grid-area: a2;
      background-color: aliceblue !important;
    }

    .a3 {
      grid-area: a3;
      background-color: aqua !important;
    }

    .a5 {
      grid-area: a4;
      background-color: blue !important;
    }

    .a4 {
      grid-area: a5;
      background-color: brown !important;
    }

    .a6 {
      grid-area: a6;
      background-color: burlywood !important;
    }

    .a7 {
      grid-area: a7;
      background-color: chartreuse !important;
    }

    .a8 {
      grid-area: a8;
      background-color: darkorange !important;
    }

HTML:

<main class = "maingrid">
  <div class = "a1">BLAH</div>
  <div class = "a2">BLAH</div>
  <div class = "a3">BLAH</div>
  <div class = "a4">BLAH</div>
  <div class = "a5">BLAH</div>
  <div class = "a6">
    at<br />at<br />
  </div>
  <div class = "a7">BLAH</div>
  <div class = "a8">
    <button type = "button" onclick = "BreakTheGrid();">click me :(</button>
  </div>
</main>

JS (просто чтобы кнопка переключения работала):

var isBroken = false;

function BreakTheGrid() {
  if (!isBroken) {
    $('.a6').html("the<br/>left<br />columns<br />have<br />expanded<br />boo!<br />");
  } else {
    $('.a6').html("no<br/>issue");
  }
  isBroken = isBroken == false;
}

Вот JSFiddle, воспроизводящий проблему: https://jsfiddle.net/up6afdj4/
Если вы нажмете кнопку в a8, вы можете переключить содержимое a6, таким образом переключая проблему.

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

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
2
0
518
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Замена auto на 1fr в определении grid-template-rows решает проблему.

Однако я не знаю почему, и если бы кто-то мог объяснить это лучше, я дам вам принятый ответ :)

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

Применяя auto к пятой строке, которая включает в себя область сетки a6, вы запускаете алгоритм растяжения сетки auto, который распределяет свободное пространство между строками, охватываемыми областью сетки (спецификация §11.5, §11.5.1 и §11.8).

Если вы переключитесь с auto на 1fr, последняя строка будет занимать все свободное место, закрепляя строки выше вверху.

исправленное демо

Более подробное объяснение распределения пространства auto смотрите в моих ответах здесь:

(Иллюстрации созданы Инспектор сетки Firefox DevTools.)

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