如何让所有项目缩小到二维的最大项目内容?

Dre*_*TeK 7 html css css3 flexbox css-grid

在下面的示例中,我希望将所有项目都设置为最大内容的宽度(例如,项目5).

  • 列表中的项目数是动态的,可能有数百个.

  • 每个项目内容的宽度也是动态的.

  • 每行中的项目数量将根据容器的宽度而变化.

期望的输出

在此输入图像描述

注意: 媒体查询不适用于我的方案.


使用CSS FLEX

Flex被认为是一维的.这意味着它可以在单个轴(行)上实现所需的结果,除非内容小于可用空间.

非包装示例(单行)

.container {
  display: flex;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
  margin: 0 10px 10px 0;
  flex: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
</div>
Run Code Online (Sandbox Code Playgroud)

Flex的flex-wrap属性可用于创建二维布局.再次这很好用,但需要一个固定的宽度值才能计算每个项目的宽度.

包装示例(多行)

.container {
  display: flex;
  flex-wrap:wrap;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
  margin: 0 10px 10px 0;
  flex: 0 1 100px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>
Run Code Online (Sandbox Code Playgroud)


使用CSS GRID

对于二维设计,建议使用CSS Grid,但下面的示例使用固定宽度.这似乎min-content需要考虑因素,但如何?

失败的例子

grid-template-columns: repeat(auto-fit, min-content);
Run Code Online (Sandbox Code Playgroud)

固定示例(多行)

.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, 100px);
  grid-auto-rows: 20px;
  grid-gap: 5px;
}

.item {
  background: #58c;
  text-align: center;
  white-space: nowrap;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5 is longer</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>
Run Code Online (Sandbox Code Playgroud)

由于以下W3C注释,我不认为这可以通过网格实现:

"自动重复(自动填充或自动装配)不能与固有或灵活的尺寸相结合."


摘要

从根本上说,我认为用css做这个没有内在的方法.

要获得每个项目的宽度,它需要:

  • 预定义的(固定的).
  • 使用百分比或分数水平推断.
  • 从当前列垂直推断.

我看不到同时从另一行AND列推断项目宽度的方法.

Mic*_*l_B 2

这似乎是 CSS Grid 应该能够处理的问题。但我在规范中没有看到任何提供解决方案的内容。我并不是说它不存在,无论是作为一个简单的命令还是规则的组合。我只是还没有找到它(如果存在的话)。

\n\n

这是我能得到的最接近的:

\n\n

\r\n
\r\n
.container {\r\n  display: grid;\r\n  grid-auto-columns: min-content; /* max-content works, as well */\r\n  grid-gap: 10px;\r\n}\r\n\r\n.item {\r\n  background: #58c;\r\n  text-align: center;\r\n  white-space: nowrap;\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n
<div class="container">\r\n  <div class="item">1</div>\r\n  <div class="item">2</div>\r\n  <div class="item">3</div>\r\n  <div class="item">4</div>\r\n  <div class="item">5 is longer</div>\r\n  <div class="item">6</div>\r\n  <div class="item">7</div>\r\n  <div class="item">8</div>\r\n  <div class="item">9</div>\r\n  <div class="item">10</div>\r\n</div>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

上面的代码解决了宽度问题——所有项目都是最长项目的长度。但没有包装。这个问题在下面的例子中被翻转了。

\n\n

\r\n
\r\n
.container {\r\n  display: grid;\r\n  grid-template-columns: repeat(auto-fill, minmax(min-content, 1px));\r\n  grid-gap: 10px;\r\n}\r\n\r\n.item {\r\n  background: #58c;\r\n  text-align: center;\r\n  white-space: nowrap;\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n
<div class="container">\r\n  <div class="item">1</div>\r\n  <div class="item">2</div>\r\n  <div class="item">3</div>\r\n  <div class="item">4</div>\r\n  <div class="item">5 is longer</div>\r\n  <div class="item">6</div>\r\n  <div class="item">7</div>\r\n  <div class="item">8</div>\r\n  <div class="item">9</div>\r\n  <div class="item">10</div>\r\n</div>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

上面的代码进行了包装,并绕过了使用时的固有大小限制repeat()。然而,最长内容等长要求失败了。

\n\n
\n

7.2.2.1. 语法\n repeat()

\n\n

自动重复(auto-fill或)不能与固有灵活auto-fit大小组合\n 。

\n\n
    \n
  • 内在的尺寸调整函数是min-content, max-content, auto, fit-content()

  • \n
  • 灵活的尺寸调整函数是<flex>( fr)。

  • \n
\n
\n\n

auto您可以通过以下方式绕过限制:

\n\n
repeat(auto-fill, minmax(min-content, 1px))\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

minmax(min,max)

\n\n

定义大于或等于min且小于或等于max 的大小范围。

\n\n

如果max < min,则max被忽略并被minmax(min,max)视为min

\n\n

作为最大值,一个<flex>值设置 track\xe2\x80\x99s 弹性系数;它至少是无效的。

\n
\n\n

也许其他人可以从这里拿走它。

\n

  • @Micheal_B 感谢您的见解。这几乎就是我昨天读到的整个规范。我以为这会很简单,但网格似乎无法实现。 (2认同)