我正在尝试使用 CSS Grid 创建一个简单的页面。
我没有做的是将文本从 HTML 居中到相应的网格单元格。
我试过将内容放在 left_bg
和 right_bg
内外的单独的 div
s 中,并且无法使用某些 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>
原文由 beetroot 发布,翻译遵循 CC BY-SA 4.0 许可协议
这个答案有两个主要部分:
如果您只对解决方案感兴趣,请跳过第一部分。
网格布局的结构和范围
要完全了解居中在网格容器中的工作原理,首先了解网格布局的结构和范围很重要。
网格容器的 HTML 结构 具有三个层次:
就应用网格属性而言,这些级别中的每一个都独立于其他级别。
网格容器的 范围 仅限于父子关系。
这意味着网格容器始终是父项,而网格项始终是子项。网格属性仅在这种关系中起作用。
子容器之外的网格容器的后代不是网格布局的一部分,并且不会接受网格属性。 (至少在实施
subgrid
功能之前,这将允许网格项的后代遵守主容器的行。)下面是上述结构和范围概念的示例。
想象一个类似井字游戏的网格。
您希望 X 和 O 在每个单元格中居中。
因此,您在容器级别应用居中:
但是由于网格布局的结构和范围,
justify-items
在容器上以网格项目为中心,而不是内容(至少不是直接)。与
align-items
相同的问题:内容可能作为副产品居中,但您丢失了布局设计。要使内容居中,您需要采用不同的方法。再次参考网格布局的结构和范围,您需要将网格项视为父项,将内容视为子项。
jsFiddle 演示
CSS 网格居中的六种方法
有多种方法可以使网格项及其内容居中。
这是一个基本的 2x2 网格:
弹性盒
要以简单易行的方式将网格项目的内容居中,请使用 flexbox。
更具体地说,将网格项目制作成弹性容器。
此方法不存在冲突、规范违规或其他问题。它干净有效。
请参阅这篇文章以获得完整的解释:
网格布局
就像弹性项目也可以是弹性容器一样,网格项目也可以是网格容器。这个解决方案类似于上面的 flexbox 解决方案,除了居中是通过网格而不是 flex 属性完成的。
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
设置为包含块的祖先(通常是父元素)。是这样的:以下是此方法如何工作的完整说明:
这是网格规范中关于绝对定位的部分: