Введите элемент ввода, чтобы заполнить оставшуюся ширину его контейнера

199

Допустим, у меня есть фрагмент HTML вроде этого:

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

Это не мой точный код, но важно то, что в контейнере фиксированной ширины есть метка и текстовый ввод на одной строке. Как я могу стилизовать ввод, чтобы заполнить оставшуюся ширину контейнера без переноса и не зная размера метки?

Джоэл Коухорн
источник
Я знаю, что вопрос был давно, но я добавлю хорошее решение, которое, конечно, не устарело.
Данияр

Ответы:

138

хотя все ненавидят таблицы за разметку, они помогают с такими вещами, используя явные теги таблиц или используя 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>
cobbal
источник
Будет ли это работать с IE6? В противном случае мне, возможно, придется на самом деле определить небольшую таблицу для этого :(
Джоэл Коухорн
не уверен, я бы сказал, сделайте быстрый тест, чтобы увидеть, что они делают, но у меня нет легкого доступа к IE
cobbal
Это нормально: это указало мне на то, что работает.
Джоэл Коухорн
42
Хотите поделиться Джоэл?
Джон
10
Согласитесь, вы должны поделиться своим фактическим решением с остальными из нас и отметить это как ответ вместо этого - как есть, это немного раздражает.
BrainSlugs83
156

Вот простое и чистое решение без использования 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, это верно. Это ваше решение, предпочитаете ли вы это по сравнению с использованием стола или нет.
Данияр
2
Это прекрасно работает. Используйте float: left вместо right, чтобы создать тег в стиле facebook или что-то подобное.
hobberwickey
1
Это прекрасно работает! Но кто-то может объяснить логику, как это работает ?!
Шерлок
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>

Leishman
источник
Вопрос очень старый ... это, наверное, как я бы сделал это сегодня. Если у меня будет возможность попробовать его, и он будет работать со всеми необходимыми мне браузерами, я обновлю принятый ответ. Но, вероятно, пройдет много времени, прежде чем я попробую это. Я сейчас в команде sys admin, больше не занимаюсь веб-вещами.
Джоэл Коухорн
Не могли бы вы привести пример, используя label? Мне было бы особенно интересно узнать, как можно border-box
выложить
4
Почему flex: 2и нет flex: 1?
Юлий Курт
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>

basarat
источник
Привет пять! :) Стоит добавить одну вещь (в контексте того, что многие из нас все еще используют модель flexbox): этот INPUT будет находиться в FORM, который, в свою очередь, может оказаться в общем контейнере flex (например, с другими неформальными компонентами). ), и тогда он больше не будет работать - потому что поведение flex применимо только к прямым потомкам (то есть дочерним элементам). Таким образом, ФОРМА тоже должна быть гибким ограничителем!
СЗ
flex-direction уже rowпо умолчанию, вам не нужно его указывать.
Фабиан Пикон
сгиб для победы (снова); очень актуальный ответ в 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/

llange
источник
Это хорошо работает для меня. Переполнение предотвращает обертывание, правый отступ удерживает правую сторону от обрезания.
Профессор фон Лемонгаргл
PS: С современным браузером я бы рекомендовал использовать flex-box, как описано выше leishman…
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>
Whome
источник
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>

Andik
источник
Лучший метод сегодня
Йота
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/

DharmaTurtle
источник