'name'또는 'id'로 HTML 앵커를 만들어야합니까?


783

" http://example.com/#foo"메소드를 사용 하여 웹 페이지의 일부를 참조하려는 경우

<h1><a name="foo"/>Foo Title</h1>

또는

<h1 id="foo">Foo Title</h1>

둘 다 작동하지만 동일하거나 의미상의 차이가 있습니까?


2
링크는 실제로 있어야합니다. http://example.com#foo따라서 # 앞 /없이 #
Dana

71
사실, http://example.com#foohttp://example.com/#fooURI에 근거 RFC의 하나에서 정의 된 바와 동일하다.
Oliver

답변:


616

HTML 5 사양에 따르면 5.9.8 조각 식별자로 이동 :

HTML 문서 (및 text / html MIME 유형)의 경우, 문서의 표시된 부분이 무엇인지 판별하려면 다음 처리 모델을 따라야합니다.

  1. URL을 구문 분석하고 fragid를 URL의 <fragment> 구성 요소로 둡니다.
  2. fragid가 빈 문자열이면 문서의 표시된 부분이 문서의 맨 위에 있습니다.
  3. DOM에 fragid와 정확히 동일한 ID를 가진 요소가있는 경우 트리 순서의 첫 번째 요소는 문서의 표시된 부분입니다. 여기서 알고리즘을 중지하십시오.
  4. 가 있으면 값 fragid 정확히 동일한 이름 속성이있는 요소에 DOM 후 트리 위해 최초의 요소는 문서의 지정된 부분이고; 여기서 알고리즘을 중지하십시오.
  5. 그렇지 않으면 문서에 표시된 부분이 없습니다.

따라서을 id="foo"찾은 다음 따라갑니다.name="foo"

편집 : @hsivonen이 지적한 것처럼 HTML5에서 a요소에는 이름 속성이 없습니다. 그러나 위의 규칙은 여전히 ​​다른 명명 된 요소에 적용됩니다.


76
해당 알고리즘과 유효성 사이에는 암시 적 관계가 없습니다. <a name>은 (는) 현재 작성된 초안에서 HTML5에서 유효하지 않습니다.
hsivonen

13
실제로 다른 "명명 된 요소"에는 적용되지 않습니다. 이름 속성은 <a name>에만 적용됩니다. 그러나이 속성은 작성자가 사용할 수 없습니다. 이전 HTML 페이지의 사용자 에이전트는이를 존중해야합니다.
Anne

19
@RafaelSoares는 <h1 id="foo">Foo Title</h1>IE6에서도 작동의 일부 HTML 4.01 사양
Aprillion

4
name = "foo"를 찾지 않고 <a name="foo">를 찾습니다. 링크
Daniel Herzog

3
과 HTML5 문서에서 name="foo"id="foo"(독립적으로 페이지 내에서 자신의 순서), 크롬과 파이어 폭스로 이동합니다 id,하지만 IE는 (11 테스트) 및 Edge는으로 이동합니다name
알바 몬토

182

XML 빈 요소 구문은에서 지원되지 않으므로 <h1><a name="foo"/>Foo Title</h1>로 제공되는 HTML 버전 에서는 사용하지 않아야합니다 . 그러나 HTML4에서는 괜찮습니다. 현재 작성되어있는 HTML5에서는 유효하지 않습니다.text/htmltext/html<h1><a name="foo">Foo Title</a></h1>

<h1 id="foo">Foo Title</h1>HTML4와 HTML5 모두에서 OK입니다. Netscape 4에서는 작동하지 않지만 Netscape 4에서는 작동하지 않는 12 가지 다른 기능을 사용하게 될 것입니다.


6
브라우저 지원에 대해 이야기 +1 NS4가 url # id => element.id를 지원하지 않는 유일한 방법입니까?
Hashbrown

