设置输入元素的样式以填充其容器的剩余宽度


195

假设我有一个这样的html代码段:

<div style="width:300px;">
    <label for="MyInput">label text</label>
    <input type="text" id="MyInput" />
</div>

这不是我的确切代码,但重要的是,在固定宽度容器中的同一行上有一个标签和一个文本输入。如何设置输入的样式以填充容器的剩余宽度,而无需包装并且不知道标签的大小?


我知道这个问题是很久以前的,但是我会添加一个很好的解决方案,当然这不是过时的。
danijar

Answers:


137

尽管每个人都讨厌表的布局,但他们使用显式表标记或display:table-cell确实对此类事情有所帮助

<div style="width:300px; display:table">
    <label for="MyInput" style="display:table-cell; width:1px">label&nbsp;text</label>
    <input type="text" id="MyInput" style="display:table-cell; width:100%" />
</div>

IE6可以使用吗?否则,我可能实际上需要为此定义一个小表:(
Joel Coehoorn

不知道,我想说做一下快速测试以了解他们的工作,但是我无法轻松访问IE
cobbal

没关系:这使我朝着可行的方向发展。
Joel Coehoorn

42
愿意分享乔尔?
约翰

10
同意,您应该与我们其他人分享您的实际解决方案,并将其标记为答案-照原样,这很烦人。
BrainSlugs83

155

这是一个简单干净的解决方案,无需使用JavaScript或表布局技巧。类似于此答案:输入文本自动宽度填充,其他元素浮动100%

重要的是,输入字段的跨度为display:block。接下来的事情是必须首先按下按钮,然后是输入字段。

然后,您可以将按钮浮动到右侧,输入字段将填充剩余的空间。

form {
    width: 500px;
    overflow: hidden;
    background-color: yellow;
}
input {
    width: 100%;
}
span {
    display: block;
    overflow: hidden;
    padding-right:10px;
}
button {
    float: right;
}
<form method="post">
     <button>Search</button>
     <span><input type="text" title="Search" /></span>
</form>

一个简单的小提琴:http : //jsfiddle.net/v7YTT/90/

更新1:如果您的网站仅针对现代浏览器,则建议使用灵活框。在这里,您可以看到当前的支持

更新2:这甚至适用于与输入字段共享全部内容的多个按钮或其他元素。这是一个例子


但是,这会更改html:您想要的最后一项在html中首先列出。
乔尔·科洪

@JoelCoehoorn,是的。由您决定是否更喜欢使用表。
danijar

2
这很好。使用float:left而不是right来创建一个Facebook样式标记器或类似的东西。
hobberwickey 2014年

1
这很棒!但是有人可以解释其工作原理的逻辑吗?
谢洛克2014年

1
这是一个不好的答案。如果您只是看一眼,看起来就可以了,但是请尝试小提琴。它实际上是输入框的一半,但是除非您开始对其进行测试,否则您将无法分辨。目的是使输入框适合显示区域的宽度,而不是截断它。如果您尝试进行任何样式设置(圆角,边框,文本的右对齐),这将完全失败。
罗杰·希尔

55

我建议使用Flexbox:

不过,请务必添加正确的供应商前缀!

form {
  width: 400px;
  border: 1px solid black;
  display: flex;
}

input {
  flex: 2;
}

input, label {
  margin: 5px;
}
<form method="post">
  <label for="myInput">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input"/>
</form>


这个问题很老了……这可能就是我今天要怎么做。如果有机会尝试一下,并且它可以与所需的所有浏览器一起使用,我将更新接受的答案。不过,可能要花很长时间才能尝试。我现在在sys管理员团队中,不再做太多的网络工作。
Joel Coehoorn 2014年

您能否提供一个使用示例label?我将特别感兴趣如何使用border-box...来
布局

4
为什么flex: 2flex: 1呢?
Iulius Curt

42

请为此使用flexbox。您有一个容器,它将子容器弯曲成一排。第一个孩子根据需要占用其空间。第二个可以弯曲以占用所有剩余空间:

<div style="display:flex;flex-direction:row">
    <label for="MyInput">label&nbsp;text</label>
    <input type="text" id="MyInput" style="flex:1" />
</div>


击掌!:)有一件值得一提的事情(在我们许多人仍然是刚开始接受flexbox模型的情况下):INPUT将以FORM的形式出现,而这又可能会出现在整个flex容器中(例如,与其他非形式的东西一起使用) ),那么它将不再起作用-因为flex行为仅适用于直接后代(即子元素)。因此,FORM也必须是弹性约束力!
Sz。

row默认情况下,flex-direction已经存在,您不必指定它。
Fabian Picone

为胜利而屈服(再次);2019
secretwep

17

实现此目的的最简单方法是:

CSS:

label{ float: left; }

span
{
    display: block;
    overflow: hidden;
    padding-right: 5px;
    padding-left: 10px;
}

span > input{ width: 100%; }

HTML:

<fieldset>
    <label>label</label><span><input type="text" /></span>
    <label>longer label</label><span><input type="text" /></span>
</fieldset>

看起来像: http : //jsfiddle.net/JwfRX/


这对我来说很好。溢出防止东西被包裹,右边的padding防止右边被切掉。
冯·莱蒙加格尔教授13年

PS:对于现代浏览器,我建议使用如leishman所述的flex-box…
llange,

4

非常简单的技巧是使用CSS calc公式。所有现代浏览器,IE9,各种移动浏览器都应支持此功能。

<div style='white-space:nowrap'>
  <span style='display:inline-block;width:80px;font-weight:bold'>
    <label for='field1'>Field1</label>
  </span>
  <input id='field1' name='field1' type='text' value='Some text' size='30' style='width:calc(100% - 80px)' />
</div>

4
这是假设您知道标签的确切宽度或愿意留出更多空间。
纳尔逊·罗瑟梅尔

2

你可以试试这个:

div#panel {
    border:solid;
    width:500px;
    height:300px;
}
div#content {
	height:90%;
	background-color:#1ea8d1; /*light blue*/
}
div#panel input {
	width:100%;
	height:10%;
	/*make input doesnt overflow inside div*/
	-webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
	/*make input doesnt overflow inside div*/
}
<div id="panel">
  <div id="content"></div>
  <input type="text" placeholder="write here..."/>
</div>


今天最好的方法
yota

0

如果您使用的是Bootstrap 4:

<form class="d-flex">
  <label for="myInput" class="align-items-center">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input" class="flex-grow-1"/>
</form>

更好的是,使用Bootstrap内置的功能:

  <form>
    <div class="input-group">
      <div class="input-group-prepend">
        <label for="myInput" class="input-group-text">Default</label>
      </div>
      <input type="text" class="form-control" id="myInput">
    </div>
  </form>

https://jsfiddle.net/nap1ykbr/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.