【问题标题】:vertical align grid container垂直对齐网格容器
【发布时间】:2018-04-28 03:33:28
【问题描述】:

我设法为我的简单布局获得了网格。现在我想将它垂直居中。我怎样才能完成它?重要提示:我的意思是整个包装器(包装容器/整个网格),而不是容器内的项目......

关于这个问题的第二个问题是:这会影响“grid-auto-flow: row dense;”吗?

html {box-sizing: border-box;}


body {}



.wrapper {
  display: grid;
  width: 100%;
  grid-column-gap: 5px;
  grid-row-gap: 5px;
  grid-template-columns: 20% 20% 20%;
  grid-template-rows: 25% 25% 25%;
  justify-content: center;
  align-content: center;
  grid-auto-flow: row dense;
  }


.box
   {padding: 15px;
    border: 1px solid red;
    background: grey;}



.a {grid-column: 1 / span 2;
    grid-row: 1 / span 2;}

.b {grid-column: 3; grid-row: 1}

.c {grid-column: 3; grid-row: 2;}

.d {grid-column: 1; grid-row: 3}

.e {grid-column: 2; grid-row: 3}

.f {grid-column: 3; grid-row: 3}
<div class="wrapper">

<div class="box a">
<img src="" style="">
</div>

<div class="box b">
<img src="" style="">
</div>

<div class="box c">
<img src="" style="">
</div>

<div class="box d">
<img src="" style="">
</div>

<div class="box e">
<img src="" style="">
</div>

<div class="box f">
<img src="" style="">
</div>

【问题讨论】:

  • 对我来说在 Chrome(和 FF)中运行良好:jsfiddle.net/4s0x7LLg
  • 非常感谢您查找此内容!我检查了浏览器对网格的支持,我正在运行的系统不允许实际的 chrome 浏览器...
  • 我现在更改了上面的问题,以便进一步发布
  • 谢谢!但不幸的是,这会拉伸或缩小我的容器高度。意思是,当屏幕尺寸改变时,所有的盒子都和容器一起伸展。如果我将图像放入盒子中,它们会彼此重叠或彼此远离(行间隙规则会以某种方式丢失)..并且“grid-auto-flow:row-dense”似乎也没有效果?我想像以前一样使用“以未知为中心”的技术,但内联块和表格技巧不这样做

标签: html css flexbox css-grid


【解决方案1】:

我假设您已经知道如何在 CSS 网格中垂直居中项目。

您现在可以做的是创建另一个 wrapper-of-wrapper div,其布局是 flexbox(垂直)或网格(只有 1 行和 1 列),然后将您的 wrapper 放入其中。

html {box-sizing: border-box;}

.wrapper-of-wrapper {
    position: fixed;
    width: 100%;
    height: 100%;
    
    display: flex;
    flex-flow: column nowrap;
    justify-content: center;
}

.wrapper {
   
    height: 80%;

    display: grid;
    grid-column-gap: 5px;
    grid-row-gap: 5px;
    grid-template-columns: 20% 20% 20%;
    grid-template-rows: 25% 25% 25%;
    justify-content: center;
    align-content: center;
    grid-auto-flow: row dense;
}

.box {
    padding: 15px;
    border: 1px solid red;
    background: grey;
}

.a {grid-column: 1 / span 2;
    grid-row: 1 / span 2;}

.b {grid-column: 3; grid-row: 1}

.c {grid-column: 3; grid-row: 2;}

.d {grid-column: 1; grid-row: 3}

.e {grid-column: 2; grid-row: 3}

.f {grid-column: 3; grid-row: 3}
<div class="wrapper-of-wrapper">
    <div class="wrapper">

        <div class="box a">
            <img src="" style="">
        </div>

        <div class="box b">
            <img src="" style="">
        </div>

        <div class="box c">
            <img src="" style="">
        </div>

        <div class="box d">
            <img src="" style="">
        </div>

        <div class="box e">
            <img src="" style="">
        </div>

        <div class="box f">
            <img src="" style="">
        </div>
    </div>
</div>

如果您只想让包装器在 flexbox 中居中但不随其调整大小,请将其高度设置为 auto 并将 flex 设置为 0 0 auto 以便它根据内容调整大小,并且不会缩小或增长。

【讨论】:

  • 好主意,再次使用网格或使用 flex。不幸的是,我实现它的方法没有奏效。当我给新的 wrapper-of-wrapper 一个具体的高度时(否则它不会工作,对吗?),然后当屏幕尺寸发生变化时,我会失去正确的对齐方式。
  • 您可以使包装器的包装器始终与视口大小相同。例如:位置:固定和高度:100%。或者只使用 100vh
  • 哇新潮,惊喜和幸福的时刻,好用!还有一些需要理解的问题:当我将容器设置为“自动高度”并弯曲为“0 0”时:如何控制超大屏幕中不断增长的内容?我是否必须担心某些视口中最终溢出的包装(剪切的内容)?这是减少列大小的最佳方法还是有更优雅的方法?另一个问题是:如何让“grid-auto-flow: row-dense”在这里工作?
  • @tiffsen 自动高度表示内容的大小。因此,您的包装器的高度将仅根据其中的内容进行计算。一旦你将 flex-grow 和 flex-shrink 设置为 0,你的 wrapper 将不再响应 wrapper-of-wrapper 的大小变化。所以简而言之,你的包装器永远不会溢出,但是当视口尺寸变得太小而无法将所有瓷砖保持在原始尺寸时,你的包装器可能会溢出包装器。这完全取决于您的图块是否可以调整大小
  • 是的,这是有道理的。非常感谢,您一直是我的大力支持!
猜你喜欢
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2014-05-06
  • 2020-07-18
  • 1970-01-01
  • 2016-10-19
相关资源
最近更新 更多