我有一个
我正在尝试获取
有没有办法告诉flexbox在包装后保持物品的宽度,同时保持灵活的宽度?
包装演示:
我的代码如下所示:
<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;
}
这里有一个关于coDepen的实时示例,带有一些额外的注释,调整您的窗口以查看它的包装。
我一直在试验你的codepen,我设置了flex:0 1 10%
当然,你可以随心所欲地设置flex basis,我只是想证明这一点,如果你设置flex basis并允许它收缩,在这种情况下,它会表现得更好。
我想这就是你需要的。这是预览:http://codepen.io/anon/pen/bwqNEZ
干杯
这不是你想要的答案,但使用起来很好:
display: grid;
grid-template-columns: repeat(auto-fill, minmax(70px, 1fr));
https://codepen.io/omergal/pen/povzJrz
ul {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(70px, 1fr));
}
li {
min-width: 40px;
max-width: 100px;
}
ul,
li {
margin: 0;
padding: 0;
list-style: none;
}
ul {
background-color: tomato;
}
li {
margin: 0.5em;
background-color: darkgreen;
}
img {
width: 100%;
opacity: 0.5;
}
figure,
img {
margin: 0;
padding: 0;
}
<ul>
<li>
<figure>
<img src="http://placekitten.com/g/250/250">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/101/101">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/201/201">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/150/150">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/80/80">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/111/111">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/40/40">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/110/110">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/75/75">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/89/89">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/150/150">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/32/32">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/61/61">
</figure>
</li>
<li>
<figure>
<img src="http://placekitten.com/g/320/320">
</figure>
</li>
</ul>
这不是我所说的解决方案本身,但它是一个相当优雅的解决方案,只使用媒体查询,更重要的是不使用JavaScript!
@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);
}
}
}
将混合应用到您的flex项目:
.flex-item {
@include flex-wrap-fix(100px)
}
只要你的flex容器宽度与视口大小匹配,上面的混合就可以做到,就像OP的例子一样。否则,媒体查询不会帮助您,因为它们总是基于视口宽度。但是,您可以使用css-etent-Query
库及其元素查询来代替浏览器媒体查询。下面是一个可以应用于flex容器的混合代码:
@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);
}
}
}
比方说,根据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中的mixin的意思;科室医生。
我们现在要做的就是指定100px
作为我们的flex基础
,以及可选的最大浏览器窗口宽度(默认为2000px
)来创建媒体查询:
@include flex-wrap-fix(100px)
最后,使用上面的混音,获得具有所需输出的原始CodePen示例的分叉版本:
http://codepen.io/anon/pen/aNVzoJ
我不想"第二"div占用100%。我想保持它像"inline-block"的宽度应该延长,直到内容可用。 提前谢谢
我有一个div里面有2个跨度。如果第一个跨距内容足够短,可以在单行上显示,则跨距宽度(在开发工具中)与文本内容的宽度相同。将第二个跨距直接定位在第一个跨距的右侧。 如果第一个跨距的内容足够长,可以使其环绕跨距的宽度,则该跨距的宽度将大于内容的宽度。这意味着在换行的文本后面有多余的空格。它强制第二个跨距与父div的右边框对齐,并强制第一个跨距的宽度获得剩余的宽度。 是否有一种方法可以使多行跨度的宽度
我有时觉得Flex太复杂了。 演示:https://jsfiddle.net/304xhguw/ 我试图创建一个容器,它的末尾有多行文本: 使用Flex应该很容易,对吧? 完成后,容器使用flex,在末尾对齐项,并且h1由于的和而创建新行。完美。 不是真的: 等等,刚才发生了什么事<代码> 不用担心,有一些惊人的特性应该可以工作,让我们试试:
我使用布局管理器将此配置为: 我的具体情况是子项没有预定义的宽度。相反,我将它们的宽度设置为 然后我希望为每个项目提供1/3的可用空间。 到目前为止很好,但我希望,如果在最后一行只有1或2个项目显示,我想居中他们。 正如您在最后一行中看到的,这些项被拉到布局的边缘,父项的宽度在它们之间被分割。这是因为正如我所说的,它们的宽度不是预先确定的。 我所期望的是计算项目的宽度,因为它们显示为每行3个项目,
我有一个javafx GridPane,当我调整阶段大小时,它会调整自己的大小以适应阶段的大小。我希望gridpane的高度与gridpane的宽度相匹配,并因此将大小调整为尽可能大的大小,同时保持这种约束。 我不得不在GridPane的父级中添加更多的元素。我发现添加的元素完全没有正常的行为,并且相互重叠。 当然,当我移除重写方法时,它们不再重叠,但当我调整舞台大小时,网格窗格并没有保持一个完美
此问题针对新的ViewPager2类。 旧的ViewPager也有类似的问题,但解决方案需要扩展ViewPager。但是,ViewPager2是最终版本,因此无法扩展。 在我的情况下,我有一个包含三个不同片段的ViewPager2。这些片段中的一个比其他两个高得多,这意味着当你滑动到其中一个较短的片段时,有很多空白。那么我如何有效地将ViewPager2包装到当前片段的高度呢?