Почему высота строки CSS Grid отличается в Safari?

Я использовал CSS Grid для создания сложного макета сетки, где элементы сетки имеют разную высоту и ширину. Высота строк сетки установлена ​​​​на 1fr, чтобы она была пропорциональна высоте сетки. Некоторые элементы сетки имеют grid-row: span 2 или grid-row: span 3.

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

Все это отлично работало в Chrome и Firefox и даже в IE с помощью префикса -ms-.

В Safari другая история:

Однако в Safari строки сетки, кажется, не вычисляются таким же образом — высота строк в Safari намного, намного короче, чем в любом другом браузере, что портит макет. Почему это?

Удаление абсолютной позиции из элемента сетки не меняет высоту строки. Но кажется, что размещение height: 0 в оболочке сетки приводит к тому, что высота строки в Safari ведет себя так же, как в Chrome и Firefox. В чем причина этого?

Код:

Кодовое слово: https://codepen.io/katrina-isabelle/pen/rRqvXq

.grid-wrapper {
  position: relative;
  padding-bottom: 60%;
}

.grid {
  display: grid;
  grid-gap: 2px;
  grid-template-columns: 29% 21% 21% 29%;
  grid-auto-rows: 1fr;
  position: absolute;
  width: 100%;
  height: 100%;
}

.grid-item {
  width: 100%;
  color: #ccc;
  background: #ccc;
}
.grid-item--1 {
  grid-row: span 2;
}
.grid-item--2 {
  grid-row: span 3;
}
.grid-item--3 {
  grid-row: span 2;
}
.grid-item--4 {
  grid-row: span 3;
}
.grid-item--5 {
  grid-row: span 2;
}
.grid-item--6 {
  grid-row: span 3;
}
.grid-item--7 {
  grid-row: span 2;
}
.grid-item--8 {
  grid-row: span 2;
}
.grid-item--9 {
  grid-row: span 1;
}
<div class = "grid-wrapper">
  <div class = "grid">
    <div class = "grid-item grid-item--1">
      Grid item
    </div>
    <div class = "grid-item grid-item--2">
      Grid item
    </div>
    <div class = "grid-item grid-item--3">
      Grid item
    </div>
    <div class = "grid-item grid-item--4">
      Grid item
    </div>
    <div class = "grid-item grid-item--5">
      Grid item
    </div>
    <div class = "grid-item grid-item--6">
      Grid item
    </div>
    <div class = "grid-item grid-item--7">
      Grid item
    </div>
    <div class = "grid-item grid-item--8">
      Grid item
    </div>
    <div class = "grid-item grid-item--9">
      Grid item
    </div>
  </div>
</div>

Насколько я помню, Safari не нравится единица %, которую вы использовали для .grid. В общем, я бы использовал для макетов сетки в сафари display: flex. Но это только мои личные предпочтения.

Demian 26.03.2019 00:35

@Demian Просто хотел отметить, что если вы проверите элементы, вы увидите, что элемент .grid расширяется, чтобы заполнить высоту своего родителя, это строки внутри сетки, которые не расширяются. Как бы вы воссоздали этот макет во flex?

kisabelle 26.03.2019 17:51

С родительским флексом и дочерними встроенными флексами.

Demian 26.03.2019 19:32

@Demian Хотелось бы увидеть пример. Я только что попробовал display: flex на .grid и display: inline-flex на .grid-items, и это сломало макет

kisabelle 26.03.2019 19:48
Приемы 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 сценарий полностью изменился.
16
4
6 036
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

(Публикация в качестве ответа для включения изображений.) Я получаю эти результаты с Safari и Chrome (Vivaldi) после предложенного вами исправления с настройкой height: 0. Как вы говорите, это увеличивает высоту div из почти свернутого состояния в Safari.

Мне интересно: это решение слева, к которому вы стремитесь, или оно должно быть как справа? Если альтернатива слева — ваша цель, вы можете получить те же результаты, установив grid-auto-rows: auto на .grid. Я предполагаю, что в обоих случаях (height: 0 и grid-auto-rows: auto) вы каким-то образом эффективно избегаете вычисления высоты как доли высоты .grid-wrappers.

Я не могу сказать, почему Safari делает это по-другому, но — прагматично — я бы лично рассмотрел возможность использования областей сетки вместо промежутков для размещения элементов — по крайней мере, если макет задан правильно.

Тот, что справа, является желаемым макетом. В одном слева похоже, что вы скопировали мой SCSS, но не включили препроцессор SCSS.

kisabelle 26.03.2019 17:41

Не могли бы вы привести пример использования областей сетки вместо промежутков? Я новичок в сетке и не знаком с этой концепцией

kisabelle 26.03.2019 17:49

Вместо height: 100% в контейнере сетки (.grid) используйте height: 100vh.

Или, если вы действительно хотите использовать проценты, убедитесь, что родитель имеет определенную высоту. Некоторые браузеры до сих пор придерживаются старого правила относительно высоты в процентах, а именно:

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

Подробнее здесь:

Во втором абзаце я упомянул, что пытаюсь сохранить соотношение сторон сетки, поэтому 100vh не подходит для моего варианта использования. Определение высоты в пикселях означает, что мне придется создавать много медиа-запросов, чтобы сохранить соотношение сторон, поэтому я использовал трюк с процентным заполнением. Я бы предпочел использовать трюк height: 0, чем писать все эти медиа-запросы

kisabelle 26.03.2019 17:47
height: 100vh — это процент, но он относится к области просмотра. Другой вариант, который я представил, также является процентным, но реализован в соответствии с правилами спецификации.
Michael Benjamin 26.03.2019 18:00

Таким образом, родитель (.grid-wrapper) не имеет определенной высоты, потому что высота задается отступом — именно так поддерживается соотношение сторон. Любые идеи о том, как я могу сохранить соотношение сторон, если я определяю высоту родителя или .grid?

kisabelle 26.03.2019 18:11

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

kisabelle 26.03.2019 18:13
Ответ принят как подходящий

У меня была аналогичная проблема в Safari 12+, так как я также использовал отступы для принудительного соотношения сторон в макете на основе сетки. Я не уверен, что это та же проблема, что и у вас, но приведенное ниже исправление работает для меня на вашей ручке в Safari.

TLDR: поместите display:grid на div, окружающий контейнер сетки. Вот он в действии: https://codepen.io/harrison-rood/pen/rNxXWPb

После того, как я несколько часов рвал на себе волосы, я решил попробовать поместить display:grid на обертку вокруг моей основной сетки, и это сработало отлично! Я понятия не имею, почему это исправит это, но я предполагаю, что это дает Safari больше контекста в родительском контейнере и позволяет height:100% ссылаться на контекст сетки вместо родителя, подобно тому, как Chrome и Firefox обрабатывают это с помощью По умолчанию. Меня это так расстроило, что я почувствовал себя обязанным создать учетную запись SO, чтобы опубликовать это! Надеюсь, поможет!

Спасибо, что поделились этим решением! Как я уже упоминал в своем OP, вы также можете добавить height: 0, чтобы исправить это. Очень загадочно. Я думаю, что display: grid кажется лучшим подходом, но в любом случае никогда не помешает иметь несколько вариантов.

kisabelle 04.09.2020 20:53

Супер странно, да? Я хотел бы знать, ПОЧЕМУ это работает, но пока я не смог это понять.

hrood 12.09.2020 19:46

Вау, это сработало и для меня! Очень странно, но спасибо за решение!

Sacha 30.12.2020 13:27

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