วิธีสร้างช่องทำเครื่องหมายที่มีป้ายกำกับที่คลิกได้?


1021

ฉันจะสร้างช่องทำเครื่องหมาย HTML ด้วยป้ายกำกับที่สามารถคลิกได้ (ซึ่งหมายความว่าการคลิกที่ป้ายกำกับจะเป็นการเปิด / ปิดช่องทำเครื่องหมาย)


คำตอบ:


1915

วิธีที่ 1: ตัดแท็กป้ายชื่อ

ล้อมช่องทำเครื่องหมายไว้ภายในlabelแท็ก:

<label><input type="checkbox" name="checkbox" value="value">Text</label>

วิธีที่ 2: ใช้forแอตทริบิวต์

ใช้forแอตทริบิวต์ (ตรงกับช่องทำเครื่องหมายid):

<input type="checkbox" name="checkbox" id="checkbox_id" value="value">
<label for="checkbox_id">Text</label>

หมายเหตุ : ID จะต้องไม่ซ้ำกันในหน้า!

คำอธิบาย

เนื่องจากคำตอบอื่น ๆ ไม่ได้กล่าวถึงฉลากจึงสามารถรวมได้ถึง 1 อินพุตและไม่ใช้แอforททริบิวต์และจะถือว่ามีไว้สำหรับอินพุตภายใน

ตัดตอนมาจากw3.org (ด้วยการเน้นของฉัน):

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

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

การใช้วิธีนี้มีข้อดีมากกว่าfor:

  • ไม่จำเป็นต้องกำหนดidช่องทำเครื่องหมายให้ทุกช่อง (ยอดเยี่ยม!)

  • <label>ไม่จำเป็นต้องใช้แอตทริบิวต์พิเศษใน

  • พื้นที่ที่สามารถคลิกได้ของอินพุตยังเป็นพื้นที่ที่สามารถคลิกได้ของป้ายกำกับดังนั้นจึงไม่มีสถานที่ให้คลิกแยกกันสองแห่งที่สามารถควบคุมช่องทำเครื่องหมายได้เพียงแห่งเดียวเท่านั้นไม่ว่า<input>ข้อความป้ายกำกับและข้อความจริงจะอยู่ห่างกันมากแค่ไหนนำไปใช้กับมัน

สาธิตด้วย CSS:

label {
 border:1px solid #ccc;
 padding:10px;
 margin:0 0 10px;
 display:block; 
}

label:hover {
 background:#eee;
 cursor:pointer;
}
<label><input type="checkbox" />Option 1</label>
<label><input type="checkbox" />Option 2</label>
<label><input type="checkbox" />Option 3</label>


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

1
หากใครบางคนสามารถอธิบายความคิดเห็น @John ซ้ายได้โปรดทำเพราะฉันไม่มีเหตุผลอะไรเลย
Wesley Murch

16
@ John ที่เป็นคู่มือมาร์กอัปสำหรับ bootstrap โดยเฉพาะ ถ้าคุณไม่ได้ใช้เฟรมเวิร์กหรือกำลังใช้เฟรมเวิร์กอื่นมันก็ใช้ได้ดี ขอบคุณสำหรับการตอบกลับ.
Wesley Murch

3
@จอห์น. ในหน้าเว็บที่คุณเชื่อมโยง bootstrap จะมีตัวอย่างทั้งหมดที่มีป้ายกำกับฉันไม่เห็นคำเตือนใด ๆ ตามที่คุณระบุเลยบางทีมันอาจจะไม่เกี่ยวข้องกับ bootstrap ล่าสุดอีกต่อไป
user2144406

2
ดังที่ฉันได้เรียนรู้ในวันนี้อย่าผสมวิธีที่ 1 และวิธีที่ 2 หากคุณใส่กล่องกาเครื่องหมายไว้ในป้ายกำกับและใส่รหัสแล้วการคลิกที่ป้ายกำกับจะไม่ทำให้กล่องกาเครื่องหมายทำงาน
BBlake

50

เพียงตรวจสอบให้แน่ใจว่าฉลากนั้นเชื่อมโยงกับอินพุต

<fieldset>
  <legend>What metasyntactic variables do you like?</legend>

  <input type="checkbox" name="foo" value="bar" id="foo_bar">
  <label for="foo_bar">Bar</label>

  <input type="checkbox" name="foo" value="baz" id="foo_baz">
  <label for="foo_baz">Baz</label>
</fieldset>

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

2
@LarsH - ใช่นั่นคือวิธีที่คุณสร้างกลุ่มช่องทำเครื่องหมาย
เควนติน

ขอบคุณ ฉันดูที่w3.org/wiki/HTML/Elements/input/checkboxและมันก็ไม่ได้มีประโยชน์ในเรื่องนั้น
LarsH

2
ด้วย PHP จะไม่ทำให้ $ _POST ['foo'] มีหนึ่งในสองค่าสูงสุดต่อครั้งหรือไม่ แม้ว่าจะตรวจสอบทั้งคู่แล้ว กลุ่มช่องทำเครื่องหมายคืออะไร?
jeromej

