为什么align:居中于父项会弄乱我的位置:绝对叠加层?

时间:2018-09-02 05:45:40

标签: css css3 flexbox css-position

有人可以解释为什么在此菜单的父级中使用[HttpPost] public IActionResult AddMainMenu(MainMenuItems mainMenuItems) { string userEmail = User.Identity.Name; return Json("success"); } display: flex;会弄乱子元素中两个绝对定位的叠加层吗?

这是一个小提琴,您可以在有无align: center;的情况下尝试获得我的意思。 (取消注释/ * align:center; * /在.menu中)

https://jsfiddle.net/Hastig/wmtr87gc/

align: center
body { background-color: gray;}
.menu {
    display: flex;
    justify-content: center;
    /* align-items: center; */
    width: 100%;
    padding: 5px 0;
    background-color: hsl(0, 0%, 30%);
}
.menu-item {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  flex: 1;
  font-size: 13px;
  color: hsl(0, 0%, 70%);
}
.menu-item.progress {
  background-color: gray;
}
.progress-bar {
  position: absolute;
  top: 0; bottom: 0; left: 0;
  width: 83%;
  background-color: hsla(191, 58%, 46%, 1);
}
.progress-value {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  color: hsl(0, 0%, 90%);
}

1 个答案:

答案 0 :(得分:1)

因为中间元素仅包含绝对元素,因此内部没有流入内容来定义其高度。然后默认的align-itemsstretch,因此默认情况下将拉伸您的元素,并且其高度将等于其父高度,但如果更改对齐方式,则该元素将考虑其内容来定义高度,并且没有流入元素,它将具有height:0,这意味着top:0;bottom:0定义的进度条的高度也将为0

为避免这种情况,请保持至少一个未放置位置的元素(包含文本的元素),以便中间元素具有一定的流入内容,并且其高度将与0不同会。

body {
  background-color: gray;
}

.menu {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  padding: 5px 0;
  background-color: hsl(0, 0%, 30%);
}

.menu-item {
  position: relative;
  z-index:0;
  display: flex;
  justify-content: center;
  align-items: center;
  flex: 1;
  font-size: 13px;
  color: hsl(0, 0%, 70%);
}

.menu-item.progress {
  background-color: gray;
}

.progress-bar {
  position: absolute;
  z-index:-1;
  top: 0;
  bottom: 0;
  left: 0;
  width: 83%;
  background-color: hsla(191, 58%, 46%, 1);
}

.progress-value {
  color: hsl(0, 0%, 90%);
}
<div class="menu">
  <div class="menu-item">Stuff</div>
  <div class="menu-item progress">
    <div class="progress-bar"></div>
    <div class="progress-value">83</div>
  </div>
  <div class="menu-item">Things</div>
</div>