Необъяснимая высота строки сетки в IE и Edge

Я отредактировал пример CodePen, чтобы добавить некоторый контент в центральный div с высотой во всех контейнерах div, и он явно не работает, см. Здесь:

https://codepen.io/anon/pen/OEBxNr

Эти строки, кажется, вызывают указанный ниже пробел:

.container {
   ... 
   -ms-grid-rows: 1fr 1fr 1fr;
}

.top {
   ...
   height 8.4rem;
}

Но у меня все еще осталась вторая проблема ниже, которую можно увидеть в CodePen выше.

У меня есть контейнер приложения, в котором есть навигация вверху, страница посередине и нижний колонтитул внизу. Мой макет отлично работает во всех браузерах, кроме IE и Edge.

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

body, html {
  height: 100%;
}

.container {
    background:cyan;
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    grid-template-rows: minmax(auto, auto);
    display: -ms-grid;
    -ms-grid-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
    -ms-grid-rows: 1fr 1fr 1fr;
    height: 100%;
}

.top {
  background: yellow;  
  height: 8.4rem;
  position: relative;
  z-index: 99;
  grid-column: 1 / span 12;
  grid-row: 1;
  background: pink;
  -ms-grid-column: 1;
  -ms-grid-column-span: 12;
  -ms-grid-row: 1;
}

.mid {
  grid-column: 1 / span 12;
  grid-row: 2;
  min-width: 0;
  background: yellow;
  -ms-grid-column: 1;
  -ms-grid-column-span: 12;
  -ms-grid-row: 2;
  height: 100%;
}

.bottom {
    background: purple;
    -ms-grid-column: 1;
    -ms-grid-row: 3;
    -ms-grid-column-span: 12;
}
<body>
    <div class='container'>
        <div class='top'>TOP</div>
        <div class='mid'>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
            <p>some long text some long text some long text some long text</p>
        </div>
        <div class='bottom'>
            <p>some short text</p>
        </div>
    </div>
</body>


person S. Schenk    schedule 22.06.2018    source источник
comment
Не могу воспроизвести проблему. Я не вижу промежутков между рядами на Edge. jsfiddle.net/x2mva6hp/2   -  person Michael Benjamin    schedule 23.06.2018
comment
Первый вопрос, на котором вы должны сосредоточиться, - это использование height: 100% в контейнере. Это может быть причиной проблемы. Некоторым браузерам по-прежнему требуется определенная высота для родительского элемента, чтобы процентная высота работала для дочернего элемента. Либо добавьте height: 100% к элементам html и body, либо переключитесь на height: 100vh в контейнере. Подробности здесь и здесь.   -  person Michael Benjamin    schedule 27.06.2018
comment
Это то, что вам нужно в IE11: codepen.io/anon/pen/rKqYJr   -  person Michael Benjamin    schedule 27.06.2018
comment
Нет промежутка между первым и вторым рядами, на котором виден голубой фон. Ряды должны укладываться без зазоров. Заполнение всего необходимого места, чтобы занять весь экран без отображения внешнего контейнера.   -  person S. Schenk    schedule 27.06.2018
comment
@Michael_B Растяните демонстрационный раздел пера кода на больший экран, и вы увидите, что средний раздел не выровнен по верхнему краю. Между ним и первой строкой есть промежуток, как и на скриншоте, который я прикрепил выше.   -  person S. Schenk    schedule 27.06.2018
comment
В своем вопросе вы упомянули, что макет отлично работает во всех браузерах, кроме Edge или IE. Поэтому я скорректировал код для макета в IE, чтобы имитировать внешний вид в Chrome и Firefox, что он и делает в моем коде.   -  person Michael Benjamin    schedule 27.06.2018
comment
Прости, мой друг. Я только приступаю к работе. Придется вернуться позже.   -  person Michael Benjamin    schedule 27.06.2018


Ответы (2)


В соответствии с текущим расположением кода все версии браузеров Microsoft, которые имеют какую-либо поддержку Grid (а это означает, что устаревшая сетка IE10-11, устаревшая сетка Edge HTML12-15 и совместимая сетка Edge HTML16 и 17) получают следующее объявление устаревшей строки:

