我试图用CSS网格创建一个简单的页面。

我没有做到的是将HTML中的文本集中到各自的网格单元格中。

我已经尝试将内容放在left_bg和right_bg选择器内外的单独divs中,并使用一些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, 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; } .text { font-family: Raleway; font-size: large; text-align: center; } <div class="container"> <!--everything on the page--> <div class="left_bg"> <!--left background color of the page--> <div class="text"> <!--left side text content--> <p>Review my stuff</p> </div> </div> <div class="right_bg"> <!--right background color of the page--> <div class="text"> <!--right side text content--> <p>Hire me!</p> </div> </div> </div>


您可以使用flexbox将文本居中。顺便说一下,不需要额外的容器,因为文本被认为是匿名的伸缩项。

来自flexbox规格:

伸缩容器的每个流内子元素都成为伸缩项,而直接包含在伸缩容器内的每个连续文本运行都包装在匿名伸缩项中。然而,只包含空格(即可以受空格属性影响的字符)的匿名伸缩项不会被呈现(就像它是display:none一样)。

因此,只需将网格项设置为伸缩容器(display: flex),并添加align-items: center和justify-content: center以垂直和水平居中。

还进行了HTML和CSS的优化:

html, body { margin: 0; padding: 0; } .container { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 100vh; font-family: Raleway; font-size: large; } .left_bg, .right_bg { display: flex; align-items: center; justify-content: center; } .left_bg { background-color: #3498db; } .right_bg { background-color: #ecf0f1; } <div class="container"> <div class="left_bg">Review my stuff</div> <div class="right_bg">Hire me!</div> </div>


尝试使用flex:

Plunker演示:https://plnkr.co/edit/nk02ojKuXD2tAqZiWvf9

/* Styles go here */

html,
body {
  margin: 0;
  padding: 0;
}

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100vh;
  grid-gap: 0px 0px;
}

.left_bg {
  background-color: #3498db;
  grid-column: 1 / 1;
  grid-row: 1 / 1;
  z-index: 0;
  display: flex;
  justify-content: center;
  align-items: center;

}

.right_bg {
  background-color: #ecf0f1;
  grid-column: 2 / 2;
  grid_row: 1 / 1;
  z-index: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}

.text {
  font-family: Raleway;
  font-size: large;
  text-align: center;
}

HTML

    <div class="container">
  <!--everything on the page-->

  <div class="left_bg">
    <!--left background color of the page-->
    <div class="text">
      <!--left side text content-->
      <p>Review my stuff</p>
    </div>
  </div>

  <div class="right_bg">
    <!--right background color of the page-->
    <div class="text">
      <!--right side text content-->
      <p>Hire me!</p>
    </div>
  </div>
</div>

甚至不要尝试使用flex和css网格。只需在content元素上添加以下内容:

place-self: center;

它会在这里做居中工作。

如果你想要居中一些在div内的东西,在网格单元内,你需要定义嵌套网格,以使其工作。 演示中显示了两个示例。

https://css-tricks.com/snippets/css/complete-guide-grid/


这个答案有两个主要部分:

了解如何对齐工作在CSS网格。 CSS网格中的六种定心方法。

如果您只对解决方案感兴趣,请跳过第一部分。


网格布局的结构和范围

为了充分理解网格容器中的居中工作原理,首先了解网格布局的结构和范围是很重要的。

网格容器的HTML结构有三层:

容器 项目 的内容

就应用网格属性而言,每一层都独立于其他层。

网格容器的范围仅限于父子关系。

这意味着网格容器总是父元素,网格项总是子元素。网格属性仅在此关系中起作用。

网格容器子容器以外的子容器不是网格布局的一部分,并且不接受网格属性。(至少在子网格特性实现之前不会,这将允许网格项的后代尊重主容器的行。)

下面是上面描述的结构和作用域概念的示例。

想象一个像井字一样的网格。

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
}

你希望X和O在每个单元格中居中。

所以你在容器级别应用居中:

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
  justify-items: center;
}

但是由于网格布局的结构和范围,容器上的justify-items将网格项置于中心,而不是内容(至少不是直接置于中心)。

{条 显示:inline-grid; Grid-template-rows: 100px 100px; Grid-template-columns: 100px 100px; grid-gap: 3 px; justify-items:中心; } 节{ 边框:2px纯黑色; 字体大小:3他们; } 文章< > < >部分X > < /部分 < >节O > < /部分 < >部分X > < /部分 < >节O > < /部分 < >部分X > < /部分 < >节O > < /部分 < >部分X > < /部分 < >节O > < /部分 < >部分X > < /部分 < / >的文章

同样的问题与对齐项:内容可能是居中作为一个副产品,但你失去了布局设计。

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
  justify-items: center;
  align-items: center;
}

article { display: inline-grid; grid-template-rows: 100px 100px 100px; grid-template-columns: 100px 100px 100px; grid-gap: 3px; justify-items: center; align-items: center; } section { border: 2px solid black; font-size: 3em; } <article> <section>X</section> <section>O</section> <section>X</section> <section>O</section> <section>X</section> <section>O</section> <section>X</section> <section>O</section> <section>X</section> </article>

为了集中内容,你需要采取不同的方法。再次参考网格布局的结构和范围,您需要将网格项视为父项,将内容视为子项。

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
}

section {
  display: flex;
  justify-content: center;
  align-items: center;
  border: 2px solid black;
  font-size: 3em;
}

article { display: inline-grid; grid-template-rows: 100px 100px 100px; grid-template-columns: 100px 100px 100px; grid-gap: 3px; } section { display: flex; justify-content: center; align-items: center; border: 2px solid black; font-size: 3em; } <article> <section>X</section> <section>O</section> <section>X</section> <section>O</section> <section>X</section> <section>O</section> <section>X</section> <section>O</section> <section>X</section> </article>

