CSS: Bagaimana cara menyelaraskan "label" dan "input" secara vertikal di dalam "div"?

92

Perhatikan kode berikut :

HTML:

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

CSS:

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

Apa cara termudah untuk meletakkan labeldan inputdi tengah div(secara vertikal)?

Misha Moroshko
sumber
1
Sepengetahuan saya, intinya adalah "Anda tidak bisa", dan cara termalas untuk mengatasinya adalah dengan menggunakan yang sederhana <table>dan menerapkannya valign='middle'pada <td>s.
BeemerGuy

Jawaban:

97

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>

Kelebihan dari metode ini adalah Anda dapat mengubah tinggi div, mengubah tinggi bidang teks dan mengubah ukuran font dan semuanya akan selalu berada di tengah.

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

Marc-François
sumber
1
terlihat elegan :) apakah ada yang tahu bagaimana browser kompatibel dengan metode ini?
Zaven Nahapetyan
1
Untuk IE, menurut saya ini hanya berfungsi di IE8 atau lebih baik. Untuk browser web lain tidak apa-apa.
Marc-François
1
Saya tidak tahu tentang display: table-cell. Apakah itu didukung di browser tertentu?
BeemerGuy
7
@Misha Anda harus menentukan fakta bahwa input / label Anda benar-benar diposisikan. Itu benar-benar mengubah keadaan pertanyaan itu. Saya memberi Marc +1. Jawaban yang bagus.
jessegavin
2
Saya cukup yakin bahwa poin yang coba dibuat oleh jenson (dan seharusnya sudah diartikulasikan) adalah bahwa menggunakan display: table-cellmakes divs berperilaku dengan cara yang tidak diharapkan untuk berperilaku, seperti rendering div berikutnya pada baris yang sama / dll.
taswyn
74

pendekatan yang lebih modern akan menggunakan 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>

contoh yang lebih kompleks ... jika Anda memiliki banyak elemen dalam aliran fleksibel, Anda dapat menggunakan align-self untuk menyelaraskan elemen tunggal secara berbeda dengan perataan yang ditentukan ...

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>

juga sangat mudah untuk memusatkan secara horizontal dan vertikal:

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>

Holger Will
sumber
Saya berharap ini akan berhasil bila ada gambar dan teks yang dibungkus dalam label. Saya memiliki ikon kecil diikuti oleh teks, tetapi teks tidak bergeming.
Kevin Scharnhorst
ini berfungsi jika label dan teks adalah elemen yang terpisah, atau jika Anda membuat label Anda menjadi flexbox juga ...
Holger Will
display:flexmemiliki kompatibilitas yang lebih rendah, berfungsi pada chrome 29+
14

Ini berfungsi lintas browser, menyediakan lebih banyak aksesibilitas dan dilengkapi dengan lebih sedikit markup. buang div. Bungkus labelnya

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>
albert
sumber
3
Ini jelas tidak akan berfungsi untuk label dua baris. Dan jika Anda yakin bahwa label selalu satu baris, daripada ada jutaan alternatif lainnya.
Lashae
16
pertanyaannya adalah tentang label satu baris, dan saya menjawab sesuai. tidak yakin tentang poin atau niat Anda di sini, tetapi jika x sangat jelas, Anda harus membuat jutaan contoh darinya. setidaknya agar Anda bisa menertawakan jawaban saya dan merasakan kekuatan jutaan kemenangan Anda. bravo.
albert
2
Ini adalah jawaban terbaik untuk label satu baris. Spesifikasi mengatakan: "Jika atribut for tidak ditentukan, tetapi elemen label memiliki turunan elemen terkait bentuk yang dapat diberi label, maka turunan pertama dalam urutan hierarki adalah kontrol berlabel elemen label." Oleh karena itu, ini adalah satu-satunya pendekatan di mana Anda dapat menghilangkan atribut fordan iduntuk kesederhanaan maksimum.
Parlemen
8

Saya tahu pertanyaan ini telah diajukan lebih dari dua tahun yang lalu, tetapi untuk pemirsa baru-baru ini, berikut adalah solusi alternatif, yang memiliki beberapa keunggulan dibandingkan solusi Marc-François:

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

Di sini kita hanya menambahkan yang line-heightsama dengan ketinggian div. Keuntungannya adalah Anda sekarang dapat mengubah properti tampilan dari div sesuai keinginan Anda, inline-blockmisalnya, dan isinya akan tetap berada di tengah secara vertikal. Solusi yang diterima mengharuskan Anda memperlakukan div sebagai sel tabel. Ini harus bekerja dengan sempurna, lintas browser.

Satu-satunya keuntungan lain adalah hanya satu aturan CSS lagi, bukan dua :)

Bersulang!

MusikHewan
sumber
6

Gunakan paddingdi div( atas dan bawah ) dan vertical-align:middledi labeldan input.

contoh di http://jsfiddle.net/VLFeV/1/

Gabriele Petrioli
sumber
Itu tidak berhasil di jsfiddle. Saya mengubah ketinggian divdan konten di dalamnya tidak bergerak sama sekali. Apakah saya melewatkan sesuatu?
BeemerGuy
Menurut pendapat saya, tata letak seharusnya tidak memiliki ketinggian piksel tetap… Tata letak harus mengalir dengan lancar di sekitar konten. Namun, saya berasal dari hari dan waktu ketika browser mengubah ukuran teks saat memperbesar dan memperkecil. Peramban terbaru sebenarnya menskalakan seluruh halaman, jadi pengaturan tinggi piksel berfungsi sedikit lebih baik. Namun, ada alasan baru untuk menghindari pengaturan ketinggian piksel… misalnya, teknik tata letak responsif. Itulah mengapa metode ini menjadi pilihan saya.
tiga
3

Bungkus label dan masukan div lain dengan ketinggian yang ditentukan. Ini mungkin tidak berfungsi di versi IE yang lebih rendah dari 8.

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

Anda dapat menggunakan display: table-cellproperti seperti pada kode berikut:

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
abahet
sumber