-ms-grid-rows: 1fr 1fr 1fr;

Обратите внимание, что последние совместимые версии Edge понимают как стандартный, так и устаревший синтаксис -ms, поэтому важно не ставить этот устаревший синтаксис в последнюю очередь. Объявление устаревших версий должно предшествовать любым объявлениям стандартного синтаксиса.

Принимая во внимание, что все совместимые версии Firefox, Chrome и т. Д. Получают:

grid-template-rows: minmax(auto, auto);

Функция minmax () будет обрабатывать неравное содержимое намного лучше, чем наличие ряда высот строк 1fr, которые, по-видимому, вызывают указанную проблему, поэтому это вопрос предоставления minmax () для всех браузеров для объявления строки. Обратите внимание, что minmax () в основном поддерживается всеми устаревшими браузерами MS при условии, что он имеет префикс -ms-.

Изменить: как было предложено Michael_B, проще просто использовать grid-template-rows: auto вместо добавления minmax (auto, auto).

.container {
  background: cyan;
  display: -ms-grid;
  -ms-grid-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
  -ms-grid-rows: auto;
  /* legacy minmax() support */
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: auto;
}

.top {
  background: pink;
  -ms-grid-column: 1;
  -ms-grid-column-span: 12;
  -ms-grid-row: 1;
  grid-column: 1 / span 12;
  grid-row: 1;
  height: 8.4rem;
}

.mid {
  background: yellow;
  -ms-grid-column: 1;
  -ms-grid-column-span: 12;
  -ms-grid-row: 2;
  grid-column: 1 / span 12;
  grid-row: 2;
}

.bottom {
  background: purple;
  -ms-grid-column: 1;
  -ms-grid-column-span: 12;
  -ms-grid-row: 3;
  grid-column: 1 / span 12;
  grid-row: 3;
}
<div class='container'>
  <div class='top'>TOP</div>
  <div class='mid'>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
    <p>some long text some long text some long text some long text</p>
  </div>
  <div class='bottom'>
    <p>some short text</p>
  </div>
</div>

Объявление высоты 100% в .container было опущено, так как это заставляет небольшую горизонтальную полосу голубого фона появляться под .top в Edge 17 на больших экранах (но не в большинстве других браузеров, включая IE).

Еще одна вещь, которую следует отметить, просто для удобства, заключается в том, что действие функции repeat () поддерживается в другом синтаксисе -ms- legacy. Таким образом, вы также можете заменить следующее:

-ms-grid-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; 

с участием

-ms-grid-columns: (1fr)[12];

См. Здесь устаревшие варианты -ms синтаксиса Grid: https://msdn.microsoft.com/en-us/library/hh673533(v=vs.85).aspx

person FilmFiddler    schedule 29.06.2018
comment
Да, я уже понял это, но не было смысла отвечать на мой собственный вопрос. Спасибо хоть. - person S. Schenk; 30.06.2018
comment
minmax(auto, auto, auto) недействителен. Функция принимает только два аргумента: minmax(min, max). - person Michael Benjamin; 30.06.2018
comment
На самом деле, я думаю, что grid-template-rows: minmax(auto, auto) (как в вопросе) ничем не отличается от просто grid-template-rows: auto. Оба создают только одну строку, и содержимое устанавливает ее высоту. Проверить это. Я не думаю, что есть разница. - person Michael Benjamin; 30.06.2018
comment
@Michael_B - Спасибо, что указали на ошибку minmax - сейчас исправлено. Кроме того, вы правы насчет двух автоматических способов - между ними нет разницы, поэтому, вероятно, проще просто использовать auto в строках-шаблоне сетки. - person FilmFiddler; 01.07.2018

Раздел MID выровнен по верхнему краю в Internet Explorer 11 на моем компьютере - с использованием как вашего текущего CSS, так и того, что было изначально опубликовано.

введите здесь описание изображения

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

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

