Я пытаюсь создать простую страницу с помощью CSS Grid.
Что я не могу сделать, так это центрировать текст из HTML в соответствующие ячейки сетки.
Я попытался содержание укладывания в отдельных div
с как внутри , так и за ее пределы left_bg
и right_bg
селекторы и играть с некоторыми из свойств CSS не дали никаких результатов.
Как мне это сделать?
html,
body {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100vh;
grid-gap: 0px 0px;
}
.left_bg {
display: subgrid;
background-color: #3498db;
grid-column: 1 / 1;
grid-row: 1 / 1;
z-index: 0;
}
.right_bg {
display: subgrid;
background-color: #ecf0f1;
grid-column: 2 / 2;
grid_row: 1 / 1;
z-index: 0;
}
.left_text {
grid-column: 1 / 1;
grid-row: 1 / 1;
position: relative;
z-index: 1;
justify-self: center;
font-family: Raleway;
font-size: large;
}
.right_text {
grid-column: 2 / 2;
grid_row: 1 / 1;
position: relative;
z-index: 1;
justify-self: center;
font-family: Raleway;
font-size: large;
}
<div class="container">
<!--everything on the page-->
<div class="left_bg">
<!--left background color of the page-->
</div>
</div>
<div class="right_bg">
<!--right background color of the page-->
</div>
<div class="left_text">
<!--left side text content-->
<p>Review my stuff</p>
<div class="right_text">
<!--right side text content-->
<p>Hire me!</p>
</div>
</div>
Ответы:
Этот ответ состоит из двух основных разделов:
Если вас интересуют только решения, пропустите первый раздел.
Структура и объем сетки
Чтобы полностью понять, как центрирование работает в сеточном контейнере, важно сначала понять структуру и область расположения сетки.
HTML- структура контейнера сетки имеет три уровня:
Каждый из этих уровней не зависит от других с точки зрения применения свойств сетки.
Область действия контейнера сетки ограничена отношениями родитель-потомок.
Это означает, что контейнер сетки всегда является родительским, а элемент сетки всегда дочерним. Свойства сетки работают только в этих отношениях.
Потомки контейнера сетки за пределами дочерних элементов не являются частью макета сетки и не будут принимать свойства сетки. (По крайней мере, пока
subgrid
не будет реализована функция, которая позволит потомкам элементов сетки уважать линии основного контейнера.)Вот пример концепции структуры и области применения, описанной выше.
Представьте себе сетку, похожую на крестики-нолики.
Вы хотите, чтобы X и O центрировались в каждой ячейке.
Таким образом, вы применяете центрирование на уровне контейнера:
Но из-за структуры и области расположения сетки,
justify-items
на контейнере центрируются элементы сетки, а не содержимое (по крайней мере, не напрямую).Показать фрагмент кода
Та же проблема с
align-items
: контент может быть центрирован как побочный продукт, но вы потеряли дизайн макета.Показать фрагмент кода
Для центрирования контента вам нужен другой подход. Снова обращаясь к структуре и области действия макета сетки, вы должны рассматривать элемент сетки как родительский элемент, а содержимое как дочерний.
Показать фрагмент кода
демоверсия jsFiddle
Шесть методов для центрирования в CSS Grid
Существует несколько способов центрирования элементов сетки и их содержимого.
Вот основная сетка 2x2:
Flexbox
Для простого и удобного способа центрировать содержимое элементов сетки используйте flexbox.
Более конкретно, сделайте элемент сетки в гибкий контейнер.
В этом методе нет конфликта, нарушения спецификации или других проблем. Это чисто и актуально.
Показать фрагмент кода
Смотрите этот пост для полного объяснения:
Макет сетки
Точно так же, как гибкий элемент также может быть гибким контейнером, элемент сетки также может быть сеточным контейнером. Это решение аналогично решению Flexbox, описанному выше, за исключением того, что центрирование выполняется с использованием свойств сетки, а не гибкости.
Показать фрагмент кода
auto
поляИспользуйте
margin: auto
для вертикального и горизонтального центрирования элементов сетки.Показать фрагмент кода
Чтобы центрировать содержимое элементов сетки, вам нужно превратить элемент в контейнер сетки (или флекс), обернуть анонимные элементы в их собственные элементы ( так как они не могут быть непосредственно нацелены на CSS ) и применить поля к новым элементам.
Показать фрагмент кода
Свойства выравнивания коробки
При рассмотрении вопроса об использовании следующих свойств для выравнивания элементов сетки прочитайте раздел, посвященный
auto
полям выше.align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
Для центрирования контента по горизонтали в элементе сетки вы можете использовать
text-align
свойство.Показать фрагмент кода
Обратите внимание, что для вертикального центрирования
vertical-align: middle
не будет работать.Это связано с тем, что
vertical-align
свойство применяется только к встроенным контейнерам и контейнерам с табличными ячейками.Показать фрагмент кода
Можно сказать, что
display: inline-grid
устанавливает контейнер на уровне строки, и это было бы правдой. Так почему же неvertical-align
работает с элементами сетки?Причина в том, что в контексте форматирования сетки элементы обрабатываются как элементы уровня блока.
В контексте форматирования блока , для
vertical-align
которого изначально было разработано свойство, браузер не ожидает найти элемент уровня блока во встроенном контейнере. Это неверный HTML.CSS Позиционирование
Наконец, есть общее решение для центрирования CSS, которое также работает в Grid: абсолютное позиционирование
Это хороший метод для центрирования объектов, которые необходимо удалить из потока документов. Например, если вы хотите:
Просто установите
position: absolute
элемент, который должен быть центрирован, иposition: relative
на предка, который будет служить содержащим блоком (обычно это родительский элемент ). Что-то вроде этого:Показать фрагмент кода
Вот полное объяснение того, как работает этот метод:
Вот раздел об абсолютном позиционировании в спецификации Grid:
источник
grid-container
иgrid-item
есть ли теги HTML?flex
иgrid
,align-items
остается тем же , но по какой - то причинеjustify-content
становитсяjustify-items
Вы можете использовать flexbox для центрирования вашего текста. Кстати, дополнительные контейнеры не нужны, потому что текст рассматривается как анонимный элемент flex.
Из спецификации flexbox :
Так что просто сделайте элементы сетки в виде flex-контейнеров (
display: flex
), добавьтеalign-items: center
и расположите ихjustify-content: center
по центру как по вертикали, так и по горизонтали.Также выполнена оптимизация HTML и CSS:
источник
Даже не пытайтесь использовать flex; остаться с сеткой CSS! :)
https://jsfiddle.net/ctt3bqr0/
выполняет центрирующую работу здесь.
Если вы хотите центрировать что-то внутри
div
, внутри ячейки сетки, вам нужно определить вложенную сетку, чтобы она работала. (Пожалуйста, посмотрите на скрипку обоих примеров, показанных там.)https://css-tricks.com/snippets/css/complete-guide-grid/
Ура!
источник
place-self: center;
.Сокращенное свойство CSS place-items устанавливает свойства align-items и justify-items соответственно. Если второе значение не установлено, для него также используется первое значение.
источник
place-items
в настоящее время не поддерживается в краеПопробуйте использовать flex:
Демо-версия Plunker: https://plnkr.co/edit/nk02ojKuXD2tAqZiWvf9
HTML
источник
Вы хотите это?
источник
.text{ font-family: Raleway; font-size: large; text-align: center; -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); }
Я знаю, что этому вопросу пару лет, но я с удивлением обнаружил, что никто не предложил:
это более универсальное свойство, чем justify-content, и оно определенно не уникально для grid, но я обнаружил, что при работе с текстом, о котором конкретно задается этот вопрос, он выравнивает текст по центру, не затрагивая пространство между элементами сетки, или вертикальное центрирование. Текст центрируется горизонтально там, где он стоит на вертикальной оси. Я также нахожу это для удаления слоя сложности, который добавляет justify-content и align-items. justify-content и align-items влияет на весь элемент или элементы сетки, text-align центрирует текст, не затрагивая контейнер, в котором он находится. Надеюсь, это поможет.
источник