【问题标题】:Css vertical alignment with nested divs与嵌套 div 的 Css 垂直对齐
【发布时间】:2015-10-07 23:49:20
【问题描述】:

这个问题是由this related question建议的修复引起的

我有 3 个嵌套的 div:外部、内部和项目。

<div class="outer">
  <div class="inner"><div class="item"></div></div>
</div>

给定以下基本 CSS:

.outer{
  width:50%;
  height:100px;
  border: 1px solid red;
  position:relative;
  overflow-x:hidden;
  box-sizing:border-box;
}
.inner{
  border:1px solid blue;
  height:100%;
  position: absolute;
  box-sizing: border-box;
  line-height:98px;
}
.item{
  width:100px;
  height:94px;
  background-color:yellow;
  display: inline-block;
  border:1px solid green;
  box-sizing:border-box;
  vertical-align:middle;
}

挑战是将“项目”div 垂直居中,上下有相等(或没有)间隙,并且不出现垂直滚动条。

Codepen here

更新:

如下所述,我应该补充一点,不同高度的多个项目必须居中。到目前为止,最好的答案是为每个项目添加负边距,结果如下:http://codepen.io/anon/pen/dYWEYZ

但是,这闻起来很糟糕(对我来说),因为它需要一个依赖于其他 3 个属性的偏移量。

【问题讨论】:

  • 这里有很多 hacky 的东西,为什么不添加另一个:margin-top: -5px;以 .item 类为中心。 codepen.io/anon/pen/PPmgBR
  • 似乎是这样,行高为 98px,必须有 overflow-x: hidden,必须在 .item 类上有 inline-block。无论哪种方式, margin-top: -5px 都会修复它,因为它会针对外部和内部(总共 4px)和行高差异调整为 1px 边框。如果您在外部和内部(总共 8 像素)上设置边框 2 像素,那么边距顶部变为 -9 像素,这很好。都是关于边界的,加上行高
  • 这些东西都不是hacky,它们是设计所要求的。用于图片轮播,图片高度不同,需要堆叠在一起(需要inline-block),溢出隐藏是一次只显示部分图片,yada yada。这都是必需的。

标签: css vertical-alignment border-box


【解决方案1】:

简单的解决方案是http://codepen.io/anon/pen/jbmRjo

将此添加到您的 .item 类中:

margin-top: -5px;

这是因为你的外部类和内部类的边界,以及内部类的行高。如果将边框设置为 2px 而不是 1px,则顶部边距变为 -9px。如果您将边框保留为 1px 并使行高为 96px,则边距顶部变为 -3px。

那么为什么不能使用负边距顶部呢?

【讨论】:

  • 这确实有效 (codepen.io/anon/pen/dYWEYZ) 但闻起来很糟糕。我们必须允许项目之外的 3 个其他维度这一事实并不好,但如果没有其他人有更好的解决方案,我会接受这个答案......
  • 我同意它有点臭。不过,这绝对是一个有趣的场景——这是你正在做的事情,还是只是好奇?
【解决方案2】:

如果你使用 flexbox,这很容易实现:

.inner{
  border:1px solid blue;
  height:100%;
  position: absolute;
  box-sizing: border-box;
  line-height:98px;
  display:flex;
  align-items:center;
}

【讨论】:

  • 我在带有 flexbox 的手机上发现了不一致的行为
【解决方案3】:

您可以使用display: table-cell; 来获得您想要的垂直居中:

.outer{
  width:50%;
  height:100px;
  border: 1px solid red;
  position:relative;
  overflow-x:hidden;
  box-sizing:border-box;
}
.inner{
  border:1px solid blue;
  height:100%;
  position: absolute;
  box-sizing: border-box;
  line-height:98px;
  display: table; //must change this as well
}
.item{
  width:100px;
  height:94px;
  background-color:yellow;
  border:1px solid green;
  box-sizing:border-box;
  vertical-align:middle;
  display:table-cell; //update display type
}

【讨论】:

  • 但是如果我有不同高度的元素并且我实际上希望它们居中,这是行不通的
  • 这假定中间的
    始终是外部 div 的 100%。外部 div 和 item div 的高度可以是灵活的。这不正确吗?
  • 这是一个包含两个不同高度的项目的代码笔:codepen.io/anon/pen/avWrzB
  • 啊,明白了。没想到会有多个内部 div - 哎呀 :)
  • 也许在您的问题和示例中添加该约束:我不会是唯一不正确扩展此内容的人!
猜你喜欢
相关资源
最近更新 更多
热门标签