ฉันควรใส่องค์ประกอบเข้าไว้ในองค์ประกอบฉลากหรือไม่?


606

มีวิธีปฏิบัติที่ดีที่สุดเกี่ยวกับการซ้อนlabelและinputองค์ประกอบ HTML หรือไม่

วิธีคลาสสิก:

<label for="myinput">My Text</label>
<input type="text" id="myinput" />

หรือ

<label for="myinput">My Text
   <input type="text" id="myinput" />
</label>

107
ข้อดีอย่างหนึ่งของการวาง<input />ข้างใน<label>คือคุณสามารถละเว้นforและid: <label>My text <input /></label>ในตัวอย่างของคุณ ดีกว่ามาก!
Znarkus

16
ในขณะที่ผมยอมรับว่าinputไม่ได้ความหมายเป็นของภายในของlabelผมสังเกตเห็นในวันนี้ว่านักพัฒนาของเงินทุนไม่เห็นด้วยกับผม องค์ประกอบบางอย่างเช่นช่องทำเครื่องหมายแบบอินไลน์มีสไตล์แตกต่างกันไปขึ้นอยู่กับว่าinputอยู่ภายในหรือภายนอก
Blazemonger

6
BTW นี่เป็นความคิดที่ไม่ดีจริงๆในการสร้าง<label for="id">เนื่องจากฉันมีหลายรูปแบบบนหน้าเว็บและฉันไม่สามารถใช้idแอตทริบิวต์สำหรับวิดเจ็ตจำนวนมากโดยไม่unique id per pageตกหลุมพราง form + widget_nameวิธีที่ได้รับการยอมรับเดียวที่จะเข้าถึงเครื่องมือที่เป็นโดย
MaxZoom

5
@ MaxZoom หากคุณมีรูปแบบที่แตกต่างกันมากมายในหน้าของคุณที่มีชื่อเขตข้อมูลเหมือนกันซึ่งคุณมีปัญหาในการหา ID ที่ไม่ซ้ำกันคุณอาจต้องการพิจารณาการออกแบบหน้าเว็บของคุณอีกเล็กน้อย IMHO; เห็นได้ชัดว่าฉันไม่ทราบสถานการณ์ของคุณ แต่นั่นเป็นเพียงกลิ่นที่ไม่ดีกับฉัน
Ken Bellows

5
@kenbellows มันเป็นความคิดของนักออกแบบ / ธุรกิจ (ไม่ใช่ของฉัน) ในการวางสองฟอร์มการค้นหาไว้ในหน้าเดียว ประสบการณ์การใช้งานที่ดีที่สุดของผู้ใช้อาจเปลี่ยนแปลงได้ตลอดเวลา แต่ HTML ควรมีความยืดหยุ่นเพียงพอ (IMHO) เพื่อครอบคลุมสถานการณ์ที่มองเห็นได้
MaxZoom

คำตอบ:


529

จาก w3:ฉลากอาจอยู่ในตำแหน่งก่อนหลังหรือรอบ ๆ ตัวควบคุมที่เกี่ยวข้อง

<label for="lastname">Last Name</label>
<input type="text" id="lastname" />

หรือ

<input type="text" id="lastname" />
<label for="lastname">Last Name</label>

หรือ

<label>
   <input type="text" name="lastname" />
   Last Name
</label>

โปรดทราบว่าเทคนิคที่สามไม่สามารถใช้งานได้เมื่อมีการใช้ตารางสำหรับเค้าโครงโดยมีป้ายกำกับในเซลล์หนึ่งและเขตข้อมูลฟอร์มที่เกี่ยวข้องในเซลล์อื่น

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


