【问题标题】:How to evenly space columns using FlexBox?如何使用 FlexBox 均匀分布列?
【发布时间】:2019-06-05 20:24:25
【问题描述】:

我们有一组结果应该显示在三列中。使用Flexbox,我们能够完成我们想要完成的大部分工作(即所有都具有相同的高度,在顶部正确对齐(参见flex__top,并在底部正确对齐(参见flex__bottom)。

但是,我们遇到了一个问题,当flex__bottom 元素之一的高度与其他元素不同时,对齐会关闭。

我们如何将所有列对齐以具有相同的高度,同时让flex__bottom 部分从相同的位置开始?

目标

  1. 确保所有列的高度相同
  2. flex__bottom 中的每个项目都应该有一个与所有其他项目对齐的border-top

问题

所需的输出

Codepen 可在此处获得,以防难以在内联代码 sn-p 中复制

/* Columns */

@media screen and (min-width: 320px) {
  .col-m-12 {
    width: 100%;
    padding: 16px;
    display: flex;
    justify-content: center;
    align-items: stretch;
  }
}

@media screen and (min-width: 768px) {
  .col-t-4 {
    width: calc(33% - 48px);
  }
}


/* Flex */

.flex__wrapper {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: stretch;
  flex-direction: row;
  flex: 0 1 auto;
}

.flex__link {
  display: flex;
  align-items: stretch;
  justify-content: space-between;
  flex-direction: column;
  background-color: #eee;
}

.flex__top {
  padding: 16px;
}

.flex__bottom {
  border-top: 1px solid;
}


/* Image */

img {
  height: auto;
  display: block;
  width: 100%;
}


/* Lists */

ul {
  list-style: none;
}

ul>li {
  display: inline-flex;
  border: 1px solid;
  margin: 4px;
  padding: 4px;
}


/* Link */

a {
  text-decoration: none;
  color: #000;
}
<div class="flex__wrapper">
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/arch" class="flex__img">
        <h2 class="flex__h2">Check back tomorrow;</h2>
        <p>I will see if the book has arrived.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/nature" class="flex__img">
        <h2 class="flex__h2">I am happy</h2>
        <p>I am never at home on Sundays.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>Progressively matrix</li>
          <li>Uniquely build extensible</li>
          <li>seamless customer</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/people" class="flex__img">
        <h2 class="flex__h2">Malls are great places to shop</h2>
        <p>I can find everything I need under one roof.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>maximizing</li>
          <li>Monotonectally whiteboard</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/tech" class="flex__img">
        <h2 class="flex__h2">I want to buy</h2>
        <p>but know it won’t suit me.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>task error-free</li>
          <li>Energistically</li>
          <li>practices</li>
          <li>ethical methodologies</li>
          <li>task error-free</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/animals" class="flex__img">
        <h2 class="flex__h2">Last Friday in three week</h2>
        <p>Blue worm shake hands with a legless lizard.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>incubate</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
        <h2 class="flex__h2">She advised</h2>
        <p>him to come back at once.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>Seamlessly</li>
          <li>build excellent</li>
        </ul>
      </div>
    </a>
  </div>
</div>

【问题讨论】:

  • 使用纯 CSS 可能不太可行,因为 flex_bottom 都有不同的父级,并且不知道其他 flex 容器中的内容大小。我会考虑像matchHeights 这样的js 插件。我已经为这种类型的东西使用了很多,而且它很棒。不用写任何js,只需要包含脚本并将data-mh="rowid"添加到每个flex_bottom,其中rowid是每行的唯一id。

标签: html css flexbox responsive


【解决方案1】:

如果您可以限制项目标题和描述中的内容数量,您可以在.flex-top 中添加一个最小高度。

/* Columns */

@media screen and (min-width: 320px) {
  .col-m-12 {
    width: 100%;
    padding: 16px;
    display: flex;
    justify-content: center;
    align-items: stretch;
  }
}

@media screen and (min-width: 768px) {
  .col-t-4 {
    width: calc(33% - 48px);
  }
}


/* Flex */

.flex__wrapper {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: stretch;
  flex-direction: row;
  flex: 0 1 auto;
}

.flex__link {
  display: flex;
  flex-direction: column;
  background-color: #eee;
}

.flex__top {
  padding: 0 16px;
  min-height: 350px;
}

.flex__bottom {
  border-top: 1px solid;
}


/* Image */

img {
  height: auto;
  display: block;
  width: 100%;
}


/* Lists */

ul {
  list-style: none;
}

ul>li {
  display: inline-flex;
  border: 1px solid;
  margin: 4px;
  padding: 4px;
}


/* Link */

a {
  text-decoration: none;
  color: #000;
}
<div class="flex__wrapper">
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/arch" class="flex__img">
        <h2 class="flex__h2">Check back tomorrow;</h2>
        <p>I will see if the book has arrived.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/nature" class="flex__img">
        <h2 class="flex__h2">I am happy</h2>
        <p>I am never at home on Sundays.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>Progressively matrix</li>
          <li>Uniquely build extensible</li>
          <li>seamless customer</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/people" class="flex__img">
        <h2 class="flex__h2">Malls are great places to shop</h2>
        <p>I can find everything I need under one roof.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>maximizing</li>
          <li>Monotonectally whiteboard</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/tech" class="flex__img">
        <h2 class="flex__h2">I want to buy</h2>
        <p>but know it won’t suit me.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>task error-free</li>
          <li>Energistically</li>
          <li>practices</li>
          <li>ethical methodologies</li>
          <li>task error-free</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/animals" class="flex__img">
        <h2 class="flex__h2">Last Friday in three week</h2>
        <p>Blue worm shake hands with a legless lizard.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>incubate</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="col-m-12 col-t-4">
    <a class="flex__link" href="#">
      <div class="flex__top">
        <img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
        <h2 class="flex__h2">She advised</h2>
        <p>him to come back at once.</p>
      </div>
      <div class="flex__bottom">
        <ul>
          <li>Learn More</li>
          <li>Seamlessly</li>
          <li>build excellent</li>
        </ul>
      </div>
    </a>
  </div>
</div>

但是,对于这种布局,网格可能是更好的选择

@media screen and (min-width: 640px) {
  .grid__wrapper {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 10px;
  }
}

.grid__item {
  background: #ccc;
  padding: 10px;
  margin-bottom: 10px;
}

@media screen and (min-width: 640px) {
  .grid__item {
    margin-bottom: 0;
  }
}

@media screen and (min-width: 640px) {
  .grid__link {
    height: 100%;
    display: grid;
    grid-auto-rows: 1fr;
  }
}

.item__bottom {
  border-top: 1px solid;
}

img {
  height: auto;
  display: block;
  width: 100%;
}

ul {
  list-style: none;
}

ul>li {
  display: inline-flex;
  border: 1px solid;
  margin: 4px;
  padding: 4px;
}

a {
  text-decoration: none;
  color: #000;
}
<div class="grid__wrapper">
  <div class="grid__item">
    <a class="grid__link" href="#">
      <div>
        <img src="https://placeimg.com/640/480/arch" class="flex__img">
        <h2>Check back tomorrow;</h2>
        <p>I will see if the book has arrived.</p>
      </div>
      <div class="item__bottom">
        <ul>
          <li>Learn More</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="grid__item">
    <a class="grid__link" href="#">
      <div>
        <img src="https://placeimg.com/640/480/nature" class="flex__img">
        <h2>I am happy</h2>
        <p>I am never at home on Sundays.</p>
      </div>
      <div class="item__bottom">
        <ul>
          <li>Learn More</li>
          <li>Progressively matrix</li>
          <li>Uniquely build extensible</li>
          <li>seamless customer</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="grid__item">
    <a class="grid__link" href="#">
      <div>
        <img src="https://placeimg.com/640/480/people" class="flex__img">
        <h2>Malls are great places to shop</h2>
        <p>I can find everything I need under one roof.</p>
      </div>
      <div class="item__bottom">
        <ul>
          <li>maximizing</li>
          <li>Monotonectally whiteboard</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="grid__item">
    <a class="grid__link" href="#">
      <div>
        <img src="https://placeimg.com/640/480/tech" class="flex__img">
        <h2>I want to buy</h2>
        <p>but know it won’t suit me.</p>
      </div>
      <div class="item__bottom">
        <ul>
          <li>Learn More</li>
          <li>task error-free</li>
          <li>Energistically</li>
          <li>practices</li>
          <li>ethical methodologies</li>
          <li>task error-free</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="grid__item">
    <a class="grid__link" href="#">
      <div>
        <img src="https://placeimg.com/640/480/animals" class="flex__img">
        <h2>Last Friday in three week</h2>
        <p>Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. </p>
      </div>
      <div class="item__bottom">
        <ul>
          <li>Learn More</li>
          <li>incubate</li>
        </ul>
      </div>
    </a>
  </div>
  <div class="grid__item">
    <a class="grid__link" href="#">
      <div>
        <img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
        <h2>She advised</h2>
        <p>him to come back at once.</p>
      </div>
      <div class="item__bottom">
        <ul>
          <li>Learn More</li>
          <li>Seamlessly</li>
          <li>build excellent</li>
        </ul>
      </div>
    </a>
  </div>
</div>

【讨论】:

    【解决方案2】:

    为达到预期效果,设置 flex__bottom 的高度

    问题: flex__bottom 高度未指定且子元素不均匀,默认高度:auto 会根据 flex__bottom 元素调整高度

    .flex__bottom {
        border-top: 1px solid;
        height: 100px;
    }
    

    https://codepen.io/nagasai/pen/LMgxLg

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2018-05-18
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2016-07-21
      • 2011-04-04
      相关资源
      最近更新 更多