입력 요소를 레이블 요소 안에 넣어야합니까?


606

중첩 labelinputHTML 요소에 관한 모범 사례가 있습니까?

고전적인 방법 :

<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>, 당신은 생략 할 수 있다는 것입니다 forid: <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에 의해 여기에 주어진 첫 번째 예를 설정합니다. 그러나 라디오 버튼과 확인란의 경우 일반적으로 세 번째 예제를 사용합니다. 여기서 텍스트 앞에 입력을 원하고 나머지 레이블 및 필드가 사용하는 것과 같은 종류의 고정 너비 및 / 또는 부동을 원하지 않습니다. 따라서 하나의 주어진 양식 에서이 두 형식을 함께 사용하는 것을 알 수 있습니다.
Funka

6
나는 <label for="inputbox"><input id="inputbox" type="text" /></label>그들의 기준에 따라 패스 인지 궁금 합니다.
Matt

64
입력 태그 안에 레이블을 중첩시킬 수 없어서 너무 나쁩니다. 추상적 관점에서 볼 때 레이블은 실제로 입력의 속성이기 때문에 훨씬 의미 론적으로 합리적입니다.
Alex

9
연결된 WCAG 문서에는 다음과 같은 옵션이 있습니다. "컨트롤은 레이블 텍스트를 포함하는 레이블 요소에 포함되어 있습니다." @Sorcy가 언급 한 이후 몇 년 동안 추가되었는지 여부는 알 수 없지만 레이블에 입력 시나리오는 현재 유효한 것으로 간주됩니다.
Alex

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로 스타일을 지정하는 것이 더 쉽다고 생각합니다.

그러나 그것은 내가 생각하는 맛의 문제입니다.


더 많은 스타일 옵션이 필요한 경우 스팬 태그를 추가하십시오.

<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>(라벨은 입력 요소 전후)
Philipp

및 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 을 확인 했습니다 . 맨 아래 (모호하지 않음)에는 적합성을 주장하기 위해 테스트 기준을 통과해야하며 특히 for 속성을 사용해야한다고 명시되어 있습니다. 실제로 Apple Voiceover (10 % 시장 점유율 스크린 리더 데스크탑, 60 % 시장 점유율 스크린 리더 모바일)에서 이것을 마지막으로 테스트했을 때 암시 적 레이블이 작동하지 않았으므로 이는 또 다른 주요 요인이었습니다. 희망이 도움이됩니다!
James Westgate

39

레이블 태그에 입력 태그를 포함하면 'for'속성을 사용할 필요가 없습니다.

즉, 입력 태그는 엔티티가 아닌 별도의 엔티티라고 생각하기 때문에 레이블에 입력 태그를 포함하고 싶지 않습니다.


