Làm cách nào để căn chỉnh theo chiều dọc một nút radio html với nhãn của nó?


95

Tôi có một biểu mẫu có các nút radio nằm trên cùng một dòng với nhãn của chúng. Tuy nhiên, các nút radio không được căn chỉnh theo chiều dọc với nhãn của chúng như được hiển thị trong ảnh chụp màn hình bên dưới.

Các nút radio.

Làm cách nào để căn chỉnh theo chiều dọc các nút radio với nhãn của chúng?

Biên tập:

Đây là mã html:

<input checked="checked" type="radio" name="user_level" id="rd1" value="1"/>
<label for="rd1">radio 1</label><br/>
<input type="radio" name="user_level" id="rd2" value="2"/>
<label for="rd2">radio 2</label><br/>
<input type="radio" name="user_level" id="rd3" value="3"/>
<label for="rd3">radio 3</label><br/>

Và mã css:

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
}

1
Mã của bạn lúc này trông như thế nào?
George

@ninjacoder Cập nhật câu hỏi của bạn bằng mã.
Muthu Kumaran

Câu trả lời:


149

Thử cái này:

input[type="radio"] {
  margin-top: -1px;
  vertical-align: middle;
}

9
Điều này làm việc cho tôi tuy nhiên tôi phải thêm một height= 100%;vì phần tử mẹ của tôi không đặt chiều cao một cách rõ ràng.
DaKaZ

1
Điều này dường như mang lại cho tôi cách tiếp cận nhất quán nhất giữa Mac, Windows và Linux, sử dụng Chrome, Firefox hoặc IE. Ngoài ra, tôi nhận thấy rằng nếu tôi đặt padding trên nhãn của mình và đặt radio bên trong nhãn, thì tôi có thể cần đặt margin-top thành giá trị nhỏ hơn -1px (như -3px) dựa trên số lượng padding mà tôi đang sử dụng nhãn đó. (Tôi muốn cung cấp cho nhãn hộp radio của mình một màu di chuột và hiệu ứng đường viền tròn để làm cho chúng trông mát mẻ hơn.)
Volomike

3
Để giải thích tại sao đây là câu trả lời đúng duy nhất: Một số phần tử trong HTML có giá trị lề hoặc phần đệm mặc định, như phần tử <p> hoặc <li> hoặc các nút radio. Bạn có thể thấy điều này nếu bạn chuyển sang chế độ nhà phát triển (F12) và di chuột qua thẻ. Trên thực tế, đây là một hành vi tốt, vì bản thân trình duyệt sử dụng CSS để định vị các phần tử được xác định trước mà sau đó người dùng có thể đặt lại. Nhưng nó có thể gây nhầm lẫn nếu bạn không biết tại sao một cái gì đó bị lệch ngay từ đầu. Vì vậy, hãy luôn cố gắng ghi đè các cài đặt mà bạn không đặt, nếu mặc định nó trông lạ.
StanE

Điều này dường như không hoạt động khi bạn tăng hoặc giảm kích thước phông chữ. Tuy nhiên, hãy chứng minh tôi sai với một ví dụ làm việc!
Người bảo vệ một

15
input {
    display: table-cell;
    vertical-align: middle
}

Đặt lớp cho tất cả đài phát thanh. Điều này sẽ hoạt động cho tất cả các nút radio trên trang html.

Vĩ cầm


Đây là giải pháp tốt nhất mà tôi từng thấy cho việc này. Căn chỉnh nhãn của nút radio đã cản trở tôi trong nhiều năm cho đến nay. Làm việc mọi lúc cho tôi.
G-Man

Lưu ý rằng điều này sẽ bị hỏng khi nhãn có nhiều dòng văn bản.
Daan

Ví dụ Fiddle của bạn cũng áp dụng padding: 0; margin: 0cho các phần tử đầu vào và nó dường như được yêu cầu để có được căn chỉnh phù hợp.
Emmanuel Bourg

13

Tôi biết tôi đã chọn máy nướng bằng menuka lệch nhưng nhìn vào các bình luận bên dưới nó, tôi đồng tình và cố gắng đưa ra giải pháp tốt hơn. Tôi đã nghĩ ra điều này và theo tôi, đó là một giải pháp thanh lịch hơn nhiều:

input[type='radio'], label{   
    vertical-align: baseline;
    padding: 10px;
    margin: 10px;
 }

Cảm ơn tất cả những người đã đưa ra câu trả lời, câu trả lời của bạn đã không được chú ý. Nếu bạn vẫn có bất kỳ ý tưởng nào khác, vui lòng thêm câu trả lời của riêng bạn cho câu hỏi này.


9

thử thêm vertical-align:topvào css

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
    vertical-align:top;
}​

Kiểm tra: http://jsfiddle.net/muthkum/heAWP/


1
Điều này không hiệu quả khi bạn tăng hoặc giảm kích thước phông chữ.
Người bảo vệ một

@Protectorone Đó là một câu trả lời cũ và dành riêng cho câu hỏi OP. Nếu bạn đang cố gắng làm điều tương tự với font-sizethì hãy thử sử dụng display:flex. Đây là bản demo, jsfiddle.net/et8z47q5
Muthu Kumaran

8

Cũng có thể thêm một chút linh hoạt cho các câu trả lời.

.Radio {
  display: inline-flex;
  align-items: center;
}

.Radio--large {
  font-size: 2rem;
}

.Radio-Input {
  margin: 0 0.5rem 0;
}
<div>
  <label class="Radio" for="sex-female">
    <input class="Radio-Input" type="radio" id="sex-female" name="sex" value="female" />
    Female
  </label>

  <label class="Radio" for="sex-male">
    <input class="Radio-Input" type="radio" id="sex-male" name="sex" value="male" />
    Male
  </label>