14
ตอบเป็นสิ่งที่ถูกต้อง แต่ในทางปฏิบัติของฉันเองฉันมักจะตัดสินในตัวอย่างแรกที่กำหนดโดย superUntitled สำหรับ textboxes, textareas และ selects แต่สำหรับปุ่มตัวเลือกและช่องทำเครื่องหมายฉันมักจะใช้ตัวอย่างที่สามที่ฉันต้องการอินพุตก่อนข้อความประกอบและไม่ต้องการความกว้างคงที่แบบเดียวกันและ / หรือลอยตัวที่ส่วนที่เหลือของป้ายกำกับและฟิลด์ใช้ ดังนั้นในรูปแบบใดก็ตามคุณอาจพบว่าฉันใช้รูปแบบทั้งสองร่วมกัน
Funka

6
ฉันสงสัยว่า<label for="inputbox"><input id="inputbox" type="text" /></label>เป็นผ่านตามเกณฑ์ของพวกเขา
Matt

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

9
เอกสาร WCAG ที่เชื่อมโยงมีตัวเลือกต่อไปนี้ "ตัวควบคุมอยู่ภายในองค์ประกอบป้ายผนึกที่มีข้อความป้ายกำกับ" ฉันไม่ทราบว่ามีการเพิ่มในช่วงหลายปีที่ผ่านมาตั้งแต่ @Sorcy แสดงความคิดเห็น แต่ภาพจำลองการป้อนข้อมูลในฉลากถือว่ามีผลในขณะนี้
Alex Weitzer

6
มีปัญหาเกี่ยวกับการป้อนข้อมูลภายในฉลากอย่างน้อยในโครเมี่ยมเมื่อคุณแนบตัวจัดการเหตุการณ์คลิกไปที่ป้ายกำกับตัวจัดการจะถูกไล่ออกสองครั้งเมื่อคลิกที่ฉลาก คุณสามารถรับสิ่งนี้ได้return false;ในตอนท้ายของตัวจัดการ แต่ถ้าคุณมีตัวจัดการอื่น ๆ ที่ต้องดำเนินการในภายหลังและการหยุดการแพร่กระจายไม่ใช่ตัวเลือกนี่จะกลายเป็นปัญหา
wired_in

67

ฉันชอบ

<label>
  Firstname
  <input name="firstname" />
</label>

<label>
  Lastname
  <input name="lastname" />
</label>

เกิน

<label for="firstname">Firstname</label>
<input name="firstname" id="firstname" />

<label for="lastname">Lastname</label>
<input name="lastname" id="lastname" />

สาเหตุหลักมาจากทำให้ HTML อ่านง่ายขึ้น และฉันคิดว่าตัวอย่างแรกของฉันง่ายกว่าที่จะจัดสไตล์ด้วย CSS เนื่องจาก CSS ทำงานได้ดีกับองค์ประกอบที่ซ้อนกัน

แต่ฉันคิดว่ามันเป็นเรื่องของรสนิยม


หากคุณต้องการตัวเลือกการออกแบบเพิ่มเติมให้เพิ่มแท็ก span

<label>
  <span>Firstname</span>
  <input name="firstname" />
</label>

<label>
  <span>Lastname</span>
  <input name="lastname" />
</label>

รหัสยังดูดีขึ้นในความคิดของฉัน


3
การรวมอินพุตภายในฉลากนั้นเหมือนกับการใช้ HTML สำหรับเลย์เอาต์
Emil

8
ผมชอบวิธีนี้ยังมีกรณีเช่นนี้: <label>Expires after <input name="exp" /> days</label>(ฉลากก่อนและหลังองค์ประกอบเข้า)
ฟิลิปป์

ผมคิดว่าตัวอย่างสุดท้ายคือ - นอกเหนือจากสำหรับและแอตทริบิวต์ ID - ไม่ได้จริงๆใด ๆ ที่แตกต่างจากที่มีป้ายติดกับการป้อนข้อมูลและทั้งสองห่อเป็นdiv, liหรือสิ่งที่ไม่ได้ก็คือ !?
retrovertigo

