CSS Grid - Почему остается оставшееся место, когда единицы измерения меньше 0,15? - PullRequest
2 голосов
/ 22 сентября 2019

При определении макета сетки CSS я определил строки сетки следующим образом i:

grid-template-rows: repeat(7, 0.14fr)

Это привело к некоторому непонятному поведению, когда сетка отказалась распределятьоставшееся пространство полностью;вместо этого было немного свободного места прямо в конце.

enter image description here

Я пробовал то же самое, но на этот раз с использованием столбцов:

grid-template-columns: repeat(7, 0.14fr)

enter image description here

Это привело к тому же поведению.Затем я изменил значения следующим образом, увеличив 0.14fr до 0.15fr :

grid-template-rows: repeat(7, 0.15fr)

enter image description here

Это снова все исправило.Просто чтобы убедиться, что не было проблем с моей стороны, которые делали вещи странными, я настроил ту же ситуацию в Codepen: Weird CSS Grid - ручка .

Когда проблема повториласьСам я открыл Codepen на Chrome, чтобы увидеть, был ли он специфичным для браузера: это не так.То же самое случилось снова.Ниже я прикрепил простой код того, что я пытался сделать, с единицами fr , настроенными на 0.9fr , просто чтобы прояснить разницу.

.box {
  display: grid;
  height: 80vh;
  width: 400px;
  margin-right: 50px;
  box-sizing: border-box;
  background-color: black;
  border: 1px solid red;

  /* ----------  Weird stuff starts here ---------- */

  /*   grid-template-columns: repeat(7, 0.15fr); */
  grid-template-rows: repeat(7, 0.09fr);

  /* ----------  Weird stuff ends here ---------- */

}

.box .temp:nth-child(even) {
  background-color: white;
}

.box .temp:nth-child(odd) {
  background-color: cornflowerblue;
}
<div class="box">
  <div class="temp temp--1"></div>
  <div class="temp temp--2"></div>
  <div class="temp temp--3"></div>
  <div class="temp temp--4"></div>
  <div class="temp temp--5"></div>
  <div class="temp temp--6"></div>
  <div class="temp temp--7"></div>
</div>

Является ли это ошибкой, машинной проблемой, невинной маленькой причудой, просто как работает CSS-Grid и вычисляет fr единиц или это проблема конкретного браузера?

Примечание:

  1. Мой основной браузер - Firefox, но я пытался реплицироватьэто также в Chrome.

  2. Так как браузер вычисляет ширину fr на ходу, может быть вероятность того, что это может быть воспроизведено только намоя машина.(Я думаю? Не уверен.)

  3. Это может быть дополнительный случай, я согласен.Зачем определять fr единиц, используя меньшие числа, как показано ниже, когда я могу просто использовать числа больше 0.15 или 1 , на самом деле?Я столкнулся с этой проблемой (причудой?), Только когда набрал дробные значения макета;Я вычислил значения fr , разделив длину в пикселях дочерних элементов на длину в пикселях родительского контейнера, что, очевидно, меньше 1.

  4. Я использовал CSS, а не SASS, потому что подумал, что, возможно, препроцессор SASS делает что-то странное за кулисами (надумано, я знаю, но я не хотел рисковать).

  5. Точка останова между 0.14fr и 0.15fr может быть характерна только для моей машины.

1 Ответ

1 голос
/ 22 сентября 2019

При определении repeat(7,0.14fr) это означает, что вы будете брать из сетки 7*0.14fr = 0.98fr.Обратите внимание, что вам не хватает 0.02, чтобы получить 1, и это пространство, которое вам не хватает.

При определении repeat(7,0.15fr) это означает, что вы возьмете 7*0.15fr = 1.05fr.В этом случае вы покрываете всю область и даже больше, но нет больше .

От спецификации :

КаждыйДоля столбца или строки в оставшемся пространстве может быть вычислена как <flex> * <leftover space> / <sum of all flex factors>.

столбца или строки. Примечание. Если сумма коэффициентов изгиба меньше 1 , они получатдо соответствующей доли оставшегося пространства , вместо того, чтобы расширяться, чтобы заполнить все это.Это похоже на то, как Flexbox [CSS-FLEXBOX-1] действует, когда сумма значений гибкости меньше 1.

Если у нас сумма меньше 1, то каждый элемент будет принимать соответствующеепространство.В первом случае это 0.14fr (0.14* Height), а когда сумма больше 1, мы применяем формулу, и в этом случае, какое бы значение вы не использовали в repeat(7,x), вы получите:

(x/7*x) * Height = Height/7

По сути, вы просто делите на 7.

В вашем случае у вас есть два диапазона: от 0 до 1/7 = 0.1428.., где вам будет не хватать места.Тогда выше 1/7, где вы не будете:

.box {
  display: inline-grid;
  vertical-align:top;
  height: 100px;
  width: 100px;
  box-sizing: border-box;
  background-color: black;
  border: 1px solid red;
  grid-template-rows: repeat(7, var(--x));


}

.box .temp:nth-child(even) {
  background-color: white;
}

.box .temp:nth-child(odd) {
  background-color: cornflowerblue;
}
<div class="box" style="--x:0.05fr">
  <div class="temp temp--1"></div>
  <div class="temp temp--2"></div>
  <div class="temp temp--3"></div>
  <div class="temp temp--4"></div>
  <div class="temp temp--5"></div>
  <div class="temp temp--6"></div>
  <div class="temp temp--7"></div>
</div>
<div class="box" style="--x:0.1fr">
  <div class="temp temp--1"></div>
  <div class="temp temp--2"></div>
  <div class="temp temp--3"></div>
  <div class="temp temp--4"></div>
  <div class="temp temp--5"></div>
  <div class="temp temp--6"></div>
  <div class="temp temp--7"></div>
</div>
<div class="box" style="--x:0.14fr">
  <div class="temp temp--1"></div>
  <div class="temp temp--2"></div>
  <div class="temp temp--3"></div>
  <div class="temp temp--4"></div>
  <div class="temp temp--5"></div>
  <div class="temp temp--6"></div>
  <div class="temp temp--7"></div>
</div>
<div class="box" style="--x:0.1429fr">
  <div class="temp temp--1"></div>
  <div class="temp temp--2"></div>
  <div class="temp temp--3"></div>
  <div class="temp temp--4"></div>
  <div class="temp temp--5"></div>
  <div class="temp temp--6"></div>
  <div class="temp temp--7"></div>
</div>

<div class="box" style="--x:10fr">
  <div class="temp temp--1"></div>
  <div class="temp temp--2"></div>
  <div class="temp temp--3"></div>
  <div class="temp temp--4"></div>
  <div class="temp temp--5"></div>
  <div class="temp temp--6"></div>
  <div class="temp temp--7"></div>
</div>

<div class="box" style="--x:100fr">
  <div class="temp temp--1"></div>
  <div class="temp temp--2"></div>
  <div class="temp temp--3"></div>
  <div class="temp temp--4"></div>
  <div class="temp temp--5"></div>
  <div class="temp temp--6"></div>
  <div class="temp temp--7"></div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...