8
용은 구조 레이아웃 계층 적으로 매우 하드를 :-( 만드는,하지만 ID를 사용해야합니다
lethalman

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>

레이블과 상자 사이를 클릭 할 수 있다는 것은 다음과 같습니다.

  • 클릭하기 쉬움
  • 일이 시작되고 끝나는 곳이 덜 명확합니다.

부트 스트랩 체크 박스 v3.3 예제는 내부 입력을 사용합니다 : http://getbootstrap.com/css/#forms 그것들을 따르는 것이 현명 할 수 있습니다. 그러나 그들은 v4.0 https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radios 에서 마음이 바뀌 었 으므로 더 이상 지혜로운 것이 무엇인지 모르겠습니다.

확인란 및 라디오 사용은 HTML 기반 양식 유효성 검사를 지원하고 간결하고 액세스 가능한 레이블을 제공하도록 제작되었습니다. 따라서 <input>s와 <label>s는 <input>a 와 반대로 형제 요소 <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
답변의 부트 스트랩 링크는 v3.3의 문서로 이동합니다. 버전 4.0에 대한 문서는 그들의 마음을 변경 한 시사한다 :. "체크 박스 및 라디오가 지원 HTML 기반 양식 유효성 검사에 내장하고 간결한 접근 레이블을 제공하는 사용을 같은, 우리의 <입력> s와 <레이블>의 <label> 내의 <input>과 반대되는 형제 요소입니다. id를 지정하고 <input> 및 <label> "과 관련된 속성에 대해 좀 더 장황합니다.
Michael Krebs

2
이 행동 차이는 나에게 가장 큰 것입니다. 요소가 형제 인 경우 각 요소의 여백 은 클릭 가능한 표면 영역줄여 입력 요소를 트리거합니다. 입력 내용을 레이블 안에 중첩하면 클릭 가능한 최대 영역이 유지되므로 마우스 또는 터치 움직임이 정밀한 사용자에게도 최대의 접근성을 제공합니다. Bootstrap 4에서 중첩 은 여전히 ​​작동 하며 Bootstrap CSS를 조정하거나 재정의하지 않고도 동일하게 표시됩니다.
터그

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
<br />입력을 분리하는 데 사용 하는 대신 프레젠테이션을 CSS로 남겨두면 안 됩니까?
Znarkus

1
@ Znarkus-예, 일반적으로 OL / LI로 래핑하여 형식을 처리합니다. 이것은 간단한 속기 예입니다.
앵무새

1
@Parrots : 의미 론적으로 말이되지 않습니다, imo. 포장해야한다면 왜 라벨로 포장하지 않습니까?
Znarkus

1
@Parrots 그런 추론으로 페이지의 모든 것이 ul / li 안에 들어가야한다고 생각합니다. 또한 <label> <span>My text</span> <input /> </label>필요한 모든 스타일 옵션이 있습니다.
Znarkus

1
"for"를 사용하면 계층 구조 레이아웃에 나쁜 id를 사용하게됩니다.
lethalman

15

W3 권장 사항 은 http://www.w3.org/TR/html401/interact/forms.html#h-17.9 를 참조 하십시오 .

그들은 어느 쪽이든 할 수 있다고 말합니다. 두 가지 방법을 명시 적 (요소 ID와 함께 "for"사용) 및 암시 적 (레이블에 요소 포함)으로 설명합니다.

명백한:

for 속성은 레이블을 다른 제어와 명시 적으로 연관시킵니다. for 속성의 값은 연관된 제어 요소의 id 속성 값과 같아야합니다.

절대적인:

레이블을 다른 제어와 내재적으로 연관 시키려면 제어 요소가 LABEL 요소의 컨텐츠 내에 있어야합니다. 이 경우 LABEL에는 하나의 제어 요소 만 포함될 수 있습니다.


방금 IE에서 암시 적이 작동하지 않는다는 것을 발견했습니다 .... 어떤 아이디어?
carinlynchin

11

둘 다 맞지만 레이블에 입력을 넣으면 CSS로 스타일을 지정할 때 유연성이 떨어집니다.

먼저 a <label>는 포함 할 수있는 요소가 제한됩니다 . 예를 들어 및 안에 레이블 텍스트 가없는 경우에만 레이블 텍스트와 <div>사이 <input>에 레이블을 넣을 수 있습니다 .<input><label>

둘째, 내부 레이블 텍스트를 스팬으로 감싸는 것과 같이 스타일링을 쉽게 수행 할 수있는 해결 방법이 있지만 일부 스타일은 부모 요소에서 상속되므로 스타일링이 더 복잡해질 수 있습니다.


훨씬 덜 유연합니까? 정교하게 할 수 있습니까? 다른 사람들이 언급했듯이 내부 레이블 텍스트를 스팬으로 감싸면 유연성이 떨어집니다.
MPavlak

7

주목할만한 'gotcha'는 명시적인 "for"속성을 가진 <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'속성에 ID가 명시 적으로 정의 된 요소에 즉시 초점을 던집니다. 포함 된 텍스트 필드를 클릭하여 값을 입력하는 것은 거의 불가능합니다.

개인적으로 입력 하위 요소가있는 레이블 요소를 피하려고합니다. 레이블 요소가 레이블 자체보다 많은 것을 포함하는 것은 의미 상 부적절한 것으로 보입니다. 특정 미학을 달성하기 위해 레이블에 입력을 중첩하는 경우 대신 CSS를 사용해야합니다.


4
이것은 "gotcha"가 아닙니다. 명시 적으로 사양의 일부입니다. 라벨에는 최대 1 개의 컨트롤이 포함될 수 있습니다. 여기에 암시 적 스타일과 명시 적 스타일을 혼합하고 있습니다. 컨트롤을 레이블 안에 넣으면 필요하지 않습니다 for... 사용하고 싶다면 for레이블 안에 컨트롤을 갖는 것은 의미가 없습니다. .
cHao

사실이지만이 사양은 잘 이해되지 않은 것 같습니다. 우리는 Drupal 6의 양식 API 에서이 문제에 부딪 쳤습니다.이 API는 위에서 설명한 것과 다른 시나리오를 생성하는 마크 업을 생성했습니다. 동료가 있었는데 1 ~ 2 분 동안 머리를 긁었기 때문에 앞으로 혼동을 피하기 위해 여기서 문제를 해결할 것이라고 생각했습니다.
아론

레이블-> 입력 시나리오에서 "for"가 필요하지 않습니다. 레이블 당 하나의 입력으로 이름이나 ID를 알 필요가 없다는 이점이 있으며 CSS 스타일링을 사용하여 물건을 캡슐화하고 내부의 다른 요소를 클릭 할 때 초점을 맞출 수 있습니다. 이를 수행하는 깔끔한 방법에 대한 예는 zipstory.com/signup을 참조하십시오.
Jason Sebring

감사합니다; 이것은 내가 가지고있는 또 다른 관련 질문, 즉 레이블 안에 잠재적으로 둘 이상의 입력이 있는지 여부에 대한 답변입니다. (문맥 : 한 줄에 하나씩, 여러 개의 라디오 버튼 옵션, 각 라디오 버튼 항목에 1, 2, 3 또는 더 많은 유형의 텍스트 입력이있을 수 있으며, 해당 라인의 라디오 버튼을 선택한 결과로 라인을 클릭하려는 경우 선택하지 않고 해당 줄의 입력 / 입력을 편집 할 수 있습니다.) 이렇게하면 비 입력 텍스트에 대한 여러 레이블이 양식에 표시 될 수 있습니다. 그러나 내가 생각한 것이 정상인지에 대한 내 질문에 대답했습니다. (그렇지 않았습니다.)
Christos Hayward

6

대부분의 사람들이 말했듯이, 두 가지 방법 모두 실제로 작동하지만 첫 번째 방법 만 생각합니다. 의미 상 엄격하기 때문에 레이블에는 입력이 "포함되지 않습니다". 제 생각에는 격리 (부모 / 자식) 관계 는, 마크 업 구조에서의 는 시각적 결과의 봉쇄 반영해야한다 . 즉, 마크 업에서 다른 것을 둘러싼 요소 는 브라우저에서 그 주위에 그려 져야 합니다 . 이에 따르면, 레이블은 부모가 아닌 입력의 형제 여야합니다. 옵션 2는 임의적이며 혼란 스럽습니다. 파이썬선 (Zen of Python) 을 읽은 사람이라면 아마 동의 할 것입니다.

W3C와 주요 브라우저 공급 업체의 결정 ( "올바른 방법"대신 "어느 쪽을 선호하든"허용)은 오늘날 웹이 너무 엉망이되어 개발자가 엉 키게해야한다는 것입니다 매우 다양한 레거시 코드입니다.


5

나는 보통 처음 두 가지 옵션을 사용합니다. 레이블과 CSS에 포함 된 라디오 선택 항목이 다음과 같은 것을 포함했을 때 세 번째 옵션이 사용 된 시나리오를 보았습니다.

label input {
    vertical-align: bottom;
}

무전기의 올바른 수직 정렬을 보장합니다.



2

<label>ID를 생성 할 필요가 없기 때문에 요소를 감싸는 것을 선호합니다 .

저는 Javascript 개발자이며 React 또는 Angular는 나와 다른 사람이 재사용 할 수있는 구성 요소를 생성하는 데 사용됩니다. 그러면 페이지에서 ID를 복제하는 것이 쉬워 이상한 행동이 발생합니다.


1

고려해야 할 사항 중 하나는 자바 스크립트와 확인란 및 라디오 입력의 상호 작용입니다.

아래 구조 사용하기 :

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

사용자가 "라벨 텍스트"를 클릭하면 controlCheckbox () 함수가 한 번 실행됩니다.

그러나 입력 태그를 클릭하면 일부 구형 브라우저에서 controlCheckbox () 함수가 두 번 실행될 수 있습니다. 입력 및 레이블 태그 모두 확인란에 연결된 클릭 이벤트를 트리거하기 때문입니다.

그런 다음 checkboxState에 버그가있을 수 있습니다.

IE11에서 최근 에이 문제가 발생했습니다. 최신 브라우저 에이 구조에 문제가 있는지 확실하지 않습니다.


-1

input내부 배치의 주요 장점label 사람의 타이핑 효율성과 컴퓨터의 바이트 저장입니다.

@Znarkus는 OP에 대한 의견에서

퍼팅의 가장 큰 장점 중 하나 <input />내부는 <label>, 당신은 생략 할 수 있다는 것입니다 forid: <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] Windows 메모장에서 만든 텍스트 파일 (.txt), Windows 파일 탐색기 속성의 바이트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.