CSS: come allineare verticalmente una "etichetta" e un "input" all'interno di un "div"?


91

Considera il codice seguente :

HTML:

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

CSS:

div {
    height: 50px;
    border: 1px solid blue;
}

Quale sarebbe il metodo più semplice per mettere il labele il inputal centro di div(verticalmente)?


1
Per quanto ne so, la linea di fondo è "non puoi", e il modo più pigro per aggirarlo è usare un semplice <table>e applicare valign='middle'ai suoi <td>s.
BeemerGuy

Risposte:


95

div {
    display: table-cell;
    vertical-align: middle;
    height: 50px;
    border: 1px solid red;
}
<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

Il vantaggio di questo metodo è che puoi cambiare l'altezza del divcampo di testo, cambiare l'altezza del campo di testo e cambiare la dimensione del carattere e tutto rimarrà sempre al centro.

http://jsfiddle.net/53ALd/6/


1
sembra elegante :) qualcuno sa quanto sia compatibile con il browser questo metodo?
Zaven Nahapetyan

1
Per IE, penso che funzioni solo su IE8 o superiore. Per gli altri browser web va bene.
Marc-François

1
Non sapevo del display: table-cell. È supportato su alcuni browser?
BeemerGuy

6
@Misha avresti dovuto specificare il fatto che il tuo input / label era assolutamente posizionato. Ciò cambia totalmente le circostanze della domanda. Sto dando a Marc un +1. Bella risposta.
jessegavin

2
Sono abbastanza certo che il punto che Jenson stava cercando di fare (e avrebbe dovuto articolarsi) è che l'uso di make display: table-celldiv si comporta in modi in cui non ci si aspetta si comportino, come il successivo rendering di div sulla stessa riga / ecc.
taswyn

73

un approccio più moderno sarebbe usare css flex-box.

div {
  height: 50px;
  background: grey;
  display: flex;
  align-items: center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>

un esempio più complesso ... se hai elementi multipli nel flusso flessibile, puoi usare align-self per allineare i singoli elementi in modo diverso dall'allineamento specificato ...

div {
  display: flex;
  align-items: center
}

* {
  margin: 10px
}

label {
  align-self: flex-start
}
<div>
  <img src="https://de.gravatar.com/userimage/95932142/195b7f5651ad2d4662c3c0e0dccd003b.png?size=50" />
  <label>Text</label>
  <input placeholder="Text" type="text" />
</div>

è anche super facile da centrare orizzontalmente e verticalmente:

div {
  position:absolute;
  top:0;left:0;right:0;bottom:0;
  background: grey;
  display: flex;
  align-items: center;
  justify-content:center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>


Vorrei che funzionasse quando c'è un'immagine e un testo avvolti nell'etichetta. Ho una piccola icona seguita dal testo, ma il testo non si sposta.
Kevin Scharnhorst

funziona se l'etichetta e il testo sono elementi separati, o se rendi la tua etichetta anche una flexbox ...
Holger Will

display:flexha meno compatibilità, funziona su Chrome 29+

14

Funziona su più browser, offre maggiore accessibilità e viene fornito con meno markup. abbandonare il div. Avvolgi l'etichetta

label{
     display: block; 
     height: 35px; 
     line-height: 35px; 
     border: 1px solid #000; 
}

input{margin-top:15px; height:20px}

<label for="name">Name: <input type="text" id="name" /></label>

3
Questo ovviamente non funzionerà per un'etichetta a due righe. E se sei sicuro che l'etichetta sia sempre una riga singola, allora ci sono milioni di altre alternative.
Lashae

16
la domanda riguardava un'etichetta a riga singola e ho risposto di conseguenza. non sono sicuro del tuo punto (i) o delle tue intenzioni qui, ma se x è così ovvio dovresti farne un milione di esempi. almeno così puoi gongolare della mia risposta e sentire il potere del tuo milione di vittorie. Bravo.
albert

2
Questa è la risposta migliore per le etichette a riga singola. La specifica dice: "Se l'attributo for non è specificato, ma l'elemento label ha un discendente di elemento associato al modulo etichettabile, il primo discendente di questo tipo in ordine ad albero è il controllo etichettato dell'elemento label." Pertanto questo è l'unico approccio in cui è possibile omettere gli attributi fore idper la massima semplicità.
parlamento

8

So che questa domanda è stata posta più di due anni fa, ma per tutti gli spettatori recenti, ecco una soluzione alternativa, che presenta alcuni vantaggi rispetto alla soluzione di Marc-François:

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}

Qui aggiungiamo semplicemente solo un line-heightuguale a quello dell'altezza del div. Il vantaggio è che ora puoi modificare la proprietà di visualizzazione del div come ritieni opportuno, ad inline-blockesempio, e il suo contenuto rimarrà centrato verticalmente. La soluzione accettata richiede di trattare il div come una cella di tabella. Dovrebbe funzionare perfettamente, cross-browser.

L'unico altro vantaggio è che è solo un'altra regola CSS invece di due :)

Saluti!


6

Utilizzare paddingsu div(in alto e in basso ) e vertical-align:middlesu labele input.

esempio su http://jsfiddle.net/VLFeV/1/


Non funziona su jsfiddle. Ho cambiato l'altezza del dive il contenuto all'interno non si è mosso affatto. Mi sto perdendo qualcosa?
BeemerGuy

A mio parere, i layout non dovrebbero avere altezze di pixel fisse ... I layout dovrebbero scorrere in modo fluido attorno al contenuto. Tuttavia, vengo da un giorno e da un'ora in cui i browser hanno ridimensionato le dimensioni del testo durante lo zoom avanti e indietro. I browser recenti ridimensionano effettivamente l'intera pagina, quindi l'impostazione dell'altezza dei pixel funziona un po 'meglio. Tuttavia, ci sono ragioni completamente nuove per evitare di impostare l'altezza dei pixel ... ad esempio, tecniche di layout reattive. Ecco perché questo sarebbe il mio metodo preferito.
thirdender

3

Avvolgi l'etichetta e inserisci un altro div con un'altezza definita. Potrebbe non funzionare nelle versioni di IE inferiori a 8.

position:absolute; 
top:0; bottom:0; left:0; right:0;
margin:auto;

0

Puoi usare la display: table-cellproprietà come nel codice seguente:

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
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.