Элемент ввода стиля для заполнения оставшейся ширины контейнера
Скажем, у меня есть html-фрагмент, подобный этому:
<div style="width:300px;">
<label for="MyInput">label text</label>
<input type="text" id="MyInput" />
</div>
Это не мой точный код, но важно отметить метку и текстовый ввод в одной строке в контейнере с фиксированной шириной. Как я могу стилизовать ввод, чтобы заполнить оставшуюся ширину контейнера без упаковки и не зная размер метки?
Ответы
Ответ 1
так как все ненавидят таблицы для макета, они помогают с такими вещами, используя явные теги таблицы или используя 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>
Ответ 2
Вот простое и чистое решение без использования 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>
Ответ 3
Я предлагаю использовать 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>
Ответ 4
Для этого используйте flexbox. У вас есть контейнер, который собирается сгибать своих детей подряд. Первый ребенок занимает свое место по мере необходимости. Второй сгибает, чтобы взять все оставшееся пространство:
<div style="display:flex;flex-direction:row">
<label for="MyInput">label text</label>
<input type="text" id="MyInput" style="flex:1" />
</div>
Ответ 5
Самый простой способ добиться этого:
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/
Ответ 6
Очень простой трюк использует формулу 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>
Ответ 7
вы можете попробовать следующее:
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>
Ответ 8
Если вы используете 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/