Почему процентное значение внутри сетки создает переполнение в сетке CSS?

Я бы хотел иметь такую ​​сетку:

.grid{
  display:grid;
grid-gap:50%;
  background-color:blue;
}
.grid-1{
  background-color:red;
}
<div class = "grid">
 <div class = "grid-1">
  test
 </div>
 <div class = "grid-1">
  test
 </div>
 <div class = "grid-1">
  test
 </div>
</div>

Я думаю, что это действительно большая проблема, потому что не все браузеры правильно понимают процентные значения.

Как решить эту проблему?

Приемы 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 сценарий полностью изменился.
3
0
1 704
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Первоначально мы не можем определить процент промежутка сетки, поскольку он зависит от высоты, поэтому мы игнорируем его (мы рассматриваем его как auto). Браузер сначала вычисляет высоту, учитывая такой контент:

console.info(document.querySelector('.grid').offsetHeight)
.grid {
  display: grid;
  background-color: blue;
}

.grid-1 {
  background-color: red;
  opacity:0.5;
}
<div class = "grid">
  <div class = "grid-1">
    test
  </div>
  <div class = "grid-1">
    test
  </div>
  <div class = "grid-1">
    test
  </div>
</div>

Эта высота используется в качестве эталона для расчета зазора, затем мы добавили его к высота (тот, который мы использовали для поиска зазора на основе содержимого). Это не приведет к повторному запуску вычисления высоты сетки, потому что это создаст цикл и будет иметь бесконечный цикл, поэтому браузер остановится здесь, и у нас будет переполнение.

console.info(document.querySelector('.grid').offsetHeight)

console.info(document.querySelector('.grid-1:nth-child(2)').offsetTop - document.querySelector('.grid-1:nth-child(1)').offsetTop - document.querySelector('.grid-1:nth-child(1)').offsetHeight)
.grid {
  display: grid;
  grid-gap:100%;
  background-color: blue;
  margin-top:50px;
}

.grid-1 {
  background-color: red;
  opacity:0.5;
  transform:translateY(-100%);
}
<div class = "grid">
  <div class = "grid-1">
    test
  </div>
  <div class = "grid-1">
    test
  </div>
  <div class = "grid-1">
    test
  </div>
</div>

Как видите, я использовал 100% и добавил некоторую трансформацию, чтобы увидеть, что зазор равен начальной высоте (код JS также подтверждает это).

Тривиальное решение - избегать процентных значений и использовать значения пикселей, чтобы браузер включил их в начальный расчет. Во всех случаях использование процентного значения нехорошо, это такая ситуация, когда вы не знаете "процент от чего?"

.grid {
  display: grid;
  grid-gap:50px;
  background-color: blue;
  margin-top:50px;
}

.grid-1 {
  background-color: red;
  opacity:0.5;
}
<div class = "grid">
  <div class = "grid-1">
    test
  </div>
  <div class = "grid-1">
    test
  </div>
  <div class = "grid-1">
    test
  </div>
</div>

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

https://www.w3.org/TR/css-sizing-3/#percentage-sizing


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

Почему высота моего элемента сетки вычисляется неправильно?

CSS Grid - ненужный разрыв слова

Почему процентное заполнение ломает мой гибкий элемент?

Спасибо за ответ. У меня два балла 1. 50% Зазор сетки означает 50% от суммы высот строк и ширины столбцов. После этого общую высоту можно легко вычислить. 2. Я ненавижу значения в пикселях, потому что они не реагируют. Есть ли возможность решить это?

Markus Schneider 01.12.2018 21:41

@MarkusSchneider нет, у вас есть цикл, это кажется вам простым, но это не так: представьте, что у вас есть элемент A с высотой, определяемой элементом B, а высота элемента B определяется в процентах от высоты A. Это В данном случае сетка - это A, а промежуток - B. Сначала мы определяем высоту A, а затем B, если мы вернемся к переопределению A, тогда мы будем обязаны переопределить B и так далее. Это никогда не кончится ... И, как я уже сказал, вам нужно спросить себя, "в процентах от чего?" даже ты вы не можете ответить на этот вопрос. Вы можете мне сказать% чего?