jsFiddle演示


CSS网格定心的六种方法

网格项及其内容的居中有多种方法。

这是一个基本的2x2网格:

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item>this text should be centered</grid-item> <grid-item>this text should be centered</grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>

Flexbox

使用flexbox可以简单方便地将网格项的内容居中。

更具体地说,将网格项变成一个伸缩容器。

这种方法不存在冲突、规范违反或其他问题。这是干净有效的。

grid-item {
  display: flex;
  align-items: center;
  justify-content: center;
}

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; } grid-item { display: flex; /* new */ align-items: center; /* new */ justify-content: center; /* new */ } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item>this text should be centered</grid-item> <grid-item>this text should be centered</grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>

完整的解释请看这篇文章:

如何在Flexbox中垂直和水平居中元素


网格布局

与伸缩项也可以是伸缩容器一样,网格项也可以是网格容器。这个解决方案类似于上面的flexbox解决方案,除了定心是用网格而不是flex属性完成的。

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; } grid-item { display: grid; /* new */ align-items: center; /* new */ justify-items: center; /* new */ } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item>this text should be centered</grid-item> <grid-item>this text should be centered</grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>


汽车的利润

使用边距:自动将网格项垂直和水平居中。

grid-item {
  margin: auto;
}

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; } grid-item { margin: auto; } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item>this text should be centered</grid-item> <grid-item>this text should be centered</grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>

要将网格项的内容居中,您需要将该项制成网格(或伸缩)容器,将匿名项包装在它们自己的元素中(因为CSS不能直接针对它们),并将边缘应用到新元素。

grid-item {
  display: flex;
}

span, img {
  margin: auto;
}

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; } grid-item { display: flex; } span, img { margin: auto; } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item><span>this text should be centered</span></grid-item> <grid-item><span>this text should be centered</span></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>


盒子对齐属性

当考虑使用以下属性来对齐网格项时,请阅读上面关于自动边距的部分。

对齐项目 justify-items align-self justify-self

https://www.w3.org/TR/css-align-3/#property-index


text-align:中心

要在网格项中水平居中,可以使用text-align属性。

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; text-align: center; /* new */ } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item>this text should be centered</grid-item> <grid-item>this text should be centered</grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>

注意,对于垂直居中,垂直对齐:middle将不起作用。

这是因为vertical-align属性仅应用于内联和表单元格容器。

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; text-align: center; /* <--- works */ vertical-align: middle; /* <--- fails */ } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item>this text should be centered</grid-item> <grid-item>this text should be centered</grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>

有人可能会说display: inline-grid建立了一个内联级容器,这是对的。那么为什么垂直对齐在网格项中不起作用呢?

原因是在网格格式化上下文中,项被视为块级元素。

6.1. 电网项目 显示 网格项的显示值被阻塞:如果 元素的流中子元素的指定显示 网格容器是一个内联级的值,它计算到它 块级等价的。

在块格式化上下文中(vertical-align属性最初是为这种情况设计的),浏览器并不期望在内联级容器中找到块级元素。这是无效的HTML。


CSS定位

最后,还有一个通用的CSS定心解决方案也适用于Grid:绝对定位

对于需要从文档流中删除的对象,这是一种居中的好方法。例如,如果你想:

将文本置于图像上方居中,或者 将星号(*)放在必需的表单字段之上

只需在居中的元素上设置position: absolute,在作为包含块的祖先元素上设置position: relative(通常是父元素)。就像这样:

grid-item {
  position: relative;
  text-align: center;
}

span {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

grid-container { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: 75px; grid-gap: 10px; } grid-item { position: relative; text-align: center; } span, img { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } /* can ignore styles below; decorative only */ grid-container { background-color: lightyellow; border: 1px solid #bbb; padding: 10px; } grid-item { background-color: lightgreen; border: 1px solid #ccc; } <grid-container> <grid-item><span>this text should be centered</span></grid-item> <grid-item><span>this text should be centered</span></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> <grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item> </grid-container>

下面是这个方法的完整解释:

元素将不会保持居中,特别是在调整屏幕大小时

下面是关于Grid规范中绝对定位的部分:

https://www.w3.org/TR/css3-grid-layout/#abspos


CSS位置项简写属性分别设置align-items和justification -items属性。如果没有设置第二个值,也会使用第一个值。

.parent {
  display: grid;
  place-items: center;
}

这招对我很管用:

.d-grid { 显示:网格; Grid-template-columns: repeat(3,1fr); Border-top: 1px纯黑色; Border-left: 1px纯黑色; } .d-grid div { 高度:50 px; 显示:flex; Border-bottom: 1px纯黑色; 右边框:1px纯黑色; 对齐项目:中心; justify-content:中心; } < div class = " d网格”> < div >文本1 < / div > < div >文本2 < / div > 文本< div > 3 < / div > < div >文本4 < / div > < div >文本5 < / div > < div >文本6 < / div > < / div >


我们可以使用地点项目:中心;属性使子元素文本位于中间。

.parent { 显示:网格; grid-template-columns:重复(2 1 fr); 边框:3px纯黄色; grid-gap: 3 px; 名:中心; } .parent > div { 背景颜色:蓝色; text-align:中心; 颜色:白色; 粗细:大胆的; 字体大小:2快速眼动; } < div class = "父" > " child1 " < div class = > child1 < / div > < div class = " child2”> child2 < / div > < / div >


将父节点设为网格,并将justify-content: center;align-content:居中;

.parent { 身高:100 px; 宽度:100 px; 边框:1px纯黑色; 显示:网格; justify-content:中心; align-content:中心; } .child { 高度:20 px; 宽度:20 px; 背景颜色:红色; } < div class = "父" > < div class = "孩子" >子< / div > < / div >