2
@JeromeJ: สำหรับ PHP <input type="checkbox" name="foo[]" value="bar" ...>จะจัดการกับมันอย่างถูกต้องคุณต้องเพิ่มวงเล็บชื่อเช่น: สิ่งนี้จะให้อาร์เรย์ที่มีค่าของกล่องที่เลือกทั้งหมด(ที่มีชื่อนี้) ตัวอย่างเช่น$_POST['foo'][0]อาจเป็นbarและ$_POST['foo'][1]อาจเป็นbaz(หากตรวจสอบทั้งคู่)
Levite

11

คุณยังสามารถใช้องค์ประกอบหลอก CSS เพื่อเลือกและแสดงป้ายกำกับของคุณจากแอตทริบิวต์ค่าของช่องทำเครื่องหมายทั้งหมดของคุณ (ตามลำดับ)
แก้ไข:สิ่งนี้จะใช้ได้กับเบราว์เซอร์ที่ใช้ webkit และกะพริบ (Chrome (ium), Safari, Opera .... ) และเบราว์เซอร์มือถือส่วนใหญ่เท่านั้น ไม่มีFirefoxหรือ IE รองรับที่นี่
สิ่งนี้อาจมีประโยชน์เมื่อฝัง webkit / กะพริบลงในแอพของคุณ

<input type="checkbox" value="My checkbox label value" />
<style>
[type=checkbox]:after {
    content: attr(value);
    margin: -3px 15px;
    vertical-align: top;
    white-space:nowrap;
    display: inline-block;
}
</style>

ป้ายกำกับองค์ประกอบหลอกทั้งหมดจะสามารถคลิกได้

การสาธิต: http://codepen.io/mrmoje/pen/oteLl + ส่วนสำคัญของมัน


จริง ตุ๊กแกและตรีศูลและตุ๊กแกดูเหมือนจะไม่เป็นเช่นนี้ สิ่งนี้จะทำงานกับ Webkit และ Blink เท่านั้น ฉันจะอัปเดตคำตอบ
mrmoje

3
downvoted แม้ว่าจะเป็นไปได้ แต่เป็นวิธีที่ไม่ดี - ไม่สามารถใช้งานได้กับเบราว์เซอร์จำนวนมาก
James Billingham

ปัญหาความเข้ากันได้ข้างกันโซลูชันนี้ไม่ได้มีความหมายเหมือนคำตอบยอดนิยมเนื่องจากไม่มีการเชื่อมโยงโดยตรงในมาร์กอัพระหว่าง <label> และ <input>
deadboy

"มันใช้งานได้กับ Webkit / Blink" มีกลิ่นเหมือนข้อบกพร่องในการใช้ ( stackoverflow.com/questions/2587669/ ...... ) ดังนั้นจึงอาจหยุดทำงานได้ตลอดเวลา
Xenos


3
<label for="myInputID">myLabel</label><input type="checkbox" id="myInputID" name="myInputID />

1
เนื่องจากมันอาจสร้างความสับสนให้กับผู้อ่านบางคนคุณควรเปลี่ยนnameค่าของแอตทริบิวต์เป็นสิ่งที่แตกต่างจากค่าที่มีอยู่ในforและidคุณลักษณะเนื่องจากทั้งสองมีความสัมพันธ์กันในขณะที่nameไม่ได้เป็น .
Dzhuneyt

3

มันทำงานเกินไป:

<form>
    <label for="male"><input type="checkbox" name="male" id="male" />Male</label><br />
    <label for="female"><input type="checkbox" name="female" id="female" />Female</label>
</form>

คุณสามารถ ommit forและidคุณลักษณะในตัวอย่างของคุณเนื่องจากlabelแท็กมีองค์ประกอบอินพุตเพียงหนึ่งองค์ประกอบเท่านั้น
Dzhuneyt



0

ใช้labelองค์ประกอบและforแอตทริบิวต์เพื่อเชื่อมโยงกับช่องทำเครื่องหมาย:

<label for="myCheckbox">Some checkbox</label> <input type="checkbox" id="myCheckbox" />



-7

ใช้สิ่งนี้

<input type="checkbox" name="checkbox" id="checkbox_id" value="value">
<label for="checkbox_id" id="checkbox_lbl">Text</label>


$("#checkbox_lbl").click(function(){ 
    if($("#checkbox_id").is(':checked'))
        $("#checkbox_id").removAttr('checked');
    else
       $("#checkbox_id").attr('checked');
    });
});

9
ไม่จำเป็นต้องใช้ JavaScript เพื่อทำสิ่งนี้ มันสร้างไว้ใน HTML
Lasse Bunk

4
@ LasseBunk ถ้าเพียง แต่เป็นเพียง JavaScript แต่ไลบรารี jQuery ทั้งหมดจำเป็นสำหรับการทำงาน มาดูกันว่ามีใครสามารถคิดวิธีแก้ปัญหา Angular 2 ได้ไหม
เร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.