Temani Afif 01.12.2018 21:48

Я бы вычислил это так: строка высоты 1 + строка высоты 2 + строка высоты 3 + 0,5 * (3-1) * (строка высоты 1 + строка высоты 2 + строка высоты 3) = высота сетки. Итак, для меня на самом деле он вычисляет высоту строк, чем сетку, чем зазор, я бы вычислял высоту строк, зазор, сетку

Markus Schneider 01.12.2018 21:55

@MarkusSchneider, вы хотите, чтобы расчет был таким :) вы думаете, что так должно быть, но нет. Расчет выглядит следующим образом: (1) мы не можем разрешить зазор в сетке, потому что его процентное соотношение, мы перемещаем (2) мы вычисляем высоту сетки (в данном случае это сумма трех строк, но это может быть что-то еще в зависимости от других свойств ) (3) теперь у нас есть высота нашей сетки, мы можем решить зазор в сетке (4) мы добавляем зазор в сетке (5), у нас есть переполнение, и мы останавливаемся. Этот случай кажется простым, но проверьте ссылки, которыми я поделился, чтобы увидеть другую ситуацию, где она сложнее.

Temani Afif 01.12.2018 22:21

@MarkusSchneider не забывайте, что у нас могут быть поля, отступы и т. д., И для браузера нетривиально выполнить требуемый расчет. Промежуток сетки также является частью высоты сетки. Вы можете четко заметить это при использовании значения в пикселях, поэтому высота сетки - это не только строка, но также зазор, поля, отступы и т. д.

Temani Afif 01.12.2018 22:22

Итак, есть ли какое-либо возможное полностью гибкое решение проблемы?

Markus Schneider 01.12.2018 23:08

@MarkusSchneider - это зависит от того, как вы хотите, чтобы он реагировал, есть много способов. Мы не говорим об адаптивности, когда дело касается изменения ширины элемента, а не высоты. высота никогда не является проблемой для отзывчивости

Temani Afif 01.12.2018 23:10

Лучшим решением было бы мое решение, но правильное изменение размера div. Моя проблема в том, что у меня 5 столбцов в полноэкранном режиме и 3 для мобильных устройств. на полный экран (1920х1080) 50 пикселей не проблема. на 1366x768 это может быть проблемой, а для планшетов и мобильных телефонов существует так много разных типов, поэтому определение их в пикселях не является решением. Высота, с которой необходимо реагировать, представляет собой проблему при повороте экрана (например, мобильного телефона или планшета).

Markus Schneider 01.12.2018 23:15

@MarkusSchneider вы можете поделиться кодом? со столбцом у вас не будет проблем, как со строками

Temani Afif 01.12.2018 23:19

CSS для сетки: .grid {margin-left: 20%; маржа-право: 20%; дисплей: сетка; сетка-шаблон-столбцы: 1fr 1fr 1fr 1fr 1fr; сетка-гэп: 2%; выравнивание текста: центр; фон: # f7f7f7; отступ: 20 пикселей 5%; padding-top: 0 пикселей; }. Ширина div составляет точно 60%, и все столбцы имеют правильный размер (включая зазор). Так что я не понимаю ... Столбцы работают - строки не работают

Markus Schneider 01.12.2018 23:32

@MarkusSchneider со столбцом у нас нет проблемы, потому что ширина не определяется содержимым, таким как высота, поэтому цикла нет .. ширина составляет 100% родительской ширины, поэтому мы можем устранить пробел ... если ваш сетка - ваш единственный элемент, тогда он будет иметь ширину браузера, а затем мы 2% от этой ширины

Temani Afif 01.12.2018 23:41

Итак, мой css будет выглядеть следующим образом: grid-gap: 10px 2%; / * Пожалуйста, css научитесь вычислять высоту div * /

Markus Schneider 01.12.2018 23:53

@MarkusSchneider да, это сделает его отзывчивым по ширине, а высота будет рассчитана нормально;)

Temani Afif 01.12.2018 23:54

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