CSS: Jak wyrównać w pionie „etykietę” i „dane wejściowe” wewnątrz „div”?


92

Rozważ następujący kod :

HTML:

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

CSS:

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

Jaka byłaby najłatwiejsza metoda umieszczenia labeli inputna środku div(pionowo)?


1
O ile mi wiadomo, podstawową zasadą jest „nie możesz”, a najbardziej leniwym sposobem obejścia tego jest użycie prostego <table>i zastosowanie go valign='middle'do jego zasad <td>.
BeemerGuy

Odpowiedzi:


96

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>

Zaletą tej metody jest to, że możesz zmienić wysokość divpola tekstowego, zmienić wysokość pola tekstowego oraz zmienić rozmiar czcionki, a wszystko zawsze pozostanie na środku.

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


1
wygląda elegancko :) czy ktoś wie na ile ta metoda jest kompatybilna z przeglądarkami?
Zaven Nahapetyan

1
W przypadku IE myślę, że działa tylko na IE8 lub nowszym. W przypadku innych przeglądarek internetowych jest w porządku.
Marc-François,

1
Nie wiedziałem o display: table-cell. Czy jest to obsługiwane w niektórych przeglądarkach?
BeemerGuy

6
@Misha powinieneś był określić fakt, że twoje wejście / etykieta były absolutnie ustawione. To całkowicie zmienia okoliczności sprawy. Daję Marcowi +1. Świetna odpowiedź.
jessegavin

2
Jestem prawie pewien, że Jenson próbował (i powinien był wyartykułować) to, że używanie display: table-cellsprawia, że ​​elementy div zachowują się w sposób, w którym nie powinny się zachowywać, na przykład renderowanie kolejnych elementów div w tej samej linii / itp.
taswyn

74

bardziej nowoczesnym podejściem byłoby użycie 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>

bardziej złożony przykład ... jeśli masz wiele elementów w przepływie flex, możesz użyć align-self, aby wyrównać pojedyncze elementy inaczej do określonego align ...

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>

jest również bardzo łatwy do wyśrodkowania w pionie i poziomie:

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>


Chciałbym, żeby to zadziałało, gdy na etykiecie znajduje się obraz i tekst. Mam małą ikonę, po której następuje tekst, ale tekst się nie porusza.
Kevin Scharnhorst

działa, jeśli etykieta i tekst są oddzielnymi elementami, lub jeśli Twoja etykieta będzie również elastyczna ...
Holger Will

display:flexma mniejszą kompatybilność, działa na chrome 29+

14

Działa to w różnych przeglądarkach, zapewnia większą dostępność i wymaga mniej znaczników. porzuć div. Owiń etykietę

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
To oczywiście nie zadziała dla etykiety dwuwierszowej. A jeśli masz pewność, że etykieta jest zawsze jednowierszowa, istnieją miliony innych alternatyw.
Lashae

16
pytanie dotyczyło etykiety pojedynczej linii, więc odpowiedziałem odpowiednio. Nie jestem pewien co do twoich punktów lub zamiarów tutaj, ale jeśli x jest tak oczywiste, powinieneś zrobić milion przykładów. przynajmniej po to, byś mógł się napawać moją odpowiedzią i poczuć moc swoich milionów zwycięstw. Brawo.
Albert

2
To najlepsza odpowiedź w przypadku etykiet jednowierszowych. Specyfikacja mówi: „Jeśli nie określono atrybutu for, ale element etykiety ma element potomny elementu, który można etykietować, powiązany z formularzem, wówczas pierwszym takim elementem podrzędnym w porządku drzewa jest element sterujący etykiety elementu etykiety”. Dlatego jest to jedyne podejście, w którym można pominąć atrybuty fori iddla maksymalnej prostoty.
parlament

8

Zdaję sobie sprawę, że to pytanie zostało zadane ponad dwa lata temu, ale dla wszystkich niedawnych widzów, oto alternatywne rozwiązanie, które ma kilka zalet w porównaniu z rozwiązaniem Marca-François:

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

Tutaj po prostu dodajemy line-heightrówność do wysokości elementu div. Zaletą jest to, że możesz teraz zmienić właściwość wyświetlania elementu div według własnego uznania, inline-blockna przykład na, a jego zawartość pozostanie wyśrodkowana w pionie. Przyjęte rozwiązanie wymaga traktowania elementu div jako komórki tabeli. To powinno działać idealnie, w różnych przeglądarkach.

Jedyną zaletą jest to, że to tylko jedna reguła CSS więcej zamiast dwóch :)

Twoje zdrowie!


6

Używaj paddingna div(na górze i na dole ) oraz vertical-align:middlena labeli input.

przykład pod adresem http://jsfiddle.net/VLFeV/1/


To nie działa na jsfiddle. Zmieniłem wysokość divi zawartość w środku w ogóle się nie poruszała. Czy coś mi brakuje?
BeemerGuy,

Moim zdaniem układy nie powinny mieć stałych wysokości pikseli… Układy powinny płynnie opływać zawartość. Jednak pochodzę z dnia i czasu, kiedy przeglądarki skalowały rozmiary tekstu podczas powiększania i pomniejszania. Najnowsze przeglądarki faktycznie skalują całą stronę, więc ustawienie wysokości pikseli działa trochę lepiej. Istnieją jednak zupełnie nowe powody, dla których należy unikać ustawiania wysokości pikseli… na przykład techniki układu responsywnego. Dlatego byłaby to moja preferowana metoda.
trzecia osoba

3

Owiń etykietę i wprowadź inny element div o określonej wysokości. Może to nie działać w wersjach IE niższych niż 8.

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

0

Możesz użyć display: table-cellwłaściwości jak w poniższym kodzie:

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.