По большей части Нормализация - это, по сути, практика удаления предустановок браузера и определения начальных значений, чтобы помочь стандартизировать то, как все интерпретируется впоследствии.

Вот мой личный, normalize.css ...

/* ┌─────────────────────────────────────────────────────────────────┐
/* │   Normalize v1.1                                                │
/* │   Created by Dustin Halstead                                    │
/* └─────────────────────────────────────────────────────────────────┘


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Universal Adjustments                                        │ 

    /* 1. Correct line height in all browsers. */
    /* 2. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS. */
        * {
            padding: 0;
            margin: 0;
            border: 0;
            border-collapse: collapse;
            vertical-align: baseline;
            border-spacing: 0;
            text-decoration: none;
            line-height: 1.15; /* 1 */
            -ms-text-size-adjust: 100%; /* 2 */
            -webkit-text-size-adjust: 100%; /* 2 */
        }

/* └────────────────────────────────────────────────────────────────┘ 


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Sections                                                     │ 

    /* Correct display in IE 9-. */
        article, aside, footer, header, nav, section, figcaption, figure, main { display: block; }

    /* Correct `h1` font size and margin within `section` and `article` areas in Chrome, Firefox, and Safari. */
        h1 { font-size: 2em; margin: 0.67em 0; }

/* └────────────────────────────────────────────────────────────────┘ 


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Grouping                                                     │ 

    /* 1. Correct box sizing in Firefox. */
    /* 2. Show overflow in Edge and IE. */
        hr {
            box-sizing: content-box; /* 1 */
            height: 0; /* 1 */
            overflow: visible; /* 2 */
        }

    /* 1. Correct inheritance and scaling of font size in all browsers. */
    /* 2. Correct odd `em` font sizing in all browsers. */
        pre {
            font-family: monospace, monospace; /* 1 */
            font-size: 1em; /* 2 */
        }

/* └────────────────────────────────────────────────────────────────┘


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Text                                                         │ 

    /* 1. Remove the gray background on active links in IE 10. */
    /* 2. Remove gaps in links underline in iOS 8+ and Safari 8+. */
        a {
            background-color: transparent; /* 1 */
            -webkit-text-decoration-skip: objects; /* 2 */
        }

    /* Correct font weight in Chrome, Edge, and Safari. */
        b, strong { font-weight: bolder; }

    /* Correct the scaling and odd `em` font sizing in all browsers. */
        code, kbd, samp { font-family: monospace, monospace; font-size: 1em; }

    /* Correct font style in Android 4.3-. */
        dfn { font-style: italic; }

    /* Correct font size in all browsers. */
        small { font-size: 80%; }

    /* Prevent `sub` and `sup` elements from affecting the line height in all browsers. */
        sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
        sub { bottom: -0.25em; }
        sup { top: -0.5em; }

/* └────────────────────────────────────────────────────────────────┘


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Embedded Content                                             │ 


    /* Add the correct display in iOS 4-7. */
        audio:not([controls]) { display: none; height: 0; }

    /* Hide overflow in IE. */
        svg:not(:root) { overflow: hidden; }

