Stile elemento di input per riempire la larghezza rimanente del suo contenitore


199

Diciamo che ho uno snippet html come questo:

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

Questo non è il mio codice esatto, ma l'importante è che ci sia un'etichetta e un input di testo sulla stessa riga in un contenitore a larghezza fissa. Come posso modellare l'input per riempire la larghezza rimanente del contenitore senza avvolgere e senza conoscere le dimensioni dell'etichetta?


So che la domanda era molto tempo fa, ma aggiungerò una buona soluzione che ovviamente non è obsoleta.
danijar,

Risposte:


138

tanto quanto tutti odiano le tabelle per il layout, aiutano con cose come questa, usando tag espliciti o usando 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>

Funzionerebbe con IE6? Altrimenti potrei dover definire un piccolo tavolo per questo :(
Joel Coehoorn,

non sono sicuro, direi di fare un rapido test per vedere cosa fanno, ma non ho un facile accesso a IE
cobbal

Va bene: questo mi ha indicato qualcosa che funziona.
Joel Coehoorn,

42
Vuoi condividere Joel?
Giovanni,

10
D'accordo, dovresti condividere la tua soluzione effettiva con il resto di noi e contrassegnarla come risposta, così com'è, è un po 'fastidioso.
BrainSlugs83

156

Ecco una soluzione semplice e pulita senza utilizzare JavaScript o hack di layout di tabella. È simile a questa risposta: immetti la larghezza automatica del testo riempiendo il 100% con altri elementi mobili

È importante avvolgere il campo di input con un intervallo che sia display:block. La prossima cosa è che il pulsante deve venire prima e il campo di input in secondo luogo.

Quindi puoi spostare il pulsante a destra e il campo di input riempie lo spazio rimanente.

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>

Un semplice violino: http://jsfiddle.net/v7YTT/90/

Aggiornamento 1: se il tuo sito Web è indirizzato solo ai browser moderni, ti suggerisco di utilizzare caselle flessibili . Qui puoi vedere il supporto attuale .

Aggiornamento 2: funziona anche con più pulsanti o altri elementi che condividono il pieno con il campo di input. Ecco un esempio .


Questo cambia l'html, tuttavia: l'elemento desiderato alla fine è elencato per primo nell'html.
Joel Coehoorn,

@JoelCoehoorn, esatto. Sei tu a decidere se preferisci o meno l'utilizzo di una tabella.
danijar,

2
Funziona benissimo. Usa float: sinistra anziché destra per creare un tagger in stile Facebook o qualcosa di simile.
hobberwickey,

1
Funziona benissimo! Ma qualcuno può spiegare la logica dietro come funziona ?!
Sherlock

1
Questa è una cattiva risposta Sembra che funzioni solo se lo guardi, ma vai a provare il violino. In realtà sta tagliando metà della casella di input, ma non puoi dirlo a meno che non inizi a testarlo. L'obiettivo è di adattare la casella di input alla larghezza dell'area di visualizzazione, non troncarla. Se provi a fare uno stile (angoli arrotondati, un bordo, giusta giustificazione del testo) questo fallisce completamente.
Roger Hill,

55

Suggerisco di usare Flexbox:

Assicurati di aggiungere i prefissi dei fornitori corretti!

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>


La domanda è molto vecchia ... questo è probabilmente come lo farei oggi. Se avrò la possibilità di provarlo e funzionerà con tutti i browser di cui avevo bisogno, aggiornerò la risposta accettata. Probabilmente, però, ci vorrà molto tempo prima che io possa provare questo. Ora faccio parte del team di amministrazione di sys, non faccio più tante cose sul web.
Joel Coehoorn,

Potresti fornire un esempio usando un label? Sarei particolarmente interessato a come l'HTML della domanda originale potesse essere impaginato usando border-box...
Lacco,

4
Perché flex: 2e no flex: 1?
Iulius Curt

42

Si prega di utilizzare flexbox per questo. Hai un contenitore che fletterà i suoi figli in fila. Il primo figlio prende il suo spazio secondo necessità. Il secondo si flette per occupare tutto lo spazio rimanente:

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


Batti il ​​cinque! :) Una cosa che vale la pena aggiungere (nel contesto di molti di noi che stanno ancora abbracciando il modello di flexbox): che INPUT sarà in una FORM, che a sua volta potrebbe finire nel contenitore flessibile generale (ad esempio con altre cose non-form ), quindi non funzionerà più, poiché il comportamento flessibile si applica solo ai discendenti diretti (ovvero elementi figlio). Quindi, anche il FORM deve essere un contraer flex!
Sz.

flex-direction è già rowdi default, non è necessario specificarlo.
Fabian Picone,

flex per la vittoria (di nuovo); risposta molto pertinente nel 2019
segrete il

17

Il modo più semplice per raggiungere questo obiettivo sarebbe:

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>

Sembra: http://jsfiddle.net/JwfRX/


Questo funziona bene per me. Lo straripamento impedisce alle cose di avvolgersi, l'imbottitura a destra evita che il lato destro venga tagliato.
Prof. Von Lemongargle,

PS: Con il browser moderno consiglierei di usare la flex-box come descritto sopra da leishman ...
llange

4

Il trucco molto semplice sta usando una CSS calcformula. Tutti i browser moderni, IE9, un'ampia gamma di browser mobili dovrebbero supportare questo.

<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
Ciò presuppone che tu conosca la larghezza esatta dell'etichetta o che sei disposto a sopportare con spazio aggiuntivo.
Nelson Rothermel,

2

puoi provare questo:

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>


miglior metodo oggi
yota

0

Se stai usando 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>

Meglio ancora, usa ciò che è integrato in 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/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.