Formatieren Sie das Eingabeelement, um die verbleibende Breite des Containers zu füllen

196

Angenommen, ich habe ein HTML-Snippet wie dieses:

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

Dies ist nicht mein genauer Code, aber das Wichtigste ist, dass in einem Container mit fester Breite eine Beschriftung und eine Texteingabe in derselben Zeile vorhanden sind. Wie kann ich die Eingabe so gestalten, dass sie die verbleibende Breite des Behälters ausfüllt, ohne sie einzuwickeln und ohne die Größe des Etiketts zu kennen?

Joel Coehoorn
quelle
Ich weiß, dass die Frage schon lange her ist, aber ich werde eine gute Lösung hinzufügen, die natürlich nicht veraltet ist.
Danijar

Antworten:

137

So sehr jeder Tabellen für das Layout hasst, helfen sie bei solchen Dingen, entweder mit expliziten Tabellen-Tags oder mit 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
quelle
Würde das mit IE6 funktionieren? Andernfalls muss ich möglicherweise tatsächlich eine kleine Tabelle dafür definieren :(
Joel Coehoorn
Ich bin mir nicht sicher, ich würde sagen, mache einen kurzen Test, um zu sehen, was sie tun, aber ich habe keinen einfachen Zugang zu IE
Cobbal
Das ist okay: Das hat mich auf etwas hingewiesen, das funktioniert.
Joel Coehoorn
42
Möchtest du Joel teilen?
John
10
Einverstanden, sollten Sie Ihre tatsächliche Lösung mit dem Rest von uns teilen und dies stattdessen als Antwort markieren - so wie es ist, ist dies irgendwie ärgerlich.
BrainSlugs83
155

Hier ist eine einfache und saubere Lösung ohne Verwendung von JavaScript- oder Tabellenlayout-Hacks. Es ähnelt dieser Antwort: Geben Sie Text automatisch ein, indem Sie die Breite 100% mit anderen schwebenden Elementen füllen

Es ist wichtig, das Eingabefeld mit einer Spanne zu versehen display:block. Als nächstes muss die Schaltfläche an erster Stelle stehen und das Eingabefeld an zweiter Stelle.

Dann können Sie die Schaltfläche nach rechts bewegen und das Eingabefeld füllt den verbleibenden Raum aus.

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>

Eine einfache Geige: http://jsfiddle.net/v7YTT/90/

Update 1: Wenn Ihre Website nur auf moderne Browser ausgerichtet ist, empfehle ich die Verwendung flexibler Boxen . Hier sehen Sie die aktuelle Unterstützung .

Update 2: Dies funktioniert sogar mit mehreren Schaltflächen oder anderen Elementen, die mit dem Eingabefeld vollständig geteilt werden. Hier ist ein Beispiel .

Danijar
quelle
Dies ändert jedoch den HTML-Code: Das Element, das Sie am Ende haben möchten, wird zuerst im HTML-Code aufgeführt.
Joel Coehoorn
@ JoelCoehoorn, das stimmt. Es ist Ihre Entscheidung, ob Sie dies der Verwendung eines Tisches vorziehen oder nicht.
Danijar
2
Das funktioniert super. Verwenden Sie float: left statt right, um einen Tagger im Facebook-Stil oder ähnliches zu erstellen.
Hobberwickey
1
Das funktioniert super! Aber kann jemand die Logik dahinter erklären, wie das funktioniert?!
Sherlock
1
Das ist eine schlechte Antwort. Es sieht so aus, als würde es funktionieren, wenn Sie nur einen Blick darauf werfen, aber versuchen Sie es mit der Geige. Es wird tatsächlich die Hälfte des Eingabefelds zerhackt, aber Sie können es nicht sagen, es sei denn, Sie beginnen mit dem Testen. Ziel ist es, das Eingabefeld an die Breite des Anzeigebereichs anzupassen und nicht abzuschneiden. Wenn Sie versuchen, ein Styling durchzuführen (abgerundete Ecken, ein Rand, richtige Begründung des Textes), schlägt dies völlig fehl.
Roger Hill
55

Ich schlage vor, Flexbox zu verwenden:

Stellen Sie jedoch sicher, dass Sie die richtigen Herstellerpräfixe hinzufügen!

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
quelle
Die Frage ist sehr alt ... so würde ich es heute wahrscheinlich machen. Wenn ich die Möglichkeit habe, es auszuprobieren, und es mit allen benötigten Browsern funktioniert, aktualisiere ich die akzeptierte Antwort. Wahrscheinlich wird es jedoch lange dauern, bis ich es versuchen kann. Ich bin jetzt im Sys-Admin-Team und mache nicht mehr so ​​viele Web-Sachen.
Joel Coehoorn
Könnten Sie ein Beispiel mit a geben label? Mich würde besonders interessieren, wie der HTML-Code aus der ursprünglichen Frage mit border-box...
lacco
4
Warum flex: 2und nicht flex: 1?
Iulius Curt
42

Bitte benutzen Sie dazu die Flexbox. Sie haben einen Container, der seine Kinder in eine Reihe biegt. Das erste Kind nimmt seinen Platz nach Bedarf ein. Der zweite biegt sich, um den gesamten verbleibenden Platz einzunehmen:

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

Basarat
quelle
Hallo fünf! :) Eine Sache, die es wert ist, hinzugefügt zu werden (im Zusammenhang mit vielen von uns, die das Flexbox-Modell noch neu angenommen haben): dass INPUT in einem FORMULAR vorliegt, das wiederum im gesamten Flex-Container landen kann (z. B. bei anderen, nicht formularen Dingen) ), und dann funktioniert es nicht mehr - da das Flex-Verhalten nur für direkte Nachkommen (dh untergeordnete Elemente) gilt. Das FORMULAR muss also auch ein Flex-Contrainer sein!
Gr.
Die Flex-Richtung ist bereits rowstandardmäßig, Sie müssen sie nicht angeben.
Fabian Picone
Flex für den Sieg (wieder); sehr relevante Antwort im Jahr 2019
secretwep
17

Der einfachste Weg, dies zu erreichen, wäre:

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>

Sieht aus wie: http://jsfiddle.net/JwfRX/

llange
quelle
Das funktioniert gut für mich. Der Überlauf verhindert, dass Dinge eingewickelt werden, die Polsterung rechts verhindert, dass die rechte Seite abgeschnitten wird.
Prof. Von Lemongargle
PS: Mit modernen Browsern würde ich empfehlen, Flex-Box zu verwenden, wie oben von Leishman beschrieben ...
Lange
4

Sehr einfacher Trick ist die Verwendung einer CSS calcFormel. Alle modernen Browser, IE9, eine breite Palette von mobilen Browsern sollten dies unterstützen.

<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>
Wen
quelle
4
Dies setzt voraus, dass Sie die genaue Breite des Etiketts kennen oder bereit sind, zusätzlichen Platz in Kauf zu nehmen.
Nelson Rothermel
2

Sie können dies versuchen:

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
quelle
beste Methode heute
Yota
0

Wenn Sie Bootstrap 4 verwenden:

<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>

Besser noch, verwenden Sie das, was in Bootstrap integriert ist:

  <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
quelle