Как выровнять вложенные дочерние элементы по вертикали в горизонтальном флексбоксе? - PullRequest
0 голосов
/ 01 декабря 2019

Как видно из фрагмента ниже, точки под foo-wrapper не соответствуют вертикальному выравниванию текстовых меток под bar-wrapper. Но я ожидал этого, согласно :nth-child(i) правилам.

Как я могу сделать точки, которые являются дочерними элементами другого контейнера, который впоследствии является дочерним элементом горизонтального flexbox (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>

1 Ответ

1 голос
/ 01 декабря 2019

Я не нахожу простого способа сделать это, кроме измерения каждого дочернего элемента bar-wrapper и динамического назначения высоты (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;
}

Заполнение и поля являются необязательными, в зависимости от вашего макета.

...