1
@retrovertigo - ใช้งานได้จริงหรือ ไม่มันเพิ่งลดมาร์กอัปและลดการใช้คำศัพท์มากเกินไป เรารู้ว่าข้อมูลfirstnameควรเป็นไปตามป้ายกำกับfirstnameแต่เบราว์เซอร์จำเป็นต้องมีการประกาศ มันเป็นเรื่องของรสนิยมและสิ่งที่คุณคิดว่าดูดีที่สุด (และง่ายที่สุดในการดีบัก) ในโค้ดของคุณ ฉันชอบที่จะใช้ซ้อนกันตอนนี้แม้ว่ามันจะใช้เวลาสักพักกว่าฉันจะชินกับมัน
Xhynk

3
@MPavlak - ดูอย่างรวดเร็วและฉันพบคำแนะนำนี้จาก w3.org w3.org/WAI/tutorials/forms/labels จากนั้นผมก็ตรวจสอบw3.org/TR/WCAG20-TECHS/H44.html ที่ด้านล่าง (เป็นที่คลุมเครือ) มันบอกว่าเพื่อเรียกร้องความสอดคล้องคุณจะต้องผ่านเกณฑ์การทดสอบและระบุว่าคุณควรใช้สำหรับแอตทริบิวต์ ในความเป็นจริงเมื่อฉันทดสอบครั้งนี้ใน Apple Voiceover (10% ส่วนแบ่งการตลาดเดสก์ทอปเดสก์ท็อปหน้าจอ, 60% ส่วนแบ่งการตลาด Screenreaders มือถือ) โดยปริยายฉลากไม่ทำงานดังนั้นนั่นก็เป็นอีกปัจจัยสำคัญ หวังว่าจะช่วย!
James Westgate

39

หากคุณรวมแท็กอินพุตในแท็กป้ายกำกับคุณไม่จำเป็นต้องใช้แอตทริบิวต์ 'for'

ที่กล่าวว่าฉันไม่ชอบที่จะรวมแท็กใส่ในฉลากของฉันเพราะฉันคิดว่าพวกเขาแยกจากกันไม่ได้มีเอนทิตี


8
สำหรับคุณต้องใช้ id แต่ทำให้การจัดวาง
เลเยอร์

39

ความแตกต่างของพฤติกรรม: คลิกที่ช่องว่างระหว่างป้ายกำกับและอินพุต

หากคุณคลิกที่ช่องว่างระหว่างฉลากและอินพุตมันเปิดใช้งานการป้อนข้อมูลเฉพาะในกรณีที่ฉลากมีการป้อนข้อมูล

จึงสมเหตุสมผลเนื่องจากในกรณีนี้พื้นที่เป็นเพียงอักขระอีกตัวของป้ายกำกับ

<p>Inside:</p>

<label>
  <input type="checkbox" />
  |&lt;----- Label. Click between me and the checkbox.
</label>

<p>Outside:</p>

<input type="checkbox" id="check" />
<label for="check">|&lt;----- Label. Click between me and the checkbox.</label>

ความสามารถในการคลิกระหว่างป้ายกำกับและกล่องหมายความว่า:

  • คลิกง่ายกว่า
  • ชัดเจนน้อยลงว่าสิ่งที่เริ่มต้นและสิ้นสุด

ตัวอย่างเช็กบ็อกซ์ Bootstrap v3.3 ใช้อินพุตด้านใน: http://getbootstrap.com/css/#formsอาจฉลาดที่จะติดตามมัน แต่พวกเขาเปลี่ยนใจใน v4.0 https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radiosดังนั้นฉันจึงไม่รู้ว่าอะไรฉลาดอีกต่อไป:

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

คำถาม UX ที่กล่าวถึงรายละเอียดในจุดนี้: /ux/23552/should-the-space-between-the-checkbox-and-label-be-clickable


นี่ไม่ใช่ความแตกต่างของข้อมูลจำเพาะ สลับใช้งานได้กับทั้งสองกรณีในเบราว์เซอร์ที่เข้ากันได้ทั้งหมด
hexalys

