Styl elementu wejściowego, aby wypełnić pozostałą szerokość kontenera

198

Powiedzmy, że mam taki fragment HTML:

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

To nie jest mój dokładny kod, ale ważne jest, aby w tym samym wierszu w kontenerze o stałej szerokości była etykieta i tekst. Jak mogę stylizować dane wejściowe, aby wypełnić pozostałą szerokość pojemnika bez zawijania i bez znajomości rozmiaru etykiety?

Joel Coehoorn
źródło
Wiem, że pytanie było dawno temu, ale dodam dobre rozwiązanie, które oczywiście nie jest przestarzałe.
danijar,

Odpowiedzi:

138

tak jak wszyscy nienawidzą tabel za układ, pomagają przy takich rzeczach, używając jawnych znaczników tabeli lub display: komórka tabeli

<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
źródło
Czy to zadziała z IE6? W przeciwnym razie być może będę musiał zdefiniować mały stolik :(
Joel Coehoorn
nie jestem pewien, powiedziałbym, żeby zrobić szybki test, aby zobaczyć, co robią, ale nie mam łatwego dostępu do IE
cobbal 21.04.2009
W porządku: to wskazało mi coś, co działa.
Joel Coehoorn
42
Chcesz się podzielić Joelem?
Jan
10
Uzgodniony, powinieneś podzielić się z nami swoim faktycznym rozwiązaniem i zaznaczyć to jako odpowiedź - ponieważ jest to trochę denerwujące.
BrainSlugs83
155

Oto proste i czyste rozwiązanie bez użycia skryptów JavaScript i modyfikacji układu tabeli. Jest podobny do tej odpowiedzi: Wpisz tekst auto szerokość wypełniając 100% z innymi elementami pływającymi

Ważne jest, aby owinąć pole wejściowe rozpiętością, która jest display:block. Następną rzeczą jest to, że przycisk musi być pierwszy, a pole wprowadzania drugie.

Następnie możesz przesunąć przycisk w prawo, a pole wejściowe wypełni pozostałe miejsce.

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>

Proste skrzypce: http://jsfiddle.net/v7YTT/90/

Aktualizacja 1: jeśli Twoja witryna jest skierowana tylko do nowoczesnych przeglądarek, sugeruję użycie elastycznych skrzynek . Tutaj możesz zobaczyć aktualne wsparcie .

Aktualizacja 2: Działa to nawet z wieloma przyciskami lub innymi elementami, które w pełni współdzielą się z polem wejściowym. Oto przykład .

danijar
źródło
Zmienia to jednak HTML: element, który chcesz na końcu, jest wymieniony jako pierwszy w HTML.
Joel Coehoorn
@JoelCoehoorn, zgadza się. To twoja decyzja, czy wolisz to od korzystania ze stołu, czy nie.
danijar
2
To działa świetnie. Użyj float: left zamiast right, aby utworzyć tagger w stylu Facebook lub coś podobnego.
hobberwickey
1
To działa świetnie! Ale czy ktoś może wyjaśnić logikę tego, jak to działa ?!
sherlock
1
To zła odpowiedź. Wygląda na to, że działa, jeśli tylko na niego spojrzysz, ale spróbuj skrzypce. Właściwie to siekanie połowy pola wprowadzania, ale nie możesz powiedzieć, dopóki nie zaczniesz go testować. Celem jest dopasowanie pola wprowadzania do szerokości obszaru wyświetlania, a nie obcięcie go. Jeśli spróbujesz wykonać stylizację (zaokrąglone rogi, obramowanie, odpowiednie justowanie tekstu), to całkowicie się nie powiedzie.
Roger Hill,
55

Sugeruję użycie Flexbox:

Pamiętaj jednak, aby dodać odpowiednie prefiksy dostawcy!

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
źródło
Pytanie jest bardzo stare ... tak prawdopodobnie zrobiłbym to dzisiaj. Jeśli mam szansę wypróbować tę funkcję i działa ona ze wszystkimi przeglądarkami, których potrzebuję, zaktualizuję zaakceptowaną odpowiedź. Prawdopodobnie jednak minie dużo czasu, zanim spróbuję tego spróbować. Jestem teraz w zespole administracyjnym sys, nie rób już tyle rzeczy w sieci.
Joel Coehoorn
Czy możesz podać przykład za pomocą label? Byłbym szczególnie zainteresowany tym, w jaki sposób HTML z oryginalnego pytania mógłby zostać ułożony za pomocą border-box...
lacco
4
Dlaczego flex: 2nie flex: 1?
Iulius Curt,
42

Użyj do tego Flexboksa. Masz pojemnik, który będzie zginał swoje dzieci w rzędzie. Pierwsze dziecko zajmuje miejsce w razie potrzeby. Drugi wygina się, aby zabrać całą pozostałą przestrzeń:

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

basarat
źródło
Piątka! :) Jedną rzecz wartą dodania (w kontekście wielu z nas wciąż przyjmujących model flexbox): INPUT będzie w FORMIE, co z kolei może skończyć w ogólnym kontenerze flex (np. Z innymi nieformalnymi rzeczami ), a wtedy przestanie działać - ponieważ zachowanie flex dotyczy tylko bezpośrednich potomków (tj. elementów potomnych). FORMULARZ musi być więc także elastycznym narzędziem!
Sz.
kierunek flex jest już rowdomyślnie, nie musisz go określać.
Fabian Picone
flex do wygranej (ponownie); bardzo trafna odpowiedź w 2019 r.
sekretny
17

Najłatwiejszym sposobem na osiągnięcie tego byłoby:

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>

Wygląda jak: http://jsfiddle.net/JwfRX/

llange
źródło
To działa dobrze dla mnie. Przelew zapobiega zawijaniu się materiału, a wyściółka po prawej stronie nie pozwala na odcięcie prawej strony.
Prof. Von Lemongargle
PS: W nowoczesnej przeglądarce polecam korzystanie z flex-box, jak opisano powyżej przez leishman…
llange
4

Bardzo łatwą sztuczką jest użycie CSS calcformuły. Wszystkie nowoczesne przeglądarki, IE9, szeroka gama przeglądarek mobilnych powinny to obsługiwać.

<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>
Kto ja
źródło
4
Zakłada się, że znasz dokładną szerokość etykiety lub chcesz znieść więcej miejsca.
Nelson Rothermel,
2

możesz spróbować:

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
źródło
najlepsza metoda dzisiaj
yota
0

Jeśli używasz 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>

Jeszcze lepiej, użyj tego, co jest wbudowane w 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
źródło