CSS: Làm cách nào để căn chỉnh theo chiều dọc “nhãn” và “đầu vào” bên trong “div”?


91

Hãy xem xét đoạn mã sau :

HTML:

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

CSS:

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

Phương pháp dễ nhất để đặt labelinputở giữa div(theo chiều dọc) là gì?


1
Theo hiểu biết của tôi, điểm mấu chốt là "bạn không thể", và cách lười biếng nhất để giải quyết vấn đề này là sử dụng một đơn giản <table>và áp dụng valign='middle'cho <td>s của nó .
BeemerGuy

Câu trả lời:


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>

Ưu điểm của phương pháp này là bạn có thể thay đổi chiều cao của div, thay đổi chiều cao của trường văn bản và thay đổi kích thước phông chữ và mọi thứ sẽ luôn ở giữa.

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


1
trông thanh lịch :) có ai biết phương pháp này tương thích với trình duyệt như thế nào không?
Zaven Nahapetyan

1
Đối với IE, tôi nghĩ nó chỉ hoạt động trên IE8 hoặc tốt hơn. Đối với các trình duyệt web khác, nó tốt.
Marc-François

1
Tôi không biết về display: table-cell. Điều đó có được hỗ trợ trên một số trình duyệt nhất định không?
BeemerGuy

6
@Misha, bạn nên chỉ rõ thực tế là đầu vào / nhãn của bạn đã được định vị tuyệt đối. Điều đó hoàn toàn thay đổi hoàn cảnh của câu hỏi. Tôi đang cho Marc một +1. Câu trả lời chính xác.
jessegavin

2
Tôi khá chắc chắn rằng điểm jenson đang cố gắng thực hiện (và lẽ ra phải nói rõ) là việc sử dụng display: table-celllàm cho các div hoạt động theo những cách mà chúng không được mong đợi để hoạt động, chẳng hạn như các div tiếp theo hiển thị trên cùng một dòng / v.v.
taswyn

73

một cách tiếp cận hiện đại hơn sẽ là sử dụng 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>

một ví dụ phức tạp hơn ... nếu bạn có nhiều phần tử trong luồng uốn, bạn có thể sử dụng align-self để căn chỉnh các phần tử đơn lẻ khác với căn chỉnh được chỉ định ...

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>

nó cũng siêu dễ căn giữa theo chiều ngang và chiều dọc:

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>


Tôi ước điều này sẽ hoạt động khi có một hình ảnh và văn bản được bao bọc trong nhãn. Tôi có một biểu tượng nhỏ theo sau là văn bản, nhưng văn bản không nhúc nhích.
Kevin Scharnhorst

nó hoạt động nếu nhãn và văn bản là những yếu tố riêng biệt, hoặc nếu làm bạn của bạn một flexbox lable quá ...
Holger Will

display:flexcó khả năng tương thích ít hơn, hoạt động trên chrome 29+

14

Điều này hoạt động trên nhiều trình duyệt, cung cấp nhiều khả năng truy cập hơn và đi kèm với ít đánh dấu hơn. bỏ div. Bọc nhãn

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
Điều này rõ ràng sẽ không hoạt động đối với nhãn hai dòng. Và nếu bạn chắc chắn rằng nhãn đó luôn là một dòng, thì có hàng triệu lựa chọn thay thế khác.
Lashae

16
câu hỏi liên quan đến một nhãn dòng, và tôi đã trả lời tương ứng. không chắc chắn về (các) quan điểm hoặc ý định của bạn ở đây, nhưng nếu x quá rõ ràng, bạn nên làm một triệu ví dụ về nó. ít nhất để bạn có thể hả hê với câu trả lời của tôi và cảm thấy sức mạnh của hàng triệu chiến thắng của bạn. khoe khoang.
albert

2
Đây là câu trả lời tốt nhất cho các nhãn dòng đơn. Đặc tả cho biết: "Nếu thuộc tính for không được chỉ định, nhưng phần tử nhãn có phần tử con có liên kết với biểu mẫu có thể gắn nhãn, thì phần tử con đầu tiên như vậy trong thứ tự cây là điều khiển được gắn nhãn của phần tử nhãn." Do đó, đây là cách tiếp cận duy nhất mà bạn có thể bỏ qua các thuộc tính foridđể đơn giản tối đa.
quốc hội

8

Tôi biết rằng câu hỏi này đã được hỏi cách đây hơn hai năm, nhưng đối với bất kỳ người xem nào gần đây, đây là một giải pháp thay thế, có một vài ưu điểm so với giải pháp của Marc-François:

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

Ở đây chúng ta chỉ cần thêm một line-heightbằng chiều cao của div. Lợi thế là bây giờ bạn có thể thay đổi thuộc tính hiển thị của div khi bạn thấy phù hợp, inline-blockchẳng hạn, và nội dung của nó sẽ vẫn được căn giữa theo chiều dọc. Giải pháp được chấp nhận yêu cầu bạn xử lý div như một ô bảng. Điều này sẽ hoạt động hoàn hảo, trên nhiều trình duyệt.

Ưu điểm duy nhất khác là nó chỉ có thêm một quy tắc CSS thay vì hai :)

Chúc mừng!


6

Sử dụng paddingtrên div( trên và dưới ) và vertical-align:middletrên labelinput.

ví dụ tại http://jsfiddle.net/VLFeV/1/


Điều đó không hoạt động trên jsfiddle. Tôi đã thay đổi chiều cao của divvà nội dung bên trong không di chuyển chút nào. Tui bỏ lỡ điều gì vậy?
BeemerGuy

Theo ý kiến ​​của tôi, bố cục không nên có chiều cao pixel cố định… Bố cục phải trôi chảy xung quanh nội dung. Tuy nhiên, tôi đến từ một ngày và thời gian khi các trình duyệt thu nhỏ kích thước văn bản khi phóng to và thu nhỏ. Các trình duyệt gần đây thực sự mở rộng quy mô toàn bộ trang, vì vậy việc đặt độ cao pixel hoạt động tốt hơn một chút. Tuy nhiên, có những lý do hoàn toàn mới để tránh thiết lập độ cao pixel… ví dụ: kỹ thuật bố cục đáp ứng. Đó là lý do tại sao đây sẽ là phương pháp ưa thích của tôi.
thirdender

3

Bọc nhãn và nhập vào một div khác có chiều cao xác định. Điều này có thể không hoạt động trong các phiên bản IE thấp hơn 8.

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

0

Bạn có thể sử dụng thuộc display: table-celltính như trong đoạn mã sau:

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.