@hexalys ขอบคุณสำหรับรายงาน ฉันได้อัพเดตคำตอบแล้ว คุณหมายถึงเบราว์เซอร์ที่ใช้งานได้ควรเปิดหรือไม่ในทั้งสองกรณี? หากคุณสามารถเชื่อมโยงกับข้อความมาตรฐานที่เกี่ยวข้องซึ่งจะยอดเยี่ยม
Ciro Santilli 郝海东冠状病六四事件法轮功

1
ใช่. แม้ว่าฉันล้มเหลวที่จะแจ้งให้ทราบว่าตัวอย่างของคุณเป็นความเข้าใจผิดเนื่องจากพื้นที่ของคุณไม่ได้จริงๆพื้นที่ข้อความ มันเป็นmarginช่องทำเครื่องหมาย พฤติกรรมของ Firefox ในตัวอย่างของคุณนั้นแปลกและดูเหมือนว่าจะเป็นบั๊ก A labelจะมีช่องว่างหรือการเว้นว่างรอบเนื้อหาแบบอินไลน์ให้เป็นแบบคลิกได้ แต่เนื่องจากรูปแบบเนื้อหาของป้ายกำกับนั้นเป็นเนื้อหาแบบอินไลน์ / วลีระยะขอบของการป้อนข้อมูลไม่ควรคลิกได้เว้นแต่จะมีการสร้างป้ายกำกับของคุณdisplay: blockในกรณีนี้ป้ายกำกับด้านในblockจะสามารถคลิกได้ในทุกเบราว์เซอร์
hexalys

1
โปรดทราบว่าลิงก์ Bootstrap ในคำตอบจะไปที่เอกสารสำหรับ v3.3 เอกสารสำหรับ v4.0ดูเหมือนจะแสดงให้พวกเขาได้เปลี่ยนความคิดของพวกเขา. "ช่องทำเครื่องหมายและวิทยุใช้ถูกสร้างขึ้นเพื่อตรวจสอบรูปแบบการสนับสนุน HTML-based และให้รัดกุมฉลากสามารถเข้าถึงได้เช่นเรา <input> และ <label> s เป็นองค์ประกอบพี่น้องเมื่อเทียบกับ <input> ภายใน <label> สิ่งนี้จะละเอียดมากขึ้นเล็กน้อยเนื่องจากคุณต้องระบุ id และสำหรับแอตทริบิวต์ที่เกี่ยวข้องกับ <input> และ <label> "
Michael Krebs

2
ความแตกต่างของพฤติกรรมนี้เป็นสิ่งสำคัญสำหรับฉัน เมื่อองค์ประกอบเป็นพี่น้องขอบใด ๆ ขององค์ประกอบทั้งสองจะลดพื้นที่ผิวที่คลิกได้ซึ่งจะทริกเกอร์องค์ประกอบอินพุต การซ้อนข้อมูลเข้าในฉลากจะช่วยรักษาพื้นที่การคลิกสูงสุดให้การเข้าถึงสูงสุดแม้สำหรับผู้ใช้ที่ต่อสู้กับการเคลื่อนไหวของเมาส์หรือสัมผัสที่แม่นยำ ใน Bootstrap 4 การซ้อนยังคงทำงานและยังคงแสดงเหมือนเดิมโดยไม่จำเป็นต้องปรับเปลี่ยนหรือแทนที่ Bootstrap CSS ใด ๆ
Turgs

17

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

<style>
label {
  width: 120px;
  margin-right: 10px;
}
</style>

<label for="myinput">My Text</label>
<input type="text" id="myinput" /><br />
<label for="myinput2">My Text2</label>
<input type="text" id="myinput2" />

ทำให้เป็นเช่นนั้นฉันสามารถหลีกเลี่ยงตารางและขยะทั้งหมดที่อยู่ในรูปแบบของฉัน


3
คุณไม่ควรปล่อยงานนำเสนอให้กับ CSS แทนที่จะใช้<br />เพื่อแยกอินพุตหรือไม่
Znarkus

1
@Znarkus - ใช่โดยปกติฉันจะใส่ไว้ใน OL / LIs เพื่อจัดการกับการจัดรูปแบบเช่นนี้เป็นเพียงตัวอย่างสั้น ๆ อย่างรวดเร็ว
แพร์รอท

