我有一个<ul>,这是一个弹性盒子,里面有一堆<li>,它们是弹性物品.

我试图让<li>有一个灵活的宽度,即保持两个大小之间使用最小宽度和最大宽度.只要他们在同一条线上,效果就很好.然而,当它们包装时,新线上的<li> s会尽可能多地使用空间.这意味着它们在第一条线上是小的,而在第二条线上只有几个时是大的.

有没有办法告诉Flexbox在包装后保持物品的宽度,同时保持弹性的宽度?

wrapping demo:

在此处输入图像描述

我的代码如下所示:

<ul>
  <li>
    <figure>
      <img src="http://placekitten.com/g/250/250">
    </figure>
  </li>
  <li>
    <figure>
      <img src="http://placekitten.com/g/100/100">
    </figure>
  </li>
  <!-- ... -->
</ul>

和CSS:

ul {
  display: flex;
  flex-wrap: wrap;
}

  li {
    min-width: 40px;
    max-width: 100px;
    flex: 1 0 0;
  }

100,调整您的窗口大小以查看其换行.

推荐答案

TL;DR

这不是我称之为solution本身的东西,但它是一个相当优雅的解决方案,只使用媒体查询,更重要的是no JavaScript

混合(SCSS):

@mixin flex-wrap-fix($flex-basis, $max-viewport-width: 2000px) {
  flex-grow: 1;
  flex-basis: $flex-basis;
  max-width: 100%;

  $multiplier: 1;
  $current-width: 0px;

  @while $current-width < $max-viewport-width {
    $current-width: $current-width + $flex-basis;
    $multiplier: $multiplier + 1;

    @media(min-width: $flex-basis * $multiplier) {
      max-width: percentage(1/$multiplier);
    }
  }
}

用法:

将mixin应用于flex项目:

.flex-item {
  @include flex-wrap-fix(100px)
}

更新:

只要您的弹性容器宽度与视口大小匹配(就像OP的示例中的情况一样),上面的混合应该可以起到作用.否则,媒体查询不会对您有所帮助,因为它们始终基于视口宽度.但是,您可以使用css-element-queries库及其元素查询,而不是浏览器媒体查询.以下是可应用于FLEX container的混音:

@mixin flex-container-wrap-items($flex-basis, $max-expected-width: 2000px) {
  display: flex;
  flex-wrap: wrap;

  > * {
    max-width: 100%;
    flex-grow: 1;
    flex-basis: $flex-basis;
  }

  $multiplier: 1;
  $current-width: 0px;

  @while $current-width < $max-expected-width {
    $current-width: $current-width + $flex-basis;
    $multiplier: $multiplier + 1;

    &[min-width~="#{$flex-basis * $multiplier}"] > * {
      max-width: percentage(1/$multiplier);
    }
  }
}

Explanation:

假设按照OP的示例,我们希望每个项目的最大宽度为100px,因此我们知道,对于浏览器宽度100px,我们每行可以容纳一个项目,依此类推:

| Viewport Width | Max Item Count Per Row | Item Width (min-max) |
|----------------|------------------------|----------------------|
| <= 100         | 1                      | 0px - 100px          |
| <= 200         | 2                      | 50px - 100px         |
| <= 300         | 3                      | 50px - 100px         |
| <= 400         | 4                      | 50px - 100px         |
| <= 500         | 5                      | 50px - 100px         |
| <= 600         | 6                      | 50px - 100px         |

我们可以编写媒体查询来创建以下规则:

| Viewport Width | Max Item Count Per Row | Item Max Width | Calculation |
|------------------------------------------------------------------------|
| <= 100px       | 1                      | 100%           | (100/1)     |
| <= 200px       | 2                      | 50%            | (100/2)     |
| <= 300px       | 3                      | 33.33333%      | (100/3)     |
| <= 400px       | 4                      | 25%            | (100/4)     |
| <= 500px       | 5                      | 20%            | (100/5)     |
| <= 600px       | 6                      | 16.66666%      | (100/6)     |

如下所示:

li {
  flex: 1 0 0
  max-width: 100%;
}

@media(min-width: 200px) {
  li { max-width: 50%; }
}

@media(min-width: 300px) {
  li { max-width: 33.33333%; }
}

@media(min-width: 400px) {
  li { max-width: 25%; }
}

@media(min-width: 500px) {
  li { max-width: 20%; }
}

@media(min-width: 600px) {
  li { max-width: 16.66666%; }
}

当然,这是重复的,但您最有可能使用的是某种预处理器,它可以为您解决重复性问题.这正是上面TL;DR节中的Mixin所做的事情.

现在,我们只需将flex-basis指定为100px,将最大浏览器窗口宽度(默认为2000px)指定为optionally,即可创建媒体查询:

@include flex-wrap-fix(100px)

Example

最后,使用上面的混合,使用所需输出的原始CodePen示例的派生版本:

http://codepen.io/anon/pen/aNVzoJ

demo of the solution

Css相关问答推荐

使用location:stickly将元素固定到其父容器的顶部

在react native中应用阴影

如何居中对齐容器父对象?

如何将下拉面板放置在MAT-SELECT文本框的正下方

如何通过重复的网格区域来简化网格布局?

为什么 KaTeX 的彩虹文本只能在 Firefox 上运行?

滚动弹性盒

如何在 konvajs 中居中放置项目?

将框架放入 bootstrap 模式的正确方法是什么?

不能在带有 SCSS 的过滤器灰度内使用 CSS 变量

nth-child 在一个页面上工作,但不在另一个页面上

从 Angular SCSS 生成 CSS?

当我进入登录页面时,它处于桌面模式(响应式设计消失)

在样式化组件中使图像重叠

如何制作一个居中的标题样式,其中换行符将最长的行排列在底部

删除 IE10 Select 元素箭头

如何使内容出现在固定的 DIV 元素下方?

完成后如何防止css3动画重置?

使用 inline-block 换行?

bootstrap.css 和 bootstrap-theme.css 有什么区别?