/* └────────────────────────────────────────────────────────────────┘


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Forms                                                        │

    /* Remove the margin in Firefox and Safari. */
        button, input, optgroup, select, textarea { margin: 0; }

    /* Remove the inheritance of text transform in Edge, Firefox, and IE. */
        button, select { text-transform: none; }

    /* 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` controls in Android 4. */
    /* 2. Correct the inability to style clickable types in iOS and Safari. */
        button,
        html [type="button"], /* 1 */
        [type="reset"],
        [type="submit"] {
            -webkit-appearance: button; /* 2 */
        }

    /* Correct the text wrapping in Edge and IE. */
        legend { box-sizing: border-box; display: table; max-width: 100%; white-space: normal; }


    /* Remove the default vertical scrollbar in IE. */
        textarea { overflow: auto; }

    /* Correct the cursor style of increment and decrement buttons in Chrome. */
        [type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; }

    /* Correct the odd appearance in Chrome and Safari. */
        [type="search"] { -webkit-appearance: textfield; }

    /* Remove the inner padding and cancel buttons in Chrome and Safari on macOS. */
        [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { -webkit-appearance: none; }

    /* Correct the inability to style clickable types in iOS and Safari. */
        ::-webkit-file-upload-button { -webkit-appearance: button; }

/* └────────────────────────────────────────────────────────────────┘


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Interactive                                                  │

    /* Correct display in Edge, IE, and Firefox. */
        details, menu { display: block; }

    /* Correct display in all browsers. */
        summary { display: list-item; }

/* └────────────────────────────────────────────────────────────────┘


/* ┌────────────────────────────────────────────────────────────────┐
/* │   Miscellaneous                                                │

    /* Correct display in IE 9-. */  
        canvas { display: inline-block; }

    /* Correct display in IE. */
        template { display: none; }

    /* Correct display in IE 10-. */
        [hidden] { display: none; }

/* └────────────────────────────────────────────────────────────────┘

Попробуйте и посмотрите, поможет ли это улучшить то, что вы видите.

Надеюсь, это пригодится.


Обновлять:

Стало понятно, что макет ломался во время изменения размера браузера больше, чем при первоначальном рендеринге.

Проблема, по-видимому, является прямым результатом включения: display:-ms-grid;
... а также нескольких ошибок позиционирования.
Кроме того, необходимо определить display: flex;, чтобы контент правильно перемещался в указанном div.

.container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    min-width: 270px;
    background:cyan;
    display: grid;
    -ms-grid-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
    -ms-grid-rows: 1fr 1fr 1fr;
    grid-template-columns: repeat(12, 1fr);
    grid-template-rows: minmax(auto, auto);
}

.top {
    min-height: 8em;
    background: pink;
    -ms-grid-column: 1;
    -ms-grid-column-span: 12;
    -ms-grid-row: 1;
    grid-column: 1 / span 12;
    grid-row: 1;
}

.mid {
    min-height: 10em;
    background: yellow;
    -ms-grid-column: 1;
    -ms-grid-column-span: 12;
    -ms-grid-row: 2;
    grid-column: 1 / span 12;
    grid-row: 2;
    display: flex;   
}

.bottom {
    min-height: 5em;
    background: purple;
    -ms-grid-column: 1;
    -ms-grid-row: 3;
    -ms-grid-column-span: 12;
    grid-row: 3;
    grid-column: 1 / span 12;
}
person Dustin Halstead    schedule 27.06.2018
comment
К сожалению, это не так. Установка 100% для контейнера на реальном сайте приводит к странным результатам, когда контейнер закрывает только область просмотра без прокрутки, а все остальное переполняется. Если я не устанавливаю контейнер на 100%, его высота по какой-то причине чрезвычайно велика, а строка: -ms-grid-rows: 1fr 1fr 1fr; делает все строки одинаковыми, независимо от того, сколько содержимого на самом деле вмещает каждая. - person S. Schenk; 27.06.2018
comment
Просмотрите новый код, показывающий, что он не работает должным образом: codepen.io/anon/pen/OEBxNr - person S. Schenk; 27.06.2018
comment
Обновил свой ответ. Надеюсь, это решит проблему. :) - person Dustin Halstead; 27.06.2018
comment
Почему позиция абсолютно необходима? - person S. Schenk; 27.06.2018
comment
Это просто хорошая практика для полностраничных контейнеров (поскольку им не нужна гибкость), но еще и потому, что height: 100%; не работает - поэтому использование этого позиционирования позволяет контейнеру занимать весь вид. Кроме того, на элемент с таким типом позиционирования не влияют другие элементы, что делает контейнер надежным. Обратите внимание, как он полностью игнорирует дополнительные отступы, которые ранее были в макете. Тем не менее, это не обязательно и зависит от того, какова ваша конечная цель для макета страницы. - person Dustin Halstead; 27.06.2018
comment
Конечно, вы также можете использовать высоту точки обзора вместо процентов ... height: 100vh; - person Dustin Halstead; 27.06.2018