</div>


<div>
  <label class="Radio Radio--large" for="sex-female2">
    <input class="Radio-Input" type="radio" id="sex-female2" name="sex" value="female" />
    Female
  </label>

  <label class="Radio Radio--large" for="sex-male2">
    <input class="Radio-Input" type="radio" id="sex-male2" name="sex" value="male" />
    Male
  </label>
</div>


7

Bạn có thể làm như sau:

input {
    vertical-align:middle;
}

label{
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
}

BẢN GIỚI THIỆU


Rất tốt. Tôi muốn căn chỉnh nút thay vì nhãn và đây là một mẹo nhỏ.
posfan 12

1

Một cái gì đó như thế này sẽ hoạt động

CSS:

input {
    float: left;
    clear: left;
    width: 50px;
    line-height: 20px;
}

label {
    float: left;
    vertical-align: middle;
}

1
label, input {
    vertical-align: middle;
}

Tôi chỉ căn chỉnh điểm giữa dọc của các hộp với đường cơ sở của hộp mẹ cộng với một nửa chiều cao x (en.wikipedia.org/wiki/X-height) của hộp chính.


1

Rất nhiều câu trả lời nói rằng hãy sử dụng vertical-align: middle;, điều này giúp căn chỉnh gần nhau nhưng đối với tôi, nó vẫn bị lệch một vài pixel. Phương pháp mà tôi đã sử dụng để có được sự căn chỉnh đúng 1 đến 1 giữa các nhãn và đầu vào vô tuyến là vertical-align: top;:

label, label>input{
    font-size: 20px;
    display: inline-block;
    margin: 0;
    line-height: 28px;
    height: 28px;
    vertical-align: top;
}
<h1>How are you?</h1>
<fieldset>
	<legend>Your response:</legend>
	<label for="radChoiceGood">
		<input type="radio" id="radChoiceGood" name="radChoices" value="Good">Good
	</label>
	
	<label for="radChoiceExcellent">
		<input type="radio" id="radChoiceExcellent" name="radChoices" value="Excellent">Excellent
	</label>
	
	<label for="radChoiceOk">
		<input type="radio" id="radChoiceOk" name="radChoices" value="OK">OK
	</label>
</fieldset>


1

Tôi thích đặt các đầu vào bên trong các nhãn (phần thưởng thêm: bây giờ bạn không cần forthuộc tính trên nhãn) và đặt vertical-align: middleđầu vào.

label > input[type=radio] {
    vertical-align: middle;
    margin-top: -2px;
}

#d2 {  
    font-size: 30px;
}
<div>
	<label><input type="radio" name="radio" value="1">Good</label>
	<label><input type="radio" name="radio" value="2">Excellent</label>
<div>
<br>
<div id="d2">
	<label><input type="radio" name="radio2" value="1">Good</label>
	<label><input type="radio" name="radio2" value="2">Excellent</label>
<div>

(Vấn -2px margin-topđề là hương vị.)

Một lựa chọn khác mà tôi thực sự thích là sử dụng bảng. (Hãy giữ những cú nĩa chào hàng của bạn! Nó thực sự tuyệt vời!) Điều đó có nghĩa là bạn cần thêm forthuộc tính cho tất cả các nhãn và ids vào đầu vào của mình. Tôi đã đề xuất tùy chọn này cho các nhãn có nội dung văn bản dài, trên nhiều dòng.

<table><tr><td>
    <input id="radioOption" name="radioOption" type="radio" />
    </td><td>
    <label for="radioOption">                     
        Really good option
    </label>
</td></tr></table>


0

Mặc dù tôi đồng ý rằng các bảng không nên được sử dụng cho các bố cục thiết kế trái với niềm tin phổ biến là chúng vượt qua xác nhận. tức là thẻ bảng không bị phản đối. Cách tốt nhất để căn chỉnh các nút radio là sử dụng CSS ở giữa căn chỉnh theo chiều dọc với lề được điều chỉnh trên các phần tử đầu vào.


-1

Tôi nghĩ rằng việc thêm display:inline-blockvào các nhãn và cho chúng padding-topsẽ khắc phục được điều này. Ngoài ra, chỉ cần thiết lập line-heighttrên các nhãn cũng sẽ.


-2

có một số cách, tôi muốn sử dụng một bảng trong html. bạn có thể thêm hai bảng ba hàng màu và đặt các nút radio và bảng lable.

<table border="0">

<tr>
  <td><input type="radio" name="sex" value="1"></td>
  <td>radio1</td>

</tr>
<tr>
  <td><input type="radio" name="sex" value="2"></td>
  <td>radio2</td>

</tr>
</table>

6
Vui lòng không sử dụng bảng cho mục đích bố trí.
PeeHaa 22/11/12

4
-1 bảng không nên được sử dụng cho bố cục và mã này sẽ không vượt qua xác thực ... @ninjacoder, tại sao bạn lại chọn đây là "câu trả lời"?
tereško

7
Thật vậy .. nghiêm túc .. mổi khi có người dạy để sử dụng bảng để đánh dấu hình thức, một con mèo con dễ thương chết ở đâu đó trên thế giới ..
Damien Overeem

2
@PeeHaa, tereško, Damien Overeem Tôi nghĩ các bạn có lẽ đúng, tôi đã có thể đưa ra giải pháp của riêng mình mà tôi đã đăng dưới đây. Cảm ơn các bạn! Sự giúp đỡ và lời khuyên của bạn được đánh giá cao.
ninjacoder

3
Tôi đã thử các tùy chọn khác và chúng không tốt lắm. Bàn hoạt động. .tablecell{dispay:table-cell;} ... <div class="tablecell">có vẻ giống như một workaround rung rinh cho những người không muốn thừa nhận họ đang sử dụng bảng ...
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.