14
@Hashbrown 답변을 찾을 수 없으므로 테스트를 수행했습니다. 아주 오래된 브라우저조차도 URL 조각과 CSS 선택기의 호환성 측면에서 앵커 id처럼 취급한다는 것을 알았습니다 . 테스트 : Chrome 6, Firefox 1.5, IE6, Opera 8.02, Safari 3.1.2, Netscape 7.2, Lynx 2.24 및 모바일 브라우저 : Android 2.2, Chrome 26, Dolphin 9.3, Firefox 19, IE10, Safari 4 및 Opera Mini 5.1 name:target
Stephen M. Harris

1
@ smhmic, 하나 찾았습니다. Off-By-One 웹 브라우저는 <a name="foo"/>를 통해 정의 된 앵커를 인식하지만 <sometag id = "foo"> OB1은> 8 년 전에 마지막으로 업데이트 된 앵커를 인식하지 않습니다. 저자는 "완전한 HTML 3.2를 지원하는 세계에서 가장 작고 빠른 웹 브라우저 일 수있다"고 자랑스럽게 생각합니다. XP를 통해 Win95를 지원한다고 주장하지만 64 비트 Win7에서 잘 작동합니다. 그렇다면 왜 그런 공룡이 있습니까? 물론 테스트를 위해 내 사이트가 골동품 브라우저로 너무 나쁘게 부서지지 않도록하십시오. 또한 플래시 드라이브에 OB1도 탑재합니다. 작고 독립적이며 감염으로부터 면역됩니다.
Dave Burton

26
2016 년에이 내용을 읽습니다 .. Netscape 4?
ADTC

