Елемент введення стилю для заповнення залишкової ширини контейнера


199

Скажімо, у мене є фрагмент html такого:

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

Це не мій точний код, але найважливіше - там є мітка та введення тексту на одному рядку в контейнері фіксованої ширини. Як я можу стилю введення для заповнення залишкової ширини контейнера без упаковки та не знаючи розміру етикетки?


Я знаю, що питання було давно, але я додам гарне рішення, яке, звичайно, не застаріло.
danijar

Відповіді:


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>

Чи буде це працювати з IE6? Інакше мені, можливо, доведеться насправді визначити для цього маленьку таблицю :(
Joel Coehoorn

не впевнений, я б сказав, зробіть швидкий тест, щоб побачити, що вони роблять, але я не маю легкого доступу до IE
cobbal

Це добре: це вказувало мені на щось, що справді працює.
Joel Coehoorn

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.
Joel Coehoorn

@JoelCoehoorn, саме так. Це ви вирішите, чи віддаєте ви перевагу над використанням таблиці чи ні.
danijar

2
Це чудово працює. Використовуйте float: зліва замість правого, щоб створити теггер у стилі 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>


Питання дуже старе ... це, мабуть, як я би це зробив сьогодні. Якщо я отримаю можливість спробувати це, і він працює з усіма потрібними браузерами, я оновлю прийняту відповідь. Напевно, хоча, я пробуватиму це ще довгий час. Зараз я в команді системного адміністрування, більше не займайтеся великою кількістю веб-речей.
Joel Coehoorn

Чи можете ви навести приклад, використовуючи label? Мене б особливо зацікавило, як можна викласти HTML з початкового питання, використовуючи border-box...
lacco

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>


Привіт п'ять! :) Ще одне, що варто додати (в контексті багатьох із нас, які ще недавно сприймають модель флексокса): що INPUT буде у ФОРМІ, яка, в свою чергу, може опинитися в загальному контейнері flex (наприклад, з іншими неформальними матеріалами ), і тоді він більше не працюватиме - оскільки гнучка поведінка стосується лише прямих нащадків (тобто дочірніх елементів). Отже, ФОРМА повинна бути і гнучким контрагентом!
Sz.

flex-напрям вже 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/


Це добре працює для мене. Переповнення запобігає загортанню речей, правий накладки утримує правий бік від рубання.
Проф Фон Лемонгорг

PS: За допомогою сучасного браузера я б рекомендував використовувати flex-box, як описано вище
leishman

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>


найкращий метод сьогодні
йота

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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.