1
@ แพร์รอท: นั่นมันไม่สมเหตุสมผลเลยนะ และถ้าคุณต้องการห่อมันทำไมไม่ห่อมันด้วยฉลากล่ะ?
Znarkus

1
@ แพร์รอทส์ด้วยเหตุผลนั้นฉันคิดว่าทุกอย่างบนหน้าเว็บควรอยู่ใน ul / li และ<label> <span>My text</span> <input /> </label>คุณมีตัวเลือกการจัดแต่งทรงผมที่คุณต้องการ (เคย)
Znarkus

1
การใช้ "สำหรับ" บังคับให้คุณใช้รหัสซึ่งไม่ดีสำหรับเค้าโครงแบบลำดับชั้น
ตาย

15

ดูhttp://www.w3.org/TR/html401/interact/forms.html#h-17.9สำหรับคำแนะนำ W3

พวกเขาบอกว่าสามารถทำได้ทั้งสองทาง พวกเขาอธิบายสองวิธีเป็นอย่างชัดเจน (ใช้ "สำหรับ" กับ id ขององค์ประกอบ) และโดยนัย (ฝังองค์ประกอบในฉลาก):

ชัดเจน:

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

โดยปริยาย:

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


ฉันเพิ่งค้นพบว่านัยไม่ทำงานใน IE ... ความคิดใด ๆ
carinlynchin

11

ทั้งสองถูกต้อง แต่การใส่ข้อมูลลงในฉลากทำให้ยืดหยุ่นน้อยลงเมื่อจัดแต่งทรงผมด้วย CSS

ครั้งแรกถูก จำกัด ในการที่องค์ประกอบมันสามารถมี ตัวอย่างเช่นคุณสามารถใส่ระหว่างและข้อความฉลากถ้าไม่ได้อยู่ภายใน<label><div><input><input><label>

ประการที่สองในขณะที่มีวิธีแก้ไขปัญหาเพื่อให้การจัดแต่งทรงผมง่ายขึ้นเช่นการตัดข้อความภายในฉลากด้วยการขยายช่วงเวลาลักษณะบางอย่างจะสืบทอดมาจากองค์ประกอบหลักซึ่งทำให้การจัดแต่งทรงผมมีความซับซ้อนมากขึ้น


มีความยืดหยุ่นน้อยลงหรือไม่ คุณสามารถทำอย่างละเอียด? ดังที่คนอื่น ๆ พูดถึงคุณสามารถห่อข้อความป้ายกำกับด้านในด้วยการเว้นช่วงก็ได้เว้นแต่ว่าอะไรทำให้ยืดหยุ่นน้อยกว่ามาก
MPavlak

7

คำว่า 'gotcha' ที่เด่นชัดว่าคุณไม่ควรรวมองค์ประกอบอินพุตมากกว่าหนึ่งรายการไว้ในองค์ประกอบ <label> ด้วยแอตทริบิวต์ "สำหรับ" ที่ชัดเจนเช่น:

<label for="child-input-1">
  <input type="radio" id="child-input-1"/>
  <span> Associate the following text with the selected radio button: </span>
  <input type="text" id="child-input-2"/>
</label>

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

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


4
นี่ไม่ใช่ "gotcha" มันเป็นส่วนหนึ่งของข้อกำหนดอย่างชัดเจน ฉลากอาจมีการควบคุมได้สูงสุด 1 รายการ คุณกำลังผสมสไตล์โดยนัยและชัดเจนที่นี่ - ถ้าคุณใส่ส่วนควบคุมไว้ในป้ายกำกับคุณไม่ต้องการfor... และถ้าคุณต้องการใช้งานforแล้วการมีตัวควบคุมภายในป้ายกำกับนั้นไม่สมเหตุสมผล .
cHao