1
`<a name="something" id="something> </a> [ELEMENT TO SCROLL TO]를 사용하는 것이 호환 가능하고 스크롤하기 위해 요소의 내용을 스타일링하지 않기 때문에 가장 좋습니다.
JustinCB

52

page.html # foo와 같은 페이지의 해당 영역에 연결하려는 경우 Foo Title은 사용해야하는 링크가 아닙니다.

<h1 id="foo">Foo Title</h1>

대신 <a>참조 를 넣으면 헤드 라인이 <a>사이트 내의 특정 CSS에 의해 영향을받습니다 . 추가 마크 업일 뿐이므로 필요하지 않습니다. 헤드 라인에 ID를 배치하는 것이 좋습니다. 더 나은 형식 일뿐만 아니라 Javascript 또는 CSS로 해당 개체를 처리 할 수 ​​있습니다.


뿐만 아니라 디스플레이에서 이상한 오류와 싸우고 있습니다 .IE에 아무것도 표시되지 않았습니다. 공격 지점에 대한 아이디어가 부족하여 유효성 검사기에서 <a name="foo"> 항목에 플래그를 지정하여 변경했습니다. 이제 디스플레이가 제대로 작동하지 않습니다.
Loren Pechtel

이것은 충분하기 때문에 효과를 위해 앵커 태그가 필요하지 않습니다.
Wallace Sidhrée

27

Wikipedia는 다음과 같이이 기능을 많이 사용합니다.

<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>

그리고 Wikipedia는 모두를 위해 일하고 있으므로이 양식을 안전하게 사용하는 것이 좋습니다.

또한 span뿐만 아니라 div 또는 테이블 셀과 함께 이것을 사용할 수 있으며 요소의 : target 의사 클래스에 액세스 할 수 있습니다. 굵은 글씨처럼 폭을 바꾸지 않도록 조심하십시오. 내용을 움직이면 방해가됩니다.

명명 된 앵커-내 투표는 피하는 것입니다.

  • "이름과 ID는 같은 네임 스페이스에 있습니다 ..."-같은 네임 스페이스를 가진 두 가지 속성은 미쳤습니다. 더 이상 사용되지 않는다고 가정 해 봅시다.
  • "href 속성이없는 요소를 고정하십시오"-다시 한 번, 요소의 특성 (하이퍼 링크 여부)은 속성을 갖는 것으로 정의됩니다! 두 배 미친. 상식은 그것을 피하기 위해 말합니다.
  • 의사 클래스가없는 앵커 스타일을 적용한 경우 스타일이 각각에 적용됩니다. CSS3에서는 속성 선택기 (또는 각 유사 클래스에 대해 동일한 스타일 지정)를 사용 하여이 문제를 해결할 수 있지만 여전히 해결 방법입니다. 의사 클래스 당 색상을 선택하고 기본적으로 밑줄은 제거하는 것이 의미가 있으므로 다른 텍스트와 동일하기 때문에 일반적으로 나타나지 않습니다. 그러나 링크를 굵게 표시하면 문제가 발생할 수 있습니다.
  • Netscape 4는 id 기능을 지원하지 않을 수 있지만 여전히 알려지지 않은 속성으로 인해 문제가 발생하지 않습니다. 그것이 저에게 호환성이라고 불렀습니다.

1
글 머리 기호 3/4 수정 제안 : 스타일을 a {color:red}지정하면 <a href> 링크와 <a name> 조각이 모두 색칠됩니다. 의사 클래스 a:link {color:red]}또는 속성 선택기 로이 문제를 해결할 수 있습니다.a:not([href]) {color:red;}
Bob Stein

당신 말이 맞습니다 만, 저에게 총알 3은 정확히 이것을 말합니다. 그래도 내 영어가 될 수 있습니다 ...
Zoltán Morvai

마지막으로, "의사가없는 앵커를 스타일링하면 스타일이 각각에 적용됩니다." 모호한 : "각 의사 클래스"를 생각할 수 있습니다. 권리. 그러나 나는 앵커를 사용하는 "각 사례"에 대해 생각하고 있었다. 명확히했다. :) 댓글 후에 편집 할 필요는 없지만 고집하면 할 수 있습니다. 그러나 색상을 다르게 유지하려는 의도로 여전히 색상이 발생하지는 않지만 글꼴 무게가 같은 경우도 마찬가지입니다.
Zoltán Morvai

@ ZoltánMorvai의 의견을 읽었습니다. "double crazy"와 "netscape 4"doubleplusgood.
랜디 L

1
같은 네임 스페이스를 가진 두 가지 속성은 미쳤다. 사용자 생성 컨텐츠를 수행 할 때 <a name="heading1"></a> ... document.html#heading1ID가 페이지의 다른 ID와 충돌 할 수 있으므로 ID를 설정하지 않고 조각 링크로 무언가를 지정할 수있는 것이 매우 유용 합니다. nameHTML5에 속성을 넣지 않은 것은 부끄러운 일 입니다.
Jez

14
<h1 id="foo">Foo Title</h1>

사용해야합니다. 링크를 원하지 않으면 앵커를 사용하지 마십시오.


Tim Knight의 답변과 동일하며, 반년 전에 게시되었습니다. -1
Luc

13

JavaScript 사용자를위한 정보 : 모든 ID는 window에서 전역 변수가됩니다 .

<h1 id="foo">Foo Title</h1>

방금 JS 전역을 만들었습니다.

window.foo

의 값은 window.foo될 것 HTMLElement를 들어 h1.

id속성에 사용 된 모든 값 이 안전하다는 것을 보장 할 수 없다면 다음을 고수하는 것이 좋습니다 name.

<h1 name="foo">Foo Title</h1>

12
좋은 소식은에 정의 된 함수를 덮어 쓸 수 없다는 것입니다 window. 예를 들어, <div id="open"></div>함수를 덮어 쓰지 않습니다 window.open.
Flimm

8

의미 상 차이는 없습니다. 표준의 추세는 id오히려 사용에 대한 것 name입니다. 그러나 name경우에 따라 선호 할만한 차이가 있습니다 . HTML 4.01 사양은 다음과 같은 힌트를 제공 합니다 .

사용 id또는 name? 작성자는 앵커 이름 을 사용할지 id또는 name앵커 이름 을 사용할지 결정할 때 다음 문제를 고려해야합니다 .

  • id 속성은 단순한 앵커 이름 이상의 역할을 할 수 있습니다 (예 : 스타일 시트 선택기, 처리 식별자 등).
  • 일부 이전 사용자 에이전트는 id 속성으로 작성된 앵커를 지원하지 않습니다.
  • name 속성은 엔터티가있는 더 풍부한 앵커 이름을 허용합니다.

14
명확하게 말하면 "이전 사용자 에이전트"라고 말하면 완전히 오래된 사용자 에이전트를 의미합니다. 나는 그것에 대해 걱정하지 않을 것입니다.
Eli

1
HTML5는 "풍부한"ID도 허용합니다. ID 고정 조각을 처리 할 수없는 시장 점유율이 0.1 %보다 큰 버전의 브라우저를 가진 사람이 있습니까? – 아니면 공룡 넷스케이프 4.7이 실제로 가장 널리 퍼져 있습니까?
Robert Siemer

7
FWIW, idiOS 5 용 Safari에서 앵커를 사용할 수 없었기 때문에 '09 년에 "실제로 오래된"브라우저 일뿐입니다. nameiPad에서 사이트가 제대로 작동하도록하려면 s 를 추가해야했습니다 . 이것은 지금까지 수정되었을 수도 있습니다 .iOS 6 기기를 소유하고 있지 않습니다.
Daniel Saner

@DanielSaner 정말? 따라서 en.wikipedia.org/wiki/IPad#Applications 가 iPad에서 작동하지 않습니까?
Aprillion

1
@DanielSaner 나는 시뮬레이터를 사용하여 Mobile Safari 5.02 & 5.1, Android Browser 2.2 & 2.3을 테스트했으며 id앵커는 보편적으로 작동하는 것 같습니다. 경우 이 간단한 예제가 모바일에서 작동하지 않습니다, 나는 장치 접근성 설정을 확인합니다. (@ death4 월 Wikipedia 모바일 사이트에는 효과적으로 URL 조각을 무시하는 Javascript가 있습니다.)
Stephen M. Harris

8

ID 브라우저는 이전 브라우저에서 작동하지 않으며 앵커 이름 방법은 최신 HTML 버전에서 더 이상 사용되지 않습니다 ... id로 갈 것입니다.


2
그 주장에 대한 출처가 있습니까? 나를 잘못 이해하지 마라. 나는 일반적으로 관심이 있습니다.
Henrik Paul

11
"이전 브라우저에서는 작동하지 않습니다"에 대한 설명이 없습니다. – Netscape 4를 제외하고는 어떤 브라우저입니까?
Robert Siemer

3
div에서 ID를 사용해 보았는데 IE 7에서도 작동합니다. IE 6에서는 테스트 할 수 없었지만 요즘 IE 6을 사용하는 사람은 ...
Gilly

특정 경우에는 @ death4 월 (HASLAYOUT에 따라 다름) 버그가 있습니다.
Knu

@RobertSiemer 거의 보편적으로 작동 합니다. 이 답변 아래의 의견을 참조하십시오 .
Stephen M. Harris

3

세로로 쌓인 div 컨테이너로 구성된 웹 페이지가 있으며 형식은 동일하고 일련 번호 만 다릅니다. 각 div의 맨 위에 이름 앵커를 숨기고 싶었으므로 가장 경제적 인 솔루션은 앵커를 여는 div 태그 내에 id로 ID를 포함시키는 것으로 나타났습니다.

<div id="[serial number]" class="topic_wrapper">

2

마크 업에 대한 관찰 이전 버전의 HTML에서 마크 업 양식은 앵커 포인트를 제공했습니다. id 속성을 사용하는 HTML5의 마크 업 양식은 대부분 동일하지만 식별 할 요소가 필요합니다. 대부분의 경우 일반적으로 컨텐츠를 포함해야합니다.

예를 들어 빈 스팬 또는 div를 사용할 수 있지만이 사용법은 성능이 저하되어 보입니다.

한 가지 생각은이 목적으로 wbr 요소를 사용하는 것입니다. wbr에는 빈 컨텐츠 모델이 있으며 단순히 줄 바꿈이 가능함을 선언합니다. 이것은 여전히 ​​마크 업 태그를 약간 사용하는 것이지만 무료 문서 분할이나 빈 텍스트 범위보다 훨씬 적습니다.


그건 좋은 지적이야. 더 많은 정보 wbr: w3.org/TR/html-markup/wbr.html<wbr id="foo" /> 보다 사용<a name="foo"></a>
Luke

1

두 번째 샘플은 해당 요소에 고유 ID를 할당합니다. 그런 다음이 요소는 DHTML을 사용하여 조작하거나 액세스 할 수 있습니다.

반면 첫 번째는 책갈피와 비슷한 문서 내에서 이름이 지정된 위치를 설정합니다. "앵커"에 부착하면 완벽하게 이해됩니다.


1

html 5에서이 id=""속성은 요소에 대한 고유 식별자를 정의하며 조각 링크의 앵커이기도합니다. 이전 html 표준 name=""에서 <a>요소 의 속성은 조각 링크의 앵커를 정의합니다. 나는 다음과 같은 것을 추천한다 : 속성에
<a name="foo" id="foo"></a><h1>Foo Title</h1>
대한 지원 id=""은 약간의 문제가 있기 때문에 (모든 주요 브라우저의 최신 릴리스가 그것을 지원하더라도 몇 년이 넘지 않은 릴리스. 좋은 이유가 없다면]). 호환 가능하며 링크 된 요소의 스타일을 지정하지 않습니다. 닫는 요소가 여전히 요소 외부에 있기 때문에 현재의 모든 표준에서 여전히 유효합니다.

요소 의 name=""id=""속성이 <a>동일한 지 확인하십시오 .


2
HTML을 사용하는 모든 것이 브라우저 인 것은 아닙니다. HTML을 사용하여 창에 정보를 표시하는 Java 라이브러리를 사용하고 있습니다. 이것이 유일한 방법입니다. name필요한 앵커 태그 의 속성입니다. 에 속성을 배치 hN하거나 span작동하지 않았습니다.
Mars

0

이전 브라우저에는 name 속성을 사용하고 새 브라우저에는 id 속성을 사용하는 방법은 무엇입니까? 두 옵션 모두 사용되며 대체 방법은 기본적으로 구현됩니다 !!!


-3

전체 "명명 된 앵커"개념은 정의에 따라 이름 속성을 사용합니다. 이름을 계속 사용하지만 일부 자바 스크립트 상황에서는 ID 속성이 유용 할 수 있습니다.

의견에서와 같이 항상 베팅을 헤지하기 위해 두 가지를 모두 사용할 수 있습니다.


둘 다 사용할 때 id : s와 이름이 전역 적으로 고유합니까? 에서와 같이 id 및 name과 동일한 문자열을 사용할 수 있습니까?
Henrik Paul

당신은 할 수 있지만, 어떤 사람들은 그것이 나쁜 습관이라고 생각합니다.
Alex Fort

9
HTML 사양에 따르면 둘 다 존재하는 경우 이름과 ID가 동일해야합니다. 또한 이름과 ID가 동일한 네임 스페이스에 있다고 말합니다. HTML 유효성 검사기 서비스는 이러한 사항을 확인하지 않으며 브라우저 관리가 의심 스럽지만 어쨌든 따라야 할 좋은 지침 인 것 같습니다.
erickson

3
현실이 재정의되었습니다! <이름 ...은 처음부터 아 was으며, CSS 링크 스타일은 더 아 sick니다.
Robert Siemer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.