【发布时间】:2017-01-31 21:53:55
【问题描述】:
我正在尝试实现 flexbox,但遇到了障碍。我有一排可以从 1 到 4 的项目。当所有四个项目都可见时,“space-between”属性可以完美地确保每个项目之间的空间是正确的,并且左侧没有空格第一项,或最后一项的右侧。整个容器被占用。这很棒。
但是,如果我有 2 或 3 件物品,那就有点不对劲了。 Flexbox 自然地在这些项目之间提供了一个空间。如果有 2 个项目,则一个左对齐,另一个右对齐。如果是三个,第二个自然在中间。
我遇到的问题是我希望能够定义我的项目的宽度,而不是边距。否则,在响应期间,我将不得不消除奇数/偶数/第一个/最后一个等的边距,以确保整个容器都被占用。
有没有办法使用“space-between”功能在每个项目之间自动采用正确的边距,但如果少于 4 个,请确保所有项目都向左对齐?
下面的示例显示了自然结果。最后一项是我希望它如何工作。但是,我必须为每个定义一个边距,这是我想避免的。
任何帮助将不胜感激。
.row {
width:1280px;
margin:0 auto 0;
margin-bottom:20px;
background:#ebebeb;
}
ul {
margin:0;
padding:0;
list-style:none;
display:flex;
justify-content:space-between;
}
li {
width:23%;
background:#999
}
.row--ideal ul {
justify-content:flex-start;
}
.row--ideal ul li {
margin-right:35px;
}
<div class="row">
<ul>
<li> Item 1 </li>
<li> Item 2 </li>
<li> Item 3 </li>
<li> Item 4 </li>
</ul>
</div>
<div class="row">
<ul>
<li> Item 1 </li>
<li> Item 2 </li>
</ul>
</div>
<div class="row">
<ul>
<li> Item 1 </li>
<li> Item 2 </li>
<li> Item 3 </li>
</ul>
</div>
<div class="row row--ideal">
<h3>Ideal Result</h3>
<ul>
<li> Item 1 </li>
<li> Item 2 </li>
<li> Item 3 </li>
</ul>
</div>
【问题讨论】:
-
with
flexbox我猜 simple 的方法是使用visibility: hidden创建一个 invisible 元素,以防 3lis 例如... -
我不明白你为什么说在响应期间你将不得不改变一些事情。你设置了
width: 23%,不管屏幕大小,只需要23%。我认为你应该删除space-between并使用margin-right: 1%;和margin-left: 1%;,看看this fiddle -
在这种情况下,我将无法确定我将拥有多少物品。所以我可能有 1 个面板、2 个面板、3 个面板。它是从内容管理系统聚合的数据。不幸的是(如果我正确理解你的建议......)将意味着我需要计算出丢失了多少项目并创建丢失的元素来填补空白。如果是这样的话,恐怕在这种情况下它就行不通了。我正在寻找一种方法来保持 HTML 和 CSS 的语法干净而没有任何黑客攻击。
-
@FacundoLaRocca - 正如我所提到的,在最左边的项目和最右边的项目上没有边距效果很好。我不想要那里的利润。您的示例引入了边距。我在页面上有其他需要对齐的内容。因此,这些物品需要均匀分布。否则我只会使用“空间环绕”。在响应模式期间,项目将达到 48%,然后是 100%。
-
嗯,我认为您将无法按照自己喜欢的方式做事。通常使事物具有响应性意味着改变它的行为方式。我的建议是尝试考虑屏幕尺寸,如果你在桌面上,可能会渲染 4 列,如果你在平板电脑中,可能会渲染两到三列,但如果你在一部你只需要重装的手机。