จริง แต่ดูเหมือนว่าคุณสมบัตินี้ไม่เป็นที่เข้าใจ เราพบปัญหานี้กับ API แบบฟอร์มของ Drupal 6 ซึ่งสร้างมาร์กอัปที่สร้างสถานการณ์ขึ้นไม่เหมือนกับที่อธิบายไว้ข้างต้น มีเพื่อนร่วมงานของฉันและฉันเกาหัวของเราเป็นเวลาหนึ่งหรือสองนาทีดังนั้นฉันคิดว่าฉันจะออกอากาศปัญหาที่นี่เพื่อป้องกันความสับสนที่อาจเกิดขึ้นในอนาคต
แอรอน

ไม่จำเป็นต้องใช้ "สำหรับ" ในฉลาก -> สถานการณ์อินพุต อินพุตหนึ่งรายการต่อเลเบลและมีประโยชน์ที่จะไม่ทราบชื่อหรือ ID และคุณสามารถกำหนดสไตล์ css ที่สวยงามเพื่อเก็บสิ่งที่ห่อหุ้มไว้รวมถึงการโฟกัสที่เกิดขึ้นเมื่อมีการคลิกองค์ประกอบอื่น ๆ เช่นภายใน ดู zipstory.com/signup สำหรับตัวอย่างวิธีการทำเช่นนี้
Jason Sebring

ขอบคุณ; สิ่งนี้ตอบคำถามที่เกี่ยวข้องอีกข้อหนึ่งที่ฉันมีคือว่าอาจมีอินพุตมากกว่าหนึ่งรายการภายในฉลากหรือไม่ (บริบท: ตัวเลือกปุ่มตัวเลือกหลายตัวเลือกหนึ่งรายการต่อบรรทัดรายการปุ่มตัวเลือกแต่ละรายการมี 1, 2, 3 หรืออาจป้อนข้อความประเภทที่มีอินพุตเพิ่มเติมโดยมีเจตนาที่จะคลิกที่บรรทัดที่มีผลการเลือกปุ่มตัวเลือกของบรรทัดนั้น ไม่ได้เลือกและอนุญาตให้แก้ไขอินพุต / อินพุตในบรรทัดนั้น) ทำให้ประตูเปิดเพื่อมีป้ายกำกับหลายข้อความที่ไม่ใช่ข้อความป้อนข้อมูลในแบบฟอร์ม แต่มันตอบคำถามของฉันเกี่ยวกับสิ่งที่ฉันคิดว่าใช้ได้ (มันไม่ได้.)
Christos เฮย์เวิร์ด

6

อย่างที่คนส่วนใหญ่พูดกันจริง ๆ แล้วทั้งสองวิธีทำงานได้ แต่ฉันคิดว่าควรจะทำได้แค่อันแรกเท่านั้น เนื่องจากความเข้มงวดทางความหมายฉลากไม่ได้ "บรรจุ" อินพุต ในความคิดของการบรรจุ (แม่ / ลูก) ความสัมพันธ์ในโครงสร้างมาร์กอัปควรจะสะท้อนถึงการบรรจุในการส่งออกภาพ คือองค์ประกอบโดยรอบอีกคนหนึ่งในมาร์กอัปควรจะวาดรอบที่หนึ่งในเบราว์เซอร์ ตามนี้ฉลากควรเป็นพี่น้องของท่านไม่ใช่ผู้ปกครอง ดังนั้นตัวเลือกที่สองนั้นจะผิดและสับสน ทุกคนที่อ่านZen of Pythonอาจเห็นด้วย (Flat ดีกว่าซ้อนกัน Sparse ดีกว่าหนาแน่นควรมีหนึ่ง - และควรมีเพียงวิธีเดียวเท่านั้น - เห็นได้ชัดว่าทำ ... )

เนื่องจากการตัดสินใจเช่นนั้นจาก W3C และผู้จำหน่ายเบราว์เซอร์รายใหญ่ (การอนุญาต "ไม่ว่าคุณจะทำอะไร" แทนที่จะเป็น "ทำในสิ่งที่ถูกต้อง") ก็คือเว็บมีความยุ่งเหยิงในวันนี้และเราต้องจัดการยุ่ง และรหัสดั้งเดิมที่หลากหลาย


