วิธีจัดแนวปุ่มตัวเลือก html ให้ตรงกับป้ายกำกับ


96

ฉันมีแบบฟอร์มที่มีปุ่มตัวเลือกที่อยู่ในบรรทัดเดียวกับป้ายกำกับ อย่างไรก็ตามปุ่มตัวเลือกไม่ได้อยู่ในแนวตั้งกับป้ายกำกับดังที่แสดงในภาพหน้าจอด้านล่าง

ปุ่มตัวเลือก

ฉันจะจัดปุ่มตัวเลือกให้ตรงกับป้ายกำกับในแนวตั้งได้อย่างไร

แก้ไข:

นี่คือรหัส 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/>

และรหัส css:

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

1
รหัสของคุณเป็นอย่างไรในขณะนี้
George

@ninjacoder อัปเดตคำถามของคุณด้วยรหัส
Muthu Kumaran

คำตอบ:


152

ลองสิ่งนี้:

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

9
สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่ฉันต้องเพิ่มheight= 100%;เนื่องจากองค์ประกอบหลักของฉันไม่ได้กำหนดความสูงไว้อย่างชัดเจน
DaKaZ

1
สิ่งนี้ดูเหมือนจะทำให้ฉันได้แนวทางที่สอดคล้องกันมากที่สุดระหว่าง Mac, Windows และ Linux โดยใช้ Chrome, Firefox หรือ IE นอกจากนี้ฉันสังเกตเห็นว่าถ้าฉันให้ช่องว่างบนฉลากของฉันและวางวิทยุไว้ในป้ายกำกับฉันอาจต้องตั้งค่าระยะขอบบนเป็นค่าน้อยกว่า -1px (เช่น -3px) ตามจำนวนช่องว่างที่ฉันใช้ ป้ายนั้น. (ฉันชอบให้กล่องวิทยุของฉันติดป้ายกำกับสีและเอฟเฟกต์ขอบโค้งมนเพื่อให้ดู
เท่

3
เพื่ออธิบายว่าเหตุใดจึงเป็นเพียงคำตอบที่ถูกต้อง: องค์ประกอบบางอย่างใน HTML มีค่าขอบเริ่มต้นหรือค่าช่องว่างเช่น <p> หรือ <li> องค์ประกอบหรือปุ่มตัวเลือก คุณจะเห็นสิ่งนี้หากคุณเข้าสู่โหมดนักพัฒนาซอฟต์แวร์ (F12) และวางเมาส์เหนือแท็ก อันที่จริงนี่เป็นพฤติกรรมที่ดีเนื่องจากเบราว์เซอร์เองใช้ CSS เพื่อวางตำแหน่งองค์ประกอบที่กำหนดไว้ล่วงหน้าซึ่งผู้ใช้สามารถรีเซ็ต แต่อาจทำให้สับสนได้หากคุณไม่รู้ว่าทำไมบางอย่างจึงไม่ตรงแนวตั้งแต่แรก ดังนั้นพยายามเขียนทับการตั้งค่าที่คุณไม่ได้ตั้งค่าไว้เสมอหากมันดูแปลกไปตามค่าเริ่มต้น
StanE

ดูเหมือนจะไม่ได้ผลเมื่อคุณเพิ่มหรือลดขนาดตัวอักษร โปรดพิสูจน์ว่าฉันผิดด้วยตัวอย่างการทำงาน แต่!
Protector one

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

ใส่คลาสสำหรับวิทยุทั้งหมด สิ่งนี้จะใช้ได้กับปุ่มตัวเลือกทั้งหมดในหน้า html

ซอ


นี่เป็นทางออกที่ดีที่สุดที่ฉันเคยเห็นสำหรับสิ่งนี้ การจัดตำแหน่งป้ายปุ่มตัวเลือกรบกวนฉันมาหลายปีแล้ว ใช้ได้ผลทุกครั้งสำหรับฉัน
G-Man

โปรดทราบว่าสิ่งนี้จะแตกเมื่อป้ายกำกับมีข้อความหลายบรรทัด
Daan

ตัวอย่างซอของคุณยังใช้padding: 0; margin: 0กับองค์ประกอบการป้อนข้อมูลและดูเหมือนว่าจะต้องมีการจัดตำแหน่งที่ถูกต้อง
Emmanuel Bourg

14

ฉันรู้ว่าฉันเลือกเรือสำราญโดย menuka devinda แต่เมื่อดูความคิดเห็นด้านล่างฉันเห็นด้วยและพยายามหาทางออกที่ดีกว่า ฉันสามารถหาสิ่งนี้ได้และในความคิดของฉันมันเป็นโซลูชันที่หรูหรากว่ามาก:

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

ขอบคุณทุกคนที่ให้คำตอบคำตอบของคุณไม่เป็นที่สังเกต หากคุณยังมีแนวคิดอื่น ๆ โปรดเพิ่มคำตอบของคุณเองสำหรับคำถามนี้


9

ลองเพิ่มvertical-align:topลงใน css

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

ทดสอบ: http://jsfiddle.net/muthkum/heAWP/


1
สิ่งนี้จะไม่เกิดขึ้นเมื่อคุณเพิ่มหรือลดขนาดฟอนต์
Protector one

@Protectorone นั่นเป็นคำตอบเก่าและเฉพาะสำหรับคำถาม OP ถ้าคุณกำลังพยายามที่จะทำเช่นเดียวกันกับแล้วลองใช้font-size display:flexนี่คือเดโม jsfiddle.net/et8z47q5
Muthu Kumaran

8

เช่นกันอาจเพิ่มความยืดหยุ่นให้กับคำตอบ

.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

คุณสามารถทำได้ดังนี้:

input {
    vertical-align:middle;
}

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

ดีมาก. ฉันต้องการจัดแนวปุ่มแทนป้ายกำกับและนี่ก็เป็นเคล็ดลับ
posfan12

2

ฉันชอบใส่อินพุตไว้ในป้ายกำกับ (โบนัสเพิ่มเติม: ตอนนี้คุณไม่จำเป็นต้องมีforแอตทริบิวต์บนป้ายกำกับ) และใส่vertical-align: middleอินพุต

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>

( -2px margin-topเป็นเรื่องของรสนิยม)

อีกทางเลือกหนึ่งที่ฉันชอบมากคือการใช้โต๊ะ (ถือส้อมขว้างของคุณมันเยี่ยมจริงๆ!) หมายความว่าคุณต้องเพิ่มforแอตทริบิวต์ให้กับป้ายกำกับทั้งหมดของคุณidลงในอินพุตของคุณ ขอแนะนำตัวเลือกนี้สำหรับป้ายกำกับที่มีเนื้อหาข้อความยาวหลายบรรทัด

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


1

สิ่งนี้ควรใช้งานได้

CSS:

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

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

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

ฉันแค่จัดจุดกึ่งกลางแนวตั้งของกล่องให้ตรงกับเส้นฐานของกล่องหลักบวกครึ่งหนึ่งของความสูง x (en.wikipedia.org/wiki/X-height) ของพาเรนต์


1

คำตอบเหล่านี้จำนวนมากบอกว่าให้ใช้vertical-align: middle;ซึ่งทำให้การจัดตำแหน่งใกล้เคียงกัน แต่สำหรับฉันมันยังคงปิดอยู่ไม่กี่พิกเซล วิธีที่ฉันใช้ในการจัดตำแหน่ง 1 ถึง 1 ที่แท้จริงระหว่างป้ายกำกับและอินพุตวิทยุคือ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>


0

แม้ว่าฉันยอมรับว่าตารางไม่ควรใช้สำหรับเค้าโครงการออกแบบที่ตรงกันข้ามกับความเชื่อที่นิยม แต่ก็ผ่านการตรวจสอบความถูกต้อง กล่าวคือไม่เลิกใช้แท็กตาราง วิธีที่ดีที่สุดในการจัดแนวปุ่มตัวเลือกคือการใช้ CSS ตรงกลางในแนวตั้งพร้อมระยะขอบที่ปรับบนองค์ประกอบอินพุต


-1

ฉันคิดว่าการเพิ่มdisplay:inline-blockป้ายกำกับและให้มันpadding-topจะช่วยแก้ปัญหานี้ได้ นอกจากนี้การตั้งค่าline-heightบนป้ายกำกับก็ทำได้เช่นกัน


-2

มีหลายวิธีวิธีหนึ่งที่ฉันต้องการคือการใช้ตารางใน html คุณสามารถเพิ่มตารางสามแถวสอง coloum และวางปุ่มตัวเลือกและฉลาก

<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
โปรดอย่าใช้ตารางเพื่อวัตถุประสงค์ในการจัดวาง
PeeHaa

4
ไม่ควรใช้ตาราง -1 ตารางสำหรับเค้าโครงและรหัสนี้จะไม่ผ่านการตรวจสอบความถูกต้อง ... @ninjacoder ทำไมคุณถึงเลือกสิ่งนี้เป็น "คำตอบ"?
tereško

7
จริงๆ .. จริงจัง .. ทุกครั้งที่มีคนสอนให้ใช้ตารางสำหรับมาร์กอัปลูกแมวน่ารัก ๆ ตายที่ไหนสักแห่งในโลก ..
Damien Overeem

2
@PeeHaa, tereško, Damien Overeem ฉันคิดว่าพวกคุณน่าจะใช่ฉันสามารถหาวิธีแก้ปัญหาของตัวเองได้ซึ่งฉันโพสต์ไว้ด้านล่างที่นี่ ขอบคุณเพื่อน! ขอความช่วยเหลือและคำแนะนำของคุณเป็นอย่างยิ่ง
ninjacoder

3
ฉันได้ลองใช้ตัวเลือกอื่น ๆ แล้ว แต่ก็ไม่ค่อยดีเท่าไหร่ ตารางทำงาน .tablecell{dispay:table-cell;} ... <div class="tablecell">ดูเหมือนจะเป็นวิธีแก้ปัญหาที่วกวนสำหรับผู้ที่ไม่ต้องการยอมรับว่าพวกเขากำลังใช้ตาราง ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.