我正在为这个看似简单的问题而烦恼,也许有人可以提供帮助。我想要任意数量的输入,带有标签,像图像中一样水平堆叠在一条线上。
4 回答
这种经典的“GUI 小部件布局引擎”布局的最佳选择是 CSS 3 flexbox功能,但浏览器支持还不够一致,我建议使用它。
如果没有这一点,灵活的“填充空间”布局通常需要表格布局。多亏了 CSS display
,没有必要将表格写成 HTML 表格。以下示例类似于您的示例图像:
<html><head>
<title>example</title>
<style type="text/css">
ul.myform { display: table; width: 100%; margin: 0; padding: 0; border-collapse: collapse; }
.myform li { display: table-cell; border: .1em solid gray; }
.myform li > * { display: table; width: auto; margin: .4em; }
.myform label { display: table-cell; width: 1%; padding-right: .4em; white-space: nowrap; }
.myform input { display: table-cell; width: 100%; }
.col1 { width: 33%; }
.col2 { width: 33%; }
.col3 { width: 34%; }
</style>
</head><body>
<form>
<ul class="myform">
<li class="col1"><span><label for="a">Label</label> <input id="a" name="a"></span></li>
<li class="col2"><span><label for="b">Label</label> <input id="b" name="c"></span></li>
<li class="col3"><span><label for="c">Label a bit longer</label> <input id="c" name="c"></span></li>
</ul>
</form>
</body></html>
在标记中只为布局引入了一个元素:<span>
需要用作表格单元格中的表格。
标签单元格的width: 1%;
不是实际尺寸,而只是迫使它尽可能窄(绝对而不是百分比不会产生相同的效果)。这white-space: nowrap;
可以防止标签因此而被包裹。
.col1
等等用于指定列的宽度。
编辑:更新以解决固定宽度的标签。(任意设置为100px)
http://jsfiddle.net/SebastianPataneMasuelli/XHrSr/
HTML:
<div>
<div>
<div class="label">LABEL</div>
<div>filler</div>
</div>
<div>
<div class="label">LABEL</div>
<div>filler</div>
</div>
<div>
<div class="label">LABEL</div>
<div>filler</div>
</div>
</div>
CSS:
div { width: 100%; }
div div {
width: 33%;
background-color: salmon;
float: left;
position: relative
}
div div div {
background-color: pink;
position: relative;
z-index: 2
}
div div div:last-child {
background-color: red;
position: absolute;
width: 100%;
z-index: 1
}
.label { width: 100px }
</p>
</p>
通常,当您想要“占用剩余空间”(例如您的输入框)时,您有 3 个选项:
- Flexbox,这将是理想的,但尚未得到广泛支持。
- 表格,如 Kevin Reids 回答中所解释的
- 建立单独的块格式化上下文,示例如下
HTML
<div class="container">
<div class="field">
<label for="in1">Label</label>
<div><input type="text" id="in1"></div>
</div>
<div class="field">
<label for="in2">Label</label>
<div><input type="text" id="in2"></div>
</div>
<div class="field">
<label for="in3">Label</label>
<div><input type="text" id="in3"></div>
</div>
</div>
CSS
.container {
padding: 20px;
background: #999;
overflow: hidden; /* for float containment */
}
.field {
padding: 4px;
background: #fff;
border: 2px solid #999;
float: left;
width: 33%;
-webkit-box-sizing: border-box; /* 33% effective width */
-moz-box-sizing: border-box;
box-sizing: border-box;
}
label {
float: left;
width: 100px; /* fixed width of label */
}
.field div {
overflow: hidden; /* create a new Block Formatting Context */
}
/* inputs fill the new BFC */
input {
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
仅添加了 1 个布局元素,即包装input
. 这是因为input
不想表现得像块元素,即使你告诉他这样做。
小提琴:http: //jsfiddle.net/RqzJC/
有很多方法可以解决这个问题。就个人而言,我喜欢使用表格来处理这种类型的数据(但如果不是表格数据,建议使用 DIV 等其他方式)。我将尝试展示一个表格的快速示例:
桌子:
<table width="100%" cellpadding="0" callspacing="0" border="0">
<tr>
<td width="200">LABEL 1</td><td> </td> <!-- this is the padding table cell -->
<td width="200">LABEL 2</td><td> </td>
<td width="200">LABEL 3</td><td> </td>
</tr>
</table>
使用 Div 稍微复杂一些,因为它们默认是内联的;你会得到你的标签在不同的行。您可以查看诸如“display: table-cell”之类的 CSS 属性以实现与上述相同的结果,否则您可以使用 CSS 查看绝对定位和相对定位。
<div width="100%">
<div style="position:absolute; top:0px; width: 33%;">LABEL 1</div>
<div style="position: absolute; top:0px; left: 33%; width: 33%;">LABEL 2</div>
<div style="position: absolute; top:0px; left: 66%; width: 34%;">LABEL 3</div>
</div>
但是,这仍然存在一些问题,因为它假设您的布局是页面/浏览器查看区域宽度的 100%。