flex容器内的居中元素正在增长并溢出顶部[重复]

Posted

技术标签:

【中文标题】flex容器内的居中元素正在增长并溢出顶部[重复]【英文标题】:Centered elements inside a flex container are growing and overflowing beyond top [duplicate] 【发布时间】:2018-08-23 00:58:25 【问题描述】:

我一定是忘记了垂直和水平居中的弹性框的一些基本内容。

容器在垂直滚动的父级内,当容器变得太高时,它会超出父级顶部,从而剪裁内容。底部保持不变。

尝试调整视图的高度或添加更多行以查看它的实际效果。

body,
html 
  height: 100%;
  width: 100%;
  margin: 0;


* 
  box-sizing: border-box;


#wrapper 
  background: grey;
  height: 100%;
  width: 100%;
  max-height: 100%;
  display: flex;
  overflow-y: auto;
  align-items: center;
  justify-content: center;


#box 
  margin: 30px 0;
  background: white;
  border: 1px solid #dfdfdf;
<div id="wrapper">
  <div id="box">
    First line
    <br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br> Last linje
  </div>
</div>

如何防止它被剪掉?此外,我试图在容器上方和下方留出 30 像素的边距。

谢谢!

【问题讨论】:

【参考方案1】:

我认为您在扩展容器高度的盒子类中设置了上边距。您可以将其设置为填充而不是边距。希望这可以帮助。谢谢。

【讨论】:

谢谢,但这不会改变行为。【参考方案2】:

我认为你想要的是让你的弹性项目 (#box) 有一个高度并将其设置为溢出,而不是弹性容器。另外,要在上方和下方添加 30px,我会从框中删除边距,而是向容器添加填充。

因此,更新后的样式如下所示:

#wrapper 
  background: grey;
  height: 100%;
  width: 100%;
  max-height: 100%;
  display: flex;      
  align-items: center;
  justify-content: center;
  padding: 30px 0; /*added*/


#box 
  background: white;
  border: 1px solid #dfdfdf;
  overflow-y: auto; /*added*/
  height: 100%; /*added*/

body,
html 
  height: 100%;
  width: 100%;
  margin: 0;


* 
  box-sizing: border-box;


#wrapper 
  background: grey;
  height: 100%;
  width: 100%;
  max-height: 100%;
  display: flex;      
  align-items: center;
  justify-content: center;
  padding: 30px 0;


#box     
  background: white;
  border: 1px solid #dfdfdf;
  overflow-y: auto;
  height: 100%;
<div id="wrapper">
  <div id="box">
    First line
    <br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br> Last linje
  </div>
</div>

【讨论】:

谢谢。不幸的是,我不希望盒子滚动,而是周围的包装。【参考方案3】:

您什么都没忘记,但您只需要了解正在发生的事情。首先,您将包装器设置为 100% 的屏幕高度,然后将框设置为垂直和水平居中。当盒子的高度很大时,你会得到这样的东西:

现在,当您添加overflow-y: auto 时,您将创建一个从包装器顶部 开始直到底部溢出内容的滚动。所以它会是这样的:

这就是为什么您可以滚动到底部以查看底部而无法看到顶部的原因。

为避免这种情况,请使用margin:auto 将元素居中,在这种情况下,我们将有两种情况:

    box-height &lt; wrapper-height 时,由于margin:auto,我们将在每一侧都有空间平均分布,因此您的元素将像预期的那样居中。 当box-height &gt; wrapper-height 时,我们将有正常行为,您的元素将溢出,并且他的顶部边缘将粘在包装器的顶部边缘

您可能还注意到水平方向也会发生同样的情况,这就是为什么我将使用边距在两个方向上居中。

body,
html 
  height: 100%;
  width: 100%;
  margin: 0;


* 
  box-sizing: border-box;


#wrapper 
  background: grey;
  height: 100%;
  width: 100%;
  max-height: 100%;
  padding:30px 0;
  display: flex;
  overflow-y: auto;


#box 
  margin: auto;
  background: white;
  border: 1px solid #dfdfdf;
<div id="wrapper">
  <div id="box">
    First line
    <br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br>line<br> Last linje
  </div>
</div>

【讨论】:

哇 - 我永远不会想出那个解决方案。虽然您的精彩解释有所帮助,但我不确定为什么 margin: auto 解决了这个问题。您可以提供任何其他解释吗?感谢您的帮助。 @Jeppebm margin:auto 是 flex 的魔力之一;) 当您设置 auto 时,意味着将边距在每一侧分割为相等,从而使元素居中......非常像 margin:auto 与一个具有固定宽度的块元素......当高度更大时没有边距,所以它是无用的,你有正常的行为

以上是关于flex容器内的居中元素正在增长并溢出顶部[重复]的主要内容,如果未能解决你的问题,请参考以下文章

CSS Flex溢出和居中[重复]

Flexbox对齐项目溢出文本在顶部被切断[重复]

溢出的弹性容器的孩子超过容器[重复]

如何垂直对齐一个flex元素子元素[重复]

[转]无法滚动到溢出容器的Flex项的顶部

使用display:flex将图像水平和垂直居中