如何在水平flexbox中垂直对齐嵌套子级?

问题描述 投票:0回答:1

如下面的代码片段所示,foo-wrapper的点部分不遵循bar-wrapper的文本标签的垂直对齐方式。但是,由于:nth-child(i)规则,这是可以预期的。

我如何使点(它们是另一个容器的子元素,随后是水平弹性框的子元素(parent-wrapper),跟随这些子元素与另一个容器的垂直对齐?

我是否必须完全放弃flexbox并使用诸如网格布局之类的东西?

<!DOCTYPE html>

<head>
  <style>
    .parent-wrapper {
      align-items: stretch;
      display: flex;
      flex-flow: row nowrap;
      height: 256px;
      width: 100%;
    }
    
    .foo-wrapper {
      background-color: orange;
      margin: 1.5rem;
      width: 2px;
    }
    
    .dot {
      background-color: #ebf0ff;
      border-radius: 0.5rem;
      height: 1rem;
      width: 1rem;
    }
    
    .foo-wrapper div:nth-child(1) {
      margin-top: 1rem;
    }
    
    .foo-wrapper div:nth-child(2) {
      margin-top: 1rem;
    }
    
    .foo-wrapper div:nth-child(3) {
      margin-top: 1rem;
    }
    
    .bar-wrapper {
      border: 1px solid green;
      display: flex;
      flex-flow: column nowrap;
      margin: 1.5rem;
      flex-grow: 1;
    }
       
    .bar-wrapper div:nth-child(1) {
      margin-top: 1rem;
    }
    
    .bar-wrapper div:nth-child(2) {
      margin-top: 2rem;
    }
    
    .bar-wrapper div:nth-child(3) {
      margin-top: 4rem;
    }
  </style>
</head>

<body>
  <div class="parent-wrapper">
    <div class="foo-wrapper">
      <div class="dot"></div>
      <div class="dot"></div>
      <div class="dot"></div>
    </div>
    <div class="bar-wrapper">
      <div>Lorem</div>
      <div>ipsum</div>
      <div>dolores</div>
    </div>
  </div>
</body>
html css flexbox vertical-alignment
1个回答
0
投票

除了测量每个包裹器子并动态分配高度(js)之外,我没有其他简便的方法。现在,最可行的解决方案似乎是对布局进行重组。

情况1:将bar-wrapper内容和foo-wrapper内容混合到一个div中。

.wrapper{
   display: flex;
   align-items: flex-start;
}
...
<div class="wrapper">
   <div class="dot"/>
   <div class="content">
      <p>text</p>
   </div>
<div>

情况2:如果您想要这种精确的设计,请将左侧的线分开(作为简单的<div/>或父容器的border-left,然后将点添加为伪元素,例如]

.content::before{
   position: absolute;
   content:"";
   height: 14px;
   width: 14px;
   border-radius: 7px;
   background: #000000;
   margin-left: -18px;
}
.content{
  position: relative;
  padding-left: 18px;
}
© www.soinside.com 2019 - 2024. All rights reserved.