Let's say I have an html snippet like this:
<div style="width:300px;">
<label for="MyInput">label text</label>
<input type="text" id="MyInput" />
</div>
This isn't my exact code, but the important thing is there's a label and a text input on the same line in a fixed-width container. How can I style the input to fill the remaining width of the container without wrapping and without knowing the size of the label?
as much as everyone hates tables for layout, they do help with stuff like this, either using explicit table tags or using display:table-cell
<div style="width:300px; display:table">
<label for="MyInput" style="display:table-cell; width:1px">label text</label>
<input type="text" id="MyInput" style="display:table-cell; width:100%" />
</div>
you can try this :
div#panel {_x000D_
border:solid;_x000D_
width:500px;_x000D_
height:300px;_x000D_
}_x000D_
div#content {_x000D_
height:90%;_x000D_
background-color:#1ea8d1; /*light blue*/_x000D_
}_x000D_
div#panel input {_x000D_
width:100%;_x000D_
height:10%;_x000D_
/*make input doesnt overflow inside div*/_x000D_
-webkit-box-sizing: border-box;_x000D_
-moz-box-sizing: border-box;_x000D_
box-sizing: border-box;_x000D_
/*make input doesnt overflow inside div*/_x000D_
}
_x000D_
<div id="panel">_x000D_
<div id="content"></div>_x000D_
<input type="text" placeholder="write here..."/>_x000D_
</div>
_x000D_
Easiest way to achieve this would be :
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>
Looks like : http://jsfiddle.net/JwfRX/
Here is a simple and clean solution without using JavaScript or table layout hacks. It is similar to this answer: Input text auto width filling 100% with other elements floating
It is important to wrap the input field with a span which is display:block
. Next thing is that the button has to come first and the the input field second.
Then you can float the button to the right and the input field fills the remaining space.
form {_x000D_
width: 500px;_x000D_
overflow: hidden;_x000D_
background-color: yellow;_x000D_
}_x000D_
input {_x000D_
width: 100%;_x000D_
}_x000D_
span {_x000D_
display: block;_x000D_
overflow: hidden;_x000D_
padding-right:10px;_x000D_
}_x000D_
button {_x000D_
float: right;_x000D_
}
_x000D_
<form method="post">_x000D_
<button>Search</button>_x000D_
<span><input type="text" title="Search" /></span>_x000D_
</form>
_x000D_
A simple fiddle: http://jsfiddle.net/v7YTT/90/
Update 1: If your website is targeted towards modern browsers only, I suggest using flexible boxes. Here you can see the current support.
Update 2: This even works with multiple buttons or other elements that share the full with with the input field. Here is an example.
I suggest using Flexbox:
Be sure to add the proper vendor prefixes though!
form {_x000D_
width: 400px;_x000D_
border: 1px solid black;_x000D_
display: flex;_x000D_
}_x000D_
_x000D_
input {_x000D_
flex: 2;_x000D_
}_x000D_
_x000D_
input, label {_x000D_
margin: 5px;_x000D_
}
_x000D_
<form method="post">_x000D_
<label for="myInput">Sample label</label>_x000D_
<input type="text" id="myInput" placeholder="Sample Input"/>_x000D_
</form>
_x000D_
If you're using 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>
Better yet, use what's built into 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>
Very easy trick is using a CSS calc
formula. All modern browsers, IE9, wide range of mobile browsers should support this.
<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>
Please use flexbox for this. You have a container that is going to flex its children into a row. The first child takes its space as needed. The second one flexes to take all the remaining space:
<div style="display:flex;flex-direction:row">_x000D_
<label for="MyInput">label text</label>_x000D_
<input type="text" id="MyInput" style="flex:1" />_x000D_
</div>
_x000D_
Source: Stackoverflow.com