我正在寻找一种方法来将多个项目彼此相邻对齐,让它们在填满整行后进行换行,最后一项占用最后一行的剩余宽度。
之前我在类似主题上发现了多个问题,解决方案通常会使项目使用float: left
将它们对齐在一行上,而overflow: hidden
在最后一个元素上使其占用剩余的空间自动。这些解决方案在一行中工作正常,但是一旦在最后一个元素之前有足够的项目,它们就会停止工作,它们会被包装成多行。然后,“last”元素仍然在第一行中呈现(如果有足够的空间),使其不再是最后一个元素。
但是,我希望最后一个元素始终保持最后一个元素,将它放在最后一行 - 无论是什么行 - 并自动占用那里的剩余空间。
使用包装Flexbox非常简单,因为您只需要将flex: 0 auto
放在以前的项目上,以使它们占用所需的任何空间(不需要更多),并且flex: 1
最后一个元素让它占用余数。 但是,我需要支持Internet Explorer 9,因此不幸的是,Flexbox是不可能的。
情况就是这样。运行代码段时,您可以使用“切换弹性框”按钮切换弹性框模式,该模式显示应该的样子。
* { box-sizing: border-box; }
.container {
width: 300px;
background: snow;
padding: 5px;
overflow: auto;
}
.element {
float: left;
margin: 2px 5px 2px 0;
background: lavender;
}
.last {
overflow: hidden;
}
.last > input {
width: 100%;
}
/* Working solution with flex box */
.flex .container {
display: flex;
flex-wrap: wrap;
}
.flex .element {
flex: 0 auto;
}
.flex .last {
flex: 1;
}
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="last"><input type="text" /></div>
</div>
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="last"><input type="text" /></div>
</div>
<button onclick="this.parentNode.classList.toggle('flex')">Toggle flex box</button>
答案 0 :(得分:13)
以下是解决方案:
<div style="clear:left;margin-top:22px"></div>
元素* .last
margin-top: -22px;
添加到.last
,其中金额与行高相同min-width
添加到.last
,它会按照您的预期工作。另外min-width: 1px;
在课堂上需要避免在特殊情况下它会变为0。在IE8 +,Edge,Chrome,Opera,Firefox中进行测试和工作
* { box-sizing: border-box; }
.container {
width: 300px;
background: snow;
padding: 5px;
overflow: auto;
}
.element {
float: left;
margin: 2px 5px 2px 0;
background: lavender;
}
.last {
overflow: hidden;
margin-top: -22px;
min-width: 1px;
}
.last > input {
width: 100%;
}
.container .unwrap {
clear: left;
margin-top: 22px
}
<div class="container">
<div class="unwrap"></div>
<div class="last"><input type="text" /></div>
</div>
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="unwrap"></div>
<div class="last"><input type="text" /></div>
</div>
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz boo</div>
<div class="unwrap"></div>
<div class="last" style="min-width: 100px">
<input type="text" placeholder="min-width 100px" />
</div>
</div>
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="unwrap"></div>
<div class="last"><input type="text" /></div>
</div>
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo baaaaaaaaaaaaaaaaaaaaaaar</div>
<div class="unwrap"></div>
<div class="last"><input type="text" /></div>
</div>
<div class="container">
<div class="element">Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz Foo bar baz</div>
<div class="unwrap"></div>
<div class="last"><input type="text" /></div>
</div>
* margin-top:22px
只是为了避免在容器中没有元素的情况下输入结果。它应该是输入
答案 1 :(得分:4)
以下解决方案并非完美,它使用的是位置黑客。如果您停用overflow: hidden;
,则会看到每个<input>
实际上与容器的宽度相同。但是通过一些CSS视觉调整,它看起来很好并且可以正常工作。
问题1:如果您输入的字符多于视觉上适合的字符数,则整个视图会向左移动。
解决方法1:将maxlength
值设置为<input>
可能有所帮助。
<强> jsfiddle 强>
* {
box-sizing: border-box;
}
.container {
width: 300px;
background: snow;
padding: 5px;
position: relative;
overflow: hidden; /*hide the overflow*/
}
span:after {
content: "\00A0" /*just for one no-break space*/
}
input {
width: 100%;
position: absolute; /*without any top/right/bottom/left value*/
border: 2px solid grey;
border-width: 0 0 2px 0;
}
input:focus {
outline: 0;
}
&#13;
<div class="container">
<span>FooFoo barFoo bar baz</span>
<input type="text" />
</div>
<div class="container">
<span>FooFoo barFoo bar bazFooFoo barFoo bar baz bla</span>
<input type="text" />
</div>
&#13;
答案 2 :(得分:1)
对于其他所有想要使用脚本选项的人来说,这里也适合您。
只需将data-calcattr
添加到您希望其width
属性设置为width: calc(100% - ??px);
的元素,其中??px
是其当前宽度。
旁注:
脚本可能需要进行调整以弥补未来的边界,边距等,因此这个更适合作为一种方法。
function calcattr() {
var els = document.querySelectorAll('[data-calcattr]');
// TODO: add switch to enable calc. different properties like
// get the remaining height as well, by checking the
// data-calcattr value, i.e.: data-calcattr='height'
for (i = 0; i < els.length; i++) {
els[i].setAttribute("style", "width: 0");
var lpos = parseInt(els[i].getBoundingClientRect().left);
var minw = parseFloat(getComputedStyle(els[i]).getPropertyValue('min-width'));
var calcwidth = "calc(100% - " + (lpos + 2) + "px)";
els[i].setAttribute("style", "width: " + calcwidth);
if ((els[i].getBoundingClientRect().right - lpos) < minw) {
els[i].setAttribute("style", "width: 100%");
}
}
}
window.onload = calcattr;
(function() {
window.addEventListener("resize", resizeThrottler, false);
var resizeTimeout;
function resizeThrottler() {
if ( !resizeTimeout ) {
resizeTimeout = setTimeout(function() {
resizeTimeout = null;
actualResizeHandler();
}, 66);
}
}
function actualResizeHandler() {
calcattr();
}
}());
* { box-sizing: border-box; }
.container {
width: 300px; //70%;
background: snow;
padding: 5px;
overflow: auto;
}
.fullwidth {
width: 100%;
}
.element {
float: left;
margin: 2px 5px 2px 0;
background: lavender;
}
.last > input {
width: 100%;
}
.last {
float: left;
min-width: 20px;
}
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="last" data-calcattr><input type="text" /></div>
</div>
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="last" data-calcattr><input type="text" /></div>
</div>
<div class="container fullwidth">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="last" data-calcattr><input type="text" /></div>
</div>