5

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

label input {
    vertical-align: bottom;
}

เพื่อให้แน่ใจว่ามีการจัดตำแหน่งแนวตั้งที่เหมาะสมสำหรับวิทยุ


2

อ้างถึงWHATWG ( การเขียนส่วนต่อประสานผู้ใช้ของแบบฟอร์ม ) ไม่ผิดที่จะใส่ฟิลด์อินพุตไว้ในฉลาก การทำเช่นนี้จะช่วยให้คุณประหยัดรหัสเนื่องจากไม่จำเป็นต้องใช้forแอตทริบิวต์จากlabel


2

ฉันชอบห่อองค์ประกอบภายในของฉันอย่างมาก<label>เพราะฉันไม่จำเป็นต้องสร้างรหัส

ฉันเป็นนักพัฒนา Javascript และใช้ React หรือ Angular เพื่อสร้างส่วนประกอบที่ฉันหรือผู้อื่นสามารถนำกลับมาใช้ใหม่ได้ จากนั้นจะเป็นการง่ายในการทำสำเนา idในหน้าซึ่งนำไปสู่พฤติกรรมที่แปลก


1

สิ่งหนึ่งที่คุณต้องพิจารณาคือการทำงานร่วมกันของช่องทำเครื่องหมายและอินพุตวิทยุกับ javascript

ใช้โครงสร้างด้านล่าง:

<label>
  <input onclick="controlCheckbox()" type="checkbox" checked="checkboxState" />
  <span>Label text</span>
</label>

เมื่อผู้ใช้คลิกที่ฟังก์ชั่น "ข้อความข้อความ" controlCheckbox () จะถูกไล่ออกหนึ่งครั้ง

แต่เมื่อคลิกแท็กอินพุตฟังก์ชัน controlCheckbox () อาจถูกเรียกใช้สองครั้งในเบราว์เซอร์รุ่นเก่าบางรุ่น นั่นเป็นเพราะทั้งแท็กใส่ข้อมูลและป้ายกำกับเรียกเหตุการณ์ onclick ที่แนบมากับช่องทำเครื่องหมาย

จากนั้นคุณอาจมีข้อบกพร่องบางอย่างในช่องทำเครื่องหมายของคุณรัฐ

ฉันพบปัญหานี้เมื่อเร็ว ๆ นี้ใน IE11 ฉันไม่แน่ใจว่าเบราว์เซอร์ที่ทันสมัยมีปัญหากับโครงสร้างนี้หรือไม่


-1

ข้อได้เปรียบหลักของการวางinputภายในlabelคือประสิทธิภาพการพิมพ์สำหรับมนุษย์และที่เก็บข้อมูลไบต์สำหรับคอมพิวเตอร์

@Znarkus พูดในความคิดเห็นของเขาที่มีต่อ OP

ข้อดีอย่างหนึ่งของการวาง<input />ข้างใน<label>คือคุณสามารถละเว้นforและid: <label>My text <input /></label>ในตัวอย่างของคุณ ดีกว่ามาก!

หมายเหตุ: ในรหัส @Znarknus ประสิทธิภาพอื่นรวมอยู่ด้วยไม่ได้ระบุไว้อย่างชัดเจนในความคิดเห็น type="text"สามารถละเว้นได้และinputจะแสดงกล่องข้อความเป็นค่าเริ่มต้น

การเปรียบเทียบการกดแป้นและไบต์แบบเคียงข้างกัน [1]

การกดแป้น 31, 31 ไบต์

<label>My Text<input /></label>

58 การกดแป้น, 58 ไบต์

<label for="myinput">My Text</label><input id="myinput" />

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

[1] ไฟล์ข้อความ (.txt) สร้างขึ้นใน Notepad บน Windows ไบต์จากคุณสมบัติ Windows File Explorer

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.