목차

  1. 1 소개
  2. 2 공통 인프라
  3. 3 HTML 문서의 의미론, 구조 및 API
  4. 4 HTML 요소
  5. 5 마이크로데이터
  6. 6 사용자 상호작용
  7. 7 웹 페이지 로딩
  8. 8 웹 애플리케이션 API
  9. 9 통신
  10. 10 웹 워커
  11. 11 워크릿
  12. 12 웹 스토리지
  13. 13 HTML 구문
  14. 14 XML 구문
  15. 15 렌더링
  16. 16 폐기된 기능
  17. 17 IANA 고려 사항
  18. 색인
  19. 참조
  20. 감사의 말
  21. 지식 재산권

전체 목차

  1. 1 소개
    1. 1.1 이 명세는 어디에 해당하는가?
    2. 1.2 이것은 HTML5인가?
    3. 1.3 배경
    4. 1.4 대상 독자
    5. 1.5 범위
    6. 1.6 역사
    7. 1.7 설계 참고 사항
      1. 1.7.1 스크립트 실행의 직렬화 가능성
      2. 1.7.2 확장성
    8. 1.8 HTML 구문과 XML 구문
    9. 1.9 이 명세의 구조
      1. 1.9.1 이 명세를 읽는 방법
      2. 1.9.2 표기 규칙
    10. 1.10 HTML 빠른 소개
      1. 1.10.1 HTML로 안전한 애플리케이션 작성하기
      2. 1.10.2 스크립팅 API를 사용할 때 피해야 할 일반적인 함정
      3. 1.10.3 HTML 작성 시 오류를 찾는 방법: 유효성 검사기와 적합성 검사기
    11. 1.11 작성자에 대한 적합성 요구 사항
      1. 1.11.1 표현용 마크업
      2. 1.11.2 구문 오류
      3. 1.11.3 콘텐츠 모델 및 속성 값에 대한 제한
    12. 1.12 권장 읽을거리
  2. 2 공통 인프라
    1. 2.1 용어
      1. 2.1.1 병렬성
      2. 2.1.2 리소스
      3. 2.1.3 XML 호환성
      4. 2.1.4 DOM 트리
      5. 2.1.5 스크립팅
      6. 2.1.6 플러그인
      7. 2.1.7 문자 인코딩
      8. 2.1.8 적합성 클래스
      9. 2.1.9 종속성
      10. 2.1.10 확장성
      11. 2.1.11 XPath 및 XSLT와의 상호작용
    2. 2.2 정책 제어 기능
    3. 2.3 공통 마이크로구문
      1. 2.3.1 공통 파서 관용구
      2. 2.3.2 불리언 속성
      3. 2.3.3 키워드 및 열거형 속성
      4. 2.3.4 숫자
        1. 2.3.4.1 부호 있는 정수
        2. 2.3.4.2 음수가 아닌 정수
        3. 2.3.4.3 부동 소수점 수
        4. 2.3.4.4 백분율과 길이
        5. 2.3.4.5 0이 아닌 백분율과 길이
        6. 2.3.4.6 부동 소수점 수 목록
        7. 2.3.4.7 치수 목록
      5. 2.3.5 날짜와 시간
        1. 2.3.5.1
        2. 2.3.5.2 날짜
        3. 2.3.5.3 연도가 없는 날짜
        4. 2.3.5.4 시간
        5. 2.3.5.5 현지 날짜와 시간
        6. 2.3.5.6 시간대
        7. 2.3.5.7 전역 날짜와 시간
        8. 2.3.5.8
        9. 2.3.5.9 기간
        10. 2.3.5.10 더 모호한 시점
      6. 2.3.6 레거시 색상
      7. 2.3.7 공백으로 구분된 토큰
      8. 2.3.8 쉼표로 구분된 토큰
      9. 2.3.9 참조
      10. 2.3.10 미디어 쿼리
      11. 2.3.11 고유 내부 값
    4. 2.4 URL
      1. 2.4.1 용어
      2. 2.4.2 URL 파싱
      3. 2.4.3 문서 기준 URL
    5. 2.5 리소스 가져오기
      1. 2.5.1 용어
      2. 2.5.2 리소스 유형 결정하기
      3. 2.5.3 meta 요소에서 문자 인코딩 추출하기
      4. 2.5.4 CORS 설정 속성
      5. 2.5.5 리퍼러 정책 속성
      6. 2.5.6 논스 속성
      7. 2.5.7 지연 로딩 속성
      8. 2.5.8 차단 속성
      9. 2.5.9 가져오기 우선순위 속성
    6. 2.6 공통 DOM 인터페이스
      1. 2.6.1 콘텐츠 속성을 IDL 속성에 반영하기
      2. 2.6.2 IDL 확장 속성을 통한 반영 사용
      3. 2.6.3 명세에서 반영 사용하기
      4. 2.6.4 컬렉션
        1. 2.6.4.1 HTMLAllCollection 인터페이스
          1. 2.6.4.1.1 [[Call]] ( thisArgument, argumentsList )
        2. 2.6.4.2 HTMLFormControlsCollection 인터페이스
        3. 2.6.4.3 HTMLOptionsCollection 인터페이스
      5. 2.6.5 DOMStringList 인터페이스
    7. 2.7 구조화된 데이터의 안전한 전달
      1. 2.7.1 직렬화 가능 객체
      2. 2.7.2 전송 가능 객체
      3. 2.7.3 StructuredSerializeInternal ( value, forStorage [ , memory ] )
      4. 2.7.4 StructuredSerialize ( value )
      5. 2.7.5 StructuredSerializeForStorage ( value )
      6. 2.7.6 StructuredDeserialize ( serialized, targetRealm [ , memory ] )
      7. 2.7.7 StructuredSerializeWithTransfer ( value, transferList )
      8. 2.7.8 StructuredDeserializeWithTransfer ( serializeWithTransferResult, targetRealm )
      9. 2.7.9 다른 명세에서 직렬화 및 전송 수행하기
      10. 2.7.10 구조화된 복제 API
  3. 3 HTML 문서의 의미론, 구조 및 API
    1. 3.1 문서
      1. 3.1.1 Document 객체
      2. 3.1.2 DocumentOrShadowRoot 인터페이스
      3. 3.1.3 조상 출처
      4. 3.1.4 리소스 메타데이터 관리
      5. 3.1.5 문서 로딩 상태 보고하기
      6. 3.1.6 렌더링 차단 메커니즘
      7. 3.1.7 DOM 트리 접근자
    2. 3.2 요소
      1. 3.2.1 의미론
      2. 3.2.2 DOM의 요소
      3. 3.2.3 HTML 요소 생성자
      4. 3.2.4 요소 정의
        1. 3.2.4.1 속성
      5. 3.2.5 콘텐츠 모델
        1. 3.2.5.1 "없음" 콘텐츠 모델
        2. 3.2.5.2 콘텐츠 유형
          1. 3.2.5.2.1 메타데이터 콘텐츠
          2. 3.2.5.2.2 플로 콘텐츠
          3. 3.2.5.2.3 구획 콘텐츠
          4. 3.2.5.2.4 제목 콘텐츠
          5. 3.2.5.2.5 구문 콘텐츠
          6. 3.2.5.2.6 임베디드 콘텐츠
          7. 3.2.5.2.7 대화형 콘텐츠
          8. 3.2.5.2.8 감지 가능한 콘텐츠
          9. 3.2.5.2.9 스크립트 지원 요소
        3. 3.2.5.3 투명 콘텐츠 모델
        4. 3.2.5.4 문단
      6. 3.2.6 전역 속성
        1. 3.2.6.1 title 속성
        2. 3.2.6.2 langxml:lang 속성
        3. 3.2.6.3 translate 속성
        4. 3.2.6.4 dir 속성
        5. 3.2.6.5 style 속성
        6. 3.2.6.6 data-* 속성으로 사용자 정의 비가시 데이터 임베드하기
      7. 3.2.7 innerTextouterText 속성
      8. 3.2.8 양방향 알고리즘 관련 요구 사항
        1. 3.2.8.1 양방향 알고리즘 서식 문자에 대한 작성 적합성 기준
        2. 3.2.8.2 사용자 에이전트 적합성 기준
      9. 3.2.9 ARIA 및 플랫폼 접근성 API 관련 요구 사항
  4. 4 HTML 요소
    1. 4.1 문서 요소
      1. 4.1.1 html 요소
    2. 4.2 문서 메타데이터
      1. 4.2.1 head 요소
      2. 4.2.2 title 요소
      3. 4.2.3 base 요소
      4. 4.2.4 link 요소
        1. 4.2.4.1 media 속성 처리하기
        2. 4.2.4.2 type 속성 처리하기
        3. 4.2.4.3 link 요소에서 리소스 가져오기 및 처리하기
        4. 4.2.4.4 `Link` 헤더 처리하기
        5. 4.2.4.5 조기 힌트
        6. 4.2.4.6 link 요소로 생성된 하이퍼링크를 사용자가 따라갈 수단 제공하기
      5. 4.2.5 meta 요소
        1. 4.2.5.1 표준 메타데이터 이름
        2. 4.2.5.2 기타 메타데이터 이름
        3. 4.2.5.3 프라그마 지시문
        4. 4.2.5.4 문서의 문자 인코딩 지정하기
      6. 4.2.6 style 요소
      7. 4.2.7 스타일링과 스크립팅의 상호작용
    3. 4.3 구획
      1. 4.3.1 body 요소
      2. 4.3.2 article 요소
      3. 4.3.3 section 요소
      4. 4.3.4 nav 요소
      5. 4.3.5 aside 요소
      6. 4.3.6 h1, h2, h3, h4, h5h6 요소
      7. 4.3.7 hgroup 요소
      8. 4.3.8 header 요소
      9. 4.3.9 footer 요소
      10. 4.3.10 address 요소
      11. 4.3.11 제목과 개요
        1. 4.3.11.1 제목 수준 및 오프셋
        2. 4.3.11.2 개요 예시
        3. 4.3.11.3 사용자에게 개요 노출하기
      12. 4.3.12 사용 요약
        1. 4.3.12.1 글인가 구획인가?
    4. 4.4 콘텐츠 그룹화
      1. 4.4.1 p 요소
      2. 4.4.2 hr 요소
      3. 4.4.3 pre 요소
      4. 4.4.4 blockquote 요소
      5. 4.4.5 ol 요소
      6. 4.4.6 ul 요소
      7. 4.4.7 menu 요소
      8. 4.4.8 li 요소
      9. 4.4.9 dl 요소
      10. 4.4.10 dt 요소
      11. 4.4.11 dd 요소
      12. 4.4.12 figure 요소
      13. 4.4.13 figcaption 요소
      14. 4.4.14 main 요소
      15. 4.4.15 search 요소
      16. 4.4.16 div 요소
    5. 4.5 텍스트 수준 의미론
      1. 4.5.1 a 요소
      2. 4.5.2 em 요소
      3. 4.5.3 strong 요소
      4. 4.5.4 small 요소
      5. 4.5.5 s 요소
      6. 4.5.6 cite 요소
      7. 4.5.7 q 요소
      8. 4.5.8 dfn 요소
      9. 4.5.9 abbr 요소
      10. 4.5.10 ruby 요소
      11. 4.5.11 rt 요소
      12. 4.5.12 rp 요소
      13. 4.5.13 data 요소
      14. 4.5.14 time 요소
      15. 4.5.15 code 요소
      16. 4.5.16 var 요소
      17. 4.5.17 samp 요소
      18. 4.5.18 kbd 요소
      19. 4.5.19 subsup 요소
      20. 4.5.20 i 요소
      21. 4.5.21 b 요소
      22. 4.5.22 u 요소
      23. 4.5.23 mark 요소
      24. 4.5.24 bdi 요소
      25. 4.5.25 bdo 요소
      26. 4.5.26 span 요소
      27. 4.5.27 br 요소
      28. 4.5.28 wbr 요소
      29. 4.5.29 사용 요약
    6. 4.6 링크
      1. 4.6.1 소개
      2. 4.6.2 aarea 요소로 생성된 링크
      3. 4.6.3 하이퍼링크 요소용 API
      4. 4.6.4 aarea 요소용 API
      5. 4.6.5 하이퍼링크 따라가기
      6. 4.6.6 리소스 다운로드하기
      7. 4.6.7 하이퍼링크 감사
        1. 4.6.7.1 `Ping-From` 및 `Ping-To` 헤더
      8. 4.6.8 링크 유형
        1. 4.6.8.1 링크 유형 "alternate"
        2. 4.6.8.2 링크 유형 "author"
        3. 4.6.8.3 링크 유형 "bookmark"
        4. 4.6.8.4 링크 유형 "canonical"
        5. 4.6.8.5 링크 유형 "dns-prefetch"
        6. 4.6.8.6 링크 유형 "expect"
        7. 4.6.8.7 링크 유형 "external"
        8. 4.6.8.8 링크 유형 "help"
        9. 4.6.8.9 링크 유형 "icon"
        10. 4.6.8.10 링크 유형 "license"
        11. 4.6.8.11 링크 유형 "manifest"
        12. 4.6.8.12 링크 유형 "modulepreload"
        13. 4.6.8.13 링크 유형 "nofollow"
        14. 4.6.8.14 링크 유형 "noopener"
        15. 4.6.8.15 링크 유형 "noreferrer"
        16. 4.6.8.16 링크 유형 "opener"
        17. 4.6.8.17 링크 유형 "pingback"
        18. 4.6.8.18 링크 유형 "preconnect"
        19. 4.6.8.19 링크 유형 "prefetch"
        20. 4.6.8.20 링크 유형 "preload"
        21. 4.6.8.21 링크 유형 "privacy-policy"
        22. 4.6.8.22 링크 유형 "search"
        23. 4.6.8.23 링크 유형 "stylesheet"
        24. 4.6.8.24 링크 유형 "tag"
        25. 4.6.8.25 링크 유형 "terms-of-service"
        26. 4.6.8.26 순차 링크 유형
          1. 4.6.8.26.1 링크 유형 "next"
          2. 4.6.8.26.2 링크 유형 "prev"
        27. 4.6.8.27 기타 링크 유형
    7. 4.7 편집
      1. 4.7.1 ins 요소
      2. 4.7.2 del 요소
      3. 4.7.3 insdel 요소의 공통 속성
      4. 4.7.4 편집과 문단
      5. 4.7.5 편집과 목록
      6. 4.7.6 편집과 표
    8. 4.8 임베디드 콘텐츠
      1. 4.8.1 picture 요소
      2. 4.8.2 source 요소
      3. 4.8.3 img 요소
      4. 4.8.4 이미지
        1. 4.8.4.1 소개
          1. 4.8.4.1.1 적응형 이미지
        2. 4.8.4.2 source, imglink 요소의 공통 속성
          1. 4.8.4.2.1 Srcset 속성
          2. 4.8.4.2.2 Sizes 속성
        3. 4.8.4.3 처리 모델
          1. 4.8.4.3.1 이미지를 가져올 시점
          2. 4.8.4.3.2 DOM 변경에 대응하기
          3. 4.8.4.3.3 사용 가능한 이미지 목록
          4. 4.8.4.3.4 이미지 디코딩하기
          5. 4.8.4.3.5 이미지 데이터 업데이트하기
          6. 4.8.4.3.6 표시할 이미지 준비하기
          7. 4.8.4.3.7 이미지 소스 선택하기
          8. 4.8.4.3.8 속성에서 소스 집합 생성하기
          9. 4.8.4.3.9 소스 집합 업데이트하기
          10. 4.8.4.3.10 srcset 속성 파싱하기
          11. 4.8.4.3.11 sizes 속성 파싱하기
          12. 4.8.4.3.12 소스 밀도 정규화하기
          13. 4.8.4.3.13 환경 변화에 대응하기
        4. 4.8.4.4 이미지의 대체 텍스트를 제공하기 위한 요구 사항
          1. 4.8.4.4.1 일반 지침
          2. 4.8.4.4.2 이미지만 포함하는 링크 또는 버튼
          3. 4.8.4.4.3 대체 그래픽 표현이 있는 구문 또는 문단: 차트, 다이어그램, 그래프, 지도, 삽화
          4. 4.8.4.4.4 대체 그래픽 표현이 있는 짧은 구문 또는 레이블: 아이콘, 로고
          5. 4.8.4.4.5 타이포그래피 효과를 위해 그래픽으로 렌더링된 텍스트
          6. 4.8.4.4.6 주변 텍스트 일부의 그래픽 표현
          7. 4.8.4.4.7 보조 이미지
          8. 4.8.4.4.8 정보를 추가하지 않는 순수 장식용 이미지
          9. 4.8.4.4.9 링크 없이 하나의 큰 그림을 이루는 이미지 그룹
          10. 4.8.4.4.10 링크와 함께 하나의 큰 그림을 이루는 이미지 그룹
          11. 4.8.4.4.11 콘텐츠의 핵심 부분
          12. 4.8.4.4.12 사용자를 위한 것이 아닌 이미지
          13. 4.8.4.4.13 이미지를 볼 수 있다고 알려진 특정인을 대상으로 하는 이메일 또는 비공개 문서의 이미지
          14. 4.8.4.4.14 마크업 생성기용 지침
          15. 4.8.4.4.15 적합성 검사기용 지침
      5. 4.8.5 iframe 요소
      6. 4.8.6 embed 요소
      7. 4.8.7 object 요소
      8. 4.8.8 video 요소
      9. 4.8.9 audio 요소
      10. 4.8.10 track 요소
      11. 4.8.11 미디어 요소
        1. 4.8.11.1 오류 코드
        2. 4.8.11.2 미디어 리소스의 위치
        3. 4.8.11.3 MIME 유형
        4. 4.8.11.4 네트워크 상태
        5. 4.8.11.5 미디어 리소스 로딩하기
        6. 4.8.11.6 미디어 리소스 내부의 오프셋
        7. 4.8.11.7 준비 상태
        8. 4.8.11.8 미디어 리소스 재생하기
        9. 4.8.11.9 탐색
        10. 4.8.11.10 여러 미디어 트랙이 있는 미디어 리소스
          1. 4.8.11.10.1 AudioTrackListVideoTrackList 객체
          2. 4.8.11.10.2 특정 오디오 및 비디오 트랙을 선언적으로 선택하기
        11. 4.8.11.11 시간 지정 텍스트 트랙
          1. 4.8.11.11.1 텍스트 트랙 모델
          2. 4.8.11.11.2 인밴드 텍스트 트랙 소싱
          3. 4.8.11.11.3 아웃오브밴드 텍스트 트랙 소싱
          4. 4.8.11.11.4 다양한 형식의 큐를 텍스트 트랙 큐로 노출하기 위한 지침
          5. 4.8.11.11.5 텍스트 트랙 API
          6. 4.8.11.11.6 텍스트 트랙 API 객체의 이벤트 처리기
          7. 4.8.11.11.7 메타데이터 텍스트 트랙 모범 사례
        12. 4.8.11.12 URL을 통해 트랙 종류 식별하기
        13. 4.8.11.13 사용자 인터페이스
        14. 4.8.11.14 시간 범위
        15. 4.8.11.15 TrackEvent 인터페이스
        16. 4.8.11.16 이벤트 요약
        17. 4.8.11.17 보안 및 개인정보 보호 고려 사항
        18. 4.8.11.18 미디어 요소를 사용하는 작성자를 위한 모범 사례
        19. 4.8.11.19 미디어 요소 구현자를 위한 모범 사례
      12. 4.8.12 map 요소
      13. 4.8.13 area 요소
      14. 4.8.14 이미지 맵
        1. 4.8.14.1 작성
        2. 4.8.14.2 처리 모델
      15. 4.8.15 MathML
      16. 4.8.16 SVG
      17. 4.8.17 치수 속성
    9. 4.9 표 형식 데이터
      1. 4.9.1 table 요소
        1. 4.9.1.1 표를 설명하는 기법
        2. 4.9.1.2 표 설계 기법
      2. 4.9.2 caption 요소
      3. 4.9.3 colgroup 요소
      4. 4.9.4 col 요소
      5. 4.9.5 tbody 요소
      6. 4.9.6 thead 요소
      7. 4.9.7 tfoot 요소
      8. 4.9.8 tr 요소
      9. 4.9.9 td 요소
      10. 4.9.10 th 요소
      11. 4.9.11 tdth 요소의 공통 속성
      12. 4.9.12 처리 모델
        1. 4.9.12.1 표 구성하기
        2. 4.9.12.2 데이터 셀과 헤더 셀 간의 관계 구성하기
      13. 4.9.13 예시
    10. 4.10
      1. 4.10.1 소개
        1. 4.10.1.1 폼 사용자 인터페이스 작성하기
        2. 4.10.1.2 폼의 서버 측 처리 구현하기
        3. 4.10.1.3 서버와 통신하도록 폼 구성하기
        4. 4.10.1.4 클라이언트 측 폼 유효성 검사
        5. 4.10.1.5 클라이언트 측 폼 컨트롤 자동 채우기 활성화하기
        6. 4.10.1.6 모바일 장치에서 사용자 경험 개선하기
        7. 4.10.1.7 필드 유형, 자동 채우기 필드 이름 및 입력 방식의 차이
        8. 4.10.1.8 날짜, 시간 및 숫자 형식
      2. 4.10.2 범주
      3. 4.10.3 form 요소
      4. 4.10.4 label 요소
      5. 4.10.5 input 요소
        1. 4.10.5.1 type 속성의 상태
          1. 4.10.5.1.1 숨김 상태 (type=hidden)
          2. 4.10.5.1.2 텍스트(type=text) 상태 및 검색 상태 (type=search)
          3. 4.10.5.1.3 전화번호 상태 (type=tel)
          4. 4.10.5.1.4 URL 상태 (type=url)
          5. 4.10.5.1.5 이메일 상태 (type=email)
          6. 4.10.5.1.6 비밀번호 상태 (type=password)
          7. 4.10.5.1.7 날짜 상태 (type=date)
          8. 4.10.5.1.8 월 상태 (type=month)
          9. 4.10.5.1.9 주 상태 (type=week)
          10. 4.10.5.1.10 시간 상태 (type=time)
          11. 4.10.5.1.11 현지 날짜 및 시간 상태 (type=datetime-local)
          12. 4.10.5.1.12 숫자 상태 (type=number)
          13. 4.10.5.1.13 범위 상태 (type=range)
          14. 4.10.5.1.14 색상 상태 (type=color)
          15. 4.10.5.1.15 체크박스 상태 (type=checkbox)
          16. 4.10.5.1.16 라디오 버튼 상태(type=radio)
          17. 4.10.5.1.17 파일 업로드 상태(type=file)
          18. 4.10.5.1.18 제출 버튼 상태(type=submit)
          19. 4.10.5.1.19 이미지 버튼 상태(type=image)
          20. 4.10.5.1.20 재설정 버튼 상태(type=reset)
          21. 4.10.5.1.21 버튼 상태 (type=button)
        2. 4.10.5.2 폼 컨트롤 현지화에 관한 구현 참고 사항
        3. 4.10.5.3 공통 input 요소 속성
          1. 4.10.5.3.1 maxlengthminlength 속성
          2. 4.10.5.3.2 size 속성
          3. 4.10.5.3.3 readonly 속성
          4. 4.10.5.3.4 required 속성
          5. 4.10.5.3.5 multiple 속성
          6. 4.10.5.3.6 pattern 속성
          7. 4.10.5.3.7 minmax 속성
          8. 4.10.5.3.8 step 속성
          9. 4.10.5.3.9 list 속성
          10. 4.10.5.3.10 placeholder 속성
        4. 4.10.5.4 공통 input 요소 API
        5. 4.10.5.5 공통 이벤트 동작
      6. 4.10.6 button 요소
      7. 4.10.7 select 요소
      8. 4.10.8 datalist 요소
      9. 4.10.9 optgroup 요소
      10. 4.10.10 option 요소
      11. 4.10.11 textarea 요소
      12. 4.10.12 output 요소
      13. 4.10.13 progress 요소
      14. 4.10.14 meter 요소
      15. 4.10.15 fieldset 요소
      16. 4.10.16 legend 요소
      17. 4.10.17 selectedcontent 요소
      18. 4.10.18 폼 컨트롤 인프라
        1. 4.10.18.1 폼 컨트롤의 값
        2. 4.10.18.2 변경 가능성
        3. 4.10.18.3 컨트롤과 폼의 연결
      19. 4.10.19 폼 컨트롤의 공통 속성
        1. 4.10.19.1 폼 컨트롤 이름 지정: name 속성
        2. 4.10.19.2 요소 방향성 제출: dirname 속성
        3. 4.10.19.3 사용자 입력 길이 제한: maxlength 속성
        4. 4.10.19.4 최소 입력 길이 요구 사항 설정: minlength 속성
        5. 4.10.19.5 폼 컨트롤 활성화 및 비활성화: disabled 속성
        6. 4.10.19.6 폼 제출 속성
        7. 4.10.19.7 자동 채우기
          1. 4.10.19.7.1 폼 컨트롤 자동 채우기: autocomplete 속성
          2. 4.10.19.7.2 처리 모델
      20. 4.10.20 텍스트 컨트롤 선택 영역용 API
      21. 4.10.21 제약 조건
        1. 4.10.21.1 정의
        2. 4.10.21.2 제약 조건 유효성 검사
        3. 4.10.21.3 제약 조건 유효성 검사 API
        4. 4.10.21.4 보안
      22. 4.10.22 폼 제출
        1. 4.10.22.1 소개
        2. 4.10.22.2 암시적 제출
        3. 4.10.22.3 폼 제출 알고리즘
        4. 4.10.22.4 항목 목록 구성하기
        5. 4.10.22.5 폼 제출 인코딩 선택하기
        6. 4.10.22.6 항목 목록을 이름-값 쌍 목록으로 변환하기
        7. 4.10.22.7 URL 인코딩 폼 데이터
        8. 4.10.22.8 멀티파트 폼 데이터
        9. 4.10.22.9 일반 텍스트 폼 데이터
        10. 4.10.22.10 SubmitEvent 인터페이스
        11. 4.10.22.11 FormDataEvent 인터페이스
      23. 4.10.23 폼 재설정하기
    11. 4.11 대화형 요소
      1. 4.11.1 details 요소
      2. 4.11.2 summary 요소
      3. 4.11.3 명령
        1. 4.11.3.1 패싯
        2. 4.11.3.2 a 요소를 사용하여 명령 정의하기
        3. 4.11.3.3 button 요소를 사용하여 명령 정의하기
        4. 4.11.3.4 input 요소를 사용하여 명령 정의하기
        5. 4.11.3.5 option 요소를 사용하여 명령 정의하기
        6. 4.11.3.6 legend 요소의 accesskey 속성을 사용하여 명령 정의하기
        7. 4.11.3.7 다른 요소의 명령을 정의하기 위해 accesskey 속성 사용하기
      4. 4.11.4 dialog 요소
      5. 4.11.5 대화상자 간편 닫기
    12. 4.12 스크립팅
      1. 4.12.1 script 요소
        1. 4.12.1.1 처리 모델
        2. 4.12.1.2 스크립팅 언어
        3. 4.12.1.3 script 요소 콘텐츠에 대한 제한
        4. 4.12.1.4 외부 스크립트의 인라인 문서
        5. 4.12.1.5 script 요소와 XSLT의 상호작용
      2. 4.12.2 noscript 요소
      3. 4.12.3 template 요소
        1. 4.12.3.1 template 요소와 XSLT 및 XPath의 상호작용
      4. 4.12.4 slot 요소
      5. 4.12.5 canvas 요소
        1. 4.12.5.1 2D 렌더링 컨텍스트
          1. 4.12.5.1.1 구현 참고 사항
          2. 4.12.5.1.2 캔버스 설정
          3. 4.12.5.1.3 캔버스 상태
          4. 4.12.5.1.4 선 스타일
          5. 4.12.5.1.5 텍스트 스타일
          6. 4.12.5.1.6 경로 구성하기
          7. 4.12.5.1.7 Path2D 객체
          8. 4.12.5.1.8 변환
          9. 4.12.5.1.9 2D 렌더링 컨텍스트용 이미지 소스
          10. 4.12.5.1.10 채우기 및 선 스타일
          11. 4.12.5.1.11 비트맵에 사각형 그리기
          12. 4.12.5.1.12 비트맵에 텍스트 그리기
          13. 4.12.5.1.13 캔버스에 경로 그리기
          14. 4.12.5.1.14 포커스 링 그리기
          15. 4.12.5.1.15 이미지 그리기
          16. 4.12.5.1.16 픽셀 조작
          17. 4.12.5.1.17 합성
          18. 4.12.5.1.18 이미지 평활화
          19. 4.12.5.1.19 그림자
          20. 4.12.5.1.20 필터
          21. 4.12.5.1.21 외부에서 정의된 SVG 필터로 작업하기
          22. 4.12.5.1.22 그리기 모델
          23. 4.12.5.1.23 모범 사례
          24. 4.12.5.1.24 예시
        2. 4.12.5.2 ImageBitmap 렌더링 컨텍스트
          1. 4.12.5.2.1 소개
          2. 4.12.5.2.2 ImageBitmapRenderingContext 인터페이스
        3. 4.12.5.3 OffscreenCanvas 인터페이스
          1. 4.12.5.3.1 오프스크린 2D 렌더링 컨텍스트
        4. 4.12.5.4 색 공간 및 색 공간 변환
        5. 4.12.5.5 비트맵을 파일로 직렬화하기
        6. 4.12.5.6 canvas 요소의 보안
        7. 4.12.5.7 미리 곱한 알파 및 2D 렌더링 컨텍스트
    13. 4.13 사용자 정의 요소
      1. 4.13.1 소개
        1. 4.13.1.1 자율형 사용자 정의 요소 생성하기
        2. 4.13.1.2 폼 연결 사용자 정의 요소 생성하기
        3. 4.13.1.3 기본 접근성 역할, 상태 및 속성이 있는 사용자 정의 요소 생성하기
        4. 4.13.1.4 사용자 정의 내장 요소 생성하기
        5. 4.13.1.5 자율형 사용자 정의 요소의 단점
        6. 4.13.1.6 요소 생성 후 업그레이드하기
        7. 4.13.1.7 범위 지정 사용자 정의 요소 레지스트리
        8. 4.13.1.8 사용자 정의 요소 상태 노출하기
      2. 4.13.2 사용자 정의 요소 생성자 및 반응에 대한 요구 사항
        1. 4.13.2.1 이동 시 사용자 정의 요소 상태 유지하기
      3. 4.13.3 핵심 개념
      4. 4.13.4 CustomElementRegistry 인터페이스
      5. 4.13.5 업그레이드
      6. 4.13.6 사용자 정의 요소 반응
      7. 4.13.7 요소 내부
        1. 4.13.7.1 ElementInternals 인터페이스
        2. 4.13.7.2 섀도 루트 접근
        3. 4.13.7.3 폼 연결 사용자 정의 요소
        4. 4.13.7.4 접근성 의미론
        5. 4.13.7.5 사용자 정의 상태 의사 클래스
    14. 4.14 전용 요소가 없는 공통 관용구
      1. 4.14.1 이동 경로 탐색
      2. 4.14.2 태그 클라우드
      3. 4.14.3 대화
      4. 4.14.4 각주
    15. 4.15 비활성화된 요소
    16. 4.16 선택자 및 CSS를 사용한 HTML 요소 일치
      1. 4.16.1 CSS 'attr()' 함수의 대소문자 구분
      2. 4.16.2 선택자의 대소문자 구분
      3. 4.16.3 의사 클래스
  5. 5 마이크로데이터
    1. 5.1 소개
      1. 5.1.1 개요
      2. 5.1.2 기본 구문
      3. 5.1.3 유형이 지정된 항목
      4. 5.1.4 항목의 전역 식별자
      5. 5.1.5 어휘를 정의할 때 이름 선택하기
    2. 5.2 마이크로데이터 인코딩
      1. 5.2.1 마이크로데이터 모델
      2. 5.2.2 항목
      3. 5.2.3 이름: itemprop 속성
      4. 5.2.4
      5. 5.2.5 이름을 항목과 연결하기
      6. 5.2.6 마이크로데이터와 기타 네임스페이스
    3. 5.3 마이크로데이터 어휘 예시
      1. 5.3.1 vCard
        1. 5.3.1.1 vCard로 변환
        2. 5.3.1.2 예시
      2. 5.3.2 vEvent
        1. 5.3.2.1 iCalendar로 변환
        2. 5.3.2.2 예시
      3. 5.3.3 저작물 라이선스 부여
        1. 5.3.3.1 예시
    4. 5.4 HTML을 다른 형식으로 변환하기
      1. 5.4.1 JSON
  6. 6 사용자 상호작용
    1. 6.1 hidden 속성
    2. 6.2 페이지 가시성
      1. 6.2.1 VisibilityStateEntry 인터페이스
    3. 6.3 비활성 하위 트리
      1. 6.3.1 모달 대화상자와 비활성 하위 트리
      2. 6.3.2 inert 속성
    4. 6.4 사용자 활성화 추적
      1. 6.4.1 데이터 모델
      2. 6.4.2 처리 모델
      3. 6.4.3 사용자 활성화로 제한되는 API
      4. 6.4.4 UserActivation 인터페이스
      5. 6.4.5 사용자 에이전트 자동화
    5. 6.5 요소의 활성화 동작
      1. 6.5.1 ToggleEvent 인터페이스
      2. 6.5.2 CommandEvent 인터페이스
    6. 6.6 포커스
      1. 6.6.1 소개
      2. 6.6.2 데이터 모델
      3. 6.6.3 tabindex 속성
      4. 6.6.4 처리 모델
      5. 6.6.5 순차 포커스 탐색
      6. 6.6.6 포커스 관리 API
      7. 6.6.7 autofocus 속성
    7. 6.7 키보드 바로 가기 할당하기
      1. 6.7.1 소개
      2. 6.7.2 accesskey 속성
      3. 6.7.3 처리 모델
    8. 6.8 편집
      1. 6.8.1 문서 영역을 편집 가능하게 만들기: contenteditable 콘텐츠 속성
      2. 6.8.2 전체 문서를 편집 가능하게 만들기: designMode getter 및 setter
      3. 6.8.3 페이지 내 편집기 모범 사례
      4. 6.8.4 편집 API
      5. 6.8.5 맞춤법 및 문법 검사
      6. 6.8.6 쓰기 제안
      7. 6.8.7 자동 대문자화
      8. 6.8.8 자동 수정
      9. 6.8.9 입력 방식: inputmode 속성
      10. 6.8.10 입력 방식: enterkeyhint 속성
    9. 6.9 페이지 내 찾기
      1. 6.9.1 소개
      2. 6.9.2 detailshidden=until-found와의 상호작용
      3. 6.9.3 선택 영역과의 상호작용
    10. 6.10 닫기 요청 및 닫기 감시자
      1. 6.10.1 닫기 요청
      2. 6.10.2 닫기 감시자 인프라
      3. 6.10.3 CloseWatcher 인터페이스
    11. 6.11 드래그 앤 드롭
      1. 6.11.1 소개
      2. 6.11.2 드래그 데이터 저장소
      3. 6.11.3 DataTransfer 인터페이스
        1. 6.11.3.1 DataTransferItemList 인터페이스
        2. 6.11.3.2 DataTransferItem 인터페이스
      4. 6.11.4 DragEvent 인터페이스
      5. 6.11.5 처리 모델
      6. 6.11.6 이벤트 요약
      7. 6.11.7 draggable 속성
      8. 6.11.8 드래그 앤 드롭 모델의 보안 위험
    12. 6.12 popover 속성
      1. 6.12.1 팝오버 대상 속성
      2. 6.12.2 팝오버 간편 닫기
  7. 7 웹 페이지 로딩
    1. 7.1 지원 개념
      1. 7.1.1 출처
        1. 7.1.1.1 사이트
        2. 7.1.1.2 동일 출처 제한 완화하기
        3. 7.1.1.3 Origin 인터페이스
      2. 7.1.2 출처 키 기반 에이전트 클러스터
      3. 7.1.3 교차 출처 오프너 정책
        1. 7.1.3.1 헤더
        2. 7.1.3.2 오프너 정책으로 인한 브라우징 컨텍스트 그룹 전환
        3. 7.1.3.3 보고
      4. 7.1.4 교차 출처 임베더 정책
        1. 7.1.4.1 헤더
        2. 7.1.4.2 임베더 정책 검사
      5. 7.1.5 샌드박싱
      6. 7.1.6 iframe 요소 리퍼러 정책
      7. 7.1.7 정책 컨테이너
    2. 7.2 탐색 및 세션 기록 관련 API
      1. 7.2.1 Window, WindowProxyLocation 객체용 보안 인프라
        1. 7.2.1.1 IDL과의 통합
        2. 7.2.1.2 공유 내부 슬롯: [[CrossOriginPropertyDescriptorMap]]
        3. 7.2.1.3 공유 추상 연산
          1. 7.2.1.3.1 CrossOriginProperties ( O )
          2. 7.2.1.3.2 CrossOriginPropertyFallback ( P )
          3. 7.2.1.3.3 IsPlatformObjectSameOrigin ( O )
          4. 7.2.1.3.4 CrossOriginGetOwnPropertyHelper ( O, P )
          5. 7.2.1.3.5 CrossOriginGet ( O, P, Receiver )
          6. 7.2.1.3.6 CrossOriginSet ( O, P, V, Receiver )
          7. 7.2.1.3.7 CrossOriginOwnPropertyKeys ( O )
      2. 7.2.2 Window 객체
        1. 7.2.2.1 창 열기 및 닫기
        2. 7.2.2.2 Window 객체의 인덱스 접근
        3. 7.2.2.3 Window 객체의 명명된 접근
        4. 7.2.2.4 관련 창에 접근하기
        5. 7.2.2.5 역사적인 브라우저 인터페이스 요소 API
        6. 7.2.2.6 Window 객체의 스크립트 설정
      3. 7.2.3 WindowProxy 특수 객체
        1. 7.2.3.1 [[GetPrototypeOf]] ( )
        2. 7.2.3.2 [[SetPrototypeOf]] ( V )
        3. 7.2.3.3 [[IsExtensible]] ( )
        4. 7.2.3.4 [[PreventExtensions]] ( )
        5. 7.2.3.5 [[GetOwnProperty]] ( P )
        6. 7.2.3.6 [[DefineOwnProperty]] ( P, Desc )
        7. 7.2.3.7 [[Get]] ( P, Receiver )
        8. 7.2.3.8 [[Set]] ( P, V, Receiver )
        9. 7.2.3.9 [[Delete]] ( P )
        10. 7.2.3.10 [[OwnPropertyKeys]] ( )
      4. 7.2.4 Location 인터페이스
        1. 7.2.4.1 [[GetPrototypeOf]] ( )
        2. 7.2.4.2 [[SetPrototypeOf]] ( V )
        3. 7.2.4.3 [[IsExtensible]] ( )
        4. 7.2.4.4 [[PreventExtensions]] ( )
        5. 7.2.4.5 [[GetOwnProperty]] ( P )
        6. 7.2.4.6 [[DefineOwnProperty]] ( P, Desc )
        7. 7.2.4.7 [[Get]] ( P, Receiver )
        8. 7.2.4.8 [[Set]] ( P, V, Receiver )
        9. 7.2.4.9 [[Delete]] ( P )
        10. 7.2.4.10 [[OwnPropertyKeys]] ( )
      5. 7.2.5 History 인터페이스
      6. 7.2.6 탐색 API
        1. 7.2.6.1 소개
        2. 7.2.6.2 Navigation 인터페이스
        3. 7.2.6.3 핵심 인프라
        4. 7.2.6.4 항목 목록 초기화 및 업데이트하기
        5. 7.2.6.5 NavigationHistoryEntry 인터페이스
        6. 7.2.6.6 기록 항목 목록
        7. 7.2.6.7 탐색 시작하기
        8. 7.2.6.8 진행 중인 탐색 추적
        9. 7.2.6.9 NavigationActivation 인터페이스
        10. 7.2.6.10 navigate 이벤트
          1. 7.2.6.10.1 NavigateEvent 인터페이스
          2. 7.2.6.10.2 NavigationPrecommitController 인터페이스
          3. 7.2.6.10.3 NavigationDestination 인터페이스
          4. 7.2.6.10.4 이벤트 발생시키기
          5. 7.2.6.10.5 스크롤 및 포커스 동작
      7. 7.2.7 이벤트 인터페이스
        1. 7.2.7.1 NavigationCurrentEntryChangeEvent 인터페이스
        2. 7.2.7.2 PopStateEvent 인터페이스
        3. 7.2.7.3 HashChangeEvent 인터페이스
        4. 7.2.7.4 PageSwapEvent 인터페이스
        5. 7.2.7.5 PageRevealEvent 인터페이스
        6. 7.2.7.6 PageTransitionEvent 인터페이스
        7. 7.2.7.7 BeforeUnloadEvent 인터페이스
      8. 7.2.8 NotRestoredReasons 인터페이스
    3. 7.3 문서 시퀀스를 위한 인프라
      1. 7.3.1 탐색 가능 객체
        1. 7.3.1.1 순회 가능 탐색 객체
        2. 7.3.1.2 최상위 순회 객체
        3. 7.3.1.3 자식 탐색 객체
        4. 7.3.1.4 Jake 다이어그램
        5. 7.3.1.5 관련 탐색 객체 컬렉션
        6. 7.3.1.6 탐색 객체 파기
        7. 7.3.1.7 탐색 객체 대상 이름
      2. 7.3.2 브라우징 컨텍스트
        1. 7.3.2.1 브라우징 컨텍스트 생성하기
        2. 7.3.2.2 관련 브라우징 컨텍스트
        3. 7.3.2.3 브라우징 컨텍스트 그룹화
      3. 7.3.3 완전히 활성화된 문서
    4. 7.4 탐색 및 세션 기록
      1. 7.4.1 세션 기록
        1. 7.4.1.1 세션 기록 항목
        2. 7.4.1.2 문서 상태
        3. 7.4.1.3 세션 기록의 중앙 집중식 변경
        4. 7.4.1.4 세션 기록의 저수준 연산
      2. 7.4.2 탐색
        1. 7.4.2.1 지원 개념
        2. 7.4.2.2 탐색 시작하기
        3. 7.4.2.3 탐색 종료하기
          1. 7.4.2.3.1 일반적인 문서 간 탐색 사례
          2. 7.4.2.3.2 javascript: URL 특수 사례
          3. 7.4.2.3.3 프래그먼트 탐색
          4. 7.4.2.3.4 가져오기 이외의 스킴 및 외부 소프트웨어
        4. 7.4.2.4 탐색 방지하기
        5. 7.4.2.5 탐색 중단하기
      3. 7.4.3 다시 로드 및 순회
      4. 7.4.4 프래그먼트가 아닌 동기식 "탐색"
      5. 7.4.5 세션 기록 항목 채우기
      6. 7.4.6 기록 단계 적용하기
        1. 7.4.6.1 순회 객체 업데이트하기
        2. 7.4.6.2 문서 업데이트하기
        3. 7.4.6.3 문서 표시하기
        4. 7.4.6.4 프래그먼트로 스크롤하기
        5. 7.4.6.5 유지된 기록 항목 상태
    5. 7.5 문서 생명주기
      1. 7.5.1 공유 문서 생성 인프라
      2. 7.5.2 HTML 문서 로딩하기
      3. 7.5.3 XML 문서 로딩하기
      4. 7.5.4 텍스트 문서 로딩하기
      5. 7.5.5 multipart/x-mixed-replace 문서 로딩하기
      6. 7.5.6 미디어 문서 로딩하기
      7. 7.5.7 DOM이 없는 인라인 콘텐츠용 문서 로딩하기
      8. 7.5.8 로딩 과정 완료하기
      9. 7.5.9 문서 언로드하기
      10. 7.5.10 문서 파기하기
      11. 7.5.11 문서 로드 중단하기
    6. 7.6 추측 로딩
      1. 7.6.1 추측 규칙
        1. 7.6.1.1 데이터 모델
        2. 7.6.1.2 파싱
        3. 7.6.1.3 처리 모델
      2. 7.6.2 탐색 프리페칭
      3. 7.6.3 `Speculation-Rules` 헤더
      4. 7.6.4 `Sec-Speculation-Tags` 헤더
      5. 7.6.5 보안 고려 사항
        1. 7.6.5.1 교차 사이트 요청
        2. 7.6.5.2 삽입된 콘텐츠
        3. 7.6.5.3 IP 익명화
      6. 7.6.6 개인정보 보호 고려 사항
        1. 7.6.6.1 휴리스틱 및 선택 가능성
        2. 7.6.6.2 상태 파티셔닝
        3. 7.6.6.3 신원 결합
    7. 7.7 `X-Frame-Options` 헤더
    8. 7.8 `Refresh` 헤더
    9. 7.9 브라우저 사용자 인터페이스 고려 사항
  8. 8 웹 애플리케이션 API
    1. 8.1 스크립팅
      1. 8.1.1 소개
      2. 8.1.2 에이전트 및 에이전트 클러스터
        1. 8.1.2.1 JavaScript 에이전트 형식 체계와의 통합
        2. 8.1.2.2 JavaScript 에이전트 클러스터 형식 체계와의 통합
      3. 8.1.3 렐름과 그 대응 요소
        1. 8.1.3.1 환경
        2. 8.1.3.2 환경 설정 객체
        3. 8.1.3.3 렐름, 설정 객체 및 전역 객체
          1. 8.1.3.3.1 진입
          2. 8.1.3.3.2 현임
          3. 8.1.3.3.3 현재
          4. 8.1.3.3.4 관련
        4. 8.1.3.4 스크립팅 활성화 및 비활성화
        5. 8.1.3.5 보안 컨텍스트
      4. 8.1.4 스크립트 처리 모델
        1. 8.1.4.1 스크립트
        2. 8.1.4.2 스크립트 가져오기
        3. 8.1.4.3 스크립트 생성하기
        4. 8.1.4.4 스크립트 호출하기
        5. 8.1.4.5 스크립트 종료하기
        6. 8.1.4.6 런타임 스크립트 오류
        7. 8.1.4.7 처리되지 않은 프로미스 거부
        8. 8.1.4.8 가져오기 맵 파싱 결과
        9. 8.1.4.9 추측 규칙 파싱 결과
      5. 8.1.5 모듈 지정자 해석
        1. 8.1.5.1 해석 알고리즘
        2. 8.1.5.2 가져오기 맵
        3. 8.1.5.3 가져오기 맵 처리 모델
      6. 8.1.6 JavaScript 명세 호스트 훅
        1. 8.1.6.1 HostEnsureCanAddPrivateElement(O)
        2. 8.1.6.2 HostEnsureCanCompileStrings(realm, parameterStrings, bodyString, codeString, compilationType, parameterArgs, bodyArg)
        3. 8.1.6.3 HostGetCodeForEval(argument)
        4. 8.1.6.4 HostPromiseRejectionTracker(promise, operation)
        5. 8.1.6.5 HostSystemUTCEpochNanoseconds(global)
        6. 8.1.6.6 작업 관련 호스트 훅
          1. 8.1.6.6.1 HostCallJobCallback(callback, V, argumentsList)
          2. 8.1.6.6.2 HostEnqueueFinalizationRegistryCleanupJob(finalizationRegistry)
          3. 8.1.6.6.3 HostEnqueueGenericJob(job, realm)
          4. 8.1.6.6.4 HostEnqueuePromiseJob(job, realm)
          5. 8.1.6.6.5 HostEnqueueTimeoutJob(job, realm, milliseconds)
          6. 8.1.6.6.6 HostMakeJobCallback(callable)
        7. 8.1.6.7 모듈 관련 호스트 훅
          1. 8.1.6.7.1 HostGetImportMetaProperties(moduleRecord)
          2. 8.1.6.7.2 HostGetSupportedImportAttributes()
          3. 8.1.6.7.3 HostLoadImportedModule(referrer, moduleRequest, loadState, payload)
      7. 8.1.7 이벤트 루프
        1. 8.1.7.1 정의
        2. 8.1.7.2 작업 대기열에 넣기
        3. 8.1.7.3 처리 모델
        4. 8.1.7.4 일반 작업 소스
        5. 8.1.7.5 다른 명세에서 이벤트 루프 다루기
      8. 8.1.8 이벤트
        1. 8.1.8.1 이벤트 처리기
        2. 8.1.8.2 요소, Document 객체 및 Window 객체의 이벤트 처리기
          1. 8.1.8.2.1 IDL 정의
        3. 8.1.8.3 이벤트 발생
    2. 8.2 WindowOrWorkerGlobalScope 믹스인
    3. 8.3 Base64 유틸리티 메서드
    4. 8.4 동적 마크업 삽입
      1. 8.4.1 입력 스트림 열기
      2. 8.4.2 입력 스트림 닫기
      3. 8.4.3 document.write()
      4. 8.4.4 document.writeln()
    5. 8.5 DOM 파싱 및 직렬화 API
      1. 8.5.1 DOMParser 인터페이스
      2. 8.5.2 HTML 파싱 메서드
      3. 8.5.3 HTML 직렬화 메서드
      4. 8.5.4 innerHTML 속성
      5. 8.5.5 outerHTML 속성
      6. 8.5.6 insertAdjacentHTML() 메서드
      7. 8.5.7 createContextualFragment() 메서드
      8. 8.5.8 XMLSerializer 인터페이스
    6. 8.6 HTML 정화
      1. 8.6.1 소개
        1. 8.6.1.1 안전 및 비안전
      2. 8.6.2 Sanitizer 인터페이스
      3. 8.6.3 정화기 구성
        1. 8.6.3.1 구성 불변 조건
      4. 8.6.4 정화 알고리즘
      5. 8.6.5 정화 상수
      6. 8.6.6 보안 고려 사항
        1. 8.6.6.1 서버 측 반사형 및 저장형 XSS
        2. 8.6.6.2 DOM 클로버링
        3. 8.6.6.3 스크립트 가젯을 사용한 XSS
        4. 8.6.6.4 변형 XSS
    7. 8.7 타이머
    8. 8.8 마이크로태스크 대기열 처리
    9. 8.9 사용자 프롬프트
      1. 8.9.1 단순 대화상자
      2. 8.9.2 인쇄
    10. 8.10 시스템 상태 및 기능
      1. 8.10.1 Navigator 객체
        1. 8.10.1.1 클라이언트 식별
        2. 8.10.1.2 언어 기본 설정
        3. 8.10.1.3 브라우저 상태
        4. 8.10.1.4 사용자 정의 스킴 처리기: registerProtocolHandler() 메서드
          1. 8.10.1.4.1 보안 및 개인정보 보호
          2. 8.10.1.4.2 사용자 에이전트 자동화
        5. 8.10.1.5 쿠키
        6. 8.10.1.6 PDF 보기 지원
    11. 8.11 이미지
      1. 8.11.1 ImageData 인터페이스
      2. 8.11.2 ImageBitmap 인터페이스
    12. 8.12 애니메이션 프레임
  9. 9 통신
    1. 9.1 MessageEvent 인터페이스
    2. 9.2 서버 전송 이벤트
      1. 9.2.1 소개
      2. 9.2.2 EventSource 인터페이스
      3. 9.2.3 처리 모델
      4. 9.2.4 `Last-Event-ID` 헤더
      5. 9.2.5 이벤트 스트림 파싱하기
      6. 9.2.6 이벤트 스트림 해석하기
      7. 9.2.7 작성 참고 사항
      8. 9.2.8 비연결 푸시 및 기타 기능
      9. 9.2.9 가비지 컬렉션
      10. 9.2.10 구현 조언
    3. 9.3 문서 간 메시징
      1. 9.3.1 소개
      2. 9.3.2 보안
        1. 9.3.2.1 작성자
        2. 9.3.2.2 사용자 에이전트
      3. 9.3.3 메시지 게시하기
    4. 9.4 채널 메시징
      1. 9.4.1 소개
        1. 9.4.1.1 예시
        2. 9.4.1.2 웹의 객체 기능 모델 기반으로서의 포트
        3. 9.4.1.3 서비스 구현 추상화의 기반으로서의 포트
      2. 9.4.2 메시지 채널
      3. 9.4.3 MessageEventTarget 믹스인
      4. 9.4.4 메시지 포트
      5. 9.4.5 포트 및 가비지 컬렉션
    5. 9.5 다른 브라우징 컨텍스트로 브로드캐스트하기
  10. 10 웹 워커
    1. 10.1 소개
      1. 10.1.1 범위
      2. 10.1.2 예시
        1. 10.1.2.1 백그라운드 수치 계산 워커
        2. 10.1.2.2 JavaScript 모듈을 워커로 사용하기
        3. 10.1.2.3 공유 워커 소개
        4. 10.1.2.4 공유 워커를 사용한 공유 상태
        5. 10.1.2.5 위임
        6. 10.1.2.6 라이브러리 제공하기
      3. 10.1.3 튜토리얼
        1. 10.1.3.1 전용 워커 생성하기
        2. 10.1.3.2 전용 워커와 통신하기
        3. 10.1.3.3 공유 워커
    2. 10.2 인프라
      1. 10.2.1 전역 범위
        1. 10.2.1.1 WorkerGlobalScope 공통 인터페이스
        2. 10.2.1.2 전용 워커 및 DedicatedWorkerGlobalScope 인터페이스
        3. 10.2.1.3 공유 워커 및 SharedWorkerGlobalScope 인터페이스
      2. 10.2.2 이벤트 루프
      3. 10.2.3 워커 생명주기
      4. 10.2.4 처리 모델
      5. 10.2.5 런타임 스크립트 오류
      6. 10.2.6 워커 생성하기
        1. 10.2.6.1 AbstractWorker 믹스인
        2. 10.2.6.2 워커용 스크립트 설정
        3. 10.2.6.3 전용 워커 및 Worker 인터페이스
        4. 10.2.6.4 공유 워커 및 SharedWorker 인터페이스
      7. 10.2.7 동시 실행 하드웨어 기능
    3. 10.3 워커에서 사용 가능한 API
      1. 10.3.1 스크립트 및 라이브러리 가져오기
      2. 10.3.2 WorkerNavigator 인터페이스
      3. 10.3.3 WorkerLocation 인터페이스
  11. 11 워크릿
    1. 11.1 소개
      1. 11.1.1 동기
      2. 11.1.2 코드 멱등성
      3. 11.1.3 추측 평가
    2. 11.2 예시
      1. 11.2.1 스크립트 로딩하기
      2. 11.2.2 클래스 등록 및 메서드 호출하기
    3. 11.3 인프라
      1. 11.3.1 전역 범위
        1. 11.3.1.1 에이전트 및 이벤트 루프
        2. 11.3.1.2 생성 및 종료
        3. 11.3.1.3 워크릿용 스크립트 설정
      2. 11.3.2 Worklet 클래스
      3. 11.3.3 워크릿 생명주기
  12. 12 웹 스토리지
    1. 12.1 소개
    2. 12.2 API
      1. 12.2.1 Storage 인터페이스
      2. 12.2.2 sessionStorage getter
      3. 12.2.3 localStorage getter
      4. 12.2.4 StorageEvent 인터페이스
    3. 12.3 개인정보 보호
      1. 12.3.1 사용자 추적
      2. 12.3.2 데이터의 민감성
    4. 12.4 보안
      1. 12.4.1 DNS 스푸핑 공격
      2. 12.4.2 디렉터리 간 공격
      3. 12.4.3 구현 위험
  13. 13 HTML 구문
    1. 13.1 HTML 문서 작성하기
      1. 13.1.1 DOCTYPE
      2. 13.1.2 요소
        1. 13.1.2.1 시작 태그
        2. 13.1.2.2 종료 태그
        3. 13.1.2.3 속성
        4. 13.1.2.4 선택적 태그
        5. 13.1.2.5 콘텐츠 모델에 대한 제한
        6. 13.1.2.6 원시 텍스트 및 이스케이프 가능한 원시 텍스트 요소 콘텐츠에 대한 제한
      3. 13.1.3 텍스트
        1. 13.1.3.1 줄 바꿈
      4. 13.1.4 문자 참조
      5. 13.1.5 CDATA 구획
      6. 13.1.6 주석
      7. 13.1.7 처리 명령
    2. 13.2 HTML 문서 파싱하기
      1. 13.2.1 파싱 모델 개요
      2. 13.2.2 파싱 오류
      3. 13.2.3 입력 바이트 스트림
        1. 13.2.3.1 알려진 문자 인코딩으로 파싱하기
        2. 13.2.3.2 문자 인코딩 결정하기
        3. 13.2.3.3 문자 인코딩
        4. 13.2.3.4 파싱 중 인코딩 변경하기
        5. 13.2.3.5 입력 스트림 전처리하기
      4. 13.2.4 파싱 상태
        1. 13.2.4.1 삽입 모드
        2. 13.2.4.2 열린 요소 스택
        3. 13.2.4.3 활성 서식 요소 목록
        4. 13.2.4.4 요소 포인터
        5. 13.2.4.5 기타 파싱 상태 플래그
      5. 13.2.5 토큰화
        1. 13.2.5.1 데이터 상태
        2. 13.2.5.2 RCDATA 상태
        3. 13.2.5.3 RAWTEXT 상태
        4. 13.2.5.4 스크립트 데이터 상태
        5. 13.2.5.5 PLAINTEXT 상태
        6. 13.2.5.6 태그 열림 상태
        7. 13.2.5.7 종료 태그 열림 상태
        8. 13.2.5.8 태그 이름 상태
        9. 13.2.5.9 RCDATA 미만 기호 상태
        10. 13.2.5.10 RCDATA 종료 태그 열림 상태
        11. 13.2.5.11 RCDATA 종료 태그 이름 상태
        12. 13.2.5.12 RAWTEXT 미만 기호 상태
        13. 13.2.5.13 RAWTEXT 종료 태그 열림 상태
        14. 13.2.5.14 RAWTEXT 종료 태그 이름 상태
        15. 13.2.5.15 스크립트 데이터 미만 기호 상태
        16. 13.2.5.16 스크립트 데이터 종료 태그 열림 상태
        17. 13.2.5.17 스크립트 데이터 종료 태그 이름 상태
        18. 13.2.5.18 스크립트 데이터 이스케이프 시작 상태
        19. 13.2.5.19 스크립트 데이터 이스케이프 시작 대시 상태
        20. 13.2.5.20 스크립트 데이터 이스케이프 상태
        21. 13.2.5.21 스크립트 데이터 이스케이프 대시 상태
        22. 13.2.5.22 스크립트 데이터 이스케이프 이중 대시 상태
        23. 13.2.5.23 스크립트 데이터 이스케이프 미만 기호 상태
        24. 13.2.5.24 스크립트 데이터 이스케이프 종료 태그 열림 상태
        25. 13.2.5.25 스크립트 데이터 이스케이프 종료 태그 이름 상태
        26. 13.2.5.26 스크립트 데이터 이중 이스케이프 시작 상태
        27. 13.2.5.27 스크립트 데이터 이중 이스케이프 상태
        28. 13.2.5.28 스크립트 데이터 이중 이스케이프 대시 상태
        29. 13.2.5.29 스크립트 데이터 이중 이스케이프 이중 대시 상태
        30. 13.2.5.30 스크립트 데이터 이중 이스케이프 미만 기호 상태
        31. 13.2.5.31 스크립트 데이터 이중 이스케이프 종료 상태
        32. 13.2.5.32 속성 이름 이전 상태
        33. 13.2.5.33 속성 이름 상태
        34. 13.2.5.34 속성 이름 이후 상태
        35. 13.2.5.35 속성 값 이전 상태
        36. 13.2.5.36 속성 값(큰따옴표) 상태
        37. 13.2.5.37 속성 값(작은따옴표) 상태
        38. 13.2.5.38 속성 값 (따옴표 없음) 상태
        39. 13.2.5.39 속성 값(따옴표) 이후 상태
        40. 13.2.5.40 자체 닫힘 시작 태그 상태
        41. 13.2.5.41 잘못된 주석 상태
        42. 13.2.5.42 마크업 선언 열림 상태
        43. 13.2.5.43 주석 시작 상태
        44. 13.2.5.44 주석 시작 대시 상태
        45. 13.2.5.45 주석 상태
        46. 13.2.5.46 주석 미만 기호 상태
        47. 13.2.5.47 주석 미만 기호 느낌표 상태
        48. 13.2.5.48 주석 미만 기호 느낌표 대시 상태
        49. 13.2.5.49 주석 미만 기호 느낌표 이중 대시 상태
        50. 13.2.5.50 주석 종료 대시 상태
        51. 13.2.5.51 주석 종료 상태
        52. 13.2.5.52 주석 종료 느낌표 상태
        53. 13.2.5.53 DOCTYPE 상태
        54. 13.2.5.54 DOCTYPE 이름 이전 상태
        55. 13.2.5.55 DOCTYPE 이름 상태
        56. 13.2.5.56 DOCTYPE 이름 이후 상태
        57. 13.2.5.57 DOCTYPE public 키워드 이후 상태
        58. 13.2.5.58 DOCTYPE public 식별자 이전 상태
        59. 13.2.5.59 DOCTYPE public 식별자(큰따옴표) 상태
        60. 13.2.5.60 DOCTYPE public 식별자(작은따옴표) 상태
        61. 13.2.5.61 DOCTYPE public 식별자 이후 상태
        62. 13.2.5.62 DOCTYPE public 식별자와 system 식별자 사이 상태
        63. 13.2.5.63 DOCTYPE system 키워드 이후 상태
        64. 13.2.5.64 DOCTYPE system 식별자 이전 상태
        65. 13.2.5.65 DOCTYPE system 식별자(큰따옴표) 상태
        66. 13.2.5.66 DOCTYPE system 식별자(작은따옴표) 상태
        67. 13.2.5.67 DOCTYPE system 식별자 이후 상태
        68. 13.2.5.68 잘못된 DOCTYPE 상태
        69. 13.2.5.69 CDATA 구획 상태
        70. 13.2.5.70 CDATA 구획 대괄호 상태
        71. 13.2.5.71 CDATA 구획 종료 상태
        72. 13.2.5.72 처리 명령 열림 상태
        73. 13.2.5.73 처리 명령 대상 상태
        74. 13.2.5.74 처리 명령 대상 이후 상태
        75. 13.2.5.75 처리 명령 데이터 상태
        76. 13.2.5.76 처리 명령 물음표 상태
        77. 13.2.5.77 문자 참조 상태
        78. 13.2.5.78 명명된 문자 참조 상태
        79. 13.2.5.79 모호한 앰퍼샌드 상태
        80. 13.2.5.80 숫자 문자 참조 상태
        81. 13.2.5.81 16진수 문자 참조 시작 상태
        82. 13.2.5.82 16진수 문자 참조 상태
        83. 13.2.5.83 10진수 문자 참조 상태
        84. 13.2.5.84 숫자 문자 참조 종료 상태
      6. 13.2.6 트리 구성
        1. 13.2.6.1 노드 생성 및 삽입하기
        2. 13.2.6.2 텍스트만 포함하는 요소 파싱하기
        3. 13.2.6.3 암시된 종료 태그가 있는 요소 닫기
        4. 13.2.6.4 HTML 콘텐츠의 토큰을 파싱하는 규칙
          1. 13.2.6.4.1 "initial" 삽입 모드
          2. 13.2.6.4.2 "before html" 삽입 모드
          3. 13.2.6.4.3 "before head" 삽입 모드
          4. 13.2.6.4.4 "in head" 삽입 모드
          5. 13.2.6.4.5 "in head noscript" 삽입 모드
          6. 13.2.6.4.6 "after head" 삽입 모드
          7. 13.2.6.4.7 "in body" 삽입 모드
          8. 13.2.6.4.8 "text" 삽입 모드
          9. 13.2.6.4.9 "in table" 삽입 모드
          10. 13.2.6.4.10 "in table text" 삽입 모드
          11. 13.2.6.4.11 "in caption" 삽입 모드
          12. 13.2.6.4.12 "in column group" 삽입 모드
          13. 13.2.6.4.13 "in table body" 삽입 모드
          14. 13.2.6.4.14 "in row" 삽입 모드
          15. 13.2.6.4.15 "in cell" 삽입 모드
          16. 13.2.6.4.16 "in template" 삽입 모드
          17. 13.2.6.4.17 "after body" 삽입 모드
          18. 13.2.6.4.18 "in frameset" 삽입 모드
          19. 13.2.6.4.19 "after frameset" 삽입 모드
          20. 13.2.6.4.20 "after after body" 삽입 모드
          21. 13.2.6.4.21 "after after frameset" 삽입 모드
        5. 13.2.6.5 외부 콘텐츠의 토큰을 파싱하는 규칙
      7. 13.2.7
      8. 13.2.8 추측 HTML 파싱
      9. 13.2.9 HTML DOM을 정보 집합으로 강제 변환하기
      10. 13.2.10 파서의 오류 처리 및 특이 사례 소개
        1. 13.2.10.1 잘못 중첩된 태그: <b><i></b></i>
        2. 13.2.10.2 잘못 중첩된 태그: <b><p></b></p>
        3. 13.2.10.3 표의 예상치 못한 마크업
        4. 13.2.10.4 파싱 중인 페이지를 수정하는 스크립트
        5. 13.2.10.5 여러 문서 사이를 이동하는 스크립트의 실행
        6. 13.2.10.6 닫히지 않은 서식 요소
    3. 13.3 HTML 프래그먼트 직렬화하기
    4. 13.4 HTML 프래그먼트 파싱하기
    5. 13.5 명명된 문자 참조
  14. 14 XML 구문
    1. 14.1 XML 구문으로 문서 작성하기
    2. 14.2 XML 문서 파싱하기
    3. 14.3 XML 프래그먼트 직렬화하기
    4. 14.4 XML 프래그먼트 파싱하기
  15. 15 렌더링
    1. 15.1 소개
    2. 15.2 CSS 사용자 에이전트 스타일시트 및 표현 힌트
    3. 15.3 비대체 요소
      1. 15.3.1 숨겨진 요소
      2. 15.3.2 페이지
      3. 15.3.3 플로 콘텐츠
      4. 15.3.4 구문 콘텐츠
      5. 15.3.5 양방향 텍스트
      6. 15.3.6 구획 및 제목
      7. 15.3.7 목록
      8. 15.3.8
      9. 15.3.9 여백 상쇄 특이 동작
      10. 15.3.10 폼 컨트롤
      11. 15.3.11 hr 요소
      12. 15.3.12 fieldsetlegend 요소
    4. 15.4 대체 요소
      1. 15.4.1 임베디드 콘텐츠
      2. 15.4.2 이미지
      3. 15.4.3 임베디드 콘텐츠 및 이미지용 속성
      4. 15.4.4 이미지 맵
    5. 15.5 위젯
      1. 15.5.1 네이티브 모양
      2. 15.5.2 쓰기 모드
      3. 15.5.3 버튼 레이아웃
      4. 15.5.4 button 요소
      5. 15.5.5 detailssummary 요소
      6. 15.5.6 텍스트 입력 위젯으로서의 input 요소
      7. 15.5.7 도메인별 위젯으로서의 input 요소
      8. 15.5.8 범위 컨트롤로서의 input 요소
      9. 15.5.9 색상 선택 영역으로서의 input 요소
      10. 15.5.10 체크박스 및 라디오 버튼 위젯으로서의 input 요소
      11. 15.5.11 파일 업로드 컨트롤로서의 input 요소
      12. 15.5.12 버튼으로서의 input 요소
      13. 15.5.13 marquee 요소
      14. 15.5.14 meter 요소
      15. 15.5.15 progress 요소
      16. 15.5.16 select 요소
      17. 15.5.17 textarea 요소
    6. 15.6 프레임 및 프레임셋
    7. 15.7 대화형 미디어
      1. 15.7.1 링크, 폼 및 탐색
      2. 15.7.2 title 속성
      3. 15.7.3 편집 호스트
      4. 15.7.4 네이티브 사용자 인터페이스에 렌더링되는 텍스트
    8. 15.8 인쇄 미디어
    9. 15.9 스타일이 지정되지 않은 XML 문서
  16. 16 폐기된 기능
    1. 16.1 폐기되었지만 적합한 기능
      1. 16.1.1 폐기되었지만 적합한 기능에 대한 경고
    2. 16.2 부적합 기능
    3. 16.3 구현에 대한 요구 사항
      1. 16.3.1 marquee 요소
      2. 16.3.2 프레임
      3. 16.3.3 기타 요소, 속성 및 API
  17. 17 IANA 고려 사항
    1. 17.1 text/html
    2. 17.2 multipart/x-mixed-replace
    3. 17.3 application/xhtml+xml
    4. 17.4 text/ping
    5. 17.5 application/microdata+json
    6. 17.6 application/speculationrules+json
    7. 17.7 text/event-stream
    8. 17.8 web+ 스킴 접두사
  18. 색인
    1. 요소
    2. 요소 콘텐츠 범주
    3. 속성
    4. 요소 인터페이스
    5. 모든 인터페이스
    6. 이벤트
    7. HTTP 헤더
    8. MIME 유형
  19. 참조
  20. 감사의 말
  21. 지식 재산권

1 소개

1.1 이 명세는 어디에 해당하는가?

이 명세는 웹 플랫폼의 상당 부분을 매우 상세하게 정의한다. 다른 명세와 비교했을 때 웹 플랫폼 명세 체계에서 이 명세가 차지하는 위치는 다음과 같이 가장 잘 요약할 수 있다.

CSS SVG MathML Service Workers IDB Fetch CSP AV1 Opus PNG 이 명세 HTTP TLS DOM Unicode Web IDL MIME URL XML JavaScript Encoding

1.2 이것은 HTML5인가?

이 절은 비규범적이다.

간단히 말하면 그렇다.

좀 더 길게 말하면, "HTML5"라는 용어는 현대적인 웹 기술을 가리키는 유행어로 널리 사용되며, 그중 다수는 WHATWG에서 개발되지만 모든 기술이 그런 것은 아니다. 이 문서도 그러한 문서 중 하나이며, 다른 문서는 WHATWG 표준 개요에서 확인할 수 있다.

1.3 배경

이 절은 비규범적이다.

HTML은 월드 와이드 웹의 핵심 마크업 언어이다. 원래 HTML은 주로 과학 문서를 의미론적으로 기술하기 위한 언어로 설계되었다. 그러나 일반적인 설계 덕분에 이후 여러 해에 걸쳐 다양한 다른 유형의 문서와 애플리케이션까지 기술하도록 조정될 수 있었다.

1.4 대상 독자

이 절은 비규범적이다.

이 명세는 이 명세에서 정의한 기능을 사용하는 문서와 스크립트의 작성자, 이 명세에서 정의한 기능을 사용하는 페이지를 처리하는 도구의 구현자, 그리고 이 명세의 요구 사항에 비추어 문서나 구현의 정확성을 확인하려는 사람을 대상으로 한다.

이 문서는 웹 기술에 대해 최소한의 기본 지식조차 없는 독자에게는 적합하지 않을 수 있다. 일부 부분에서는 정확성을 위해 명확성을 희생하고, 완전성을 위해 간결성을 희생하기 때문이다. 보다 접근하기 쉬운 튜토리얼과 작성 지침은 이 주제를 좀 더 쉽게 소개할 수 있다.

특히 이 명세의 기술적인 부분 일부를 완전히 이해하려면 DOM의 기초에 익숙해야 한다. Web IDL, HTTP, XML, Unicode, 문자 인코딩, JavaScript 및 CSS에 대한 이해도 일부 부분에서 도움이 되지만 필수적인 것은 아니다.

1.5 범위

이 절은 비규범적이다.

이 명세는 정적 문서부터 동적 애플리케이션에 이르기까지 웹에서 접근 가능한 페이지를 작성하기 위한 의미론 수준의 마크업 언어와 관련 의미론 수준의 스크립팅 API를 제공하는 것으로 범위가 제한된다.

이 명세의 범위에는 미디어별 표현 사용자 지정 메커니즘을 제공하는 것이 포함되지 않는다. 다만 웹 브라우저의 기본 렌더링 규칙은 이 명세의 끝부분에 포함되어 있으며, CSS와 연동하기 위한 여러 메커니즘이 언어의 일부로 제공된다.

이 명세의 범위는 완전한 운영 체제를 기술하는 것이 아니다. 특히 하드웨어 구성 소프트웨어, 이미지 조작 도구, 사용자가 고성능 워크스테이션에서 매일 사용할 것으로 예상되는 애플리케이션은 범위에 포함되지 않는다. 애플리케이션 측면에서 이 명세는 사용자가 가끔 사용하거나, 정기적으로 사용하더라도 서로 다른 위치에서 사용하며, CPU 요구 사항이 낮을 것으로 예상되는 애플리케이션을 구체적인 대상으로 한다. 이러한 애플리케이션의 예로는 온라인 구매 시스템, 검색 시스템, 게임(특히 다중 사용자 온라인 게임), 공용 전화번호부나 주소록, 통신 소프트웨어(이메일 클라이언트, 인스턴트 메시징 클라이언트, 토론 소프트웨어), 문서 편집 소프트웨어 등이 있다.

1.6 역사

이 절은 비규범적이다.

처음 5년 동안(1990~1995년) HTML은 여러 차례 개정되고 다양한 확장이 이루어졌으며, 처음에는 주로 CERN에서, 그다음에는 IETF에서 작업이 진행되었다.

W3C가 설립되면서 HTML 개발 장소도 다시 바뀌었다. 1995년 HTML 3.0으로 알려진 HTML 확장 시도가 처음 이루어졌지만 중단되었고, 이후 HTML 3.2라는 보다 실용적인 접근 방식으로 대체되어 1997년에 완성되었다. 같은 해 후반에는 HTML4가 빠르게 뒤따랐다.

그다음 해 W3C 회원은 HTML의 발전을 중단하고 XHTML이라는 XML 기반의 동등한 언어에 대한 작업을 시작하기로 결정했다. 이 작업은 HTML4를 XML로 다시 표현한 XHTML 1.0에서 시작되었다. XHTML 1.0은 새로운 직렬화 방식 외에는 새 기능을 추가하지 않았으며 2000년에 완성되었다. XHTML 1.0 이후 W3C는 XHTML 모듈화라는 이름 아래 다른 작업 그룹이 XHTML을 더 쉽게 확장할 수 있도록 하는 데 초점을 맞추었다. 이와 병행하여 W3C는 이전 HTML 및 XHTML 언어와 호환되지 않는 XHTML2라는 새로운 언어도 개발했다.

1998년경 HTML의 발전이 중단되었을 때 브라우저 공급업체가 개발한 HTML API의 일부는 DOM Level 1이라는 이름으로 명세화되어 1998년에 공개되었으며, DOM Level 2 Core와 DOM Level 2 HTML은 2000년부터 작업이 시작되어 2003년에 완성되었다. 이후 이러한 작업은 점차 약화되었고, 2004년에 일부 DOM Level 3 명세가 공개되었지만 모든 Level 3 초안이 완성되기 전에 작업 그룹이 종료되었다.

2003년 차세대 웹 폼 기술로 자리매김한 XForms가 공개되면서, HTML을 대체할 기술을 찾기보다는 HTML 자체를 발전시키려는 관심이 다시 높아졌다. 이러한 관심은 XML이 웹 기술로 배포된 범위가 기존에 배포된 기술(HTML 등)을 대체하는 데 있지 않고, 완전히 새로운 기술(RSS와 이후의 Atom 등)에 제한되어 있다는 인식에서 비롯되었다.

기존 HTML 웹 페이지와 호환되지 않는 렌더링 엔진을 브라우저에 구현하도록 요구하지 않으면서도 HTML4의 폼을 확장하여 XForms 1.0이 도입한 여러 기능을 제공할 수 있음을 보여 주는 개념 증명이 이러한 새로운 관심의 첫 번째 결과였다. 이 초기 단계에도 초안은 이미 공개되어 있었고 모든 출처에서 의견을 받고 있었지만, 명세의 저작권은 Opera Software에만 귀속되어 있었다.

HTML의 발전을 다시 시작해야 한다는 생각은 2004년 W3C 워크숍에서 검토되었다. 이 자리에서 아래에 설명하는 HTML5 작업의 기반이 되는 일부 원칙과 앞서 언급한 폼 관련 기능만을 다룬 초기 초안 제안이 Mozilla와 Opera에 의해 공동으로 W3C에 제출되었다. 이 제안은 이전에 선택한 웹 발전 방향과 충돌한다는 이유로 거부되었고, W3C 직원과 회원은 대신 XML 기반 대체 기술을 계속 개발하기로 결정했다.

얼마 지나지 않아 Apple, Mozilla 및 Opera는 WHATWG라는 새로운 조직 아래에서 이 작업을 계속하겠다는 의사를 공동으로 발표했다. 공개 메일링 리스트가 만들어졌고 초안은 WHATWG 사이트로 옮겨졌다. 이후 저작권은 세 공급업체가 공동으로 소유하고, 명세의 재사용을 허용하도록 변경되었다.

WHATWG는 여러 핵심 원칙을 기반으로 했다. 특히 기술은 하위 호환성을 유지해야 하고, 구현이 아니라 명세를 변경해야 하는 경우에도 명세와 구현은 일치해야 하며, 구현이 서로를 역공학하지 않고도 완전한 상호 운용성을 달성할 수 있을 만큼 명세가 상세해야 한다는 원칙이었다.

특히 마지막 요구 사항으로 인해 HTML5 명세의 범위에는 이전에 별도 문서 세 개, 즉 HTML4, XHTML1 및 DOM2 HTML에서 명세했던 내용이 포함되어야 했다. 또한 이전에 일반적이라고 여겨졌던 수준보다 훨씬 더 많은 세부 사항을 포함해야 했다.

2006년 W3C는 결국 HTML5 개발에 참여하는 데 관심을 표명했고, 2007년에는 HTML5 명세 개발을 위해 WHATWG와 협력하는 작업 그룹을 구성했다. Apple, Mozilla 및 Opera는 WHATWG 사이트에 제한이 더 적은 라이선스 버전을 유지하면서, W3C가 W3C 저작권 아래에서 명세를 공개하도록 허용했다.

그 후 몇 년 동안 두 그룹은 함께 작업했다. 그러나 2011년에 두 그룹은 목표가 서로 다르다는 결론을 내렸다. W3C는 "HTML5"의 "완성된" 버전을 공개하려 했지만, WHATWG는 알려진 문제가 있는 상태로 명세를 동결하는 대신 지속해서 유지 관리하고, 플랫폼 발전에 필요한 새 기능을 추가하면서 HTML 현행 표준 작업을 계속하기를 원했다.

2019년 WHATWG와 W3C는 앞으로 단일 HTML 버전, 즉 이 문서를 공동으로 개발하기로 합의했다.

1.7 설계 참고 사항

이 절은 비규범적이다.

HTML의 여러 측면이 처음 보기에는 터무니없고 일관성이 없는 것처럼 보인다는 사실을 인정해야 한다.

HTML과 이를 지원하는 DOM API, 그리고 여러 관련 기술은 수십 년에 걸쳐 서로 다른 우선순위를 지닌 매우 다양한 사람들에 의해 개발되었으며, 이들은 많은 경우 서로의 존재조차 알지 못했다.

따라서 기능은 여러 출처에서 생겨났으며 항상 특별히 일관된 방식으로 설계된 것은 아니다. 더욱이 웹의 고유한 특성 때문에 구현 버그는 콘텐츠가 수정되기 전에 의도치 않게 해당 버그에 의존하도록 작성되는 경우가 많아, 사실상의 표준이 된 뒤 이제는 공식적인 표준이 되기도 했다.

그럼에도 특정 설계 목표를 준수하기 위한 노력이 이루어졌다. 이러한 목표는 다음 몇 개의 하위 절에서 설명한다.

1.7.1 스크립트 실행의 직렬화 가능성

이 절은 비규범적이다.

웹 작성자가 멀티스레딩의 복잡성에 노출되지 않도록 HTML 및 DOM API는 어떤 스크립트도 다른 스크립트의 동시 실행을 감지할 수 없도록 설계되었다. 워커를 사용하는 경우에도 구현의 동작은 모든 전역에서 모든 스크립트 실행을 완전히 직렬화하는 것으로 생각할 수 있도록 하는 것이 목적이다.

이 일반적인 설계 원칙의 예외는 JavaScript SharedArrayBuffer 클래스이다. SharedArrayBuffer 객체를 사용하면 다른 에이전트의 스크립트가 동시에 실행되고 있음을 실제로 관찰할 수 있다. 또한 JavaScript 메모리 모델로 인해 직렬화된 스크립트 실행으로 표현할 수 없을 뿐만 아니라, 해당 스크립트 간의 직렬화된 실행으로도 표현할 수 없는 상황이 존재한다.

1.7.2 확장성

이 절은 비규범적이다.

HTML에는 의미론을 안전하게 추가하는 데 사용할 수 있는 다양한 확장 메커니즘이 있다.

1.8 HTML 구문과 XML 구문

이 절은 비규범적이다.

이 명세는 문서와 애플리케이션을 기술하기 위한 추상 언어와, 이 언어를 사용하는 리소스의 메모리 내 표현과 상호작용하기 위한 일부 API를 정의한다.

메모리 내 표현은 "DOM HTML" 또는 줄여서 "DOM"이라고 한다.

이 추상 언어를 사용하는 리소스를 전송하는 데 사용할 수 있는 다양한 구체적인 구문이 있으며, 그중 두 가지를 이 명세에서 정의한다.

첫 번째 구체적인 구문은 HTML 구문이다. 대부분의 작성자에게 권장되는 형식이며, 대다수의 레거시 웹 브라우저와 호환된다. 문서가 text/html MIME 유형으로 전송되면 웹 브라우저는 해당 문서를 HTML 문서로 처리한다. 이 명세는 단순히 "HTML"이라고 하는 최신 HTML 구문을 정의한다.

두 번째 구체적인 구문은 XML이다. 문서가 XML MIME 유형, 예를 들어 application/xhtml+xml로 전송되면 웹 브라우저는 해당 문서를 XML 문서로 취급하고 XML 프로세서로 파싱한다. 작성자는 XML과 HTML의 처리 방식이 다르다는 점에 유의해야 한다. 특히 XML로 표시된 문서는 사소한 구문 오류만 있어도 완전히 렌더링되지 않지만, HTML 구문에서는 그러한 오류가 무시된다.

HTML의 XML 구문은 이전에 "XHTML"이라고 불렸지만, 이 명세에서는 해당 용어를 사용하지 않는다. 그 이유 중 하나는 MathML 및 SVG의 HTML 구문에도 그러한 용어가 사용되지 않기 때문이다.

DOM, HTML 구문 및 XML 구문이 모두 동일한 콘텐츠를 표현할 수 있는 것은 아니다. 예를 들어 네임스페이스는 HTML 구문으로 표현할 수 없지만 DOM과 XML 구문에서는 지원된다. 마찬가지로 noscript 기능을 사용하는 문서는 HTML 구문으로 표현할 수 있지만 DOM이나 XML 구문으로는 표현할 수 없다. 문자열 "-->"를 포함하는 주석은 DOM에서만 표현할 수 있고 HTML 및 XML 구문에서는 표현할 수 없다.

1.9 이 명세의 구조

이 절은 비규범적이다.

이 명세는 다음과 같은 주요 절로 나뉜다.

소개
HTML 표준의 맥락을 제공하는 비규범적 자료.
공통 인프라
적합성 클래스, 알고리즘, 정의 및 명세의 나머지 부분에서 공통으로 사용하는 기반.
HTML 문서의 의미론, 구조 및 API
문서는 요소로 구성된다. 이러한 요소는 DOM을 사용하여 트리를 형성한다. 이 절에서는 이 DOM의 기능을 정의하고 모든 요소에 공통된 기능과 요소 정의에 사용되는 개념을 소개한다.
HTML 요소
각 요소에는 미리 정의된 의미가 있으며, 이 절에서 그 의미를 설명한다. 작성자가 요소를 사용하는 방법에 관한 규칙과 사용자 에이전트가 각 요소를 처리하는 방법에 관한 요구 사항도 제시한다. 여기에는 비디오 재생과 자막, 폼 컨트롤과 폼 제출, HTML 캔버스로 알려진 2D 그래픽 API와 같은 HTML의 주요 대표 기능이 포함된다.
마이크로데이터
이 명세는 도구가 문서에서 이름-값 쌍의 트리를 추출할 수 있도록 기계가 읽을 수 있는 주석을 문서에 추가하는 메커니즘을 도입한다. 이 절에서는 이 메커니즘과 HTML 문서를 다른 형식으로 변환하는 데 사용할 수 있는 일부 알고리즘을 설명한다. 또한 연락처 정보, 캘린더 이벤트 및 저작물 라이선스를 위한 몇 가지 마이크로데이터 어휘 예시를 정의한다.
사용자 상호작용
HTML 문서는 포커스의 작동 방식과 드래그 앤 드롭 등 사용자가 콘텐츠와 상호작용하고 콘텐츠를 수정할 수 있는 여러 메커니즘을 제공할 수 있으며, 이 절에서 이를 설명한다.
웹 페이지 로딩
HTML 문서는 독립적으로 존재하지 않는다. 이 절에서는 웹 브라우저처럼 여러 페이지를 다루는 환경에 영향을 미치는 여러 기능을 정의한다.
웹 애플리케이션 API
이 절에서는 HTML 애플리케이션 스크립팅을 위한 기본 기능을 소개한다.
웹 워커
이 절에서는 JavaScript 백그라운드 스레드용 API를 정의한다.
워크릿
이 절에서는 기본 JavaScript 실행 환경과 별도로 JavaScript를 실행해야 하는 API용 인프라를 정의한다.
통신 API
이 절에서는 HTML로 작성된 애플리케이션이 동일한 클라이언트에서 실행되는 다른 도메인의 애플리케이션과 통신하는 데 사용할 수 있는 일부 메커니즘을 설명한다. 또한 서버 전송 이벤트 또는 EventSource로 알려진 서버 푸시 이벤트 스트림 메커니즘과 Web Sockets으로 알려진 스크립트용 양방향 전이중 소켓 프로토콜을 소개한다.
웹 스토리지
이 절에서는 이름-값 쌍을 기반으로 하는 클라이언트 측 저장 메커니즘을 정의한다.
HTML 구문
XML 구문
이러한 모든 기능은 직렬화된 형식으로 표현하여 다른 사람에게 전송할 수 없다면 아무 소용이 없다. 따라서 이 절에서는 HTML 및 XML 구문과 해당 구문을 사용하여 콘텐츠를 파싱하는 규칙을 정의한다.
렌더링
이 절에서는 웹 브라우저의 기본 렌더링 규칙을 정의한다.

또한 폐기된 기능IANA 고려 사항을 나열하는 부록과 여러 색인이 있다.

1.9.1 이 명세를 읽는 방법

이 명세는 다른 모든 명세와 같은 방식으로 읽어야 한다. 먼저 처음부터 끝까지 여러 번 읽어야 한다. 그런 다음 적어도 한 번은 역순으로 읽어야 한다. 그다음에는 목차에서 임의의 절을 선택하고 모든 상호 참조를 따라가며 읽어야 한다.

아래 적합성 요구 사항 절에서 설명하는 것처럼 이 명세는 여러 적합성 클래스에 대한 적합성 기준을 설명한다. 특히 작성자와 작성자가 만드는 문서 등의 생산자에 적용되는 적합성 요구 사항과 웹 브라우저 등의 소비자에 적용되는 적합성 요구 사항이 있다. 요구하는 내용으로 둘을 구분할 수 있다. 생산자에 대한 요구 사항은 허용되는 내용을 명시하고, 소비자에 대한 요구 사항은 소프트웨어가 어떻게 동작해야 하는지를 명시한다.

예를 들어 "foo 속성의 값은 유효한 정수여야 한다"는 허용되는 값을 규정하므로 생산자에 대한 요구 사항이다. 반면 "foo 속성의 값은 정수 파싱 규칙을 사용하여 파싱해야 한다"는 콘텐츠를 처리하는 방법을 설명하므로 소비자에 대한 요구 사항이다.

생산자에 대한 요구 사항은 소비자와 전혀 관계가 없다.

위의 예를 계속해서 살펴보면, 특정 속성의 값이 유효한 정수로 제한된다는 요구 사항은 소비자에 대한 요구 사항을 어떤 식으로도 암시하지 않는다. 실제로 소비자는 값이 요구 사항을 준수하는지와 완전히 무관하게 해당 속성을 불투명한 문자열로 처리해야 할 수도 있다. 또는 앞의 예와 같이 유효하지 않은 값(이 경우 숫자가 아닌 값)을 처리하는 방식을 정의한 특정 규칙을 사용하여 값을 파싱해야 할 수도 있다.

1.9.2 표기 규칙

이것은 정의, 요구 사항 또는 설명이다.

이것은 참고 사항이다.

이것은 예시이다.

이것은 미해결 이슈이다.

이것은 경고이다.

[Exposed=Window]
interface Example {
  // this is an IDL definition
};
variable = object.method([optionalArgument])

이것은 인터페이스의 사용법을 설명하는 작성자용 참고 사항이다.

/* this is a CSS fragment */

용어를 정의하는 위치는 this와 같이 표시한다. 해당 용어의 사용은 this 또는 this와 같이 표시한다.

요소, 속성 또는 API를 정의하는 위치는 this와 같이 표시한다. 해당 요소, 속성 또는 API에 대한 참조는 this와 같이 표시한다.

그 밖의 코드 조각은 like this와 같이 표시한다.

변수는 this와 같이 표시한다.

알고리즘에서 동기 절의 단계에는 ⌛ 표시가 붙는다.

일부 경우에는 조건과 그에 대응하는 요구 사항을 목록 형식으로 제시한다. 이러한 경우 한 조건에 적용되는 요구 사항은 해당 조건 뒤에 나오는 첫 번째 요구 사항 집합이며, 그 요구 사항에 여러 조건 집합이 있는 경우에도 마찬가지이다. 이러한 경우는 다음과 같이 표시한다.

이것은 조건이다
이것은 또 다른 조건이다
이것은 위 조건에 적용되는 요구 사항이다.
이것은 세 번째 조건이다
이것은 세 번째 조건에 적용되는 요구 사항이다.

1.10 HTML 빠른 소개

이 절은 비규범적이다.

기본적인 HTML 문서는 다음과 같다.

<!DOCTYPE html>
<html lang="en">
 <head>
  <title>Sample page</title>
 </head>
 <body>
  <h1>Sample page</h1>
  <p>This is a <a href="demo.html">simple</a> sample.</p>
  <!-- this is a comment -->
 </body>
</html>

HTML 문서는 요소와 텍스트의 트리로 구성된다. 각 요소는 소스에서 "<body>"와 같은 시작 태그와 "</body>"와 같은 종료 태그로 표시된다. 특정 시작 태그와 종료 태그는 일부 경우 생략할 수 있으며 다른 태그에 의해 암시된다.

태그는 요소가 서로 겹치지 않고 각 요소가 다른 요소 안에 완전히 포함되도록 중첩해야 한다.

<p>This is <em>very <strong>wrong</em>!</strong></p>
<p>This <em>is <strong>correct</strong>.</em></p>

이 명세는 HTML에서 사용할 수 있는 요소 집합과 요소를 중첩할 수 있는 방식에 관한 규칙을 정의한다.

요소에는 요소의 동작 방식을 제어하는 속성이 있을 수 있다. 아래 예에는 a 요소와 그 href 속성을 사용하여 구성한 하이퍼링크가 있다.

<a href="demo.html">simple</a>

속성은 시작 태그 안에 배치되며 "=" 문자로 구분되는 이름으로 구성된다. 속성 값에 ASCII 공백이나 " ' ` = < 또는 >가 포함되지 않으면 따옴표 없이 둘 수 있다. 그렇지 않으면 작은따옴표나 큰따옴표를 사용해야 한다. 값이 빈 문자열이면 값과 "=" 문자를 모두 생략할 수 있다.

<!-- empty attributes -->
<input name=address disabled>
<input name=address disabled="">

<!-- attributes with a value -->
<input name=address maxlength=200>
<input name=address maxlength='200'>
<input name=address maxlength="200">

그런 다음 HTML 사용자 에이전트(예: 웹 브라우저)는 이 마크업을 파싱하여 DOM(Document Object Model) 트리로 변환한다. DOM 트리는 문서의 메모리 내 표현이다.

DOM 트리에는 여러 종류의 노드가 포함된다. 특히 DocumentType 노드, Element 노드, Text 노드, Comment 노드, 그리고 일부 경우에는 ProcessingInstruction 노드가 포함된다.

이 절의 맨 위에 있는 마크업 조각은 다음 DOM 트리로 변환된다.

이 트리의 문서 요소html 요소이며, HTML 문서의 해당 위치에는 항상 이 요소가 있다. 이 요소에는 두 요소, 즉 headbody가 있고, 그 사이에 Text 노드가 있다.

DOM 트리에는 처음 예상할 수 있는 것보다 훨씬 많은 Text 노드가 있다. 소스에 여러 공백(여기서는 "␣"로 표시)과 줄 바꿈 ("⏎"로 표시)이 있으며, 이들이 모두 DOM에서 Text 노드가 되기 때문이다. 그러나 역사적인 이유로 원래 마크업의 모든 공백과 줄 바꿈이 DOM에 나타나는 것은 아니다. 특히 head 시작 태그 앞의 모든 공백은 조용히 제거되고, body 종료 태그 뒤의 모든 공백은 body 끝에 배치된다.

head 요소에는 title 요소가 있으며, 이 요소 자체에는 "Sample page"라는 텍스트의 Text 노드가 있다. 마찬가지로 body 요소에는 h1 요소, p 요소, 그리고 주석이 있다.


페이지의 스크립트에서 이 DOM 트리를 조작할 수 있다. 일반적으로 JavaScript로 작성하는 스크립트는 script 요소나 이벤트 처리기 콘텐츠 속성을 사용하여 임베드할 수 있는 작은 프로그램이다. 예를 들어 다음은 폼의 output 요소 값을 "Hello World"로 설정하는 스크립트가 있는 폼이다.

<form name="main">
 Result: <output name="result"></output>
 <script>
  document.forms.main.elements.result.value = 'Hello World';
 </script>
</form>

DOM 트리의 각 요소는 객체로 표현되며, 이러한 객체에는 조작할 수 있는 API가 있다. 예를 들어 링크(위 트리의 a 요소 등)의 "href" 속성은 여러 방식으로 변경할 수 있다.

var a = document.links[0]; // obtain the first link in the document
a.href = 'sample.html'; // change the destination URL of the link
a.protocol = 'https'; // change just the scheme part of the URL
a.setAttribute('href', 'https://example.com/'); // change the content attribute directly

DOM 트리는 구현, 특히 웹 브라우저와 같은 대화형 구현이 HTML 문서를 처리하고 표시할 때 문서를 표현하는 방식으로 사용되므로, 이 명세는 대체로 위에서 설명한 마크업 대신 DOM 트리를 기준으로 서술한다.


HTML 문서는 대화형 콘텐츠를 미디어에 독립적으로 기술한다. HTML 문서는 화면이나 음성 합성기 또는 점자 디스플레이를 통해 렌더링될 수 있다. 작성자는 이러한 렌더링이 이루어지는 정확한 방식에 영향을 주기 위해 CSS와 같은 스타일 언어를 사용할 수 있다.

다음 예에서는 CSS를 사용하여 페이지를 파란색 바탕의 노란색 글자로 만들었다.

<!DOCTYPE html>
<html lang="en">
 <head>
  <title>Sample styled page</title>
  <style>
   body { background: navy; color: yellow; }
  </style>
 </head>
 <body>
  <h1>Sample styled page</h1>
  <p>This page is just a demo.</p>
 </body>
</html>

HTML을 사용하는 방법에 관한 자세한 내용은 튜토리얼과 지침을 참고하는 것이 권장된다. 이 명세에 포함된 일부 예시도 유용할 수 있지만, 이 명세는 필연적으로 처음에는 이해하기 어려울 수 있는 수준의 세부 사항으로 언어를 정의하므로 초보 작성자는 주의해야 한다.

1.10.1 HTML로 안전한 애플리케이션 작성하기

이 절은 비규범적이다.

HTML을 사용하여 대화형 사이트를 만들 때는 공격자가 사이트 자체 또는 사이트 사용자의 무결성을 손상할 수 있는 취약점이 생기지 않도록 주의해야 한다.

이 문제를 포괄적으로 다루는 것은 이 문서의 범위를 벗어나며, 작성자는 이 문제를 더 자세히 학습하는 것이 강력히 권장된다. 다만 이 절에서는 HTML 애플리케이션 개발에서 흔히 발생하는 일부 함정을 간략하게 소개한다.

웹의 보안 모델은 "출처"라는 개념을 기반으로 하므로, 웹에서 발생할 수 있는 여러 공격은 교차 출처 작업과 관련되어 있다. [ORIGIN]

사용자 입력을 검증하지 않음
교차 사이트 스크립팅(XSS)
SQL 삽입

텍스트 댓글과 같은 사용자 생성 콘텐츠, URL 매개변수의 값, 제3자 사이트에서 받은 메시지 등 신뢰할 수 없는 입력을 받을 때는 데이터를 사용하기 전에 반드시 검증하고, 표시할 때 적절히 이스케이프해야 한다. 그렇게 하지 않으면 악의적인 사용자가 음수 나이와 같은 허위 사용자 정보를 제공하는 비교적 가벼운 공격부터, 사용자가 해당 정보가 포함된 페이지를 볼 때마다 스크립트를 실행하여 공격이 확산될 수도 있는 심각한 공격, 그리고 서버의 모든 데이터를 삭제하는 재앙적인 공격까지 다양한 공격을 수행할 수 있다.

사용자 입력을 검증하는 필터를 작성할 때는 알려진 안전한 구문만 허용하고 다른 모든 입력을 허용하지 않는 허용 목록 기반 필터를 사용해야 한다. 알려진 악성 입력만 차단하고 나머지는 모두 허용하는 차단 목록 기반 필터는 안전하지 않다. 악성인 모든 것이 아직 알려져 있는 것은 아니며, 예를 들어 미래에 새로 만들어질 수도 있기 때문이다.

예를 들어 페이지가 URL의 쿼리 문자열을 확인하여 표시할 내용을 결정하고, 사이트가 메시지를 표시하기 위해 사용자를 해당 페이지로 리디렉션한다고 가정해 보자.

<ul>
 <li><a href="message.cgi?say=Hello">Say Hello</a>
 <li><a href="message.cgi?say=Welcome">Say Welcome</a>
 <li><a href="message.cgi?say=Kittens">Say Kittens</a>
</ul>

메시지를 이스케이프하지 않고 사용자에게 그대로 표시하면 악의적인 공격자는 스크립트 요소가 포함된 URL을 만들 수 있다.

https://example.com/message.cgi?say=%3Cscript%3Ealert%28%27Oh%20no%21%27%29%3C/script%3E

공격자가 피해 사용자를 설득하여 이 페이지를 방문하게 하면 공격자가 선택한 스크립트가 페이지에서 실행된다. 이러한 스크립트는 사이트가 제공하는 기능의 범위 안에서 얼마든지 악의적인 작업을 수행할 수 있다. 예를 들어 사이트가 전자상거래 상점이라면 사용자가 모르는 사이에 원하지 않는 구매를 임의의 횟수만큼 하도록 만들 수 있다.

이를 교차 사이트 스크립팅 공격이라고 한다.

사이트가 코드를 실행하도록 속이는 데 사용할 수 있는 구문은 많다. 다음은 작성자가 허용 목록 필터를 작성할 때 고려하는 것이 권장되는 몇 가지 사항이다.

교차 사이트 요청 위조(CSRF)

사이트가 사용자 이름으로 포럼에 메시지를 게시하거나, 구매하거나, 여권을 신청하는 등 사용자별 부작용이 있는 폼 제출을 허용하는 경우, 다른 사이트가 사용자를 속여 모르는 사이에 요청하게 한 것이 아니라 사용자가 의도적으로 요청했는지 확인하는 것이 중요하다.

이 문제는 HTML 폼을 다른 출처로 제출할 수 있기 때문에 발생한다.

사이트는 폼에 사용자별 숨겨진 토큰을 넣거나 모든 요청의 `Origin` 헤더를 검사하여 이러한 공격을 방지할 수 있다.

클릭재킹

사용자가 원하지 않을 수 있는 작업을 수행하는 인터페이스를 제공하는 페이지는 사용자가 속아서 인터페이스를 활성화할 가능성을 피하도록 설계해야 한다.

사용자를 속이는 한 가지 방법은 악의적인 사이트가 피해 사이트를 작은 iframe에 넣은 다음, 예를 들어 반응 속도 게임을 시켜 사용자가 클릭하도록 유도하는 것이다. 사용자가 게임을 시작하면 악의적인 사이트는 사용자가 클릭하려는 순간 iframe을 마우스 커서 아래로 빠르게 옮겨 피해 사이트의 인터페이스를 클릭하도록 속일 수 있다.

이를 방지하기 위해 프레임 안에서 사용될 것으로 예상하지 않는 사이트는 프레임 안에 있지 않음을 감지했을 때만 인터페이스를 활성화하는 것이 권장된다. 예를 들어 window 객체를 top 속성의 값과 비교할 수 있다.

1.10.2 스크립팅 API를 사용할 때 피해야 할 일반적인 함정

이 절은 비규범적이다.

HTML의 스크립트에는 "완료될 때까지 실행" 의미론이 있다. 즉 브라우저는 일반적으로 추가 이벤트를 발생시키거나 문서 파싱을 계속하는 등 다른 작업을 하기 전에 스크립트를 중단하지 않고 끝까지 실행한다.

반면 HTML 파일의 파싱은 점진적으로 이루어지므로 파서는 어느 시점에서든 일시 중지하고 스크립트를 실행할 수 있다. 이는 일반적으로 좋은 동작이지만, 이벤트가 이미 발생했을 가능성이 있는 뒤에 이벤트 처리기를 연결하지 않도록 작성자가 주의해야 함을 의미한다.

이를 안정적으로 수행하는 두 가지 기법이 있다. 이벤트 처리기 콘텐츠 속성을 사용하거나, 동일한 스크립트에서 요소를 만들고 이벤트 처리기를 추가하는 것이다. 앞서 언급했듯이 추가 이벤트가 발생하기 전에 스크립트는 완료될 때까지 실행되므로 후자의 방식은 안전하다.

이 문제가 나타날 수 있는 한 가지 사례는 img 요소와 load 이벤트이다. 특히 이미지가 이미 캐시되어 있다면(흔한 경우이다) 요소를 파싱하는 즉시 이벤트가 발생할 수 있다.

여기서 작성자는 img 요소의 onload 처리기를 사용하여 load 이벤트를 포착한다.

<img src="games.png" alt="Games" onload="gamesLogoHasLoaded(event)">

스크립트가 요소를 추가하는 경우에는 동일한 스크립트에서 이벤트 처리기를 추가하기만 하면 이벤트를 놓치지 않는다.

<script>
 var img = new Image();
 img.src = 'games.png';
 img.alt = 'Games';
 img.onload = gamesLogoHasLoaded;
 // img.addEventListener('load', gamesLogoHasLoaded, false); // would work also
</script>

그러나 작성자가 먼저 img 요소를 만든 다음 별도의 스크립트에서 이벤트 리스너를 추가한다면, 그 사이에 load 이벤트가 발생하여 놓칠 가능성이 있다.

<!-- Do not use this style, it has a race condition! -->
 <img id="games" src="games.png" alt="Games">
 <!-- the 'load' event might fire here while the parser is taking a
      break, in which case you will not see it! -->
 <script>
  var img = document.getElementById('games');
  img.onload = gamesLogoHasLoaded; // might never fire!
 </script>

1.10.3 HTML 작성 시 오류를 찾는 방법: 유효성 검사기와 적합성 검사기

이 절은 비규범적이다.

작성자는 흔한 오류를 찾기 위해 적합성 검사기(유효성 검사기라고도 함)를 사용하는 것이 권장된다. WHATWG는 이러한 도구 목록을 다음에서 관리한다. https://whatwg.org/validator/

1.11 작성자에 대한 적합성 요구 사항

이 절은 비규범적이다.

이전 버전의 HTML 명세와 달리 이 명세는 유효한 문서뿐만 아니라 유효하지 않은 문서에 필요한 처리 방식도 어느 정도 상세하게 정의한다.

그러나 유효하지 않은 콘텐츠의 처리 방식이 대부분 명확하게 정의되어 있더라도, 문서에 대한 적합성 요구 사항은 여전히 중요하다. 실제로 상호 운용성, 즉 모든 구현이 특정 콘텐츠를 신뢰할 수 있고 동일하거나 동등한 방식으로 처리하는 상황만이 문서 적합성 요구 사항의 유일한 목표는 아니다. 이 절에서는 적합한 문서와 오류가 있는 문서를 계속 구분하는 보다 일반적인 이유 몇 가지를 자세히 설명한다.

1.11.1 표현용 마크업

이 절은 비규범적이다.

이전 HTML 버전의 표현 기능 대부분은 더 이상 허용되지 않는다. 일반적으로 표현용 마크업에는 여러 문제가 있는 것으로 밝혀졌다.

표현용 요소를 사용하면 접근성이 저하된다

보조 기술(AT) 사용자에게 적절한 경험을 제공하도록 표현용 마크업을 사용하는 것은 가능하지만(예: ARIA 사용), 의미론적으로 적합한 마크업을 사용할 때보다 훨씬 어렵다. 더욱이 이러한 기법을 사용해도 텍스트 모드 브라우저 사용자와 같이 AT를 사용하지 않는 비그래픽 사용자가 페이지에 접근할 수 있도록 하는 데는 도움이 되지 않는다.

반면 미디어에 독립적인 마크업을 사용하면 더 많은 사용자(예: 텍스트 브라우저 사용자)가 사용할 수 있는 방식으로 문서를 쉽게 작성할 수 있다.

더 높은 유지 관리 비용

마크업이 스타일에 독립적이도록 작성된 사이트는 훨씬 쉽게 유지 관리할 수 있다. 예를 들어 전체 사이트에서 <font color="">를 사용하는 사이트의 색상을 변경하려면 사이트 전체를 수정해야 하지만, CSS 기반 사이트에서 동일한 변경은 파일 하나만 변경하면 된다.

더 큰 문서 크기

표현용 마크업은 훨씬 더 중복되는 경향이 있으므로 문서 크기가 더 커진다.

이러한 이유로 이 버전의 HTML에서는 표현용 마크업을 제거했다. 이러한 변경은 놀라운 일이 아니다. HTML4는 오래전에 표현용 마크업을 폐기 예정으로 지정했고, 작성자가 표현용 마크업에서 벗어나는 데 도움이 되도록 HTML4 Transitional 모드를 제공했으며, 이후 XHTML 1.1은 더 나아가 이러한 기능을 완전히 폐기했다.

HTML에 남아 있는 표현용 마크업 기능은 style 속성과 style 요소뿐이다. style 속성을 프로덕션 환경에서 사용하는 것은 다소 권장되지 않지만, 신속한 프로토타이핑을 할 때 유용할 수 있다. 이 경우 나중에 규칙을 별도의 스타일시트로 직접 옮길 수 있다. 또한 별도의 스타일시트가 불편한 특수한 경우 특정 스타일을 제공하는 데도 유용하다. 마찬가지로 style 요소는 배급 콘텐츠나 페이지별 스타일에 유용할 수 있지만, 일반적으로 스타일이 여러 페이지에 적용된다면 외부 스타일시트가 더 편리할 가능성이 높다.

이전에 표현용이었던 일부 요소가 이 명세에서 미디어에 독립적인 의미를 갖도록 다시 정의되었다는 점도 주목할 필요가 있다. 해당 요소는 b, i, hr, s, smallu이다.

1.11.2 구문 오류

이 절은 비규범적이다.

HTML 구문에는 매우 다양한 문제를 피하기 위한 제약이 있다.

직관적이지 않은 오류 처리 동작

일부 유효하지 않은 구문 구조는 파싱했을 때 매우 직관적이지 않은 DOM 트리를 생성한다.

예를 들어 다음 마크업 조각은 hr 요소가 대응하는 table 요소보다 앞에 있는 형제인 DOM을 생성한다.

<table><hr>...
선택적 오류 복구가 있는 오류

사용자 에이전트가 더 기이하고 복잡한 오류 처리 규칙을 구현하지 않고도 제어된 환경에서 사용될 수 있도록, 사용자 에이전트는 파싱 오류를 만날 때마다 실패하는 것이 허용된다.

오류 처리 동작이 스트리밍 사용자 에이전트와 호환되지 않는 오류

위에서 언급한 <table><hr>... 예의 동작과 같은 일부 오류 처리 동작은 상태를 저장하지 않고 HTML 파일을 한 번에 처리하는 스트리밍 사용자 에이전트와 호환되지 않는다. 이러한 사용자 에이전트와의 상호 운용성 문제를 피하기 위해 해당 동작을 일으키는 모든 구문은 유효하지 않은 것으로 간주한다.

정보 집합 강제 변환을 일으킬 수 있는 오류

XML 기반 사용자 에이전트가 HTML 파서에 연결되면 요소나 속성 이름에 여러 개의 콜론이 들어가지 않는다는 것과 같은 XML의 특정 불변 조건이 HTML 파일에 의해 위반될 수 있다. 이를 처리하려면 파서가 HTML DOM을 XML 호환 정보 집합으로 강제 변환해야 할 수 있다. 이러한 처리가 필요한 대부분의 구문 구조는 유효하지 않은 것으로 간주한다. 연속된 하이픈 두 개를 포함하거나 하이픈으로 끝나는 주석은 HTML 구문에서 허용되는 예외이다.

지나치게 낮은 성능을 초래하는 오류

일부 구문 구조는 지나치게 낮은 성능을 초래할 수 있다. 이러한 구조의 사용을 억제하기 위해 일반적으로 부적합한 것으로 지정한다.

예를 들어 다음 마크업은 닫히지 않은 모든 i 요소를 각 문단에서 다시 구성해야 하므로 성능이 저하되며, 각 문단의 요소 수가 점차 증가한다.

<p><i>She dreamt.
<p><i>She dreamt that she ate breakfast.
<p><i>Then lunch.
<p><i>And finally dinner.

이 조각에서 생성되는 DOM은 다음과 같다.

취약한 구문 구조와 관련된 오류

역사적인 이유로 비교적 취약한 구문 구조가 있다. 사용자가 실수로 이러한 문제를 겪는 경우를 줄이기 위해 해당 구조는 부적합한 것으로 지정된다.

예를 들어 속성의 일부 명명된 문자 참조는 끝 세미콜론을 생략해도 파싱된다. 명명된 문자 참조를 구성하지 않는 문자가 앰퍼샌드 뒤에 오는 것은 안전하지만, 해당 문자가 명명된 문자 참조를 구성하는 문자열로 바뀌면 그 문자 자체로 해석된다.

이 조각에서 속성 값은 "?bill&ted"이다.

<a href="?bill&ted">Bill and Ted</a>

그러나 다음 조각에서 속성 값은 의도한 "?art&copy"가 아니라 실제로 "?art©"이다. 끝 세미콜론이 없어도 "&copy"가 "&copy;"와 동일하게 처리되므로 "©"로 해석되기 때문이다.

<a href="?art&copy">Art and Copy</a>

이 문제를 피하기 위해 모든 명명된 문자 참조는 세미콜론으로 끝나야 하며, 세미콜론이 없는 명명된 문자 참조의 사용은 오류로 표시된다.

따라서 위 사례를 올바르게 표현하는 방법은 다음과 같다.

<a href="?bill&ted">Bill and Ted</a> <!-- &ted is ok, since it's not a named character reference -->
<a href="?art&amp;copy">Art and Copy</a> <!-- the & has to be escaped, since &copy is a named character reference -->
레거시 사용자 에이전트의 알려진 상호 운용성 문제와 관련된 오류

일부 구문 구조는 레거시 사용자 에이전트에서 특히 미묘하거나 심각한 문제를 일으키는 것으로 알려져 있으므로, 작성자가 이를 피할 수 있도록 부적합한 것으로 표시된다.

예를 들어 이러한 이유로 U+0060 GRAVE ACCENT 문자(`)는 따옴표 없는 속성에서 허용되지 않는다. 일부 레거시 사용자 에이전트에서는 이 문자를 따옴표 문자로 처리하기도 한다.

또 다른 예는 DOCTYPE이다. DOCTYPE은 비특이 모드를 시작해야 한다. 레거시 사용자 에이전트가 특이 모드에서 보이는 동작은 대체로 문서화되어 있지 않기 때문이다.

작성자를 보안 공격에 노출할 위험이 있는 오류

일부 제한은 알려진 보안 문제를 피하기 위해서만 존재한다.

예를 들어 UTF-7 사용 제한은 작성자가 UTF-7을 사용하는 알려진 교차 사이트 스크립팅 공격의 피해를 입지 않도록 하기 위해서만 존재한다. [UTF7]

작성자의 의도가 불분명한 경우

작성자의 의도가 매우 불분명한 마크업은 흔히 부적합한 것으로 지정된다. 이러한 오류를 일찍 수정하면 이후의 유지 관리가 쉬워진다.

예를 들어 작성자가 다음 내용을 h1 제목으로 의도했는지, 아니면 h2 제목으로 의도했는지 불분명하다.

<h1>Contact details</h2>
오타일 가능성이 높은 경우

사용자가 단순한 오타를 냈을 때 오류를 조기에 발견할 수 있으면 작성자의 디버깅 시간을 크게 줄일 수 있다. 따라서 이 명세에서는 일반적으로 이 명세에 정의된 이름과 일치하지 않는 요소 이름, 속성 이름 등을 사용하는 것을 오류로 간주한다.

예를 들어 작성자가 <caption> 대신 <capton>을 입력하면 오류로 표시되어 작성자가 즉시 오타를 수정할 수 있다.

향후 새 구문을 방해할 수 있는 오류

향후 언어 구문을 확장할 수 있도록, 그 밖에는 무해한 특정 기능이 허용되지 않는다.

예를 들어 현재 종료 태그의 "속성"은 무시되지만 유효하지 않다. 향후 언어가 이미 배포된 유효한 콘텐츠와 충돌하지 않고 해당 구문 기능을 사용하도록 변경될 가능성을 남겨 두기 위한 것이다.

일부 작성자는 HTML 구문의 유연성을 활용해 얻는 작은 간결성의 이점보다 이러한 관습에서 얻는 일관성을 선호하여, 모든 속성을 항상 따옴표로 감싸고 선택적 태그를 항상 포함하는 습관이 유용하다고 생각한다. 이러한 작성자를 돕기 위해 적합성 검사기는 해당 관습을 강제하는 동작 모드를 제공할 수 있다.

1.11.3 콘텐츠 모델 및 속성 값에 대한 제한

이 절은 비규범적이다.

언어 구문 외에도 이 명세는 요소와 속성을 지정할 수 있는 방식에 제한을 둔다. 이러한 제한도 비슷한 이유로 존재한다.

의미가 의심스러운 콘텐츠와 관련된 오류

정의된 의미가 있는 요소의 오용을 피하기 위해, 의심스러운 가치를 지닌 방식으로 요소가 중첩되는 것을 제한하는 콘텐츠 모델을 정의한다.

예를 들어 이 명세에서는 section 요소를 kbd 요소 안에 중첩하는 것을 허용하지 않는다. 작성자가 전체 구획을 키보드로 입력해야 한다는 의미를 나타내려 할 가능성이 매우 낮기 때문이다.

표현된 의미의 충돌과 관련된 오류

마찬가지로 요소 사용상의 실수를 작성자가 알아차리도록 하기 위해, 표현된 의미의 명확한 모순도 적합성 오류로 간주한다.

예를 들어 아래 조각의 의미는 모순된다. 구분자는 동시에 셀이 될 수 없으며, 라디오 버튼은 진행률 표시줄이 될 수 없다.

<hr role="cell">
<input type=radio role=progressbar>

또 다른 예는 ul 요소의 콘텐츠 모델에 대한 제한이다. 이 요소는 li 요소 자식만 허용한다. 목록은 정의상 0개 이상의 목록 항목으로만 구성되므로, ul 요소에 li 요소 이외의 것이 포함되어 있다면 무엇을 의도했는지 불분명하다.

기본 스타일이 혼란을 일으킬 가능성이 높은 경우

일부 요소에는 특정 조합이 혼란을 일으킬 가능성을 높이는 기본 스타일이나 동작이 있다. 이러한 문제가 없으면서 동등한 대안이 있다면 혼란스러운 조합은 허용되지 않는다.

예를 들어 div 요소는 블록 상자로 렌더링되고, span 요소는 인라인 상자로 렌더링된다. 블록 상자인라인 상자 안에 넣는 것은 불필요하게 혼란스럽다. div 요소만 중첩하거나, span 요소만 중첩하거나, div 요소 안에 span 요소를 중첩하는 것은 모두 span 요소 안에 div 요소를 중첩하는 것과 동일한 목적을 달성한다. 그러나 마지막 조합만 인라인 상자 안에 블록 상자를 포함하므로 마지막 조합은 허용되지 않는다.

또 다른 예는 대화형 콘텐츠를 중첩할 수 없는 방식이다. 예를 들어 button 요소에는 textarea 요소를 포함할 수 없다. 이러한 대화형 요소 중첩의 기본 동작이 사용자에게 매우 혼란스러울 수 있기 때문이다. 이러한 요소는 중첩하지 않고 나란히 배치할 수 있다.

명세를 잘못 이해했을 가능성을 나타내는 오류

어떤 것을 허용하면 작성자에게 혼란을 일으킬 가능성이 있기 때문에 허용되지 않는 경우도 있다.

예를 들어 disabled 속성을 "false" 값으로 설정하는 것은 허용되지 않는다. 겉보기에는 요소가 활성화된다는 의미처럼 보이지만, 실제로는 요소가 비활성화된다는 의미이기 때문이다. 구현에 중요한 것은 속성의 값이 아니라 속성의 존재 여부이다.

언어를 단순화하기 위해 부과된 제한과 관련된 오류

일부 적합성 오류는 작성자가 배워야 하는 언어를 단순화한다.

예를 들어 area 요소의 shape 속성은 실제로 circcircle 값을 동의어로 모두 받아들이지만, 튜토리얼과 다른 학습 자료를 단순화하기 위해 circ 값의 사용은 허용하지 않는다. 둘 다 허용해도 이점은 없지만 언어를 가르칠 때 추가적인 혼란을 일으킬 수 있다.

파서의 특이성과 관련된 오류

일부 요소는 일반적으로 역사적인 이유로 다소 특이한 방식으로 파싱되며, 해당 요소의 콘텐츠 모델 제한은 작성자가 이러한 문제에 노출되지 않도록 하기 위한 것이다.

예를 들어 form 요소는 구문 콘텐츠 안에서 허용되지 않는다. HTML로 파싱할 때 form 요소의 시작 태그가 p 요소의 종료 태그를 암시하기 때문이다. 따라서 다음 마크업은 하나가 아니라 두 개의 문단을 생성한다.

<p>Welcome. <form><label>Name:</label> <input></form>

이 마크업은 다음과 정확히 동일하게 파싱된다.

<p>Welcome. </p><form><label>Name:</label> <input></form>
스크립트가 디버깅하기 어려운 방식으로 실패할 가능성이 있는 오류

일부 오류는 디버깅하기 어려운 스크립트 문제를 방지하는 데 도움을 주기 위한 것이다.

예를 들어 이러한 이유로 동일한 값을 지닌 id 속성을 두 개 사용하는 것은 부적합하다. 중복 ID로 인해 잘못된 요소가 선택될 수 있으며, 때로는 원인을 파악하기 어려운 심각한 결과를 초래할 수 있다.

작성 시간을 낭비하는 오류

일부 구문은 역사적으로 많은 작성 시간을 낭비하게 했기 때문에 허용되지 않으며, 작성자가 이를 피하도록 장려하면 향후 작업 시간을 절약할 수 있다.

예를 들어 script 요소의 src 속성이 있으면 요소의 콘텐츠가 무시된다. 그러나 이는 분명하지 않으며, 특히 요소의 콘텐츠가 실행 가능한 스크립트처럼 보이는 경우 작성자가 해당 인라인 스크립트가 실행되지 않는다는 사실을 깨닫지 못한 채 디버깅에 많은 시간을 소비할 수 있다. 이 문제를 줄이기 위해 이 명세에서는 src 속성이 있는 script 요소에 실행 가능한 스크립트를 포함하는 것을 부적합한 것으로 지정한다. 따라서 문서를 검증하는 작성자는 이러한 실수로 시간을 낭비할 가능성이 작다.

HTML 구문과 XML 구문 사이를 이전하는 작성자에게 영향을 미치는 영역과 관련된 오류

일부 작성자는 XML과 HTML 모두에서 비슷한 결과로 해석할 수 있는 파일을 작성하고 싶어 한다. 이 방식은 특히 스크립팅, 스타일링 또는 모든 종류의 자동 직렬화와 관련될 때 수많은 미묘한 복잡성이 있으므로 일반적으로 권장되지 않지만, 이 명세에는 최소한 이러한 어려움을 어느 정도 완화하기 위한 제한이 몇 가지 있다. 따라서 작성자가 HTML 구문과 XML 구문 사이를 이전할 때 이를 과도기적 단계로 사용하기가 더 쉬워진다.

예를 들어 langxml:lang 속성을 서로 동기화하기 위한 다소 복잡한 규칙이 존재한다.

또 다른 예는 HTML 직렬화의 xmlns 속성 값에 대한 제한이다. 이러한 제한은 적합한 문서의 요소가 HTML 또는 XML 중 어느 방식으로 처리되든 동일한 네임스페이스에 속하도록 하기 위한 것이다.

향후 확장을 위해 예약된 영역과 관련된 오류

향후 언어 개정판에서 새 구문을 허용하기 위한 구문 제한과 마찬가지로, 요소의 콘텐츠 모델과 속성 값에 대한 일부 제한은 향후 HTML 어휘를 확장할 수 있도록 하기 위한 것이다.

예를 들어 U+005F LOW LINE 문자(_)로 시작하는 target 속성의 값을 특정한 미리 정의된 값으로만 제한하면, 향후 작성자가 정의한 값과 충돌하지 않고 새 미리 정의된 값을 도입할 수 있다.

다른 명세의 오용을 나타내는 오류

일부 제한은 다른 명세에서 정한 제한을 지원하기 위한 것이다.

예를 들어 미디어 쿼리 목록을 받는 속성에 유효한 미디어 쿼리 목록만 사용하도록 요구하면 해당 명세의 적합성 규칙을 따르는 것이 중요하다는 점을 강화한다.

1.12 권장 읽을거리

이 절은 비규범적이다.

다음 문서는 이 명세의 독자에게 유용할 수 있다.

월드 와이드 웹을 위한 문자 모델 1.0: 기본 원칙 [CHARMOD]

이 아키텍처 명세는 Unicode 표준과 ISO/IEC 10646에서 공동으로 정의한 범용 문자 집합을 기반으로, 월드 와이드 웹에서 상호 운용 가능한 텍스트 조작을 위한 공통 참조를 명세 작성자, 소프트웨어 개발자 및 콘텐츠 개발자에게 제공한다. 다루는 주제로는 '문자', '인코딩' 및 '문자열'이라는 용어의 사용, 참조 처리 모델, 문자 인코딩의 선택과 식별, 문자 이스케이프 및 문자열 인덱싱이 포함된다.

Unicode 보안 고려 사항 [UTR36]

Unicode에는 매우 많은 문자가 포함되어 있고 세계의 다양한 문자 체계를 포괄하므로, 잘못 사용하면 프로그램이나 시스템이 잠재적인 보안 공격에 노출될 수 있다. 점점 더 많은 제품이 국제화되고 있으므로 이는 특히 중요하다. 이 문서는 프로그래머, 시스템 분석가, 표준 개발자 및 사용자가 고려해야 할 일부 보안 고려 사항을 설명하고, 문제의 위험을 줄이기 위한 구체적인 권고 사항을 제공한다.

웹 콘텐츠 접근성 지침(WCAG) [WCAG]

웹 콘텐츠 접근성 지침(WCAG)은 웹 콘텐츠의 접근성을 높이기 위한 광범위한 권고 사항을 다룬다. 이 지침을 따르면 전맹 및 저시력, 농 및 난청, 학습 장애, 인지적 제약, 제한된 운동 능력, 언어 장애, 광과민성 및 이러한 장애의 복합적인 조합을 포함하여 더 다양한 장애인이 콘텐츠에 접근할 수 있다. 또한 이 지침을 따르면 일반적으로 모든 사용자가 웹 콘텐츠를 더 쉽게 사용할 수 있다.

저작 도구 접근성 지침(ATAG) 2.0 [ATAG]

이 명세는 장애인이 더 쉽게 사용할 수 있는 웹 콘텐츠 저작 도구를 설계하기 위한 지침을 제공한다. 이 지침을 준수하는 저작 도구는 장애가 있는 작성자에게 접근 가능한 사용자 인터페이스를 제공할 뿐만 아니라, 모든 작성자가 접근 가능한 웹 콘텐츠를 제작할 수 있도록 지원하고 촉진함으로써 접근성을 향상한다.

사용자 에이전트 접근성 지침(UAAG) 2.0 [UAAG]

이 문서는 장애인의 웹 접근성 장벽을 낮추는 사용자 에이전트를 설계하기 위한 지침을 제공한다. 사용자 에이전트에는 브라우저와 웹 콘텐츠를 가져와 렌더링하는 다른 유형의 소프트웨어가 포함된다. 이 지침을 준수하는 사용자 에이전트는 자체 사용자 인터페이스와 다른 기술, 특히 보조 기술과 통신하는 기능을 포함한 내부 기능을 통해 접근성을 향상한다. 또한 장애가 있는 사용자뿐만 아니라 모든 사용자가 적합한 사용자 에이전트를 더 쉽게 사용할 수 있어야 한다.

2 공통 인프라

이 명세는 Infra에 의존한다. [INFRA]

2.1 용어

이 명세에서는 HTML 및 XML 속성과 IDL 속성을 동일한 맥락에서 함께 언급하는 경우가 많다. 어느 것을 가리키는지 명확하지 않은 경우 HTML 및 XML 속성은 콘텐츠 속성이라고 하며, IDL 인터페이스에 정의된 속성은 IDL 속성이라고 한다. 마찬가지로 "프로퍼티"라는 용어는 JavaScript 객체 프로퍼티와 CSS 프로퍼티 모두에 사용된다. 의미가 모호한 경우에는 각각 객체 프로퍼티CSS 프로퍼티로 한정하여 표현한다.

일반적으로 명세에서 어떤 기능이 HTML 구문 또는 XML 구문에 적용된다고 명시하면, 다른 구문도 함께 포함한다. 기능이 두 언어 중 하나에만 특별히 적용되는 경우에는 "HTML의 경우, …(XML에는 적용되지 않음)"과 같이 다른 형식에는 적용되지 않는다고 명시적으로 밝힌다.

이 명세에서는 짧은 정적 문서부터 풍부한 멀티미디어가 포함된 긴 논문이나 보고서, 완전한 대화형 애플리케이션에 이르는 모든 HTML 사용을 가리키는 용어로 문서를 사용한다. 이 용어는 맥락에 따라 Document 객체와 그 자손 DOM 트리뿐만 아니라 HTML 구문 또는 XML 구문을 사용하는 직렬화된 바이트 스트림도 가리킨다.

DOM 구조의 맥락에서는 HTML 문서XML 문서라는 용어를 DOM에 정의된 의미로 사용하며, 특히 Document 객체가 놓일 수 있는 서로 다른 두 모드를 가리킨다. [DOM] (이와 같은 사용은 항상 해당 정의에 하이퍼링크되어 있다.)

바이트 스트림의 맥락에서 HTML 문서라는 용어는 text/html로 표시된 리소스를 가리키며, XML 문서라는 용어는 XML MIME 유형으로 표시된 리소스를 가리킨다.


간결성을 위해 문서가 사용자에게 렌더링되는 방식을 언급할 때 표시됨, 출력됨보임과 같은 용어를 사용할 수 있다. 이러한 용어가 시각 매체를 의미하는 것은 아니며, 다른 매체에도 동등한 방식으로 적용되는 것으로 보아야 한다.

2.1.1 병렬 처리

단계를 병렬로 실행한다는 것은 해당 단계를 하나씩 순서대로 실행하되, 표준의 다른 로직과 동시에 실행한다는 뜻이다(예: 이벤트 루프와 동시에 실행). 이 표준은 시분할 협력형 멀티태스킹, 파이버, 스레드, 프로세스, 서로 다른 하이퍼스레드, 코어, CPU, 시스템 등을 사용하는지 여부를 포함하여 이를 실현하는 정확한 메커니즘을 정의하지 않는다. 반면 즉시 실행해야 하는 작업은 현재 실행 중인 태스크를 중단하고 자신을 실행한 다음 이전에 실행 중이던 태스크를 재개해야 한다.

병렬 처리를 활용하는 명세 작성 지침은 다른 명세에서 이벤트 루프 다루기를 참조하라.

동일한 데이터를 처리하는 서로 다른 병렬 알고리즘 사이의 경쟁 상태를 피하기 위해 병렬 큐를 사용할 수 있다.

병렬 큐는 직렬로 실행해야 하는 알고리즘 단계의 큐를 나타낸다.

병렬 큐에는 처음에 비어 있는 알고리즘 큐()가 있다.

병렬 큐단계를 큐에 추가하려면, 알고리즘 단계를 병렬 큐알고리즘 큐큐에 추가한다.

새 병렬 큐를 시작하려면 다음 단계를 실행한다.

  1. parallelQueue를 새 병렬 큐로 설정한다.

  2. 다음 단계를 병렬로 실행한다.

    1. 참인 동안 다음을 반복한다.

      1. stepsparallelQueue알고리즘 큐에서 큐에서 제거한 결과로 설정한다.

      2. steps가 nothing이 아니면 steps를 실행한다.

      3. 단언: 병렬로 실행되는 단계는 예외를 던질 수 없으므로 steps를 실행해도 예외가 발생하지 않았다.

      구현이 이를 계속 실행되는 루프로 구현할 것으로 기대하지 않는다. 표준의 알고리즘은 이해하기 쉽게 작성되며, 배터리 수명이나 성능 면에서 반드시 효율적인 것은 아니다.

  3. parallelQueue를 반환한다.

병렬로 실행되는 단계는 자체적으로 다른 단계를 병렬로 실행할 수 있다. 예를 들어 병렬 큐 안에서 일련의 단계를 큐와 병렬로 실행하는 것이 유용할 수 있다.

어떤 표준이 nameList(리스트)와 nameListname을 추가하는 메서드를 정의했다고 가정하자. 단, nameList가 이미 name포함하는 경우에는 거부한다.

다음 해결 방법에는 경쟁 상태가 존재한다.

  1. pthis관련 렐름에서 생성된 새 프로미스로 설정한다.

  2. globalthis관련 전역 객체로 설정한다.

  3. 다음 단계를 병렬로 실행한다.

    1. nameListname포함하면, 주어진 global을 사용하여 DOM 조작 태스크 소스전역 태스크를 큐에 추가pTypeError로 거부하고, 이 단계를 중단한다.

    2. 시간이 오래 걸릴 수 있는 작업을 수행한다.

    3. namenameList추가한다.

    4. 주어진 global을 사용하여 DOM 조작 태스크 소스전역 태스크를 큐에 추가p를 undefined로 이행한다.

  4. p를 반환한다.

위 작업을 두 번 호출하면 동시에 실행될 수 있다. 이 경우 단계 3.1에서 namenameList에 없지만 단계 3.3이 실행되기 전에 추가될 수 있으므로, 결과적으로 namenameList에 두 번 들어갈 수 있다.

병렬 큐는 이 문제를 해결한다. 표준에서 nameListQueue새 병렬 큐를 시작한 결과로 설정하고 이름 추가 단계를 다음과 같이 정의할 수 있다.

  1. pthis관련 렐름에서 생성된 새 프로미스로 설정한다.

  2. globalthis관련 전역 객체로 설정한다.

  3. 다음 단계를 큐에 추가한다. 대상은 nameListQueue이다.

    1. nameListname포함하면, 주어진 global을 사용하여 전역 태스크를 큐에 추가한다. 사용할 태스크 소스는 DOM 조작 태스크 소스이며, 이 태스크는 pTypeError로 거부한다. 그런 다음 이 단계를 중단한다.

    2. 시간이 오래 걸릴 수 있는 작업을 수행한다.

    3. namenameList추가한다.

    4. 주어진 global을 사용하여 DOM 조작 태스크 소스전역 태스크를 큐에 추가p를 undefined로 이행한다.

  4. p를 반환한다.

이제 단계가 큐에 들어가므로 경쟁 상태를 피할 수 있다.

2.1.2 리소스

이 명세에서는 사용자 에이전트가 외부 리소스의 의미를 디코딩할 수 있는 구현을 갖추고 있는지를 가리킬 때 지원됨이라는 용어를 사용한다. 구현이 리소스의 중요한 측면을 무시하지 않고 해당 형식이나 유형의 외부 리소스를 처리할 수 있다면 그 형식이나 유형은 지원됨이라고 한다. 특정 리소스가 지원됨인지 여부는 해당 리소스 형식의 어떤 기능이 사용되는지에 따라 달라질 수 있다.

예를 들어 구현이 알지 못하는 사이에 이미지에 애니메이션 데이터가 포함되어 있더라도 픽셀 데이터를 디코딩하고 렌더링할 수 있다면 PNG 이미지는 지원되는 형식으로 간주된다.

사용된 압축 형식이 지원되지 않는다면 구현이 파일의 메타데이터에서 동영상의 크기를 확인할 수 있더라도 MPEG-4 비디오 파일은 지원되는 형식으로 간주되지 않는다.

일부 명세, 특히 HTTP 명세에서 표현이라고 부르는 것은 이 명세에서는 리소스라고 한다. [HTTP]

리소스의 중요 하위 리소스는 해당 리소스를 올바르게 처리하기 위해 사용할 수 있어야 하는 리소스이다. 어떤 리소스를 중요하게 간주할지는 해당 리소스의 형식을 정의하는 명세에서 정의한다.

CSS 스타일시트의 경우 여기서는 잠정적으로 @import 규칙을 통해 가져온 다른 스타일시트와 가져온 다른 스타일시트가 간접적으로 가져온 스타일시트를 중요 하위 리소스로 정의한다.

이 정의는 완전히 상호 운용 가능하지 않다. 또한 일부 사용자 에이전트는 배경 이미지나 웹 폰트와 같은 리소스를 중요 하위 리소스로 간주하는 것으로 보인다. 이상적으로는 CSS 작업 그룹이 이를 정의해야 한다. 이와 관련된 진행 상황은 w3c/csswg-drafts 이슈 #1088을 참조하라.

2.1.3 XML 호환성

HTML에서 XML로 쉽게 이전할 수 있도록 이 명세를 준수하는 사용자 에이전트는 적어도 DOM 및 CSS의 목적상 HTML의 요소를 http://www.w3.org/1999/xhtml 네임스페이스에 배치한다. "HTML 요소"라는 용어는 XML 문서에 있는 경우를 포함하여 해당 네임스페이스의 모든 요소를 가리킨다.

달리 명시하지 않는 한 이 명세에서 정의하거나 언급하는 모든 요소는 HTML 네임스페이스 ("http://www.w3.org/1999/xhtml")에 있으며, 이 명세에서 정의하거나 언급하는 모든 속성에는 네임스페이스가 없다.

요소 유형이라는 용어는 주어진 로컬 이름과 네임스페이스를 갖는 요소 집합을 가리키는 데 사용한다. 예를 들어 button 요소는 요소 유형이 button인 요소이다. 즉 로컬 이름이 "button"이고 (위에서 정의한 대로 암시적으로) HTML 네임스페이스에 속한다.

2.1.4 DOM 트리

어떤 요소나 속성이 무시됨이라고 명시되거나, 다른 값으로 취급되거나, 다른 것인 것처럼 처리된다고 할 때 이는 노드가 DOM에 들어간 후의 처리만을 가리킨다. 사용자 에이전트는 이러한 상황에서 DOM을 변경해서는 안 된다.

콘텐츠 속성은 새 값이 이전 값과 다른 경우에만 값이 변경되었다고 한다. 속성을 이미 가지고 있는 값으로 설정하는 것은 속성을 변경하지 않는다.

속성 값, Text 노드 또는 문자열에 사용되는 비어 있음이라는 용어는 텍스트의 길이가 0임을 의미한다(즉, 제어 문자나 U+0020 SPACE조차 포함하지 않음).

HTML 요소는 해당 요소의 로컬 이름에 대해 정의된 특정 HTML 요소 삽입 단계, HTML 요소 연결 후 단계, HTML 요소 제거 단계HTML 요소 이동 단계를 가질 수 있다.

insertedNode가 주어진 경우 HTML 표준의 삽입 단계는 다음과 같이 정의한다.

  1. insertedNode네임스페이스HTML 네임스페이스인 요소이고, 이 표준이 insertedNode로컬 이름에 대한 HTML 요소 삽입 단계를 정의한다면, insertedNode가 주어진 해당 HTML 요소 삽입 단계를 실행한다.

  2. insertedNode폼 관련 요소이거나 폼 관련 요소의 조상이면 다음을 실행한다.

    1. 폼 관련 요소파서 삽입 플래그가 설정되어 있으면 반환한다.

    2. 폼 관련 요소폼 소유자를 재설정한다.

  3. insertedNodeHTML 파서열린 요소 스택에 없는 Element이면, insertedNode노드 문서가 주어진 상태에서 내부 리소스 링크를 처리한다.

insertedNode가 주어진 경우 HTML 표준의 연결 후 단계는 다음과 같이 정의한다.

  1. insertedNode네임스페이스HTML 네임스페이스인 요소이고, 이 표준이 insertedNode로컬 이름에 대한 HTML 요소 연결 후 단계를 정의한다면, insertedNode가 주어진 해당 HTML 요소 연결 후 단계를 실행한다.

removedNode, isSubtreeRootoldAncestor가 주어진 경우 HTML 표준의 제거 단계는 다음과 같이 정의한다.

  1. documentremovedNode노드 문서로 설정한다.

  2. document포커스 영역removedNode이면, document포커스 영역document뷰포트로 설정하고, document관련 전역 객체내비게이션 API진행 중인 내비게이션 중 포커스 변경을 false로 설정한다.

    이 단계는 포커스 해제 단계, 포커스 단계 또는 포커스 업데이트 단계를 수행하지 않으므로, blur 또는 change 이벤트가 발생하지 않는다.

  3. removedNode네임스페이스HTML 네임스페이스인 요소이고, 이 표준이 removedNode로컬 이름에 대한 HTML 요소 제거 단계를 정의한다면, removedNode, isSubtreeRootoldAncestor가 주어진 해당 HTML 요소 제거 단계를 실행한다.

  4. removedNode가 null이 아닌 폼 소유자를 갖는 폼 관련 요소이고, removedNode와 그 폼 소유자가 더 이상 동일한 트리에 있지 않다면, removedNode폼 소유자를 재설정한다.

  5. removedNodepopover 속성이 팝오버 없음 상태가 아니라면, removedNode, false, false, false 및 null이 주어진 팝오버 숨기기 알고리즘을 실행한다.

movedNode, isSubtreeRootoldAncestor가 주어진 경우 HTML 표준의 이동 단계는 다음과 같이 정의한다.

  1. movedNode네임스페이스HTML 네임스페이스인 요소이고, 이 표준이 movedNode로컬 이름에 대한 HTML 요소 이동 단계를 정의한다면, movedNode, isSubtreeRootoldAncestor가 주어진 해당 HTML 요소 이동 단계를 실행한다.

  2. movedNode가 null이 아닌 폼 소유자를 갖는 폼 관련 요소이고, movedNode와 그 폼 소유자가 더 이상 동일한 트리에 있지 않다면, movedNode폼 소유자를 재설정한다.

어떤 노드를 인수로 사용하여 삽입 단계를 호출하고 그 노드가 이제 문서 트리 안에 있다면 노드가 문서에 삽입되었다고 한다. 마찬가지로 어떤 노드를 인수로 사용하여 제거 단계를 호출하고 그 노드가 이제 더 이상 문서 트리 안에 있지 않다면 노드가 문서에서 제거되었다고 한다.

어떤 노드를 인수로 사용하여 삽입 단계를 호출하고 그 노드가 이제 연결되어 있다면 노드가 연결된다고 한다. 마찬가지로 어떤 노드를 인수로 사용하여 제거 단계를 호출하고 그 노드가 이제 더 이상 연결되어 있지 않다면 노드가 연결 해제된다고 한다.

노드가 연결되어 있고 그 노드의 섀도 포함 루트브라우징 컨텍스트가 null이 아니라면, 그 노드는 브라우징 컨텍스트에 연결됨 상태이다. 어떤 노드를 인수로 사용하여 삽입 단계를 호출하고 그 노드가 이제 브라우징 컨텍스트에 연결되어 있다면 노드가 브라우징 컨텍스트에 연결된다고 한다. 어떤 노드를 인수로 사용하여 제거 단계를 호출하고 그 노드가 이제 더 이상 브라우징 컨텍스트에 연결되어 있지 않거나, 그 노드의 섀도 포함 루트브라우징 컨텍스트가 null이 된다면 노드가 브라우징 컨텍스트에서 연결 해제된다고 한다.

2.1.5 스크립팅

Foo가 실제로는 인터페이스인 경우에도 더 정확한 표현인 "Foo 인터페이스를 구현하는 객체" 대신 "Foo 객체"라는 표현을 사용할 때가 있다.

IDL 속성의 값을 가져오는 경우(예: 작성자 스크립트가 가져오는 경우)를 가져오기라고 하며, 새 값을 할당하는 경우를 설정하기라고 한다.

DOM 객체가 라이브라고 하면 해당 객체의 속성과 메서드는 데이터의 스냅샷이 아니라 실제 기반 데이터에 대해 작동해야 한다.

2.1.6 플러그인

플러그인이라는 용어는 사용자 에이전트가 사용하는 구현 정의 콘텐츠 처리기 집합을 가리킨다. 이러한 처리기는 사용자 에이전트가 Document 객체를 렌더링하는 데 참여할 수 있지만, Document자식 내비게이터블로 동작하거나 Document의 DOM에 Node 객체를 추가하지는 않는다.

일반적으로 이러한 콘텐츠 처리기는 제3자가 제공하지만, 사용자 에이전트가 내장 콘텐츠 처리기를 플러그인으로 지정할 수도 있다.

사용자 에이전트는 text/plainapplication/octet-stream 유형에 등록된 플러그인이 있다고 간주해서는 안 된다.

플러그인의 한 예는 사용자가 PDF 파일로 이동할 때 내비게이터블에서 인스턴스화되는 PDF 뷰어이다. 이는 PDF 뷰어 구성요소를 구현한 주체가 사용자 에이전트 자체를 구현한 주체와 같은지 여부와 관계없이 플러그인으로 간주된다. 그러나 동일한 인터페이스를 사용하는 대신 사용자 에이전트와 별도로 실행되는 PDF 뷰어 애플리케이션은 이 정의에 따른 플러그인이 아니다.

플러그인과 상호작용하는 방식은 사용자 에이전트와 플랫폼에 따라 달라질 것으로 예상되므로 이 명세에서는 해당 메커니즘을 정의하지 않는다. 일부 UA는 Netscape Plugin API와 같은 플러그인 메커니즘을 지원할 수 있고, 다른 UA는 원격 콘텐츠 변환기를 사용하거나 특정 유형을 기본적으로 지원할 수 있다. 실제로 이 명세는 사용자 에이전트가 플러그인을 지원하도록 전혀 요구하지 않는다. [NPAPI]

브라우저는 플러그인용 외부 콘텐츠와 상호작용할 때 매우 주의해야 한다. 제3자 소프트웨어가 사용자 에이전트 자체와 동일한 권한으로 실행되면 제3자 소프트웨어의 취약점도 사용자 에이전트의 취약점만큼 위험해진다.

(이것은 추적 벡터이다.) 사용자마다 서로 다른 플러그인 집합을 보유하면 사용자를 고유하게 식별할 가능성을 높이는 추적 벡터가 되므로, 사용자 에이전트는 각 사용자에게 정확히 동일한 플러그인 집합을 지원하는 것이 권장된다.

2.1.7 문자 인코딩

Encoding에 정의된 것처럼 문자 인코딩, 또는 의미가 모호하지 않은 경우 단순히 인코딩은 바이트 스트림과 Unicode 문자열 사이를 변환하는 정의된 방식이다. 인코딩에는 인코딩 이름과 하나 이상의 인코딩 레이블이 있으며, Encoding 표준에서는 이를 인코딩의 이름레이블이라고 한다. [ENCODING]

2.1.8 적합성 클래스

이 명세는 사용자 에이전트(구현자 관련)와 문서(작성자 및 저작 도구 구현자 관련)에 대한 적합성 기준을 설명한다.

적합한 문서는 문서에 대한 모든 적합성 기준을 준수하는 문서이다. 읽기 쉽도록 일부 적합성 요구 사항은 작성자에 대한 적합성 요구 사항으로 표현하지만, 이러한 요구 사항은 암묵적으로 문서에 대한 요구 사항이다. 정의상 모든 문서에는 작성자가 있었다고 가정하기 때문이다. (일부 경우 그 작성자가 사용자 에이전트 자체일 수 있으며, 이러한 사용자 에이전트에는 아래에서 설명하는 추가 규칙이 적용된다.)

예를 들어 요구 사항에 "작성자는 foobar 요소를 사용해서는 안 된다"고 명시되어 있다면, 문서에 foobar라는 이름의 요소를 포함할 수 없음을 의미한다.

문서 적합성 요구 사항과 구현 적합성 요구 사항 사이에 암시적인 관계는 없다. 사용자 에이전트가 부적합한 문서를 임의로 처리할 수 있는 것은 아니다. 이 명세에서 설명하는 처리 모델은 입력 문서의 적합성 여부와 관계없이 구현에 적용된다.

사용자 에이전트는 서로 다른 적합성 요구 사항을 갖는 여러 범주로 나뉘며, 범주는 서로 겹칠 수 있다.

웹 브라우저 및 기타 대화형 사용자 에이전트

XML 구문을 지원하는 웹 브라우저는 다른 명세에서 해당 요소의 의미를 재정의하지 않은 한, 사용자가 상호작용할 수 있도록 XML 문서에서 발견된 HTML 네임스페이스의 요소와 속성을 이 명세에서 설명한 방식으로 처리해야 한다.

적합한 웹 브라우저가 XML 문서에서 script 요소를 발견하면 해당 요소에 포함된 스크립트를 실행한다. 그러나 사용자 에이전트가 XSLT도 지원한다고 가정할 때, XSLT로 표현된 변환 안에서 해당 요소를 발견하면 프로세서는 대신 script 요소를 변환의 일부를 구성하는 불투명한 요소로 처리한다.

HTML 구문을 지원하는 웹 브라우저는 사용자가 상호작용할 수 있도록 HTML MIME 유형으로 표시된 문서를 이 명세에서 설명한 방식으로 처리해야 한다.

스크립팅을 지원하는 사용자 에이전트는 Web IDL에 설명된 것처럼 이 명세의 IDL 조각을 준수하는 구현이어야 한다. [WEBIDL]

명시적으로 밝히지 않는 한 HTML 요소의 의미를 재정의하는 명세가 해당 요소를 나타내는 DOM 객체의 요구 사항까지 재정의하지는 않는다. 예를 들어 위 예의 script 요소는 여전히 HTMLScriptElement 인터페이스를 구현한다.

비대화형 표현 사용자 에이전트

HTML 및 XML 문서를 비대화형 버전으로 렌더링하기 위해서만 처리하는 사용자 에이전트는 사용자 상호작용에 관한 요구 사항을 제외하고 웹 브라우저와 동일한 적합성 기준을 준수해야 한다.

비대화형 표현 사용자 에이전트의 일반적인 예로는 프린터 (정적 UA)와 오버헤드 디스플레이(동적 UA)가 있다. 대부분의 정적 비대화형 표현 사용자 에이전트는 스크립팅을 지원하지 않는 방식을 선택할 것으로 예상된다.

비대화형이지만 동적인 표현 UA는 여전히 스크립트를 실행하여 폼을 동적으로 제출하는 등의 동작을 허용한다. 그러나 사용자가 문서와 상호작용할 수 없을 때는 "포커스"라는 개념이 관련 없으므로 UA가 포커스 관련 DOM API를 지원할 필요는 없다.

제안된 기본 렌더링을 지원하는 시각적 사용자 에이전트

대화형인지 여부와 관계없이 사용자 에이전트는 이 명세에서 정의한 제안된 기본 렌더링을 지원하는 것으로 지정될 수 있으며, 이는 사용자 옵션일 수도 있다.

이 지원은 필수가 아니다. 특히 제안된 기본 렌더링을 구현하는 사용자 에이전트도 색상 대비를 변경하거나 다른 포커스 스타일을 사용하거나 그 밖의 방식으로 사용자의 접근성과 사용성을 높이기 위해 이 기본값을 재정의하는 설정을 제공하는 것이 권장된다.

제안된 기본 렌더링을 지원하는 것으로 지정된 사용자 에이전트는 지정되어 있는 동안 렌더링 절에서 사용자 에이전트가 구현할 것으로 기대하는 동작으로 정의한 규칙을 구현해야 한다.

스크립팅을 지원하지 않는 사용자 에이전트

스크립팅을 지원하지 않거나 스크립팅 기능이 완전히 비활성화된 구현에는 이 명세에서 언급하는 이벤트 및 DOM 인터페이스를 지원할 의무가 없다. 그러나 이벤트 모델 또는 DOM을 기준으로 정의된 이 명세의 부분에서는 이러한 사용자 에이전트도 이벤트와 DOM이 지원되는 것처럼 동작해야 한다.

스크립팅은 애플리케이션의 필수적인 일부가 될 수 있다. 스크립팅을 지원하지 않거나 스크립팅이 비활성화된 웹 브라우저는 작성자의 의도를 완전히 전달하지 못할 수 있다.

적합성 검사기

적합성 검사기는 문서가 이 명세에서 설명하는 관련 적합성 기준을 준수하는지 확인해야 한다. 자동화된 적합성 검사기는 작성자의 의도를 해석해야 발견할 수 있는 오류를 검출하지 않아도 된다. 예를 들어 blockquote 요소의 콘텐츠가 인용문이 아니면 문서가 부적합하지만, 사람의 판단 없이 실행되는 적합성 검사기가 blockquote 요소에 인용된 자료만 들어 있는지 검사할 필요는 없다.

적합성 검사기는 입력 문서를 브라우징 컨텍스트 없이 파싱했을 때 적합한지 검사해야 한다. 이는 스크립트가 실행되지 않고 파서의 스크립팅 모드비활성화됨을 의미한다. 또한 스크립트가 실행되는 브라우징 컨텍스트에서 파싱했을 때도 입력 문서가 적합한지, 그리고 스크립트 실행 자체 중의 일시적인 상태를 제외하면 스크립트가 부적합한 상태를 발생시키지 않는지도 검사해야 한다. (이 요구 사항이 "MUST"가 아니라 "SHOULD"인 이유는 이를 수행하는 것이 불가능하다고 증명되었기 때문이다. [COMPUTABLE])

"HTML 유효성 검사기"라는 용어는 이 명세의 관련 요구 사항을 자체적으로 준수하는 적합성 검사기를 가리키는 데 사용할 수 있다.

XML DTD는 이 명세의 모든 적합성 요구 사항을 표현할 수 없다. 따라서 유효성 검사 XML 프로세서와 DTD만으로는 적합성 검사기를 구성할 수 없다. 또한 이 명세에서 정의한 두 저작 형식 모두 SGML 애플리케이션이 아니므로 유효성 검사 SGML 시스템도 적합성 검사기를 구성할 수 없다.

다시 말하면 적합성 기준에는 세 가지 유형이 있다.

  1. DTD로 표현할 수 있는 기준.
  2. DTD로 표현할 수 없지만 시스템에서 검사할 수 있는 기준.
  3. 사람만 검사할 수 있는 기준.

적합성 검사기는 처음 두 유형을 검사해야 한다. 단순한 DTD 기반 유효성 검사기는 첫 번째 유형의 오류만 검사하므로 이 명세에 따른 적합성 검사기가 아니다.

데이터 마이닝 도구

문서를 렌더링하거나 적합성을 검사하는 목적 이외의 이유로 HTML 및 XML 문서를 처리하는 애플리케이션과 도구는 처리하는 문서의 의미에 따라 동작해야 한다.

문서 개요를 생성하지만 각 문단마다 중첩 수준을 높이고 제목에서는 중첩 수준을 높이지 않는 도구는 적합하지 않다.

저작 도구 및 마크업 생성기

저작 도구와 마크업 생성기는 적합한 문서를 생성해야 한다. 작성자에게 적용되는 적합성 기준은 적절한 경우 저작 도구에도 적용된다.

저작 도구는 작성자의 의도를 아직 판단할 수 없는 범위에서만 요소를 지정된 목적으로만 사용해야 한다는 엄격한 요구 사항의 적용을 받지 않는다. 그러나 저작 도구가 자동으로 요소를 오용하거나 사용자의 오용을 유도해서는 안 된다.

예를 들어 임의의 연락처 정보에 address 요소를 사용하는 것은 적합하지 않다. 이 요소는 가장 가까운 article 또는 body 요소 조상의 연락처 정보를 마크업하는 데만 사용할 수 있다. 그러나 저작 도구는 이러한 차이를 판단할 수 없는 경우가 많으므로 해당 요구 사항의 적용을 받지 않는다. 그렇다고 해서 저작 도구가 임의의 기울임꼴 텍스트 블록에 address 요소를 사용할 수 있다는 뜻은 아니다. 단지 사용자가 article 요소의 연락처 정보를 삽입하는 도구를 사용할 때 실제로 연락처 정보를 삽입하는지 아니면 다른 내용을 삽입하는지 저작 도구가 확인할 필요가 없다는 뜻이다.

적합성 검사 측면에서 편집기는 적합성 검사기가 확인할 수 있는 정도와 동일한 수준으로 적합한 문서를 출력해야 한다.

저작 도구를 사용하여 부적합한 문서를 편집하는 경우, 편집 세션 중 편집하지 않은 문서 구획의 적합성 오류를 유지할 수 있다. 즉 편집 도구는 오류가 있는 콘텐츠를 왕복 처리할 수 있다. 그러나 오류를 그대로 유지한 경우 저작 도구는 출력이 적합하다고 주장해서는 안 된다.

저작 도구에는 구조 또는 의미 데이터에서 작업하는 도구와 보이는 그대로 결과를 얻는 미디어별 편집 방식(WYSIWYG)으로 작업하는 도구라는 두 가지 주요 유형이 있을 것으로 예상된다.

소스 정보의 구조를 사용하면 어떤 HTML 요소와 속성이 가장 적합한지 근거 있게 선택할 수 있으므로, HTML을 저작하는 도구에는 전자의 방식이 권장된다.

그러나 WYSIWYG 도구도 유효한 방식이다. WYSIWYG 도구는 적합하다고 알고 있는 요소를 사용해야 하며, 적합한지 알 수 없는 요소를 사용해서는 안 된다. 일부 극단적인 경우에는 흐름 요소의 사용을 몇 개의 요소로 제한해야 할 수도 있다. 예를 들면 div, b, ispan 요소만 사용하고 style 속성을 광범위하게 사용해야 할 수 있다.

WYSIWYG 여부와 관계없이 모든 저작 도구는 사용자가 잘 구조화되고 의미가 풍부하며 미디어에 독립적인 콘텐츠를 만들 수 있도록 최선을 다해야 한다.

기존 콘텐츠 및 이전 명세와의 호환성을 위해 이 명세에서는 두 가지 저작 형식을 설명한다. 하나는 XML을 기반으로 하며, 다른 하나는 SGML에서 영감을 받은 사용자 정의 형식 (HTML 구문이라고 함)을 사용한다. 구현은 이 두 형식 중 적어도 하나를 지원해야 하며, 둘 다 지원하는 것이 권장된다.

일부 적합성 요구 사항은 요소, 속성, 메서드 또는 객체에 대한 요구 사항으로 표현한다. 이러한 요구 사항은 콘텐츠 모델 제한을 설명하는 요구 사항과 구현 동작을 설명하는 요구 사항이라는 두 범주로 나뉜다. 전자는 문서와 저작 도구에 대한 요구 사항이며, 후자는 사용자 에이전트에 대한 요구 사항이다. 마찬가지로 일부 적합성 요구 사항은 작성자에 대한 요구 사항으로 표현한다. 이러한 요구 사항은 작성자가 생성하는 문서에 대한 적합성 요구 사항으로 해석해야 한다. (다시 말해 이 명세는 작성자에 대한 적합성 기준과 문서에 대한 적합성 기준을 구분하지 않는다.)

2.1.9 의존성

이 명세는 여러 다른 기반 명세에 의존한다.

Infra

다음 용어는 Infra에 정의되어 있다. [INFRA]

Unicode 및 Encoding

Unicode 문자 집합은 텍스트 데이터를 표현하는 데 사용되며, Encoding문자 인코딩에 관한 요구 사항을 정의한다. [UNICODE]

앞에서 설명한 것처럼 이 명세는 해당 명세에서 정의한 용어를 바탕으로 용어를 도입한다.

다음 용어는 Encoding에 정의된 의미로 사용한다. [ENCODING]

  • 인코딩 가져오기
  • 출력 인코딩 가져오기
  • 바이트 스트림과 인코딩을 받아 문자 스트림을 반환하는 일반 디코딩 알고리즘
  • 바이트 스트림을 받아 문자 스트림을 반환하며, 선행 UTF-8 바이트 순서 표시(BOM)가 있으면 하나를 추가로 제거하는 UTF-8 디코딩 알고리즘
  • UTF-8 디코딩과 동일하지만 선행 UTF-8 바이트 순서 표시(BOM)를 제거하지 않는 BOM 없는 UTF-8 디코딩 알고리즘
  • 문자 스트림과 인코딩을 받아 바이트 스트림을 반환하는 인코딩 알고리즘
  • 문자 스트림을 받아 바이트 스트림을 반환하는 UTF-8 인코딩 알고리즘
  • 바이트 스트림을 받아 인코딩 또는 null을 반환하는 BOM 스니핑 알고리즘.
XML 및 관련 명세

HTML용 XML 구문을 지원하는 구현은 해당 구문이 네임스페이스를 포함하는 XML 직렬화를 사용하므로 일부 버전의 XML과 이에 대응하는 네임스페이스 명세를 지원해야 한다. [XML] [XMLNS]

스크립트를 실행하거나 CSS 또는 XPath 표현식을 평가하거나 결과 DOM을 임의의 콘텐츠에 노출하지 않고 콘텐츠를 처리하는 데이터 마이닝 도구 및 기타 사용자 에이전트는 네임스페이스 문자열을 실제로 노출하지 않고 DOM 노드에 대응하는 항목이 특정 네임스페이스에 있다고 선언하는 것만으로 "네임스페이스를 지원"할 수 있다.

HTML 구문에서는 네임스페이스 접두사와 네임스페이스 선언이 XML에서와 동일한 효과를 갖지 않는다. 예를 들어 HTML 요소 이름에서 콜론에는 특별한 의미가 없다.


XML 네임스페이스에 있는 space라는 이름의 속성은 확장 가능한 마크업 언어(XML)에 정의되어 있다. [XML]

Name 생성 규칙은 XML에 정의되어 있다. [XML]

이 명세에서는 XML 문서에 스타일시트 연결하기에 정의된 <?xml-stylesheet?> 처리 명령도 참조한다. [XMLSSPI]

이 명세에서는 비규범적으로 XSLTProcessor 인터페이스와 해당 인터페이스의 transformToFragment()transformToDocument() 메서드도 언급한다. [XSLTP]

URL

다음 용어는 URL에 정의되어 있다. [URL]

이 명세에서는 여러 스킴과 프로토콜도 참조한다.

미디어 프래그먼트 구문미디어 프래그먼트 URI에 정의되어 있다. [MEDIAFRAG]

URL Pattern

다음 용어는 URL Pattern에 정의되어 있다. [URLPATTERN]

HTTP 및 관련 명세

다음 용어는 HTTP 명세에 정의되어 있다. [HTTP]

다음 용어는 HTTP 상태 관리 메커니즘에 정의되어 있다. [COOKIES]

다음 용어는 웹 링크에 정의되어 있다. [WEBLINK]

다음 용어는 HTTP용 구조화된 필드 값에 정의되어 있다. [STRUCTURED-FIELDS]

다음 용어는 MIME 스니핑에 정의되어 있다. [MIMESNIFF]

Fetch

다음 용어는 Fetch에 정의되어 있다. [FETCH]

다음 용어는 Referrer Policy에 정의되어 있다. [REFERRERPOLICY]

다음 용어는 Mixed Content에 정의되어 있다. [MIX]

다음 용어는 Subresource Integrity에 정의되어 있다. [SRI]

No-Vary-Search HTTP 응답 헤더 필드

다음 용어는 No-Vary-Search HTTP 응답 헤더 필드에 정의되어 있다. [NOVARYSEARCH]

페인트 타이밍

다음 용어는 페인트 타이밍에 정의되어 있다. [PAINTTIMING]

내비게이션 타이밍

다음 용어는 내비게이션 타이밍에 정의되어 있다. [NAVIGATIONTIMING]

리소스 타이밍

다음 용어는 리소스 타이밍에 정의되어 있다. [RESOURCETIMING]

성능 타임라인

다음 용어는 성능 타임라인에 정의되어 있다. [PERFORMANCETIMELINE]

긴 애니메이션 프레임

다음 용어는 긴 애니메이션 프레임에 정의되어 있다. [LONGANIMATIONFRAMES]

긴 태스크

다음 용어는 긴 태스크에 정의되어 있다. [LONGTASKS]

Web IDL

이 명세의 IDL 조각은 Web IDL에 설명된 적합한 IDL 조각의 요구 사항에 따라 해석해야 한다. [WEBIDL]

다음 용어는 Web IDL에 정의되어 있다.

Web IDL은 이 명세에서 사용하는 다음 유형도 정의한다.

이 명세에서 던지기라는 용어는 Web IDL에 정의된 의미로 사용한다. DOMException 유형과 다음 예외 이름은 Web IDL에 정의되어 있으며 이 명세에서 사용한다.

이 명세에서 사용자 에이전트가 특정 시간을 나타내는 Date 객체를 생성해야 하는 경우 (이 시간은 특수 값 Not-a-Number일 수 있음), 해당 시간의 밀리초 구성요소가 있으면 정수로 잘라내야 하며 새로 생성된 Date 객체의 시간 값은 잘라낸 결과 시간을 나타내야 한다.

예를 들어 2000년 1월 1일 01:00 UTC에서 23045백만분의 1초가 지난 시간, 즉 2000-01-01T00:00:00.023045Z가 주어지면 해당 시간을 나타내도록 생성된 Date 객체는 45백만분의 1초 앞선 2000-01-01T00:00:00.023Z를 나타내도록 생성된 객체와 동일한 시간을 나타낸다. 주어진 시간이 NaN이면 결과는 시간 값 NaN을 나타내는 Date 객체이다(이는 객체가 특정 시점을 나타내지 않음을 의미한다).

JavaScript

이 명세에서 설명하는 언어의 일부는 기반 스크립팅 언어로 JavaScript만 지원한다. [JAVASCRIPT]

"JavaScript"라는 용어가 공식 명칭인 ECMAScript 대신 사용되는 이유는 JavaScript라는 용어가 더 널리 알려져 있기 때문이다.

다음 용어는 JavaScript 명세에 정의되어 있으며 이 명세에서 사용한다.

JavaScript를 지원하는 사용자 에이전트는 Dynamic Code Brand Checks 제안도 구현해야 한다. 다음 용어는 해당 제안에 정의되어 있으며 이 명세에서 사용한다. [JSDYNAMICCODEBRANDCHECKS]

JavaScript를 지원하는 사용자 에이전트는 Import Text 제안도 구현해야 한다. 다음 용어는 해당 제안에 정의되어 있으며 이 명세에서 사용한다. [JSIMPORTTEXT]

JavaScript를 지원하는 사용자 에이전트는 ECMAScript 국제화 API도 구현해야 한다. [JSINTL]

JavaScript를 지원하는 사용자 에이전트는 Temporal 제안도 구현해야 한다. 다음 용어는 해당 제안에 정의되어 있으며 이 명세에서 사용한다. [JSTEMPORAL]

WebAssembly

다음 용어는 WebAssembly JavaScript Interface에 정의되어 있다. [WASMJS]

DOM

문서 객체 모델(DOM)은 문서와 그 콘텐츠를 표현한 것, 즉 모델이다. DOM은 단순한 API가 아니다. 이 명세에서는 HTML 구현의 적합성 기준을 DOM에 대한 연산으로 정의한다. [DOM]

이 명세는 DOM을 기준으로 정의되어 있으며 일부 기능은 DOM 인터페이스의 확장으로 정의되므로, 구현은 DOM과 UI Events에 정의된 이벤트를 지원해야 한다. [DOM] [UIEVENTS]

특히 다음 기능은 DOM에 정의되어 있다. [DOM]

다음 기능은 UI Events에 정의되어 있다. [UIEVENTS]

다음 기능은 Touch Events에 정의되어 있다. [TOUCH]

다음 기능은 Pointer Events에 정의되어 있다. [POINTEREVENTS]

다음 이벤트는 Clipboard API and events에 정의되어 있다. [CLIPBOARD-APIS]

이 명세에서는 이벤트의 유형을 가리키는 데 이름이라는 용어를 사용할 때가 있다. 예를 들어 "click이라는 이름의 이벤트" 또는 "이벤트 이름이 keypress인 경우"와 같이 사용한다. 이벤트에 대한 "이름"과 "유형"이라는 용어는 동의어이다.

다음 기능은 DOM Parsing and Serialization에 정의되어 있다. [DOMPARSING]

다음 기능은 Selection API에 정의되어 있다. [SELECTION]

사용자 에이전트는 execCommand에 설명된 기능을 구현하는 것이 권장된다. [EXECCOMMAND]

다음 기능은 Fullscreen API에 정의되어 있다. [FULLSCREEN]

High Resolution Time은 다음 기능을 제공한다. [HRT]

File API

이 명세에서는 File API에 정의된 다음 기능을 사용한다. [FILEAPI]

Indexed Database API

다음 용어는 Indexed Database API에 정의되어 있다. [INDEXEDDB]

Media Source Extensions

다음 용어는 Media Source Extensions에 정의되어 있다. [MEDIASOURCE]

Media Capture and Streams

다음 용어는 Media Capture and Streams에 정의되어 있다. [MEDIASTREAM]

Reporting

다음 용어는 Reporting에 정의되어 있다. [REPORTING]

XMLHttpRequest

다음 기능과 용어는 XMLHttpRequest에 정의되어 있다. [XHR]

배터리 상태

다음 기능은 Battery Status API에 정의되어 있다. [BATTERY]

미디어 쿼리

구현은 미디어 쿼리를 지원해야 한다. <media-condition> 기능은 해당 명세에 정의되어 있다. [MQ]

CSS 모듈

이 명세의 구현이 CSS 전체를 지원해야 하는 것은 아니지만 (적어도 웹 브라우저에는 권장됨), 일부 기능은 특정 CSS 요구 사항을 기준으로 정의되어 있다.

이 명세에서 어떤 항목을 특정 CSS 문법에 따라 파싱하도록 요구하는 경우, 오류 처리 규칙을 포함하여 CSS 구문의 관련 알고리즘을 따라야 한다. [CSSSYNTAX]

예를 들어 사용자 에이전트는 스타일시트의 끝을 예기치 않게 발견하면 열려 있는 모든 구문을 닫아야 한다. 따라서 색상 값으로 "rgb(0,0,0" 문자열을 파싱할 때(닫는 괄호가 누락됨), 이 오류 처리 규칙에 따라 닫는 괄호가 암시되며 값, 즉 '검은색'이 얻어진다. 그러나 유사한 구문인 "rgb(0,0,"은(괄호와 "blue" 값이 모두 누락됨) 열려 있는 구문을 닫아도 유효한 값이 만들어지지 않으므로 파싱할 수 없다.

다음 용어와 기능은 종속형 스타일시트 (CSS)에 정의되어 있다. [CSS]

'display' 프로퍼티의 기본 버전은 CSS에 정의되어 있으며, 이 프로퍼티는 다른 CSS 모듈에서 확장된다. [CSS] [CSSRUBY] [CSSTABLE]

다음 용어와 기능은 CSS 박스 모델에 정의되어 있다. [CSSBOX]

다음 기능은 CSS 논리적 프로퍼티에 정의되어 있다. [CSSLOGICAL]

다음 용어와 기능은 CSS 색상에 정의되어 있다. [CSSCOLOR]

다음 용어는 CSS 이미지에 정의되어 있다. [CSSIMAGES]

페인트 소스라는 용어는 특정 HTML 요소와 CSS 'element()' 함수의 상호작용을 정의하기 위해 CSS Images Level 4에 정의된 의미로 사용한다. [CSSIMAGES4]

다음 기능은 CSS 배경 및 테두리에 정의되어 있다. [CSSBG]

CSS 배경 및 테두리는 다음 테두리 프로퍼티도 정의한다. [CSSBG]

테두리 프로퍼티
아래 왼쪽 오른쪽
너비 'border-top-width' 'border-bottom-width' 'border-left-width' 'border-right-width'
스타일 'border-top-style' 'border-bottom-style' 'border-left-style' 'border-right-style'
색상 'border-top-color' 'border-bottom-color' 'border-left-color' 'border-right-color'

다음 기능은 CSS 박스 정렬에 정의되어 있다. [CSSALIGN]

다음 용어와 기능은 CSS 디스플레이에 정의되어 있다. [CSSDISPLAY]

다음 기능은 CSS 플렉시블 박스 레이아웃에 정의되어 있다. [CSSFLEXBOX]

다음 용어와 기능은 CSS 글꼴에 정의되어 있다. [CSSFONTS]

다음 기능은 CSS 폼에 정의되어 있다. [CSSFORMS]

다음 기능은 CSS 간격에 정의되어 있다. [CSSGAPS]

다음 기능은 CSS 그리드 레이아웃에 정의되어 있다. [CSSGRID]

다음 용어는 CSS 인라인 레이아웃에 정의되어 있다. [CSSINLINE]

다음 용어와 기능은 CSS 박스 크기 결정에 정의되어 있다. [CSSSIZING]

다음 기능은 CSS 리스트 및 카운터에 정의되어 있다. [CSSLISTS]

다음 기능은 CSS 오버플로에 정의되어 있다. [CSSOVERFLOW]

다음 용어와 기능은 CSS 위치 지정 레이아웃에 정의되어 있다. [CSSPOSITION]

다음 기능은 CSS 다단 레이아웃에 정의되어 있다. [CSSMULTICOL]

'display' 프로퍼티의 'ruby-base' 값은 CSS 루비 레이아웃에 정의되어 있다. [CSSRUBY]

다음 기능은 CSS 표에 정의되어 있다. [CSSTABLE]

다음 기능은 CSS 텍스트에 정의되어 있다. [CSSTEXT]

다음 기능은 CSS 쓰기 모드에 정의되어 있다. [CSSWM]

다음 기능은 CSS 기본 사용자 인터페이스에 정의되어 있다. [CSSUI]

애니메이션 업데이트 및 이벤트 전송 알고리즘은 웹 애니메이션에 정의되어 있다. [WEBANIMATIONS]

스크립팅을 지원하는 구현은 CSS 객체 모델을 지원해야 한다. 다음 기능과 용어는 CSSOM 명세에 정의되어 있다. [CSSOM] [CSSOMVIEW]

다음 기능과 용어는 CSS 구문에 정의되어 있다. [CSSSYNTAX]

다음 용어는 선택자에 정의되어 있다. [SELECTORS]

다음 기능은 CSS 값 및 단위에 정의되어 있다. [CSSVALUES]

다음 기능은 CSS 뷰 전환에 정의되어 있다. [CSSVIEWTRANSITIONS]

스타일 속성이라는 용어는 CSS 스타일 속성에 정의되어 있다. [CSSATTR]

다음 용어는 CSS 캐스케이딩 및 상속에 정의되어 있다. [CSSCASCADE]

CanvasRenderingContext2D 객체의 글꼴 사용은 CSS 글꼴글꼴 로딩 명세에 설명된 기능, 특히 FontFace 객체와 글꼴 소스 개념에 의존한다. [CSSFONTS] [CSSFONTLOAD]

다음 인터페이스와 용어는 기하 인터페이스에 정의되어 있다. [GEOMETRY]

다음 용어는 CSS 범위 지정에 정의되어 있다. [CSSSCOPING]

다음 용어와 기능은 CSS 색상 조정에 정의되어 있다. [CSSCOLORADJUST]

다음 용어는 CSS 의사 요소에 정의되어 있다. [CSSPSEUDO]

다음 용어는 CSS 컨테인먼트에 정의되어 있다. [CSSCONTAIN]

다음 용어는 CSS 앵커 위치 지정에 정의되어 있다. [CSSANCHOR]

교차 관찰자

다음 용어는 교차 관찰자에 정의되어 있다. [INTERSECTIONOBSERVER]

크기 조정 관찰자

다음 용어는 크기 조정 관찰자에 정의되어 있다. [RESIZEOBSERVER]

WebGL

다음 인터페이스는 WebGL 명세에 정의되어 있다. [WEBGL]

WebGPU

다음 인터페이스는 WebGPU에 정의되어 있다. [WEBGPU]

WebVTT

구현은 미디어 리소스의 자막, 캡션, 메타데이터 등을 위한 텍스트 트랙 형식으로 WebVTT를 지원할 수 있다. [WEBVTT]

이 명세에서 사용하는 다음 용어는 WebVTT에 정의되어 있다.

ARIA

role 속성과 다음 역할은 접근 가능한 리치 인터넷 애플리케이션(ARIA)에 정의되어 있다. [ARIA]

또한 다음 aria-* 콘텐츠 속성은 ARIA에 정의되어 있다. [ARIA]

마지막으로 다음 용어는 ARIA에 정의되어 있다. [ARIA]

콘텐츠 보안 정책

다음 용어는 콘텐츠 보안 정책에 정의되어 있다. [CSP]

서비스 워커

다음 용어는 서비스 워커에 정의되어 있다. [SW]

보안 컨텍스트

다음 알고리즘은 보안 컨텍스트에 정의되어 있다. [SECURE-CONTEXTS]

권한 정책

다음 용어는 권한 정책에 정의되어 있다. [PERMISSIONSPOLICY]

결제 요청 API

다음 기능은 결제 요청 API에 정의되어 있다. [PAYMENTREQUEST]

MathML

이 명세에서 MathML 전체를 지원하도록 요구하지는 않지만 (적어도 웹 브라우저에는 권장됨), 일부 기능은 MathML의 일부가 구현되어 있어야 한다. [MATHML]

다음 기능은 수학 마크업 언어 (MathML)에 정의되어 있다.

SVG

이 명세에서 SVG 전체를 지원하도록 요구하지는 않지만 (적어도 웹 브라우저에는 권장됨), 일부 기능은 SVG의 일부가 구현되어 있어야 한다.

SVG를 구현하는 사용자 에이전트는 이전 개정판이 아니라 SVG 2 명세를 구현해야 한다.

다음 기능은 SVG 2 명세에 정의되어 있다. [SVG]

필터 효과

다음 기능은 필터 효과에 정의되어 있다. [FILTERS]

합성

다음 기능은 합성 및 블렌딩에 정의되어 있다. [COMPOSITE]

백그라운드 태스크의 협력적 스케줄링

다음 기능은 백그라운드 태스크의 협력적 스케줄링에 정의되어 있다. [REQUESTIDLECALLBACK]

화면 방향

다음 용어는 화면 방향에 정의되어 있다. [SCREENORIENTATION]

스토리지

다음 용어는 스토리지에 정의되어 있다. [STORAGE]

웹 앱 매니페스트

다음 기능은 웹 앱 매니페스트에 정의되어 있다. [MANIFEST]

WebAssembly JavaScript 인터페이스: ESM 통합

다음 용어는 WebAssembly JavaScript 인터페이스: ESM 통합에 정의되어 있다. [WASMESM]

WebCodecs

다음 기능은 WebCodecs에 정의되어 있다. [WEBCODECS]

WebDriver

다음 용어는 WebDriver에 정의되어 있다. [WEBDRIVER]

WebDriver BiDi

다음 용어는 WebDriver BiDi에 정의되어 있다. [WEBDRIVERBIDI]

웹 암호화 API

다음 용어는 웹 암호화 API에 정의되어 있다. [WEBCRYPTO]

WebSocket

다음 용어는 WebSocket에 정의되어 있다. [WEBSOCKETS]

WebTransport

다음 용어는 WebTransport에 정의되어 있다. [WEBTRANSPORT]

웹 인증: 공개 키 자격 증명 접근 API

다음 용어는 웹 인증: 공개 키 자격 증명 접근 API에 정의되어 있다. [WEBAUTHN]

자격 증명 관리

다음 용어는 자격 증명 관리에 정의되어 있다. [CREDMAN]

콘솔

다음 용어는 콘솔에 정의되어 있다. [CONSOLE]

Web Locks API

다음 용어는 Web Locks API에 정의되어 있다. [WEBLOCKS]

신뢰할 수 있는 유형

이 명세에서는 신뢰할 수 있는 유형에 정의된 다음 기능을 사용한다. [TRUSTED-TYPES]

WebRTC API

다음 용어는 WebRTC API에 정의되어 있다. [WEBRTC]

화면 속 화면 API

다음 용어는 화면 속 화면 API에 정의되어 있다. [PICTUREINPICTURE]

유휴 감지 API

다음 용어는 유휴 감지 API에 정의되어 있다.

웹 음성 API

다음 용어는 웹 음성 API에 정의되어 있다.

WebOTP API

다음 용어는 WebOTP API에 정의되어 있다.

웹 공유 API

다음 용어는 웹 공유 API에 정의되어 있다.

웹 스마트 카드 API

다음 용어는 웹 스마트 카드 API에 정의되어 있다.

웹 백그라운드 동기화

다음 용어는 웹 백그라운드 동기화에 정의되어 있다.

웹 주기적 백그라운드 동기화

다음 용어는 웹 주기적 백그라운드 동기화에 정의되어 있다.

웹 백그라운드 Fetch

다음 용어는 백그라운드 Fetch에 정의되어 있다.

키보드 잠금

다음 용어는 키보드 잠금에 정의되어 있다.

웹 MIDI API

다음 용어는 웹 MIDI API에 정의되어 있다.

범용 센서 API

다음 용어는 범용 센서 API에 정의되어 있다.

WebHID API

다음 용어는 WebHID API에 정의되어 있다.

WebXR 기기 API

다음 용어는 WebXR 기기 API에 정의되어 있다.


이 명세는 위 목록에서 요구하는 항목을 제외하고 특정 네트워크 프로토콜, 스타일시트 언어, 스크립팅 언어 또는 DOM 명세에 대한 지원을 요구하지 않는다. 그러나 이 명세에서 설명하는 언어는 스타일 지정 언어로 CSS, 스크립팅 언어로 JavaScript, 네트워크 프로토콜로 HTTP를 사용하는 방향으로 편향되어 있으며, 여러 기능은 이러한 언어와 프로토콜이 사용되고 있다고 가정한다.

HTTP 프로토콜을 구현하는 사용자 에이전트는 HTTP 상태 관리 메커니즘(쿠키)도 구현해야 한다. [HTTP] [COOKIES]

이 명세는 각 관련 절에서 문자 인코딩, 이미지 형식, 오디오 형식 및 비디오 형식에 대한 특정 추가 요구 사항을 규정할 수 있다.

2.1.10 확장성

이 명세에 대한 공급업체별 독점 사용자 에이전트 확장은 강력히 권장되지 않는다. 문서는 그러한 확장을 사용해서는 안 된다. 그러한 확장을 사용하면 상호운용성이 저하되고 사용자 기반이 분열되어 특정 사용자 에이전트의 사용자만 해당 콘텐츠에 접근할 수 있게 되기 때문이다.

모든 확장은 확장의 사용이 이 명세에 정의된 기능과 모순되거나 해당 기능을 부적합하게 만들지 않도록 정의되어야 한다.

예를 들어, 그렇게 하는 것은 강력히 권장되지 않지만 구현은 사용자가 컨트롤의 현재 값을 선택하는 데 걸린 시간을 반환하는 새로운 IDL 속성 "typeTime"을 컨트롤에 추가할 수 있다. 반면 폼의 elements 배열에 나타나는 새로운 컨트롤을 정의하는 것은 위 요구 사항을 위반한다. 이는 이 명세에 제시된 elements의 정의를 위반하기 때문이다.


이 명세에 대한 공급업체 중립적 확장이 필요한 경우, 이 명세를 그에 맞게 업데이트하거나 이 명세의 요구 사항을 재정의하는 확장 명세를 작성할 수 있다. 이 명세를 자신의 활동에 적용하는 사람이 그러한 확장 명세의 요구 사항을 인정하기로 결정하면, 해당 확장 명세는 이 명세의 적합성 요구 사항을 위한 적용 가능한 명세가 된다.

누군가는 임의의 바이트 스트림을 적합한 것으로 정의하는 명세를 작성한 다음 자신의 무작위 쓰레기가 적합하다고 주장할 수 있다. 그러나 그렇다고 해서 그 무작위 쓰레기가 모든 사람의 목적에 실제로 적합한 것은 아니다. 다른 사람이 해당 명세가 자신의 작업에는 적용되지 않는다고 판단한다면, 앞서 언급한 무작위 쓰레기는 말 그대로 쓰레기이며 전혀 적합하지 않다고 정당하게 말할 수 있다. 적합성과 관련하여 특정 공동체에서 중요한 것은 그 공동체가 무엇을 적용 가능하다고 합의하는지이다.


사용자 에이전트는 이해하지 못하는 요소와 속성을 의미론적으로 중립적인 것으로 처리해야 한다. 즉, DOM 처리기의 경우 이를 DOM에 남겨 두고 CSS 처리기의 경우 CSS에 따라 스타일을 지정하되, 그로부터 어떠한 의미도 추론해서는 안 된다.

기능 지원이 비활성화된 경우(예: 보안 문제를 완화하기 위한 긴급 조치, 개발 지원 또는 성능상의 이유), 사용자 에이전트는 해당 기능을 전혀 지원하지 않으며 해당 기능이 이 명세에 언급되지 않은 것처럼 동작해야 한다. 예를 들어 특정 기능에 Web IDL 인터페이스의 속성을 통해 접근하는 경우, 해당 인터페이스를 구현하는 객체에서 그 속성 자체가 생략되어야 한다. 객체에 속성을 남겨 두되 null을 반환하거나 예외를 던지게 하는 것만으로는 충분하지 않다.

2.1.11 XPath 및 XSLT와의 상호작용

이 명세에 설명된 방식으로 파싱되거나 생성된 HTML 문서에서 작동하는 XPath 1.0 구현(예: document.evaluate() API의 일부)은 다음 편집 사항이 XPath 1.0 명세에 적용된 것처럼 동작해야 한다.

먼저 다음 단락을 제거한다.

노드 테스트의 QName은 표현식 컨텍스트의 네임스페이스 선언을 사용하여 확장된 이름으로 확장된다. 이는 시작 태그와 종료 태그의 요소 유형 이름을 확장하는 방식과 같지만, xmlns로 선언된 기본 네임스페이스는 사용하지 않는다. 즉, QName에 접두사가 없으면 네임스페이스 URI는 null이다(이는 속성 이름을 확장하는 방식과 같다). QName에 표현식 컨텍스트에 네임스페이스 선언이 없는 접두사가 있으면 오류이다.

그런 다음 그 자리에 다음 내용을 삽입한다.

노드 테스트의 QName은 표현식 컨텍스트의 네임스페이스 선언을 사용하여 확장된 이름으로 확장된다. QName에 접두사가 있는 경우 표현식 컨텍스트에 해당 접두사에 대한 네임스페이스 선언이 있어야 하며, 해당 네임스페이스 URI가 그 접두사와 연결된다. QName에 표현식 컨텍스트에 네임스페이스 선언이 없는 접두사가 있으면 오류이다.

QName에 접두사가 없고 축의 주 노드 유형이 요소인 경우 기본 요소 네임스페이스가 사용된다. 그렇지 않고 QName에 접두사가 없으면 네임스페이스 URI는 null이다. 기본 요소 네임스페이스는 XPath 표현식 컨텍스트의 구성원이다. DOM3 XPath API를 통해 XPath 표현식을 실행할 때 기본 요소 네임스페이스의 값은 다음과 같이 결정된다.

  1. 컨텍스트 노드가 HTML DOM에서 온 경우 기본 요소 네임스페이스는 "http://www.w3.org/1999/xhtml"이다.
  2. 그렇지 않으면 기본 요소 네임스페이스 URI는 null이다.

이는 XPath 2.0의 기본 요소 네임스페이스 기능을 XPath 1.0에 추가하고 HTML 문서의 기본 요소 네임스페이스로 HTML 네임스페이스를 사용하는 것과 같다. 이는 구현이 레거시 HTML 콘텐츠와 호환되면서도 HTML 요소에 사용되는 네임스페이스와 관련하여 이 명세가 HTML에 도입하는 변경 사항을 지원하도록 하려는 목적과 XPath 2.0 대신 XPath 1.0을 사용하려는 목적에서 비롯된다.

이 변경은 XPath 1.0 명세에 대한 의도적 위반이며, 구현이 레거시 콘텐츠와 호환되면서도 HTML 요소에 어떤 네임스페이스가 사용되는지에 관해 이 명세가 HTML에 도입하는 변경 사항을 지원하도록 하기 위한 것이다. [XPATH10]


출력 메서드가 "html"인 경우(명시적으로 지정되거나 XSLT 1.0의 기본 규칙을 통해 지정된 경우) DOM으로 출력하는 XSLT 1.0 처리기는 다음과 같은 영향을 받는다.

변환 프로그램이 네임스페이스가 없는 요소를 출력하는 경우, 처리기는 해당 DOM 요소 노드를 구성하기 전에 요소의 네임스페이스를 HTML 네임스페이스로 변경하고, 요소의 로컬 이름을 ASCII 소문자로 변환하며, 요소의 네임스페이스가 없는 모든 속성 이름도 ASCII 소문자로 변환해야 한다.

이 요구 사항은 XSLT 1.0 명세에 대한 의도적 위반이다. 이 명세가 HTML의 네임스페이스 및 대소문자 구분 규칙을 DOM 기반 XSLT 변환과 호환되지 않는 방식으로 변경하기 때문에 이 요구 사항이 필요하다. (출력을 직렬화하는 처리기는 영향을 받지 않는다.) [XSLT10]


이 명세는 XSLT 처리가 HTML 파서 인프라와 정확히 어떻게 상호작용하는지 명시하지 않는다(예: XSLT 처리기가 요소를 열린 요소 스택에 넣는 것처럼 동작하는지 여부). 그러나 XSLT 처리기는 성공적으로 완료되면 파싱을 중지해야 하며, 중단된 경우 먼저 "interactive"로, 그다음 "complete"로 현재 문서 준비 상태를 업데이트해야 한다.


이 명세는 XSLT가 내비게이션 알고리즘과 어떻게 상호작용하는지, 이벤트 루프에 어떻게 통합되는지 또는 오류 페이지를 어떻게 처리해야 하는지(예: XSLT 오류가 점진적 XSLT 출력을 대체하는지, 인라인으로 렌더링되는지 등)를 명시하지 않는다.

XSLT와 HTML의 상호작용에 관한 추가 비규범적 설명은 script 요소 절에 있으며, XSLT, XPath 및 HTML의 상호작용에 관한 추가 비규범적 설명은 template 요소 절에 있다.

2.2 정책 제어 기능

Headers/Permissions-Policy/document-domain

하나의 엔진에서만 지원됨.

Firefox🔰 74+Safari아니요Chrome🔰 88+
Opera?Edge🔰 88+
Edge (레거시)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android아니요WebView Android?Samsung Internet?Opera Android?

이 문서는 다음 정책 제어 기능을 정의한다.

Headers/Feature-Policy/autoplay

Firefox🔰 74+Safari아니요Chrome64+
Opera?Edge79+
Edge (레거시)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Headers/Permissions-Policy/autoplay

하나의 엔진에서만 지원됨.

Firefox🔰 74+Safari아니요Chrome88+
Opera?Edge88+
Edge (레거시)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

2.3 공통 마이크로구문

HTML에는 날짜나 숫자와 같은 특정 데이터 유형을 허용하는 여러 부분이 있다. 이 절에서는 이러한 형식의 콘텐츠에 대한 적합성 기준과 이를 파싱하는 방법을 설명한다.

구현자는 아래에서 설명하는 구문을 파싱하기 위해 사용을 고려하는 모든 서드파티 라이브러리를 신중히 검토할 것이 강력히 권고된다. 예를 들어 날짜 라이브러리는 이 명세에서 요구하는 것과 다른 오류 처리 동작을 구현할 가능성이 높다. 이 명세에서 사용하는 것과 유사한 날짜 구문을 설명하는 명세에서는 오류 처리 동작이 정의되지 않는 경우가 많으므로, 구현마다 오류를 처리하는 방식이 크게 달라지는 경향이 있기 때문이다.

2.3.1 공통 파서 관용구

아래에서 설명하는 일부 마이크로 파서는 파싱 중인 문자열을 보유하는 input 변수와 input에서 다음에 파싱할 문자를 가리키는 position 변수를 사용하는 패턴을 따른다.

2.3.2 불리언 속성

여러 속성은 불리언 속성이다. 요소에 불리언 속성이 있으면 true 값을 나타내며, 속성이 없으면 false 값을 나타낸다.

속성이 있는 경우 해당 값은 빈 문자열이거나, 선행 또는 후행 공백 없이 속성의 정규 이름과 ASCII 대소문자를 구분하지 않고 일치하는 값이어야 한다.

불리언 속성에는 "true"와 "false" 값을 사용할 수 없다. false 값을 나타내려면 속성 자체를 완전히 생략해야 한다.

다음은 선택되어 있고 비활성화된 체크박스의 예이다. checkeddisabled 속성이 불리언 속성이다.

<label><input type=checkbox checked name=cheese disabled> Cheese</label>

다음과 같이 동일하게 작성할 수도 있다.

<label><input type=checkbox checked=checked name=cheese disabled=disabled> Cheese</label>

스타일을 혼합할 수도 있으며, 다음 역시 동일하다.

<label><input type='checkbox' checked name=cheese disabled=""> Cheese</label>

2.3.3 키워드와 열거형 속성

열거형 속성이라고 하는 일부 속성은 유한한 상태 집합 중 하나를 취한다. 이러한 속성의 상태는 속성의 값, 키워드와 상태 간의 매핑 집합, 그리고 속성 명세에서 지정할 수도 있는 세 가지 특수 상태를 조합하여 도출된다. 이러한 특수 상태는 잘못된 값 기본값, 누락된 값 기본값, 그리고 빈 값 기본값이다.

여러 키워드가 동일한 상태에 매핑될 수 있다.

속성의 상태를 결정하려면 다음 단계를 사용한다.

  1. 속성이 지정되지 않은 경우:

    1. 속성에 누락된 값 기본값 상태가 정의되어 있으면 해당 누락된 값 기본값 상태를 반환한다.

    2. 그렇지 않으면 상태 없음을 반환한다.

  2. 속성의 값이 해당 속성에 정의된 키워드 중 하나와 ASCII 대소문자를 구분하지 않고 일치하면, 해당 키워드가 나타내는 상태를 반환한다.

  3. 속성에 빈 값 기본값 상태가 정의되어 있고 속성의 값이 빈 문자열이면, 해당 빈 값 기본값 상태를 반환한다.

  4. 속성에 잘못된 값 기본값 상태가 정의되어 있으면 해당 잘못된 값 기본값 상태를 반환한다.

  5. 상태 없음을 반환한다.

저작 적합성을 위해 열거형 속성이 지정된 경우 속성의 값은 다음 중 하나여야 한다.

반영을 위해, 키워드가 하나라도 매핑되는 상태는 정규 키워드를 갖는다고 한다. 이는 다음과 같이 결정된다.

  1. 주어진 상태에 매핑되는 키워드가 하나뿐이면 그것이 정규 키워드이다.

  2. 주어진 상태에 매핑되는 적합한 키워드가 하나뿐이면 해당 적합한 키워드가 정규 키워드이다.

  3. 주어진 상태에 매핑되는 적합한 키워드가 두 개이고 그중 하나가 빈 문자열이면, 빈 문자열이 아닌 적합한 키워드가 정규 키워드이다.

  4. 그렇지 않으면 상태의 정규 키워드는 해당 속성의 명세에 명시적으로 제시된다.

2.3.4 숫자

2.3.4.1 부호 있는 정수

문자열이 하나 이상의 ASCII 숫자로 구성되고, 선택적으로 앞에 U+002D HYPHEN-MINUS 문자(-)가 붙으면 유효한 정수이다.

U+002D HYPHEN-MINUS(-) 접두사가 없는 유효한 정수는 해당 숫자 문자열이 십진법으로 나타내는 수를 나타낸다. U+002D HYPHEN-MINUS(-) 접두사가 있는 유효한 정수는 U+002D HYPHEN-MINUS 뒤의 숫자 문자열이 십진법으로 나타내는 수를 0에서 뺀 수를 나타낸다.

정수 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 정수 또는 오류를 반환한다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. sign의 값을 "positive"로 둔다.

  4. position이 주어진 input에서 ASCII 공백을 건너뛴다.

  5. positioninput의 끝을 지난 경우 오류를 반환한다.

  6. position이 가리키는 문자(첫 번째 문자)가 U+002D HYPHEN-MINUS 문자(-)인 경우:

    1. sign을 "negative"로 둔다.
    2. position을 다음 문자로 이동한다.
    3. positioninput의 끝을 지난 경우 오류를 반환한다.

    그렇지 않고 position이 가리키는 문자(첫 번째 문자)가 U+002B PLUS SIGN 문자(+)인 경우:

    1. position을 다음 문자로 이동한다. ("+"는 무시되지만 적합하지는 않다.)
    2. positioninput의 끝을 지난 경우 오류를 반환한다.
  7. position이 가리키는 문자가 ASCII 숫자가 아니면 오류를 반환한다.

  8. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. value를 해당 정수로 둔다.

  9. sign이 "positive"이면 value를 반환하고, 그렇지 않으면 0에서 value를 뺀 결과를 반환한다.

2.3.4.2 음이 아닌 정수

문자열이 하나 이상의 ASCII 숫자로 구성되면 유효한 음이 아닌 정수이다.

유효한 음이 아닌 정수는 해당 숫자 문자열이 십진법으로 나타내는 수를 나타낸다.

음이 아닌 정수 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 0, 양의 정수 또는 오류를 반환한다.

  1. input을 파싱 중인 문자열로 둔다.

  2. value정수 파싱 규칙을 사용하여 input을 파싱한 결과로 둔다.

  3. value가 오류이면 오류를 반환한다.

  4. value가 0보다 작으면 오류를 반환한다.

  5. value를 반환한다.

2.3.4.3 부동 소수점 수

문자열이 다음으로 구성되면 유효한 부동 소수점 수이다.

  1. 선택적으로 U+002D HYPHEN-MINUS 문자(-).

  2. 주어진 순서로 다음 중 하나 또는 둘 다:

    1. 하나 이상의 ASCII 숫자로 이루어진 시퀀스.

    2. 주어진 순서로 다음 두 항목 모두:

      1. 단일 U+002E FULL STOP 문자(.).

      2. 하나 이상의 ASCII 숫자로 이루어진 시퀀스.

  3. 선택적으로:

    1. U+0065 LATIN SMALL LETTER E 문자(e) 또는 U+0045 LATIN CAPITAL LETTER E 문자(E) 중 하나.

    2. 선택적으로 U+002D HYPHEN-MINUS 문자(-) 또는 U+002B PLUS SIGN 문자 (+).

    3. 하나 이상의 ASCII 숫자로 이루어진 시퀀스.

유효한 부동 소수점 수는 가수에 10의 지수승을 곱하여 얻은 수를 나타낸다. 여기서 가수는 첫 번째 수를 십진수로 해석한 값이다(소수점과 소수점 뒤의 수가 있으면 이를 포함하며, 전체 문자열이 U+002D HYPHEN-MINUS 문자(-)로 시작하고 수가 0이 아니면 가수를 음수로 해석한다). 지수는 E 뒤의 수가 있으면 해당 수이다 (E와 수 사이에 U+002D HYPHEN-MINUS 문자(-)가 있고 수가 0이 아니면 음수로 해석하며, E와 수 사이에 U+002B PLUS SIGN 문자(+)가 있으면 이를 무시한다). E가 없으면 지수는 0으로 처리한다.

Infinity 및 Not-a-Number(NaN) 값은 유효한 부동 소수점 수가 아니다.

유효한 부동 소수점 수 개념은 일반적으로 작성자에게 허용되는 값을 제한하는 데만 사용되며, 사용자 에이전트 요구 사항은 아래의 부동 소수점 수 값 파싱 규칙을 사용한다(예: progress 요소의 max 속성). 그러나 일부 경우 사용자 에이전트 요구 사항에는 문자열이 유효한 부동 소수점 수인지 검사하는 과정이 포함된다(예: input 요소의 Number 상태에 대한 값 정제 알고리즘 또는 srcset 속성 파싱 알고리즘).

n의 부동 소수점 수로서 가장 좋은 표현ToString(n)을 실행하여 얻은 문자열이다. 추상 연산 ToString은 유일하게 결정되지 않는다. 특정 값에 대해 ToString에서 얻을 수 있는 문자열이 여러 개인 경우, 사용자 에이전트는 해당 값에 대해 항상 동일한 문자열을 반환해야 한다 (다른 사용자 에이전트가 사용하는 값과는 다를 수 있다).

부동 소수점 수 값 파싱 규칙은 다음 알고리즘과 같다. 이 알고리즘은 무언가를 반환하는 첫 번째 단계에서 중단되어야 한다. 이 알고리즘은 수 또는 오류를 반환한다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. value의 값을 1로 둔다.

  4. divisor의 값을 1로 둔다.

  5. exponent의 값을 1로 둔다.

  6. position이 주어진 input에서 ASCII 공백을 건너뛴다.

  7. positioninput의 끝을 지난 경우 오류를 반환한다.

  8. position이 가리키는 문자가 U+002D HYPHEN-MINUS 문자(-)인 경우:

    1. valuedivisor를 −1로 변경한다.
    2. position을 다음 문자로 이동한다.
    3. positioninput의 끝을 지난 경우 오류를 반환한다.

    그렇지 않고 position이 가리키는 문자(첫 번째 문자)가 U+002B PLUS SIGN 문자(+)인 경우:

    1. position을 다음 문자로 이동한다. ("+"는 무시되지만 적합하지는 않다.)
    2. positioninput의 끝을 지난 경우 오류를 반환한다.
  9. position이 가리키는 문자가 U+002E FULL STOP(.)이고, 이것이 input의 마지막 문자가 아니며, position이 가리키는 문자 다음의 문자가 ASCII 숫자이면, value를 0으로 설정하고 fraction으로 표시된 단계로 이동한다.

  10. position이 가리키는 문자가 ASCII 숫자가 아니면 오류를 반환한다.

  11. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. value에 해당 정수를 곱한다.

  12. positioninput의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.
  13. Fraction: position이 가리키는 문자가 U+002E FULL STOP(.)이면 다음 하위 단계를 실행한다.

    1. position을 다음 문자로 이동한다.

    2. positioninput의 끝을 지났거나, position이 가리키는 문자가 ASCII 숫자, U+0065 LATIN SMALL LETTER E(e) 또는 U+0045 LATIN CAPITAL LETTER E(E)가 아니면 conversion으로 표시된 단계로 이동한다.

    3. position이 가리키는 문자가 U+0065 LATIN SMALL LETTER E 문자(e) 또는 U+0045 LATIN CAPITAL LETTER E 문자(E)이면 나머지 하위 단계를 건너뛴다.

    4. Fraction loop: divisor에 10을 곱한다.

    5. position이 가리키는 문자를 십진 숫자(0..9)로 해석하고 divisor로 나눈 값을 value에 더한다.
    6. position을 다음 문자로 이동한다.

    7. positioninput의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.

    8. position이 가리키는 문자가 ASCII 숫자이면 이 하위 단계의 fraction loop로 표시된 단계로 돌아간다.

  14. position이 가리키는 문자가 U+0065(e) 또는 U+0045(E)인 경우:

    1. position을 다음 문자로 이동한다.

    2. positioninput의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.

    3. position이 가리키는 문자가 U+002D HYPHEN-MINUS 문자(-)인 경우:

      1. exponent를 −1로 변경한다.
      2. position을 다음 문자로 이동한다.
      3. positioninput의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.

      그렇지 않고 position이 가리키는 문자가 U+002B PLUS SIGN 문자(+)인 경우:

      1. position을 다음 문자로 이동한다.
      2. positioninput의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.

    4. position이 가리키는 문자가 ASCII 숫자가 아니면 conversion으로 표시된 단계로 이동한다.

    5. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. exponent에 해당 정수를 곱한다.

    6. value에 10의 exponent승을 곱한다.

  15. Conversion: S를 −0을 제외한 유한한 IEEE 754 배정밀도 부동 소수점 값의 집합에 두 특수 값 21024와 −21024를 추가한 집합으로 둔다.

  16. rounded-valueS에서 value에 가장 가까운 수로 두며, 동일하게 가까운 값이 두 개이면 가수가 짝수인 수를 선택한다. (이 목적을 위해 두 특수 값 21024와 −21024는 가수가 짝수인 것으로 간주한다.)

  17. rounded-value가 21024 또는 −21024이면 오류를 반환한다.

  18. rounded-value를 반환한다.

2.3.4.4 백분율과 길이

치수 값 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 0.0 이상인 수 또는 실패를 반환한다. 수가 반환되면 백분율 또는 길이 중 하나로 추가 분류된다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput위치 변수로 두고, 처음에는 input의 시작을 가리키게 한다.

  3. position이 주어진 input에서 ASCII 공백을 건너뛴다.

  4. positioninput의 끝을 지났거나 inputposition의 코드 포인트가 ASCII 숫자가 아니면 실패를 반환한다.

  5. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. value를 해당 수로 둔다.

  6. positioninput의 끝을 지난 경우 value를 길이로 반환한다.

  7. inputposition의 코드 포인트가 U+002E(.)인 경우:

    1. position을 1만큼 전진시킨다.

    2. positioninput의 끝을 지났거나 inputposition의 코드 포인트가 ASCII 숫자가 아니면, value, inputposition이 주어진 현재 치수 값을 반환한다.

    3. divisor의 값을 1로 둔다.

    4. true인 동안:

      1. divisor에 10을 곱한다.

      2. inputposition의 코드 포인트를 십진 숫자(0..9)로 해석하고 divisor로 나눈 값을 value에 더한다.

      3. position을 1만큼 전진시킨다.

      4. positioninput의 끝을 지난 경우 value를 길이로 반환한다.

      5. inputposition의 코드 포인트가 ASCII 숫자가 아니면 중단한다.

  8. value, inputposition이 주어진 현재 치수 값을 반환한다.

value, inputposition이 주어진 현재 치수 값은 다음과 같이 결정된다.

  1. positioninput의 끝을 지난 경우 value를 길이로 반환한다.

  2. inputposition의 코드 포인트가 U+0025(%)이면 value를 백분율로 반환한다.

  3. value를 길이로 반환한다.

2.3.4.5 0이 아닌 백분율과 길이

0이 아닌 치수 값 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 0.0보다 큰 수 또는 오류를 반환한다. 수가 반환되면 백분율 또는 길이 중 하나로 추가 분류된다.

  1. input을 파싱 중인 문자열로 둔다.

  2. value치수 값 파싱 규칙을 사용하여 input을 파싱한 결과로 둔다.

  3. value가 오류이면 오류를 반환한다.

  4. value가 0이면 오류를 반환한다.

  5. value가 백분율이면 value를 백분율로 반환한다.

  6. value를 길이로 반환한다.

2.3.4.6 부동 소수점 수 리스트

유효한 부동 소수점 수 리스트는 U+002C COMMA 문자로 구분된 여러 유효한 부동 소수점 수이며, 그 밖의 문자는 포함하지 않는다(예: ASCII 공백도 포함하지 않는다). 또한 지정할 수 있는 부동 소수점 수의 개수나 허용되는 값의 범위에 제한이 있을 수 있다.

부동 소수점 수 리스트 파싱 규칙은 다음과 같다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. numbers를 처음에는 비어 있는 부동 소수점 수 리스트로 둔다. 이 리스트가 이 알고리즘의 결과가 된다.

  4. position이 주어진 input에서 ASCII 공백, U+002C COMMA 또는 U+003B SEMICOLON 문자로 이루어진 코드 포인트 시퀀스를 수집한다. 이는 선행 구분 기호를 건너뛴다.

  5. positioninput의 끝을 지나지 않은 동안:

    1. position이 주어진 input에서 ASCII 공백, U+002C COMMA, U+003B SEMICOLON, ASCII 숫자, U+002E FULL STOP 또는 U+002D HYPHEN-MINUS 문자가 아닌 코드 포인트 시퀀스를 수집한다. 이는 선행 쓰레기를 건너뛴다.

    2. position이 주어진 input에서 ASCII 공백, U+002C COMMA 또는 U+003B SEMICOLON 문자가 아닌 코드 포인트 시퀀스를 수집하고, unparsed number를 그 결과로 둔다.

    3. number부동 소수점 수 값 파싱 규칙을 사용하여 unparsed number를 파싱한 결과로 둔다.

    4. number가 오류이면 number를 0으로 설정한다.

    5. numbernumbers에 추가한다.

    6. position이 주어진 input에서 ASCII 공백, U+002C COMMA 또는 U+003B SEMICOLON 문자로 이루어진 코드 포인트 시퀀스를 수집한다. 이는 구분 기호를 건너뛴다.

  6. numbers를 반환한다.

2.3.4.7 치수 리스트

치수 리스트 파싱 규칙은 다음과 같다. 이 규칙은 수와 단위로 구성된 0개 이상의 쌍 리스트를 반환하며, 단위는 percentage, relative, absolute 중 하나이다.

  1. raw input을 파싱 중인 문자열로 둔다.

  2. raw input의 마지막 문자가 U+002C COMMA 문자(,)이면 raw input에서 해당 문자를 제거한다.

  3. 문자열 raw input을 쉼표를 기준으로 분할한다. raw tokens를 그 결과 토큰 리스트로 둔다.

  4. result를 비어 있는 수/단위 쌍 리스트로 둔다.

  5. raw tokens의 각 토큰에 대해 다음 하위 단계를 실행한다.

    1. input을 해당 토큰으로 둔다.

    2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

    3. value를 숫자 0으로 둔다.

    4. unitabsolute로 둔다.

    5. positioninput의 끝을 지난 경우 unitrelative로 설정하고 마지막 하위 단계로 이동한다.

    6. position의 문자가 ASCII 숫자이면, position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한 다음 value에 해당 정수를 더한다.

    7. position의 문자가 U+002E(.)인 경우:

      1. position이 주어진 input에서 ASCII 공백ASCII 숫자로 구성된 코드 포인트 시퀀스를 수집한다. s를 그 결과 시퀀스로 둔다.

      2. s의 모든 ASCII 공백을 제거한다.

      3. s가 빈 문자열이 아닌 경우:

        1. lengths의 문자 수로 둔다 (공백을 제거한 이후).

        2. fractions를 십진 정수로 해석한 결과를 10length으로 나눈 수로 둔다.

        3. valuefraction을 더한다.

    8. position이 주어진 input에서 ASCII 공백을 건너뛴다.

    9. position의 문자가 U+0025 PERCENT SIGN 문자(%)이면 unitpercentage로 설정한다.

      그렇지 않고 position의 문자가 U+002A ASTERISK 문자(*)이면 unitrelative로 설정한다.

    10. value가 나타내는 수와 unit이 나타내는 단위로 구성된 항목을 result에 추가한다.

  6. result 리스트를 반환한다.

2.3.5 날짜와 시간

아래 알고리즘에서 연도 year의 월 month에 있는 일수는 다음과 같다. month가 1, 3, 5, 7, 8, 10 또는 12이면 31, month가 4, 6, 9 또는 11이면 30, month가 2이고 year가 400으로 나누어떨어지는 수이거나, year가 4로 나누어떨어지지만 100으로는 나누어떨어지지 않는 수이면 29, 그 밖의 경우에는 28이다. 이는 그레고리력의 윤년을 고려한다. [GREGORIAN]

이 절에 정의된 날짜 및 시간 구문에서 ASCII 숫자를 사용하는 경우, 해당 숫자는 십진수를 나타낸다.

여기에서 설명하는 형식은 해당 ISO8601 형식의 부분집합이 되도록 의도되었지만, 이 명세는 ISO8601보다 훨씬 자세하게 파싱 규칙을 정의한다. 따라서 구현자는 아래에서 설명하는 파싱 규칙을 구현하기 위해 날짜 파싱 라이브러리를 사용하기 전에 이를 신중히 검토하는 것이 권장된다. ISO8601 라이브러리는 날짜와 시간을 정확히 동일한 방식으로 파싱하지 않을 수 있다. [ISO8601]

이 명세에서 역산 그레고리력을 언급하는 경우, 이는 현대 그레고리력을 1년까지 거슬러 올라가도록 확장한 것을 의미한다. 역산 그레고리력의 날짜는 때때로 명시적으로 역산 그레고리력 날짜라고 하며, 해당 시기 또는 장소에서 그 달력이 사용되지 않았더라도 그 달력을 사용하여 설명되는 날짜이다. [GREGORIAN]

이 명세에서 전송 형식으로 그레고리력을 사용하는 것은 해당 결정에 관여한 사람들의 문화적 편향에서 비롯된 임의의 선택이다. 폼의 날짜, 시간 및 숫자 형식에 관한 절(작성자용), 폼 컨트롤 현지화에 관한 구현 참고 사항time 요소도 참조한다.

2.3.5.1

은 시간대 정보가 없고 연도와 월을 제외한 날짜 정보가 없는 특정 역산 그레고리력 날짜로 구성된다. [GREGORIAN]

문자열이 다음 구성요소를 주어진 순서대로 포함하면 연도 year와 월 month를 나타내는 유효한 월 문자열이다.

  1. year를 나타내는 네 개 이상의 ASCII 숫자. 여기서 year > 0
  2. U+002D HYPHEN-MINUS 문자(-)
  3. month를 나타내는 두 개의 ASCII 숫자. 범위는 1 ≤ month ≤ 12

월 문자열을 파싱하는 규칙은 다음과 같다. 이는 연도와 월 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. yearmonth를 얻기 위해 월 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  4. positioninput의 끝을 지나지 않은 경우 실패한다.

  5. yearmonth를 반환한다.

input 문자열과 position이 주어진 경우 월 구성요소를 파싱하는 규칙은 다음과 같다. 이는 연도와 월 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 네 문자 이상이 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. year를 해당 수로 둔다.

  2. year가 0보다 큰 수가 아니면 실패한다.

  3. positioninput의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  4. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. month를 해당 수로 둔다.

  5. month가 1 ≤ month ≤ 12 범위의 수가 아니면 실패한다.

  6. yearmonth를 반환한다.

2.3.5.2 날짜

날짜는 시간대 정보가 없으며 연도, 월 및 일로 구성되는 특정 역산 그레고리력 날짜이다. [GREGORIAN]

문자열이 다음 구성요소를 주어진 순서대로 포함하면 연도 year, 월 month 및 일 day를 나타내는 유효한 날짜 문자열이다.

  1. yearmonth를 나타내는 유효한 월 문자열
  2. U+002D HYPHEN-MINUS 문자(-)
  3. day를 나타내는 두 개의 ASCII 숫자. 범위는 1 ≤ day ≤ maxday이며, 여기서 maxday연도 year의 월 month에 있는 일수이다.

날짜 문자열을 파싱하는 규칙은 다음과 같다. 이는 날짜 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. year, monthday를 얻기 위해 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  4. positioninput의 끝을 지나지 않은 경우 실패한다.

  5. date를 연도가 year, 월이 month, 일이 day인 날짜로 둔다.

  6. date를 반환한다.

input 문자열과 position이 주어진 경우 날짜 구성요소를 파싱하는 규칙은 다음과 같다. 이는 연도, 월 및 일 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. yearmonth를 얻기 위해 월 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  2. maxday연도 year의 월 month에 있는 일수로 둔다.

  3. positioninput의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  4. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. day를 해당 수로 둔다.

  5. day가 1 ≤ day ≤ maxday 범위의 수가 아니면 실패한다.

  6. year, monthday를 반환한다.

2.3.5.3 연도 없는 날짜

연도 없는 날짜는 그레고리력의 월과 해당 월의 일로 구성되지만 연도는 연결되지 않는다. [GREGORIAN]

문자열이 다음 구성요소를 주어진 순서대로 포함하면 월 month와 일 day를 나타내는 유효한 연도 없는 날짜 문자열이다.

  1. 선택적으로 두 개의 U+002D HYPHEN-MINUS 문자(-)
  2. month를 나타내는 두 개의 ASCII 숫자. 범위는 1 ≤ month ≤ 12
  3. U+002D HYPHEN-MINUS 문자(-)
  4. day를 나타내는 두 개의 ASCII 숫자. 범위는 1 ≤ day ≤ maxday이며, 여기서 maxday는 임의의 윤년(예: 4 또는 2000)의 월 month에 있는 일수이다.

즉, month가 2월을 의미하는 "02"인 경우 연도가 윤년인 것처럼 일을 29로 지정할 수 있다.

연도 없는 날짜 문자열을 파싱하는 규칙은 다음과 같다. 이는 월과 일 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. monthday를 얻기 위해 연도 없는 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  4. positioninput의 끝을 지나지 않은 경우 실패한다.

  5. monthday를 반환한다.

input 문자열과 position이 주어진 경우 연도 없는 날짜 구성요소를 파싱하는 규칙은 다음과 같다. 이는 월과 일 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. position이 주어진 input에서 U+002D HYPHEN-MINUS 문자(-)인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 0개 또는 2개 문자가 아니면 실패한다.

  2. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. month를 해당 수로 둔다.

  3. month가 1 ≤ month ≤ 12 범위의 수가 아니면 실패한다.

  4. maxday를 임의의 윤년(예: 4 또는 2000)의 월 month에 있는 일수로 둔다.

  5. positioninput의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  6. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. day를 해당 수로 둔다.

  7. day가 1 ≤ day ≤ maxday 범위의 수가 아니면 실패한다.

  8. monthday를 반환한다.

2.3.5.4 시간

시간은 시간대 정보가 없는 특정 시각이며, 시, 분, 초 및 초의 소수 부분으로 구성된다.

문자열이 다음 구성요소를 주어진 순서대로 포함하면 시 hour, 분 minute 및 초 second를 나타내는 유효한 시간 문자열이다.

  1. hour를 나타내는 두 개의 ASCII 숫자. 범위는 0 ≤ hour ≤ 23
  2. U+003A COLON 문자(:)
  3. minute를 나타내는 두 개의 ASCII 숫자. 범위는 0 ≤ minute ≤ 59
  4. second가 0이 아닌 경우, 또는 선택적으로 second가 0인 경우:
    1. U+003A COLON 문자(:)
    2. second의 정수 부분을 나타내는 두 개의 ASCII 숫자. 범위는 0 ≤ s ≤ 59
    3. second가 정수가 아닌 경우, 또는 선택적으로 second가 정수인 경우:
      1. U+002E FULL STOP 문자(.)
      2. second의 소수 부분을 나타내는 한 개, 두 개 또는 세 개의 ASCII 숫자

second 구성요소는 60 또는 61일 수 없으며, 윤초는 나타낼 수 없다.

시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. hour, minutesecond를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  4. positioninput의 끝을 지나지 않은 경우 실패한다.

  5. time을 시가 hour, 분이 minute, 초가 second인 시간으로 둔다.

  6. time을 반환한다.

input 문자열과 position이 주어진 경우 시간 구성요소를 파싱하는 규칙은 다음과 같다. 이는 시, 분 및 초 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. hour를 해당 수로 둔다.

  2. hour가 0 ≤ hour ≤ 23 범위의 수가 아니면 실패한다.
  3. positioninput의 끝을 지났거나 position의 문자가 U+003A COLON 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  4. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. minute를 해당 수로 둔다.

  5. minute가 0 ≤ minute ≤ 59 범위의 수가 아니면 실패한다.
  6. second를 0으로 둔다.

  7. positioninput의 끝을 지나지 않았고 position의 문자가 U+003A(:)인 경우:

    1. positioninput의 다음 문자로 이동한다.

    2. positioninput의 끝을 지났거나 input의 마지막 문자를 가리키거나, position에서 시작하는 input의 다음 문자가 모두 ASCII 숫자가 아니면 실패한다.

    3. position이 주어진 input에서 ASCII 숫자 또는 U+002E FULL STOP 문자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 세 문자이거나, 길이가 세 문자보다 길고 세 번째 문자가 U+002E FULL STOP 문자가 아니거나, U+002E FULL STOP 문자가 두 개 이상이면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진수로 해석한다(소수 부분이 있을 수 있음). second를 해당 수로 설정한다.

    4. second가 0 ≤ second < 60 범위의 수가 아니면 실패한다.

  8. hour, minutesecond를 반환한다.

2.3.5.5 현지 날짜와 시간

현지 날짜와 시간은 연도, 월 및 일로 구성되는 특정 역산 그레고리력 날짜와 시, 분, 초 및 초의 소수 부분으로 구성되는 시간으로 이루어지지만, 시간대 없이 표현된다. [GREGORIAN]

문자열이 다음 구성요소를 주어진 순서대로 포함하면 날짜와 시간을 나타내는 유효한 현지 날짜 및 시간 문자열이다.

  1. 날짜를 나타내는 유효한 날짜 문자열
  2. U+0054 LATIN CAPITAL LETTER T 문자(T) 또는 U+0020 SPACE 문자
  3. 시간을 나타내는 유효한 시간 문자열

문자열이 다음 구성요소를 주어진 순서대로 포함하면 날짜와 시간을 나타내는 유효하게 정규화된 현지 날짜 및 시간 문자열이다.

  1. 날짜를 나타내는 유효한 날짜 문자열
  2. U+0054 LATIN CAPITAL LETTER T 문자(T)
  3. 시간을 나타내며 주어진 시간에 대해 가능한 가장 짧은 문자열로 표현된 유효한 시간 문자열 (예: 주어진 시간이 정각에서 0초 지난 시각이면 초 구성요소 전체를 생략함)

현지 날짜 및 시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 날짜와 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. year, monthday를 얻기 위해 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  4. positioninput의 끝을 지났거나 position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자(T)도 아니고 U+0020 SPACE 문자도 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  5. hour, minutesecond를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  6. positioninput의 끝을 지나지 않은 경우 실패한다.

  7. date를 연도가 year, 월이 month, 일이 day인 날짜로 둔다.

  8. time을 시가 hour, 분이 minute, 초가 second인 시간으로 둔다.

  9. datetime을 반환한다.

2.3.5.6 시간대

시간대 오프셋은 부호가 있는 시와 분의 수로 구성된다.

문자열이 다음 중 하나로 구성되면 시간대 오프셋을 나타내는 유효한 시간대 오프셋 문자열이다.

이 형식은 -23:59부터 +23:59까지의 시간대 오프셋을 허용한다. 현재 실제 시간대의 오프셋 범위는 -12:00부터 +14:00까지이며, 실제 시간대 오프셋의 분 구성요소는 항상 00, 30 또는 45 중 하나이다. 그러나 시간대는 정치적으로 이용되며 매우 변덕스러운 정책 결정의 영향을 받으므로, 이러한 상태가 영원히 유지된다는 보장은 없다.

정식 시간대가 형성되기 이전의 역사적 시각에 시간대 오프셋을 사용하는 방법에 관한 자세한 내용은 아래 전역 날짜와 시간 절의 사용 참고 사항과 예도 참조한다.

시간대 오프셋 문자열을 파싱하는 규칙은 다음과 같다. 이는 시간대 오프셋 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. timezonehourstimezoneminutes를 얻기 위해 시간대 오프셋 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  4. positioninput의 끝을 지나지 않은 경우 실패한다.

  5. UTC에서 timezonehours시간과 timezoneminutes분만큼 떨어진 시간대 오프셋을 반환한다.

input 문자열과 position이 주어진 경우 시간대 오프셋 구성요소를 파싱하는 규칙은 다음과 같다. 이는 시간대 시와 시간대 분 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. position의 문자가 U+005A LATIN CAPITAL LETTER Z 문자 (Z)인 경우:

    1. timezonehours를 0으로 둔다.

    2. timezoneminutes를 0으로 둔다.

    3. positioninput의 다음 문자로 이동한다.

    그렇지 않고 position의 문자가 U+002B PLUS SIGN(+) 또는 U+002D HYPHEN-MINUS(-) 중 하나인 경우:

    1. position의 문자가 U+002B PLUS SIGN(+)이면 sign을 "positive"로 둔다. 그렇지 않으면 U+002D HYPHEN-MINUS(-)이므로 sign을 "negative"로 둔다.

    2. positioninput의 다음 문자로 이동한다.

    3. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. s를 수집된 시퀀스로 둔다.

    4. s의 길이가 정확히 두 문자인 경우:

      1. s를 십진 정수로 해석한다. timezonehours를 해당 수로 둔다.

      2. positioninput의 끝을 지났거나 position의 문자가 U+003A COLON 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

      3. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. timezoneminutes를 해당 수로 둔다.

      s의 길이가 정확히 네 문자인 경우:

      1. s의 처음 두 문자를 십진 정수로 해석한다. timezonehours를 해당 수로 둔다.

      2. s의 마지막 두 문자를 십진 정수로 해석한다. timezoneminutes를 해당 수로 둔다.

      그렇지 않으면 실패한다.

    5. timezonehours가 0 ≤ timezonehours ≤ 23 범위의 수가 아니면 실패한다.
    6. sign이 "negative"이면 timezonehours의 부호를 반전한다.
    7. timezoneminutes가 0 ≤ timezoneminutes ≤ 59 범위의 수가 아니면 실패한다.
    8. sign이 "negative"이면 timezoneminutes의 부호를 반전한다.

    그렇지 않으면 실패한다.

  2. timezonehourstimezoneminutes를 반환한다.

2.3.5.7 전역 날짜와 시간

전역 날짜와 시간은 연도, 월 및 일로 구성되는 특정 역산 그레고리력 날짜와 시, 분, 초 및 초의 소수 부분으로 구성되는 시간으로 이루어지며, 부호가 있는 시와 분의 수로 구성되는 시간대 오프셋과 함께 표현된다. [GREGORIAN]

문자열이 다음 구성요소를 주어진 순서대로 포함하면 날짜, 시간 및 시간대 오프셋을 나타내는 유효한 전역 날짜 및 시간 문자열이다.

  1. 날짜를 나타내는 유효한 날짜 문자열
  2. U+0054 LATIN CAPITAL LETTER T 문자(T) 또는 U+0020 SPACE 문자
  3. 시간을 나타내는 유효한 시간 문자열
  4. 시간대 오프셋을 나타내는 유효한 시간대 오프셋 문자열

20세기 중반 UTC가 형성되기 이전 날짜의 시각은 UTC가 아니라 UT1(경도 0°에서의 당시 지구 태양시)을 기준으로 표현하고 해석해야 한다. UTC는 SI 초 단위로 흐르는 UT1의 근사치이다. 시간대가 형성되기 이전의 시각은 적절한 현지 시각과 영국 런던 그리니치 지역에서 관측된 시각 사이의 당시 차이를 근사하는 명시적 시간대를 사용한 UT1 시각으로 표현하고 해석해야 한다.

다음은 유효한 전역 날짜 및 시간 문자열로 작성된 날짜의 몇 가지 예이다.

"0037-12-13 00:00Z"
로마 황제 네로의 생일에 런던 시각을 사용하던 지역의 자정. 이것이 실제로 어느 날짜에 해당하는지에 관한 자세한 설명은 아래를 참조한다.
"1979-10-14T12:00:00.001-04:00"
일광 절약 시간제를 사용하던 미국 동부 해안의 시간대에서 1979년 10월 14일 정오보다 1밀리초 뒤.
"8592-01-01T02:09+02:09"
8592년 1월 1일 UTC 자정. 해당 시각과 연결된 시간대는 UTC보다 2시간 9분 빠르며, 현재 실제로 존재하는 시간대는 아니지만 허용된다.

이 날짜들에는 주목할 만한 몇 가지 사항이 있다.

전역 날짜 및 시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 왕복 변환 또는 표시 목적을 위한 관련 시간대 오프셋 정보가 있는 UTC 시각 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. year, monthday를 얻기 위해 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  4. positioninput의 끝을 지났거나 position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자(T)도 아니고 U+0020 SPACE 문자도 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  5. hour, minutesecond를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  6. positioninput의 끝을 지난 경우 실패한다.

  7. timezonehourstimezoneminutes를 얻기 위해 시간대 오프셋 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  8. positioninput의 끝을 지나지 않은 경우 실패한다.

  9. time을 연도 year, 월 month, 일 day, 시 hour, 분 minute, 초 second인 시점에서 timezonehours시간과 timezoneminutes분을 뺀 시점으로 둔다. 해당 시점은 UTC 시간대의 시점이다.

  10. timezone을 UTC에서 timezonehours시간과 timezoneminutes분만큼 떨어진 시간대로 둔다.

  11. timetimezone을 반환한다.

2.3.5.8

는 월요일에 시작하는 7일 기간을 나타내는 주 연도 번호와 주 번호로 구성된다. 이 달력 체계에서 각 주 연도는 아래 정의에 따라 이러한 7일 기간을 52개 또는 53개 갖는다. 그레고리력 날짜 1969년 12월 29일 월요일(1969-12-29)에 시작하는 7일 기간은 주 연도 1970의 1주로 정의된다. 연속된 주에는 순차적으로 번호가 매겨진다. 주 연도의 1주 전 주는 이전 주 연도의 마지막 주이며, 그 반대도 마찬가지이다. [GREGORIAN]

번호가 year인 주 연도는 역산 그레고리력의 연도 year가 목요일을 첫날(1월 1일)로 갖거나, 역산 그레고리력의 연도 year가 수요일을 첫날(1월 1일)로 갖고 year가 400으로 나누어떨어지는 수이거나 4로 나누어떨어지지만 100으로는 나누어떨어지지 않는 수이면 53주를 갖는다. 그 밖의 모든 주 연도는 52주를 갖는다.

53주가 있는 주 연도의 마지막 날의 주 번호는 53이고, 52주가 있는 주 연도의 마지막 날의 주 번호는 52이다.

특정 일의 주 연도 번호는 역산 그레고리력에서 해당 일을 포함하는 연도의 번호와 다를 수 있다. 주 연도 y의 첫 번째 주는 그레고리력 연도 y의 첫 번째 목요일을 포함하는 주이다.

현대적 용도에서 여기에 정의된 는 ISO 8601에 정의된 ISO 주와 동일하다. [ISO8601]

문자열이 다음 구성요소를 주어진 순서대로 포함하면 주 연도 year와 주 week를 나타내는 유효한 주 문자열이다.

  1. year를 나타내는 네 개 이상의 ASCII 숫자. 여기서 year > 0
  2. U+002D HYPHEN-MINUS 문자(-)
  3. U+0057 LATIN CAPITAL LETTER W 문자(W)
  4. week를 나타내는 두 개의 ASCII 숫자. 범위는 1 ≤ week ≤ maxweek이며, 여기서 maxweek는 주 연도 year마지막 날의 주 번호이다.

주 문자열을 파싱하는 규칙은 다음과 같다. 이는 주 연도 번호와 주 번호 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 네 문자 이상이 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. year를 해당 수로 둔다.

  4. year가 0보다 큰 수가 아니면 실패한다.

  5. positioninput의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  6. positioninput의 끝을 지났거나 position의 문자가 U+0057 LATIN CAPITAL LETTER W 문자(W)가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.

  7. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. week를 해당 수로 둔다.

  8. maxweek를 연도 year마지막 날의 주 번호로 둔다.

  9. week가 1 ≤ week ≤ maxweek 범위의 수가 아니면 실패한다.

  10. positioninput의 끝을 지나지 않은 경우 실패한다.

  11. 주 연도 번호 year와 주 번호 week를 반환한다.

2.3.5.9 지속 시간

지속 시간은 초의 수로 구성된다.

월과 초는 비교할 수 없으므로(월은 정확한 초의 수가 아니라, 측정이 시작되는 정확한 날짜에 따라 실제 길이가 달라지는 기간이다), 이 명세에 정의된 지속 시간에는 월 (또는 12개월과 동일한 연도)을 포함할 수 없다. 특정 초의 수를 설명하는 지속 시간만 나타낼 수 있다.

문자열이 다음 중 하나로 구성되면 지속 시간 t를 나타내는 유효한 지속 시간 문자열이다.

지속 시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 지속 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. months, secondscomponent count를 모두 0으로 둔다.

  4. M-disambiguatorminutes로 둔다.

    이 플래그의 다른 값은 months이다. 이는 월과 분에 동일한 단위를 사용하는 ISO8601 지속 시간에서 "M" 단위를 구분하는 데 사용된다. 월은 허용되지 않지만, 향후 호환성을 위해 파싱하며 다른 컨텍스트에서는 유효한 ISO8601 지속 시간을 잘못 해석하지 않도록 한다.

  5. position이 주어진 input에서 ASCII 공백을 건너뛴다.

  6. positioninput의 끝을 지난 경우 실패한다.

  7. position이 가리키는 input의 문자가 U+0050 LATIN CAPITAL LETTER P 문자이면 position을 다음 문자로 이동하고, M-disambiguatormonths로 설정한 다음, position이 주어진 input에서 ASCII 공백을 건너뛴다.

  8. true인 동안:

    1. units를 undefined로 둔다. 이후 다음 값 중 하나가 할당된다. years, months, weeks, days, hours, minutes, seconds.

    2. next character를 undefined로 둔다. 이는 input의 문자를 처리하는 데 사용된다.

    3. positioninput의 끝을 지난 경우 중단한다.

    4. position이 가리키는 input의 문자가 U+0054 LATIN CAPITAL LETTER T 문자이면 position을 다음 문자로 이동하고, M-disambiguatorminutes로 설정한 다음, position이 주어진 input에서 ASCII 공백을 건너뛰고, 계속한다.

    5. next characterposition이 가리키는 input의 문자로 설정한다.

    6. next character가 U+002E FULL STOP 문자(.)이면 N을 0으로 둔다. (position은 이동하지 않는다. 이는 아래에서 처리된다.)

      그렇지 않고 next characterASCII 숫자이면, position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한 다음 N을 해당 수로 둔다.

      그렇지 않으면 next character는 수의 일부가 아니므로 실패한다.

    7. positioninput의 끝을 지난 경우 실패한다.

    8. next characterposition이 가리키는 input의 문자로 설정하고, 이번에는 position을 다음 문자로 이동한다. (앞서 next character가 U+002E FULL STOP 문자(.)였다면 이번에도 여전히 해당 문자이다.)

    9. next character가 U+002E(.)인 경우:

      1. position이 주어진 input에서 ASCII 숫자코드 포인트 시퀀스를 수집한다. s를 그 결과 시퀀스로 둔다.

      2. s가 빈 문자열이면 실패한다.

      3. lengths의 문자 수로 둔다.

      4. fractions를 십진 정수로 해석한 결과를 10length으로 나눈 수로 둔다.

      5. Nfraction을 더한다.

      6. position이 주어진 input에서 ASCII 공백을 건너뛴다.

      7. positioninput의 끝을 지난 경우 실패한다.

      8. next characterposition이 가리키는 input의 문자로 설정하고 position을 다음 문자로 이동한다.

      9. next character가 U+0053 LATIN CAPITAL LETTER S 문자도 아니고 U+0073 LATIN SMALL LETTER S 문자도 아니면 실패한다.

      10. unitsseconds로 설정한다.

      그렇지 않으면:

      1. next characterASCII 공백이면, position이 주어진 input에서 ASCII 공백을 건너뛰고, next characterposition이 가리키는 input의 문자로 설정한 다음 position을 다음 문자로 이동한다.

      2. next character가 U+0059 LATIN CAPITAL LETTER Y 문자 또는 U+0079 LATIN SMALL LETTER Y 문자이면 unitsyears로 설정하고 M-disambiguatormonths로 설정한다.

        next character가 U+004D LATIN CAPITAL LETTER M 문자 또는 U+006D LATIN SMALL LETTER M 문자이고 M-disambiguatormonths이면 unitsmonths로 설정한다.

        next character가 U+0057 LATIN CAPITAL LETTER W 문자 또는 U+0077 LATIN SMALL LETTER W 문자이면 unitsweeks로 설정하고 M-disambiguatorminutes로 설정한다.

        next character가 U+0044 LATIN CAPITAL LETTER D 문자 또는 U+0064 LATIN SMALL LETTER D 문자이면 unitsdays로 설정하고 M-disambiguatorminutes로 설정한다.

        next character가 U+0048 LATIN CAPITAL LETTER H 문자 또는 U+0068 LATIN SMALL LETTER H 문자이면 unitshours로 설정하고 M-disambiguatorminutes로 설정한다.

        next character가 U+004D LATIN CAPITAL LETTER M 문자 또는 U+006D LATIN SMALL LETTER M 문자이고 M-disambiguatorminutes이면 unitsminutes로 설정한다.

        next character가 U+0053 LATIN CAPITAL LETTER S 문자 또는 U+0073 LATIN SMALL LETTER S 문자이면 unitsseconds로 설정하고 M-disambiguatorminutes로 설정한다.

        그렇지 않고 next character가 위 문자 중 어느 것도 아니면 실패한다.

    10. component count를 1 증가시킨다.

    11. multiplier를 1로 둔다.

    12. unitsyears이면 multiplier에 12를 곱하고 unitsmonths로 설정한다.

    13. unitsmonths이면 Nmultiplier의 곱을 months에 더한다.

      그렇지 않으면:

      1. unitsweeks이면 multiplier에 7을 곱하고 unitsdays로 설정한다.

      2. unitsdays이면 multiplier에 24를 곱하고 unitshours로 설정한다.

      3. unitshours이면 multiplier에 60을 곱하고 unitsminutes로 설정한다.

      4. unitsminutes이면 multiplier에 60을 곱하고 unitsseconds로 설정한다.

      5. 이제 units는 반드시 seconds이다. Nmultiplier의 곱을 seconds에 더한다.

    14. position이 주어진 input에서 ASCII 공백을 건너뛴다.

  9. component count가 0이면 실패한다.

  10. months가 0이 아니면 실패한다.

  11. seconds초로 구성된 지속 시간을 반환한다.

2.3.5.10 더 모호한 시점

문자열이 다음 중 하나이기도 하면 선택적 시간이 포함된 유효한 날짜 문자열이다.


날짜 또는 시간 문자열을 파싱하는 규칙은 다음과 같다. 이 알고리즘은 날짜, 시간, 전역 날짜와 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.

  1. input을 파싱 중인 문자열로 둔다.

  2. positioninput 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  3. start positionposition과 같은 위치로 설정한다.

  4. date presenttime present 플래그를 true로 설정한다.

  5. year, monthday를 얻기 위해 날짜 구성요소를 파싱한다. 이것이 실패하면 date present 플래그를 false로 설정한다.

  6. date present가 true이고, positioninput의 끝을 지나지 않았으며, position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자(T) 또는 U+0020 SPACE 문자 중 하나이면 positioninput의 다음 문자로 이동한다.

    그렇지 않고 date present가 true이며, positioninput의 끝을 지났거나 position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자 (T)도 아니고 U+0020 SPACE 문자도 아니면 time present를 false로 설정한다.

    그렇지 않고 date present가 false이면 positionstart position과 같은 위치로 되돌린다.

  7. time present 플래그가 true이면 hour, minutesecond를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  8. date presenttime present 플래그가 모두 true이지만 positioninput의 끝을 지난 경우 실패한다.

  9. date presenttime present 플래그가 모두 true이면 timezonehourstimezoneminutes를 얻기 위해 시간대 오프셋 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.

  10. positioninput의 끝을 지나지 않은 경우 실패한다.

  11. date present 플래그가 true이고 time present 플래그가 false이면 date를 연도가 year, 월이 month, 일이 day인 날짜로 두고 date를 반환한다.

    그렇지 않고 time present 플래그가 true이고 date present 플래그가 false이면 time을 시가 hour, 분이 minute, 초가 second인 시간으로 두고 time을 반환한다.

    그렇지 않으면 time을 연도 year, 월 month, 일 day, 시 hour, 분 minute, 초 second인 시점에서 timezonehours시간과 timezoneminutes분을 뺀 시점으로 두며, 해당 시점은 UTC 시간대의 시점이다. timezone을 UTC에서 timezonehours시간과 timezoneminutes분만큼 떨어진 시간대로 두고, timetimezone을 반환한다.

2.3.6 레거시 색상

일부 폐기된 레거시 속성은 문자열 input이 주어진 레거시 색상 값 파싱 규칙을 사용하여 색상을 파싱한다. 이 규칙은 CSS 색상 또는 실패를 반환한다.

  1. input이 빈 문자열이면 실패를 반환한다.

  2. input에서 선행 및 후행 ASCII 공백을 제거한다.

  3. input이 "transparent"와 ASCII 대소문자를 구분하지 않고 일치하면 실패를 반환한다.

  4. input명명된 색상 중 하나와 ASCII 대소문자를 구분하지 않고 일치하면 해당 키워드에 대응하는 CSS 색상을 반환한다. [CSSCOLOR]

    CSS2 시스템 색상은 인식되지 않는다.

  5. input코드 포인트 길이가 4이고, input의 첫 번째 문자가 U+0023(#)이며, input의 마지막 세 문자가 모두 ASCII 16진수 숫자인 경우:

    1. result를 CSS 색상으로 둔다.

    2. input의 두 번째 문자를 16진수 숫자로 해석한다. result의 빨간색 구성요소를 그 결과에 17을 곱한 수로 둔다.

    3. input의 세 번째 문자를 16진수 숫자로 해석한다. result의 초록색 구성요소를 그 결과에 17을 곱한 수로 둔다.

    4. input의 네 번째 문자를 16진수 숫자로 해석한다. result의 파란색 구성요소를 그 결과에 17을 곱한 수로 둔다.

    5. result를 반환한다.

  6. input에서 U+FFFF보다 큰 모든 코드 포인트(즉, 기본 다국어 평면에 속하지 않는 모든 문자)를 "00"으로 바꾼다.

  7. input코드 포인트 길이가 128보다 크면 처음 128개 문자만 남도록 input을 잘라낸다.

  8. input의 첫 번째 문자가 U+0023(#)이면 해당 문자를 제거한다.

  9. input에서 ASCII 16진수 숫자가 아닌 모든 문자를 U+0030(0)으로 바꾼다.

  10. input코드 포인트 길이가 0이거나 3의 배수가 아닌 동안 input에 U+0030(0)을 추가한다.

  11. 세 구성요소를 얻기 위해 input을 동일한 코드 포인트 길이를 갖는 세 문자열로 나눈다. length를 각 구성요소의 코드 포인트 길이(input코드 포인트 길이의 3분의 1)로 둔다.

  12. length가 8보다 크면 각 구성요소에서 앞쪽의 length-8개 문자를 제거하고 length를 8로 둔다.

  13. length가 2보다 크고 각 구성요소의 첫 번째 문자가 U+0030(0)인 동안 해당 문자를 제거하고 length를 1 감소시킨다.

  14. length여전히 2보다 크면 각 구성요소에서 처음 두 문자만 남도록 잘라낸다.

  15. result를 CSS 색상으로 둔다.

  16. 첫 번째 구성요소를 16진수로 해석한다. result의 빨간색 구성요소를 그 결과로 둔다.

  17. 두 번째 구성요소를 16진수로 해석한다. result의 초록색 구성요소를 그 결과로 둔다.

  18. 세 번째 구성요소를 16진수로 해석한다. result의 파란색 구성요소를 그 결과로 둔다.

  19. result를 반환한다.

2.3.7 공백으로 구분된 토큰

공백으로 구분된 토큰 집합은 하나 이상의 ASCII 공백으로 구분된 0개 이상의 단어 (토큰이라고 함)를 포함하는 문자열이다. 각 단어는 하나 이상의 문자로 구성된 임의의 문자열이며, 그중 어느 문자도 ASCII 공백이 아니다.

공백으로 구분된 토큰 집합을 포함하는 문자열은 선행 또는 후행 ASCII 공백을 가질 수 있다.

고유한 공백 구분 토큰의 순서 없는 집합은 토큰이 중복되지 않는 공백으로 구분된 토큰 집합이다.

고유한 공백 구분 토큰의 순서 있는 집합은 토큰이 중복되지 않지만 토큰의 순서에는 의미가 있는 공백으로 구분된 토큰 집합이다.

공백으로 구분된 토큰 집합에는 허용되는 값의 집합이 정의되어 있는 경우가 있다. 허용되는 값의 집합이 정의되어 있으면 모든 토큰은 해당 허용 값 리스트에 속해야 하며, 다른 값은 부적합하다. 그러한 허용 값 집합이 제공되지 않으면 모든 값이 적합하다.

공백으로 구분된 토큰 집합의 토큰을 비교하는 방법(예: 대소문자를 구분하는지 여부)은 집합별로 정의된다.

2.3.8 쉼표로 구분된 토큰

쉼표로 구분된 토큰 집합은 각각이 다음 토큰과 단일 U+002C COMMA 문자(,)로 구분되는 0개 이상의 토큰을 포함하는 문자열이다. 각 토큰은 0개 이상의 문자로 구성된 임의의 문자열이며, ASCII 공백으로 시작하거나 끝나지 않고, U+002C COMMA 문자(,)를 포함하지 않으며, 선택적으로 ASCII 공백으로 둘러싸일 수 있다.

예를 들어 문자열 " a ,b,,d d "은 "a", "b", 빈 문자열 및 "d d"라는 네 개의 토큰으로 구성된다. 각 토큰 주변의 선행 및 후행 공백은 토큰의 일부로 간주되지 않으며, 빈 문자열도 토큰이 될 수 있다.

쉼표로 구분된 토큰 집합에는 유효한 토큰을 구성하는 항목에 추가 제한이 있는 경우가 있다. 그러한 제한이 정의되어 있으면 모든 토큰은 해당 제한을 충족해야 하며, 다른 값은 부적합하다. 그러한 제한이 지정되지 않으면 모든 값이 적합하다.

2.3.9 참조

유형 type인 요소에 대한 유효한 해시 이름 참조는 U+0023 NUMBER SIGN 문자(#) 뒤에 동일한 트리에 있는 유형 type인 요소의 name 속성값과 정확히 일치하는 문자열이 이어지는 문자열이다.

컨텍스트 노드 scope가 주어진 경우 유형 type인 요소에 대한 해시 이름 참조 파싱 규칙은 다음과 같다.

  1. 파싱 중인 문자열에 U+0023 NUMBER SIGN 문자가 없거나, 문자열에서 처음 나타나는 해당 문자가 문자열의 마지막 문자이면 null을 반환한다.

  2. s를 파싱 중인 문자열에서 첫 번째 U+0023 NUMBER SIGN 문자 바로 다음 문자부터 해당 문자열의 끝까지의 문자열로 둔다.

  3. scope트리에서 트리 순서id 또는 name 속성의 값이 s인 유형 type의 첫 번째 요소를 반환하고, 그러한 요소가 없으면 null을 반환한다.

    파싱할 때 id 속성이 고려되지만, 값이 유효한 해시 이름 참조인지 결정할 때는 사용되지 않는다. 즉, id를 기준으로 요소를 참조하는 해시 이름 참조는 적합성 오류이다. 단, 해당 요소에 동일한 값을 갖는 name 속성도 있는 경우는 제외한다.

2.3.10 미디어 쿼리

문자열이 미디어 쿼리<media-query-list> 생성 규칙과 일치하면 유효한 미디어 쿼리 리스트이다. [MQ]

문자열이 빈 문자열이거나, ASCII 공백만으로 이루어진 문자열이거나, 미디어 쿼리에 제시된 정의에 따라 사용자의 환경과 일치하는 미디어 쿼리 리스트이면 해당 문자열은 사용자의 환경과 일치한다. [MQ]

2.3.11 고유한 내부 값

고유한 내부 값은 직렬화할 수 있고, 값으로 비교할 수 있으며, 스크립트에 노출되지 않는 값이다.

새로운 고유한 내부 값을 생성하려면 이 알고리즘이 이전에 한 번도 반환한 적 없는 고유한 내부 값을 반환한다.

2.4 URL

2.4.1 용어

문자열이 유효한 URL 문자열이지만 빈 문자열이 아니면 유효한 비어 있지 않은 URL이다.

문자열에서 선행 및 후행 ASCII 공백을 제거한 후 유효한 URL 문자열이면 공백으로 둘러싸일 수 있는 유효한 URL이다.

문자열에서 선행 및 후행 ASCII 공백을 제거한 후 유효한 비어 있지 않은 URL이면 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL이다.


이 명세는 URL about:legacy-compat를 해석할 수는 없지만 예약된 about: URL로 정의하며, XML 도구와의 호환성을 위해 필요한 경우 HTML 문서DOCTYPE에서 사용한다. [ABOUT]

이 명세는 URL about:html-kind를 해석할 수는 없지만 예약된 about: URL로 정의하며, 미디어 트랙 종류의 식별자로 사용한다. [ABOUT]

이 명세는 URL about:srcdoc를 해석할 수는 없지만 예약된 about: URL로 정의하며, iframe srcdoc 문서URL로 사용한다. [ABOUT]


URL스킴이 "about"이고, 경로가 단일 문자열 "blank"를 포함하며, 사용자 이름비밀번호가 빈 문자열이고, 호스트가 null이면 해당 URL은 about:blank와 일치한다.

그러한 URL의 쿼리프래그먼트는 null이 아닐 수 있다. 예를 들어 "about:blank?foo#bar"를 파싱하여 생성된 URL 레코드about:blank와 일치한다.

URL스킴이 "about"이고, 경로가 단일 문자열 "srcdoc"을 포함하며, 쿼리가 null이고, 사용자 이름비밀번호가 빈 문자열이며, 호스트가 null이면 해당 URL은 about:srcdoc과 일치한다.

about:srcdoc과 일치한다URL쿼리가 null임을 보장하는 이유는, URL이 about:blank와 일치하는 Document와 달리, iframe srcdoc 문서에서는 URL쿼리가 null이 아닌 문서를 생성할 수 없기 때문이다. 다시 말해 URLabout:srcdoc과 일치하는 모든 URL의 집합은 프래그먼트만 서로 다르다.

2.4.2 URL 파싱

URL을 파싱하는 것은 문자열을 받아 그것이 나타내는 URL 레코드를 얻는 과정이다. 이 과정은 URL에 정의되어 있지만, HTML 표준은 기준 URL과 인코딩을 추상화하는 여러 래퍼를 정의한다. [URL]

대부분의 새 API는 URL을 파싱해야 한다. 오래된 API와 HTML 요소는 URL을 인코딩 파싱해야 할 이유가 있을 수 있다. 사용자 정의 기준 URL이 필요하거나 기준 URL을 원하지 않는 경우에는 물론 URL 파서를 직접 사용할 수도 있다.

문자열 url과, 해당 문자열의 기준이 되는 Document 객체 또는 환경 설정 객체 environment가 주어진 경우 URL을 파싱하려면 다음 단계를 실행한다. 이 단계는 실패 또는 URL을 반환한다.

  1. environmentDocument 객체이면 baseURLenvironment기준 URL로 두고, 그렇지 않으면 environmentAPI 기준 URL로 둔다.

  2. urlbaseURL을 사용하여 URL 파서를 적용한 결과를 반환한다.

문자열 url과, 해당 문자열의 기준이 되는 Document 객체 또는 환경 설정 객체 environment가 주어진 경우 URL을 인코딩 파싱하려면 다음 단계를 실행한다. 이 단계는 실패 또는 URL을 반환한다.

  1. encodingUTF-8로 둔다.

  2. environmentDocument 객체이면 encodingenvironment문자 인코딩으로 설정한다.

  3. 그렇지 않고 environment관련 전역 객체Window 객체이면, encodingenvironment관련 전역 객체연관된 Document문자 인코딩으로 설정한다.

  4. environmentDocument 객체이면 baseURLenvironment기준 URL로 두고, 그렇지 않으면 environmentAPI 기준 URL로 둔다.

  5. url, baseURLencoding을 사용하여 URL 파서를 적용한 결과를 반환한다.

문자열 url과, 해당 문자열의 기준이 되는 Document 객체 또는 환경 설정 객체 environment가 주어진 경우 URL을 인코딩 파싱하고 직렬화하려면 다음 단계를 실행한다. 이 단계는 실패 또는 문자열을 반환한다.

  1. urlenvironment를 기준으로 url이 주어진 URL을 인코딩 파싱한 결과로 둔다.

  2. url이 실패이면 실패를 반환한다.

  3. urlURL 직렬화기를 적용한 결과를 반환한다.

2.4.3 문서 기준 URL

Document document문서 기준 URL은 다음 단계를 실행하여 얻는 URL 레코드이다.

  1. documenthref 속성이 있는 base 자손 요소가 없으면 document대체 기준 URL을 반환한다.

  2. 그렇지 않으면 document에서 트리 순서href 속성이 있는 첫 번째 base 요소의 고정된 기준 URL을 반환한다.

Document 객체 document대체 기준 URL은 다음 단계를 실행하여 얻는 URL 레코드이다.

  1. documentiframe srcdoc 문서인 경우:

    1. 단언: documentabout 기준 URL은 null이 아니다.

    2. documentabout 기준 URL을 반환한다.

  2. documentURLabout:blank와 일치하고 documentabout 기준 URL이 null이 아니면, documentabout 기준 URL을 반환한다.

  3. documentURL을 반환한다.


Document documentURL을 설정하여 URL 레코드 url로 만들려면:

  1. documentURLurl로 설정한다.

  2. document가 주어진 기준 URL 변경에 대응한다.

Document document기준 URL 변경에 대응하려면:

  1. 사용자 에이전트는 영향을 받는 URL 또는 그러한 URL에서 파생된 데이터를 사용자에게 표시하는 모든 사용자 인터페이스 요소를 업데이트하는 것이 좋다. 그러한 사용자 인터페이스 요소의 예로는 하이퍼링크url을 표시하는 상태 표시줄이나, q, blockquote, ins 또는 del 요소의 cite 속성에 지정된 URL을 표시하는 사용자 인터페이스가 있다.

  2. CSS :link/:visited/등의 의사 클래스가 적절히 업데이트되도록 한다.

  3. document섀도를 포함하는 자손 각각의 descendant에 대해 다음을 수행한다.

    1. descendant결과예측 규칙 파싱 결과script 요소인 경우:

      1. oldResultelement결과로 둔다.

      2. newResultelement자식 텍스트 콘텐츠element노드 문서가 주어진 예측 규칙 파싱 결과를 생성한 결과로 둔다.

      3. element관련 전역 객체, oldResultnewResult가 주어진 예측 규칙을 업데이트한다.

  4. document가 주어진 예측 로드를 고려한다.

이는 기준 URL을 변경해도 예를 들어 img 요소가 표시하는 이미지에는 영향을 주지 않는다는 의미이다. 따라서 이후 스크립트에서 src IDL 속성에 접근하면, 현재 표시 중인 이미지와 더 이상 대응하지 않을 수 있는 새로운 절대 URL을 반환한다.

2.5 리소스 가져오기

2.5.1 용어

응답유형이 "basic", "cors" 또는 "default"이면 CORS 동일 출처이다. [FETCH]

응답유형이 "opaque" 또는 "opaqueredirect"이면 CORS 교차 출처이다.

응답안전하지 않은 응답은 내부 응답이 있는 경우 해당 내부 응답이고, 그렇지 않으면 응답 자체이다.

url, destination, corsAttributeState 및 선택적인 동일 출처 대체 플래그가 주어진 경우 잠재적 CORS 요청을 생성하려면 다음 단계를 실행한다.

  1. corsAttributeStateCORS 없음이면 mode를 "no-cors"로 두고, 그렇지 않으면 "cors"로 둔다.

  2. 동일 출처 대체 플래그가 설정되어 있고 mode가 "no-cors"이면, mode를 "same-origin"으로 설정한다.

  3. credentialsMode를 "include"로 둔다.

  4. corsAttributeState익명이면 credentialsMode를 "same-origin"으로 설정한다.

  5. 요청URLurl이고, 대상destination이며, 모드mode이고, 자격 증명 모드credentialsMode이며, URL 자격 증명 사용 플래그가 설정된 새로운 요청을 반환한다.

2.5.2 리소스 유형 결정

리소스의 Content-Type 메타데이터MIME 스니핑의 요구 사항과 일치하는 방식으로 가져오고 해석해야 한다. [MIMESNIFF]

리소스의 계산된 MIME 유형MIME 스니핑에 제시된 요구 사항과 일치하는 방식으로 찾아야 한다. [MIMESNIFF]

이미지를 구체적으로 스니핑하는 규칙, 리소스가 텍스트인지 바이너리인지 구분하는 규칙오디오와 비디오를 구체적으로 스니핑하는 규칙MIME 스니핑에 정의되어 있다. 이 규칙은 결과로 MIME 유형을 반환한다. [MIMESNIFF]

MIME 스니핑의 규칙을 정확히 따라야 한다. 사용자 에이전트가 서버가 예상하는 것과 다른 휴리스틱을 콘텐츠 유형 감지에 사용하면 보안 문제가 발생할 수 있다. 자세한 내용은 MIME 스니핑을 참조한다. [MIMESNIFF]

2.5.3 meta 요소에서 문자 인코딩 추출

문자열 s가 주어진 경우 meta 요소에서 문자 인코딩을 추출하는 알고리즘은 다음과 같다. 이는 문자 인코딩 또는 아무것도 반환하지 않는다.

  1. positions 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.

  2. 루프: position 이후의 s에서 단어 "charset"과 ASCII 대소문자를 구분하지 않고 일치하는 첫 번째 일곱 문자를 찾는다. 일치 항목을 찾지 못하면 아무것도 반환하지 않는다.

  3. 단어 "charset" 바로 뒤에 오는 모든 ASCII 공백을 건너뛴다 (공백이 없을 수도 있다).

  4. 다음 문자가 U+003D EQUALS SIGN(=)이 아니면 position을 해당 다음 문자 바로 앞으로 이동하고 루프로 표시된 단계로 돌아간다.

  5. 등호 바로 뒤에 오는 모든 ASCII 공백을 건너뛴다 (공백이 없을 수도 있다).

  6. 다음 문자를 다음과 같이 처리한다.

    해당 문자가 U+0022 QUOTATION MARK 문자(")이고 s 뒤쪽에 U+0022 QUOTATION MARK 문자(")가 있는 경우
    해당 문자가 U+0027 APOSTROPHE 문자(')이고 s 뒤쪽에 U+0027 APOSTROPHE 문자(')가 있는 경우
    이 문자와 이후 가장 먼저 나타나는 동일한 문자 사이의 부분 문자열에서 인코딩을 가져온 결과를 반환한다.
    해당 문자가 짝이 없는 U+0022 QUOTATION MARK 문자(")인 경우
    해당 문자가 짝이 없는 U+0027 APOSTROPHE 문자(')인 경우
    다음 문자가 없는 경우
    아무것도 반환하지 않는다.
    그렇지 않은 경우
    이 문자부터 첫 번째 ASCII 공백, U+003B SEMICOLON 문자(;) 또는 s의 끝 중 가장 먼저 오는 지점 직전까지로 구성된 부분 문자열에서 인코딩을 가져온 결과를 반환한다.

이 알고리즘은 HTTP 명세의 알고리즘과 다르다. 예를 들어 HTTP는 작은따옴표 사용을 허용하지 않으며, 이 알고리즘이 지원하지 않는 백슬래시 이스케이프 메커니즘을 지원하도록 요구한다. 이 알고리즘은 역사적으로 HTTP와 관련된 컨텍스트에서 사용되지만, 구현이 지원하는 구문은 오래전에 서로 달라졌다. [HTTP]

2.5.4 CORS 설정 속성

Attributes/crossorigin

현재 모든 엔진에서 지원됨.

Firefox8+Safari6+Chrome13+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

CORS 설정 속성은 다음 키워드와 상태를 갖는 열거형 속성이다.

키워드 상태 간단한 설명
anonymous 익명 요소에 대한 요청모드가 "cors"로 설정되고, 자격 증명 모드가 "same-origin"으로 설정된다.
use-credentials 자격 증명 사용 요소에 대한 요청모드가 "cors"로 설정되고, 자격 증명 모드가 "include"로 설정된다.

속성의 누락된 값 기본값CORS 없음 상태이고, 잘못된 값 기본값빈 값 기본값은 모두 익명 상태이다.

CORS 설정 속성이 제어하는 대부분의 가져오기는 잠재적 CORS 요청 생성 알고리즘을 통해 수행된다.

요청의 모드가 항상 "cors"인 더 현대적인 기능에서는 일부 CORS 설정 속성이 약간 다른 의미를 갖도록 용도가 변경되었으며, 이 경우 해당 속성은 요청자격 증명 모드에만 영향을 준다. 이 변환을 수행하기 위해 주어진 CORS 설정 속성CORS 설정 속성 자격 증명 모드를 속성 상태에 따라 다음과 같이 결정하도록 정의한다.

CORS 없음
익명
"same-origin"
자격 증명 사용
"include"

2.5.5 리퍼러 정책 속성

리퍼러 정책 속성열거형 속성이다. 빈 문자열을 포함한 각 리퍼러 정책은 이 속성의 키워드이며 동일한 이름의 상태에 매핑된다.

속성의 누락된 값 기본값잘못된 값 기본값은 모두 빈 문자열 상태이다.

이러한 상태가 여러 가져오기의 처리 모델에 미치는 영향은 이 명세 전반과 FetchReferrer Policy에 더 자세히 정의되어 있다. [FETCH] [REFERRERPOLICY]

여러 신호가 주어진 가져오기에 어떤 처리 모델이 사용되는지 결정하는 데 영향을 줄 수 있으며, 리퍼러 정책 속성은 그중 하나일 뿐이다. 일반적으로 이러한 신호를 처리하는 순서는 다음과 같다.

  1. 먼저 noreferrer 링크 유형의 존재 여부.

  2. 그다음 리퍼러 정책 속성의 값.

  3. 그다음 name 속성이 referrer로 설정된 meta 요소의 존재 여부.

  4. 마지막으로 `Referrer-Policy` HTTP 헤더.

2.5.6 논스 속성

Global_attributes/nonce

현재 모든 엔진에서 지원됨.

Firefox31+SafariChrome
Opera?Edge
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

nonce 콘텐츠 속성은 콘텐츠 보안 정책이 주어진 가져오기의 진행 허용 여부를 결정하는 데 사용할 수 있는 암호학적 논스("한 번만 사용되는 숫자")를 나타낸다. 값은 텍스트이다. [CSP]

nonce 콘텐츠 속성이 있는 요소는 콘텐츠 속성에서 값을 가져와 [[CryptographicNonce]]라는 내부 슬롯으로 옮기고, HTMLOrSVGOrMathMLElement 인터페이스 믹스인을 통해 스크립트에 노출한 다음 콘텐츠 속성을 빈 문자열로 설정함으로써, 암호학적 논스가 스크립트에만 노출되고 CSS 속성 선택기와 같은 사이드 채널에는 노출되지 않도록 한다. 별도로 지정하지 않는 한 슬롯의 값은 빈 문자열이다.

element.nonce

element의 암호학적 논스에 설정된 값을 반환한다. 설정자가 사용되지 않았다면 이는 원래 nonce 콘텐츠 속성에서 발견된 값이다.

element.nonce = value

element의 암호학적 논스 값을 업데이트한다.

HTMLElement/nonce

Firefox75+Safari🔰 10+Chrome61+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

nonce IDL 속성은 가져올 때 이 요소의 [[CryptographicNonce]] 값을 반환해야 하며, 설정할 때 이 요소의 [[CryptographicNonce]]를 주어진 값으로 설정해야 한다.

nonce IDL 속성의 설정자가 대응하는 콘텐츠 속성을 업데이트하지 않는다는 점에 유의한다. 이것과 아래에서 요소가 브라우징 컨텍스트에 연결될 때 nonce 콘텐츠 속성을 빈 문자열로 설정하는 것은 선택기처럼 콘텐츠 속성을 쉽게 읽을 수 있는 메커니즘을 통해 논스 값이 유출되는 것을 방지하기 위한 것이다. 이 동작이 도입된 이슈 #2369에서 자세히 알아볼 수 있다.

다음 속성 변경 단계nonce 콘텐츠 속성에 사용된다.

  1. elementHTMLOrSVGOrMathMLElement포함하지 않으면 반환한다.

  2. localNamenonce가 아니거나 namespace가 null이 아니면 반환한다.

  3. value가 null이면 element[[CryptographicNonce]]를 빈 문자열로 설정한다.

  4. 그렇지 않으면 element[[CryptographicNonce]]value로 설정한다.

HTMLOrSVGOrMathMLElement포함하는 요소가 브라우징 컨텍스트에 연결될 때마다, 사용자 에이전트는 element에 대해 다음 단계를 실행해야 한다.

  1. CSP listelement섀도를 포함하는 루트정책 컨테이너CSP 리스트로 둔다.

  2. CSP list헤더로 전달된 콘텐츠 보안 정책을 포함하고, element에 값이 빈 문자열이 아닌 nonce 콘텐츠 속성이 있는 경우:

    1. nonceelement[[CryptographicNonce]]로 둔다.

    2. "nonce"와 빈 문자열을 사용하여 element속성 값을 설정한다.

    3. element[[CryptographicNonce]]nonce로 설정한다.

    element[[CryptographicNonce]]가 복원되지 않았다면 이 시점에서 빈 문자열이 된다.

node, copysubtree가 주어진 경우 HTMLOrSVGOrMathMLElement포함하는 요소의 복제 단계copy[[CryptographicNonce]]node[[CryptographicNonce]]로 설정하는 것이다.

2.5.7 지연 로딩 속성

Lazy_loading

현재 모든 엔진에서 지원됨.

Firefox75+Safari15.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

지연 로딩 속성은 다음 키워드와 상태를 갖는 열거형 속성이다.

키워드 상태 간단한 설명
lazy 지연 일부 조건이 충족될 때까지 리소스 가져오기를 지연하는 데 사용된다.
eager 즉시 리소스를 즉시 가져오는 데 사용되며 기본 상태이다.

이 속성은 현재 상태에 따라 사용자 에이전트가 리소스를 즉시 가져오거나, 요소와 관련된 일부 조건이 충족될 때까지 가져오기를 지연하도록 지시한다.

속성의 누락된 값 기본값잘못된 값 기본값은 모두 즉시 상태이다.


요소 element가 주어진 경우 요소가 지연 로딩될지 판단하는 단계는 다음과 같다.

  1. element에 대해 스크립팅이 비활성화되어 있으면 false를 반환한다.

    이는 추적 방지 조치이다. 스크립팅이 비활성화된 상태에서도 사용자 에이전트가 지연 로딩을 지원한다면, 서버가 요청된 이미지의 수와 시점을 추적할 수 있도록 이미지들을 페이지 마크업에 전략적으로 배치함으로써 사이트가 세션 전반에 걸친 사용자의 대략적인 스크롤 위치를 여전히 추적할 수 있기 때문이다.

  2. element지연 로딩 속성지연 상태이면 true를 반환한다.

  3. false를 반환한다.

img, audio, videoiframe 요소에는 처음에는 null인 연관된 지연 로드 재개 단계가 있다.

video 요소에는 처음에는 null인 연관된 포스터 지연 로드 재개 단계도 있다.

지연 로딩될 img, audio, videoiframe 요소의 경우, 이러한 단계는 지연 로드 교차 관찰자의 콜백에서 실행되거나, 해당 요소의 지연 로딩 속성즉시 상태로 설정될 때 실행된다. 이로 인해 요소가 로딩을 계속한다. video 요소의 경우 포스터 지연 로드 재개 단계도 동시에 실행된다.

Document에는 처음에는 null로 설정되어 있지만 IntersectionObserver 인스턴스로 설정할 수 있는 지연 로드 교차 관찰자가 있다.

element지연 로딩 요소의 교차 관찰을 시작하려면 다음 단계를 실행한다.

  1. docelement노드 문서로 둔다.

  2. doc지연 로드 교차 관찰자가 null이면 다음과 같이 초기화된 새로운 IntersectionObserver 인스턴스로 설정한다.

    의도는 IntersectionObserver 생성자의 원래 값을 사용하는 것이다. 그러나 Intersection Observer가 명세에서 사용할 수 있는 저수준 훅을 노출할 때까지 이 명세에서는 JavaScript에 노출된 생성자를 사용할 수밖에 없다. 이를 추적하는 버그 w3c/IntersectionObserver#464를 참조한다. [INTERSECTIONOBSERVER]

  3. element를 인수로 사용하여 doc지연 로드 교차 관찰자observe 메서드를 호출한다.

    의도는 observe 메서드의 원래 값을 사용하는 것이다. w3c/IntersectionObserver#464를 참조한다. [INTERSECTIONOBSERVER]

element지연 로딩 요소의 교차 관찰을 중지하려면 다음 단계를 실행한다.

  1. docelement노드 문서로 둔다.

  2. 단언: doc지연 로드 교차 관찰자는 null이 아니다.

  3. element를 인수로 사용하여 doc지연 로드 교차 관찰자unobserve 메서드를 호출한다.

    의도는 unobserve 메서드의 원래 값을 사용하는 것이다. w3c/IntersectionObserver#464를 참조한다. [INTERSECTIONOBSERVER]

(This is a tracking vector.) 지연 로드 스크롤 여백구현 정의 값이지만 다음 제안을 고려한다.

지연 로드 스크롤 여백이 추가 정보를 유출하지 않도록 하는 것은 개인정보 보호를 위해 중요하다. 예를 들어 새로운 핑거프린팅 벡터가 도입되지 않도록 현재 장치의 일반적인 스크롤 속도를 부정확하게 표현할 수 있다.

2.5.8 차단 속성

차단 속성은 외부 리소스를 가져올 때 특정 작업을 차단해야 함을 명시적으로 나타낸다. 차단할 수 있는 작업은 다음 표에 나열된 문자열인 가능한 차단 토큰으로 나타낸다.

가능한 차단 토큰 설명
"render" 요소는 잠재적으로 렌더링을 차단한다.

향후 더 많은 가능한 차단 토큰이 생길 수 있다.

차단 속성의 값은 각 항목이 가능한 차단 토큰고유한 공백 구분 토큰의 순서 없는 집합이어야 한다. 차단 속성지원되는 토큰가능한 차단 토큰이다. 모든 요소는 최대 하나의 차단 속성을 가질 수 있다.

요소 el차단 토큰 집합은 다음 단계의 결과이다.

  1. valueel차단 속성 값으로 두고, 그러한 속성이 없으면 빈 문자열로 둔다.

  2. valueASCII 소문자로 변환된 value로 설정한다.

  3. rawTokensvalue를 ASCII 공백으로 분할한 결과로 둔다.

  4. rawTokens의 요소 중 가능한 차단 토큰인 요소를 포함하는 집합을 반환한다.

요소의 차단 토큰 집합이 "render"를 포함하거나, 요소가 개별 요소에서 정의되는 암묵적으로 잠재적 렌더링 차단인 경우, 해당 요소는 잠재적으로 렌더링을 차단한다. 기본적으로 요소는 암묵적으로 잠재적 렌더링 차단이 아니다.

2.5.9 가져오기 우선순위 속성

가져오기 우선순위 속성은 다음 키워드와 상태를 갖는 열거형 속성이다.

키워드 상태 간단한 설명
high 높음 동일한 대상을 갖는 다른 리소스에 비해 우선순위가 높은 가져오기임을 나타낸다.
low 낮음 동일한 대상을 갖는 다른 리소스에 비해 우선순위가 낮은 가져오기임을 나타낸다.
auto 자동 동일한 대상을 갖는 다른 리소스에 비해 가져오기 우선순위를 자동으로 결정하도록 나타낸다.

속성의 누락된 값 기본값잘못된 값 기본값은 모두 자동 상태이다.

2.6 공통 DOM 인터페이스

2.6.1 콘텐츠 속성을 IDL 속성에 반영

반영을 위한 구성 요소는 다음과 같다.

반영된 IDL 속성반영 대상반영된 콘텐츠 속성 이름반영하도록 정의할 수 있다. 일반적으로 이는 IDL 속성 가져오기가 콘텐츠 속성의 현재 값을 반환하고, 설정자가 콘텐츠 속성의 값을 주어진 값으로 변경한다는 뜻이다.

반영 대상에는 다음 연관 알고리즘이 있다.

요소 element반영 대상에 대해 다음과 같이 정의된다.

요소 가져오기
  1. element를 반환한다.

콘텐츠 속성 가져오기
  1. attribute를 null, 반영된 콘텐츠 속성 이름element가 주어진 네임스페이스 및 로컬 이름으로 속성을 가져온 결과로 둔다.

  2. attribute가 null이면 null을 반환한다.

  3. attribute을 반환한다.

문자열 value를 사용한 콘텐츠 속성 설정
  1. element, 반영된 콘텐츠 속성 이름value가 주어진 속성 값을 설정한다.

콘텐츠 속성 삭제
  1. null, 반영된 콘텐츠 속성 이름element가 주어진 네임스페이스 및 로컬 이름으로 속성을 제거한다.

ElementInternals 객체 elementInternals반영 대상에 대해 다음과 같이 정의된다.

요소 가져오기
  1. elementInternals대상 요소를 반환한다.

콘텐츠 속성 가져오기
  1. elementInternals대상 요소내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]이 존재하지 않으면 null을 반환한다.

  2. elementInternals대상 요소내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]을 반환한다.

문자열 value를 사용한 콘텐츠 속성 설정
  1. elementInternals대상 요소내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]을 value설정한다.

콘텐츠 속성 삭제
  1. elementInternals대상 요소내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]을 제거한다.

이로 인해 ElementInternals 객체에는 다소 중복된 데이터 구조가 생긴다. 해당 객체의 대상 요소내부 콘텐츠 속성 맵은 직접 조작할 수 없으므로 반영은 한 방향으로만 일어난다. 그럼에도 이 접근법은 반영 대상 간에 공유되며 공통 API 의미론의 이점을 얻는 IDL 속성을 정의할 때 오류 가능성을 줄이기 위해 선택되었다.


열거형 콘텐츠 속성을 반영하는 DOMString 또는 DOMString? 유형의 IDL 속성은 알려진 값으로만 제한될 수 있다. 아래 처리 모델에 따라 이러한 IDL 속성의 가져오기는 해당 열거형 속성의 키워드, 빈 문자열 또는 null만 반환하게 된다.

반영된 IDL 속성의 유형이 DOMString인 경우:

반영된 IDL 속성의 유형이 DOMString?인 경우:

반영된 IDL 속성의 유형이 USVString이고, 선택적으로 URL로 취급되는 경우:

반영된 IDL 속성의 유형이 boolean인 경우:

이는 불리언 콘텐츠 속성 규칙에 대응한다.

반영된 IDL 속성의 유형이 long이고, 선택적으로 음이 아닌 수로만 제한되며 선택적으로 기본 값 defaultValue를 갖는 경우:

반영된 IDL 속성의 유형이 unsigned long이고, 선택적으로 양수로만 제한, 대체값이 있는 양수로만 제한 또는 범위로 제한 [clampedMin, clampedMax]되며, 선택적으로 기본값 defaultValue를 갖는 경우:

반영된 IDL 속성의 유형이 double이고, 선택적으로 양수로만 제한되며 선택적으로 기본값 defaultValue를 갖는 경우:

Infinity와 Not-a-Number(NaN) 값은 Web IDL에 정의된 대로 설정할 때 예외를 던진다. [WEBIDL]

반영된 IDL 속성의 유형이 DOMTokenList이면 가져오기 단계는 연관 요소가 this이고 연관 속성의 로컬 이름이 반영된 콘텐츠 속성 이름DOMTokenList 객체를 반환하는 것이다. 명세 작성자는 이 유형의 IDL 속성을 ElementInternals에 반영할 수 없다.

반영된 IDL 속성의 유형이 T?이고, TElement 또는 Element에서 상속하는 인터페이스인 경우, attr반영된 콘텐츠 속성 이름으로 두면:

이 유형의 반영된 IDL 속성은 일관성을 위해 식별자가 "Element"로 끝나도록 하는 것이 강력히 권장된다.

반영된 IDL 속성의 유형이 FrozenArray<T>?이고, TElement 또는 Element에서 상속하는 인터페이스인 경우, attr반영된 콘텐츠 속성 이름으로 두면:

이 유형의 반영된 IDL 속성은 일관성을 위해 식별자가 "Elements"로 끝나도록 하는 것이 강력히 권장된다.

2.6.2 IDL 확장 속성을 통한 반영 사용

반영은 IDL에서 확장 속성을 통해 사용할 수 있다. [Reflect], [ReflectSetter], [ReflectURL], [ReflectNonNegative], [ReflectPositive][ReflectPositiveWithFallback]은 모두 반영을 트리거한다. 이들은 인수를 받지 않거나 문자열을 받아야 하고, 인터페이스 멤버 속성 이외의 항목에는 나타나서는 안 되며, 한 번에 하나만 사용할 수 있다.

이러한 기본 반영 확장 속성 중 하나에서 반영된 콘텐츠 속성 이름은 값이 제공되면 해당 속성이 받는 문자열 값이고, 그렇지 않으면 IDL 속성 이름을 ASCII 소문자로 변환한 값이다.

[Reflect] 확장 속성을 갖는 IDL 속성은 [Reflect]반영된 콘텐츠 속성 이름반영해야 한다.

[ReflectSetter] 확장 속성을 갖는 IDL 속성은 설정할 때 [ReflectSetter]반영된 콘텐츠 속성 이름반영해야 한다.

[ReflectURL] 확장 속성USVString 유형의 속성에만 나타나야 한다.

[ReflectURL] 확장 속성을 갖는 IDL 속성은 [ReflectURL]반영된 콘텐츠 속성 이름URL로 반영해야 한다.

[ReflectNonNegative] 확장 속성long 유형의 속성에만 나타나야 한다.

[ReflectNonNegative] 확장 속성을 갖는 IDL 속성은 [ReflectNonNegative]반영된 콘텐츠 속성 이름음이 아닌 수로만 제한하여 반영해야 한다.

[ReflectPositive][ReflectPositiveWithFallback] 확장 속성double 또는 unsigned long 유형의 속성에만 나타나야 한다.

[ReflectPositive] 확장 속성을 갖는 IDL 속성은 [ReflectPositive]반영된 콘텐츠 속성 이름양수로만 제한하여 반영해야 한다.

[ReflectPositiveWithFallback] 확장 속성을 갖는 IDL 속성은 [ReflectPositiveWithFallback]반영된 콘텐츠 속성 이름대체값이 있는 양수로만 제한하여 반영해야 한다.


확장 속성을 보완하기 위해 [ReflectRange][ReflectDefault]도 도입한다. 이들은 반영이 작동하는 방식을 확장하며 인터페이스 멤버 속성에만 나타나야 한다.

[ReflectRange] 확장 속성은 두 값으로 제한된 정수 리스트를 받아야 한다. 이는 unsigned long 유형의 속성에만 사용되어야 한다. 또한 [Reflect]와 함께만 나타나야 한다.

[ReflectRange] 확장 속성을 갖는 IDL 속성은 [clampedMin, clampedMax] 범위로 제한된다. 여기서 clampedMin[ReflectRange]에 제공된 리스트의 첫 번째 인수이고, clampedMax는 두 번째 인수이다.

[ReflectDefault] 확장 속성double, long 또는 unsigned long 유형의 속성에만 사용되어야 한다. double 유형의 속성에 사용될 때는 십진수를 받아야 하며, 그렇지 않으면 정수를 받아야 한다. 또한 [Reflect], [ReflectNonNegative], [ReflectPositive] 또는 [ReflectPositiveWithFallback]와 함께만 나타나야 한다.

[ReflectDefault] 확장 속성을 갖는 IDL 속성에는 [ReflectDefault]에 제공된 인수가 제공하는 기본값이 있다.

2.6.3 명세에서 반영 사용

반영은 주로 웹 개발자가 반영된 IDL 속성을 통해 콘텐츠 속성에 유형이 지정된 방식으로 접근할 수 있게 하여 개발자 편의성을 개선하는 데 목적이 있다. 웹 플랫폼이 기반으로 삼는 궁극적인 진실의 원천은 콘텐츠 속성 자체이다. 즉, 명세 작성자는 반영된 IDL 속성의 가져오기 또는 설정 단계를 사용해서는 안 되며, 대신 콘텐츠 속성의 존재 여부와 값을 사용해야 한다. (또는 열거형 속성의 상태와 같은 상위 추상화를 사용해야 한다.)

이에 대한 두 가지 중요한 예외는 유형이 다음 중 하나인 반영된 IDL 속성이다.

이러한 경우 명세 작성자는 각각 반영 대상 attr-연관 요소 가져오기 attr-연관 요소들 가져오기를 사용해야 한다. 콘텐츠 속성의 존재 여부와 값은 반영된 IDL 속성과 완전히 동기화할 수 없으므로 사용해서는 안 된다.

반영 대상명시적으로 설정된 attr-요소, 명시적으로 설정된 attr-요소들, 캐시된 attr-연관 요소들캐시된 attr-연관 요소 객체는 내부 구현 세부 사항으로 취급해야 하며, 이를 기반으로 기능을 구축해서는 안 된다.

2.6.4 컬렉션

HTMLFormControlsCollectionHTMLOptionsCollection 인터페이스는 HTMLCollection 인터페이스에서 파생된 컬렉션이다. HTMLAllCollection 인터페이스는 컬렉션이지만, 이와 같이 파생되지는 않는다.

2.6.4.1 HTMLAllCollection 인터페이스

HTMLAllCollection 인터페이스는 레거시 document.all 속성에 사용된다. 이는 HTMLCollection과 유사하게 작동한다. 주요 차이점은 메서드를 놀라울 정도로 다양한 방식으로 사용하거나 오용해도 모두 무언가를 반환할 수 있다는 점과, 프로퍼티 접근 대신 함수로 호출할 수 있다는 점이다.

모든 HTMLAllCollection 객체는 Document를 루트로 하며 모든 요소와 일치하는 필터를 갖는다. 따라서 HTMLAllCollection 객체의 컬렉션이 나타내는 요소는 루트 Document의 모든 자손 요소로 구성된다.

HTMLAllCollection 인터페이스를 구현하는 객체는 레거시 플랫폼 객체이며, 아래 절에서 설명하는 추가 [[Call]] 내부 메서드를 갖는다. 또한 [[IsHTMLDDA]] 내부 슬롯도 갖는다.

HTMLAllCollection 인터페이스를 구현하는 객체는 [[IsHTMLDDA]] 내부 슬롯을 갖기 때문에 다음과 같은 몇 가지 특이한 동작을 한다.

이러한 특수 동작은 두 종류의 레거시 콘텐츠와의 호환성을 위한 것이다. 하나는 document.all의 존재 여부를 레거시 사용자 에이전트를 감지하는 방법으로 사용하는 콘텐츠이고, 다른 하나는 해당 레거시 사용자 에이전트만 지원하며 존재 여부를 먼저 검사하지 않고 document.all 객체를 사용하는 콘텐츠이다. [JAVASCRIPT]

[Exposed=Window,
 LegacyUnenumerableNamedProperties]
interface HTMLAllCollection {
  readonly attribute unsigned long length;
  getter Element (unsigned long index);
  getter (HTMLCollection or Element)? namedItem(DOMString name);
  (HTMLCollection or Element)? item(optional DOMString nameOrIndex);

  // Note: HTMLAllCollection objects have a custom [[Call]] internal method and an [[IsHTMLDDA]] internal slot.
};

객체의 지원되는 프로퍼티 인덱스HTMLCollection 객체에 대해 정의된 것과 같다.

지원되는 프로퍼티 이름은 컬렉션이 나타내는 모든 요소의 모든 id 속성의 비어 있지 않은 값과, 컬렉션이 나타내는 모든 "all"-명명 요소의 모든 name 속성의 비어 있지 않은 값으로 구성된다. 이 값들은 컬렉션이 나타내는 요소에서 컬렉션이 나타내는 요소까지 트리 순서로 나열되며, 뒤에 나오는 중복 항목은 무시한다. 요소가 두 속성을 모두 제공하고 값이 서로 다르며 어느 것도 앞선 항목의 중복이 아닌 경우, 요소의 id가 해당 요소의 name보다 앞선다.

length 가져오기 단계는 컬렉션이 나타내는 노드 수를 반환하는 것이다.

인덱스 프로퍼티 가져오기는 전달된 인덱스가 주어진 this에서 "all"-인덱스 요소를 가져온 결과를 반환해야 한다.

namedItem(name) 메서드 단계는 name이 주어진 this에서 "all"-명명 요소를 가져온 결과를 반환하는 것이다.

item(nameOrIndex) 메서드 단계는 다음과 같다.

  1. nameOrIndex가 제공되지 않았으면 null을 반환한다.

  2. nameOrIndex가 주어진 this에서 "all"-인덱스 또는 명명 요소를 가져온 결과를 반환한다.


다음 요소는 "all"-명명 요소이다. a, button, embed, form, frame, frameset, iframe, img, input, map, meta, object, selecttextarea

인덱스 index가 주어진 HTMLAllCollection collection에서 "all"-인덱스 요소를 가져오려면, collectionindex번째 요소를 반환하고, 그러한 index번째 요소가 없으면 null을 반환한다.

이름 name이 주어진 HTMLAllCollection collection에서 "all"-명명 요소를 가져오려면 다음 단계를 수행한다.

  1. name이 빈 문자열이면 null을 반환한다.

  2. subCollectioncollection과 동일한 Document를 루트로 하는 HTMLCollection 객체로 둔다. 이 객체의 필터는 다음 중 하나인 요소에만 일치한다.

  3. subCollection에 요소가 정확히 하나 있으면 해당 요소를 반환한다.

  4. 그렇지 않고 subCollection이 비어 있으면 null을 반환한다.

  5. 그렇지 않으면 subCollection을 반환한다.

nameOrIndex가 주어진 HTMLAllCollection collection에서 "all"-인덱스 또는 명명 요소를 가져오려면:

  1. nameOrIndex를 JavaScript String 값으로 변환한 결과가 배열 인덱스 프로퍼티 이름이면, nameOrIndex가 나타내는 수를 사용하여 collection에서 "all"-인덱스 요소를 가져온 결과를 반환한다.

  2. nameOrIndex가 주어진 collection에서 "all"-명명 요소를 가져온 결과를 반환한다.

2.6.4.1.1 [[Call]] ( thisArgument, argumentsList )
  1. argumentsList크기가 0이거나 argumentsList[0]이 undefined이면 null을 반환한다.

  2. nameOrIndexargumentsList[0]을 DOMString으로 변환한 결과로 둔다.

  3. resultnameOrIndex가 주어진 이 HTMLAllCollection에서 "all"-인덱스 또는 명명 요소를 가져온 결과로 둔다.

  4. result를 ECMAScript 값으로 변환한 결과를 반환한다.

thisArgument는 무시되므로 Function.prototype.call.call(document.all, null, "x")와 같은 코드도 여전히 요소를 검색한다. (document.allFunction.prototype에서 상속하지 않으므로 document.all.call은 존재하지 않는다.)

2.6.4.2 HTMLFormControlsCollection 인터페이스

HTMLFormControlsCollection 인터페이스는 form 요소에 있는 나열된 요소컬렉션에 사용된다.

HTMLFormControlsCollection

현재 모든 엔진에서 지원됨.

Firefox1+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer아니요
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

RadioNodeList

현재 모든 엔진에서 지원됨.

Firefox33+Safari7+Chrome21+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
[Exposed=Window]
interface HTMLFormControlsCollection : HTMLCollection {
  // inherits length and item()
  getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
};

[Exposed=Window]
interface RadioNodeList : NodeList {
  attribute DOMString value;
};
collection.length

collection에 있는 요소 수를 반환한다.

element = collection.item(index)
element = collection[index]

collection의 인덱스 index에 있는 항목을 반환한다. 항목은 트리 순서로 정렬된다.

element = collection.namedItem(name)

HTMLFormControlsCollection/namedItem

현재 모든 엔진에서 지원됨.

Firefox33+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer아니요
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
radioNodeList = collection.namedItem(name)
element = collection[name]
radioNodeList = collection[name]

collection에서 ID 또는 namename인 항목을 반환한다.

일치하는 항목이 여러 개이면 해당 요소를 모두 포함하는 RadioNodeList 객체를 반환한다.

radioNodeList.value

radioNodeList가 나타내는 선택된 첫 번째 라디오 버튼의 값을 반환한다.

radioNodeList.value = value

radioNodeList가 나타내며 값이 value인 첫 번째 라디오 버튼을 선택한다.

객체의 지원되는 프로퍼티 인덱스HTMLCollection 객체에 대해 정의된 것과 같다.

지원되는 프로퍼티 이름컬렉션이 나타내는 모든 요소의 모든 idname 속성의 비어 있지 않은 값으로 구성된다. 값은 트리 순서로 나열되며, 뒤에 나오는 중복 항목은 무시한다. 요소가 두 속성을 모두 제공하고 값이 서로 다르며 어느 것도 앞선 항목의 중복이 아닌 경우, 요소의 id가 해당 요소의 name보다 앞선다.

namedItem(name) 메서드는 다음 알고리즘에 따라 동작해야 한다.

  1. name이 빈 문자열이면 null을 반환하고 알고리즘을 중단한다.
  2. 메서드가 호출된 시점에 컬렉션에 id 속성 또는 name 속성이 name과 같은 노드가 정확히 하나 있으면 해당 노드를 반환하고 알고리즘을 중단한다.
  3. 그렇지 않고 컬렉션에 id 속성 또는 name 속성이 name과 같은 노드가 없으면 null을 반환하고 알고리즘을 중단한다.
  4. 그렇지 않으면 HTMLFormControlsCollection 객체의 라이브 뷰를 나타내는 새로운 RadioNodeList 객체를 생성하고, RadioNodeList 객체에 포함되는 노드가 id 속성 또는 name 속성이 name과 같은 노드뿐이도록 추가로 필터링한다. RadioNodeList 객체의 노드는 트리 순서로 정렬되어야 한다.
  5. 해당 RadioNodeList 객체를 반환한다.

RadioNodeList 인터페이스가 NodeList 인터페이스에서 상속한 멤버는 NodeList 객체에서와 같이 동작해야 한다.

RadioNodeList/value

현재 모든 엔진에서 지원됨.

Firefox33+Safari7+Chrome21+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

RadioNodeList 객체의 value IDL 속성은 가져올 때 다음 단계를 실행하여 반환된 값을 반환해야 한다.

  1. elementRadioNodeList 객체가 나타내는 요소 중 트리 순서상 첫 번째 요소로 둔다. 이 요소는 input 요소이고, 해당 요소의 type 속성이 라디오 버튼 상태이며, 선택 여부가 true여야 한다. 그렇지 않으면 null로 둔다.

  2. element가 null이면 빈 문자열을 반환한다.

  3. elementvalue 속성이 없는 요소이면 문자열 "on"을 반환한다.

  4. 그렇지 않으면 elementvalue 속성값을 반환한다.

설정할 때 value IDL 속성은 다음 단계를 실행해야 한다.

  1. 새 값이 문자열 "on"이면 elementRadioNodeList 객체가 나타내는 요소 중 트리 순서상 첫 번째 요소로 둔다. 이 요소는 input 요소이고, 해당 요소의 type 속성이 라디오 버튼 상태이며, 해당 요소의 value 콘텐츠 속성이 없거나, 존재하는 경우 새 값과 같아야 한다. 그러한 요소가 없으면 대신 element를 null로 둔다.

    그렇지 않으면 elementRadioNodeList 객체가 나타내는 요소 중 트리 순서상 첫 번째 요소로 둔다. 이 요소는 input 요소이고, 해당 요소의 type 속성이 라디오 버튼 상태이며, 해당 요소의 value 콘텐츠 속성이 존재하고 새 값과 같아야 한다. 그러한 요소가 없으면 대신 element를 null로 둔다.

  2. element가 null이 아니면 해당 요소의 선택 여부를 true로 설정한다.

2.6.4.3 HTMLOptionsCollection 인터페이스

HTMLOptionsCollection

현재 모든 엔진에서 지원됨.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLOptionsCollection 인터페이스는 option 요소의 컬렉션에 사용된다. 이는 항상 select 요소를 루트로 하며 해당 요소의 자손을 조작하는 속성과 메서드를 갖는다.

[Exposed=Window]
interface HTMLOptionsCollection : HTMLCollection {
  // inherits item(), namedItem()
  [CEReactions] attribute unsigned long length; // shadows inherited length
  [CEReactions] setter undefined (unsigned long index, HTMLOptionElement? option);
  [CEReactions] undefined add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
  [CEReactions] undefined remove(long index);
  attribute long selectedIndex;
};
collection.length

collection의 요소 수를 반환한다.

collection.length = value

기존 길이보다 작은 수로 설정하면 collection에 대응하는 컨테이너의 option 요소 수를 줄인다.

기존 길이보다 큰 수로 설정하고 해당 수가 100000 이하이면 collection에 대응하는 컨테이너에 새로운 빈 option 요소를 추가한다.

element = collection.item(index)
element = collection[index]

collection의 인덱스 index에 있는 항목을 반환한다. 항목은 트리 순서로 정렬된다.

collection[index] = element

indexcollection의 항목 수보다 크면 대응하는 컨테이너에 새로운 빈 option 요소를 추가한다.

null로 설정하면 collection에서 인덱스 index의 항목을 제거한다.

option 요소로 설정하면 collection의 인덱스 index에 해당 요소를 추가하거나 기존 요소를 대체한다.

element = collection.namedItem(name)
element = collection[name]

collection에서 ID 또는 namename인 항목을 반환한다.

일치하는 항목이 여러 개이면 첫 번째 항목을 반환한다.

collection.add(element[, before])

before가 지정하는 노드 앞에 element를 삽입한다.

before 인수는 숫자일 수 있으며, 이 경우 element는 해당 번호의 항목 앞에 삽입된다. 또는 collection의 요소일 수 있으며, 이 경우 element는 해당 요소 앞에 삽입된다.

before가 생략되거나 null이거나 범위를 벗어난 숫자이면 element는 리스트의 끝에 추가된다.

element가 삽입될 요소의 조상이면 "HierarchyRequestError" DOMException을 던진다.

collection.remove(index)

collection에서 인덱스 index의 항목을 제거한다.

collection.selectedIndex

선택된 첫 번째 항목이 있으면 그 인덱스를 반환하고, 선택된 항목이 없으면 −1을 반환한다.

collection.selectedIndex = index

선택 항목을 collection의 인덱스 index에 있는 option 요소로 변경한다.

객체의 지원되는 프로퍼티 인덱스HTMLCollection 객체에 대해 정의된 것과 같다.

length 가져오기 단계는 컬렉션이 나타내는 노드 수를 반환하는 것이다.

length 설정 단계는 다음과 같다.

  1. current컬렉션이 나타내는 노드 수로 둔다.

  2. 주어진 값이 current보다 큰 경우:

    1. 주어진 값이 100,000보다 크면 반환한다.

    2. nvaluecurrent로 둔다.

    3. n이 주어진 this가 루트로 하는 select 요소에 새로운 option 요소를 추가한다.

  3. 주어진 값이 current보다 작은 경우:

    1. ncurrentvalue로 둔다.

    2. 컬렉션의 마지막 n개 노드를 해당 부모 노드에서 제거한다.

length를 설정해도 optgroup 요소를 제거하거나 추가하지 않으며, 기존 optgroup 요소에 새로운 자식을 추가하지도 않는다. 단, 그 요소의 자식을 제거할 수는 있다.

지원되는 프로퍼티 이름컬렉션이 나타내는 모든 요소의 모든 idname 속성의 비어 있지 않은 값으로 구성된다. 값은 트리 순서로 나열되며 뒤에 나오는 중복 항목은 무시한다. 요소가 두 속성을 모두 제공하고 값이 서로 다르며 어느 것도 앞선 항목의 중복이 아닌 경우, 요소의 id가 해당 요소의 name보다 앞선다.

음이 아닌 정수 count가 주어진 select 요소 select새로운 option 요소를 추가하려면:

  1. fragmentselect노드 문서가 주어졌을 때 문서 프래그먼트를 생성한 결과로 설정합니다.

  2. fragment에 새로운 option 요소 count개를 추가합니다.

  3. fragmentselect추가합니다.

프로퍼티 인덱스 index와 새로운 값 value가 주어진 HTMLOptionsCollection collection에 대해 새로운 인덱스 프로퍼티의 값을 설정하거나 기존 인덱스 프로퍼티의 값을 설정하려면:

  1. value가 null이면 index가 주어진 collection에서 option을 제거하고 반환한다.

  2. lengthcollection나타내는 노드 수로 둔다.

  3. deltaindexlength로 둔다.

  4. delta가 0보다 크면 delta가 주어진 collection이 루트로 하는 select 요소에 새로운 option 요소를 추가한다.

  5. delta가 0 이상이면 collection이 루트로 하는 select 요소에 value추가한다. 그렇지 않으면 collectionindex번째 요소를 value대체한다.

add(element, before) 메서드 단계는 다음과 같다.

  1. elementthis가 루트로 하는 select 요소의 조상이면 "HierarchyRequestError" DOMException을 던진다.

  2. before가 요소이지만 해당 요소가 this가 루트로 하는 select 요소의 자손이 아니면 "NotFoundError" DOMException을 던진다.

  3. elementbefore가 같은 요소이면 반환한다.

  4. reference를 null로 둔다.

  5. before가 노드이면 referencebefore로 설정한다. 그렇지 않고 before가 정수이며 thisbefore번째 노드가 있으면 reference를 해당 노드로 설정한다.

  6. reference가 null이 아니면 parentreference의 부모 노드로 두고, 그렇지 않으면 this가 루트로 하는 select 요소로 둔다.

  7. reference 앞에서 elementparent 노드에 사전 삽입한다.

정수 index가 주어진 HTMLOptionsCollection collection에서 option을 제거하려면:

  1. collection나타내는 노드 수가 0이면 반환한다.

  2. index가 0 이상이고 collection나타내는 노드 수보다 작은 수가 아니면 반환한다.

  3. elementcollectionindex번째 요소로 둔다.

  4. element를 해당 부모 노드에서 제거한다.

remove(index) 메서드 단계는 index가 주어진 this에서 option을 제거하는 것이다.

selectedIndex 가져오기 단계는 this가 루트로 하는 select 요소의 선택된 인덱스를 반환하는 것이다.

selectedIndex 설정 단계는 this가 루트로 하는 select 요소의 선택된 인덱스를 설정하여 주어진 값으로 만드는 것이다.

2.6.5 DOMStringList 인터페이스

DOMStringList

현재 모든 엔진에서 지원됨.

Firefox1+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

DOMStringList 인터페이스는 문자열 리스트를 나타내는 유행이 지난 복고풍 방식이다.

[Exposed=(Window,Worker)]
interface DOMStringList {
  readonly attribute unsigned long length;
  getter DOMString? item(unsigned long index);
  boolean contains(DOMString string);
};

새로운 API는 DOMStringList 대신 sequence<DOMString> 또는 이와 동등한 것을 사용해야 한다.

strings.length

strings의 문자열 수를 반환한다.

strings[index]
strings.item(index)

strings에서 인덱스 index의 문자열을 반환한다.

strings.contains(string)

stringsstring을 포함하면 true를 반환하고, 그렇지 않으면 false를 반환한다.

DOMStringList 객체에는 연관된 리스트가 있다.

DOMStringList 인터페이스는 인덱스 프로퍼티를 지원한다. 지원되는 프로퍼티 인덱스this의 연관된 리스트의 인덱스이다.

DOMStringList/length

현재 모든 엔진에서 지원됨.

Firefox1+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

length 가져오기 단계는 this의 연관된 리스트의 크기를 반환하는 것이다.

DOMStringList/item

현재 모든 엔진에서 지원됨.

Firefox1+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

item(index) 메서드 단계는 this의 연관된 리스트에서 index번째 항목을 반환하고, index에 1을 더한 값이 this의 연관된 리스트의 크기보다 크면 null을 반환하는 것이다.

DOMStringList/contains

현재 모든 엔진에서 지원됨.

Firefox1.5+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

contains(string) 메서드 단계는 this의 연관된 리스트가 string포함하면 true를 반환하고, 그렇지 않으면 false를 반환하는 것이다.

2.7 구조화된 데이터의 안전한 전달

플랫폼 객체를 포함한 JavaScript 객체를 렐름 경계를 넘어 전달할 수 있도록, 이 명세는 객체를 직렬화하고 역직렬화하기 위한 다음 기반 구조를 정의한다. 일부 경우에는 기초 데이터를 복사하는 대신 전송하는 것도 포함한다. 이 직렬화/역직렬화 프로세스를 통칭하여 "구조화된 복제"라고 하지만, 대부분의 API는 직렬화 단계와 역직렬화 단계를 별도로 수행한다. (주목할 만한 예외는 structuredClone() 메서드이다.)

이 절에서는 JavaScript 명세의 용어와 타이포그래피 규칙을 사용한다. [JAVASCRIPT]

2.7.1 직렬화 가능 객체

/developer.mozilla.org/en-US/docs/Glossary/Serializable_object

Firefox103+Safari아니요Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

/developer.mozilla.org/en-US/docs/Glossary/Serializable_object

Firefox103+Safari아니요Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

/developer.mozilla.org/en-US/docs/Glossary/Serializable_object

Firefox103+Safari아니요Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

/developer.mozilla.org/en-US/docs/Glossary/Serializable_object

Firefox103+Safari아니요Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

/developer.mozilla.org/en-US/docs/Glossary/Serializable_object

Firefox103+Safari아니요Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

/developer.mozilla.org/en-US/docs/Glossary/Serializable_object

Firefox103+Safari아니요Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

/developer.mozilla.org/en-US/docs/Glossary/Serializable_object

Firefox103+Safari아니요Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

직렬화 가능 객체는 특정 렐름과 독립적인 방식으로 직렬화되고 나중에 역직렬화되는 것을 지원한다. 이를 통해 디스크에 저장한 후 나중에 복원하거나, 에이전트에이전트 클러스터 경계를 넘어 복제할 수도 있다.

모든 객체가 직렬화 가능 객체인 것은 아니며, 직렬화 가능 객체인 객체의 모든 측면이 직렬화될 때 반드시 보존되는 것도 아니다.

플랫폼 객체는 해당 기본 인터페이스[Serializable] IDL 확장 속성으로 장식된 경우 직렬화 가능 객체일 수 있다. 이러한 인터페이스는 다음 알고리즘도 정의해야 한다.

플랫폼 객체 value, Record serialized 및 불리언 forStorage를 받는 직렬화 단계

value의 데이터를 serialized의 필드로 직렬화하는 단계 집합이다. serialized로 직렬화된 결과 데이터는 어떤 렐름과도 독립적이어야 한다.

직렬화할 수 없으면 이 단계에서 예외를 던질 수 있다.

이 단계에서는 중첩 데이터 구조를 직렬화하기 위해 하위 직렬화를 수행할 수 있다. 중요한 memory 인수를 누락하게 되므로 StructuredSerialize를 직접 호출해서는 안 된다.

forStorage 인수가 알고리즘과 관련이 없으면 이 단계의 도입부에서 해당 인수를 언급하지 않아야 한다.

Record serialized, 플랫폼 객체 value렐름 targetRealm을 받는 역직렬화 단계

serialized의 데이터를 역직렬화하여 적절하게 value를 설정하는 데 사용하는 단계 집합이다. value는 해당 플랫폼 객체 유형의 새로 생성된 인스턴스이며, 내부 데이터는 아무것도 설정되지 않은 상태이다. 이를 설정하는 것이 이 단계의 역할이다.

역직렬화할 수 없으면 이 단계에서 예외를 던질 수 있다.

이 단계에서는 중첩 데이터 구조를 역직렬화하기 위해 하위 역직렬화를 수행할 수 있다. 중요한 targetRealmmemory 인수를 누락하게 되므로 StructuredDeserialize를 직접 호출해서는 안 된다.

이 단계에서 어떤 데이터를 직렬화하고 역직렬화할지는 각 플랫폼 객체의 정의에 달려 있다. 일반적으로 이 단계들은 매우 대칭적이다.

[Serializable] 확장 속성은 인수를 받지 않아야 하며 인터페이스에만 나타나야 한다. 하나의 인터페이스에 두 번 이상 나타나서는 안 된다.

주어진 플랫폼 객체의 경우 (역)직렬화 프로세스에서는 해당 객체의 기본 인터페이스만 고려된다. 따라서 인터페이스 정의에 상속이 포함되면 상속 체인에서 [Serializable]로 주석 처리된 각 인터페이스는 상속된 인터페이스에서 비롯될 수 있는 중요한 데이터까지 고려하는 독립적인 직렬화 단계역직렬화 단계를 정의해야 한다.

두 개의 연관 데이터가 연결된 플랫폼 객체 Person을 정의한다고 가정해 보자.

그런 다음 Person 인터페이스에 [Serializable] 확장 속성을 지정하고 다음 부속 알고리즘을 정의하여 Person 인스턴스를 직렬화 가능 객체로 정의할 수 있다.

valueserialized가 주어진 이들의 직렬화 단계:

  1. serialized.[[Name]]을 value의 연관된 이름 값으로 설정한다.

  2. serializedBestFriendvalue의 연관된 가장 친한 친구 값의 하위 직렬화로 둔다.

  3. serialized.[[BestFriend]]를 serializedBestFriend로 설정한다.

serialized, valuetargetRealm이 주어진 이들의 역직렬화 단계:

  1. value의 연관된 이름 값을 serialized.[[Name]]으로 설정한다.

  2. deserializedBestFriendserialized.[[BestFriend]]의 하위 역직렬화로 둔다.

  3. value의 연관된 가장 친한 친구 값을 deserializedBestFriend로 설정한다.

JavaScript 명세에 정의된 객체는 StructuredSerialize 추상 연산에서 직접 처리된다.

원래 이 명세에서는 한 렐름에서 다른 렐름으로 복제할 수 있는 "복제 가능 객체"라는 개념을 정의했다. 그러나 더 복잡한 특정 상황의 동작을 더 정확하게 명시하기 위해 직렬화와 역직렬화를 명시적으로 만드는 모델로 업데이트되었다.

2.7.2 전송 가능 객체

전송 가능 객체에이전트 간에 전송되는 것을 지원한다. 전송은 기초 데이터에 대한 참조를 공유하면서 객체를 사실상 다시 생성한 다음 전송되는 객체를 분리하는 것이다. 이는 비용이 많이 드는 리소스의 소유권을 전송하는 데 유용하다. 모든 객체가 전송 가능 객체인 것은 아니며, 전송 가능 객체인 객체의 모든 측면이 전송될 때 반드시 보존되는 것도 아니다.

전송은 되돌릴 수 없고 멱등성이 없는 연산이다. 객체가 전송되면 다시 전송할 수도, 실제로 다시 사용할 수도 없다.

플랫폼 객체는 해당 기본 인터페이스[Transferable] IDL 확장 속성으로 장식된 경우 전송 가능 객체일 수 있다. 이러한 인터페이스는 다음 알고리즘도 정의해야 한다.

플랫폼 객체 valueRecord dataHolder를 받는 전송 단계

value의 데이터를 dataHolder의 필드로 전송하는 단계 집합이다. dataHolder에 보관되는 결과 데이터는 어떤 렐름과도 독립적이어야 한다.

전송할 수 없으면 이 단계에서 예외를 던질 수 있다.

Record dataHolder플랫폼 객체 value를 받는 전송 수신 단계

dataHolder의 데이터를 받아 적절하게 value를 설정하는 데 사용하는 단계 집합이다. value는 해당 플랫폼 객체 유형의 새로 생성된 인스턴스이며, 내부 데이터는 아무것도 설정되지 않은 상태이다. 이를 설정하는 것이 이 단계의 역할이다.

전송을 수신할 수 없으면 이 단계에서 예외를 던질 수 있다.

이 단계에서 어떤 데이터를 전송할지는 각 플랫폼 객체의 정의에 달려 있다. 일반적으로 이 단계들은 매우 대칭적이다.

[Transferable] 확장 속성은 인수를 받지 않아야 하며 인터페이스에만 나타나야 한다. 하나의 인터페이스에 두 번 이상 나타나서는 안 된다.

주어진 플랫폼 객체의 경우 전송 프로세스에서는 해당 객체의 기본 인터페이스만 고려된다. 따라서 인터페이스 정의에 상속이 포함되면 상속 체인에서 [Transferable]로 주석 처리된 각 인터페이스는 상속된 인터페이스에서 비롯될 수 있는 중요한 데이터까지 고려하는 독립적인 전송 단계전송 수신 단계를 정의해야 한다.

플랫폼 객체전송 가능 객체인 객체에는 [[Detached]] 내부 슬롯이 있다. 이는 플랫폼 객체가 한 번 전송된 후 다시 전송되지 않도록 보장하는 데 사용된다.

JavaScript 명세에 정의된 객체는 StructuredSerializeWithTransfer 추상 연산에서 직접 처리된다.

2.7.3 StructuredSerializeInternal ( value, forStorage [ , memory ] )

StructuredSerializeInternal 추상 연산은 JavaScript 값 value를 입력으로 받아 렐름과 독립적인 형식으로 직렬화하며, 여기서는 이를 Record로 나타낸다. 이 직렬화된 형식에는 나중에 다른 렐름에서 새로운 JavaScript 값으로 역직렬화하는 데 필요한 모든 정보가 포함된다.

이 프로세스는 예를 들어 직렬화할 수 없는 객체를 직렬화하려고 할 때 예외를 던질 수 있다.

  1. memory가 제공되지 않았으면 memory를 비어 있는 으로 둔다.

    memory 맵의 목적은 객체를 두 번 직렬화하지 않도록 하는 것이다. 그 결과 그래프의 순환과 중복 객체의 동일성이 보존된다.

  2. memory[value]가 존재하면 memory[value]를 반환한다.

  3. deep을 false로 둔다.

  4. value가 undefined, null, Boolean, Number, BigInt 또는 String이면 { [[Type]]: "primitive", [[Value]]: value }를 반환한다.

  5. valueSymbol이면 "DataCloneError" DOMException을 던진다.

  6. serialized를 초기화되지 않은 값으로 둔다.

  7. value에 [[BooleanData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "Boolean", [[BooleanData]]: value.[[BooleanData]] }로 설정한다.

  8. 그렇지 않고 value에 [[NumberData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "Number", [[NumberData]]: value.[[NumberData]] }로 설정한다.

  9. 그렇지 않고 value에 [[BigIntData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "BigInt", [[BigIntData]]: value.[[BigIntData]] }로 설정한다.

  10. 그렇지 않고 value에 [[StringData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "String", [[StringData]]: value.[[StringData]] }로 설정한다.

  11. 그렇지 않고 value에 [[DateValue]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "Date", [[DateValue]]: value.[[DateValue]] }로 설정한다.

  12. 그렇지 않고 value에 [[RegExpMatcher]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "RegExp", [[RegExpMatcher]]: value.[[RegExpMatcher]], [[OriginalSource]]: value.[[OriginalSource]], [[OriginalFlags]]: value.[[OriginalFlags]] }로 설정한다.

  13. 그렇지 않고 value에 [[ArrayBufferData]] 내부 슬롯이 있는 경우:

    1. IsSharedArrayBuffer(value)가 true인 경우:

      1. 현재 설정 객체교차 출처 격리 기능이 false이면 "DataCloneError" DOMException을 던진다.

        이 검사는 직렬화할 때만 필요하고 역직렬화할 때는 필요하지 않다. 교차 출처 격리 기능은 시간에 따라 변경될 수 없고 SharedArrayBuffer에이전트 클러스터를 벗어날 수 없기 때문이다.

      2. forStorage가 true이면 "DataCloneError" DOMException을 던진다.

      3. value에 [[ArrayBufferMaxByteLength]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "GrowableSharedArrayBuffer", [[ArrayBufferData]]: value.[[ArrayBufferData]], [[ArrayBufferByteLengthData]]: value.[[ArrayBufferByteLengthData]], [[ArrayBufferMaxByteLength]]: value.[[ArrayBufferMaxByteLength]], [[AgentCluster]]: 주변 에이전트에이전트 클러스터 }로 설정한다.

      4. 그렇지 않으면 serialized를 { [[Type]]: "SharedArrayBuffer", [[ArrayBufferData]]: value.[[ArrayBufferData]], [[ArrayBufferByteLength]]: value.[[ArrayBufferByteLength]], [[AgentCluster]]: 주변 에이전트에이전트 클러스터 }로 설정한다.

    2. 그렇지 않은 경우:

      1. IsDetachedBuffer(value)가 true이면 "DataCloneError" DOMException을 던진다.

      2. sizevalue.[[ArrayBufferByteLength]]로 둔다.

      3. dataCopy를 ? CreateByteDataBlock(size)로 둔다.

        이는 할당 실패 시 RangeError 예외를 던질 수 있다.

      4. CopyDataBlockBytes(dataCopy, 0, value.[[ArrayBufferData]], 0, size)를 수행한다.

      5. value에 [[ArrayBufferMaxByteLength]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "ResizableArrayBuffer", [[ArrayBufferData]]: dataCopy, [[ArrayBufferByteLength]]: size, [[ArrayBufferMaxByteLength]]: value.[[ArrayBufferMaxByteLength]] }로 설정한다.

      6. 그렇지 않으면 serialized를 { [[Type]]: "ArrayBuffer", [[ArrayBufferData]]: dataCopy, [[ArrayBufferByteLength]]: size }로 설정한다.

  14. 그렇지 않고 value에 [[ViewedArrayBuffer]] 내부 슬롯이 있는 경우:

    1. IsArrayBufferViewOutOfBounds(value)가 true이면 "DataCloneError" DOMException을 던진다.

    2. buffervalue의 [[ViewedArrayBuffer]] 내부 슬롯 값으로 둔다.

    3. bufferSerialized를 ? StructuredSerializeInternal(buffer, forStorage, memory)로 둔다.

    4. 단언: bufferSerialized.[[Type]]은 "ArrayBuffer", "ResizableArrayBuffer", "SharedArrayBuffer" 또는 "GrowableSharedArrayBuffer"이다.

    5. value에 [[DataView]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "ArrayBufferView", [[Constructor]]: "DataView", [[ArrayBufferSerialized]]: bufferSerialized, [[ByteLength]]: value.[[ByteLength]], [[ByteOffset]]: value.[[ByteOffset]] }로 설정한다.

    6. 그렇지 않은 경우:

      1. 단언: value에는 [[TypedArrayName]] 내부 슬롯이 있다.

      2. serialized를 { [[Type]]: "ArrayBufferView", [[Constructor]]: value.[[TypedArrayName]], [[ArrayBufferSerialized]]: bufferSerialized, [[ByteLength]]: value.[[ByteLength]], [[ByteOffset]]: value.[[ByteOffset]], [[ArrayLength]]: value.[[ArrayLength]] }로 설정한다.

  15. 그렇지 않고 value에 [[MapData]] 내부 슬롯이 있는 경우:

    1. serialized를 { [[Type]]: "Map", [[MapData]]: 새로운 빈 List }로 설정한다.

    2. deep을 true로 설정한다.

  16. 그렇지 않고 value에 [[SetData]] 내부 슬롯이 있는 경우:

    1. serialized를 { [[Type]]: "Set", [[SetData]]: 새로운 빈 List }로 설정한다.

    2. deep을 true로 설정한다.

  17. 그렇지 않고 value에 [[ErrorData]] 내부 슬롯이 있으며 value플랫폼 객체가 아닌 경우:

    1. name을 ? Get(value, "name")으로 둔다.

    2. name이 "Error", "EvalError", "RangeError", "ReferenceError", "SyntaxError", "TypeError" 또는 "URIError" 중 하나가 아니면 name을 "Error"로 설정한다.

    3. valueMessageDesc를 ? value.[[GetOwnProperty]]("message")로 둔다.

    4. IsDataDescriptor(valueMessageDesc)가 false이면 message를 undefined로 두고, 그렇지 않으면 ? ToString(valueMessageDesc.[[Value]])로 둔다.

    5. stackvalue.[[Stack]]을 나타내는 구현 정의 문자열로 둔다. [JSERRORSTACKACCESSOR] [JSERRORSTACKS]

    6. serialized를 { [[Type]]: "Error", [[Name]]: name, [[Message]]: message, [[Stack]]: stack }로 설정한다.

    7. 사용자 에이전트는 아직 명시되지 않은 흥미로운 부가 데이터의 직렬화된 표현을 serialized에 첨부하는 것이 좋다.

  18. 그렇지 않고 value가 Array 특수 객체인 경우:

    1. valueLenDescriptor를 ? OrdinaryGetOwnProperty(value, "length")로 둔다.

    2. valueLenvalueLenDescriptor.[[Value]]로 둔다.

    3. serialized를 { [[Type]]: "Array", [[Length]]: valueLen, [[Properties]]: 새로운 빈 List }로 설정한다.

    4. deep을 true로 설정한다.

  19. 그렇지 않고 value플랫폼 객체이며 직렬화 가능 객체인 경우:

    1. value에 값이 true인 [[Detached]] 내부 슬롯이 있으면 "DataCloneError" DOMException을 던진다.

    2. typeStringvalue기본 인터페이스 식별자로 둔다.

    3. serialized를 { [[Type]]: typeString }로 설정한다.

    4. deep을 true로 설정한다.

  20. 그렇지 않고 value플랫폼 객체이면 "DataCloneError" DOMException을 던진다.

  21. 그렇지 않고 IsCallable(value)가 true이면 "DataCloneError" DOMException을 던진다.

  22. 그렇지 않고 value에 [[Prototype]], [[Extensible]] 또는 [[PrivateElements]] 이외의 내부 슬롯이 있으면 "DataCloneError" DOMException을 던진다.

    예를 들어 [[PromiseState]] 또는 [[WeakMapData]] 내부 슬롯이다.

  23. 그렇지 않고 value가 특수 객체이며 value가 어떤 렐름과 연관된 %Object.prototype% 내장 객체가 아니면 "DataCloneError" DOMException을 던진다.

    예를 들어 프록시 객체이다.

  24. 그렇지 않은 경우:

    1. serialized를 { [[Type]]: "Object", [[Properties]]: 새로운 빈 List }로 설정한다.

    2. deep을 true로 설정한다.

    %Object.prototype%은 이 단계와 이후 단계에서 처리된다. 최종 결과로 특수성은 무시되며, 역직렬화 후 결과는 빈 객체가 된다(불변 프로토타입 특수 객체가 아님).

  25. memory[value]를 serialized설정한다.

  26. deep이 true인 경우:

    1. value에 [[MapData]] 내부 슬롯이 있는 경우:

      1. copiedList를 새로운 빈 List로 둔다.

      2. value.[[MapData]]의 각 요소Record { [[Key]], [[Value]] } entry에 대해:

        1. copiedEntry를 새로운 Record { [[Key]]: entry.[[Key]], [[Value]]: entry.[[Value]] }로 둔다.

        2. copiedEntry.[[Key]]가 특수 값 empty가 아니면 copiedEntrycopiedList추가한다.

      3. copiedList의 각 요소Record { [[Key]], [[Value]] } entry에 대해:

        1. serializedKey를 ? StructuredSerializeInternal(entry.[[Key]], forStorage, memory)로 둔다.

        2. serializedValue를 ? StructuredSerializeInternal(entry.[[Value]], forStorage, memory)로 둔다.

        3. { [[Key]]: serializedKey, [[Value]]: serializedValue }를 serialized.[[MapData]]에 추가한다.

    2. 그렇지 않고 value에 [[SetData]] 내부 슬롯이 있는 경우:

      1. copiedList를 새로운 빈 List로 둔다.

      2. value.[[SetData]]의 각 요소 entry에 대해:

        1. entry가 특수 값 empty가 아니면 entrycopiedList추가한다.

      3. copiedList의 각 요소 entry에 대해:

        1. serializedEntry를 ? StructuredSerializeInternal(entry, forStorage, memory)로 둔다.

        2. serializedEntryserialized.[[SetData]]에 추가한다.

    3. 그렇지 않고 value플랫폼 객체이며 직렬화 가능 객체이면, value, serializedforStorage가 주어진 value기본 인터페이스에 대한 직렬화 단계를 수행한다.

      직렬화 단계에서는 하위 직렬화를 수행해야 할 수 있다. 이는 값 subValue를 입력으로 받아 StructuredSerializeInternal(subValue, forStorage, memory)를 반환하는 연산이다. (다시 말해 하위 직렬화는 이 호출 내에서 일관성을 유지하도록 StructuredSerializeInternal을 특수화한 것이다.)

    4. 그렇지 않으면 ! EnumerableOwnProperties(value, key)의 각 key에 대해:

      1. ! HasOwnProperty(value, key)가 true이면:

        1. inputValue를 ? value.[[Get]](key, value)로 둔다.

        2. outputValue를 ? StructuredSerializeInternal(inputValue, forStorage, memory)로 둔다.

        3. { [[Key]]: key, [[Value]]: outputValue }를 serialized.[[Properties]]에 추가한다.

  27. serialized를 반환한다.

StructuredSerializeInternal이 생성한 Record에는 순환 참조를 만드는 다른 레코드에 대한 "포인터"가 포함될 수 있다는 점을 이해하는 것이 중요하다. 예를 들어 다음 JavaScript 객체를 StructuredSerializeInternal에 전달하면:

const o = {};
o.myself = o;

다음 결과를 생성한다.

{
  [[Type]]: "Object",
  [[Properties]]: «
    {
      [[Key]]: "myself",
      [[Value]]: <이 전체 구조를 가리키는 포인터>
    }
  »
}

2.7.4 StructuredSerialize ( value )

  1. ? StructuredSerializeInternal(value, false)를 반환한다.

2.7.5 StructuredSerializeForStorage ( value )

  1. ? StructuredSerializeInternal(value, true)를 반환한다.

2.7.6 StructuredDeserialize ( serialized, targetRealm [ , memory ] )

StructuredDeserialize 추상 연산은 이전에 StructuredSerialize 또는 StructuredSerializeForStorage가 생성한 Record serialized를 입력으로 받아 targetRealm에서 생성된 새로운 JavaScript 값으로 역직렬화한다.

이 프로세스는 예를 들어 새로운 객체, 특히 ArrayBuffer 객체에 메모리를 할당하려고 할 때 예외를 던질 수 있다.

  1. memory가 제공되지 않았으면 memory를 비어 있는 으로 둔다.

    memory 맵의 목적은 객체를 두 번 역직렬화하지 않도록 하는 것이다. 그 결과 그래프의 순환과 중복 객체의 동일성이 보존된다.

  2. memory[serialized]가 존재하면 memory[serialized]를 반환한다.

  3. deep을 false로 둔다.

  4. value를 초기화되지 않은 값으로 둔다.

  5. serialized.[[Type]]이 "primitive"이면 valueserialized.[[Value]]로 설정한다.

  6. 그렇지 않고 serialized.[[Type]]이 "Boolean"이면 value를 [[BooleanData]] 내부 슬롯 값이 serialized.[[BooleanData]]인 targetRealm의 새로운 Boolean 객체로 설정한다.

  7. 그렇지 않고 serialized.[[Type]]이 "Number"이면 value를 [[NumberData]] 내부 슬롯 값이 serialized.[[NumberData]]인 targetRealm의 새로운 Number 객체로 설정한다.

  8. 그렇지 않고 serialized.[[Type]]이 "BigInt"이면 value를 [[BigIntData]] 내부 슬롯 값이 serialized.[[BigIntData]]인 targetRealm의 새로운 BigInt 객체로 설정한다.

  9. 그렇지 않고 serialized.[[Type]]이 "String"이면 value를 [[StringData]] 내부 슬롯 값이 serialized.[[StringData]]인 targetRealm의 새로운 String 객체로 설정한다.

  10. 그렇지 않고 serialized.[[Type]]이 "Date"이면 value를 [[DateValue]] 내부 슬롯 값이 serialized.[[DateValue]]인 targetRealm의 새로운 Date 객체로 설정한다.

  11. 그렇지 않고 serialized.[[Type]]이 "RegExp"이면 value를 [[RegExpMatcher]] 내부 슬롯 값이 serialized.[[RegExpMatcher]]이고, [[OriginalSource]] 내부 슬롯 값이 serialized.[[OriginalSource]]이며, [[OriginalFlags]] 내부 슬롯 값이 serialized.[[OriginalFlags]]인 targetRealm의 새로운 RegExp 객체로 설정한다.

  12. 그렇지 않고 serialized.[[Type]]이 "SharedArrayBuffer"인 경우:

    1. targetRealm에 대응하는 에이전트 클러스터serialized.[[AgentCluster]]가 아니면 "DataCloneError" DOMException을 던진다.

    2. 그렇지 않으면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고 [[ArrayBufferByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLength]]인 targetRealm의 새로운 SharedArrayBuffer 객체로 설정한다.

  13. 그렇지 않고 serialized.[[Type]]이 "GrowableSharedArrayBuffer"인 경우:

    1. targetRealm에 대응하는 에이전트 클러스터serialized.[[AgentCluster]]가 아니면 "DataCloneError" DOMException을 던진다.

    2. 그렇지 않으면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고, [[ArrayBufferByteLengthData]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLengthData]]이며, [[ArrayBufferMaxByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferMaxByteLength]]인 targetRealm의 새로운 SharedArrayBuffer 객체로 설정한다.

  14. 그렇지 않고 serialized.[[Type]]이 "ArrayBuffer"이면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.

    이 과정에서 예외가 발생하면 이를 포착한 다음 "DataCloneError" DOMException을 던진다.

    이러한 ArrayBuffer 객체를 생성할 수 있을 만큼 충분한 메모리가 없으면 이 단계에서 예외가 발생할 수 있다.

  15. 그렇지 않고 serialized.[[Type]]이 "ResizableArrayBuffer"이면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLength]]이며, [[ArrayBufferMaxByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferMaxByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.

    이 과정에서 예외가 발생하면 이를 포착한 다음 "DataCloneError" DOMException을 던진다.

    이러한 ArrayBuffer 객체를 생성할 수 있을 만큼 충분한 메모리가 없으면 이 단계에서 예외가 발생할 수 있다.

  16. 그렇지 않고 serialized.[[Type]]이 "ArrayBufferView"인 경우:

    1. deserializedArrayBuffer를 ? StructuredDeserialize(serialized.[[ArrayBufferSerialized]], targetRealm, memory)로 둔다.

    2. serialized.[[Constructor]]가 "DataView"이면 value를 [[ViewedArrayBuffer]] 내부 슬롯 값이 deserializedArrayBuffer이고, [[ByteLength]] 내부 슬롯 값이 serialized.[[ByteLength]]이며, [[ByteOffset]] 내부 슬롯 값이 serialized.[[ByteOffset]]인 targetRealm의 새로운 DataView 객체로 설정한다.

    3. 그렇지 않으면 valueserialized.[[Constructor]]가 지정한 생성자를 사용하여 생성한 targetRealm의 새로운 형식화 배열 객체로 설정한다. 이 객체의 [[ViewedArrayBuffer]] 내부 슬롯 값은 deserializedArrayBuffer이고, [[TypedArrayName]] 내부 슬롯 값은 serialized.[[Constructor]]이며, [[ByteLength]] 내부 슬롯 값은 serialized.[[ByteLength]]이고, [[ByteOffset]] 내부 슬롯 값은 serialized.[[ByteOffset]]이며, [[ArrayLength]] 내부 슬롯 값은 serialized.[[ArrayLength]]이다.

  17. 그렇지 않고 serialized.[[Type]]이 "Map"인 경우:

    1. value를 [[MapData]] 내부 슬롯 값이 새로운 빈 ListtargetRealm의 새로운 Map 객체로 설정한다.

    2. deep을 true로 설정한다.

  18. 그렇지 않고 serialized.[[Type]]이 "Set"인 경우:

    1. value를 [[SetData]] 내부 슬롯 값이 새로운 빈 ListtargetRealm의 새로운 Set 객체로 설정한다.

    2. deep을 true로 설정한다.

  19. 그렇지 않고 serialized.[[Type]]이 "Array"인 경우:

    1. outputPrototargetRealm.[[Intrinsics]].[[%Array.prototype%]]로 둔다.

    2. value를 ! ArrayCreate(serialized.[[Length]], outputProto)로 설정한다.

    3. deep을 true로 설정한다.

  20. 그렇지 않고 serialized.[[Type]]이 "Object"인 경우:

    1. valuetargetRealm의 새로운 Object로 설정한다.

    2. deep을 true로 설정한다.

  21. 그렇지 않고 serialized.[[Type]]이 "Error"인 경우:

    1. prototype%Error.prototype%으로 둔다.

    2. serialized.[[Name]]이 "EvalError"이면 prototype%EvalError.prototype%으로 설정한다.

    3. serialized.[[Name]]이 "RangeError"이면 prototype%RangeError.prototype%으로 설정한다.

    4. serialized.[[Name]]이 "ReferenceError"이면 prototype%ReferenceError.prototype%으로 설정한다.

    5. serialized.[[Name]]이 "SyntaxError"이면 prototype%SyntaxError.prototype%으로 설정한다.

    6. serialized.[[Name]]이 "TypeError"이면 prototype%TypeError.prototype%으로 설정한다.

    7. serialized.[[Name]]이 "URIError"이면 prototype%URIError.prototype%으로 설정한다.

    8. messageserialized.[[Message]]로 둔다.

    9. valueOrdinaryObjectCreate(prototype, « [[ErrorData]], [[Stack]] »)로 설정한다.

    10. messageDescPropertyDescriptor { [[Value]]: message, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }로 둔다.

    11. message가 undefined가 아니면 ! OrdinaryDefineOwnProperty(value, "message", messageDesc)를 수행한다.

    12. value.[[Stack]]을 serialized.[[Stack]]으로 설정한다.

    13. serialized에 첨부된 흥미로운 부가 데이터는 역직렬화하여 value에 첨부하는 것이 좋다.

  22. 그렇지 않은 경우:

    1. interfaceNameserialized.[[Type]]으로 둔다.

    2. interfaceName이 식별하는 인터페이스가 targetRealm노출되지 않았으면 "DataCloneError" DOMException을 던진다.

    3. valuetargetRealm에서 생성된, interfaceName이 식별하는 인터페이스의 새로운 인스턴스로 설정한다.

    4. deep을 true로 설정한다.

  23. memory[serialized]를 value설정한다.

  24. deep이 true인 경우:

    1. serialized.[[Type]]이 "Map"인 경우:

      1. serialized.[[MapData]]의 각 요소Record { [[Key]], [[Value]] } entry에 대해:

        1. deserializedKey를 ? StructuredDeserialize(entry.[[Key]], targetRealm, memory)로 둔다.

        2. deserializedValue를 ? StructuredDeserialize(entry.[[Value]], targetRealm, memory)로 둔다.

        3. { [[Key]]: deserializedKey, [[Value]]: deserializedValue }를 value.[[MapData]]에 추가한다.

    2. 그렇지 않고 serialized.[[Type]]이 "Set"인 경우:

      1. serialized.[[SetData]]의 각 요소 entry에 대해:

        1. deserializedEntry를 ? StructuredDeserialize(entry, targetRealm, memory)로 둔다.

        2. deserializedEntryvalue.[[SetData]]에 추가한다.

    3. 그렇지 않고 serialized.[[Type]]이 "Array" 또는 "Object"인 경우:

      1. serialized.[[Properties]]의 각 요소Record { [[Key]], [[Value]] } entry에 대해:

        1. deserializedValue를 ? StructuredDeserialize(entry.[[Value]], targetRealm, memory)로 둔다.

        2. result를 ! CreateDataProperty(value, entry.[[Key]], deserializedValue)로 둔다.

        3. 단언: result는 true이다.

    4. 그렇지 않은 경우:

      1. serialized, valuetargetRealm이 주어진, serialized.[[Type]]이 식별하는 인터페이스에 대한 적절한 역직렬화 단계를 수행한다.

        역직렬화 단계에서는 하위 역직렬화를 수행해야 할 수 있다. 이는 이전에 직렬화된 Record subSerialized를 입력으로 받아 StructuredDeserialize(subSerialized, targetRealm, memory)를 반환하는 연산이다. (다시 말해 하위 역직렬화는 이 호출 내에서 일관성을 유지하도록 StructuredDeserialize를 특수화한 것이다.)

  25. value를 반환한다.

2.7.7 StructuredSerializeWithTransfer ( value, transferList )

  1. memory를 빈 으로 둔다.

    StructuredSerializeInternal에서 일반적으로 사용되는 방식에 더해, 이 알고리즘에서 memory는 또한 StructuredSerializeInternaltransferList의 항목을 무시하도록 보장하고, 대신 자체적으로 처리할 수 있게 하는 데 사용된다.

  2. 각각에 대해 transferListtransferable:

    1. transferable에 [[ArrayBufferData]] 내부 슬롯도 [[Detached]] 내부 슬롯도 없으면 "DataCloneError" DOMException을 던진다.

    2. transferable에 [[ArrayBufferData]] 내부 슬롯이 있고 IsSharedArrayBuffer(transferable)가 true이면 "DataCloneError" DOMException을 던진다.

    3. memory[transferable]가 존재하면, "DataCloneError" DOMException을 던진다.

    4. 설정한다. memory[transferable]를 { [[Type]]: 초기화되지 않은 값 }으로.

      전송에는 부작용이 있고 StructuredSerializeInternal이 먼저 예외를 던질 수 있어야 하므로 transferable은 아직 전송되지 않는다.

  3. serialized를 ? StructuredSerializeInternal(value, false, memory)로 둔다.

  4. transferDataHolders를 새로운 빈 List로 둔다.

  5. 각각에 대해 transferListtransferable:

    1. transferable에 [[ArrayBufferData]] 내부 슬롯이 있고 IsDetachedBuffer(transferable)가 true이면 "DataCloneError" DOMException을 던진다.

    2. transferable[[Detached]] 내부 슬롯이 있고 transferable.[[Detached]]가 true이면 "DataCloneError" DOMException을 던진다.

    3. dataHoldermemory[transferable]로 둔다.

    4. transferable에 [[ArrayBufferData]] 내부 슬롯이 있으면:

      1. transferable에 [[ArrayBufferMaxByteLength]] 내부 슬롯이 있으면:

        1. dataHolder.[[Type]]을 "ResizableArrayBuffer"로 설정한다.

        2. dataHolder.[[ArrayBufferData]]를 transferable.[[ArrayBufferData]]로 설정한다.

        3. dataHolder.[[ArrayBufferByteLength]]를 transferable.[[ArrayBufferByteLength]]로 설정한다.

        4. dataHolder.[[ArrayBufferMaxByteLength]]를 transferable.[[ArrayBufferMaxByteLength]]로 설정한다.

      2. 그렇지 않은 경우:

        1. dataHolder.[[Type]]을 "ArrayBuffer"로 설정한다.

        2. dataHolder.[[ArrayBufferData]]를 transferable.[[ArrayBufferData]]로 설정한다.

        3. dataHolder.[[ArrayBufferByteLength]]를 transferable.[[ArrayBufferByteLength]]로 설정한다.

      3. ? DetachArrayBuffer(transferable)를 수행한다.

        명세는 [[ArrayBufferDetachKey]] 내부 슬롯을 사용하여 ArrayBuffer가 분리되지 않도록 할 수 있다. 예를 들어 이는 WebAssembly JavaScript Interface에서 사용된다. [WASMJS]

    5. 그렇지 않은 경우:

      1. 단언: transferable플랫폼 객체이며 전송 가능 객체이다.

      2. interfaceNametransferable기본 인터페이스 식별자로 둔다.

      3. dataHolder.[[Type]]을 interfaceName으로 설정한다.

      4. transferabledataHolder가 주어졌을 때 interfaceName으로 식별되는 인터페이스에 적절한 전송 단계를 수행한다.

      5. transferable.[[Detached]]를 true로 설정한다.

    6. 추가한다. dataHoldertransferDataHolders에.

  6. { [[Serialized]]: serialized, [[TransferDataHolders]]: transferDataHolders }를 반환한다.

2.7.8 StructuredDeserializeWithTransfer ( serializeWithTransferResult, targetRealm )

  1. memory를 빈 으로 둔다.

    StructuredSerializeWithTransfer와 마찬가지로, 이 알고리즘에서 memoryStructuredDeserialize에서 일반적으로 사용되는 방식에 더해 StructuredDeserializeserializeWithTransferResult.[[TransferDataHolders]]의 항목을 무시하도록 보장하고, 대신 자체적으로 처리할 수 있게 하는 데에도 사용된다.

  2. transferredValues를 새로운 빈 List로 둔다.

  3. serializeWithTransferResult.[[TransferDataHolders]]의 transferDataHolder에 대해:

    1. value를 초기화되지 않은 값으로 둔다.

    2. transferDataHolder.[[Type]]이 "ArrayBuffer"이면, value를 [[ArrayBufferData]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.

      [[ArrayBufferData]]가 원래 차지하던 메모리에 역직렬화 중 접근할 수 있는 경우에는 새로운 메모리를 할당할 필요가 없으므로 이 단계에서 예외가 발생할 가능성이 낮다. 대신 [[ArrayBufferData]]가 차지하던 메모리가 새로운 ArrayBuffer로 그대로 전송된다. 예를 들어 출처 렐름과 대상 렐름이 모두 같은 프로세스에 있는 경우가 이에 해당할 수 있다.

    3. 그렇지 않고 transferDataHolder.[[Type]]이 "ResizableArrayBuffer"이면, value를 [[ArrayBufferData]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferByteLength]]이며, [[ArrayBufferMaxByteLength]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferMaxByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.

      이전 단계와 같은 이유로 이 단계에서도 예외가 발생할 가능성이 낮다.

    4. 그렇지 않은 경우:

      1. interfaceNametransferDataHolder.[[Type]]으로 둔다.

      2. interfaceName으로 식별되는 인터페이스가 targetRealm에 노출되지 않으면 "DataCloneError" DOMException을 던진다.

      3. valuetargetRealm에서 생성된, interfaceName으로 식별되는 인터페이스의 새로운 인스턴스로 설정한다.

      4. transferDataHoldervalue가 주어졌을 때 interfaceName으로 식별되는 인터페이스에 적절한 전송 수신 단계를 수행한다.

    5. memory[transferDataHolder]를 설정하여 value로 한다.

    6. value를 추가하여 transferredValues에 넣는다.

  4. deserialized를 ? StructuredDeserialize(serializeWithTransferResult.[[Serialized]], targetRealm, memory)로 둔다.

  5. { [[Deserialized]]: deserialized, [[TransferredValues]]: transferredValues }를 반환한다.

2.7.9 다른 명세에서 직렬화 및 전송 수행하기

다른 명세에서는 여기에 정의된 추상 연산을 사용할 수 있다. 다음에서는 각 추상 연산이 일반적으로 유용한 경우에 관한 몇 가지 지침과 예를 제공한다.

StructuredSerializeWithTransfer
StructuredDeserializeWithTransfer

전송 리스트와 함께 값을 다른 렐름으로 복제하지만 대상 렐름을 미리 알 수 없는 경우이다. 이 경우 직렬화 단계는 즉시 수행할 수 있으며, 역직렬화 단계는 대상 렐름을 알게 될 때까지 지연할 수 있다.

messagePort.postMessage()는 대상 렐름을 MessagePort전송될 때까지 알 수 없으므로 이 추상 연산 쌍을 사용한다.

StructuredSerialize
StructuredSerializeForStorage
StructuredDeserialize

주어진 값에 대해 렐름과 독립적인 스냅샷을 생성하여 무기한 저장한 다음, 나중에 하나 이상의 JavaScript 값으로 다시 구체화할 수 있는 경우이다.

StructuredSerializeForStorage는 직렬화 결과를 렐름 간에 전달하는 대신 영구적인 방식으로 저장할 것으로 예상되는 상황에서 사용할 수 있다. 공유 메모리를 저장하는 것은 의미가 없으므로 SharedArrayBuffer 객체를 직렬화하려고 하면 예외를 던진다. 마찬가지로 forStorage 인수가 true일 때 사용자 정의 플랫폼 객체직렬화 단계가 있으면 예외를 던지거나 다른 동작을 할 수 있다.

history.pushState()history.replaceState()는 작성자가 제공한 상태 객체에 StructuredSerializeForStorage를 사용하고, 이를 적절한 직렬화된 상태세션 기록 항목에 저장한다. 그런 다음 StructuredDeserialize를 사용하여 history.state 속성이 원래 제공된 상태 객체의 복제본을 반환할 수 있게 한다.

broadcastChannel.postMessage()는 입력에 StructuredSerialize를 사용한 다음 결과에 StructuredDeserialize를 여러 번 사용하여 브로드캐스트되는 각 대상에 새로운 복제본을 생성한다. 여러 대상이 있는 상황에서는 전송이 의미가 없다는 점에 유의한다.

JavaScript 값을 파일 시스템에 영구 저장하는 모든 API 역시 입력에 StructuredSerializeForStorage를 사용하고 출력에 StructuredDeserialize를 사용한다.

일반적으로 호출 지점은 JavaScript 값 대신 Web IDL 값을 전달할 수 있다. 이는 이러한 알고리즘을 호출하기 전에 JavaScript 값으로 암시적인 변환을 수행하는 것으로 이해해야 한다.


작성자 코드가 사용자 에이전트 메서드를 동기적으로 호출한 결과로 호출되지 않는 호출 지점은 임의의 객체에 대해 StructuredSerialize, StructuredSerializeForStorage 또는 StructuredSerializeWithTransfer 추상 연산을 호출하기 전에 적절하게 스크립트 실행을 준비하고 콜백 실행을 준비해야 한다. 이는 직렬화 프로세스가 마지막 심층 직렬화 단계의 일부로 작성자가 정의한 접근자를 호출할 수 있고, 이러한 접근자가 진입현행 개념이 올바르게 설정되어 있어야 하는 연산을 호출할 수 있기 때문이다.

window.postMessage()는 인수에 StructuredSerializeWithTransfer를 사용하지만 알고리즘의 동기적 부분 내에서 즉시 수행하도록 주의한다. 따라서 스크립트 실행을 준비하고 콜백 실행을 준비할 필요 없이 이 알고리즘을 사용할 수 있다.

반대로 가상의 API가 StructuredSerialize를 사용하여 작성자가 제공한 객체를 태스크에서 직접 이벤트 루프상에서 주기적으로 직렬화한다면, 사전에 적절한 준비를 수행하도록 보장해야 한다. 현재 플랫폼에는 이러한 API가 없는 것으로 알려져 있다. 일반적으로 작성자 코드의 동기적인 결과로 직렬화를 미리 수행하는 것이 더 간단하다.

2.7.10 구조화된 복제 API

result = self.structuredClone(value[, { transfer }])

입력 값을 받아 구조화된 복제 알고리즘을 수행하여 심층 복사본을 반환한다. 전송 가능 객체transfer 배열에 나열된 객체는 단순히 복제되는 것이 아니라 전송되며, 이는 입력 값에서 더 이상 사용할 수 없음을 의미한다.

입력 값의 일부라도 "DataCloneError" DOMException을 던진다. 입력 값의 일부라도 직렬화 가능하지 않은 경우이다.

structuredClone

현재 모든 엔진에서 지원된다.

Firefox94+Safari15.4+Chrome98+
Opera?Edge98+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

structuredClone(value, options) 메서드 단계는 다음과 같다.

  1. serialized를 ? StructuredSerializeWithTransfer(value, options["transfer"])로 둔다.

  2. deserializeRecord를 ? StructuredDeserializeWithTransfer(serialized, this관련 렐름)으로 둔다.

  3. deserializeRecord.[[Deserialized]]를 반환한다.

3 HTML 문서의 의미 체계, 구조 및 API

3.1 문서

HTML UA의 모든 XML 및 HTML 문서는 Document 객체로 표현된다. [DOM]

Document 객체의 URLDOM에 정의되어 있다. 이는 Document 객체가 생성될 때 처음 설정되지만, Document 객체의 수명 동안 변경될 수 있다. 예를 들어 사용자가 페이지의 탐색을 통해 프래그먼트로 이동하거나 pushState() 메서드가 새로운 URL과 함께 호출되면 변경된다. [DOM]

대화형 사용자 에이전트는 일반적으로 Document 객체의 URL을 사용자 인터페이스에 노출한다. 이는 사용자가 사이트가 다른 사이트를 사칭하려 하는지 판단할 수 있는 주요 메커니즘이다.

Document 객체의 출처DOM에 정의되어 있다. 이는 Document 객체가 생성될 때 처음 설정되며, Document의 수명 동안 document.domain을 설정할 때에만 변경될 수 있다. Document출처는 그 출처URL과 다를 수 있다. 예를 들어 자식 탐색 가능 항목생성되면, 그 활성 문서출처는 그 부모활성 문서출처에서 상속된다. 이는 그 활성 문서URLabout:blank인 경우에도 마찬가지이다. [DOM]

Document스크립트에서 createDocument() 또는 createHTMLDocument() 메서드를 사용하여 생성되면, Document는 즉시 로드 후 태스크를 수행할 준비가 된다.

문서의 리퍼러URL을 나타내는 문자열로, Document가 생성될 때 설정할 수 있다. 명시적으로 설정하지 않으면 그 값은 빈 문자열이다.

3.1.1 Document 객체

Document

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera3+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android10.1+

DOMDocument 인터페이스를 정의하며, 이 명세는 이를 상당히 확장한다.

enum DocumentReadyState { "loading", "interactive", "complete" };
enum DocumentVisibilityState { "visible", "hidden" };
typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement;

[LegacyOverrideBuiltIns]
partial interface Document {
  static Document parseHTMLUnsafe((TrustedHTML or DOMString) html, optional ParseHTMLUnsafeOptions options = {});
  static Document parseHTML(DOMString html, optional SetHTMLOptions options = {});

  // resource metadata management
  [PutForwards=href, LegacyUnforgeable] readonly attribute Location? location;
  attribute USVString domain;
  readonly attribute USVString referrer;
  attribute USVString cookie;
  readonly attribute DOMString lastModified;
  readonly attribute DocumentReadyState readyState;

  // DOM tree accessors
  getter object (DOMString name);
  [CEReactions] attribute DOMString title;
  [CEReactions] attribute DOMString dir;
  [CEReactions] attribute HTMLElement? body;
  readonly attribute HTMLHeadElement? head;
  [SameObject] readonly attribute HTMLCollection images;
  [SameObject] readonly attribute HTMLCollection embeds;
  [SameObject] readonly attribute HTMLCollection plugins;
  [SameObject] readonly attribute HTMLCollection links;
  [SameObject] readonly attribute HTMLCollection forms;
  [SameObject] readonly attribute HTMLCollection scripts;
  NodeList getElementsByName(DOMString elementName);
  readonly attribute HTMLOrSVGScriptElement? currentScript; // classic scripts in a document tree only

  // dynamic markup insertion
  [CEReactions] Document open(optional DOMString unused1, optional DOMString unused2); // both arguments are ignored
  WindowProxy? open(USVString url, DOMString name, DOMString features);
  [CEReactions] undefined close();
  [CEReactions] undefined write((TrustedHTML or DOMString)... text);
  [CEReactions] undefined writeln((TrustedHTML or DOMString)... text);

  // user interaction
  readonly attribute WindowProxy? defaultView;
  boolean hasFocus();
  [CEReactions] attribute DOMString designMode;
  [CEReactions] boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = "");
  boolean queryCommandEnabled(DOMString commandId);
  boolean queryCommandIndeterm(DOMString commandId);
  boolean queryCommandState(DOMString commandId);
  boolean queryCommandSupported(DOMString commandId);
  DOMString queryCommandValue(DOMString commandId);
  readonly attribute boolean hidden;
  readonly attribute DocumentVisibilityState visibilityState;

  // special event handler IDL attributes that only apply to Document objects
  [LegacyLenientThis] attribute EventHandler onreadystatechange;
  attribute EventHandler onvisibilitychange;

  // also has obsolete members
};
Document includes GlobalEventHandlers;

Document에는 정책 컨테이너가 있으며, 이는 처음에는 새로운 정책 컨테이너이고, Document에 적용되는 정책을 포함한다.

Document에는 권한 정책이 있으며, 이는 권한 정책이고 처음에는 비어 있다.

Document에는 모듈 맵이 있으며, 이는 처음에 비어 있는 모듈 맵이다.

Document에는 오프너 정책이 있으며, 이는 처음에 새로운 오프너 정책인 오프너 정책이다.

Document에는 초기 about:blank 여부가 있으며, 이는 처음에 false인 불리언이다.

Document에는 WebDriver BiDi용 로드 중 탐색 ID가 있으며, 이는 처음에 null인 탐색 ID 또는 null이다.

이름에서 알 수 있듯이 이는 WebDriver BiDi 명세와 상호작용하는 데 사용된다. 이 명세에는 Document 수명 주기의 초기 부분에 발생하는 특정 사건을 알려야 하며, 이 사건을 해당 Document를 생성한 탐색이 진행 중인 탐색이었을 때 사용된 원래 탐색 ID에 연결해야 한다. 이는 WebDriver BiDi가 로드 프로세스가 완료되었다고 간주한 후 결국 다시 null로 설정된다. [BIDI]

Document에는 about 기준 URL이 있으며, 이는 처음에 null인 URL 또는 null이다.

이는 "about:" 스킴을 사용하는 Document에만 채워진다.

Document에는 bfcache 차단 세부 정보가 있으며, 이는 처음에 비어 있는 집합복원되지 않은 이유 세부 정보의 집합이다.

Document에는 열린 대화상자 리스트가 있으며, 이는 처음에 비어 있는 리스트dialog 요소의 리스트이다.

3.1.2 DocumentOrShadowRoot 인터페이스

DOMDocumentOrShadowRoot 믹스인을 정의하며, 이 명세는 이를 확장한다.

partial interface mixin DocumentOrShadowRoot {
  readonly attribute Element? activeElement;
};

3.1.3 조상 출처

Document 객체에는 연관된 내부 조상 출처 객체 리스트가 있으며, 처음에는 null이다.

Document 객체 document리퍼러 정책 referrerPolicy이 주어질 때 내부 조상 출처 객체 리스트 생성 단계는 다음과 같다.

  1. output을 « »로 둔다.

  2. parentDocdocument컨테이너 문서로 둔다.

  3. parentDoc이 null이면 output을 반환한다.

  4. 단언: parentDoc완전히 활성 상태이다.

  5. ancestorOriginsparentDoc내부 조상 출처 객체 리스트로 둔다.

  6. containerdocument노드 탐색 가능 항목컨테이너로 둔다.

  7. masked를 false로 둔다.

  8. referrerPolicy가 "no-referrer"이면 masked를 true로 설정한다.

  9. 그렇지 않고 referrerPolicy가 "same-origin"이며 parentDoc출처document동일 출처출처가 아니면 masked를 true로 설정한다.

    혼합 콘텐츠 검사는 비보안 컨텍스트 환경보안 컨텍스트 환경에 존재하는 것을 방지하므로, "strict-origin", "strict-origin-when-cross-origin" 및 "no-referrer-when-downgrade"에 대해 보안 컨텍스트를 확인할 필요가 없다. 여기서는 최대한 출처만 노출하므로 "origin" 및 "origin-when-cross-origin" 값에도 특별한 처리가 필요하지 않다.

  10. masked가 true이면 새로운 추가불투명 출처output에 넣는다.

  11. 그렇지 않으면 parentDoc의 추가출처output에 넣는다.

  12. ancestorOriginsancestorOrigin에 대해:

    1. masked가 true이고 ancestorOriginparentDoc동일 출처출처이면, 새로운 추가불투명 출처output에 넣고 계속한다.

    2. ancestorOrigin을 추가하여 output에 넣고 masked를 false로 설정한다.

      여기서 masked를 false로 설정한다고 해서 이후 모든 조상의 출처가 반드시 노출된다는 의미는 아니다. 조상 문서가 이 단계를 실행했을 때 이미 마스킹되었을 수 있으며, 결과 리스트는 자식 문서를 생성할 때 시작점으로 사용된다 (위의 5단계 참조).

  13. output을 반환한다.

Document 객체에는 연관된 조상 출처 리스트가 있으며, 처음에는 null이다.

Document 객체 document가 주어질 때 조상 출처 리스트 생성 단계는 다음과 같다.

  1. ancestorOriginsdocument내부 조상 출처 객체 리스트로 둔다.

  2. 단언: ancestorOrigins는 null이 아니다.

  3. output을 « »로 둔다.

  4. ancestorOriginsorigin에 대해:

    1. origin의 추가직렬화output에 넣는다.

  5. 연관 리스트가 output인 새로운 DOMStringList 객체를 반환한다.

URL이 https://a.example/top최상위 브라우징 컨텍스트 문서를 살펴보자.

<!doctype html>
<title>top</title>
<iframe referrerpolicy="no-referrer" src="https://a.example/child"></iframe>

자식 문서는 다음과 같다.

<!doctype html>
<title>child</title>
<iframe src="https://b.example/grandchild"></iframe>
<script>
 console.log([...location.ancestorOrigins]);
</script>

손자 문서는 다음과 같다.

<!doctype html>
<title>grandchild</title>
<script>
 console.log([...location.ancestorOrigins]);
</script>

자식의 Document 객체가 생성될 때 부모의 출처는 iframe 요소의 referrerpolicy 속성 값이 "no-referrer"이므로 마스킹된다. 문서들이 동일 출처임에도 그렇다. 기록되는 값은 « "null" »이다.

손자의 Document 객체가 생성될 때 자식의 Document 객체의 내부 조상 출처 객체 리스트(하나의 불투명 출처를 포함함)가 시작점으로 사용되고 자식의 출처가 리스트에 추가된다. 따라서 기록되는 값은 « "https://a.example", "null" »이다.

이전 예에서 최상위 문서의 iframe 요소에는 referrerpolicy 속성이 없고, 대신 자식 문서의 iframe 요소에 referrerpolicy="no-referrer"가 있다고 하자.

이 경우 최상위 문서의 출처가 자식의 Document 객체의 내부 조상 출처 객체 리스트에 추가된다. 기록되는 값은 « "https://a.example" »이다.

손자의 경우 자식의 출처불투명 출처로 마스킹된다. 최상위 문서의 출처가 자식 문서의 동일 출처출처이므로 이 역시 마스킹된다. 따라서 기록되는 값은 « "null", "null" »이다.

이 예에서는 중간에 교차 출처 문서가 있으므로 출처가 마스킹된 동일 출처 자손 문서가 있더라도 최상위 문서의 출처는 마스킹되지 않음을 보여 준다.

이전 예에서 최상위 문서의 iframe에도 referrerpolicy="no-referrer"가 있다면, 각 문서에 대한 결과 조상 출처 리스트의 연관 리스트는 다음과 같다.

3.1.4 리소스 메타데이터 관리

document.referrer

Document/referrer

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera3+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

차단되었거나 그러한 문서가 없지 않은 한, 사용자가 현재 문서로 탐색해 온 DocumentURL을 반환한다. 차단되었거나 그러한 문서가 없으면 빈 문자열을 반환한다.

noreferrer 링크 유형을 사용하여 리퍼러를 차단할 수 있다.

referrer 속성은 문서의 리퍼러를 반환해야 한다.


document.cookie [ = value ]

Document에 적용되는 HTTP 쿠키를 반환한다. 쿠키가 없거나 이 리소스에 쿠키를 적용할 수 없으면 빈 문자열을 반환한다.

설정하여 요소의 HTTP 쿠키 집합에 새 쿠키를 추가할 수 있다.

콘텐츠가 불투명 출처로 샌드박스 처리된 경우(예: iframesandbox 속성이 있는 경우), 가져오기 및 설정 시 "SecurityError" DOMException이 발생한다.

Document/cookie

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera3+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

cookie 속성은 문서의 URL로 식별되는 리소스의 쿠키를 나타낸다.

동기식 document.cookie API를 사용하면 성능 문제가 발생할 수 있다. 대신 비동기 방식으로 쿠키를 처리하여 성능 문제를 피할 수 있는 Cookie Store API를 사용할 수 있다. 자세한 내용은 Cookie Store API 소개를 참조한다. [COOKIESTORE]

다음 조건 중 하나에 해당하는 Document 객체는 쿠키 비수용 Document 객체이다.

(This is a tracking vector.) 가져올 때 문서가 쿠키 비수용 Document 객체이면 사용자 에이전트는 빈 문자열을 반환해야 한다. 그렇지 않고 Document출처불투명 출처이면 사용자 에이전트는 "SecurityError" DOMException을 던져야 한다. 그렇지 않으면 사용자 에이전트는 문서의 URL에 대한 "비 HTTP" API용 쿠키 문자열BOM 없이 UTF-8 디코딩하여 반환해야 한다. [COOKIES]

설정할 때 문서가 쿠키 비수용 Document 객체이면 사용자 에이전트는 아무 작업도 하지 않아야 한다. 그렇지 않고 Document출처불투명 출처이면 사용자 에이전트는 "SecurityError" DOMException을 던져야 한다. 그렇지 않으면 사용자 에이전트는 새 값을 UTF-8로 인코딩한 것으로 구성된 "비 HTTP" API를 통해 문서의 URL에 대한 set-cookie-string을 수신했을 때와 같이 동작해야 한다. [COOKIES] [ENCODING]

cookie 속성은 프레임 간에 접근할 수 있으므로 쿠키의 경로 제한은 어떤 쿠키가 사이트의 어느 부분으로 전송되는지를 관리하는 데 도움을 주는 도구일 뿐이며, 어떠한 방식으로도 보안 기능이 아니다.

cookie 속성의 getter와 setter는 공유 상태에 동기적으로 접근한다. 잠금 메커니즘이 없으므로 다중 프로세스 사용자 에이전트의 다른 브라우징 컨텍스트가 스크립트 실행 중에 쿠키를 수정할 수 있다. 예를 들어 사이트가 쿠키를 읽고 값을 증가시킨 다음 다시 기록하여 쿠키의 새 값을 세션의 고유 식별자로 사용하려 할 수 있다. 사이트가 서로 다른 두 브라우저 창에서 이 작업을 동시에 두 번 수행하면, 두 세션 모두에 동일한 "고유" 식별자를 사용하게 되어 잠재적으로 심각한 결과가 발생할 수 있다.


document.lastModified

Document/lastModified

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

서버가 보고한 문서의 마지막 수정 날짜를 사용자의 현지 시간대로 "MM/DD/YYYY hh:mm:ss" 형식으로 반환한다.

마지막 수정 날짜를 알 수 없으면 대신 현재 시간을 반환한다.

lastModified 속성은 가져올 때 Document의 소스 파일이 마지막으로 수정된 날짜와 시간을 사용자의 현지 시간대에 따라 다음 형식으로 반환해야 한다.

  1. 날짜의 월 구성 요소.

  2. U+002F SOLIDUS 문자(/).

  3. 날짜의 일 구성 요소.

  4. U+002F SOLIDUS 문자(/).

  5. 날짜의 연도 구성 요소.

  6. U+0020 SPACE 문자.

  7. 시간의 시 구성 요소.

  8. U+003A COLON 문자(:).

  9. 시간의 분 구성 요소.

  10. U+003A COLON 문자(:).

  11. 시간의 초 구성 요소.

연도를 제외한 위의 모든 숫자 구성 요소는 10진수 숫자를 나타내는 두 개의 ASCII 숫자로 제공해야 하며, 필요한 경우 0으로 채워야 한다. 연도는 10진수 숫자를 나타내는 네 자리 이상의 ASCII 숫자로 이루어진 가능한 한 가장 짧은 문자열로 제공해야 하며, 필요한 경우 0으로 채워야 한다.

Document의 소스 파일의 마지막 수정 날짜와 시간은 사용된 네트워크 프로토콜의 관련 기능에서 파생해야 한다. 예를 들어 문서의 HTTP `Last-Modified` 헤더 값이나 로컬 파일의 파일 시스템 메타데이터에서 파생해야 한다. 마지막 수정 날짜와 시간을 알 수 없으면 속성은 위 형식으로 현재 날짜와 시간을 반환해야 한다.

3.1.5 문서 로딩 상태 보고

document.readyState

Document가 로딩 중인 동안 "loading"을 반환하고, 파싱은 끝났지만 하위 리소스를 계속 로딩 중이면 "interactive"를 반환하며, 로딩이 완료되면 "complete"를 반환한다.

이 값이 변경되면 Document 객체에서 readystatechange 이벤트가 발생한다.

DOMContentLoaded 이벤트는 "interactive"로 전환된 후 "complete"로 전환되기 전에, async script 요소를 제외한 모든 하위 리소스가 로딩된 시점에 발생한다.

Document/readyState

현재 모든 엔진에서 지원된다.

Firefox3.6+Safari1+Chrome1+
Opera11+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11+

Document에는 문자열인 현재 문서 준비 상태가 있으며, 처음에는 "complete"이다.

Document 객체 생성 및 초기화 알고리즘을 통해 생성된 Document 객체의 경우, 어떤 스크립트도 document.readyState 값을 관찰하기 전에 이 값이 즉시 "loading"으로 재설정된다. 이 기본값은 초기 about:blank Document브라우징 컨텍스트가 없는 Document와 같은 다른 경우에도 적용된다.

readyState getter 단계는 this현재 문서 준비 상태를 반환하는 것이다.

Document document현재 문서 준비 상태를 갱신하여 readinessValue로 만들려면:

  1. document현재 문서 준비 상태readinessValue와 같으면 반환한다.

  2. document현재 문서 준비 상태readinessValue로 설정한다.

  3. documentHTML 파서와 연결되어 있으면:

    1. nowdocument관련 전역 객체에 대해 주어진 현재 고해상도 시간으로 둔다.

    2. readinessValue가 "complete"이고 document로드 타이밍 정보DOM 완료 시간이 0이면, document로드 타이밍 정보DOM 완료 시간now로 설정한다.

    3. 그렇지 않고 readinessValue가 "interactive"이며 document로드 타이밍 정보DOM 대화 가능 시간이 0이면, document로드 타이밍 정보DOM 대화 가능 시간now로 설정한다.

  4. document에서 readystatechange라는 이름의 이벤트를 발생시킨다.


Document가 아직 중지되거나 중단되지 않은 HTML 파서 또는 XML 파서와 연결되어 있으면 활성 파서를 가진다고 한다.


Document에는 문서 로드 타이밍 정보로드 타이밍 정보가 있다.

Document에는 문서 언로드 타이밍 정보이전 문서 언로드 타이밍이 있다.

Document에는 처음에 false인 불리언 교차 출처 리디렉션을 통해 생성되었음이 있다.

문서 로드 타이밍 정보 구조체에는 다음 항목이 있다.

탐색 시작 시간 (기본값 0)
숫자
DOM 대화 가능 시간 (기본값 0)
DOM 콘텐츠 로드 이벤트 시작 시간 (기본값 0)
DOM 콘텐츠 로드 이벤트 종료 시간 (기본값 0)
DOM 완료 시간 (기본값 0)
로드 이벤트 시작 시간 (기본값 0)
로드 이벤트 종료 시간 (기본값 0)
DOMHighResTimeStamp

문서 언로드 타이밍 정보 구조체에는 다음 항목이 있다.

언로드 이벤트 시작 시간 (기본값 0)
언로드 이벤트 종료 시간 (기본값 0)
DOMHighResTimeStamp

3.1.6 렌더링 차단 메커니즘

Document에는 처음에 빈 집합인 요소의 집합렌더링 차단 요소 집합이 있다.

Document document콘텐츠 유형이 "text/html"이고 documentbody 요소가 null이면 렌더링 차단 요소 추가를 허용한다.

다음 두 조건이 모두 참이면 Document document렌더링이 차단된 상태이다.

요소 el노드 문서 document렌더링이 차단된 상태이고, eldocument렌더링 차단 요소 집합에 있으면 el렌더링 차단 요소이다.

요소 el에서 렌더링을 차단하려면:

  1. documentel노드 문서로 둔다.

  2. document렌더링 차단 요소 추가를 허용하면 eldocument렌더링 차단 요소 집합추가한다.

요소 el에서 렌더링 차단을 해제하려면:

  1. documentel노드 문서로 둔다.

  2. eldocument렌더링 차단 요소 집합에서 제거한다.

렌더링 차단 요소 el브라우징 컨텍스트와 연결 해제되거나, el차단 속성 값이 변경되어 el이 더 이상 잠재적인 렌더링 차단 요소가 아니게 될 때마다 el에서 렌더링 차단을 해제한다.

3.1.7 DOM 트리 접근자

문서의 html 요소는 그 문서 요소html 요소이면 해당 문서 요소이고, 그렇지 않으면 null이다.


document.head

Document/head

현재 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome4+
Opera11+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+

head 요소를 반환한다.

문서의 head 요소html 요소의 자식인 첫 번째 head 요소이며, 그러한 요소가 없으면 null이다.

head 속성은 가져올 때 문서의 head 요소(head 요소 또는 null)를 반환해야 한다.


document.title [ = value ]

HTML의 경우 title 요소가 제공하는 문서 제목을, SVG의 경우 SVG title 요소가 제공하는 문서 제목을 반환한다.

설정하여 문서 제목을 갱신할 수 있다. 갱신할 적절한 요소가 없으면 새 값은 무시된다.

문서의 title 요소는 문서에서 트리 순서상 첫 번째 title 요소이며, 그러한 요소가 없으면 null이다.

Document/title

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

title 속성은 가져올 때 다음 알고리즘을 실행해야 한다.

  1. 문서 요소SVG svg 요소이면, value문서 요소의 자식인 첫 번째 SVG title 요소의 자식 텍스트 콘텐츠로 둔다.

  2. 그렇지 않으면 valuetitle 요소자식 텍스트 콘텐츠로 두고, title 요소가 null이면 빈 문자열로 둔다.

  3. value에서 ASCII 공백을 제거하고 축소한다.

  4. value를 반환한다.

설정할 때는 다음 목록에서 처음으로 일치하는 조건에 해당하는 단계를 실행해야 한다.

문서 요소SVG svg 요소인 경우
  1. 문서 요소의 자식인 SVG title 요소가 있으면, element를 그러한 첫 번째 요소로 둔다.

  2. 그렇지 않은 경우:

    1. element문서 요소노드 문서, "title", SVG 네임스페이스가 주어졌을 때 요소를 생성한 결과로 둔다.

    2. element문서 요소첫 번째 자식으로 삽입한다.

  3. element 내부에서 주어진 값으로 모든 문자열을 치환한다.

문서 요소HTML 네임스페이스에 있는 경우
  1. title 요소가 null이고 head 요소도 null이면 반환한다.

  2. title 요소가 null이 아니면 elementtitle 요소로 둔다.

  3. 그렇지 않은 경우:

    1. element문서 요소노드 문서, "title", HTML 네임스페이스가 주어졌을 때 요소를 생성한 결과로 둔다.

    2. elementhead 요소추가한다.

  4. element 내부에서 주어진 값으로 모든 문자열을 치환한다.

그렇지 않은 경우

아무 작업도 하지 않는다.


document.body [ = value ]

Document/body

현재 모든 엔진에서 지원된다.

Firefox60+Safari1+Chrome1+
Opera9.6+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

body 요소를 반환한다.

설정하여 body 요소를 교체할 수 있다.

새 값이 body 또는 frameset 요소가 아니면 "HierarchyRequestError" DOMException이 발생한다.

문서의 body 요소html 요소의 자식 중 body 요소 또는 frameset 요소인 첫 번째 요소이며, 그러한 요소가 없으면 null이다.

body 속성은 가져올 때 문서의 body 요소(body 요소, frameset 요소 또는 null)를 반환해야 한다. 설정할 때는 다음 알고리즘을 실행해야 한다.

  1. 새 값이 body 또는 frameset 요소가 아니면 "HierarchyRequestError" DOMException을 던진다.
  2. 그렇지 않고 새 값이 body 요소와 같으면 반환한다.
  3. 그렇지 않고 body 요소가 null이 아니면, body 요소의 부모 안에서 body 요소를 새 값으로 교체하고 반환한다.
  4. 그렇지 않고 문서 요소가 없으면 "HierarchyRequestError" DOMException을 던진다.
  5. 그렇지 않으면 body 요소는 null이지만 문서 요소가 있다. 새 값을 문서 요소추가한다.

body getter가 반환하는 값은 setter에 전달된 값과 항상 같지는 않다.

이 예에서 setter는 body 요소를 성공적으로 삽입한다 (SVG는 SVG svg의 자식으로 body를 허용하지 않으므로 이는 부적합하다). 그러나 문서 요소가 html이 아니므로 getter는 null을 반환한다.

<svg xmlns="http://www.w3.org/2000/svg">
 <script>
  document.body = document.createElementNS("http://www.w3.org/1999/xhtml", "body");
  console.assert(document.body === null);
 </script>
</svg>

document.images

Document/images

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

Document에 있는 img 요소의 HTMLCollection을 반환한다.

document.embeds

Document/embeds

현재 모든 엔진에서 지원된다.

Firefox1+Safari10.1+Chrome64+
Opera51+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android47+
document.plugins

Document/plugins

현재 모든 엔진에서 지원된다.

Firefox1+Safari10.1+Chrome64+
Opera51+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS10.3+Chrome Android?WebView Android?Samsung Internet?Opera Android47+

Document에 있는 embed 요소의 HTMLCollection을 반환한다.

document.links

Document/links

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

Document에서 href 속성이 있는 aarea 요소의 HTMLCollection을 반환한다.

document.forms

Document/forms

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

Document에 있는 form 요소의 HTMLCollection을 반환한다.

document.scripts

Document/scripts

현재 모든 엔진에서 지원된다.

Firefox9+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

Document에 있는 script 요소의 HTMLCollection을 반환한다.

images 속성은 Document 노드를 루트로 하고, 필터가 img 요소에만 일치하는 HTMLCollection을 반환해야 한다.

embeds 속성은 Document 노드를 루트로 하고, 필터가 embed 요소에만 일치하는 HTMLCollection을 반환해야 한다.

plugins 속성은 embeds 속성이 반환하는 것과 동일한 객체를 반환해야 한다.

links 속성은 Document 노드를 루트로 하고, 필터가 href 속성이 있는 a 요소와 href 속성이 있는 area 요소에만 일치하는 HTMLCollection을 반환해야 한다.

forms 속성은 Document 노드를 루트로 하고, 필터가 form 요소에만 일치하는 HTMLCollection을 반환해야 한다.

scripts 속성은 Document 노드를 루트로 하고, 필터가 script 요소에만 일치하는 HTMLCollection을 반환해야 한다.


collection = document.getElementsByName(name)

Document/getElementsByName

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera5+Edge79+
Edge (Legacy)12+Internet Explorer5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

Document에서 값이 namename 속성을 가진 요소의 NodeList를 반환한다.

getElementsByName(elementName) 메서드 단계는 해당 문서에서 값이 elementName 인수와 동일한 name 속성을 가진 모든 HTML 요소트리 순서로 포함하는 라이브 NodeList를 반환하는 것이다. 같은 인수로 Document 객체에서 메서드가 다시 호출되면 사용자 에이전트는 이전 호출이 반환한 것과 같은 객체를 반환할 수 있다. 그 밖의 경우에는 새로운 NodeList 객체를 반환해야 한다.


document.currentScript

Document/currentScript

현재 모든 엔진에서 지원된다.

Firefox4+Safari8+Chrome29+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

요소가 클래식 스크립트를 나타내는 한, 현재 실행 중인 script 요소 또는 SVG script 요소를 반환한다. 재진입 스크립트 실행의 경우 아직 실행을 끝내지 않은 요소 중 가장 최근에 실행을 시작한 요소를 반환한다.

Document가 현재 script 또는 SVG script 요소를 실행하고 있지 않으면(예: 실행 중인 스크립트가 이벤트 핸들러 또는 타임아웃인 경우), 또는 현재 실행 중인 scriptSVG script 요소가 모듈 스크립트를 나타내면 null을 반환한다.

currentScript 속성은 가져올 때 가장 최근에 설정된 값을 반환해야 한다. Document가 생성될 때 currentScript는 null로 초기화되어야 한다.

이 API는 script 또는 SVG script 요소를 전역으로 노출하기 때문에 구현자와 표준 커뮤니티에서 선호되지 않게 되었다. 따라서 모듈 스크립트를 실행하거나 섀도 트리에서 스크립트를 실행하는 것과 같은 최신 컨텍스트에서는 사용할 수 없다. 이러한 컨텍스트에서 실행 중인 스크립트를 전역으로 노출하지 않고 식별하는 새로운 해결책을 검토하고 있다. 이슈 #1013을 참조한다.


Document 인터페이스는 이름 있는 프로퍼티를 지원한다. 어느 순간이든 Document 객체 document지원되는 프로퍼티 이름은 다음 항목으로 구성되며, 기여한 요소에 따른 트리 순서를 따르고 이후 중복은 무시한다. 동일한 요소가 두 값을 모두 기여하면 id 속성의 값이 name 속성의 값보다 먼저 온다.

Document에 대해 이름 있는 프로퍼티 name값을 결정하려면 사용자 에이전트는 다음 단계로 얻은 값을 반환해야 한다.

  1. elements를 이름이 name이고 Document루트로 하는 문서 트리 안에 있는 이름 있는 요소의 리스트로 둔다.

    그러한 요소가 하나 이상 존재한다. 그렇지 않으면 이 알고리즘은 Web IDL에 의해 호출되지 않았을 것이기 때문이다.

  2. elements에 요소가 하나만 있고 그 요소가 iframe 요소이며, 해당 iframe 요소의 콘텐츠 탐색 가능 항목이 null이 아니면, 그 요소의 콘텐츠 탐색 가능 항목활성 WindowProxy를 반환한다.

  3. 그렇지 않고 elements에 요소가 하나만 있으면 그 요소를 반환한다.

  4. 그렇지 않으면 Document 노드를 루트로 하고 필터가 이름이 name이름 있는 요소에만 일치하는 HTMLCollection을 반환한다.

위 알고리즘의 목적상 이름이 name이름 있는 요소는 다음 중 하나에 해당하는 요소이다.

embed 또는 object 요소에 노출된 object 조상이 없고, object 요소의 경우 추가로 대체 콘텐츠를 표시하고 있지 않거나 object 또는 embed 자손이 없으면 노출된 것으로 간주한다.


Document 인터페이스의 dir 속성은 dir 콘텐츠 속성과 함께 정의된다.

3.2 요소

3.2.1 의미 체계

HTML의 요소, 속성 및 속성 값은 이 명세에서 특정한 의미, 즉 의미 체계를 갖도록 정의된다. 예를 들어 ol 요소는 순서 있는 리스트를 나타내고, lang 속성은 콘텐츠의 언어를 나타낸다.

이러한 정의를 통해 웹 브라우저나 검색 엔진과 같은 HTML 처리기는 작성자가 고려하지 않았을 수도 있는 매우 다양한 컨텍스트에서 문서와 애플리케이션을 표시하고 사용할 수 있다.

간단한 예로, 데스크톱 컴퓨터 웹 브라우저만 고려한 작성자가 작성한 다음 웹 페이지를 살펴보자.

<!DOCTYPE HTML>
<html lang="en">
 <head>
  <title>My Page</title>
 </head>
 <body>
  <h1>Welcome to my page</h1>
  <p>I like cars and lorries and have a big Jeep!</p>
  <h2>Where I live</h2>
  <p>I live in a small hut on a mountain!</p>
 </body>
</html>

HTML은 표현이 아니라 의미를 전달하므로 같은 페이지를 변경하지 않고도 휴대전화의 작은 브라우저에서 사용할 수 있다. 예를 들어 데스크톱에서처럼 제목을 큰 글자로 표시하는 대신 휴대전화의 브라우저는 페이지 전체에 같은 크기의 텍스트를 사용하되 제목을 굵게 표시할 수 있다.

그러나 이는 화면 크기의 차이를 넘어선다. 같은 페이지를 화면에 표시하는 대신 음성 합성을 기반으로 하는 브라우저를 사용하여, 예를 들어 헤드폰을 통해 페이지를 읽어 주는 시각 장애 사용자가 똑같이 사용할 수도 있다. 음성 브라우저는 제목에 큰 텍스트를 사용하는 대신 다른 음량이나 더 느린 음성을 사용할 수 있다.

그뿐만이 아니다. 브라우저는 페이지의 어느 부분이 제목인지 알기 때문에 사용자가 "다음 제목으로 이동" 또는 "이전 제목으로 이동" 키를 사용하여 문서를 빠르게 탐색할 수 있는 문서 개요를 만들 수 있다. 이러한 기능은 그렇지 않으면 페이지를 빠르게 탐색하기 어려운 음성 브라우저에서 특히 흔하다.

브라우저 외의 소프트웨어도 이 정보를 활용할 수 있다. 검색 엔진은 제목을 사용하여 페이지를 더 효과적으로 색인하거나 결과에서 페이지의 하위 섹션으로 연결되는 빠른 링크를 제공할 수 있다. 도구는 제목을 사용하여 목차를 만들 수 있다. 실제로 이 명세의 목차도 이러한 방식으로 생성된다.

이 예에서는 제목에 초점을 맞추었지만 같은 원칙은 HTML의 모든 의미 체계에 적용된다.

작성자는 요소, 속성 또는 속성 값을 적절한 의도상의 의미 목적 이외의 용도로 사용해서는 안 된다. 그렇게 하면 소프트웨어가 페이지를 올바르게 처리하지 못하기 때문이다.

예를 들어 기업 사이트의 제목을 나타내려는 다음 조각은 두 번째 줄이 하위 섹션의 제목이 아니라 같은 섹션의 종속 제목인 부제목 또는 소제목이기 때문에 부적합하다.

<body>
 <h1>ACME Corporation</h1>
 <h2>The leaders in arbitrary fast delivery since 1920</h2>
 ...

이러한 상황에는 hgroup 요소를 사용할 수 있다.

<body>
 <hgroup>
  <h1>ACME Corporation</h1>
  <p>The leaders in arbitrary fast delivery since 1920</p>
 </hgroup>
 ...

다음 예의 문서는 구문상 올바르지만 셀에 배치된 데이터가 명백히 표 형식 데이터가 아니고 cite 요소가 잘못 사용되었으므로 마찬가지로 부적합하다.

<!DOCTYPE HTML>
<html lang="en-GB">
 <head> <title> Demonstration </title> </head>
 <body>
  <table>
   <tr> <td> My favourite animal is the cat. </td> </tr>
   <tr>
    <td><a href="https://example.org/~ernest/"><cite>Ernest</cite></a>,
     in an essay from 1992
    </td>
   </tr>
  </table>
 </body>
</html>

이렇게 하면 이러한 의미 체계에 의존하는 소프트웨어가 실패한다. 예를 들어 시각 장애 사용자가 문서의 표를 탐색할 수 있게 하는 음성 브라우저는 위 인용문을 표로 보고하여 사용자를 혼란스럽게 할 수 있다. 마찬가지로 페이지에서 작품 제목을 추출하는 도구는 실제로는 작품 제목이 아니라 사람 이름인 "Ernest"를 작품 제목으로 추출한다.

이 문서의 수정된 버전은 다음과 같을 수 있다.

<!DOCTYPE HTML>
<html lang="en-GB">
 <head> <title> Demonstration </title> </head>
 <body>
  <blockquote>
   <p> My favourite animal is the cat. </p>
  </blockquote>
  <p><a href="https://example.org/~ernest/">Ernest</a>,
   in an essay from 1992
  </p>
 </body>
</html>

작성자는 이 명세 또는 그 밖의 적용 가능한 명세에서 허용하지 않는 요소, 속성 또는 속성 값을 사용해서는 안 된다. 그렇게 하면 이후 언어를 확장하기가 상당히 어려워지기 때문이다.

다음 예에는 이 명세에서 허용하지 않는 부적합한 속성 값("carpet")과 부적합한 속성("texture")이 있다.

<label>Carpet: <input type="carpet" name="c" texture="deep pile"></label>

다음은 이를 마크업하는 대안적이고 올바른 방법이다.

<label>Carpet: <input type="text" class="carpet" name="c" data-texture="deep pile"></label>

노드 문서브라우징 컨텍스트가 null인 DOM 노드는 HTML 구문 요구사항과 XML 구문 요구사항을 제외한 모든 문서 적합성 요구사항에서 면제된다.

특히 template 요소의 템플릿 콘텐츠노드 문서브라우징 컨텍스트는 null이다. 예를 들어 콘텐츠 모델 요구사항과 속성 값 마이크로구문 요구사항은 template 요소의 템플릿 콘텐츠에는 적용되지 않는다. 이 예에서 img 요소에는 template 요소 밖에서는 유효하지 않을 자리표시자인 속성 값이 있다.

<template>
 <article>
  <img src="{{src}}" alt="{{alt}}">
  <h1></h1>
 </article>
</template>

그러나 위 마크업에서 </h1> 종료 태그를 생략하면 HTML 구문을 위반하게 되므로 적합성 검사기가 오류로 표시한다.

스크립팅 및 그 밖의 메커니즘을 통해 사용자 에이전트가 문서를 처리하는 동안 속성 값, 텍스트, 나아가 문서의 전체 구조가 동적으로 변경될 수 있다. 특정 시점에서 문서의 의미 체계는 그 시점의 문서 상태가 나타내는 것이므로 문서의 의미 체계는 시간에 따라 변경될 수 있다. 사용자 에이전트는 이러한 변경이 발생할 때 문서 표시를 갱신해야 한다.

HTML에는 진행률 표시줄을 설명하는 progress 요소가 있다. 그 "value" 속성이 스크립트에 의해 동적으로 갱신되면 UA는 진행률의 변화를 표시하도록 렌더링을 갱신한다.

3.2.2 DOM의 요소

DOM에서 HTML 요소를 나타내는 노드는 이 명세의 관련 섹션에 나열된 인터페이스를 구현하고 스크립트에 노출해야 한다. 여기에는 다른 컨텍스트, 예를 들어 XSLT 변환 내부에 있는 XML 문서HTML 요소도 포함된다.

DOM의 요소는 사물을 나타낸다. 즉, 의미 체계라고도 하는 고유한 의미를 가진다.

예를 들어 ol 요소는 순서 있는 리스트를 나타낸다.

요소는 명시적 또는 암시적으로 어떤 방식으로든 참조될 수 있다. DOM의 요소를 명시적으로 참조하는 한 가지 방법은 요소에 id 속성을 부여한 다음, 그 id 속성 값을 하이퍼링크href 속성 값에 대한 프래그먼트로 사용하는 하이퍼링크를 만드는 것이다. 그러나 참조에 하이퍼링크가 반드시 필요한 것은 아니다. 해당 요소를 가리키는 어떤 방식이라도 충분하다.

id 속성이 부여된 다음 figure 요소를 살펴보자.

<figure id="module-script-graph">
  <img src="module-script-graph.svg"
       alt="Module A depends on module B, which depends
            on modules C and D.">
  <figcaption>Figure 27: a simple module graph</figcaption>
</figure>

a 요소를 사용하여 다음과 같이 하이퍼링크 기반 참조를 만들 수 있다.

As we can see in <a href="#module-script-graph">figure 27</a>, ...

그러나 figure 요소를 참조하는 방법은 다음과 같이 매우 다양하다.

모든 HTML 요소의 인터페이스가 상속하고 추가 요구사항이 없는 요소가 사용해야 하는 기본 인터페이스는 HTMLElement 인터페이스이다.

HTMLElement

현재 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android1+Samsung Internet?Opera Android10.1+

HTMLElement/title

현재 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLElement/lang

현재 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLElement/inert

현재 모든 엔진에서 지원된다.

Firefox112+Safari15.5+Chrome102+
Opera?Edge102+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLElement/accessKey

현재 모든 엔진에서 지원된다.

Firefox5+Safari6+Chrome17+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLUnknownElement

현재 모든 엔진에서 지원된다.

Firefox1+Safari6+Chrome15+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
[Exposed=Window]
interface HTMLElement : Element {
  [HTMLConstructor] constructor();

  // metadata attributes
  [CEReactions, Reflect] attribute DOMString title;
  [CEReactions, Reflect] attribute DOMString lang;
  [CEReactions] attribute boolean translate;
  [CEReactions] attribute DOMString dir;

  // user interaction
  [CEReactions] attribute (boolean or unrestricted double or DOMString)? hidden;
  [CEReactions, Reflect] attribute boolean inert;
  undefined click();
  [CEReactions, Reflect] attribute DOMString accessKey;
  readonly attribute DOMString accessKeyLabel;
  [CEReactions] attribute boolean draggable;
  [CEReactions] attribute boolean spellcheck;
  [CEReactions, ReflectSetter] attribute DOMString writingSuggestions;
  [CEReactions, ReflectSetter] attribute DOMString autocapitalize;
  [CEReactions] attribute boolean autocorrect;

  [CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText;
  [CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText;

  ElementInternals attachInternals();

  // The popover API
  undefined showPopover(optional ShowPopoverOptions options = {});
  undefined hidePopover();
  boolean togglePopover(optional (TogglePopoverOptions or boolean) options = {});
  [CEReactions] attribute DOMString? popover;

  [CEReactions, Reflect, ReflectRange=(0, 8)] attribute unsigned long headingOffset;
  [CEReactions, Reflect] attribute boolean headingReset;
};

dictionary ShowPopoverOptions {
  HTMLElement source;
};

dictionary TogglePopoverOptions : ShowPopoverOptions {
  boolean force;
};

HTMLElement includes GlobalEventHandlers;
HTMLElement includes ElementContentEditable;
HTMLElement includes HTMLOrSVGOrMathMLElement;

[Exposed=Window]
interface HTMLUnknownElement : HTMLElement {
  // Note: intentionally no [HTMLConstructor]
};

HTMLElement 인터페이스에는 서로 관련이 적은 여러 기능과 관련된 메서드 및 속성이 포함되므로 이 인터페이스의 구성원은 이 명세의 여러 다른 섹션에서 설명된다.


HTML 네임스페이스에서 이름이 name인 요소의 요소 인터페이스는 다음과 같이 결정된다.

  1. nameapplet, bgsound, blink, isindex, keygen, multicol, nextid 또는 spacer이면 HTMLUnknownElement를 반환한다.

  2. nameacronym, basefont, big, center, nobr, noembed, noframes, plaintext, rb, rtc, strike 또는 tt이면 HTMLElement를 반환한다.

  3. namelisting 또는 xmp이면 HTMLPreElement를 반환한다.

  4. 그렇지 않고 이 명세가 로컬 이름 name에 대응하는 요소 유형에 적합한 인터페이스를 정의하면 해당 인터페이스를 반환한다.

  5. 그 밖의 적용 가능한 명세name에 적합한 인터페이스를 정의하면 그 명세가 정의한 인터페이스를 반환한다.

  6. name유효한 사용자 정의 요소 이름이면 HTMLElement를 반환한다.

  7. HTMLUnknownElement를 반환한다.

유효한 사용자 정의 요소 이름의 경우 HTMLUnknownElement 대신 HTMLElement를 사용하는 것은 향후 발생할 수 있는 업그레이드가 요소의 프로토타입 체인을 HTMLUnknownElement에서 관련 없는 하위 클래스으로 수평 전환시키는 대신, HTMLElement에서 하위 클래스로 선형 전환시키도록 보장하기 위한 것이다.

HTML, SVG 및 MathML 요소가 공유하는 기능은 HTMLOrSVGOrMathMLElement 인터페이스 믹스인을 사용한다. [SVG] [MATHML]

Global_attributes/autofocus

한 엔진에서만 지원된다.

Firefox🔰 1+Safari🔰 4+Chrome79+
Opera66+Edge79+
Edge (Legacy)아니요Internet Explorer🔰 10+
Firefox Android?Safari iOS?Chrome Android?WebView Android79+Samsung Internet?Opera Android57+
interface mixin HTMLOrSVGOrMathMLElement {
  [SameObject] readonly attribute DOMStringMap dataset;
  attribute DOMString nonce; // intentionally no [CEReactions]

  [CEReactions, Reflect] attribute boolean autofocus;
  [CEReactions, ReflectSetter] attribute long tabIndex;
  undefined focus(optional FocusOptions options = {});
  undefined blur();
};

HTML 요소도 SVG 요소도 MathML 요소도 아닌 요소의 예는 다음과 같이 생성한 요소이다.

const el = document.createElementNS("some namespace", "example");
console.assert(el.constructor === Element);

3.2.3 HTML 요소 생성자

사용자 정의 요소 기능을 지원하기 위해 모든 HTML 요소에는 특별한 생성자 동작이 있다. 이는 [HTMLConstructor] IDL 확장 속성을 통해 표시된다. 이는 해당 인터페이스의 인터페이스 객체가 호출될 때 아래에 자세히 정의된 특정 동작을 하게 됨을 나타낸다.

[HTMLConstructor] 확장 속성은 인수를 취해서는 안 되며, 생성자 연산에만 나타나야 한다. 생성자 연산에는 한 번만 나타나야 하며, 인터페이스에는 주석이 지정된 단일 생성자 연산만 포함되어야 하고 다른 생성자 연산은 포함되어서는 안 된다. 주석이 지정된 생성자 연산은 인수를 취하지 않도록 선언되어야 한다.

[HTMLConstructor] 확장 속성이 주석으로 지정된 생성자 연산과 함께 선언된 인터페이스에는 다음과 같은 재정의된 생성자 단계가 있다:

  1. NewTarget활성 함수 객체와 같으면, TypeError를 던진다.

    사용자 정의 요소가 요소 인터페이스를 생성자로 사용하여 정의되면 이런 일이 발생할 수 있다:

    customElements.define("bad-1", HTMLButtonElement);
    new HTMLButtonElement();          // (1)
    document.createElement("bad-1");  // (2)

    이 경우 (1)과 같이 명시적으로 또는 (2)와 같이 암묵적으로 HTMLButtonElement를 실행하는 동안, 활성 함수 객체NewTarget은 모두 HTMLButtonElement이다. 이 검사가 없으면 지역 이름이 bad-1HTMLButtonElement 인스턴스를 생성할 수 있게 된다.

  2. registry를 null로 둔다.

  3. 주변 에이전트활성 사용자 정의 요소 생성자 맵[NewTarget]이 존재하면, registry주변 에이전트활성 사용자 정의 요소 생성자 맵[NewTarget]으로 설정합니다.

  4. 그렇지 않으면 registry현재 전역 객체연결된 Document사용자 정의 요소 레지스트리로 설정합니다.

  5. definitionregistry사용자 정의 요소 정의 집합에서 생성자NewTarget과 같은 항목으로 설정합니다. 그러한 항목이 없으면 TypeError를 발생시킵니다.

    registry사용자 정의 요소 정의 집합에는 생성자가 undefined인 항목이 있을 수 없으므로, 이 단계는 HTML 요소 생성자가 함수로 호출되는 것도 방지합니다(그 경우 NewTarget이 undefined가 되기 때문입니다).

  6. isValue를 null로 둔다.

  7. definition지역 이름definition이름과 같으면(즉, definition자율 사용자 정의 요소에 관한 것이면):

    1. 활성 함수 객체HTMLElement가 아니면, TypeError를 던진다.

      사용자 정의 요소가 어떠한 지역 이름도 확장하지 않도록 정의되었지만 HTMLElement가 아닌 클래스에서 상속받으면 이런 일이 발생할 수 있다:

      customElements.define("bad-2", class Bad2 extends HTMLParagraphElement {});

      이 경우 Bad2의 인스턴스를 구성할 때 발생하는 (암묵적) super() 호출 중에 활성 함수 객체HTMLParagraphElement이며, HTMLElement가 아니다.

  8. 그렇지 않으면(즉, definition사용자 정의된 내장 요소에 관한 것이면):

    1. valid local names를 이 명세 또는 적용 가능한 다른 명세에 정의된 요소 중 활성 함수 객체를 자신의 요소 인터페이스로 사용하는 요소의 지역 이름 목록으로 둔다.

    2. valid local namesdefinition지역 이름이 포함되어 있지 않으면 TypeError를 던진다.

      사용자 정의 요소가 주어진 지역 이름을 확장하도록 정의되었지만 잘못된 클래스에서 상속받으면 이런 일이 발생할 수 있다:

      customElements.define("bad-3", class Bad3 extends HTMLQuoteElement {}, { extends: "p" });

      이 경우 Bad3의 인스턴스를 구성할 때 발생하는 (암묵적) super() 호출 중에 valid local namesqblockquote를 포함하는 목록이지만, definition지역 이름p이며, 이는 해당 목록에 없다.

    3. isValuedefinition이름으로 설정한다.

  9. definition구성 스택이 비어 있으면:

    1. element인터페이스를 구현하는 새 객체를 내부적으로 생성한 결과로 둔다. 해당 인터페이스는 활성 함수 객체가 대응하는 인터페이스이며, 현재 영역NewTarget이 주어진다.

    2. element노드 문서현재 전역 객체연결된 Document로 설정한다.

    3. element네임스페이스HTML 네임스페이스로 설정한다.

    4. element네임스페이스 접두사를 null로 설정한다.

    5. element지역 이름definition지역 이름으로 설정한다.

    6. element사용자 정의 요소 레지스트리registry로 설정한다.

    7. element사용자 정의 요소 상태를 "custom"으로 설정한다.

    8. element사용자 정의 요소 정의definition으로 설정한다.

    9. elementisisValue로 설정한다.

    10. element를 반환한다.

    이는 작성자 스크립트가 예를 들어 new MyCustomElement()를 통해 새 사용자 정의 요소를 직접 구성할 때 발생한다.

  10. prototype을 ? Get(NewTarget, "prototype")으로 둔다.

  11. prototype객체가 아니면:

    1. realm을 ? GetFunctionRealm(NewTarget)으로 둔다.

    2. prototyperealm에 속하며 그 인터페이스가 활성 함수 객체의 인터페이스와 동일한 인터페이스 프로토타입 객체로 설정한다.

    활성 함수 객체의 영역은 realm이 아닐 수 있으므로, 여기서는 영역 간에 "동일한 인터페이스"라는 더 일반적인 개념을 사용한다. 인터페이스 객체의 동일성을 찾는 것이 아니다. NewTarget의 영역을 사용하고 그곳에서 적절한 프로토타입을 조회하는 것을 포함한 이 대체 동작은 JavaScript 내장 객체 및 Web IDL의 인터페이스를 구현하는 새 객체를 내부적으로 생성하는 알고리즘의 유사한 동작과 일치하도록 설계되었다.

  12. elementdefinition구성 스택의 마지막 항목으로 둔다.

  13. element이미 구성됨 마커이면, TypeError를 던진다.

    사용자 정의 요소 생성자 내부의 작성자 코드가 super()를 호출하기 전에 구성 중인 클래스의 다른 인스턴스를 비준수 방식으로 생성하면 이런 일이 발생할 수 있다:

    let doSillyThing = true;
    
    class DontDoThis extends HTMLElement {
      constructor() {
        if (doSillyThing) {
          doSillyThing = false;
          new DontDoThis();
          // Now the construction stack will contain an already constructed marker.
        }
    
        // This will then fail with a TypeError:
        super();
      }
    }

    사용자 정의 요소 생성자 내부의 작성자 코드가 super()비준수 방식으로 두 번 호출해도 이런 일이 발생할 수 있다. JavaScript 명세에 따르면 이는 실제로 오류를 던지기 전에 상위 클래스 생성자(즉, 이 알고리즘)를 두 번 실행하기 때문이다:

    class DontDoThisEither extends HTMLElement {
      constructor() {
        super();
    
        // This will throw, but not until it has already called into the HTMLElement constructor
        super();
      }
    }
  14. ? element.[[SetPrototypeOf]](prototype)을 수행한다.

  15. definition구성 스택의 마지막 항목을 이미 구성됨 마커로 교체한다.

  16. element를 반환한다.

    이 단계는 일반적으로 사용자 정의 요소를 업그레이드할 때 도달한다. 기존 요소가 반환되므로 사용자 정의 요소 생성자 내부의 super() 호출이 해당 기존 요소를 this에 할당한다.


[HTMLConstructor]가 암시하는 생성자 동작 외에도 일부 요소에는 명명된 생성자도 있다 (실제로는 수정된 prototype 속성을 가진 팩토리 함수이다).

HTML 요소의 명명된 생성자는 사용자 정의 요소 생성자를 정의할 때 extends 절에서도 사용할 수 있다:

class AutoEmbiggenedImage extends Image {
  constructor(width, height) {
    super(width * 10, height * 10);
  }
}

customElements.define("auto-embiggened", AutoEmbiggenedImage, { extends: "img" });

const image = new AutoEmbiggenedImage(15, 20);
console.assert(image.width === 150);
console.assert(image.height === 200);

3.2.4 요소 정의

이 명세의 각 요소에는 다음 정보를 포함하는 정의가 있다:

범주

요소가 속하는 범주의 목록. 이는 각 요소의 콘텐츠 모델을 정의할 때 사용된다.

이 요소를 사용할 수 있는 맥락

요소를 사용할 수 있는 위치에 대한 비규범적 설명. 이 정보는 이 요소를 자식으로 허용하는 요소의 콘텐츠 모델과 중복되며 편의를 위해서만 제공된다.

단순화를 위해 가장 구체적인 기대 사항만 나열한다.

예를 들어 모든 구문 콘텐츠플로 콘텐츠이다. 따라서 구문 콘텐츠인 요소는 이것이 더 구체적인 기대 사항이므로 "구문 콘텐츠가 기대되는 곳"으로만 나열된다. 플로 콘텐츠를 기대하는 곳은 어디든 구문 콘텐츠도 기대하므로 이 기대 사항도 충족한다.

콘텐츠 모델

요소의 자식과 자손으로 어떤 콘텐츠가 포함되어야 하는지에 대한 규범적 설명.

text/html에서의 태그 생략

text/html 구문에서 시작 태그와 종료 태그를 생략할 수 있는지에 대한 비규범적 설명. 이 정보는 선택적 태그 절에 제시된 규범적 요구 사항과 중복되며 요소 정의에서는 편의를 위해서만 제공된다.

콘텐츠 속성

요소에 지정할 수 있는 속성의 규범적 목록(달리 허용되지 않는 경우 제외)과 해당 속성에 대한 비규범적 설명. (대시 왼쪽의 콘텐츠는 규범적이고 오른쪽의 콘텐츠는 비규범적이다.)

접근성 고려 사항

작성자용: ARIA rolearia-* 속성 사용에 관한 적합성 요구 사항은 HTML의 ARIA에 정의되어 있다. [ARIA] [ARIAHTML]

구현자용: 접근성 API 의미 체계를 구현하기 위한 사용자 에이전트 요구 사항은 HTML 접근성 API 매핑에 정의되어 있다. [HTMLAAM]

정제

각 요소의 정제 정보는 요소의 정제 범주를 정의하며, 이는 정제 중 요소가 처리되는 방식에 영향을 준다. 요소의 하나 이상의 속성을 탐색 URL 속성으로 정의할 수도 있다.

DOM 인터페이스

해당 요소가 구현해야 하는 DOM 인터페이스의 규범적 정의.

그 다음에는 요소가 무엇을 나타내는지에 대한 설명과 작성자 및 구현에 적용될 수 있는 추가 규범적 적합성 기준이 이어진다. 때로는 예도 포함된다.

3.2.4.1 속성

속성 값은 문자열이다. 달리 명시되지 않는 한 HTML 요소의 속성 값은 빈 문자열을 포함한 어떤 문자열 값이라도 될 수 있으며, 그러한 속성 값에 지정할 수 있는 텍스트에는 제한이 없다.

3.2.5 콘텐츠 모델

이 명세에 정의된 각 요소에는 콘텐츠 모델, 즉 요소에 기대되는 콘텐츠에 대한 설명이 있다. HTML 요소에는 해당 요소의 콘텐츠 모델에 설명된 요구 사항과 일치하는 콘텐츠가 있어야 한다. 요소의 콘텐츠는 DOM에서 그 요소의 자식이다.

ASCII 공백은 요소 사이에서 항상 허용된다. 사용자 에이전트는 소스 마크업에서 요소 사이에 있는 이러한 문자를 DOM의 Text 노드로 나타낸다. 빈 Text 노드와 이러한 문자만으로 이루어진 시퀀스로 구성된 Text 노드는 요소 간 공백으로 간주된다.

요소의 콘텐츠가 해당 요소의 콘텐츠 모델과 일치하는지 판단할 때와 문서 및 요소 의미 체계를 정의하는 알고리즘을 따를 때는 요소 간 공백, 주석 노드 및 처리 명령 노드를 무시해야 한다.

따라서 요소 AB가 같은 부모 노드를 가지고 그 사이에 다른 요소 노드나 Text 노드(요소 간 공백 제외)가 없으면, 요소 A는 두 번째 요소 B앞 또는 뒤에 있다고 한다. 마찬가지로 어떤 요소에 요소 간 공백, 주석 노드 및 처리 명령 노드 외에 다른 노드가 없으면, 그 노드는 해당 요소의 유일한 자식이다.

작성자는 각 요소에 대해 정의된 대로 명시적으로 허용되거나 다른 명세에서 명시적으로 요구되는 경우를 제외하고는 어디에서도 HTML 요소를 사용해서는 안 된다. XML 복합 문서에서 다른 네임스페이스의 요소가 관련 맥락을 제공하도록 정의되어 있다면 이러한 맥락은 그 요소 내부일 수 있다.

Atom 배급 형식content 요소를 정의한다. 그 type 속성 값이 xhtml이면 Atom 배급 형식은 단일 HTML div 요소를 포함하도록 요구한다. 따라서 이 명세에 명시적으로 규범화되어 있지는 않지만 해당 맥락에서는 div 요소가 허용된다. [ATOM]

또한 HTML 요소는 고아 노드 (즉, 부모 노드가 없는 노드)일 수 있다.

예를 들어 td 요소를 생성하고 스크립트의 전역 변수에 저장하는 것은 적합하다. 그 밖의 경우에는 td 요소가 tr 요소 내부에서만 사용되어야 하지만 그렇다.

var data = {
  name: "Banana",
  cell: document.createElement('td'),
};
3.2.5.1 "없음" 콘텐츠 모델

요소의 콘텐츠 모델이 없음이면 해당 요소에는 요소 간 공백 이외의 Text 노드와 요소 노드가 없어야 한다.

콘텐츠 모델이 "없음"인 대부분의 HTML 요소는 편의를 위해 빈 요소 (HTML 구문에서 종료 태그가 없는 요소)이기도 하다. 하지만 이 둘은 완전히 별개의 개념이다.

3.2.5.2 콘텐츠의 종류

HTML의 각 요소는 비슷한 특성을 가진 요소를 함께 묶는 0개 이상의 범주에 속한다. 이 명세에서는 다음과 같은 광범위한 범주를 사용한다:

일부 요소는 이 명세의 다른 부분에서 정의되는 다른 범주에도 속한다.

이러한 범주의 관계는 다음과 같다:

섹셔닝 콘텐츠, 제목 콘텐츠, 구문 콘텐츠, 임베디드 콘텐츠 및 대화형 콘텐츠는 모두 플로 콘텐츠의 유형이다. 메타데이터는 때때로 플로 콘텐츠이다. 메타데이터와 대화형 콘텐츠는 때때로 구문 콘텐츠이다. 임베디드 콘텐츠도 구문 콘텐츠의 한 유형이며 때로는 대화형 콘텐츠이다.

다른 범주도 특정 목적을 위해 사용된다. 예를 들어 폼 컨트롤은 공통 요구 사항을 정의하기 위해 여러 범주를 사용하여 지정된다. 일부 요소에는 고유한 요구 사항이 있으며 특정 범주에 속하지 않는다.

3.2.5.2.1 메타데이터 콘텐츠

메타데이터 콘텐츠는 나머지 콘텐츠의 표시나 동작을 설정하거나, 문서와 다른 문서 사이의 관계를 설정하거나, 다른 "대역 외" 정보를 전달하는 콘텐츠이다.

의미 체계가 주로 메타데이터와 관련된 다른 네임스페이스의 요소(예: RDF)도 메타데이터 콘텐츠이다.

따라서 XML 직렬화에서는 다음과 같이 RDF를 사용할 수 있다:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:r="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xml:lang="en">
 <head>
  <title>Hedral's Home Page</title>
  <r:RDF>
   <Person xmlns="http://www.w3.org/2000/10/swap/pim/contact#"
           r:about="https://hedral.example.com/#">
    <fullName>Cat Hedral</fullName>
    <mailbox r:resource="mailto:hedral@damowmow.com"/>
    <personalTitle>Sir</personalTitle>
   </Person>
  </r:RDF>
 </head>
 <body>
  <h1>My home page</h1>
  <p>I like playing with string, I guess. Sister says squirrels are fun
  too so sometimes I follow her to play with them.</p>
 </body>
</html>

하지만 HTML 직렬화에서는 이것이 가능하지 않다.

3.2.5.2.2 플로 콘텐츠

문서와 애플리케이션의 본문에서 사용되는 대부분의 요소는 플로 콘텐츠로 분류된다.

3.2.5.2.3 섹셔닝 콘텐츠

섹셔닝 콘텐츠headerfooter 요소의 범위를 정의하는 콘텐츠이다.

3.2.5.2.4 제목 콘텐츠

제목 콘텐츠는 섹션의 제목을 정의한다 (섹셔닝 콘텐츠 요소를 사용하여 명시적으로 마크업한 경우와 제목 콘텐츠 자체에 의해 암시된 경우 모두).

3.2.5.2.5 구문 콘텐츠

구문 콘텐츠는 문서의 텍스트와 그 텍스트를 문단 내부 수준에서 마크업하는 요소이다. 연속된 구문 콘텐츠문단을 형성한다.

구문 콘텐츠로 분류되는 대부분의 요소는 플로 콘텐츠가 아니라 그 자체가 구문 콘텐츠로 분류되는 요소만 포함할 수 있다.

콘텐츠 모델의 맥락에서 텍스트는 아무것도 없거나 Text 노드를 의미한다. 텍스트는 때때로 독립적인 콘텐츠 모델로 사용되지만 구문 콘텐츠이기도 하며, Text 노드가 비어 있거나 ASCII 공백만 포함하는 경우 요소 간 공백일 수 있다.

Text 노드와 속성 값은 스칼라 값으로 구성되어야 하며, 비문자제어 문자ASCII 공백이 아닌 것은 제외된다. 이 명세는 정확한 맥락에 따라 Text 노드와 속성 값의 정확한 값에 추가 제약을 포함한다.

3.2.5.2.6 임베디드 콘텐츠

임베디드 콘텐츠는 다른 리소스를 문서로 가져오는 콘텐츠 또는 다른 어휘의 콘텐츠를 문서에 삽입한 것이다.

HTML 네임스페이스가 아닌 다른 네임스페이스에 속하고 메타데이터가 아닌 콘텐츠를 전달하는 요소는 이 명세에 정의된 콘텐츠 모델의 목적상 임베디드 콘텐츠이다. (예: MathML 또는 SVG.)

일부 임베디드 콘텐츠 요소에는 대체 콘텐츠가 있을 수 있다. 이는 외부 리소스를 사용할 수 없을 때(예: 지원되지 않는 형식이기 때문에) 사용되는 콘텐츠이다. 대체 콘텐츠가 있다면 요소 정의에 그 내용이 명시된다.

3.2.5.2.7 대화형 콘텐츠

대화형 콘텐츠는 사용자 상호작용을 특별히 의도한 콘텐츠이다.

3.2.5.2.8 감지 가능한 콘텐츠

일반적으로 콘텐츠 모델이 임의의 플로 콘텐츠 또는 구문 콘텐츠를 허용하는 요소는 자신의 콘텐츠 안에 감지 가능한 콘텐츠이며 hidden 속성이 지정되지 않은 노드를 하나 이상 포함해야 한다.

감지 가능한 콘텐츠는 비어 있지 않은 자손 텍스트나 사용자가 들을 수 있는 것 (audio 요소), 볼 수 있는 것(video, img 또는 canvas 요소), 그 밖에 상호작용할 수 있는 것(예: 대화형 폼 컨트롤)을 제공하여 요소가 비어 있지 않게 한다.

하지만 이는 엄격한 요구 사항은 아니다. 나중에 스크립트로 채워질 자리 표시자로 사용되거나, 템플릿의 일부로서 대부분의 페이지에서는 채워지지만 일부 페이지에서는 관련이 없는 경우처럼 요소가 적법하게 비어 있을 수 있는 경우가 많기 때문이다.

적합성 검사기는 작성 지원을 위해 이 요구 사항을 충족하지 못한 요소를 작성자가 찾을 수 있도록 하는 메커니즘을 제공하는 것이 권장된다.

다음 요소는 감지 가능한 콘텐츠이다:

3.2.5.2.9 스크립트 지원 요소

스크립트 지원 요소는 그 자체로 아무것도 나타내지 않지만(즉, 렌더링되지 않지만) 사용자에게 기능을 제공하는 등 스크립트를 지원하는 데 사용되는 요소이다.

다음 요소는 스크립트 지원 요소이다:

3.2.5.3 투명 콘텐츠 모델

일부 요소는 투명하다고 설명되며, 해당 콘텐츠 모델의 설명에 "투명"이 포함된다. 투명 요소의 콘텐츠 모델은 부모 요소의 콘텐츠 모델에서 파생된다. 콘텐츠 모델에서 "투명"한 부분에 요구되는 요소는 투명 요소가 위치한 부모 요소 콘텐츠 모델의 해당 부분에서 요구되는 요소와 동일하다.

예를 들어 ruby 요소 내부의 ins 요소는 rt 요소를 포함할 수 없다. 이는 ruby 요소의 콘텐츠 모델에서 ins 요소를 허용하는 부분이 구문 콘텐츠를 허용하는 부분이고, rt 요소는 구문 콘텐츠가 아니기 때문이다.

경우에 따라 투명 요소가 서로 중첩되면 이 과정을 반복적으로 적용해야 한다.

다음 마크업 조각을 살펴보자:

<p><object><ins><map><a href="/">Apples</a></map></ins></object></p>

"Apples"가 a 요소 내부에서 허용되는지 확인하기 위해 콘텐츠 모델을 조사한다. a 요소의 콘텐츠 모델은 투명하고, map 요소의 콘텐츠 모델도 투명하며, ins 요소의 콘텐츠 모델도 투명하고, object 요소의 콘텐츠 모델도 투명하다. object 요소는 콘텐츠 모델이 구문 콘텐츠p 요소 내부에 있다. 따라서 텍스트는 구문 콘텐츠이므로 "Apples"가 허용된다.

투명 요소에 부모가 없으면 콘텐츠 모델에서 "투명"한 부분은 대신 모든 플로 콘텐츠를 허용하는 것으로 취급해야 한다.

3.2.5.4 문단

이 절에서 정의하는 문단이라는 용어는 단지 p 요소를 정의하는 데에만 사용되는 것이 아니다. 여기서 정의된 문단 개념은 문서를 해석하는 방법을 설명하는 데 사용된다. p 요소는 문단을 마크업하는 여러 방법 중 하나일 뿐이다.

문단은 일반적으로 타이포그래피에서처럼 특정 주제를 논의하는 하나 이상의 문장으로 이루어진 텍스트 블록을 형성하는 일련의 구문 콘텐츠이지만, 더 일반적인 주제별 그룹화에도 사용할 수 있다. 예를 들어 주소, 폼의 일부, 작성자 표시 또는 시의 연도 모두 문단이다.

다음 예에서는 한 섹션 안에 두 개의 문단이 있다. 문단이 아닌 구문 콘텐츠를 포함하는 제목도 있다. 주석과 요소 간 공백은 문단을 형성하지 않는다는 점에 유의한다.

<section>
  <h2>Example of paragraphs</h2>
  This is the <em>first</em> paragraph in this example.
  <p>This is the second.</p>
  <!-- This is not a paragraph. -->
</section>

플로 콘텐츠의 문단은 a, ins, delmap 요소가 없는 상태에서 문서가 어떻게 보이는지를 기준으로 정의된다. 이러한 요소는 혼합 콘텐츠 모델을 가지므로 아래의 첫 두 예처럼 문단 경계를 가로지를 수 있어 문제를 복잡하게 만들기 때문이다.

일반적으로 요소가 문단 경계를 가로지르도록 하는 것은 피하는 것이 좋다. 이러한 마크업은 유지 관리하기 어려울 수 있다.

다음 예는 앞의 예에 있는 마크업을 가져와 일부 마크업 주위에 insdel 요소를 배치하여 텍스트가 변경되었음을 보여준다(이 경우 변경 내용은 인정하건대 별로 의미가 없다). insdel 요소가 있음에도 이 예에는 앞의 예와 정확히 동일한 문단이 있다는 점에 유의한다. ins 요소는 제목과 첫 번째 문단을 가로지르고, del 요소는 두 문단 사이의 경계를 가로지른다.

<section>
  <ins><h2>Example of paragraphs</h2>
  This is the <em>first</em> paragraph in</ins> this example<del>.
  <p>This is the second.</p></del>
  <!-- This is not a paragraph. -->
</section>

view를 문서의 모든 a, ins, delmap 요소를 해당 요소의 콘텐츠로 대체한 DOM의 뷰로 둔다. 그런 다음 view에서 구문 콘텐츠뿐 아니라 그 밖의 콘텐츠도 허용하는 요소 안에 있는, 다른 유형의 콘텐츠에 의해 중단되지 않는 각각의 연속된 형제 구문 콘텐츠 노드에 대해, first를 그 연속된 노드의 첫 번째 노드로 두고 last를 마지막 노드로 둔다. 그러한 연속된 노드 중 임베디드 콘텐츠도 아니고 요소 간 공백도 아닌 노드를 하나 이상 포함하는 각각에 대해, 원래 DOM에서 first 바로 앞부터 last 바로 뒤까지 문단이 존재한다. (따라서 문단은 a, ins, delmap 요소를 가로질러 확장될 수 있다.)

적합성 검사기는 작성자에게 문단이 서로 겹치는 경우를 경고할 수 있다. 이는 object, video, audiocanvas 요소에서 발생할 수 있으며, SVG svg 또는 MathML math처럼 HTML을 그 안에 추가로 임베드할 수 있도록 허용하는 다른 네임스페이스의 요소를 통해 간접적으로 발생할 수도 있다.

문단p 요소에 의해 명시적으로도 형성된다.

p 요소는 문단을 서로 구분할 구문 콘텐츠 이외의 콘텐츠가 없을 경우 개별 문단을 감싸는 데 사용할 수 있다.

다음 예에서 링크는 첫 번째 문단의 절반, 두 문단을 구분하는 제목 전체 및 두 번째 문단의 절반에 걸쳐 있다. 이 링크는 문단과 제목을 가로지른다.

<header>
 Welcome!
 <a href="about.html">
  This is home of...
  <h1>The Falcons!</h1>
  The Lockheed Martin multirole jet fighter aircraft!
 </a>
 This page discusses the F-16 Fighting Falcon's innermost secrets.
</header>

다음은 이를 마크업하는 또 다른 방법이다. 이번에는 문단을 명시적으로 표시하고 하나의 링크 요소를 세 개로 분할한다:

<header>
 <p>Welcome! <a href="about.html">This is home of...</a></p>
 <h1><a href="about.html">The Falcons!</a></h1>
 <p><a href="about.html">The Lockheed Martin multirole jet
 fighter aircraft!</a> This page discusses the F-16 Fighting
 Falcon's innermost secrets.</p>
</header>

대체 콘텐츠를 정의하는 특정 요소를 사용할 때 문단이 서로 겹칠 수 있다. 예를 들어 다음 섹션에서는:

<section>
 <h2>My Cats</h2>
 You can play with my cat simulator.
 <object data="cats.sim">
  To see the cat simulator, use one of the following links:
  <ul>
   <li><a href="cats.sim">Download simulator file</a>
   <li><a href="https://sims.example.com/watch?v=LYds5xY4INU">Use online simulator</a>
  </ul>
  Alternatively, upgrade to the Mellblom Browser.
 </object>
 I'm quite proud of it.
</section>

다섯 개의 문단이 있다:

  1. "You can play with my cat simulator. object I'm quite proud of it."이라고 되어 있는 문단. 여기서 objectobject 요소이다.
  2. "To see the cat simulator, use one of the following links:"라고 되어 있는 문단.
  3. "Download simulator file"이라고 되어 있는 문단.
  4. "Use online simulator"라고 되어 있는 문단.
  5. "Alternatively, upgrade to the Mellblom Browser."라고 되어 있는 문단.

첫 번째 문단은 나머지 네 문단과 겹친다. "cats.sim" 리소스를 지원하는 사용자 에이전트는 첫 번째 문단만 표시하지만, 대체 콘텐츠를 표시하는 사용자 에이전트는 혼란스럽게도 첫 번째 문단의 첫 문장을 두 번째 문단과 같은 문단에 있는 것처럼 표시하고, 마지막 문단을 첫 번째 문단의 두 번째 문장 시작 부분에 있는 것처럼 표시한다.

이러한 혼란을 피하려면 명시적인 p 요소를 사용할 수 있다. 예:

<section>
 <h2>My Cats</h2>
 <p>You can play with my cat simulator.</p>
 <object data="cats.sim">
  <p>To see the cat simulator, use one of the following links:</p>
  <ul>
   <li><a href="cats.sim">Download simulator file</a>
   <li><a href="https://sims.example.com/watch?v=LYds5xY4INU">Use online simulator</a>
  </ul>
  <p>Alternatively, upgrade to the Mellblom Browser.</p>
 </object>
 <p>I'm quite proud of it.</p>
</section>

3.2.6 전역 속성

Global_attributes

다음 속성은 이 명세에 정의되지 않은 요소를 포함하여 모든 HTML 요소에 공통되며 지정할 수 있다:

이러한 속성은 이 명세에서 HTML 요소의 속성으로만 정의된다. 이 명세에서 이러한 속성을 가진 요소를 언급할 때, 해당 속성을 가지는 것으로 정의되지 않은 네임스페이스의 요소는 이러한 속성을 가진 요소로 간주해서는 안 된다.

예를 들어 다음 XML 조각에서 "bogus" 요소는 문자 그대로 "dir"라는 이름의 속성을 가지고 있음에도 이 명세에서 정의한 dir 속성을 가지지 않는다. 따라서 가장 안쪽의 span 요소의 방향성은 "bogus" 요소를 통해 간접적으로 div 요소에서 상속된 'rtl'이다.

<div xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
 <bogus xmlns="https://example.net/ns" dir="ltr">
  <span xmlns="http://www.w3.org/1999/xhtml">
  </span>
 </bogus>
</div>

Global_attributes/slot

현재의 모든 엔진에서 지원된다.

Firefox63+Safari10+Chrome53+
Opera?Edge79+
Edge (Legacy)아니요Internet Explorer?
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

DOM은 모든 네임스페이스의 모든 요소에 대한 class, idslot 속성의 사용자 에이전트 요구 사항을 정의한다. [DOM]

class, idslot 속성은 모든 HTML 요소에 지정할 수 있다.

HTML 요소에 지정할 때 class 속성은 요소가 속한 여러 클래스를 나타내는 공백으로 구분된 토큰 집합인 값을 가져야 한다.

요소에 클래스를 할당하면 CSS 선택자의 클래스 일치, DOM의 getElementsByClassName() 메서드 및 그 밖의 유사한 기능에 영향을 준다.

작성자가 class 속성에서 사용할 수 있는 토큰에는 추가 제한이 없지만, 작성자는 콘텐츠의 원하는 표현을 설명하는 값보다는 콘텐츠의 성격을 설명하는 값을 사용하는 것이 권장된다.

HTML 요소에 지정할 때 id 속성 값은 요소의 트리에 있는 모든 ID 중에서 고유해야 하며 하나 이상의 문자를 포함해야 한다. 값에는 ASCII 공백이 포함되어서는 안 된다.

id 속성은 해당 요소의 고유 식별자(ID)를 지정한다.

ID가 취할 수 있는 형식에는 그 밖의 제한이 없다. 특히 ID는 숫자로만 구성되거나, 숫자로 시작하거나, 밑줄로 시작하거나, 문장 부호로만 구성될 수도 있다.

요소의 고유 식별자는 다양한 목적으로 사용할 수 있다. 특히 프래그먼트를 사용하여 문서의 특정 부분에 연결하는 방법, 스크립팅 시 요소를 대상으로 지정하는 방법 및 CSS에서 특정 요소에 스타일을 지정하는 방법으로 사용할 수 있다.

식별자는 불투명한 문자열이다. id 속성 값에서 특정 의미를 도출해서는 안 된다.

slot 속성에는 HTML 요소에만 적용되는 별도의 적합성 요구 사항이 없다.

slot 속성은 요소에 슬롯을 할당하는 데 사용된다. slot 속성을 가진 요소는 할당되는데, 그 대상은 슬롯이며, 해당 슬롯은 name 속성 값이 그 slot 속성 값과 일치하는 slot 요소에 의해 생성된다. 단, 이는 해당 slot 요소가 루트호스트가 대응하는 slot 속성 값을 가진 섀도 트리 안에 있는 경우에만 해당한다.


보조 기술 제품이 HTML 요소와 속성만으로 가능한 것보다 더 세밀한 인터페이스를 노출할 수 있도록 보조 기술 제품을 위한 주석 집합을 지정할 수 있다(ARIA rolearia-* 속성). [ARIA]


다음 이벤트 핸들러 콘텐츠 속성은 모든 HTML 요소에 지정할 수 있다:

별표가 표시된 속성은 body 요소에 지정될 때 다른 의미를 가진다. 이 요소들이 동일한 이름을 가진 Window 객체의 이벤트 핸들러를 노출하기 때문이다.

이러한 속성은 모든 요소에 적용되지만 모든 요소에서 유용한 것은 아니다. 예를 들어 사용자 에이전트가 발생시킨 volumechange 이벤트를 수신하는 것은 미디어 요소뿐이다.


사용자 정의 데이터 속성 (예: data-foldername 또는 data-msgid)은 페이지에 특화된 사용자 정의 데이터, 상태, 주석 및 그와 유사한 정보를 저장하기 위해 모든 HTML 요소에 지정할 수 있다.


HTML 문서에서 HTML 네임스페이스의 요소에는 값이 정확히 "http://www.w3.org/1999/xhtml"인 경우에만 xmlns 속성을 지정할 수 있다. 이는 XML 문서에는 적용되지 않는다.

HTML에서 xmlns 속성은 아무런 효과도 없다. 이는 기본적으로 부적과 같다. XML로 또는 XML에서 마이그레이션하는 작업을 조금 더 쉽게 만들기 위해서만 허용된다. HTML 파서가 구문 분석하면 이 속성은 어떠한 네임스페이스에도 속하지 않게 된다. XML에서 이 속성은 네임스페이스 선언 메커니즘의 일부이며 항상 "http://www.w3.org/2000/xmlns/" 네임스페이스에 속한다.


XML은 또한 XML 문서의 모든 요소에서 XML 네임스페이스에 속하는 xml:space 속성을 사용할 수 있도록 허용한다. HTML의 기본 동작은 공백을 보존하는 것이므로 이 속성은 HTML 요소에 아무런 영향을 주지 않는다. [XML]

text/html 구문에서 HTML 요소xml:space 속성을 직렬화할 방법은 없다.

3.2.6.1 title 속성

Global_attributes/title

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

title 속성은 툴팁에 적합한 정보 등 요소에 대한 도움말 정보를 나타낸다. 링크에서는 대상 리소스의 제목이나 설명일 수 있고, 이미지에서는 이미지 출처나 이미지 설명일 수 있으며, 문단에서는 각주나 텍스트에 대한 해설일 수 있고, 인용에서는 출처에 대한 추가 정보일 수 있다. 대화형 콘텐츠에서는 요소를 사용하기 위한 레이블이나 지침일 수 있으며, 그 밖에도 이와 유사한 용도로 사용할 수 있다. 값은 텍스트이다.

현재는 title 속성에 의존하는 것이 권장되지 않는다. 많은 사용자 에이전트가 이 명세에서 요구하는 접근 가능한 방식으로 해당 속성을 노출하지 않기 때문이다(예를 들어 툴팁을 표시하려면 마우스와 같은 포인팅 장치를 요구하여, 키보드만 사용하는 사용자와 최신 휴대전화나 태블릿 사용자처럼 터치만 사용하는 사용자를 제외한다).

요소에서 이 속성이 생략되면, title 속성이 설정된 가장 가까운 조상 HTML 요소title 속성도 이 요소와 관련이 있음을 의미한다. 이 속성을 설정하면 이를 재정의하여 조상의 도움말 정보가 이 요소와 관련이 없음을 명시적으로 나타낸다. 속성을 빈 문자열로 설정하면 요소에 도움말 정보가 없음을 나타낸다.

title 속성 값에 U+000A LINE FEED(LF) 문자가 포함되어 있으면 콘텐츠가 여러 줄로 나뉜다. 각 U+000A LINE FEED(LF) 문자는 줄바꿈을 나타낸다.

title 속성에서 줄바꿈을 사용할 때는 주의하는 것이 좋다.

예를 들어 다음 코드 조각은 실제로 약어의 확장형을 내부에 줄바꿈이 포함된 상태로 정의한다:

<p>My logs show that there was some interest in <abbr title="Hypertext
Transport Protocol">HTTP</abbr> today.</p>

link, abbrinput과 같은 일부 요소는 위에서 설명한 의미 외에 title 속성에 대한 추가 의미를 정의한다.

요소의 도움말 정보는 다음 알고리즘이 반환하는 값이며, 값이 반환되는 즉시 알고리즘을 중단한다. 알고리즘이 빈 문자열을 반환하면 도움말 정보가 없는 것이다.

  1. 요소에 title 속성이 있으면, 해당 값에 줄바꿈 정규화를 실행한 결과를 반환한다.

  2. 요소에 부모 요소가 있으면 부모 요소의 도움말 정보를 반환한다.

  3. 빈 문자열을 반환한다.

사용자 에이전트는 요소에 도움말 정보가 있을 때 사용자에게 알려야 한다. 그렇지 않으면 해당 정보를 발견할 수 없게 된다.


3.2.6.2 langxml:lang 속성

Global_attributes/lang

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

어떠한 네임스페이스에도 속하지 않는 lang 속성은 요소의 콘텐츠와 텍스트를 포함하는 요소의 모든 속성에 대한 기본 언어를 지정한다. 그 값은 유효한 BCP 47 언어 태그 또는 빈 문자열이어야 한다. 속성을 빈 문자열로 설정하면 기본 언어를 알 수 없음을 나타낸다. [BCP47]

XML 네임스페이스lang 속성은 XML에 정의되어 있다. [XML]

요소에서 이러한 속성이 생략되면 이 요소의 언어는 부모 요소가 있는 경우 그 부모 요소의 언어와 같다 (섀도 트리slot 요소는 제외한다).

어떠한 네임스페이스에도 속하지 않는 lang 속성은 모든 HTML 요소에서 사용할 수 있다.

XML 네임스페이스lang 속성XML 문서HTML 요소에서 사용할 수 있으며, 관련 명세가 허용하는 경우 다른 네임스페이스의 요소에서도 사용할 수 있다(특히 MathML과 SVG는 해당 요소에 XML 네임스페이스lang 속성을 지정하도록 허용한다). 어떠한 네임스페이스에도 속하지 않는 lang 속성과 XML 네임스페이스lang 속성을 같은 요소에 모두 지정하면, ASCII 대소문자를 구분하지 않는 방식으로 비교했을 때 두 속성의 값이 정확히 같아야 한다.

작성자는 HTML 문서HTML 요소에서 XML 네임스페이스lang 속성을 사용해서는 안 된다. XML로 또는 XML에서 마이그레이션하는 작업을 쉽게 하기 위해 작성자는 HTML 문서HTML 요소에서 접두사가 없고 문자 그대로의 지역 이름이 "xml:lang"인 어떠한 네임스페이스에도 속하지 않는 속성을 지정할 수 있다. 하지만 이러한 속성은 어떠한 네임스페이스에도 속하지 않는 lang 속성도 함께 지정된 경우에만 지정해야 하며, ASCII 대소문자를 구분하지 않는 방식으로 비교했을 때 두 속성의 값이 같아야 한다.

접두사가 없고 문자 그대로의 지역 이름이 "xml:lang"인 어떠한 네임스페이스에도 속하지 않는 속성은 언어 처리에 아무런 영향을 주지 않는다.


노드의 언어를 결정하기 위해 사용자 에이전트는 다음 목록에서 처음으로 적용되는 단계를 사용해야 한다:

노드가 XML 네임스페이스lang 속성이 설정된 요소인 경우

해당 속성의 값을 사용한다.

노드가 HTML 요소 또는 SVG 네임스페이스의 요소이고, 어떠한 네임스페이스에도 속하지 않는 lang 속성이 설정된 경우

해당 속성의 값을 사용한다.

노드의 부모가 섀도 루트인 경우

해당 섀도 루트호스트언어를 사용한다.

노드의 부모 요소가 null이 아닌 경우

해당 부모 요소언어를 사용한다.

그렇지 않은 경우

프래그마로 설정된 기본 언어가 설정되어 있으면 그것이 노드의 언어이다. 프래그마로 설정된 기본 언어가 설정되어 있지 않으면 상위 수준 프로토콜(예: HTTP)의 언어 정보가 있는 경우 이를 최종 대체 언어로 사용해야 한다. 그러한 언어 정보가 없거나 상위 수준 프로토콜이 여러 언어를 보고하는 경우에는 노드의 언어를 알 수 없으며 대응하는 언어 태그는 빈 문자열이다.

결과 값이 인식되는 언어 태그가 아니면, 주어진 언어 태그를 가지며 다른 모든 언어와 구별되는 알 수 없는 언어로 취급해야 한다. 왕복 변환 또는 언어 태그를 기대하는 다른 서비스와 통신하기 위해 사용자 에이전트는 알 수 없는 언어 태그를 수정하지 않고 BCP 47 언어 태그임을 표시하여 전달해야 한다. 그래야 후속 서비스가 데이터를 다른 유형의 언어 설명으로 해석하지 않는다. [BCP47]

따라서 예를 들어 lang="xyzzy"가 지정된 요소는 :lang(xyzzy) 선택자(예: CSS)와 일치하지만, 두 값이 모두 똑같이 유효하지 않더라도 :lang(abcde)와는 일치하지 않는다. 마찬가지로 함께 작동하는 웹 브라우저와 스크린 리더가 요소의 언어에 관해 통신한다면, 브라우저는 "xyzzy"가 유효하지 않다는 것을 알고 있더라도 스크린 리더가 실제로 그 태그를 사용하는 언어를 지원할 가능성에 대비해 언어가 "xyzzy"라고 알려준다. 스크린 리더가 BCP 47과 언어 이름을 인코딩하는 또 다른 구문을 모두 지원하고, 그 다른 구문에서 "xyzzy"라는 문자열이 벨라루스어를 나타내는 방법이라고 하더라도 스크린 리더가 해당 텍스트를 벨라루스어로 취급하기 시작하는 것은 올바르지 않다. "xyzzy"는 BCP 47 코드에서 벨라루스어를 나타내는 방식이 아니기 때문이다 (BCP 47은 벨라루스어에 "be" 코드를 사용한다).

결과 값이 빈 문자열이면 노드의 언어를 명시적으로 알 수 없음으로 해석해야 한다.


사용자 에이전트는 요소의 언어를 사용하여 적절한 처리 또는 렌더링을 결정할 수 있다 (예: 적절한 글꼴이나 발음 선택, 사전 선택 또는 날짜 선택기와 같은 폼 컨트롤의 사용자 인터페이스).

3.2.6.3 translate 속성

Global_attributes/translate

현재의 모든 엔진에서 지원된다.

Firefox111+Safari6+Chrome19+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

translate 속성은 페이지를 현지화할 때 요소의 속성 값과 그 Text 노드 자식의 값을 번역할지, 아니면 변경하지 않고 그대로 둘지를 지정하는 데 사용된다. 이는 다음 키워드와 상태를 가진 열거형 속성이다:

키워드 상태 간략한 설명
yes 번역 모드번역 활성화로 설정한다.
no 아니요 번역 모드번역 안 함으로 설정한다.

속성의 누락 값 기본값유효하지 않은 값 기본값은 모두 상속 상태이며, 빈 값 기본값 상태이다.

각 요소(HTML이 아닌 요소 포함)에는 번역 모드가 있으며, 번역 활성화 상태 또는 번역 안 함 상태 중 하나이다. HTML 요소translate 속성이 상태이면 요소의 번역 모드번역 활성화 상태이다. 그렇지 않고 요소의 translate 속성이 아니요 상태이면 요소의 번역 모드번역 안 함 상태이다. 그 밖의 경우에는 요소의 translate 속성이 상속 상태이거나, 요소가 HTML 요소가 아니어서 translate 속성이 없는 경우이다. 두 경우 모두 요소의 번역 모드부모 요소가 있으면 부모 요소와 같은 상태이고, 요소의 부모 요소가 null이면 번역 활성화 상태이다.

요소가 번역 활성화 상태이면 요소의 번역 가능 속성과 그 Text 노드 자식의 값은 페이지를 현지화할 때 번역해야 한다.

요소가 번역 안 함 상태이면 요소의 속성 값과 그 Text 노드 자식의 값은 페이지를 현지화할 때 그대로 두어야 한다. 예를 들어 요소에 사람의 이름이나 컴퓨터 프로그램의 이름이 포함된 경우가 이에 해당한다.

다음 속성은 번역 가능 속성이다:

다른 명세에서는 역시 번역 가능 속성인 다른 속성을 정의할 수 있다. 예를 들어 ARIAaria-label 속성을 번역 가능한 것으로 정의한다.


translate IDL 속성은 가져올 때 요소의 번역 모드번역 활성화이면 true를 반환하고, 그렇지 않으면 false를 반환해야 한다. 설정할 때 새 값이 true이면 콘텐츠 속성의 값을 "yes"로 설정하고, 그렇지 않으면 콘텐츠 속성의 값을 "no"로 설정해야 한다.

이 예에서는 페이지를 현지화할 때 예시 키보드 입력과 예시 프로그램 출력을 제외한 문서의 모든 것을 번역해야 한다:

<!DOCTYPE HTML>
<html lang=en> <!-- default on the document element is translate=yes -->
 <head>
  <title>The Bee Game</title> <!-- implied translate=yes inherited from ancestors -->
 </head>
 <body>
  <p>The Bee Game is a text adventure game in English.</p>
  <p>When the game launches, the first thing you should do is type
  <kbd translate=no>eat honey</kbd>. The game will respond with:</p>
  <pre><samp translate=no>Yum yum! That was some good honey!</samp></pre>
 </body>
</html>
3.2.6.4 dir 속성

Global_attributes/dir

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

dir 속성은 다음 키워드와 상태를 가진 열거형 속성이다:

키워드 상태 간략한 설명
ltr LTR 요소의 콘텐츠는 왼쪽에서 오른쪽 방향의 텍스트로 명시적으로 방향 격리된다.
rtl RTL 요소의 콘텐츠는 오른쪽에서 왼쪽 방향의 텍스트로 명시적으로 방향 격리된다.
auto 자동 요소의 콘텐츠는 명시적으로 방향 격리된 텍스트이지만, 방향은 요소의 콘텐츠를 사용하여 프로그래밍 방식으로 결정해야 한다(아래 설명 참조).

자동 상태에서 사용하는 휴리스틱은 매우 단순하다 (양방향 알고리즘의 문단 수준 결정과 유사한 방식으로 방향성이 강한 첫 번째 문자만 확인한다). 작성자는 텍스트의 방향을 실제로 알 수 없고 더 나은 서버 측 휴리스틱을 적용할 수 없는 경우에만 최후의 수단으로 이 값을 사용하는 것이 강력히 권장된다. [BIDI]

textareapre 요소에서는 휴리스틱이 문단별로 적용된다.

속성의 누락 값 기본값유효하지 않은 값 기본값은 모두 정의되지 않음 상태이다.


요소(단지 HTML 요소만이 아니라 모든 요소)의 방향성은 'ltr' 또는 'rtl'이다. 요소 element가 주어졌을 때 방향성을 계산하려면 elementdir 속성 상태에 따라 분기한다:

LTR

'ltr'을 반환한다.

RTL

'rtl'을 반환한다.

자동
  1. resultelement자동 방향성으로 둔다.

  2. result가 null이면 'ltr'을 반환한다.

  3. result를 반환한다.

정의되지 않음
elementbdi 요소인 경우
  1. resultelement자동 방향성으로 둔다.

  2. result가 null이면 'ltr'을 반환한다.

  3. result를 반환한다.

elementtype 속성이 전화번호 상태인 input 요소인 경우

'ltr'을 반환한다.

그렇지 않은 경우

element부모 방향성을 반환한다.

dir 속성은 HTML 요소에만 정의되므로 다른 네임스페이스의 요소에는 존재할 수 없다. 따라서 다른 네임스페이스의 요소는 항상 부모 방향성을 사용하게 된다.

자동 방향성 폼 연관 요소는 다음과 같다:

요소 element가 주어졌을 때 자동 방향성을 계산하려면:

  1. element자동 방향성 폼 연관 요소이면:

    1. element에 양방향 문자 유형이 AL 또는 R인 문자가 포함되어 있고, 요소의 에서 그 문자보다 앞에 양방향 문자 유형이 L인 문자가 하나도 없으면 'rtl'을 반환한다. [BIDI]

    2. element이 빈 문자열이 아니면 'ltr'을 반환한다.

    3. null을 반환한다.

  2. element루트섀도 루트이고, element할당된 노드가 비어 있지 않은 slot 요소이면:

    1. element할당된 노드에 속하는 각 노드 child에 대해 반복한다:

      1. childDirection을 null로 둔다.

      2. childText 노드이면, childDirectionchild텍스트 노드 방향성으로 설정한다.

      3. 그렇지 않으면:

        1. 단언: childElement 노드이다.

        2. childDirectionchild포함된 텍스트 자동 방향성으로 설정하되, canExcludeRoot를 true로 설정한다.

      4. childDirection이 null이 아니면 childDirection을 반환한다.

    2. null을 반환한다.

  3. element포함된 텍스트 자동 방향성을 반환하되, canExcludeRoot를 false로 설정한다.

불리언 canExcludeRoot와 함께 요소 element포함된 텍스트 자동 방향성을 계산하려면:

  1. element자손인 각 노드 descendant에 대해 트리 순서반복한다:

    1. 다음 중 하나가

      • descendant
      • element의 자손인 descendant의 조상 요소
      • canExcludeRoot가 true인 경우 element

      다음 중 하나이면

      계속한다.

    2. descendant루트섀도 루트slot 요소이면, 해당 섀도 루트호스트방향성을 반환한다.

    3. descendantText 노드가 아니면 계속한다.

    4. resultdescendant텍스트 노드 방향성으로 둔다.

    5. result가 null이 아니면 result를 반환한다.

  2. null을 반환한다.

Text 노드 text가 주어졌을 때 텍스트 노드 방향성을 계산하려면:

  1. text데이터에 양방향 문자 유형이 L, AL 또는 R인 코드 포인트가 포함되어 있지 않으면 null을 반환한다. [BIDI]

  2. codePointtext데이터에서 양방향 문자 유형이 L, AL 또는 R인 첫 번째 코드 포인트로 둔다.

  3. codePoint의 양방향 문자 유형이 AL 또는 R이면 'rtl'을 반환한다.

  4. codePoint의 양방향 문자 유형이 L이면 'ltr'을 반환한다.

요소 element가 주어졌을 때 부모 방향성을 계산하려면:

  1. parentNodeelement의 부모 노드로 둔다.

  2. parentNode섀도 루트이면, parentNode호스트방향성을 반환한다.

  3. parentNode가 요소이면 parentNode방향성을 반환한다.

  4. 'ltr'을 반환한다.

이 속성에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.


어떤 방식으로든 속성의 텍스트를 렌더링에 포함할 때 사용되는 HTML 요소속성 방향성은 다음 목록에서 처음으로 적용되는 단계 집합에 따라 결정된다:

속성이 방향성을 가질 수 있는 속성이고 요소의 dir 속성이 자동 상태인 경우

속성 값에서 양방향 문자 유형이 L, AL 또는 R인 첫 번째 문자를 논리적 순서로 찾는다. [BIDI]

그러한 문자를 찾았고 양방향 문자 유형이 AL 또는 R이면 속성 방향성은 'rtl'이다.

그렇지 않으면 속성 방향성은 'ltr'이다.

그렇지 않은 경우
속성 방향성요소의 방향성과 같다.

다음 속성은 방향성을 가질 수 있는 속성이다:


document.dir [ = value ]

html 요소dir 속성 값이 있으면 반환한다.

"ltr", "rtl" 또는 "auto" 중 하나로 설정하여 html 요소dir 속성 값을 대체할 수 있다.

html 요소가 없으면 빈 문자열을 반환하고 새 값을 무시한다.

HTMLElement/dir

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

요소의 dir IDL 속성은 해당 요소의 dir 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

Document/dir

현재의 모든 엔진에서 지원된다.

Firefox1+Safari10.1+Chrome64+
Opera51+Edge79+
Edge (Legacy)12+Internet Explorer5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android47+

Document 객체의 dir IDL 속성은 html 요소가 있는 경우 해당 요소의 dir 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다. 그러한 요소가 없으면 속성은 빈 문자열을 반환해야 하며 설정할 때 아무 작업도 하지 않아야 한다.

작성자는 텍스트 방향을 나타낼 때 CSS보다 dir 속성을 사용하는 것이 강력히 권장된다. 이렇게 하면 CSS가 없는 경우에도(예: 검색 엔진이 문서를 해석하는 경우) 문서가 계속 올바르게 렌더링되기 때문이다.

이 마크업 조각은 IM 대화이다.

<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> How do you write "What's your name?" in Arabic?</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> ما اسمك؟</p>
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> Thanks.</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> That's written "شكرًا".</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> Do you know how to write "Please"?</p>
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> "من فضلك", right?</p>

적절한 스타일시트와 p 요소의 기본 정렬 스타일, 즉 텍스트를 문단의 시작 가장자리에 정렬하는 스타일이 주어지면 결과 렌더링은 다음과 같을 수 있다:

Each paragraph rendered as a separate block, with the paragraphs left-aligned except the second paragraph and the last one, which would be right aligned, with the usernames ('Student' and 'Teacher' in this example) flush right, with a colon to their left, and the text first to the left of that.

앞에서 언급했듯이 auto 값이 만능 해결책은 아니다. 이 예의 마지막 문단은 아랍어 문자로 시작하기 때문에 오른쪽에서 왼쪽 방향의 텍스트로 잘못 해석되며, 그 결과 "right?"가 아랍어 텍스트의 왼쪽에 배치된다.

3.2.6.5 style 속성

Global_attributes/style

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

모든 HTML 요소에는 style 콘텐츠 속성을 설정할 수 있다. 이는 CSS 스타일 속성에서 정의한 스타일 속성이다. [CSSATTR]

CSS를 지원하는 사용자 에이전트에서는 속성이 추가되거나 그 값이 변경될 때 스타일 속성에 지정된 규칙에 따라 속성 값을 구문 분석해야 한다. [CSSATTR]

하지만 속성의 요소, "style attribute" 및 속성 값에 대해 요소의 인라인 동작을 콘텐츠 보안 정책으로 차단해야 하는가? 알고리즘을 실행한 결과가 "Blocked"이면, 속성 값에 정의된 스타일 규칙을 요소에 적용해서는 안 된다. [CSP]

요소 중 하나라도 style 속성을 사용하는 문서는 해당 속성을 제거하더라도 여전히 이해하고 사용할 수 있어야 한다.

특히 style 속성을 사용하여 콘텐츠를 숨기거나 표시하는 것 또는 문서의 다른 부분에는 포함되지 않은 의미를 전달하는 것은 부적합하다. (콘텐츠를 숨기거나 표시하려면 hidden 속성을 사용한다.)


element.style

요소의 style 속성에 대한 CSSStyleDeclaration 객체를 반환한다.

style IDL 속성은 CSS 객체 모델에 정의되어 있다. [CSSOM]

다음 예에서는 색상을 지칭하는 단어를 span 요소와 style 속성을 사용하여 마크업함으로써, 시각 매체에서 해당 단어가 관련 색상으로 표시되도록 한다.

<p>My sweat suit is <span style="color: green; background:
transparent">green</span> and my eyes are <span style="color: blue;
background: transparent">blue</span>.</p>
3.2.6.6 data-* 속성을 사용하여 사용자 정의 비표시 데이터 임베딩

Global_attributes/data-*

현재의 모든 엔진에서 지원된다.

Firefox6+Safari5.1+Chrome7+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

사용자 정의 데이터 속성은 어떠한 네임스페이스에도 속하지 않고, 이름이 문자열 "data-"로 시작하며, 하이픈 뒤에 하나 이상의 문자가 있고, 유효한 속성 지역 이름이며, ASCII 대문자를 포함하지 않는 속성이다.

HTML 문서HTML 요소에 있는 모든 속성 이름은 자동으로 ASCII 소문자로 변환되므로, ASCII 대문자에 대한 제한은 이러한 문서에 영향을 주지 않는다.

사용자 정의 데이터 속성은 더 적절한 속성이나 요소가 없는 페이지 또는 애플리케이션 전용 사용자 정의 데이터, 상태, 주석 및 그와 유사한 정보를 저장하기 위한 것이다.

이러한 속성은 해당 속성을 사용하는 사이트의 관리자가 알지 못하는 소프트웨어에서 사용하도록 의도된 것이 아니다. 여러 독립적인 도구에서 사용할 일반적인 확장의 경우에는 이 명세를 확장하여 기능을 명시적으로 제공하거나, 표준화된 어휘와 함께 마이크로데이터와 같은 기술을 사용해야 한다.

예를 들어 음악 관련 사이트에서는 앨범의 트랙을 나타내는 목록 항목에 각 트랙의 길이가 포함된 사용자 정의 데이터 속성을 주석으로 지정할 수 있다. 그런 다음 사이트 자체에서 이 정보를 사용하여 사용자가 트랙 길이를 기준으로 목록을 정렬하거나 특정 길이의 트랙만 표시하도록 목록을 필터링할 수 있다.

<ol>
 <li data-length="2m11s">Beyond The Sea</li>
 ...
</ol>

하지만 사용자가 해당 음악 사이트와 관련이 없는 범용 소프트웨어에서 이 데이터를 살펴보아 특정 길이의 트랙을 검색하는 것은 부적절하다.

이러한 속성은 사이트 자체의 스크립트에서 사용하기 위한 것이며, 공개적으로 사용할 수 있는 메타데이터를 위한 일반적인 확장 메커니즘이 아니기 때문이다.

마찬가지로 페이지 작성자는 자신이 사용하려는 번역 도구에 정보를 제공하는 마크업을 작성할 수 있다:

<p>The third <span data-mytrans-de="Anspruch">claim</span> covers the case of <span
translate="no">HTML</span> markup.</p>

이 예에서 "data-mytrans-de" 속성은 MyTrans 제품이 "claim"이라는 구문을 독일어로 번역할 때 사용할 특정 텍스트를 제공한다. 하지만 표준 translate 속성을 사용하여 모든 언어에서 "HTML"을 변경하지 않고 그대로 두도록 지정한다. 표준 속성을 사용할 수 있으면 사용자 정의 데이터 속성을 사용할 필요가 없다.

이 예에서는 PaymentRequest에 대한 기능 감지 결과를 저장하기 위해 사용자 정의 데이터 속성을 사용한다. 이 결과는 CSS에서 결제 페이지의 스타일을 다르게 지정하는 데 사용할 수 있다.

<script>
 if ('PaymentRequest' in window) {
   document.documentElement.dataset.hasPaymentRequest = '';
 }
</script>

여기서는 data-has-payment-request 속성을 사실상 불리언 속성으로 사용하며, 속성이 존재하는지만 확인하면 충분하다. 하지만 작성자가 원한다면 나중에 어떤 값으로 채워서 기능의 제한된 작동을 나타내는 데 사용할 수도 있다.

모든 HTML 요소에는 임의의 값을 가진 사용자 정의 데이터 속성을 원하는 수만큼 지정할 수 있다.

작성자는 속성이 무시되고 관련 CSS가 제거되더라도 페이지를 계속 사용할 수 있도록 이러한 확장을 신중하게 설계해야 한다.

사용자 에이전트는 이러한 속성이나 값에서 어떠한 구현 동작도 도출해서는 안 된다. 사용자 에이전트를 대상으로 하는 명세에서는 이러한 속성에 의미 있는 값을 정의해서는 안 된다.

JavaScript 라이브러리는 사용자 정의 데이터 속성을 사용할 수 있다. 이러한 속성은 사용되는 페이지의 일부로 간주되기 때문이다. 많은 작성자가 재사용하는 라이브러리의 작성자는 충돌 위험을 줄이기 위해 속성 이름에 자신의 이름을 포함하는 것이 권장된다. 적절한 경우 라이브러리 작성자는 속성 이름에 사용되는 정확한 이름을 사용자가 지정할 수 있도록 하는 것도 권장된다. 그러면 서로 같은 이름을 선택했다는 사실을 알지 못했던 작성자들의 라이브러리를 같은 페이지에서 사용할 수 있고, 특정 라이브러리의 여러 버전이 서로 호환되지 않더라도 같은 페이지에서 사용할 수 있다.

예를 들어 "DoQuery"라는 라이브러리는 data-doquery-range와 같은 속성 이름을 사용할 수 있고, "jJo"라는 라이브러리는 data-jjo-range와 같은 속성 이름을 사용할 수 있다. jJo 라이브러리는 사용할 접두사를 설정하는 API도 제공할 수 있다 (예: J.setDataPrefix('j2')를 사용하면 속성 이름이 data-j2-range와 같이 된다).


element.dataset

HTMLElement/dataset

현재의 모든 엔진에서 지원된다.

Firefox6+Safari5.1+Chrome7+
Opera11+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android11+

SVGElement/dataset

현재의 모든 엔진에서 지원된다.

Firefox51+Safari5.1+Chrome55+
Opera41+Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android41+

요소의 data-* 속성에 대한 DOMStringMap 객체를 반환한다.

하이픈이 포함된 이름은 카멜 표기법으로 변환된다. 예를 들어 data-foo-bar=""element.dataset.fooBar가 된다.

dataset IDL 속성은 요소의 모든 data-* 속성에 편리하게 접근할 수 있는 접근자를 제공한다. 가져올 때 dataset IDL 속성은 연관 요소가 이 요소인 DOMStringMap을 반환해야 한다.

DOMStringMap 인터페이스는 dataset 속성에 사용된다. 각 DOMStringMap에는 연관 요소가 있다.

[Exposed=Window,
 LegacyOverrideBuiltIns]
interface DOMStringMap {
  getter DOMString (DOMString name);
  [CEReactions] setter undefined (DOMString name, DOMString value);
  [CEReactions] deleter undefined (DOMString name);
};

DOMStringMap의 이름-값 쌍을 가져오려면, 다음 알고리즘을 실행한다:

  1. list를 빈 이름-값 쌍 목록으로 둔다.

  2. DOMStringMap연관 요소에 있는 각 콘텐츠 속성 중 처음 다섯 문자가 문자열 "data-"이고, 나머지 문자에 ASCII 대문자가 포함되어 있지 않은 속성에 대해, 요소의 속성 목록에 나열된 순서대로 이름에서 처음 다섯 문자를 제거한 값을 이름으로 하고 속성 값을 값으로 하는 이름-값 쌍을 list에 추가한다.

  3. list의 각 이름에 대해, 이름에서 ASCII 소문자가 뒤따르는 각 U+002D HYPHEN-MINUS 문자(-)를 제거하고, 그 뒤에 있던 문자를 같은 문자의 ASCII 대문자 변환 결과로 교체한다.

  4. list를 반환한다.

임의의 시점에서 DOMStringMap 객체의 지원되는 속성 이름은 그 시점에 DOMStringMap의 이름-값 쌍을 가져온 결과로 반환되는 각 쌍의 이름이며, 반환된 순서를 따른다.

DOMStringMap에서 명명된 속성 name값을 결정하려면, DOMStringMap의 이름-값 쌍을 가져온 결과 목록에서 이름 구성 요소가 name인 이름-값 쌍의 값 구성 요소를 반환한다.

DOMStringMap에서 새 명명된 속성의 값을 설정하거나 기존 명명된 속성의 값을 설정하기 위해, 속성 이름 name과 새 값 value가 주어지면 다음 단계를 실행한다:

  1. nameASCII 소문자가 뒤따르는 U+002D HYPHEN-MINUS 문자(-)가 포함되어 있으면 "SyntaxError" DOMException을 던진다.

  2. name의 각 ASCII 대문자 앞에 U+002D HYPHEN-MINUS 문자(-)를 삽입하고, 해당 문자를 같은 문자의 ASCII 소문자 변환 결과로 교체한다.

  3. name 앞에 문자열 data-를 삽입한다.

  4. name유효한 속성 지역 이름이 아니면 "InvalidCharacterError" DOMException을 던진다.

  5. DOMStringMap연관 요소에 대해 namevalue를 사용하여 속성 값을 설정한다.

DOMStringMap에서 기존 명명된 속성 name삭제하려면 다음 단계를 실행한다:

  1. name의 각 ASCII 대문자 앞에 U+002D HYPHEN-MINUS 문자(-)를 삽입하고, 해당 문자를 같은 문자의 ASCII 소문자 변환 결과로 교체한다.

  2. name 앞에 문자열 data-를 삽입한다.

  3. nameDOMStringMap연관 요소가 주어지면 이름으로 속성을 제거한다.

이 알고리즘은 앞의 DOMStringMap의 이름-값 쌍을 가져오는 알고리즘에서 제공된 이름에 대해서만 Web IDL에 의해 호출된다. [WEBIDL]

웹페이지에서 요소가 게임의 일부로 우주선을 나타내도록 하려면 class 속성과 함께 data-* 속성을 사용해야 한다:

<div class="spaceship" data-ship-id="92432"
     data-weapons="laser 2" data-shields="50%"
     data-x="30" data-y="10" data-z="90">
 <button class="fire"
         onclick="spaceships[this.parentNode.dataset.shipId].fire()">
  Fire
 </button>
</div>

하이픈이 포함된 속성 이름이 API에서 카멜 표기법으로 변환된다는 점에 유의한다.

다음 코드 조각과 유사한 구조를 가진 요소가 주어졌다고 하자:

<img class="tower" id="tower5" data-x="12" data-y="5"
     data-ai="robotarget" data-hp="46" data-ability="flames"
     src="towers/rocket.png" alt="Rocket Tower">

...몇 가지 인수를 받고 그중 첫 번째 인수가 처리할 요소인 splashDamage() 함수를 생각할 수 있다:

function splashDamage(node, x, y, damage) {
  if (node.classList.contains('tower') && // checking the 'class' attribute
      node.dataset.x == x && // reading the 'data-x' attribute
      node.dataset.y == y) { // reading the 'data-y' attribute
    var hp = parseInt(node.dataset.hp); // reading the 'data-hp' attribute
    hp = hp - damage;
    if (hp < 0) {
      hp = 0;
      node.dataset.ai = 'dead'; // setting the 'data-ai' attribute
      delete node.dataset.ability; // removing the 'data-ability' attribute
    }
    node.dataset.hp = hp; // setting the 'data-hp' attribute
  }
}

3.2.7 innerTextouterText 속성

HTMLElement/innerText

현재의 모든 엔진에서 지원된다.

Firefox45+Safari1+Chrome1+
Opera9.6+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android1+Samsung Internet?Opera Android10.1+
element.innerText [ = value ]

요소의 텍스트 콘텐츠를 "렌더링된 대로" 반환한다.

설정하여 요소의 자식을 주어진 값으로 교체할 수 있지만, 줄바꿈은 br 요소로 변환한다.

element.outerText [ = value ]

요소의 텍스트 콘텐츠를 "렌더링된 대로" 반환한다.

설정하여 요소를 주어진 값으로 교체할 수 있지만, 줄바꿈은 br 요소로 변환한다.

HTMLElement element가 주어졌을 때, 텍스트 가져오기 단계는 다음과 같다:

  1. element렌더링 중이 아니거나 사용자 에이전트가 CSS를 사용하지 않는 사용자 에이전트이면 element자손 텍스트 콘텐츠를 반환한다.

    이 단계에서는 예상치 못한 결과가 발생할 수 있다. innerText getter를 렌더링 중이 아닌 요소에서 호출하면 텍스트 콘텐츠가 반환되지만, 렌더링 중인 요소에서 접근하면 렌더링 중이 아닌 모든 자식의 텍스트 콘텐츠가 무시되기 때문이다.

  2. results를 새로운 빈 목록으로 둔다.

  3. element의 각 자식 노드 node에 대해:

    1. currentnode렌더링된 텍스트 수집 단계를 실행한 결과인 목록으로 둔다. results의 각 항목은 문자열 또는 양의 정수(필수 줄바꿈 수)이다.

      직관적으로 필수 줄바꿈 수 항목은 해당 지점에 특정 수의 줄바꿈이 나타남을 의미하지만, 인접한 필수 줄바꿈 수 항목으로 인해 발생한 줄바꿈과 병합될 수 있다. 이는 CSS 여백 상쇄와 유사하다.

    2. current의 각 항목 itemresults에 추가한다.

  4. results에서 빈 문자열인 모든 항목을 제거한다.

  5. results의 시작이나 끝에 있는 연속된 필수 줄바꿈 수 항목을 모두 제거한다.

  6. 남아 있는 각각의 연속된 필수 줄바꿈 수 항목을 해당 항목 값의 최댓값만큼 U+000A LF 코드 포인트가 포함된 문자열로 교체한다.

  7. results의 문자열 항목을 연결한 결과를 반환한다.

HTMLElement/outerText

현재의 모든 엔진에서 지원된다.

Firefox98+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android1+Samsung Internet?Opera Android12.1+

innerTextouterText getter 단계는 this텍스트 가져오기 단계를 실행한 결과를 반환하는 것이다.

노드 node가 주어졌을 때, 렌더링된 텍스트 수집 단계는 다음과 같다:

  1. itemsnode의 각 자식 노드에 대해 렌더링된 텍스트 수집 단계트리 순서로 실행한 다음 그 결과를 하나의 목록으로 연결한 결과로 둔다.

  2. node'visibility' 계산 값이 'visible'이 아니면 items를 반환한다.

  3. node렌더링 중이 아니면 items를 반환한다. 이 단계의 목적상 다음 요소는 'display' 속성의 계산 값이 'none'이 아니면 설명된 대로 동작해야 한다:

    • select 요소에는 연관된 비대체 인라인 CSS 박스가 있으며, 그 자식 박스에는 optgroupoption 요소 자손 노드의 박스만 포함된다.

    • optgroup 요소에는 연관된 비대체 블록 수준 CSS 박스가 있으며, 그 자식 박스에는 option 요소 자손 노드의 박스만 포함된다. 그리고

    • option 요소에는 연관된 비대체 블록 수준 CSS 박스가 있으며, 그 자식 박스는 비대체 블록 수준 CSS 박스에서와 같이 정상적으로 구성된다.

    'display:contents'로 인해 items가 비어 있지 않을 수 있다.

  4. nodeText 노드이면 node가 생성한 각 CSS 텍스트 박스에 대해 콘텐츠 순서대로 CSS 'white-space' 처리 규칙과 'text-transform' 규칙을 적용한 뒤 박스의 텍스트를 계산하고, items를 결과 문자열의 목록으로 설정한 다음 items를 반환한다. CSS 'white-space' 처리 규칙은 약간 수정된다. 줄 끝의 축소 가능한 공백은 항상 축소되지만, 그 줄이 블록의 마지막 줄이거나 br 요소로 끝나는 경우에만 제거된다. 소프트 하이픈은 보존해야 한다. [CSSTEXT]

  5. nodebr 요소이면 단일 U+000A LF 코드 포인트를 포함하는 문자열을 items추가한다.

  6. node'display' 계산 값'table-cell'이고, nodeCSS 박스가 이를 둘러싼 'table-row' 박스의 마지막 'table-cell' 박스가 아니면 단일 U+0009 TAB 코드 포인트를 포함하는 문자열을 items추가한다.

  7. node'display' 계산 값'table-row'이고, nodeCSS 박스가 가장 가까운 조상 'table' 박스의 마지막 'table-row' 박스가 아니면 단일 U+000A LF 코드 포인트를 포함하는 문자열을 items추가한다.

  8. nodep 요소이면 items의 시작과 끝에 2(필수 줄바꿈 수)를 추가한다.

  9. node'display' 사용 값블록 수준 또는 'table-caption'이면 items의 시작과 끝에 1(필수 줄바꿈 수)을 추가한다. [CSSDISPLAY]

    플로트와 절대 위치 지정 요소가 이 범주에 속한다.

  10. items를 반환한다.

대부분의 대체 요소(예: textarea, inputvideo — 단, button은 제외)의 자손 노드는 엄밀히 말해 CSS에 의해 렌더링되지 않으므로, 이 알고리즘의 목적상 CSS 박스가 없다는 점에 유의한다.

이 알고리즘은 범위에서 작동하도록 일반화할 수 있다. 그러면 이를 Selection의 문자열 변환기의 기반으로 사용하고, 범위에 직접 노출할 수도 있다. Bugzilla 버그 10583을 참조한다.


HTMLElement element와 문자열 value가 주어졌을 때, 내부 텍스트 설정 단계는 다음과 같다:

  1. fragmentelement노드 문서가 주어졌을 때 value에 대한 렌더링된 텍스트 조각으로 둔다.

  2. element 내부의 모든 항목을 fragment교체한다.

innerText setter 단계는 this와 주어진 값으로 내부 텍스트 설정 단계를 실행하는 것이다.

outerText setter 단계는 다음과 같다:

  1. this의 부모가 null이면 "NoModificationAllowedError" DOMException을 던진다.

  2. nextthis다음 형제로 둔다.

  3. previousthis이전 형제로 둔다.

  4. fragmentthis노드 문서가 주어졌을 때 주어진 값에 대한 렌더링된 텍스트 조각으로 둔다.

  5. fragment자식이 없으면, this노드 문서노드 문서로 가지며 데이터가 빈 문자열인 새로운 Text 노드를 fragment추가한다.

  6. this의 부모 안에서 thisfragment교체한다.

  7. next가 null이 아니고 next이전 형제Text 노드이면, next이전 형제가 주어졌을 때 다음 텍스트 노드와 병합한다.

  8. previousText 노드이면 previous가 주어졌을 때 다음 텍스트 노드와 병합한다.

Document document가 주어졌을 때 문자열 input에 대한 렌더링된 텍스트 조각은 다음 단계를 실행한 결과이다:

  1. fragmentdocument가 주어졌을 때 문서 프래그먼트를 생성한 결과로 설정합니다.

  2. positioninput위치 변수로 설정하고, 처음에는 input의 시작을 가리키도록 합니다.

  3. text를 빈 문자열로 설정합니다.

  4. positioninput의 끝을 지나지 않는 동안:

    1. position이 주어졌을 때 input에서 U+000A LF 또는 U+000D CR이 아닌 코드 포인트 시퀀스를 수집하고, text를 그 결과로 설정합니다.

    2. text가 빈 문자열이 아니면, 추가합니다. 데이터text이고 노드 문서document인 새로운 Text 노드를 fragment에 추가합니다.

    3. positioninput의 끝을 지나지 않고, position의 코드 포인트가 U+000A LF 또는 U+000D CR인 동안:

      1. position의 코드 포인트가 U+000D CR이고 다음 코드 포인트가 U+000A LF이면, positioninput의 다음 코드 포인트로 전진시킵니다.

      2. positioninput의 다음 코드 포인트로 전진시킵니다.

      3. document, "br", 그리고 HTML 네임스페이스가 주어졌을 때 요소를 생성한 결과를 fragment추가합니다.

  5. fragment를 반환합니다.

Text 노드 node가 주어졌을 때 다음 텍스트 노드와 병합하려면:

  1. nextnode다음 형제로 둔다.

  2. nextText 노드가 아니면 반환한다.

  3. node, node데이터길이, 0 및 next데이터를 사용하여 데이터를 교체한다.

  4. next제거한다.

3.2.8 양방향 알고리즘 관련 요구 사항

3.2.8.1 양방향 알고리즘 서식 문자에 대한 작성 적합성 기준

텍스트 콘텐츠HTML 요소Text 노드를 포함하는 콘텐츠와, 자유 형식 텍스트를 허용하는 HTML 요소의 속성에 있는 텍스트에서 U+202A부터 U+202E까지 및 U+2066부터 U+2069까지의 문자 (양방향 알고리즘 서식 문자)를 포함할 수 있다. [BIDI]

작성자는 양방향 알고리즘 서식 문자를 수동으로 관리하는 대신 dir 속성, bdo 요소 및 bdi 요소를 사용하는 것이 권장된다. 양방향 알고리즘 서식 문자는 CSS와 제대로 상호 작용하지 않는다.

3.2.8.2 사용자 에이전트 적합성 기준

사용자 에이전트는 문서와 문서 일부를 렌더링할 때 문자의 올바른 순서를 결정하기 위해 유니코드 양방향 알고리즘을 구현해야 한다. [BIDI]

HTML을 유니코드 양방향 알고리즘에 매핑하는 작업은 세 가지 방법 중 하나로 수행해야 한다. 사용자 에이전트는 특히 CSS 'unicode-bidi', 'direction''content' 속성을 포함하는 CSS를 구현하고, 사용자 에이전트 스타일시트에 이 명세의 렌더링 절에서 지정한 해당 속성을 사용하는 규칙을 포함해야 한다. 또는 사용자 에이전트가 앞에서 언급한 속성만 구현하고 앞에서 언급한 모든 규칙을 포함하는 사용자 에이전트 스타일시트를 가진 것처럼 동작하되, 문서에 지정된 스타일시트가 해당 규칙을 재정의하지 못하게 해야 한다. 또는 이와 동등한 의미 체계를 가진 다른 스타일링 언어를 구현해야 한다. [CSSGC]

다음 요소와 속성에는 렌더링 절에서 정의한 요구 사항이 있으며, 이 절의 요구 사항으로 인해 이러한 요구 사항은 모든 사용자 에이전트에 적용된다 (제안된 기본 렌더링을 지원하는 사용자 에이전트에만 적용되는 것이 아니다):

3.2.9 ARIA 및 플랫폼 접근성 API 관련 요구 사항

HTML 요소에서 접근성 API 의미 체계를 구현하기 위한 사용자 에이전트 요구 사항은 HTML 접근성 API 매핑에 정의되어 있다. 해당 규칙 외에도 사용자 정의 요소 element의 기본 ARIA 역할 의미 체계는 다음과 같이 결정된다. [HTMLAAM]

  1. mapelement내부 콘텐츠 속성 맵으로 둔다.

  2. map["role"]이 존재하면 이를 반환한다.

  3. 역할 없음을 반환한다.

마찬가지로 사용자 정의 요소 element에서 stateOrProperty라는 이름의 상태 또는 속성에 대한 기본 ARIA 상태 및 속성 의미 체계는 다음과 같이 결정된다:

  1. element연결된 내부 구조가 null이 아니면:

    1. element연결된 내부 구조 stateOrProperty 연관 요소 가져오기가 존재하면 이를 실행한 결과를 반환한다.

    2. element연결된 내부 구조 stateOrProperty 연관 요소들 가져오기가 존재하면 이를 실행한 결과를 반환한다.

  2. element내부 콘텐츠 속성 맵[stateOrProperty]이 존재하면 이를 반환한다.

  3. stateOrProperty의 기본값을 반환한다.

여기에서 언급하는 "기본 의미 체계"는 ARIA에서 때때로 "네이티브", "암시적" 또는 "호스트 언어" 의미 체계라고도 한다. [ARIA]

이러한 정의가 의미하는 바 중 하나는 기본 의미 체계가 시간에 따라 변경될 수 있다는 것이다. 이를 통해 사용자 정의 요소는 내장 요소와 동일한 표현력을 가질 수 있다. 예를 들어 a 요소에서 href 속성을 추가하거나 제거할 때 기본 ARIA 역할 의미 체계가 어떻게 변경되는지 비교할 수 있다.

실제로 적용되는 예는 사용자 정의 요소 절을 참조한다.


HTML 요소에서 ARIA rolearia-* 속성 사용을 검사하기 위한 적합성 검사기 요구 사항은 HTML의 ARIA에 정의되어 있다. [ARIAHTML]

4 HTML의 요소

4.1 문서 요소

4.1.1 html 요소

Element/html

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLHtmlElement

Support in all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
없음.
이 요소를 사용할 수 있는 맥락:
문서의 문서 요소로.
복합 문서에서 하위 문서 조각이 허용되는 곳.
콘텐츠 모델:
head 요소 뒤에 body 요소가 온다.
text/html에서의 태그 생략:
html 요소 내부의 첫 번째 항목이 주석이 아니면 html 요소의 시작 태그를 생략할 수 있다.
html 요소 바로 뒤에 주석이 오지 않으면 html 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLHtmlElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

html 요소는 HTML 문서의 루트를 나타낸다.

작성자는 루트 html 요소에 문서의 언어를 제공하는 lang 속성을 지정하는 것이 권장된다. 이는 음성 합성 도구가 사용할 발음을 결정하고, 번역 도구가 사용할 규칙을 결정하는 등의 작업에 도움이 된다.

다음 예의 html 요소는 문서의 언어가 영어임을 선언한다.

<!DOCTYPE html>
<html lang="en">
<head>
<title>Swapping Songs</title>
</head>
<body>
<h1>Swapping Songs</h1>
<p>Tonight I swapped some of the songs I wrote with some friends, who
gave me some of the songs they wrote. I love sharing my music.</p>
</body>
</html>

4.2 문서 메타데이터

4.2.1 head 요소

Element/head

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLHeadElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
없음.
이 요소를 사용할 수 있는 맥락:
html 요소의 첫 번째 요소로.
콘텐츠 모델:
문서가 iframe srcdoc 문서이거나 상위 수준 프로토콜에서 제목 정보를 사용할 수 있는 경우: 0개 이상의 메타데이터 콘텐츠 요소. 이 중 title 요소는 최대 하나이고 base 요소도 최대 하나이다.
그렇지 않은 경우: 하나 이상의 메타데이터 콘텐츠 요소. 이 중 정확히 하나는 title 요소이고, base 요소는 최대 하나이다.
text/html에서의 태그 생략:
요소가 비어 있거나 head 요소 내부의 첫 번째 항목이 요소이면 head 요소의 시작 태그를 생략할 수 있다.
head 요소 바로 뒤에 ASCII 공백이나 주석이 오지 않으면 head 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLHeadElement : HTMLElement {
  [HTMLConstructor] constructor();
};

head 요소는 Document의 메타데이터 모음을 나타낸다.

head 요소의 메타데이터 모음은 크거나 작을 수 있다. 다음은 매우 짧은 예이다:

<!doctype html>
<html lang=en>
 <head>
  <title>A document with a short head</title>
 </head>
 <body>
 ...

다음은 더 긴 예이다:

<!DOCTYPE HTML>
<HTML LANG="EN">
 <HEAD>
  <META CHARSET="UTF-8">
  <BASE HREF="https://www.example.com/">
  <TITLE>An application with a long head</TITLE>
  <LINK REL="STYLESHEET" HREF="default.css">
  <LINK REL="STYLESHEET ALTERNATE" HREF="big.css" TITLE="Big Text">
  <SCRIPT SRC="support.js"></SCRIPT>
  <META NAME="APPLICATION-NAME" CONTENT="Long headed application">
 </HEAD>
 <BODY>
 ...

title 요소는 대부분의 상황에서 필수 자식이지만, 상위 수준 프로토콜이 제목 정보를 제공하는 경우에는 생략할 수 있다. 예를 들어 HTML을 이메일 작성 형식으로 사용할 때 이메일 제목 줄에서 제목 정보를 제공하면 title 요소를 생략할 수 있다.

4.2.2 title 요소

Element/title

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer1+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLTitleElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
메타데이터 콘텐츠.
이 요소를 사용할 수 있는 맥락:
다른 title 요소를 포함하지 않는 head 요소 내부.
콘텐츠 모델:
요소 간 공백이 아닌 텍스트.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLTitleElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions] attribute DOMString text;
};

title 요소는 문서의 제목이나 이름을 나타낸다. 작성자는 문서가 사용자의 기록이나 북마크 또는 검색 결과 등 맥락에서 벗어나 사용되더라도 문서를 식별할 수 있는 제목을 사용해야 한다. 문서의 첫 번째 제목은 맥락에서 벗어나 단독으로 사용될 필요가 없으므로 문서의 제목은 첫 번째 제목과 다른 경우가 많다.

문서당 title 요소는 하나를 초과해서는 안 된다.

Document에 제목이 없어도 합당하다면 title 요소는 필수가 아닐 가능성이 높다. 요소가 필요한 경우에 대한 설명은 head 요소의 콘텐츠 모델을 참조한다.

title.text [ = value ]

요소의 자식 텍스트 콘텐츠를 반환한다.

설정하여 요소의 자식을 주어진 값으로 교체할 수 있다.

text 속성의 getter는 이 title 요소의 자식 텍스트 콘텐츠를 반환해야 한다.

text 속성의 setter는 이 title 요소 내부를 주어진 값으로 문자열 전체 교체해야 한다.

다음은 적절한 제목의 몇 가지 예이며, 동일한 페이지에서 사용할 수 있는 최상위 제목과 대조한다.

  <title>Introduction to The Mating Rituals of Bees</title>
    ...
  <h1>Introduction</h1>
  <p>This companion guide to the highly successful
  <cite>Introduction to Medieval Bee-Keeping</cite> book is...

다음 페이지는 같은 사이트의 일부일 수 있다. 제목은 주제를 명확하게 설명하지만 첫 번째 제목은 독자가 맥락을 알고 있다고 가정하므로 춤이 살사인지 왈츠인지 혼동하지 않는다는 점에 유의한다:

  <title>Dances used during bee mating rituals</title>
    ...
  <h1>The Dances</h1>

문서 제목으로 사용할 문자열은 document.title IDL 속성으로 제공된다.

사용자 에이전트는 사용자 인터페이스에서 문서를 지칭할 때 문서의 제목을 사용해야 한다. title 요소의 콘텐츠를 이러한 방식으로 사용할 때는 해당 title 요소의 방향성을 사용하여 사용자 인터페이스에서 문서 제목의 방향성을 설정해야 한다.

4.2.3 base 요소

Element/base

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLBaseElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
메타데이터 콘텐츠.
이 요소를 사용할 수 있는 맥락:
다른 base 요소를 포함하지 않는 head 요소 내부.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
href문서 기준 URL
target하이퍼링크 내비게이션폼 제출을 위한 기본 내비게이블
접근성 고려 사항:
작성자용.
구현자용.
정제:
안전하지 않음.
DOM 인터페이스:
[Exposed=Window]
interface HTMLBaseElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectSetter] attribute USVString href;
  [CEReactions, Reflect] attribute DOMString target;
};

base 요소를 사용하면 작성자는 URL을 구문 분석하기 위한 문서 기준 URL하이퍼링크를 따라가기 위한 기본 내비게이블의 이름을 지정할 수 있다. 이 요소는 이 정보 외의 어떠한 콘텐츠도 나타내지 않는다.

문서당 base 요소는 하나를 초과해서는 안 된다.

base 요소에는 href 속성이나 target 속성 또는 둘 다 있어야 한다.

href 콘텐츠 속성을 지정한 경우 그 값에는 공백으로 둘러싸일 수 있는 유효한 URL이 포함되어야 한다.

base 요소에 href 속성이 있으면, 트리에서 URL을 받도록 정의된 속성을 가진 다른 모든 요소보다 앞에 있어야 한다.

href 속성이 있는 base 요소가 여러 개이면 첫 번째 요소를 제외한 나머지는 모두 무시된다.

target 속성을 지정한 경우 그 값에는 유효한 내비게이블 대상 이름 또는 키워드가 포함되어야 한다. 이는 Document하이퍼링크내비게이션을 일으킬 때 기본으로 사용할 내비게이블을 지정한다.

base 요소에 target 속성이 있으면, 트리에서 하이퍼링크를 나타내는 모든 요소보다 앞에 있어야 한다.

target 속성이 있는 base 요소가 여러 개이면 첫 번째 요소를 제외한 나머지는 모두 무시된다.

a, area 또는 form 요소 element와 선택적 문자열 또는 null인 target (기본값 null)이 주어졌을 때 요소의 대상을 가져오려면 다음 단계를 실행한다:

  1. target이 null이면:

    1. elementtarget 속성이 있으면 target을 해당 속성 값으로 설정한다.

    2. 그렇지 않고 element노드 문서target 속성이 있는 base 요소가 포함되어 있으면, target을 그러한 첫 번째 base 요소의 target 속성 값으로 설정한다.

  2. target이 null이 아니고 ASCII 탭 또는 줄바꿈과 U+003C(<)를 포함하면 target을 "_blank"로 설정한다.

  3. target을 반환한다.


문서 트리 안에서 href 콘텐츠 속성을 가진 첫 번째 base 요소인 base 요소에는 고정된 기준 URL이 있다. 다음 상황 중 하나가 발생할 때마다 요소의 고정된 기준 URL즉시 설정해야 한다:

요소 element고정된 기준 URL을 설정하려면:

  1. documentelement노드 문서로 둔다.

  2. urlRecorddocument대체 기준 URLdocument문자 인코딩을 사용하여 elementhref 콘텐츠 속성 값을 구문 분석한 결과로 둔다. (따라서 base 요소는 자기 자신의 영향을 받지 않는다.)

  3. 다음 중 하나라도 참이면:

    element고정된 기준 URLdocument대체 기준 URL로 설정하고 반환한다.

  4. element고정된 기준 URLurlRecord로 설정한다.

  5. document가 주어졌을 때 기준 URL 변경에 응답한다.

href IDL 속성은 가져올 때 다음 알고리즘을 실행한 결과를 반환해야 한다:

  1. documentelement노드 문서로 둔다.

  2. url을 이 요소에 href 속성이 있으면 그 속성 값으로 두고, 그렇지 않으면 빈 문자열로 둔다.

  3. urlRecorddocument대체 기준 URLdocument문자 인코딩을 사용하여 url구문 분석한 결과로 둔다. (따라서 base 요소는 다른 base 요소나 자기 자신의 영향을 받지 않는다.)

  4. urlRecord가 실패이면 url을 반환한다.

  5. urlRecord직렬화를 반환한다.

이 예에서는 base 요소를 사용하여 문서 기준 URL을 설정한다:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>This is an example for the &lt;base&gt; element</title>
        <base href="https://www.example.com/news/index.html">
    </head>
    <body>
        <p>Visit the <a href="archives.html">archives</a>.</p>
    </body>
</html>

위 예의 링크는 "https://www.example.com/news/archives.html"로 연결된다.

Element/link

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLLinkElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLLinkElement/rel

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLLinkElement/relList

현재의 모든 엔진에서 지원된다.

Firefox30+Safari9+Chrome50+
Opera?Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
메타데이터 콘텐츠.
요소가 본문에서 허용되는 경우: 플로 콘텐츠.
요소가 본문에서 허용되는 경우: 구문 콘텐츠.
이 요소를 사용할 수 있는 맥락:
메타데이터 콘텐츠가 예상되는 곳.
head 요소의 자식인 noscript 요소 내부.
요소가 본문에서 허용되는 경우: 구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
href하이퍼링크의 주소
crossorigin — 요소가 교차 출처 요청을 처리하는 방식
rel하이퍼링크를 포함하는 문서와 대상 리소스 간의 관계
media — 적용 대상 미디어
integrity하위 리소스 무결성 검사에 사용되는 무결성 메타데이터 [SRI]
hreflang — 링크된 리소스의 언어
type — 참조된 리소스 유형에 대한 힌트
referrerpolicy — 요소가 시작한 가져오기리퍼러 정책
sizes — 아이콘 크기 (rel="icon"인 경우)
imagesrcset — 고해상도 디스플레이, 소형 모니터 등 다양한 상황에서 사용할 이미지(rel="preload"인 경우)
imagesizes — 다양한 페이지 레이아웃에 대한 이미지 크기(rel="preload"인 경우)
as — 미리 로드 요청의 대상 (rel="preload" 및 rel="modulepreload"인 경우)
blocking — 요소가 잠재적으로 렌더링을 차단하는지 여부
color — 사이트 아이콘을 사용자 정의할 때 사용할 색상(rel="mask-icon"인 경우)
disabled — 링크가 비활성화되어 있는지 여부
fetchpriority — 요소가 시작한 가져오기우선순위 설정
또한 title 속성은 이 요소에서 특별한 의미 체계를 가진다: 링크의 제목; CSS 스타일시트 집합 이름
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLLinkElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectURL] attribute USVString href;
  [CEReactions] attribute DOMString? crossOrigin;
  [CEReactions, Reflect] attribute DOMString rel;
  [CEReactions] attribute DOMString as;
  [SameObject, PutForwards=value, Reflect="rel"] readonly attribute DOMTokenList relList;
  [CEReactions, Reflect] attribute DOMString media;
  [CEReactions, Reflect] attribute DOMString integrity;
  [CEReactions, Reflect] attribute DOMString hreflang;
  [CEReactions, Reflect] attribute DOMString type;
  [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList sizes;
  [CEReactions, Reflect] attribute USVString imageSrcset;
  [CEReactions, Reflect] attribute DOMString imageSizes;
  [CEReactions] attribute DOMString referrerPolicy;
  [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList blocking;
  [CEReactions, Reflect] attribute boolean disabled;
  [CEReactions] attribute DOMString fetchPriority;

  // also has obsolete members
};
HTMLLinkElement includes LinkStyle;

link 요소를 사용하면 작성자는 문서를 다른 리소스에 연결할 수 있다.

링크의 주소는 href 속성으로 제공된다. href 속성이 있으면 그 값은 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL이어야 한다. href 또는 imagesrcset 속성 중 하나 이상이 있어야 한다.

hrefimagesrcset 속성이 모두 없으면 요소는 링크를 정의하지 않는다.

표시되는 링크 유형(관계)은 rel 속성의 값으로 제공되며, 이 속성이 있으면 그 값은 고유한 공백 구분 토큰의 순서 없는 집합이어야 한다. 허용되는 키워드와 그 의미는 뒤의 절에서 정의한다. rel 속성이 없거나, 키워드가 없거나, 사용한 키워드 중 이 명세의 정의에 따라 허용되는 것이 하나도 없으면 요소는 어떠한 링크도 생성하지 않는다.

rel지원되는 토큰link 요소에서 허용되고, 처리 모델에 영향을 주며, 사용자 에이전트가 지원하는 HTML 링크 유형에 정의된 키워드이다. 가능한 지원되는 토큰alternate, dns-prefetch, expect, icon, manifest, modulepreload, next, pingback, preconnect, prefetch, preload, searchstylesheet이다. rel지원되는 토큰에는 사용자 에이전트가 처리 모델을 구현한 이 목록의 토큰만 포함되어야 한다.

이론적으로 사용자 에이전트가 JavaScript를 실행하는 검색 엔진이라면 canonical 키워드의 처리 모델을 지원할 수 있다. 하지만 실제로는 가능성이 매우 낮다. 따라서 대부분의 경우 canonicalrel지원되는 토큰에 포함하지 않는 것이 좋다.

link 요소에는 rel 속성 또는 itemprop 속성 중 하나가 있어야 하지만 둘 다 있어서는 안 된다.

link 요소에 itemprop 속성이 있거나, rel 속성에 body-ok인 키워드만 포함되어 있으면 요소를 본문에서 허용된다고 한다. 이는 구문 콘텐츠가 예상되는 곳에서 요소를 사용할 수 있음을 의미한다.

rel 속성을 사용하면 요소를 페이지의 body에서 사용할 수 있는 경우가 제한된다. itemprop 속성과 함께 사용하면 마이크로데이터 모델의 제약에 따라 요소를 head 요소와 페이지의 body 모두에서 사용할 수 있다.


link 요소를 사용하여 두 범주의 링크를 생성할 수 있다: 외부 리소스 링크하이퍼링크. 링크 유형 절에서는 특정 링크 유형이 외부 리소스인지 하이퍼링크인지 정의한다. 하나의 link 요소는 여러 링크를 생성할 수 있으며, 그중 일부는 외부 리소스 링크이고 일부는 하이퍼링크일 수 있다. 정확히 어떤 링크가 몇 개 생성되는지는 rel 속성에 지정된 키워드에 따라 달라진다. 사용자 에이전트는 요소별이 아니라 링크별로 링크를 처리해야 한다.

link 요소에 대해 생성된 각 링크는 별도로 처리된다. 예를 들어 rel="stylesheet"link 요소가 두 개 있으면 각각 별도의 외부 리소스로 간주되며, 각 요소는 자체 속성의 영향을 독립적으로 받는다. 마찬가지로 하나의 link 요소의 rel 속성 값이 next stylesheet이면 next 키워드에 대한 하이퍼링크stylesheet 키워드에 대한 외부 리소스 링크를 모두 생성하며, 이들은 mediatitle과 같은 다른 속성의 영향을 서로 다르게 받는다.

예를 들어 다음 link 요소는 동일한 페이지로 연결되는 두 개의 하이퍼링크를 생성한다:

<link rel="author license" href="/about">

이 요소가 생성하는 두 링크 중 하나는 대상 페이지에 현재 페이지 작성자에 대한 정보가 있다는 의미이고, 다른 하나는 대상 페이지에 현재 페이지가 제공되는 라이선스에 관한 정보가 있다는 의미이다.

link 요소와 그 rel 속성으로 생성한 하이퍼링크는 문서 전체에 적용된다. 이는 문서 내 링크 위치가 제공하는 맥락을 가진 링크의 유형을 나타내는 aarea 요소의 rel 속성과 대조된다.

aarea 요소로 생성한 링크와 달리, link 요소가 생성한 하이퍼링크제안된 기본 렌더링을 지원하는 사용자 에이전트에서 기본적으로 문서의 일부로 표시되지 않는다. CSS로 강제로 표시하더라도 활성화 동작이 없다. 대신 페이지 또는 페이지의 콘텐츠를 소비하는 다른 소프트웨어에서 사용할 수 있는 의미 정보를 주로 제공한다. 또한 사용자 에이전트는 이러한 하이퍼링크를 따라가기 위한 자체 UI를 제공할 수 있다.

외부 리소스 링크의 정확한 동작은 관련 링크 유형에 정의된 정확한 관계에 따라 달라진다.


crossorigin 속성은 CORS 설정 속성이다. 이는 외부 리소스 링크와 함께 사용하기 위한 것이다.

media 속성은 리소스가 적용되는 미디어를 나타낸다. 값은 유효한 미디어 쿼리 목록이어야 한다.

Subresource_Integrity

현재의 모든 엔진에서 지원된다.

Firefox43+Safari11.1+Chrome45+
Opera?Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

integrity 속성은 이 요소가 담당하는 요청에 대한 무결성 메타데이터를 나타낸다. 값은 텍스트이다. 이 속성은 rel 속성에 stylesheet, preload 또는 modulepreload 키워드를 포함하는 link 요소에만 지정해야 한다. [SRI]

link 요소의 hreflang 속성은 a 요소의 hreflang 속성과 동일한 의미 체계를 가진다.

type 속성은 링크된 리소스의 MIME 유형을 제공한다. 이는 순전히 참고용이다. 값은 유효한 MIME 유형 문자열이어야 한다.

외부 리소스 링크의 경우 type 속성은 사용자 에이전트가 지원하지 않는 리소스를 가져오는 것을 피할 수 있도록 힌트로 사용된다.

referrerpolicy 속성은 리퍼러 정책 속성이다. 이는 외부 리소스 링크와 함께 사용하기 위한 것이며, 링크된 리소스를 가져오고 처리할 때 사용하는 리퍼러 정책을 설정하는 데 도움이 된다. [REFERRERPOLICY]

title 속성은 링크의 제목을 제공한다. 한 가지 예외를 제외하면 순전히 참고용이다. 값은 텍스트이다. 예외는 문서 트리 안에 있는 스타일시트 링크이며, 이 경우 title 속성은 CSS 스타일시트 집합을 정의한다.

link 요소의 title 속성은 제목이 없는 링크가 부모 요소의 제목을 상속하지 않고 단순히 제목이 없다는 점에서 대부분의 다른 요소의 전역 title 속성과 다르다.


imagesrcset 속성을 지정할 수 있으며, 이는 srcset 속성이다.

imagesrcsethref 속성은 (너비 설명자를 사용하지 않는 경우) 함께 소스 집합이미지 소스를 제공한다.

imagesrcset 속성이 있고 너비 설명자를 사용하는 이미지 후보 문자열이 하나라도 있으면 imagesizes 속성도 있어야 하며, 이는 sizes 속성이다. imagesizes 속성은 소스 집합소스 크기를 제공한다.

imagesrcsetimagesizes 속성은 rel 속성이 preload 키워드를 지정하고, as 속성이 "image" 상태인 link 요소에만 지정해야 한다.

이러한 속성을 사용하면 나중에 srcsetsizes 속성에 대응하는 값을 가진 img 요소에서 사용할 적절한 리소스를 미리 로드할 수 있다:

<link rel="preload" as="image"
      imagesrcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w"
      imagesizes="50vw">

<!-- ... later, or perhaps inserted dynamically ... -->
<img src="wolf.jpg" alt="A rad wolf"
     srcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w"
     sizes="50vw">

href 속성은 imagesrcset을 지원하지 않는 브라우저에만 관련이 있고, 그러한 경우 잘못된 이미지가 미리 로드될 가능성이 높으므로 생략한 점에 유의한다.

imagesrcset 속성을 media 속성과 함께 사용하면 아트 디렉션을 위해 picture 요소의 소스에서 선택된 적절한 리소스를 미리 로드할 수 있다:

<link rel="preload" as="image"
      imagesrcset="dog-cropped-1x.jpg, dog-cropped-2x.jpg 2x"
      media="(max-width: 800px)">
<link rel="preload" as="image"
      imagesrcset="dog-wide-1x.jpg, dog-wide-2x.jpg 2x"
      media="(min-width: 801px)">

<!-- ... later, or perhaps inserted dynamically ... -->
<picture>
  <source srcset="dog-cropped-1x.jpg, dog-cropped-2x.jpg 2x"
          media="(max-width: 800px)">
  <img src="dog-wide-1x.jpg" srcset="dog-wide-2x.jpg 2x"
       alt="An awesome dog">
</picture>

sizes 속성은 시각 매체용 아이콘의 크기를 제공한다. 값이 있더라도 이는 참고용일 뿐이다. 여러 아이콘을 사용할 수 있는 경우 사용자 에이전트는 이 값을 사용하여 사용할 아이콘을 결정할 수 있다. 속성을 지정하면 값은 고유한 공백 구분 토큰의 순서 없는 집합이어야 하며, 토큰은 ASCII 대소문자를 구분하지 않는다. 각 값은 문자열 "any"와 ASCII 대소문자를 구분하지 않고 일치하거나, 선행 U+0030 DIGIT ZERO(0) 문자가 없고 단일 U+0078 LATIN SMALL LETTER X 또는 U+0058 LATIN CAPITAL LETTER X 문자로 구분된 두 개의 유효한 음이 아닌 정수로 구성된 값이어야 한다. 이 속성은 rel 속성이 icon 키워드 또는 apple-touch-icon 키워드를 지정하는 link 요소에만 지정해야 한다.

apple-touch-icon 키워드는 미리 정의된 링크 유형 집합의 확장으로 등록되어 있지만, 사용자 에이전트가 어떠한 방식으로든 이를 지원해야 하는 것은 아니다.


as 속성은 href 속성이 제공하는 리소스의 미리 로드 요청에 대한 미리 로드 대상 또는 모듈 미리 로드 대상을 지정한다. 이는 열거형 속성이다. 미리 로드 대상모듈 미리 로드 대상의 합집합에 속하는 각 항목은 이 속성의 키워드이며, 같은 이름의 상태에 매핑된다. 이 속성은 rel 속성에 preload 키워드를 포함하는 link 요소에 지정해야 하며, 이 경우 값은 미리 로드 대상이어야 한다. rel 속성에 modulepreload 키워드를 포함하는 link 요소에도 지정할 수 있으며, 이 경우 값은 모듈 미리 로드 대상이어야 한다. 그 밖의 link 요소에는 지정해서는 안 된다.

as 속성의 사용 방식에 대한 처리 모델은 개별 링크 유형의 링크된 리소스를 가져오고 처리 알고리즘에 제시되어 있다.

이 속성에는 누락 값 기본값 또는 유효하지 않은 값 기본값이 없다. 즉 유효하지 않거나 누락된 값은 어떠한 상태에도 매핑되지 않는다. 이는 처리 모델에서 고려한다. preload 링크에서는 두 조건 모두 오류이며, modulepreload 링크에서는 누락된 값을 "script"로 처리한다.


blocking 속성은 차단 속성이다. 이는 stylesheetexpect 링크 유형에서 사용되며, 해당 키워드를 포함하는 rel 속성이 있는 link 요소에만 지정해야 한다.


color 속성은 mask-icon 링크 유형과 함께 사용된다. 이 속성은 rel 속성에 mask-icon 키워드를 포함하는 link 요소에만 지정해야 한다. 값은 CSS <color> 생성 규칙과 일치하는 문자열이어야 하며, 사용자가 사이트를 고정할 때 표시되는 아이콘을 사용자 에이전트가 사용자 정의하는 데 사용할 수 있는 권장 색상을 정의한다.

이 명세에는 color 속성에 대한 사용자 에이전트 요구 사항이 없다.

mask-icon 키워드는 미리 정의된 링크 유형 집합의 확장으로 등록되어 있지만, 사용자 에이전트가 어떠한 방식으로든 이를 지원해야 하는 것은 아니다.


link 요소에는 연관된 명시적으로 활성화됨 불리언이 있다. 초기값은 false이다.

disabled 속성은 stylesheet 링크 유형과 함께 사용되는 불리언 속성이다. 이 속성은 rel 속성에 stylesheet 키워드를 포함하는 link 요소에만 지정해야 한다.

disabled 속성이 제거될 때마다 link 요소의 명시적으로 활성화됨을 true로 설정한다.

예를 들어 document.querySelector("link").removeAttribute("disabled")를 사용하여 disabled 속성을 동적으로 제거하면 스타일시트를 가져와 적용한다:

<link disabled rel="alternate stylesheet" href="css/pooh">

HTMLLinkElement/fetchPriority

Firefox아니요Safari🔰 preview+Chrome102+
Opera?Edge102+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

fetchpriority 속성은 가져오기 우선순위 속성이며, 외부 리소스 링크와 함께 사용하기 위한 것이다. 이는 링크된 리소스를 가져오고 처리할 때 사용하는 우선순위를 설정하는 데 사용된다.


color 속성을 반영하는 IDL 속성은 없지만 나중에 추가될 수 있다.

HTMLLinkElement/as

현재의 모든 엔진에서 지원된다.

Firefox56+Safari10+Chrome50+
Opera?Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

as IDL 속성은 as 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

crossOrigin IDL 속성은 crossorigin 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

HTMLLinkElement/referrerPolicy

현재의 모든 엔진에서 지원된다.

Firefox50+Safari14.1+Chrome58+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

referrerPolicy IDL 속성은 referrerpolicy 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

fetchPriority IDL 속성은 fetchpriority 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

relList 속성의 supports() 메서드를 호출하여 어떤 링크 유형이 지원되는지 확인함으로써 기능 감지에 사용할 수 있다.

4.2.4.1 media 속성 처리

링크가 하이퍼링크이면 media 속성은 순전히 참고용이며, 해당 문서가 어떤 미디어를 위해 설계되었는지를 설명한다.

하지만 링크가 외부 리소스 링크이면 media 속성은 규범적이다. 사용자 에이전트는 media 속성의 값이 환경과 일치하고 다른 관련 조건이 적용될 때 외부 리소스를 적용해야 하며, 그렇지 않으면 적용해서는 안 된다.

media 속성을 생략한 경우 기본값은 "all"이며, 이는 기본적으로 링크가 모든 미디어에 적용됨을 의미한다.

외부 리소스에는 적용 가능성을 제한하는 추가 제약이 내부에 정의되어 있을 수 있다. 예를 들어 CSS 스타일시트에는 일부 @media 블록이 있을 수 있다. 이 명세는 그러한 추가 제약이나 요구 사항을 재정의하지 않는다.

4.2.4.2 type 속성 처리

type 속성이 있으면 사용자 에이전트는 리소스가 지정된 유형이라고 가정해야 한다 (지정된 값이 유효한 MIME 유형 문자열이 아니더라도 마찬가지이며, 예를 들어 빈 문자열일 수도 있다). 속성을 생략했지만 외부 리소스 링크 유형에 기본 유형이 정의되어 있으면 사용자 에이전트는 리소스가 해당 유형이라고 가정해야 한다. 사용자 에이전트가 주어진 링크 관계에 대해 지정된 MIME 유형을 지원하지 않으면 사용자 에이전트는 링크된 리소스를 가져오고 처리하지 않는 것이 좋다. 사용자 에이전트가 주어진 링크 관계에 대해 지정된 MIME 유형을 지원하면 해당 외부 리소스 링크의 특정 유형에 지정된 적절한 시점에 링크된 리소스를 가져오고 처리하는 것이 좋다. 속성을 생략했고 외부 리소스 링크 유형에 기본 유형이 정의되어 있지 않지만, 유형이 알려져 있고 지원된다면 사용자 에이전트가 링크된 리소스를 가져오고 처리할 경우, 사용자 에이전트는 해당 리소스가 지원될 것이라고 가정하여 링크된 리소스를 가져오고 처리하는 것이 좋다.

사용자 에이전트는 type 속성을 권위 있는 것으로 간주해서는 안 된다. 리소스를 가져온 뒤 사용자 에이전트는 실제 유형을 결정할 때 type 속성을 사용해서는 안 된다. 앞에서 언급한 가정된 유형이 아니라 실제 유형 (다음 문단에 정의됨)만 리소스를 적용할지 결정하는 데 사용된다.

stylesheet 링크 유형은 리소스의 Content-Type 메타데이터 처리 규칙을 정의한다.

사용자 에이전트가 리소스의 유형을 확정한 뒤에는 지원되는 유형이고 다른 관련 조건이 적용되면 리소스를 적용해야 하며, 그렇지 않으면 리소스를 무시해야 한다.

문서에 다음과 같이 표시된 스타일시트 링크가 포함되어 있다고 하자:

<link rel="stylesheet" href="A" type="text/plain">
<link rel="stylesheet" href="B" type="text/css">
<link rel="stylesheet" href="C">

그러면 CSS 스타일시트만 지원하는 적합한 사용자 에이전트는 B와 C 파일을 가져오고 A 파일은 건너뛴다(text/plain은 CSS 스타일시트의 MIME 유형이 아니기 때문이다).

그런 다음 B와 C 파일에 대해서는 서버가 반환한 실제 유형을 확인한다. text/css로 전송된 파일에는 스타일을 적용하지만, text/plain 또는 다른 유형으로 표시된 파일에는 적용하지 않는다.

두 파일 중 하나가 Content-Type 메타데이터 없이 반환되거나 Content-Type: "null"처럼 구문적으로 잘못된 유형과 함께 반환되면 stylesheet 링크의 기본 유형이 적용된다. 해당 기본 유형은 text/css이므로 스타일시트는 그럼에도 적용된다.

link 요소 el이 주어졌을 때 기본 링크된 리소스 가져오기 및 처리는 다음과 같다:

  1. optionsel에서 링크 옵션을 생성한 결과로 둔다.

  2. requestoptions가 주어졌을 때 링크 요청을 생성한 결과로 둔다.

  3. request가 null이면 반환한다.

  4. request동기 플래그를 설정한다.

  5. elrequest가 주어졌을 때 링크된 리소스 가져오기 설정 단계를 실행한다. 결과가 false이면 반환한다.

  6. elrel 속성에 stylesheet 키워드가 포함되어 있으면 request개시자 유형을 "css"로 설정하고, 그렇지 않으면 "link"로 설정한다.

  7. 응답 response와 null, 실패 또는 바이트 시퀀스 bodyBytes가 주어졌을 때 다음 단계로 processResponseConsumeBody를 설정하여 request가져온다:

    1. success를 true로 둔다.

    2. 다음 중 하나라도 참이면:

      • bodyBytes가 null 또는 실패인 경우; 또는

      • response상태정상 상태가 아닌 경우,

      success를 false로 설정한다.

      CSS 구문 분석 오류나 PNG 디코딩 오류 같은 콘텐츠별 오류는 success에 영향을 주지 않는다는 점에 유의한다.

    3. 그렇지 않으면 링크 리소스중요 하위 리소스가 로드를 마칠 때까지 기다린다.

      링크 유형의 중요 하위 리소스를 정의하는 명세(예: CSS)는 이러한 하위 리소스를 가져오고 처리하는 방법을 설명할 것으로 예상된다. 하지만 현재는 이것이 명시적이지 않으므로, 이 명세에서는 올바르게 수행될 것이라는 전제 아래 링크 리소스중요 하위 리소스를 가져오고 처리할 때까지 기다리는 것으로 설명한다.

    4. el, success, responsebodyBytes가 주어졌을 때 링크된 리소스를 처리한다.

링크 처리 옵션 options가 주어졌을 때 링크 요청을 생성하려면:

  1. 단언: optionshref는 빈 문자열이 아니다.

  2. urloptions기준 URL에 상대적인 optionshref가 주어졌을 때 URL을 인코딩 구문 분석한 결과로 둔다.

    문서 또는 환경 대신 기준 URL을 전달하는 문제는 이슈 #9715에서 추적한다.

  3. url이 실패이면 null을 반환한다.

  4. requesturl, options대상optionscrossorigin이 주어졌을 때 잠재적 CORS 요청을 생성한 결과로 둔다.

  5. request정책 컨테이너options정책 컨테이너로 설정한다.

  6. request무결성 메타데이터options무결성으로 설정한다.

  7. request암호학적 논스 메타데이터options암호학적 논스 메타데이터로 설정한다.

  8. request리퍼러 정책options리퍼러 정책으로 설정한다.

  9. request클라이언트options환경으로 설정한다.

  10. request우선순위options가져오기 우선순위로 설정한다.

  11. request를 반환한다.

사용자 에이전트는 적용되지 않은 모든 외부 리소스를 사전에 가져오는 대신 필요한 경우에만 그러한 리소스를 가져오고 처리하도록 선택할 수 있다.

링크된 리소스 가져오기 및 처리 알고리즘과 마찬가지로 모든 외부 리소스 링크에는 link 요소 el, 불리언 success, 응답 response바이트 시퀀스 bodyBytes를 받는 링크된 리소스 처리 알고리즘이 있다. 개별 링크 유형은 자체 링크된 리소스 처리 알고리즘을 제공할 수 있지만, 명시적으로 달리 기술하지 않으면 해당 알고리즘은 아무 작업도 하지 않는다.

주어진 rel 키워드에 대해 달리 지정하지 않는 한, 요소는 링크된 리소스를 가져오고 처리하려는 모든 시도와 그 중요 하위 리소스의 처리가 완료될 때까지 요소의 노드 문서load 이벤트를 지연해야 한다. (예를 들어 리소스가 필요해질 때까지 기다리고 있어서 사용자 에이전트가 아직 가져오고 처리하려고 시도하지 않은 리소스는 load 이벤트를 지연하지 않는다.)

외부 리소스 링크가 될 수 있는 모든 링크 유형은 링크 처리 옵션을 받는 링크 헤더 처리 알고리즘을 정의한다. 이 알고리즘은 HTTP `Link` 응답 헤더에 나타날 때 링크 유형이 반응하는지 여부와 그 방법을 정의한다.

대부분의 링크 유형에서 이 알고리즘은 아무 작업도 하지 않는다. 링크 유형에 링크 헤더 처리 단계가 정의되어 있는지 빠르게 확인하려면 요약 표가 유용하다.

링크 처리 옵션구조체이다. 다음 항목을 가진다:

href (기본값은 빈 문자열)
initiator (기본값은 "link")
integrity (기본값은 빈 문자열)
type (기본값은 빈 문자열)
암호학적 논스 메타데이터 (기본값은 빈 문자열)
문자열
대상 (기본값은 빈 문자열)
대상 유형.
crossorigin (기본값은 CORS 없음)
CORS 설정 속성 상태
리퍼러 정책 (기본값은 빈 문자열)
리퍼러 정책
소스 집합 (기본값은 null)
Null 또는 소스 집합
기준 URL
URL
출처
출처
환경
환경
정책 컨테이너
정책 컨테이너
문서 (기본값은 null)
Null 또는 Document
문서 준비 시 실행 (기본값은 null)
Null 또는 Document를 받는 알고리즘
가져오기 우선순위 (기본값은 자동)
가져오기 우선순위 속성 상태

링크 처리 옵션이 구문 분석된 URL 대신 기준 URLhref를 가지는 이유는 URL이 옵션의 소스 집합에서 나온 결과일 수 있기 때문이다.

link 요소 el이 주어졌을 때 요소에서 링크 옵션을 생성하려면:

  1. documentel노드 문서로 둔다.

  2. options를 다음 항목을 가진 새로운 링크 처리 옵션으로 둔다.

    crossorigin
    elcrossorigin 콘텐츠 속성의 상태
    리퍼러 정책
    elreferrerpolicy 콘텐츠 속성의 상태
    소스 집합
    el소스 집합
    기준 URL
    document문서 기준 URL
    출처
    document출처
    환경
    document관련 설정 객체
    정책 컨테이너
    document정책 컨테이너
    문서
    document
    암호학적 논스 메타데이터
    el[[CryptographicNonce]] 내부 슬롯의 현재 값
    가져오기 우선순위
    elfetchpriority 콘텐츠 속성의 상태
  3. elhref 속성이 있으면 optionshrefelhref 속성 값으로 설정한다.

  4. elintegrity 속성이 있으면 optionsintegrityelintegrity 콘텐츠 속성 값으로 설정한다.

  5. eltype 속성이 있으면 optionstypeeltype 속성 값으로 설정한다.

  6. 단언: optionshref가 빈 문자열이 아니거나 options소스 집합이 null이 아니다.

    link 요소에 hrefimagesrcset 속성이 모두 없으면 링크를 나타내지 않는다.

  7. options를 반환한다.

헤더 목록 headers가 주어졌을 때 헤더에서 링크를 추출하려면:

  1. links를 새로운 목록으로 둔다.

  2. rawLinkHeadersheaders에서 `Link`를 가져오고, 디코딩하고, 분할한 결과로 둔다.

  3. rawLinkHeaders의 각 linkHeader에 대해 반복한다:

    1. linkObjectlinkHeader구문 분석한 결과로 둔다. [WEBLINK]

    2. linkObject["target_uri"]가 존재하지 않으면 계속한다.

    3. linkObjectlinks추가한다.

  4. links를 반환한다.

Document doc, 응답 response 및 "pre-media" 또는 "media" phase가 주어졌을 때 링크 헤더를 처리하려면:

  1. linksresponse헤더 목록에서 링크를 추출한 결과로 둔다.

  2. links의 각 linkObject에 대해 반복한다:

    1. rellinkObject["relation_type"]으로 둔다.

    2. attribslinkObject["target_attributes"]로 둔다.

    3. "srcset", "imagesrcset" 또는 "media" 중 하나가 attribs존재하면 expectedPhase를 "media"로 두고, 그렇지 않으면 "pre-media"로 둔다.

    4. expectedPhasephase가 아니면 계속한다.

    5. attribs["media"]가 존재하고 attribs["media"]가 환경과 일치하지 않으면 계속한다.

    6. options를 다음 항목을 가진 새로운 링크 처리 옵션으로 둔다.

      href
      linkObject["target_uri"]
      기준 URL
      doc문서 기준 URL
      출처
      doc출처
      환경
      doc관련 설정 객체
      정책 컨테이너
      doc정책 컨테이너
      문서
      doc
    7. attribsrel이 주어졌을 때 options구문 분석된 헤더 속성의 링크 옵션을 적용한다. 반환값이 false이면 반환한다.

    8. attribs["imagesrcset"]가 존재하고 attribs["imagesizes"]가 존재하면 options소스 집합linkObject["target_uri"], attribs["imagesrcset"], attribs["imagesizes"] 및 null이 주어졌을 때 소스 집합을 생성한 결과로 설정한다.

    9. options가 주어졌을 때 rel에 대한 링크 헤더 처리 단계를 실행한다.

attribs와 문자열 rel이 주어졌을 때 링크 처리 옵션 options구문 분석된 헤더 속성의 링크 옵션을 적용하려면:

  1. rel이 "preload"이면:

    1. attribs["as"]가 존재하지 않으면 false를 반환한다.

    2. destinationattribs["as"]를 변환한 결과로 둔다.

    3. destination이 null이면 false를 반환한다.

    4. options대상destination으로 설정한다.

  2. attribs["crossorigin"]가 존재하고 CORS 설정 속성 키워드 중 하나와 ASCII 대소문자를 구분하지 않고 일치하면 optionscrossorigin을 해당 키워드에 대응하는 CORS 설정 속성 상태로 설정한다.

  3. attribs["integrity"]가 존재하면 optionsintegrityattribs["integrity"]로 설정한다.

  4. attribs["referrerpolicy"]가 존재하고 어떤 리퍼러 정책ASCII 대소문자를 구분하지 않고 일치하면 options리퍼러 정책을 해당 리퍼러 정책으로 설정한다.

  5. attribs["nonce"]가 존재하면 optionsnonceattribs["nonce"]로 설정한다.

  6. attribs["type"]이 존재하면 optionstypeattribs["type"]으로 설정한다.

  7. attribs["fetchpriority"]가 존재하고 가져오기 우선순위 속성 키워드와 ASCII 대소문자를 구분하지 않고 일치하면 options가져오기 우선순위를 해당 가져오기 우선순위 속성 키워드로 설정한다.

  8. true를 반환한다.

4.2.4.5 조기 힌트

Status/103

Firefoxpreview+Safari아니요Chrome103+
Opera아니요Edge103+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

조기 힌트를 사용하면 서버가 내비게이션 요청을 완전히 처리하여 응답 코드를 제공하기 전에 사용자 에이전트가 문서에서 사용될 가능성이 있는 리소스를 추측하여 로드하는 등의 작업을 수행할 수 있다. 서버는 최종 응답을 제공하기 전에 103 상태 코드의 응답을 제공하여 조기 힌트를 표시할 수 있다.[RFC8297]

호환성을 위해 조기 힌트는 일반적으로 HTTP/2 이상을 통해 전달되지만, 가독성을 위해 아래에서는 HTTP/1.1 스타일 표기법을 사용한다.

예를 들어 다음과 같은 응답 시퀀스가 주어지면:

103 Early Hint
Link: </image.png>; rel=preload; as=image
200 OK
Content-Type: text/html

<!DOCTYPE html>
...
<img src="/image.png">

HTML 콘텐츠가 도착하기 전에 이미지 로드가 시작된다.

내비게이션 중 제공되는 첫 번째 조기 힌트 응답만 처리하며, 그 뒤에 교차 출처 리디렉션이 이어지면 이를 폐기한다.

`Link` 헤더 외에도 103 응답에는 콘텐츠 보안 정책 헤더가 포함될 수 있으며, 조기 힌트를 처리할 때 이 정책을 적용한다.

예를 들어 다음과 같은 응답 시퀀스가 주어지면:

103 Early Hint
Content-Security-Policy: style-src: self;
Link: </style.css>; rel=preload; as=style
103 Early Hint
Link: </image.png>; rel=preload; as=image
302 Redirect
Location: /alternate.html
200 OK
Content-Security-Policy: style-src: none;
Link: </font.ttf>; rel=preload; as=font

최종 리디렉션 체인에서 첫 번째 조기 힌트 응답만 따르므로 글꼴과 스타일은 로드되고 이미지는 폐기된다. 뒤의 콘텐츠 보안 정책 헤더는 스타일을 가져오기 위한 요청이 이미 수행된 뒤에 오지만, 해당 스타일은 문서에서 접근할 수 없다.

응답 response환경 reservedEnvironment가 주어졌을 때 조기 힌트 헤더를 처리하려면:

조기 힌트의 `Link` 헤더는 항상 최종 응답의 `Link` 헤더보다 먼저 처리되며, 그 뒤에 link 요소를 처리한다. 이는 조기 힌트와 최종 응답의 `Link` 헤더 콘텐츠를 각각의 순서대로 Documenthead 요소 앞에 추가하는 것과 동등하다.

  1. earlyPolicyContainerresponsereservedEnvironment가 주어졌을 때 가져오기 응답에서 정책 컨테이너를 생성한 결과로 둔다.

    이를 통해 조기 힌트 응답에 조기 힌트 요청을 가져올 때 적용되는 콘텐츠 보안 정책을 포함할 수 있다.

  2. linksresponse헤더 목록에서 링크를 추출한 결과로 둔다.

  3. earlyHints를 빈 목록으로 둔다.

  4. links의 각 linkObject에 대해 반복한다:

    조기 힌트 링크 헤더를 받는 순간 earlyRequest가져오기 시작한다. Document가 생성되기 전에 결과가 반환되면 earlyResponse를 해당 가져오기응답으로 설정하고, Document가 생성되면 이를 커밋한다 (link 요소인 것처럼 미리 로드된 리소스의 맵에서 사용할 수 있게 한다). Document가 먼저 생성되면 응답을 사용할 수 있게 되는 즉시 커밋한다.

    1. rellinkObject["relation_type"]으로 둔다.

    2. options를 다음 항목을 가진 새로운 링크 처리 옵션으로 둔다.

      href
      linkObject["target_uri"]
      개시자
      "early-hint"
      기준 URL
      responseURL
      출처
      responseURL출처
      환경
      reservedEnvironment
      정책 컨테이너
      earlyPolicyContainer
    3. attribslinkObject["target_attributes"]로 둔다.

      조기 힌트 처리의 일부로는 as, crossorigin, integritytype 속성만 처리한다. 특히 blocking, imagesrcset, imagesizesmedia 같은 다른 속성은 Document가 생성된 뒤에만 적용된다.

    4. attribsrel이 주어졌을 때 options구문 분석된 헤더 속성의 링크 옵션을 적용한다. 반환값이 false이면 반환한다.

    5. options가 주어졌을 때 rel에 대한 링크 헤더 처리 단계를 실행한다.

    6. optionsearlyHints추가한다.

  5. Document doc가 주어졌을 때 다음 하위 단계를 반환한다: earlyHints의 각 options에 대해 반복한다:

    1. options문서 준비 시 실행이 null이면 options문서doc로 설정한다.

    2. 그렇지 않으면 doc를 사용하여 options문서 준비 시 실행을 호출한다.

대화형 사용자 에이전트는 사용자 인터페이스의 어딘가에서 사용자가 link 요소를 사용하여 생성된 하이퍼링크를 따라갈 수 있는 수단을 제공할 수 있다. 이러한 하이퍼링크 따라가기 알고리즘 호출은 userInvolvement 인수를 "browser UI"로 설정해야 한다. 정확한 인터페이스는 이 명세에서 정의하지 않지만, 문서의 각 link 요소로 생성된 각 하이퍼링크에 대해 다음 정보를 어떠한 형태로든(단순화될 수도 있음) 포함할 수 있다 (다시 말해 아래에 정의된 대로 요소의 속성에서 가져온다):

사용자 에이전트는 리소스의 유형(type 속성으로 제공됨)과 같은 다른 정보도 포함할 수 있다.

4.2.5 meta 요소

Element/meta

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLMetaElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
메타데이터 콘텐츠.
itemprop 속성이 있는 경우: 플로 콘텐츠.
itemprop 속성이 있는 경우: 구문 콘텐츠.
이 요소를 사용할 수 있는 맥락:
charset 속성이 있거나 요소의 http-equiv 속성이 인코딩 선언 상태인 경우: head 요소 내부.
http-equiv 속성이 있지만 인코딩 선언 상태가 아닌 경우: head 요소 내부.
http-equiv 속성이 있지만 인코딩 선언 상태가 아닌 경우: head 요소의 자식인 noscript 요소 내부.
name 속성이 있는 경우: 메타데이터 콘텐츠가 예상되는 곳.
itemprop 속성이 있는 경우: 메타데이터 콘텐츠가 예상되는 곳.
itemprop 속성이 있는 경우: 구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
name — 메타데이터 이름
http-equiv — 프래그마 지시문
content — 요소의 값
charset문자 인코딩 선언
media — 적용 대상 미디어
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLMetaElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute DOMString name;
  [CEReactions, Reflect="http-equiv"] attribute DOMString httpEquiv;
  [CEReactions, Reflect] attribute DOMString content;
  [CEReactions, Reflect] attribute DOMString media;

  // also has obsolete members
};

meta 요소는 title, base, link, stylescript 요소를 사용하여 표현할 수 없는 다양한 종류의 메타데이터를 나타낸다.

meta 요소는 name 속성을 사용하여 문서 수준 메타데이터를, http-equiv 속성을 사용하여 프래그마 지시문을, HTML 문서를 문자열 형태로 직렬화할 때 (예: 네트워크를 통한 전송이나 디스크 저장) charset 속성을 사용하여 파일의 문자 인코딩 선언을 나타낼 수 있다.

name, http-equiv, charsetitemprop 속성 중 정확히 하나를 지정해야 한다.

name, http-equiv 또는 itemprop 중 하나를 지정하면 content 속성도 지정해야 한다. 그렇지 않으면 생략해야 한다.

charset 속성은 문서에서 사용하는 문자 인코딩을 지정한다. 이는 문자 인코딩 선언이다. 속성이 있으면 그 값은 문자열 "utf-8"과 ASCII 대소문자를 구분하지 않고 일치해야 한다.

meta 요소의 charset 속성은 XML 문서에서는 아무런 효과가 없지만, XML로의 마이그레이션과 XML에서의 마이그레이션을 쉽게 하기 위해 XML 문서에서도 허용된다.

문서당 charset 속성을 가진 meta 요소는 하나를 초과해서는 안 된다.

content 속성은 요소가 문서 메타데이터나 프래그마 지시문에 사용될 때 그 값을 제공한다. 허용되는 값은 이 명세의 뒤 절에서 설명하는 정확한 맥락에 따라 달라진다.

meta 요소에 name 속성이 있으면 문서 메타데이터를 설정한다. 문서 메타데이터는 이름-값 쌍으로 표현되며, meta 요소의 name 속성이 이름을 제공하고 같은 요소의 content 속성이 값을 제공한다. 이름은 설정하는 메타데이터의 측면을 지정하며, 유효한 이름과 그 값의 의미는 다음 절에서 설명한다. meta 요소에 content 속성이 없으면 메타데이터 이름-값 쌍의 값 부분은 빈 문자열이다.

media 속성은 메타데이터가 적용되는 미디어를 나타낸다. 값은 유효한 미디어 쿼리 목록이어야 한다. nametheme-color가 아닌 한 media 속성은 처리 모델에 아무런 영향을 주지 않으며 작성자가 사용해서는 안 된다.

4.2.5.1 표준 메타데이터 이름

Element/meta/name

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

이 명세는 meta 요소의 name 속성에 사용할 몇 가지 이름을 정의한다.

이름은 대소문자를 구분하지 않는다. 따라서 ASCII 대소문자를 구분하지 않는 방식으로 비교해야 한다.

application-name

값은 페이지가 나타내는 웹 애플리케이션의 이름을 제공하는 짧은 자유 형식 문자열이어야 한다. 페이지가 웹 애플리케이션이 아니면 application-name 메타데이터 이름을 사용해서는 안 된다. 웹 애플리케이션 이름의 번역을 제공할 수 있으며, 각 이름의 언어는 lang 속성으로 지정한다.

문서당 주어진 언어를 가지며 name 속성 값이 application-nameASCII 대소문자를 구분하지 않고 일치하는 meta 요소는 하나를 초과해서는 안 된다.

페이지의 title에는 단순한 애플리케이션 이름 대신 특정 시점의 페이지 상태와 관련된 상태 메시지 등이 포함될 수 있으므로, 사용자 에이전트는 사용자 인터페이스에서 페이지의 제목보다 애플리케이션 이름을 우선하여 사용할 수 있다.

정렬된 언어 목록(예: 영국 영어, 미국 영어 및 영어)이 주어졌을 때 사용할 애플리케이션 이름을 찾으려면 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. languages를 언어 목록으로 둔다.

  2. default languageDocument문서 요소가 존재하고 그 언어를 알 수 없는 상태가 아니라면 해당 요소의 언어로 둔다.

  3. default language가 있고 languages의 어떤 언어와도 같은 언어가 아니면 이를 languages에 추가한다.

  4. winning languagelanguages의 언어 중 Documentname 속성 값이 application-nameASCII 대소문자를 구분하지 않고 일치하며 언어가 해당 언어인 meta 요소가 존재하는 첫 번째 언어로 둔다.

    어떤 언어에도 그러한 meta 요소가 없으면 반환한다. 제공된 애플리케이션 이름이 없는 것이다.

  5. Document에서 name 속성 값이 application-nameASCII 대소문자를 구분하지 않고 일치하고 언어winning language트리 순서상 첫 번째 meta 요소의 content 속성 값을 반환한다.

이 알고리즘은 브라우저가 예를 들어 북마크에 레이블을 지정하기 위해 페이지의 이름이 필요할 때 사용한다. 알고리즘에 제공하는 언어는 사용자가 선호하는 언어이다.

author

값은 페이지 작성자 중 한 명의 이름을 제공하는 자유 형식 문자열이어야 한다.

description

값은 페이지를 설명하는 자유 형식 문자열이어야 한다. 값은 검색 엔진과 같은 페이지 디렉터리에서 사용하기에 적합해야 한다. 문서당 name 속성 값이 descriptionASCII 대소문자를 구분하지 않고 일치하는 meta 요소는 하나를 초과해서는 안 된다.

generator

값은 문서를 생성하는 데 사용된 소프트웨어 패키지 중 하나를 식별하는 자유 형식 문자열이어야 한다. 이 값은 마크업이 소프트웨어로 생성되지 않은 페이지, 예를 들어 사용자가 텍스트 편집기에서 직접 마크업을 작성한 페이지에는 사용해서는 안 된다.

"Frontweaver"라는 도구는 페이지를 생성하는 데 사용된 도구임을 식별하기 위해 출력의 페이지 head 요소에 다음을 포함할 수 있다:

<meta name=generator content="Frontweaver 8.2">
keywords

값은 쉼표로 구분된 토큰 집합이어야 하며, 각 토큰은 페이지와 관련된 키워드이다.

영국 고속도로의 서체에 관한 이 페이지는 사용자가 페이지를 찾을 때 사용할 수 있는 몇 가지 키워드를 지정하기 위해 meta 요소를 사용한다:

<!DOCTYPE HTML>
<html lang="en-GB">
 <head>
  <title>Typefaces on UK motorways</title>
  <meta name="keywords" content="british,type face,font,fonts,highway,highways">
 </head>
 <body>
  ...

많은 검색 엔진은 이러한 키워드를 고려하지 않는다. 이 기능은 역사적으로 사용자에게 도움이 되지 않는 방식으로 검색 엔진 결과를 스팸 처리하기 위해 신뢰할 수 없거나 오해를 일으키는 방식으로 사용되어 왔기 때문이다.

작성자가 페이지에 적용된다고 지정한 키워드 목록을 얻으려면 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. keywords를 빈 목록으로 둔다.

  2. name 속성과 content 속성이 있고, name 속성 값이 keywordsASCII 대소문자를 구분하지 않고 일치하는 각 meta 요소에 대해:

    1. 요소의 content 속성 값을 쉼표로 분할한다.

    2. 결과 토큰이 있으면 keywords에 추가한다.

  3. keywords에서 중복 항목을 제거한다.

  4. keywords를 반환한다. 이는 작성자가 페이지에 적용된다고 지정한 키워드 목록이다.

값의 신뢰성이 충분히 확실하지 않으면 사용자 에이전트는 이 정보를 사용하지 않는 것이 좋다.

예를 들어 콘텐츠 관리 시스템이 시스템 내 페이지의 키워드 정보를 사용하여 사이트 전용 검색 엔진의 색인을 채우는 것은 합리적일 수 있지만, 이 정보를 사용하는 대규모 콘텐츠 집계자는 특정 사용자가 부적절한 키워드를 사용하여 순위 메커니즘을 조작하려고 한다는 사실을 발견할 가능성이 높다.

referrer

값은 Document의 기본 리퍼러 정책을 정의하는 리퍼러 정책이어야 한다. [REFERRERPOLICY]

meta 요소 element문서에 삽입되거나 그 name 또는 content 속성이 변경될 때마다 사용자 에이전트는 다음 알고리즘을 실행해야 한다:

  1. element문서 트리 안에 있지 않으면 반환한다.

  2. element에 값이 "referrer"와 ASCII 대소문자를 구분하지 않고 일치하는 name 속성이 없으면 반환한다.

  3. elementcontent 속성이 없거나 해당 속성 값이 빈 문자열이면 반환한다.

  4. valueelementcontent 속성 값을 ASCII 소문자로 변환한 결과로 둔다.

  5. value가 다음 표의 첫 번째 열에 제시된 값 중 하나이면 value를 두 번째 열에 제시된 값으로 설정한다:

    레거시 값 리퍼러 정책
    never no-referrer
    default 기본 리퍼러 정책
    always unsafe-url
    origin-when-crossorigin origin-when-cross-origin
  6. value리퍼러 정책이면 element노드 문서정책 컨테이너리퍼러 정책policy로 설정한다.

역사적인 이유로 다른 표준 메타데이터 이름과 달리 referrer의 처리 모델은 요소 제거에 반응하지 않으며 트리 순서도 사용하지 않는다. 이 상태에서 가장 최근에 삽입되거나 가장 최근에 수정된 meta 요소만 영향을 준다.

theme-color

Element/meta/name/theme-color

Firefox아니요Safari15+Chrome🔰 73+
Opera아니요Edge🔰 79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android80+WebView Android아니요Samsung Internet6.2+Opera Android아니요

값은 CSS <color> 생성 규칙과 일치하는 문자열이어야 하며, 사용자 에이전트가 페이지나 주변 사용자 인터페이스의 표시를 사용자 정의할 때 사용해야 하는 권장 색상을 정의한다. 예를 들어 브라우저는 페이지의 제목 표시줄을 지정된 값으로 칠하거나 탭 표시줄 또는 작업 전환기에서 강조 색상으로 사용할 수 있다.

HTML 문서 내에서 name 속성 값이 theme-colorASCII 대소문자를 구분하지 않고 일치하는 모든 meta 요소에서 media 속성 값은 고유해야 한다.

이 표준 자체는 "WHATWG green"을 테마 색상으로 사용한다:

<!DOCTYPE HTML>
<title>HTML Standard</title>
<meta name="theme-color" content="#3c790a">
...

media 속성을 사용하여 제공된 색상을 사용해야 하는 맥락을 설명할 수 있다.

어두운 모드에서만 "WHATWG green"을 이 표준의 테마 색상으로 사용하려면 prefers-color-scheme 미디어 기능을 사용할 수 있다:

<!DOCTYPE HTML>
<title>HTML Standard</title>
<meta name="theme-color" content="#3c790a" media="(prefers-color-scheme: dark)">
...

페이지의 테마 색상을 얻으려면 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. candidate elements를 다음 기준을 충족하는 모든 meta 요소의 트리 순서 목록으로 둔다:

  2. candidate elements의 각 element에 대해:

    1. elementmedia 속성이 있고 elementmedia 속성 값이 환경과 일치하지 않으면 계속한다.

    2. valueelementcontent 속성 값에서 선행 및 후행 ASCII 공백을 제거한 결과로 둔다.

    3. colorvalue구문 분석한 결과로 둔다.

    4. color가 실패가 아니면 color를 반환한다.

  3. 아무것도 반환하지 않는다(페이지에 테마 색상이 없다).

meta 요소가 문서에 삽입되거나 문서에서 제거되거나, 기존 meta 요소의 name, content 또는 media 속성이 변경되거나, 환경이 변경되어 어떤 meta 요소의 media 속성 값이 이제 환경과 일치하거나 더 이상 일치하지 않을 수 있게 되면 사용자 에이전트는 위 알고리즘을 다시 실행하고 그 결과를 영향을 받는 모든 사용자 인터페이스에 적용해야 한다.

사용자 인터페이스에서 테마 색상을 사용할 때 사용자 에이전트는 해당 사용자 인터페이스에 더 적합하도록 구현별 방식으로 색상을 조정할 수 있다. 예를 들어 사용자 에이전트가 테마 색상을 배경으로 사용하고 그 위에 흰색 텍스트를 표시하려는 경우, 충분한 대비를 보장하기 위해 사용자 인터페이스의 해당 부분에서 테마 색상의 더 어두운 변형을 사용할 수 있다.

color-scheme

페이지의 모든 CSS가 로드될 때까지 기다리지 않고 사용자 에이전트가 원하는 색상 스킴으로 페이지 배경을 즉시 렌더링할 수 있도록 meta 요소에 'color-scheme' 값을 제공할 수 있다.

값은 CSS 'color-scheme' 속성 값의 구문과 일치하는 문자열이어야 한다. 이는 페이지에서 지원하는 색상 스킴을 결정한다.

문서당 name 속성 값이 color-schemeASCII 대소문자를 구분하지 않고 일치하는 meta 요소는 하나를 초과해서는 안 된다.

다음 선언은 페이지가 어두운 배경색과 밝은 전경색을 사용하는 색상 스킴을 인식하고 처리할 수 있음을 나타낸다:

<meta name="color-scheme" content="dark">

페이지에서 지원하는 색상 스킴을 얻으려면 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. candidate elements를 다음 기준을 충족하는 모든 meta 요소의 트리 순서 목록으로 둔다:

  2. candidate elements의 각 element에 대해:

    1. parsedelementcontent 속성 값이 주어졌을 때 컴포넌트 값 목록을 구문 분석한 결과로 둔다.
    2. parsed가 유효한 CSS 'color-scheme' 속성 값이면 parsed를 반환한다.
  3. null을 반환한다.

meta 요소가 문서에 삽입되거나 문서에서 제거되거나, 기존 meta 요소의 name 또는 content 속성이 변경되면 사용자 에이전트는 위 알고리즘을 다시 실행해야 한다.

이 규칙은 일치 항목을 찾을 때까지 연속된 요소를 검사하므로, 작성자는 레거시 사용자 에이전트를 위한 대체 값을 처리하도록 이러한 값을 여러 개 제공할 수 있다. CSS 속성의 대체가 작동하는 방식과 반대로 여러 meta 요소에서는 레거시 값을 새로운 값 뒤에 배치해야 한다.

4.2.5.2 기타 메타데이터 이름

누구나 자신만의 미리 정의된 메타데이터 이름 집합의 확장을 만들고 사용할 수 있다. 이러한 확장을 등록할 필요는 없다.

하지만 다음 중 어느 하나에 해당하는 경우에는 새 메타데이터 이름을 만들지 않는 것이 좋다:

또한 새 메타데이터 이름을 만들고 사용하기 전에 WHATWG Wiki MetaExtensions 페이지를 확인하는 것이 권장된다. 이미 사용 중인 메타데이터 이름을 선택하거나, 이미 사용 중인 메타데이터 이름의 목적을 중복하거나, 새로 표준화된 이름이 선택한 이름과 충돌하는 일을 피할 수 있기 때문이다. [WHATWGWIKI]

누구나 언제든지 WHATWG Wiki MetaExtensions 페이지를 편집하여 메타데이터 이름을 추가할 수 있다. 새 메타데이터 이름은 다음 정보와 함께 지정할 수 있다:

키워드

정의하려는 실제 이름. 이름은 정의된 다른 이름과 혼동될 정도로 유사해서는 안 된다 (예: 대소문자만 다른 경우).

간략한 설명

값에 요구되는 형식을 포함하여 메타데이터 이름의 의미를 설명하는 짧은 비규범적 설명.

명세
메타데이터 이름의 의미 체계와 요구 사항에 대한 더 자세한 설명으로 연결되는 링크. 위키의 다른 페이지나 외부 페이지로 연결할 수 있다.
동의어

처리 요구 사항이 정확히 같은 다른 이름의 목록. 작성자는 동의어로 정의된 이름을 사용하지 않는 것이 좋다(이 이름은 사용자 에이전트가 레거시 콘텐츠를 지원할 수 있도록 하기 위한 것일 뿐이다). 실제로 사용되지 않는 동의어는 누구나 제거할 수 있다. 레거시 콘텐츠와의 호환성을 위해 동의어로 처리해야 하는 이름만 이러한 방식으로 등록해야 한다.

상태

다음 중 하나:

제안됨
이름이 광범위한 동료 검토와 승인을 받지 않았다. 누군가 제안했으며 현재 사용 중이거나 곧 사용할 예정이다.
승인됨
이름이 광범위한 동료 검토와 승인을 받았다. 이름을 잘못된 방식으로 사용하는 경우를 포함하여 이름을 사용하는 페이지를 처리하는 방법을 명확하게 정의하는 명세가 있다.
중단됨
메타데이터 이름이 광범위한 동료 검토를 받았으며 적합하지 않은 것으로 판명되었다. 기존 페이지에서는 이 메타데이터 이름을 사용하지만 새 페이지에서는 사용하지 않는 것이 좋다. "간략한 설명"과 "명세" 항목은 작성자가 대신 사용해야 하는 항목이 있다면 그 세부 정보를 제공한다.

메타데이터 이름이 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열하는 것이 좋다.

메타데이터 이름이 "제안됨" 상태로 추가된 뒤 한 달 이상 사용되거나 명시되지 않으면 WHATWG Wiki MetaExtensions 페이지에서 제거할 수 있다.

메타데이터 이름이 "제안됨" 상태로 추가되고 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열하는 것이 좋다. 메타데이터 이름이 "제안됨" 상태로 추가되고 유해한 것으로 판명되면 "중단됨" 상태로 변경하는 것이 좋다.

누구나 언제든지 상태를 변경할 수 있지만 위 정의에 따라서만 변경하는 것이 좋다.

4.2.5.3 프래그마 지시문

http-equiv 속성이 meta 요소에 지정되면 해당 요소는 프래그마 지시문이다.

http-equiv라는 이름에도 불구하고 프래그마 지시문은 HTTP 헤더와 거의 전혀 관련이 없다. 구현자와 웹 개발자는 이 둘을 완전히 별개의 것으로 간주하고, 해당 이름은 역사적 우연의 결과로 생각하는 것이 가장 좋다.

더 자세히 말하면, refresh 키워드는 대응하는 `Refresh` 헤더와 동일한 처리 모델을 가지지만, 표준화된 다른 모든 프래그마 지시문은 이름이 비슷한 헤더와 적어도 약간은 다른 동작을 한다. (대개는 극적으로 다른 동작을 한다.)

새로운 문서 수준 프래그마나 HTTP 헤더로 제어되는 스위치를 추가하려는 구현자 또는 명세 작성자는 이러한 불일치에 주의해야 하며, HTTP 헤더와 http-equiv 프래그마 양쪽에 동일하거나 유사한 동작을 추가하여 기존의 혼란을 지속시키지 않아야 한다. 대신 HTTP 헤더만 제공하는 것을 고려하거나, 문서 내 프래그마가 필요하다면 charset 속성에서 사용한 모델과 유사하게 meta에 새 속성을 추가하는 것을 고려한다. (DOM은 변경 가능하므로 문서 내 프래그마를 피하는 편이 더 나은 경우가 많다는 점에 유의한다. 따라서 개발자가 meta 요소를 추가, 제거 또는 변경하지 않는 단순한 경우에도 정책은 구문 분석 도중 적용되지 않은 상태에서 적용된 상태로 바뀌며, 이는 복잡한 영향을 미칠 수 있다.)

http-equiv 속성은 다음 키워드와 상태를 갖는 열거형 속성이다:

키워드 적합 상태 간략한 설명
content-language 아니요 콘텐츠 언어 프래그마로 설정된 기본 언어를 설정한다.
content-type 인코딩 선언 charset을 설정하는 대체 형식.
default-style 기본 스타일 기본 CSS 스타일시트 집합이름을 설정한다.
refresh 새로고침 시간이 지정된 리디렉션으로 동작한다.
set-cookie 아니요 Set-Cookie 아무런 효과가 없다.
x-ua-compatible X-UA-Compatible 실제로는 Internet Explorer가 명세를 더 충실히 따르도록 유도한다.
content-security-policy 콘텐츠 보안 정책 Document콘텐츠 보안 정책적용한다.

meta 요소가 문서에 삽입될 때, 해당 요소의 http-equiv 속성이 있고 위 상태 중 하나를 나타내면 사용자 에이전트는 다음 목록에서 설명하는 해당 상태에 적합한 알고리즘을 실행해야 한다:

콘텐츠 언어 상태 (http-equiv="content-language")

이 기능은 적합하지 않다. 작성자는 대신 lang 속성을 사용하는 것이 권장된다.

이 프래그마는 프래그마로 설정된 기본 언어를 설정한다. 이러한 프래그마가 성공적으로 처리되기 전까지는 프래그마로 설정된 기본 언어가 없다.

  1. meta 요소에 content 속성이 없으면 반환한다.

  2. 요소의 content 속성에 U+002C COMMA 문자(,)가 포함되어 있으면 반환한다.

  3. input을 요소의 content 속성 값으로 둔다.

  4. positioninput의 첫 번째 문자를 가리키도록 한다.

  5. position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.

  6. position이 주어졌을 때 input에서 ASCII 공백이 아닌 코드 포인트 시퀀스를 수집한다.

  7. candidate를 이전 단계에서 얻은 문자열로 둔다.

  8. candidate가 빈 문자열이면 반환한다.

  9. 프래그마로 설정된 기본 언어candidate로 설정한다.

    값이 공백으로 구분된 여러 토큰으로 구성된 경우 첫 번째 토큰 뒤의 토큰은 무시된다.

이 프래그마는 같은 이름의 HTTP `Content-Language` 헤더와 거의 비슷해 보이지만 실제로는 전혀 다르다. [HTTP]

인코딩 선언 상태 (http-equiv="content-type")

인코딩 선언 상태는 단지 charset 속성을 설정하는 대체 형식이다. 즉 문자 인코딩 선언이다. 이 상태의 사용자 에이전트 요구 사항은 모두 명세의 구문 분석 절에서 처리된다.

http-equiv 속성이 인코딩 선언 상태meta 요소에서 content 속성 값은 다음으로 구성된 문자열과 ASCII 대소문자를 구분하지 않고 일치해야 한다: "text/html;", 선택적으로 임의 개수의 ASCII 공백, 그 뒤에 "charset=utf-8".

문서에는 http-equiv 속성이 인코딩 선언 상태meta 요소와 charset 속성이 있는 meta 요소를 모두 포함해서는 안 된다.

인코딩 선언 상태HTML 문서에서 사용할 수 있지만, 해당 상태의 http-equiv 속성이 있는 요소는 XML 문서에서 사용해서는 안 된다.

기본 스타일 상태 (http-equiv="default-style")

Alternative_style_sheets

하나의 엔진에서만 지원된다.

Firefox3+Safari?Chrome1–48
OperaEdge아니요
Edge (Legacy)?Internet Explorer8+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

이 프래그마는 기본 CSS 스타일시트 집합이름을 설정한다.

  1. meta 요소에 content 속성이 없거나 해당 속성 값이 빈 문자열이면 반환한다.

  2. 요소의 content 속성 값을 이름으로 사용하여 선호하는 CSS 스타일시트 집합 이름을 변경한다. [CSSOM]

새로고침 상태 (http-equiv="refresh")

이 프래그마는 시간이 지정된 리디렉션으로 동작한다.

Document 객체에는 연관된 선언적으로 새로고침할 예정 (불리언)이 있다. 초기값은 false이다.

  1. meta 요소에 content 속성이 없거나 해당 속성 값이 빈 문자열이면 반환한다.

  2. input을 요소의 content 속성 값으로 둔다.

  3. meta 요소의 노드 문서, inputmeta 요소를 사용하여 공유 선언적 새로고침 단계를 실행한다.

Document 객체 document, 문자열 input 및 선택적으로 meta 요소 meta가 주어졌을 때 공유 선언적 새로고침 단계는 다음과 같다:

  1. document선언적으로 새로고침할 예정이 true이면 반환한다.

  2. positioninput의 첫 번째 코드 포인트를 가리키도록 한다.

  3. position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.

  4. time을 0으로 둔다.

  5. position이 주어졌을 때 input에서 ASCII 숫자코드 포인트 시퀀스를 수집하고, 그 결과를 timeString으로 둔다.

  6. timeString이 빈 문자열이면:

    1. position이 가리키는 input코드 포인트가 U+002E(.)가 아니면 반환한다.

  7. 그렇지 않으면 음이 아닌 정수 구문 분석 규칙을 사용하여 timeString을 구문 분석한 결과로 time을 설정한다.

  8. position이 주어졌을 때 input에서 ASCII 숫자와 U+002E FULL STOP 문자(.)인 코드 포인트 시퀀스를 수집한다. 수집된 문자는 모두 무시한다.

  9. urlRecorddocumentURL로 둔다.

  10. positioninput의 끝을 지나지 않았다면:

    1. position이 가리키는 input코드 포인트가 U+003B(;), U+002C(,) 또는 ASCII 공백이 아니면 반환한다.

    2. position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.

    3. position이 가리키는 input코드 포인트가 U+003B(;) 또는 U+002C(,)이면 position을 다음 코드 포인트로 전진시킨다.

    4. position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.

  11. positioninput의 끝을 지나지 않았다면:

    1. urlStringposition코드 포인트부터 문자열 끝까지의 input 부분 문자열로 둔다.

    2. position이 가리키는 input코드 포인트가 U+0055(U) 또는 U+0075(u)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 따옴표 건너뛰기라고 표시된 단계로 이동한다.

    3. position이 가리키는 input코드 포인트가 U+0052(R) 또는 U+0072(r)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 구문 분석이라고 표시된 단계로 이동한다.

    4. position이 가리키는 input코드 포인트가 U+004C(L) 또는 U+006C(l)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 구문 분석이라고 표시된 단계로 이동한다.

    5. position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.

    6. position이 가리키는 input코드 포인트가 U+003D(=)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 구문 분석이라고 표시된 단계로 이동한다.

    7. position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.

    8. 따옴표 건너뛰기: position이 가리키는 input코드 포인트가 U+0027(') 또는 U+0022(")이면 quote를 해당 코드 포인트로 두고, position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 quote를 빈 문자열로 둔다.

    9. urlStringposition코드 포인트부터 문자열 끝까지의 input 부분 문자열로 설정한다.

    10. quote가 빈 문자열이 아니고 urlStringquote와 같은 코드 포인트가 있으면, 해당 코드 포인트에서 urlString을 잘라 해당 코드 포인트와 그 뒤의 모든 코드 포인트를 제거한다.

    11. 구문 분석: urlStringdocument를 기준으로 URL을 인코딩 구문 분석한 결과로 urlRecord를 설정한다.

    12. urlRecord가 실패이면 반환한다.

    13. urlRecord스킴이 "javascript"이면 반환한다.

  12. document선언적으로 새로고침할 예정을 true로 설정한다.

  13. 다음 단계 중 하나 이상을 수행한다:

    • 아래에서 정의하는 새로고침 시점이 도래한 후, 사용자가 리디렉션을 취소하지 않았고, meta가 주어진 경우 document활성 샌드박싱 플래그 집합샌드박스된 자동 기능 브라우징 컨텍스트 플래그가 설정되어 있지 않으면, document를 사용하고 historyHandling을 "replace"로 설정하여 document노드 내비게이블urlRecord내비게이션한다.

      앞 문단의 목적상 다음 두 조건 중 더 늦게 발생하는 조건이 발생하는 즉시 새로고침 시점이 도래한 것으로 간주한다:

      • 사용자 또는 사용자 에이전트의 환경 설정을 고려하여 조정한 뒤, document완전히 로드된 시각부터 최소 time초가 경과했다.
      • meta가 주어진 경우, 사용자 또는 사용자 에이전트의 환경 설정을 고려하여 조정한 뒤, metadocument 문서에 삽입된 시점부터 최소 time초가 경과했다.

      여기서는 meta노드 문서가 아니라 document를 사용하는 것이 중요하다. 초기 단계 집합과 새로고침 시점 사이에 노드 문서가 변경되었을 수 있고, meta는 항상 주어지는 것도 아니기 때문이다(HTTP `Refresh` 헤더의 경우).

    • 선택할 경우 document를 사용하여 document노드 내비게이블urlRecord내비게이션하는 인터페이스를 사용자에게 제공한다.

    • 아무 작업도 하지 않는다.

    또한 사용자 에이전트는 다른 모든 경우와 마찬가지로 타이머 상태, 시간이 지정된 리디렉션의 목적지 등을 포함하여 동작의 모든 측면을 사용자에게 알릴 수 있다.

http-equiv 속성이 새로고침 상태meta 요소에서 content 속성 값은 다음 중 하나로 구성되어야 한다:

앞의 경우 정수는 페이지를 다시 로드하기 전의 초 수를 나타낸다. 뒤의 경우 정수는 주어진 URL의 페이지로 현재 페이지를 교체하기 전의 초 수를 나타낸다.

뉴스 기관의 첫 페이지는 5분마다 서버에서 페이지를 자동으로 다시 로드하기 위해 페이지의 head 요소에 다음 마크업을 포함할 수 있다:

<meta http-equiv="Refresh" content="300">

각 페이지가 다음 페이지로 새로고침되도록 다음과 같은 마크업을 사용하면 일련의 페이지를 자동 슬라이드 쇼로 사용할 수 있다:

<meta http-equiv="Refresh" content="20; URL=page4.html">
Set-Cookie 상태 (http-equiv="set-cookie")

이 프래그마는 적합하지 않으며 아무런 효과가 없다.

사용자 에이전트는 이 프래그마를 무시해야 한다.

X-UA-Compatible 상태 (http-equiv="x-ua-compatible")

실제로 이 프래그마는 Internet Explorer가 명세를 더 충실히 따르도록 유도한다.

http-equiv 속성이 X-UA-Compatible 상태meta 요소에서 content 속성 값은 문자열 "IE=edge"와 ASCII 대소문자를 구분하지 않고 일치해야 한다.

사용자 에이전트는 이 프래그마를 무시해야 한다.

콘텐츠 보안 정책 상태 (http-equiv="content-security-policy")

이 프래그마는 Document콘텐츠 보안 정책적용한다. [CSP]

  1. meta 요소가 head 요소의 자식이 아니면 반환한다.

  2. meta 요소에 content 속성이 없거나 해당 속성 값이 빈 문자열이면 반환한다.

  3. meta 요소의 content 속성 값에 대해, 소스를 "meta"로 하고 처리 방식을 "enforce"로 하여 콘텐츠 보안 정책의 직렬화된 콘텐츠 보안 정책 구문 분석 알고리즘을 실행한 결과로 policy를 둔다.

  4. policy에서 report-uri, frame-ancestorssandbox 지시문의 모든 항목을 제거한다.

  5. policy 정책을 적용한다.

http-equiv 속성이 콘텐츠 보안 정책 상태meta 요소에서 content 속성 값은 유효한 콘텐츠 보안 정책으로 구성되어야 하지만 report-uri, frame-ancestors 또는 sandbox 지시문을 포함해서는 안 된다. content 속성으로 주어진 콘텐츠 보안 정책은 현재 문서에 적용된다. [CSP]

meta 요소를 문서에 삽입하는 시점에는 일부 리소스가 이미 가져와졌을 수 있다. 예를 들어 http-equiv 속성이 콘텐츠 보안 정책 상태meta 요소를 동적으로 삽입하기 전에 이미지가 사용 가능한 이미지 목록에 저장되어 있을 수 있다. 이미 가져온 리소스는 늦게 적용콘텐츠 보안 정책에 의해 차단된다고 보장할 수 없다.

페이지는 다음과 같은 정책을 사용하여 인라인 JavaScript 실행을 방지하고 모든 플러그인 콘텐츠를 차단함으로써 교차 사이트 스크립팅 공격의 위험을 완화할 수 있다:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'">

문서에는 특정 상태를 가진 meta 요소가 동시에 하나를 초과해서는 안 된다.

4.2.5.4 문서의 문자 인코딩 지정

문자 인코딩 선언은 문서를 저장하거나 전송하는 데 사용되는 문자 인코딩을 지정하는 메커니즘이다.

Encoding 표준은 UTF-8 문자 인코딩을 사용하도록 요구하며, 이를 식별하기 위해 "utf-8" 인코딩 레이블을 사용하도록 요구한다. 이러한 요구 사항으로 인해 문서에 문자 인코딩 선언이 있으면 "utf-8"과 ASCII 대소문자를 구분하지 않고 일치하는 인코딩 레이블을 지정해야 한다. 문자 인코딩 선언이 있는지 여부와 관계없이 문서를 인코딩하는 데 실제로 사용하는 문자 인코딩UTF-8이어야 한다. [ENCODING]

위 규칙을 강제하기 위해 작성 도구는 새로 생성한 문서에 기본적으로 UTF-8을 사용해야 한다.

다음 제한 사항도 적용된다:

또한 meta 요소에 대한 여러 제한으로 인해 문서당 meta 기반 문자 인코딩 선언은 하나만 있을 수 있다.

HTML 문서가 BOM으로 시작하지 않고, 그 인코딩Content-Type 메타데이터로 명시적으로 제공되지 않았으며, 문서가 iframe srcdoc 문서가 아니면 인코딩은 charset 속성이 있는 meta 요소 또는 http-equiv 속성이 인코딩 선언 상태meta 요소를 사용하여 지정해야 한다.

모든 문자가 ASCII 범위에 있더라도 사용자에 의해 폼에 입력되는 비ASCII 문자, 스크립트로 생성된 URL 등을 처리하려면 문자 인코딩이 필요하므로 Content-Type 메타데이터 또는 파일 내 명시적 선언으로 문자 인코딩 선언을 제공해야 한다.

UTF-8이 아닌 인코딩을 사용하면 기본적으로 문서의 문자 인코딩을 사용하는 폼 제출 및 URL 인코딩에서 예상하지 못한 결과가 발생할 수 있다.

문서가 iframe srcdoc 문서이면 문서에는 문자 인코딩 선언이 있어서는 안 된다. (이 경우 소스는 iframe을 포함한 문서의 일부이므로 이미 디코딩되어 있다.)

XML에서는 필요하다면 인라인 문자 인코딩 정보에 XML 선언을 사용하는 것이 좋다.

HTML에서 문자 인코딩이 UTF-8임을 선언하려면 작성자는 문서 상단 근처의 head 요소에 다음 마크업을 포함할 수 있다:

<meta charset="utf-8">

XML에서는 대신 마크업의 맨 위에서 XML 선언을 사용한다:

<?xml version="1.0" encoding="utf-8"?>

4.2.6 style 요소

Element/style

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera3.5+Edge79+
Edge (Legacy)12+Internet Explorer3+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

HTMLStyleElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLStyleElement/media

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
메타데이터 콘텐츠.
이 요소를 사용할 수 있는 맥락:
메타데이터 콘텐츠가 예상되는 곳.
head 요소의 자식인 noscript 요소 내부.
콘텐츠 모델:
적합한 스타일시트를 제공하는 텍스트.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
media — 적용 대상 미디어
blocking — 요소가 잠재적으로 렌더링을 차단하는지 여부
또한 title 속성은 이 요소에서 특별한 의미 체계를 가진다: CSS 스타일시트 집합 이름
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLStyleElement : HTMLElement {
  [HTMLConstructor] constructor();

  attribute boolean disabled;
  [CEReactions, Reflect] attribute DOMString media;
  [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList blocking;

  // also has obsolete members
};
HTMLStyleElement includes LinkStyle;

style 요소를 사용하면 작성자는 문서에 CSS 스타일시트를 임베딩할 수 있다. style 요소는 스타일링 처리 모델에 대한 여러 입력 중 하나이다. 이 요소는 사용자에게 제공되는 콘텐츠를 나타내지 않는다.

HTMLStyleElement/disabled

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)13+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

disabled getter 단계는 다음과 같다:

  1. this연관된 CSS 스타일시트가 없으면 false를 반환한다.

  2. this연관된 CSS 스타일시트비활성화 플래그가 설정되어 있으면 true를 반환한다.

  3. false를 반환한다.

disabled setter 단계는 다음과 같다:

  1. this연관된 CSS 스타일시트가 없으면 반환한다.

  2. 주어진 값이 true이면 this연관된 CSS 스타일시트비활성화 플래그를 설정한다. 그렇지 않으면 this연관된 CSS 스타일시트비활성화 플래그 설정을 해제한다.

중요한 점은 style 요소에 연관된 CSS 스타일시트가 있을 때만 disabled 속성 할당이 효과를 가진다는 것이다:

const style = document.createElement('style');
style.disabled = true;
style.textContent = 'body { background-color: red; }';
document.body.append(style);
console.log(style.disabled); // false

media 속성은 스타일이 적용되는 미디어를 나타낸다. 값은 유효한 미디어 쿼리 목록이어야 한다. 사용자 에이전트는 media 속성 값이 환경과 일치하고 다른 관련 조건이 적용될 때 스타일을 적용해야 하며, 그렇지 않으면 적용해서는 안 된다.

스타일의 범위는 예를 들어 CSS의 @media 블록 사용으로 더 제한될 수 있다. 이 명세는 이러한 추가 제한이나 요구 사항을 재정의하지 않는다.

media 속성을 생략한 경우 기본값은 "all"이며, 이는 기본적으로 스타일이 모든 미디어에 적용됨을 의미한다.

blocking 속성은 차단 속성이다.

Alternative_style_sheets

하나의 엔진에서만 지원된다.

Firefox3+Safari?Chrome1–48
OperaEdge아니요
Edge (Legacy)?Internet Explorer8+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

style 요소의 title 속성은 CSS 스타일시트 집합을 정의한다. style 요소에 title 속성이 없으면 제목도 없다. 조상 요소의 title 속성은 style 요소에 적용되지 않는다. style 요소가 문서 트리 안에 있지 않으면 title 속성은 무시된다. [CSSOM]

style 요소의 title 속성은 link 요소의 title 속성과 마찬가지로, 제목이 없는 style 블록이 부모 요소의 제목을 상속하지 않고 단순히 제목이 없다는 점에서 전역 title 속성과 다르다.

style 요소의 자식 텍스트 콘텐츠적합한 스타일시트의 콘텐츠여야 한다.

style 요소가 해당 요소의 노드 문서의 파서에 의해 생성되었으면 요소는 암시적으로 잠재적인 렌더링 차단 요소이다.


다음 조건 중 하나가 발생할 때마다 사용자 에이전트는 style 블록 업데이트 알고리즘을 실행해야 한다:

style 블록 업데이트 알고리즘은 다음과 같다:

  1. elementstyle 요소로 둔다.

  2. element연관된 CSS 스타일시트가 있으면 해당 CSS 스타일시트를 제거한다.

  3. element연결되어 있지 않으면 반환한다.

  4. elementtype 속성이 있고 그 값이 빈 문자열도 아니며 "text/css"와 ASCII 대소문자를 구분하지 않고 일치하지도 않으면 반환한다.

    특히 "text/css; charset=utf-8"과 같이 매개변수를 포함하는 type 값은 이 알고리즘이 조기에 반환하게 한다.

  5. style 요소, "style" 및 style 요소의 자식 텍스트 콘텐츠에 대해 실행했을 때 요소의 인라인 동작을 콘텐츠 보안 정책으로 차단해야 하는가? 알고리즘이 "Blocked"를 반환하면 반환한다. [CSP]

  6. 다음 속성을 사용하여 CSS 스타일시트를 생성한다:

    유형

    text/css

    소유자 노드

    element

    미디어

    elementmedia 속성.

    이는 속성의 현재 값 복사본이 아니라 현재 존재하지 않을 수도 있는 속성에 대한 참조이다. CSSOM은 속성을 동적으로 설정, 변경 또는 제거할 때 발생하는 일을 정의한다.

    제목

    element문서 트리 안에 있으면 elementtitle 속성이고, 그렇지 않으면 빈 문자열.

    다시 말하지만 이는 속성에 대한 참조이다.

    대체 플래그

    설정 해제.

    출처 정리 플래그

    설정.

    위치
    부모 CSS 스타일시트
    소유자 CSS 규칙

    null

    비활성화 플래그

    기본값 그대로 둔다.

    CSS 규칙

    초기화하지 않은 상태로 둔다.

    이는 올바르지 않아 보인다. 아마 요소의 자식 텍스트 콘텐츠를 사용해야 할 것이다. 이슈 #2997에서 추적한다.

  7. element스크립트 차단 스타일시트에 기여하면 element를 해당 요소의 노드 문서스크립트 차단 스타일시트 집합추가한다.

  8. elementmedia 속성 값이 환경과 일치하고 element잠재적으로 렌더링을 차단하면 element에서 렌더링을 차단한다.

스타일시트의 중요 하위 리소스가 있다면 이를 얻으려는 시도가 완료되거나, 스타일시트에 중요 하위 리소스가 없다면 스타일시트의 구문 분석과 처리가 완료된 후 사용자 에이전트는 다음 단계를 실행해야 한다:

중요 하위 리소스 가져오기는 명확히 정의되어 있지 않다. 아마 이슈 #968이 가장 적합한 해결책일 것이다. 그동안에는 모든 중요 하위 리소스 요청렌더링 차단style 요소가 현재 렌더링 차단 중인지 여부로 설정하는 것이 좋다.

  1. element를 해당 스타일시트와 연관된 style 요소로 둔다.

  2. success를 true로 둔다.

  3. 스타일시트의 중요 하위 리소스를 얻으려는 시도가 어떤 이유로든 실패한 경우(예: DNS 오류, HTTP 404 응답, 조기에 종료된 연결, 지원되지 않는 Content-Type) success를 false로 설정한다.

    CSS 구문 분석 오류나 PNG 디코딩 오류와 같은 콘텐츠별 오류는 success에 영향을 주지 않는다는 점에 유의한다.

  4. element와 다음 단계가 주어졌을 때 네트워킹 태스크 소스요소 태스크를 큐에 추가한다:

    1. success가 true이면 element에서 load라는 이름의 이벤트를 발생시킨다.

    2. 그렇지 않으면 element에서 error라는 이름의 이벤트를 발생시킨다.

    3. element스크립트 차단 스타일시트에 기여하면:

      1. 단언: element노드 문서스크립트 차단 스타일시트 집합element포함한다.

      2. element을 해당 요소의 노드 문서스크립트 차단 스타일시트 집합에서 제거한다.

    4. element에서 렌더링 차단을 해제한다.

요소는 스타일시트의 중요 하위 리소스가 있다면 이를 얻으려는 모든 시도가 완료될 때까지 요소의 노드 문서load 이벤트를 지연해야 한다.

이 명세는 스타일 시스템을 지정하지 않지만 대부분의 웹 브라우저가 CSS를 지원할 것으로 예상된다. [CSS]

LinkStyle 인터페이스도 이 요소에 의해 구현된다. [CSSOM]

다음 문서는 작품 제목과 라틴어 단어는 기본 기울임꼴로 남겨 두면서 강조를 기울임꼴 대신 밝은 빨간색 텍스트로 스타일링한다. 적절한 요소를 사용하면 문서의 스타일을 더 쉽게 다시 지정할 수 있음을 보여 준다.

<!DOCTYPE html>
<html lang="en-US">
 <head>
  <title>My favorite book</title>
  <style>
   body { color: black; background: white; }
   em { font-style: normal; color: red; }
  </style>
 </head>
 <body>
  <p>My <em>favorite</em> book of all time has <em>got</em> to be
  <cite>A Cat's Life</cite>. It is a book by P. Rahmel that talks
  about the <i lang="la">Felis catus</i> in modern human society.</p>
 </body>
</html>

4.2.7 스타일링과 스크립팅의 상호작용

스타일시트가 다른 리소스를 참조하지 않은 경우(예: @import 규칙이 없는 style 요소로 제공된 내부 스타일시트인 경우), 스타일 규칙을 스크립트에서 즉시 사용할 수 있어야 한다. 그렇지 않으면 이벤트 루프렌더링 업데이트 단계에 도달한 뒤에만 스타일 규칙을 스크립트에서 사용할 수 있어야 한다.

HTML 파서 또는 XML 파서Document 맥락에 있는 요소 el은 다음 조건이 모두 참이면 스크립트 차단 스타일시트에 기여한다:

위 규칙에 대응하는 규칙이 <?xml-stylesheet?> 처리 명령에도 적용될 것으로 예상된다. 그러나 이는 아직 철저히 조사되지 않았다.

Document에는 초기에 비어 있는 순서 있는 집합스크립트 차단 스타일시트 집합이 있다.

Document document는 다음 단계가 true를 반환하면 스크립트를 차단하는 스타일시트를 가진다:

  1. document스크립트 차단 스타일시트 집합비어 있지 않으면 true를 반환한다.

  2. document노드 내비게이블이 null이면 false를 반환한다.

  3. containerDocumentdocument노드 내비게이블컨테이너 문서로 둔다.

  4. containerDocument가 null이 아니고 containerDocument스크립트 차단 스타일시트 집합비어 있지 않으면 true를 반환한다.

  5. false를 반환한다.

Document스크립트를 차단하는 스타일시트를 가지지 않으면 스크립트를 차단하는 스타일시트를 가지지 않는다.

4.3 섹션

Introduction_to_HTML/Document_and_website_structure#HTML_for_structuring_content

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11.1+

4.3.1 body 요소

Element/body

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLBodyElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
없음.
이 요소를 사용할 수 있는 맥락:
html 요소의 두 번째 요소로.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
body 요소가 비어 있거나 body 요소 내부의 첫 번째 항목이 ASCII 공백 또는 주석이 아니면 시작 태그를 생략할 수 있다. 단, body 요소 내부의 첫 번째 항목이 meta, noscript, link, script, style 또는 template 요소인 경우는 제외한다.
body 요소 바로 뒤에 주석이 오지 않으면 body 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
onafterprint
onbeforeprint
onbeforeunload
onhashchange
onlanguagechange
onmessage
onmessageerror
onoffline
ononline
onpageswap
onpagehide
onpagereveal
onpageshow
onpopstate
onrejectionhandled
onstorage
onunhandledrejection
onunload
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLBodyElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

HTMLBodyElement includes WindowEventHandlers;

body 요소는 문서의 콘텐츠를 나타낸다.

적합한 문서에는 body 요소가 하나만 있다. document.body IDL 속성은 스크립트가 문서의 body 요소에 쉽게 접근할 수 있도록 한다.

일부 DOM 작업(예: 드래그 앤 드롭 모델의 일부)은 "body 요소"를 기준으로 정의된다. 이는 용어 정의에 따른 DOM의 특정 요소를 가리키며, 임의의 body 요소를 가리키는 것이 아니다.

body 요소는 Window 객체의 여러 이벤트 핸들러이벤트 핸들러 콘텐츠 속성으로 노출한다. 또한 해당 이벤트 핸들러의 이벤트 핸들러 IDL 속성을 반영한다.

body 요소에 노출된 Window 반영 body 요소 이벤트 핸들러 집합이 이름을 지정하는 Window 객체의 이벤트 핸들러는 일반적으로 HTML 요소에서 지원되는 동일한 이름의 일반 이벤트 핸들러를 대체한다.

따라서 예를 들어 Documentbody 요소의 자식에서 디스패치된 버블링 error 이벤트는 먼저 해당 요소의 onerror 이벤트 핸들러 콘텐츠 속성을 트리거하고, 그다음 루트 html 요소의 해당 속성을 트리거한 뒤, 그 후에야 body 요소의 onerror 이벤트 핸들러 콘텐츠 속성을 트리거한다. 이는 이벤트가 대상에서 body로, html로, Document로, Window로 버블링하고, body이벤트 핸들러body가 아니라 Window를 감시하기 때문이다. 그러나 addEventListener()를 사용하여 body에 연결된 일반 이벤트 리스너는 이벤트가 body를 통해 버블링할 때 실행되며, Window 객체에 도달할 때 실행되는 것이 아니다.

이 페이지는 사용자의 온라인 여부를 표시하도록 표시기를 업데이트한다:

<!DOCTYPE HTML>
<html lang="en">
 <head>
  <title>Online or offline?</title>
  <script>
   function update(online) {
     document.getElementById('status').textContent =
       online ? 'Online' : 'Offline';
   }
  </script>
 </head>
 <body ononline="update(true)"
       onoffline="update(false)"
       onload="update(navigator.onLine)">
  <p>You are: <span id="status">(Unknown)</span></p>
 </body>
</html>

4.3.2 article 요소

Element/article

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11.1+
범주:
플로 콘텐츠.
섹셔닝 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
섹셔닝 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

article 요소는 원칙적으로 독립적으로 배포하거나 재사용할 수 있는, 예를 들어 신디케이션에 사용할 수 있는 문서, 페이지, 애플리케이션 또는 사이트의 완전하거나 독립된 구성을 나타낸다. 이는 포럼 게시물, 잡지 또는 신문 기사, 블로그 게시물, 사용자가 제출한 댓글, 대화형 위젯이나 가젯 또는 기타 독립적인 콘텐츠 항목일 수 있다.

article 요소가 중첩된 경우 내부 article 요소는 원칙적으로 외부 기사 콘텐츠와 관련된 기사를 나타낸다. 예를 들어 사용자가 제출한 댓글을 받는 사이트의 블로그 게시물에서는 댓글을 블로그 게시물의 article 요소 내부에 중첩된 article 요소로 나타낼 수 있다.

article 요소와 연관된 작성자 정보(address 요소 참조)는 중첩된 article 요소에 적용되지 않는다.

신디케이션으로 재배포할 콘텐츠와 함께 특별히 사용할 때 article 요소는 목적상 Atom의 entry 요소와 유사하다. [ATOM]

schema.org 마이크로데이터 어휘의 CreativeWork 하위 유형 중 하나를 사용하여 article 요소의 게시일을 제공할 수 있다.

페이지의 주요 콘텐츠(즉, 푸터, 헤더, 내비게이션 블록 및 사이드바를 제외한 콘텐츠)가 하나의 독립된 구성이라면 해당 콘텐츠를 article로 표시할 수 있지만, 이 경우에는 기술적으로 중복이다(페이지가 하나의 문서이므로 단일 구성이라는 것이 자명하기 때문이다).

이 예제는 일부 schema.org 주석과 함께 article 요소를 사용하는 블로그 게시물을 보여 준다:

<article itemscope itemtype="http://schema.org/BlogPosting">
 <header>
  <h2 itemprop="headline">The Very First Rule of Life</h2>
  <p><time itemprop="datePublished" datetime="2009-10-09">3 days ago</time></p>
  <link itemprop="url" href="?comments=0">
 </header>
 <p>If there's a microphone anywhere near you, assume it's hot and
 sending whatever you're saying to the world. Seriously.</p>
 <p>...</p>
 <footer>
  <a itemprop="discussionUrl" href="?comments=1">Show comments...</a>
 </footer>
</article>

다음은 댓글 일부를 표시한 동일한 블로그 게시물이다:

<article itemscope itemtype="http://schema.org/BlogPosting">
 <header>
  <h2 itemprop="headline">The Very First Rule of Life</h2>
  <p><time itemprop="datePublished" datetime="2009-10-09">3 days ago</time></p>
  <link itemprop="url" href="?comments=0">
 </header>
 <p>If there's a microphone anywhere near you, assume it's hot and
 sending whatever you're saying to the world. Seriously.</p>
 <p>...</p>
 <section>
  <h1>Comments</h1>
  <article itemprop="comment" itemscope itemtype="http://schema.org/Comment" id="c1">
   <link itemprop="url" href="#c1">
   <footer>
    <p>Posted by: <span itemprop="creator" itemscope itemtype="http://schema.org/Person">
     <span itemprop="name">George Washington</span>
    </span></p>
    <p><time itemprop="dateCreated" datetime="2009-10-10">15 minutes ago</time></p>
   </footer>
   <p>Yeah! Especially when talking about your lobbyist friends!</p>
  </article>
  <article itemprop="comment" itemscope itemtype="http://schema.org/Comment" id="c2">
   <link itemprop="url" href="#c2">
   <footer>
    <p>Posted by: <span itemprop="creator" itemscope itemtype="http://schema.org/Person">
     <span itemprop="name">George Hammond</span>
    </span></p>
    <p><time itemprop="dateCreated" datetime="2009-10-10">5 minutes ago</time></p>
   </footer>
   <p>Hey, you have the same first name as me.</p>
  </article>
 </section>
</article>

각 댓글의 정보(작성자와 작성 시점 등)를 제공하기 위해 footer를 사용한 점에 유의한다. 이 경우처럼 적절한 경우 footer 요소는 해당 섹션의 시작 부분에 나타날 수 있다. (이 경우 header를 사용해도 잘못된 것은 아니다. 주로 작성 선호의 문제이다.)

이 예제에서는 포털 페이지에 위젯을 호스팅하기 위해 article 요소를 사용한다. 위젯은 특정 스타일링과 스크립트 동작을 얻기 위해 사용자 정의 내장 요소로 구현된다.

<!DOCTYPE HTML>
<html lang=en>
<title>eHome Portal</title>
<script src="/scripts/widgets.js"></script>
<link rel=stylesheet href="/styles/main.css">
<article is="stock-widget">
 <h2>Stocks</h2>
 <table>
  <thead> <tr> <th> Stock <th> Value <th> Delta
  <tbody> <template> <tr> <td> <td> <td> </template>
 </table>
 <p> <input type=button value="Refresh" onclick="this.parentElement.refresh()">
</article>
<article is="news-widget">
 <h2>News</h2>
 <ul>
  <template>
   <li>
    <p><img> <strong></strong>
    <p>
  </template>
 </ul>
 <p> <input type=button value="Refresh" onclick="this.parentElement.refresh()">
</article>

4.3.3 section 요소

Element/section

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11.1+
범주:
플로 콘텐츠.
섹셔닝 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
섹셔닝 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

section 요소는 문서 또는 애플리케이션의 일반적인 섹션을 나타낸다. 이 맥락에서 섹션은 일반적으로 제목을 포함하는 주제별 콘텐츠 그룹이다.

섹션의 예로는 장, 탭 대화 상자의 여러 탭 페이지 또는 논문의 번호가 매겨진 절이 있다. 웹사이트의 홈페이지는 소개, 뉴스 항목 및 연락처 정보 섹션으로 나눌 수 있다.

요소의 콘텐츠를 신디케이션하는 것이 적절한 경우 작성자는 section 요소 대신 article 요소를 사용하는 것이 권장된다.

section 요소는 일반적인 컨테이너 요소가 아니다. 스타일링 목적으로만 또는 스크립팅 편의를 위해 요소가 필요한 경우 작성자는 대신 div 요소를 사용하는 것이 권장된다. 일반적인 규칙은 요소의 콘텐츠가 문서의 개요에 명시적으로 나열될 경우에만 section 요소가 적절하다는 것이다.

다음 예제에서는 두 개의 짧은 섹션을 포함하는 사과에 관한 기사(더 큰 웹페이지의 일부)를 볼 수 있다.

<article>
 <hgroup>
  <h2>Apples</h2>
  <p>Tasty, delicious fruit!</p>
 </hgroup>
 <p>The apple is the pomaceous fruit of the apple tree.</p>
 <section>
  <h3>Red Delicious</h3>
  <p>These bright red apples are the most common found in many
  supermarkets.</p>
 </section>
 <section>
  <h3>Granny Smith</h3>
  <p>These juicy, green apples make a great filling for
  apple pies.</p>
 </section>
</article>

다음은 졸업자 목록을 위한 섹션과 졸업식 설명을 위한 섹션이라는 두 섹션을 가진 졸업식 프로그램이다. (이 예제의 마크업은 요소 간 공백의 양을 최소화하기 위해 가끔 사용되는 드문 스타일을 사용한다.)

<!DOCTYPE Html>
<Html Lang=En
 ><Head
   ><Title
     >Graduation Ceremony Summer 2022</Title
   ></Head
 ><Body
   ><H1
     >Graduation</H1
   ><Section
     ><H2
       >Ceremony</H2
     ><P
       >Opening Procession</P
     ><P
       >Speech by Valedictorian</P
     ><P
       >Speech by Class President</P
     ><P
       >Presentation of Diplomas</P
     ><P
       >Closing Speech by Headmaster</P
   ></Section
   ><Section
     ><H2
       >Graduates</H2
     ><Ul
       ><Li
         >Molly Carpenter</Li
       ><Li
         >Anastasia Luccio</Li
       ><Li
         >Ebenezar McCoy</Li
       ><Li
         >Karrin Murphy</Li
       ><Li
         >Thomas Raith</Li
       ><Li
         >Susan Rodriguez</Li
     ></Ul
   ></Section
 ></Body
></Html>

이 예제에서는 책의 작성자가 일부 섹션을 장으로, 일부를 부록으로 마크업하고 CSS를 사용하여 이 두 섹션 클래스의 헤더 스타일을 서로 다르게 지정한다.

<style>
 section { border: double medium; margin: 2em; }
 section.chapter h2 { font: 2em Roboto, Helvetica Neue, sans-serif; }
 section.appendix h2 { font: small-caps 2em Roboto, Helvetica Neue, sans-serif; }
</style>
<header>
 <hgroup>
  <h1>My Book</h1>
  <p>A sample with not much content</p>
 </hgroup>
 <p><small>Published by Dummy Publicorp Ltd.</small></p>
</header>
<section class="chapter">
 <h2>My First Chapter</h2>
 <p>This is the first of my chapters. It doesn't say much.</p>
 <p>But it has two paragraphs!</p>
</section>
<section class="chapter">
 <h2>It Continues: The Second Chapter</h2>
 <p>Bla dee bla, dee bla dee bla. Boom.</p>
</section>
<section class="chapter">
 <h2>Chapter Three: A Further Example</h2>
 <p>It's not like a battle between brightness and earthtones would go
 unnoticed.</p>
 <p>But it might ruin my story.</p>
</section>
<section class="appendix">
 <h2>Appendix A: Overview of Examples</h2>
 <p>These are demonstrations.</p>
</section>
<section class="appendix">
 <h2>Appendix B: Some Closing Remarks</h2>
 <p>Hopefully this long example shows that you <em>can</em> style
 sections, so long as they are used to indicate actual sections.</p>
</section>

4.3.4 nav 요소

Element/nav

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11.1+
범주:
플로 콘텐츠.
섹셔닝 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
섹셔닝 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

nav 요소는 다른 페이지 또는 페이지 내의 일부로 연결되는 페이지의 섹션, 즉 내비게이션 링크가 있는 섹션을 나타낸다.

페이지의 모든 링크 그룹을 nav 요소에 넣을 필요는 없다. 이 요소는 주로 주요 내비게이션 블록으로 구성된 섹션을 위한 것이다. 특히 푸터에는 서비스 약관, 홈페이지 및 저작권 페이지처럼 사이트의 여러 페이지로 연결되는 짧은 링크 목록이 있는 경우가 많다. 이러한 경우에는 footer 요소만으로 충분하다. 이러한 경우에 nav 요소를 사용할 수는 있지만 일반적으로는 필요하지 않다.

초기 렌더링에서 내비게이션 정보를 생략하는 것이 유용하거나 내비게이션 정보를 즉시 사용할 수 있는 것이 유용한 사용자를 대상으로 하는 사용자 에이전트(예: 스크린 리더)는 이 요소를 사용하여 페이지의 어떤 콘텐츠를 처음에 건너뛰거나 요청 시 제공할지(또는 둘 다)를 결정할 수 있다.

다음 예제에는 두 개의 nav 요소가 있다. 하나는 사이트 전체의 기본 내비게이션을 위한 것이고, 다른 하나는 페이지 자체의 보조 내비게이션을 위한 것이다.

<body>
 <h1>The Wiki Center Of Exampland</h1>
 <nav>
  <ul>
   <li><a href="/">Home</a></li>
   <li><a href="/events">Current Events</a></li>
   ...more...
  </ul>
 </nav>
 <article>
  <header>
   <h2>Demos in Exampland</h2>
   <p>Written by A. N. Other.</p>
  </header>
  <nav>
   <ul>
    <li><a href="#public">Public demonstrations</a></li>
    <li><a href="#destroy">Demolitions</a></li>
    ...more...
   </ul>
  </nav>
  <div>
   <section id="public">
    <h2>Public demonstrations</h2>
    <p>...more...</p>
   </section>
   <section id="destroy">
    <h2>Demolitions</h2>
    <p>...more...</p>
   </section>
   ...more...
  </div>
  <footer>
   <p><a href="?edit">Edit</a> | <a href="?delete">Delete</a> | <a href="?Rename">Rename</a></p>
  </footer>
 </article>
 <footer>
  <p><small>© copyright 1998 Exampland Emperor</small></p>
 </footer>
</body>

다음 예제에서는 페이지의 여러 위치에 링크가 있지만 그중 한 위치만 내비게이션 섹션으로 간주된다.

<body itemscope itemtype="http://schema.org/Blog">
 <header>
  <h1>Wake up sheeple!</h1>
  <p><a href="news.html">News</a> -
     <a href="blog.html">Blog</a> -
     <a href="forums.html">Forums</a></p>
  <p>Last Modified: <span itemprop="dateModified">2009-04-01</span></p>
  <nav>
   <h2>Navigation</h2>
   <ul>
    <li><a href="articles.html">Index of all articles</a></li>
    <li><a href="today.html">Things sheeple need to wake up for today</a></li>
    <li><a href="successes.html">Sheeple we have managed to wake</a></li>
   </ul>
  </nav>
 </header>
 <main>
  <article itemprop="blogPosts" itemscope itemtype="http://schema.org/BlogPosting">
   <header>
    <h2 itemprop="headline">My Day at the Beach</h2>
   </header>
   <div itemprop="articleBody">
    <p>Today I went to the beach and had a lot of fun.</p>
    ...more content...
   </div>
   <footer>
    <p>Posted <time itemprop="datePublished" datetime="2009-10-10">Thursday</time>.</p>
   </footer>
  </article>
  ...more blog posts...
 </main>
 <footer>
  <p>Copyright ©
   <span itemprop="copyrightYear">2010</span>
   <span itemprop="copyrightHolder">The Example Company</span>
  </p>
  <p><a href="about.html">About</a> -
     <a href="policy.html">Privacy Policy</a> -
     <a href="contact.html">Contact Us</a></p>
 </footer>
</body>

위 예제에서는 schema.org 어휘를 사용하여 블로그 게시물의 게시일과 기타 메타데이터를 제공하는 마이크로데이터 주석도 볼 수 있다.

nav 요소가 반드시 목록을 포함해야 하는 것은 아니며 다른 종류의 콘텐츠도 포함할 수 있다. 이 내비게이션 블록에서는 산문으로 링크를 제공한다:

<nav>
 <h1>Navigation</h1>
 <p>You are on my home page. To the north lies <a href="/blog">my
 blog</a>, from whence the sounds of battle can be heard. To the east
 you can see a large mountain, upon which many <a
 href="/school">school papers</a> are littered. Far up thus mountain
 you can spy a little figure who appears to be me, desperately
 scribbling a <a href="/school/thesis">thesis</a>.</p>
 <p>To the west are several exits. One fun-looking exit is labeled <a
 href="https://games.example.com/">"games"</a>. Another more
 boring-looking exit is labeled <a
 href="https://isp.example.net/">ISP™</a>.</p>
 <p>To the south lies a dark and dank <a href="/about">contacts
 page</a>. Cobwebs cover its disused entrance, and at one point you
 see a rat run quickly out of the page.</p>
</nav>

이 예제에서는 사용자가 폴더를 전환할 수 있도록 이메일 애플리케이션에서 nav를 사용한다:

<p><input type=button value="Compose" onclick="compose()"></p>
<nav>
 <h1>Folders</h1>
 <ul>
  <li> <a href="/inbox" onclick="return openFolder(this.href)">Inbox</a> <span class=count></span>
  <li> <a href="/sent" onclick="return openFolder(this.href)">Sent</a>
  <li> <a href="/drafts" onclick="return openFolder(this.href)">Drafts</a>
  <li> <a href="/trash" onclick="return openFolder(this.href)">Trash</a>
  <li> <a href="/customers" onclick="return openFolder(this.href)">Customers</a>
 </ul>
</nav>

4.3.5 aside 요소

Element/aside

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11.1+
범주:
플로 콘텐츠.
섹셔닝 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
섹셔닝 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

aside 요소는 aside 요소 주변의 콘텐츠와 간접적으로 관련되어 있으며 해당 콘텐츠와 분리된 것으로 간주할 수 있는 콘텐츠로 구성된 페이지의 섹션을 나타낸다. 이러한 섹션은 인쇄된 타이포그래피에서 사이드바로 표시되는 경우가 많다.

이 요소는 인용문이나 사이드바와 같은 타이포그래피 효과, 광고, nav 요소의 그룹 및 페이지의 주요 콘텐츠와 분리된 것으로 간주되는 기타 콘텐츠에 사용할 수 있다.

괄호 안의 내용을 위해서만 aside 요소를 사용하는 것은 적절하지 않다. 그러한 내용은 문서의 주요 흐름에 포함되기 때문이다.

다음 예제는 유럽에 관한 훨씬 긴 뉴스 기사에서 스위스에 관한 배경 자료를 마크업하는 데 aside를 사용하는 방법을 보여 준다.

<aside>
 <h2>Switzerland</h2>
 <p>Switzerland, a land-locked country in the middle of geographic
 Europe, has not joined the geopolitical European Union, though it is
 a signatory to a number of European treaties.</p>
</aside>

다음 예제는 긴 기사에서 인용문을 마크업하는 데 aside를 사용하는 방법을 보여 준다.

...

<p>He later joined a large company, continuing on the same work.
<q>I love my job. People ask me what I do for fun when I'm not at
work. But I'm paid to do my hobby, so I never know what to
answer. Some people wonder what they would do if they didn't have to
work... but I know what I would do, because I was unemployed for a
year, and I filled that time doing exactly what I do now.</q></p>

<aside>
 <q>People ask me what I do for fun when I'm not at work. But I'm
 paid to do my hobby, so I never know what to answer.</q>
</aside>

<p>Of course his work — or should that be hobby? —
isn't his only passion. He also enjoys other pleasures.</p>

...

다음 발췌문은 블로그에서 블로그롤과 기타 부가 콘텐츠에 aside를 사용할 수 있는 방법을 보여 준다:

<body>
 <header>
  <h1>My wonderful blog</h1>
  <p>My tagline</p>
 </header>
 <aside>
  <!-- this aside contains two sections that are tangentially related
  to the page, namely, links to other blogs, and links to blog posts
  from this blog -->
  <nav>
   <h2>My blogroll</h2>
   <ul>
    <li><a href="https://blog.example.com/">Example Blog</a>
   </ul>
  </nav>
  <nav>
   <h2>Archives</h2>
   <ol reversed>
    <li><a href="/last-post">My last post</a>
    <li><a href="/first-post">My first post</a>
   </ol>
  </nav>
 </aside>
 <aside>
  <!-- this aside is tangentially related to the page also, it
  contains twitter messages from the blog author -->
  <h1>Twitter Feed</h1>
  <blockquote cite="https://twitter.example.net/t31351234">
   I'm on vacation, writing my blog.
  </blockquote>
  <blockquote cite="https://twitter.example.net/t31219752">
   I'm going to go on vacation soon.
  </blockquote>
 </aside>
 <article>
  <!-- this is a blog post -->
  <h2>My last post</h2>
  <p>This is my last post.</p>
  <footer>
   <p><a href="/last-post" rel=bookmark>Permalink</a>
  </footer>
 </article>
 <article>
  <!-- this is also a blog post -->
  <h2>My first post</h2>
  <p>This is my first post.</p>
  <aside>
   <!-- this aside is about the blog post, since it's inside the
   <article> element; it would be wrong, for instance, to put the
   blogroll here, since the blogroll isn't really related to this post
   specifically, only to the page as a whole -->
   <h2>Posting</h2>
   <p>While I'm thinking about it, I wanted to say something about
   posting. Posting is fun!</p>
  </aside>
  <footer>
   <p><a href="/first-post" rel=bookmark>Permalink</a>
  </footer>
 </article>
 <footer>
  <p><a href="/archives">Archives</a> -
   <a href="/about">About me</a> -
   <a href="/copyright">Copyright</a></p>
 </footer>
</body>

4.3.6 h1, h2, h3, h4, h5h6 요소

Element/Heading_Elements

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Element/Heading_Elements

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Element/Heading_Elements

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Element/Heading_Elements

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Element/Heading_Elements

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Element/Heading_Elements

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLHeadingElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
제목 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
hgroup 요소의 자식으로.
제목 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLHeadingElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

이 요소들은 해당 섹션의 제목을 나타낸다.

이 요소들의 의미 체계와 의미는 제목과 개요 절에서 정의한다.

이 요소들은 이름의 숫자로 주어지는 제목 수준을 가진다. 제목 수준은 중첩된 섹션의 수준에 대응한다. h1 요소는 최상위 섹션을 위한 것이고, h2 요소는 하위 섹션을 위한 것이며, h3 요소는 하위 섹션의 하위 섹션을 위한 것이고, 이후도 같은 방식이다.

각각의 문서 개요(제목 및 섹션 구조)와 관련해서 다음 두 코드 조각은 의미상 동일하다:

<body>
<h1>Let's call it a draw(ing surface)</h1>
<h2>Diving in</h2>
<h2>Simple shapes</h2>
<h2>Canvas coordinates</h2>
<h3>Canvas coordinates diagram</h3>
<h2>Paths</h2>
</body>
<body>
 <h1>Let's call it a draw(ing surface)</h1>
 <section>
  <h2>Diving in</h2>
 </section>
 <section>
  <h2>Simple shapes</h2>
 </section>
 <section>
  <h2>Canvas coordinates</h2>
  <section>
   <h3>Canvas coordinates diagram</h3>
  </section>
 </section>
 <section>
  <h2>Paths</h2>
 </section>
</body>

작성자는 간결함을 위해 앞의 스타일을 선호하거나 추가 스타일링 지점을 위해 뒤의 스타일을 선호할 수 있다. 어느 것이 가장 좋은지는 전적으로 선호하는 작성 스타일의 문제이다.

4.3.7 hgroup 요소

Element/hgroup

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android2.2+Samsung Internet?Opera Android11.1+
범주:
플로 콘텐츠.
제목 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
제목 콘텐츠가 예상되는 곳.
콘텐츠 모델:
0개 이상의 p 요소 뒤에 하나의 h1, h2, h3, h4, h5 또는 h6 요소가 오고, 그 뒤에 0개 이상의 p 요소가 오며, 선택적으로 스크립트 지원 요소와 섞일 수 있다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

hgroup 요소는 제목과 관련 콘텐츠를 나타낸다. 이 요소는 h1h6 요소를 부제목, 대체 제목 또는 태그라인을 나타내는 콘텐츠를 포함하는 하나 이상의 p 요소와 함께 그룹화하는 데 사용할 수 있다.

다음은 hgroup 요소 안에 포함된 유효한 제목의 몇 가지 예이다.

<hgroup>
 <h1>The reality dysfunction</h1>
 <p>Space is not the only void</p>
</hgroup>
<hgroup>
 <h1>Dr. Strangelove</h1>
 <p>Or: How I Learned to Stop Worrying and Love the Bomb</p>
</hgroup>

4.3.8 header 요소

Element/header

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11.1+
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠. 단, header 또는 footer 요소 자손은 없어야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
조상 섹셔닝 콘텐츠 요소가 있는 경우: 작성자용; 구현자용.
그렇지 않은 경우: 작성자용; 구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

header 요소는 소개 또는 내비게이션 보조 수단의 그룹을 나타낸다.

header 요소는 일반적으로 제목 (h1h6 요소 또는 hgroup 요소)을 포함하도록 의도되지만, 필수는 아니다. header 요소는 섹션의 목차, 검색 폼 또는 관련 로고를 감싸는 데에도 사용할 수 있다.

다음은 몇 가지 헤더 예제이다. 첫 번째 예제는 게임을 위한 것이다:

<header>
 <p>Welcome to...</p>
 <h1>Voidwars!</h1>
</header>

다음 코드 조각은 명세의 헤더를 마크업하는 데 이 요소를 사용하는 방법을 보여 준다:

<header>
 <hgroup>
  <h1>Fullscreen API</h1>
  <p>Living Standard — Last Updated 19 October 2015<p>
 </hgroup>
 <dl>
  <dt>Participate:</dt>
  <dd><a href="https://github.com/whatwg/fullscreen">GitHub whatwg/fullscreen</a></dd>
  <dt>Commits:</dt>
  <dd><a href="https://github.com/whatwg/fullscreen/commits">GitHub whatwg/fullscreen/commits</a></dd>
 </dl>
</header>

header 요소는 섹셔닝 콘텐츠가 아니며, 새 섹션을 시작하지 않는다.

이 예제에서 페이지에는 h1 요소가 제공하는 페이지 제목과 h2 요소가 제공하는 제목을 가진 두 개의 하위 섹션이 있다. header 요소 뒤의 콘텐츠는 여전히 header 요소에서 시작된 마지막 하위 섹션의 일부이다. 이는 header 요소가 개요 알고리즘에 참여하지 않기 때문이다.

<body>
 <header>
  <h1>Little Green Guys With Guns</h1>
  <nav>
   <ul>
    <li><a href="/games">Games</a>
    <li><a href="/forum">Forum</a>
    <li><a href="/download">Download</a>
   </ul>
  </nav>
  <h2>Important News</h2> <!-- this starts a second subsection -->
  <!-- this is part of the subsection entitled "Important News" -->
  <p>To play today's games you will need to update your client.</p>
  <h2>Games</h2> <!-- this starts a third subsection -->
 </header>
 <p>You have three active games:</p>
 <!-- this is still part of the subsection entitled "Games" -->
 ...

Element/footer

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5+Chrome5+
Opera11.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11.1+
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠. 단, header 또는 footer 요소 자손은 없어야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
조상 섹셔닝 콘텐츠 요소가 있는 경우: 작성자용; 구현자용.
그렇지 않은 경우: 작성자용; 구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

footer 요소는 가장 가까운 조상 섹셔닝 콘텐츠 요소의 푸터를 나타내며, 그러한 조상이 없으면 body 요소의 푸터를 나타낸다. 푸터에는 일반적으로 해당 섹션의 작성자, 관련 문서로 연결되는 링크, 저작권 데이터 등과 같은 정보가 포함된다.

footer 요소가 전체 섹션을 포함하는 경우, 해당 섹션은 부록, 색인, 긴 판권란, 자세한 라이선스 계약 및 이와 유사한 콘텐츠를 나타낸다.

섹션의 작성자 또는 편집자에 대한 연락처 정보는 address 요소에 속하며, 해당 요소 자체가 footer 안에 있을 수 있다. 바이라인 및 headerfooter 모두에 적합할 수 있는 기타 정보는 둘 중 하나에 둘 수도 있고 어느 쪽에도 두지 않을 수도 있다. 이러한 요소의 주요 목적은 작성자가 유지관리하고 스타일링하기 쉬운 자체 설명적 마크업을 작성하도록 돕는 것일 뿐이며, 작성자에게 특정 구조를 강제하도록 의도된 것은 아니다.

푸터는 일반적으로 섹션의 에 나타나지만 반드시 그럴 필요는 없다.

조상 섹셔닝 콘텐츠 요소가 없으면 전체 페이지에 적용된다.

footer 요소 자체는 섹셔닝 콘텐츠가 아니며, 새 섹션을 시작하지 않는다.

다음은 같은 콘텐츠를 가진 푸터 두 개가 하나는 위쪽에, 다른 하나는 아래쪽에 있는 페이지이다:

<body>
 <footer><a href="../">Back to index...</a></footer>
 <hgroup>
  <h1>Lorem ipsum</h1>
  <p>The ipsum of all lorems</p>
 </hgroup>
 <p>A dolor sit amet, consectetur adipisicing elit, sed do eiusmod
 tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
 veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
 ea commodo consequat. Duis aute irure dolor in reprehenderit in
 voluptate velit esse cillum dolore eu fugiat nulla
 pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
 culpa qui officia deserunt mollit anim id est laborum.</p>
 <footer><a href="../">Back to index...</a></footer>
</body>

다음 예제는 footer 요소가 사이트 전체 푸터와 섹션 푸터 모두에 사용되는 모습을 보여 준다.

<!DOCTYPE HTML>
<HTML LANG="en"><HEAD>
<TITLE>The Ramblings of a Scientist</TITLE>
<BODY>
<H1>The Ramblings of a Scientist</H1>
<ARTICLE>
 <H1>Episode 15</H1>
 <VIDEO SRC="/fm/015.ogv" CONTROLS PRELOAD>
  <P><A HREF="/fm/015.ogv">Download video</A>.</P>
 </VIDEO>
 <FOOTER> <!-- footer for article -->
  <P>Published <TIME DATETIME="2009-10-21T18:26-07:00">on 2009/10/21 at 6:26pm</TIME></P>
 </FOOTER>
</ARTICLE>
<ARTICLE>
 <H1>My Favorite Trains</H1>
 <P>I love my trains. My favorite train of all time is a Köf.</P>
 <P>It is fun to see them pull some coal cars because they look so
 dwarfed in comparison.</P>
 <FOOTER> <!-- footer for article -->
  <P>Published <TIME DATETIME="2009-09-15T14:54-07:00">on 2009/09/15 at 2:54pm</TIME></P>
 </FOOTER>
</ARTICLE>
<FOOTER> <!-- site wide footer -->
 <NAV>
  <P><A HREF="/credits.html">Credits</A><A HREF="/tos.html">Terms of Service</A><A HREF="/index.html">Blog Index</A></P>
 </NAV>
 <P>Copyright © 2009 Gordon Freeman</P>
</FOOTER>
</BODY>
</HTML>

일부 사이트 디자인에는 때때로 "대형 푸터"라고 부르는 것이 있다. 이는 이미지, 다른 기사로 연결되는 링크, 피드백을 보내는 페이지로 연결되는 링크, 특별 제안 등 많은 자료를 포함하는 푸터로, 어떤 면에서는 푸터 안에 완전한 "첫 페이지"가 있는 것과 같다.

다음 코드 조각은 "대형 푸터"가 있는 사이트에서 페이지 하단을 보여 준다:

...
 <footer>
  <nav>
   <section>
    <h1>Articles</h1>
    <p><img src="images/somersaults.jpeg" alt=""> Go to the gym with
    our somersaults class! Our teacher Jim takes you through the paces
    in this two-part article. <a href="articles/somersaults/1">Part
    1</a> · <a href="articles/somersaults/2">Part 2</a></p>
    <p><img src="images/kindplus.jpeg"> Tired of walking on the edge of
    a clif<!-- sic -->? Our guest writer Lara shows you how to bumble
    your way through the bars. <a href="articles/kindplus/1">Read
    more...</a></p>
    <p><img src="images/crisps.jpeg"> The chips are down, now all
    that's left is a potato. What can you do with it? <a
    href="articles/crisps/1">Read more...</a></p>
   </section>
   <ul>
    <li> <a href="/about">About us...</a>
    <li> <a href="/feedback">Send feedback!</a>
    <li> <a href="/sitemap">Sitemap</a>
   </ul>
  </nav>
  <p><small>Copyright © 2015 The Snacker —
  <a href="/tos">Terms of Service</a></small></p>
 </footer>
</body>

4.3.10 address 요소

Element/address

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠. 단, 제목 콘텐츠 자손, 섹셔닝 콘텐츠 자손 및 header, footer 또는 address 요소 자손은 없어야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

address 요소는 가장 가까운 article 또는 body 요소 조상의 연락처 정보를 나타낸다. 해당 조상이 body 요소이면 연락처 정보는 문서 전체에 적용된다.

예를 들어 HTML과 관련된 W3C 웹사이트의 페이지에는 다음과 같은 연락처 정보가 포함될 수 있다:

<ADDRESS>
 <A href="../People/Raggett/">Dave Raggett</A>,
 <A href="../People/Arnaud/">Arnaud Le Hors</A>,
 contact persons for the <A href="Activity">W3C HTML Activity</A>
</ADDRESS>

address 요소는 해당 주소가 실제로 관련 연락처 정보인 경우를 제외하고 임의의 주소(예: 우편 주소)를 나타내는 데 사용해서는 안 된다. (일반적인 우편 주소를 마크업하는 데 적합한 요소는 p 요소이다.)

address 요소는 연락처 정보 이외의 정보를 포함해서는 안 된다.

예를 들어 다음은 address 요소를 부적합하게 사용한 것이다:

<ADDRESS>Last Modified: 1999/12/24 23:37:50</ADDRESS>

일반적으로 address 요소는 다른 정보와 함께 footer 요소에 포함된다.

노드 node의 연락처 정보는 다음 목록에서 처음으로 적용 가능한 항목에 의해 정의되는 address 요소의 모음이다:

nodearticle 요소인 경우
nodebody 요소인 경우

연락처 정보는 node를 조상으로 가지면서 node의 자손인 다른 body 또는 article 요소 조상을 가지지 않는 모든 address 요소로 구성된다.

nodearticle 요소인 조상 요소가 있는 경우
nodebody 요소인 조상 요소가 있는 경우

node의 연락처 정보는 가장 가까운 article 또는 body 요소 조상 중 더 가까운 요소의 연락처 정보와 같다.

node노드 문서body 요소가 있는 경우

node의 연락처 정보는 Documentbody 요소의 연락처 정보와 같다.

그렇지 않은 경우

node에는 연락처 정보가 없다.

사용자 에이전트는 노드의 연락처 정보를 사용자에게 노출하거나, 섹션의 연락처 정보를 기준으로 섹션을 색인하는 것과 같은 다른 목적으로 사용할 수 있다.

이 예제에서 푸터는 연락처 정보와 저작권 고지를 포함한다.

<footer>
 <address>
  For more details, contact
  <a href="mailto:js@example.com">John Smith</a>.
 </address>
 <p><small>© copyright 2038 Example Corp.</small></p>
</footer>

4.3.11 제목과 개요

h1h6 요소에는 요소의 계산된 제목 수준을 가져오기로 주어지는 제목 수준이 있다.

이 요소들은 제목나타낸다. 제목제목 수준이 낮을수록 해당 제목이 가진 조상 섹션의 수가 적다.

개요는 문서의 모든 제목트리 순서로 나열한 것이다.

개요는 예를 들어 목차를 생성할 때 문서 개요를 생성하는 데 사용해야 한다. 대화형 목차를 만들 때 항목은 사용자를 관련 제목으로 이동시켜야 한다.

문서에 하나 이상의 제목이 있으면 개요 안의 적어도 하나의 제목제목 수준이 1이어야 한다.

개요에서 다른 제목 lead 뒤에 오는 각 제목lead제목 수준보다 작거나 같거나 1 큰 제목 수준을 가져야 한다.

다음 예제는 부적합하다:

<body>
 <h1>Apples</h1>
 <p>Apples are fruit.</p>
 <section>
  <h3>Taste</h3>
  <p>They taste lovely.</p>
 </section>
</body>

다음과 같이 작성하면 적합하게 된다:

<body>
 <h1>Apples</h1>
 <p>Apples are fruit.</p>
 <section>
  <h2>Taste</h2>
  <p>They taste lovely.</p>
 </section>
</body>
4.3.11.1 제목 수준 및 오프셋

headingoffset 콘텐츠 속성을 사용하면 작성자가 자손의 제목 수준에 오프셋을 적용할 수 있다.

headingoffset 속성이 지정되면 그 값은 0 이상 8 이하의 유효한 음이 아닌 정수여야 한다.

headingreset 콘텐츠 속성은 불리언 속성이다. 이를 사용하면 작성자가 제목 오프셋 계산이 해당 속성을 가진 요소 너머로 순회하지 못하도록 할 수 있다.

요소 element이 주어졌을 때 요소의 계산된 제목 수준을 가져오려면:

  1. level을 0으로 둔다.

  2. element의 지역 이름이 h1이면, level을 1로 설정한다.

  3. element의 지역 이름이 h2이면, level을 2로 설정한다.

  4. element의 지역 이름이 h3이면, level을 3으로 설정한다.

  5. element의 지역 이름이 h4이면, level을 4로 설정한다.

  6. element의 지역 이름이 h5이면, level을 5로 설정한다.

  7. element의 지역 이름이 h6이면, level을 6으로 설정한다.

  8. 단언: level은 0이 아니다.

  9. element가 주어졌을 때 요소의 계산된 제목 오프셋을 가져온 결과만큼 level을 증가시킨다.

  10. level이 9보다 크면 9를 반환한다.

  11. level을 반환한다.

요소 element이 주어졌을 때 요소의 계산된 제목 오프셋을 가져오려면 다음 단계를 수행한다. 이 단계들은 음이 아닌 정수를 반환한다.

  1. offset을 0으로 둔다.

  2. inclusiveAncestorelement로 둔다.

  3. inclusiveAncestor가 null이 아닌 동안:

    1. nextOffset을 0으로 둔다.

    2. inclusiveAncestorHTML 요소이고 headingoffset 속성을 가지면 음이 아닌 정수 구문 분석 규칙을 사용하여 그 값을 구문 분석한다.

      값을 구문 분석한 결과가 오류가 아니면 nextOffset을 해당 값으로 설정한다.

    3. offsetnextOffset만큼 증가시킨다.

    4. inclusiveAncestorHTML 요소이고 headingreset 속성을 가지면 offset을 반환한다.

    5. inclusiveAncestor의 부모가 섀도 루트이면 inclusiveAncestor를 해당 섀도 루트호스트로 설정하고 계속한다.

    6. inclusiveAncestorinclusiveAncestor부모 요소로 설정한다.

  4. offset을 반환한다.

이 예제는 각 제목 수준을 보여 주는 주석과 함께 headingoffset, headingresetaria-level 속성을 조합한 모습을 보여 준다. 이 예제는 다양한 조합을 설명하기 위한 것이며 모범 사례 예제는 아니다.

<body>
  <main>
   <h1>This is a heading level 1</h1>
   <article headingoffset="1">
    <h1>This is a heading level 2</h1>
    <section headingoffset="1">
     <h1>This is a heading level 3</h1>
     <dialog headingreset>
      <h1>This is a heading level 1</h1>
     </dialog>
    </section>
   </article>
   <h1 aria-level="2">This is a heading level 2</h1>
  </main>
</body>
4.3.11.2 개요 예제

다음 마크업 조각은:

<body>
  <hgroup id="document-title">
    <h1>HTML: Living Standard</h1>
    <p>Last Updated 12 August 2016</p>
  </hgroup>
  <p>Some intro to the document.</p>
  <h2>Table of contents</h2>
  <ol id=toc>...</ol>
  <h2>First section</h2>
  <p>Some intro to the first section.</p>
</body>

...3개의 문서 제목을 생성한다:

  1. <h1>HTML: Living Standard</h1>

  2. <h2>Table of contents</h2>.

  3. <h2>First section</h2>.

개요를 렌더링한 모습은 다음과 같을 수 있다:

Top-level section with the heading "HTML: Living Standard" and two subsections; "Table of contents" and "First section".

먼저 매우 짧은 장과 하위 섹션으로 구성된 책 문서를 살펴보자:

<!DOCTYPE HTML>
<html lang=en>
<title>The Tax Book (all in one page)</title>
<h1>The Tax Book</h1>
<h2>Earning money</h2>
<p>Earning money is good.</p>
<h3>Getting a job</h3>
<p>To earn money you typically need a job.</p>
<h2>Spending money</h2>
<p>Spending is what money is mainly used for.</p>
<h3>Cheap things</h3>
<p>Buying cheap things often not cost-effective.</p>
<h3>Expensive things</h3>
<p>The most expensive thing is often not the most cost-effective either.</p>
<h2>Investing money</h2>
<p>You can lend your money to other people.</p>
<h2>Losing money</h2>
<p>If you spend money or invest money, sooner or later you will lose money.
<h3>Poor judgement</h3>
<p>Usually if you lose money it's because you made a mistake.</p>

이 문서의 개요는 다음과 같이 표시할 수 있다:

  1. The Tax Book
    1. Earning money
      1. Getting a job
    2. Spending money
      1. Cheap things
      2. Expensive things
    3. Investing money
    4. Losing money
      1. Poor judgement

title 요소는 제목이 아니라는 점에 유의한다.

문서는 여러 개의 최상위 제목을 포함할 수 있다:

<!DOCTYPE HTML>
<html lang=en>
<title>Alphabetic Fruit</title>
<h1>Apples</h1>
<p>Pomaceous.</p>
<h1>Bananas</h1>
<p>Edible.</p>
<h1>Carambola</h1>
<p>Star.</p>

문서의 개요는 다음과 같이 표시할 수 있다:

  1. Apples
  2. Bananas
  3. Carambola

header 요소는 문서의 개요에 영향을 주지 않는다:

<!DOCTYPE HTML>
<html lang="en">
<title>We're adopting a child! — Ray's blog</title>
<h1>Ray's blog</h1>
<article>
 <header>
  <nav>
   <a href="?t=-1d">Yesterday</a>;
   <a href="?t=-7d">Last week</a>;
   <a href="?t=-1m">Last month</a>
  </nav>
  <h2>We're adopting a child!</h2>
 </header>
 <p>As of today, Janine and I have signed the papers to become
 the proud parents of baby Diane! We've been looking forward to
 this day for weeks.</p>
</article>
</html>

문서의 개요는 다음과 같이 표시할 수 있다:

  1. Ray's blog
    1. We're adopting a child!

다음 예제는 적합하지만 제목 수준이 1인 제목이 없으므로 권장되지 않는다:

<!DOCTYPE HTML>
<html lang=en>
<title>Alphabetic Fruit</title>
<section>
 <h2>Apples</h2>
 <p>Pomaceous.</p>
</section>
<section>
 <h2>Bananas</h2>
 <p>Edible.</p>
</section>
<section>
 <h2>Carambola</h2>
 <p>Star.</p>
</section>

문서의 개요는 다음과 같이 표시할 수 있다:

    1. Apples
    2. Bananas
    3. Carambola

다음 예제는 적합하지만 첫 번째 제목제목 수준이 1이 아니므로 권장되지 않는다:

<!DOCTYPE HTML>
<html lang=en>
<title>Feathers on The Site of Encyclopedic Knowledge</title>
 <h2>A plea from our caretakers</h2>
 <p>Please, we beg of you, send help! We're stuck in the server room!</p>
<h1>Feathers</h1>
<p>Epidermal growths.</p>

문서의 개요는 다음과 같이 표시할 수 있다:

    1. A plea from our caretakers
  1. Feathers
4.3.11.3 사용자에게 개요 노출하기

사용자 에이전트는 내비게이션을 돕기 위해 페이지 개요를 사용자에게 노출하는 것이 권장된다. 이는 특히 스크린 리더와 같은 비시각적 미디어에 해당한다.

예를 들어 사용자 에이전트는 화살표 키를 다음과 같이 매핑할 수 있다:

Shift + ← 왼쪽
이전 제목으로 이동
Shift + → 오른쪽
다음 제목으로 이동
Shift + ↑ 위쪽
현재 제목의 수준보다 1 낮은 수준을 가진 다음 제목으로 이동
Shift + ↓ 아래쪽
현재 제목과 같은 수준을 가진 다음 제목으로 이동

4.3.12 사용 요약

이 절은 비규범적이다.

요소 목적
예제
body 문서의 콘텐츠.
<!DOCTYPE HTML>
<html lang="en">
 <head> <title>Steve Hill's Home Page</title> </head>
 <body> <p>Hard Trance is My Life.</p> </body>
</html>
article 원칙적으로 독립적으로 배포하거나 재사용할 수 있는, 예를 들어 신디케이션에 사용할 수 있는 문서, 페이지, 애플리케이션 또는 사이트의 완전하거나 독립된 구성. 이는 포럼 게시물, 잡지 또는 신문 기사, 블로그 게시물, 사용자가 제출한 댓글, 대화형 위젯이나 가젯 또는 기타 독립적인 콘텐츠 항목일 수 있다.
<article>
 <img src="/tumblr_masqy2s5yn1rzfqbpo1_500.jpg" alt="Yellow smiley face with the caption 'masif'">
 <p>My fave Masif tee so far!</p>
 <footer>Posted 2 days ago</footer>
</article>
<article>
 <img src="/tumblr_m9tf6wSr6W1rzfqbpo1_500.jpg" alt="">
 <p>Happy 2nd birthday Masif Saturdays!!!</p>
 <footer>Posted 3 weeks ago</footer>
</article>
section 문서 또는 애플리케이션의 일반적인 섹션. 이 맥락에서 섹션은 일반적으로 제목을 포함하는 주제별 콘텐츠 그룹이다.
<h1>Biography</h1>
<section>
 <h1>The facts</h1>
 <p>1500+ shows, 14+ countries</p>
</section>
<section>
 <h1>2010/2011 figures per year</h1>
 <p>100+ shows, 8+ countries</p>
</section>
nav 다른 페이지 또는 페이지 내의 일부로 연결되는 페이지의 섹션, 즉 내비게이션 링크가 있는 섹션.
<nav>
 <p><a href="/">Home</a>
 <p><a href="/biog.html">Bio</a>
 <p><a href="/discog.html">Discog</a>
</nav>
aside aside 요소 주변의 콘텐츠와 간접적으로 관련되어 있으며 해당 콘텐츠와 분리된 것으로 간주할 수 있는 콘텐츠로 구성된 페이지의 섹션. 이러한 섹션은 인쇄된 타이포그래피에서 사이드바로 표시되는 경우가 많다.
<h1>Music</h1>
<p>As any burner can tell you, the event has a lot of trance.</p>
<aside>You can buy the music we played at our <a href="buy.html">playlist page</a>.</aside>
<p>This year we played a kind of trance that originated in Belgium, Germany, and the Netherlands in the mid-90s.</p>
h1h6 제목
<h1>The Guide To Music On The Playa</h1>
<h2>The Main Stage</h2>
<p>If you want to play on a stage, you should bring one.</p>
<h2>Amplified Music</h2>
<p>Amplifiers up to 300W or 90dB are welcome.</p>
hgroup 제목과 관련 콘텐츠. 이 요소는 h1h6 요소를 부제목, 대체 제목 또는 태그라인을 나타내는 콘텐츠를 포함하는 하나 이상의 p 요소와 함께 그룹화하는 데 사용할 수 있다.
<hgroup>
 <h1>Burning Music</h1>
 <p>The Guide To Music On The Playa</p>
</hgroup>
<section>
 <hgroup>
  <h1>Main Stage</h1>
  <p>The Fiction Of A Music Festival</p>
 </hgroup>
 <p>If you want to play on a stage, you should bring one.</p>
</section>
<section>
 <hgroup>
  <h1>Loudness!</h1>
  <p>Questions About Amplified Music</p>
 </hgroup>
 <p>Amplifiers up to 300W or 90dB are welcome.</p>
</section>
header 소개 또는 내비게이션 보조 수단의 그룹.
<article>
 <header>
  <h1>Hard Trance is My Life</h1>
  <p>By DJ Steve Hill and Technikal</p>
 </header>
 <p>The album with the amusing punctuation has red artwork.</p>
</article>
footer 가장 가까운 조상 섹셔닝 콘텐츠 요소의 푸터. 그러한 조상이 없으면 body 요소의 푸터이다. 푸터에는 일반적으로 해당 섹션의 작성자, 관련 문서로 연결되는 링크, 저작권 데이터 등과 같은 정보가 포함된다.
<article>
 <h1>Hard Trance is My Life</h1>
 <p>The album with the amusing punctuation has red artwork.</p>
 <footer>
  <p>Artists: DJ Steve Hill and Technikal</p>
 </footer>
</article>
4.3.12.1 article인가 section인가?

이 절은 비규범적이다.

section은 다른 무언가의 일부를 이룬다. article은 그 자체로 하나의 독립된 대상이다. 하지만 어느 것이 어느 것인지 어떻게 알 수 있을까? 대부분의 실제 답은 "작성자의 의도에 따라 다르다"이다.

예를 들어 "이 즙이 많고 초록색인 사과는 애플파이의 훌륭한 속재료가 된다."라고만 쓰인 "Granny Smith" 장이 있는 책을 상상할 수 있다. 다른 종류의 사과에 관한 다른 장이 많이 있을 것이므로 이는 section이 된다.

반면에 "Granny Smith. 이 즙이 많고 초록색인 사과는 애플파이의 훌륭한 속재료가 된다."라고만 쓰인 트윗, reddit 댓글, tumblr 게시물 또는 신문 분류 광고를 상상할 수도 있다. 그것이 전체 콘텐츠이므로 이는 article이 된다.

기사에 달린 댓글은 댓글을 다는 대상인 article의 일부가 아니므로 그 자체가 하나의 article이다.

4.4 콘텐츠 그룹화

4.4.1 p 요소

Element/p

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLParagraphElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
hgroup 요소의 자식으로.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
p 요소 바로 뒤에 address, article, aside, blockquote, details, dialog, div, dl, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, main, menu, nav, ol, p, pre, search, section, table 또는 ul 요소가 오면 종료 태그를 생략할 수 있다. 또는 부모 요소에 더 이상 콘텐츠가 없고 부모 요소가 a, audio, del, ins, map, noscript 또는 video 요소가 아닌 HTML 요소이거나 자율 사용자 정의 요소인 경우에도 생략할 수 있다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLParagraphElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

p 요소는 단락나타낸다.

단락은 일반적으로 시각적 미디어에서 빈 줄을 통해 인접한 블록과 물리적으로 분리된 텍스트 블록으로 나타내지만, 스타일시트 또는 사용자 에이전트가 인라인 단락 기호(¶)를 사용하는 것처럼 단락 구분을 다른 방식으로 표시하는 것도 마찬가지로 타당하다.

다음 예제는 적합한 HTML 조각이다:

<p>The little kitten gently seated herself on a piece of
carpet. Later in her life, this would be referred to as the time the
cat sat on the mat.</p>
<fieldset>
 <legend>Personal information</legend>
 <p>
   <label>Name: <input name="n"></label>
   <label><input name="anon" type="checkbox"> Hide from other users</label>
 </p>
 <p><label>Address: <textarea name="a"></textarea></label></p>
</fieldset>
<p>There was once an example from Femley,<br>
Whose markup was of dubious quality.<br>
The validator complained,<br>
So the author was pained,<br>
To move the error from the markup to the rhyming.</p>

더 구체적인 요소가 더 적절한 경우 p 요소를 사용하지 않는 것이 좋다.

다음 예제는 기술적으로 올바르다:

<section>
 <!-- ... -->
 <p>Last modified: 2001-04-23</p>
 <p>Author: fred@example.com</p>
</section>

그러나 다음과 같이 마크업하는 것이 더 좋다:

<section>
 <!-- ... -->
 <footer>Last modified: 2001-04-23</footer>
 <address>Author: fred@example.com</address>
</section>

또는:

<section>
 <!-- ... -->
 <footer>
  <p>Last modified: 2001-04-23</p>
  <address>Author: fred@example.com</address>
 </footer>
</section>

목록 요소(특히 olul 요소)는 p 요소의 자식이 될 수 없다. 따라서 문장에 글머리 기호 목록이 포함된 경우 이를 어떻게 마크업해야 하는지 궁금할 수 있다.

예를 들어 이 환상적인 문장에는 다음과 관련된 글머리 기호가 있다

그리고 아래에서 더 자세히 설명한다.

해결책은 HTML 용어에서 단락이 논리적 개념이 아니라 구조적 개념이라는 점을 이해하는 것이다. 위의 환상적인 예제에는 이 명세에서 정의한 단락이 실제로 다섯 개 있다. 목록 앞에 하나, 각 글머리 기호마다 하나씩, 목록 뒤에 하나가 있다.

따라서 위 예제의 마크업은 다음과 같이 작성할 수 있다:

<p>For instance, this fantastic sentence has bullets relating to</p>
<ul>
 <li>wizards,
 <li>faster-than-light travel, and
 <li>telepathy,
</ul>
<p>and is further discussed below.</p>

여러 개의 "구조적" 단락으로 구성된 이러한 "논리적" 단락을 편리하게 스타일링하려는 작성자는 p 요소 대신 div 요소를 사용할 수 있다.

따라서 예를 들어 위 예제는 다음과 같이 작성할 수 있다:

<div>For instance, this fantastic sentence has bullets relating to
<ul>
 <li>wizards,
 <li>faster-than-light travel, and
 <li>telepathy,
</ul>
and is further discussed below.</div>

이 예제에는 여전히 다섯 개의 구조적 단락이 있지만, 이제 작성자는 예제의 각 부분을 별도로 고려하지 않고 div만 스타일링할 수 있다.

4.4.2 hr 요소

Element/hr

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLHRElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
select 요소의 자손으로.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLHRElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

hr 요소가 나타내는 것은 단락 수준의 주제 구분, 예를 들어 이야기의 장면 전환이나 참고서의 한 섹션 안에서 다른 주제로의 전환이다. 또는 select 요소의 옵션 집합 사이에 있는 구분자를 나타낸다.

다음은 프로젝트 설명서의 가상 발췌문으로, 두 섹션에서 hr 요소를 사용하여 섹션 안의 주제를 구분하는 모습을 보여 준다.

<section>
 <h1>Communication</h1>
 <p>There are various methods of communication. This section
 covers a few of the important ones used by the project.</p>
 <hr>
 <p>Communication stones seem to come in pairs and have mysterious
 properties:</p>
 <ul>
  <li>They can transfer thoughts in two directions once activated
  if used alone.</li>
  <li>If used with another device, they can transfer one's
  consciousness to another body.</li>
  <li>If both stones are used with another device, the
  consciousnesses switch bodies.</li>
 </ul>
 <hr>
 <p>Radios use the electromagnetic spectrum in the meter range and
 longer.</p>
 <hr>
 <p>Signal flares use the electromagnetic spectrum in the
 nanometer range.</p>
</section>
<section>
 <h1>Food</h1>
 <p>All food at the project is rationed:</p>
 <dl>
  <dt>Potatoes</dt>
  <dd>Two per day</dd>
  <dt>Soup</dt>
  <dd>One bowl per day</dd>
 </dl>
 <hr>
 <p>Cooking is done by the chefs on a set rotation.</p>
</section>

섹션 자체 사이에는 hr 요소가 필요하지 않다. 이는 section 요소와 h1 요소 자체가 주제 변경을 암시하기 때문이다.

Peter F. Hamilton의 Pandora's Star에서 가져온 다음 발췌문은 장면 전환에 앞서는 두 단락과 그 뒤에 오는 단락을 보여 준다. 인쇄된 책에서는 두 번째 단락과 세 번째 단락 사이에 중앙에 별 하나가 놓인 공백으로 표현된 장면 전환을 여기서는 hr 요소를 사용하여 나타낸다.

<p>Dudley was ninety-two, in his second life, and fast approaching
time for another rejuvenation. Despite his body having the physical
age of a standard fifty-year-old, the prospect of a long degrading
campaign within academia was one he regarded with dread. For a
supposedly advanced civilization, the Intersolar Commonwealth could be
appallingly backward at times, not to mention cruel.</p>
<p><i>Maybe it won't be that bad</i>, he told himself. The lie was
comforting enough to get him through the rest of the night's
shift.</p>
<hr>
<p>The Carlton AllLander drove Dudley home just after dawn. Like the
astronomer, the vehicle was old and worn, but perfectly capable of
doing its job. It had a cheap diesel engine, common enough on a
semi-frontier world like Gralmond, although its drive array was a
thoroughly modern photoneural processor. With its high suspension and
deep-tread tyres it could plough along the dirt track to the
observatory in all weather and seasons, including the metre-deep snow
of Gralmond's winters.</p>

hr 요소는 문서의 개요에 영향을 주지 않는다.

4.4.3 pre 요소

Element/pre

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLPreElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLPreElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

pre 요소가 나타내는 것은 서식이 미리 지정된 텍스트 블록이며, 그 안의 구조는 요소가 아니라 타이포그래피 관례로 나타낸다.

HTML 구문에서 바로 뒤에 오는 pre 요소의 시작 태그 뒤의 선행 줄바꿈 문자는 제거된다.

pre 요소를 사용할 수 있는 경우의 예:

작성자는 음성 합성기, 점자 디스플레이 등의 사용자에게 발생하는 것처럼 서식이 사라질 때 서식이 미리 지정된 텍스트가 어떻게 경험될지 고려하는 것이 권장된다. ASCII 아트와 같은 경우에는 텍스트 설명과 같은 대체 표현이 문서의 독자에게 더 보편적으로 접근 가능할 가능성이 높다.

컴퓨터 코드 블록을 나타내려면 pre 요소를 code 요소와 함께 사용할 수 있으며, 컴퓨터 출력 블록을 나타내려면 pre 요소를 samp 요소와 함께 사용할 수 있다. 마찬가지로 kbd 요소는 사용할 수 있으며, pre 요소 안에서 사용자가 입력할 텍스트를 나타낸다.

이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.

다음 코드 조각에서는 컴퓨터 코드 예제가 제시된다.

<p>This is the <code>Panel</code> constructor:</p>
<pre><code>function Panel(element, canClose, closeHandler) {
  this.element = element;
  this.canClose = canClose;
  this.closeHandler = function () { if (closeHandler) closeHandler() };
}</code></pre>

다음 코드 조각에서는 sampkbd 요소가 pre 요소의 콘텐츠 안에서 함께 사용되어 Zork I 세션을 보여 준다.

<pre><samp>You are in an open field west of a big white house with a boarded
front door.
There is a small mailbox here.

></samp> <kbd>open mailbox</kbd>

<samp>Opening the mailbox reveals:
A leaflet.

></samp></pre>

다음은 pre 요소를 사용하여 시 자체의 본질적인 일부를 이루는 특이한 서식을 보존하는 현대시를 보여 준다.

<pre>                maxling

it is with a          heart
               heavy

that i admit loss of a feline
        so           loved

a friend lost to the
        unknown
                                (night)

~cdr 11dec07</pre>

4.4.4 blockquote 요소

Element/blockquote

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLQuoteElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
cite — 인용문 출처 또는 편집에 대한 추가 정보로 연결되는 링크
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본, 속성: cite.
DOM 인터페이스:
[Exposed=Window]
interface HTMLQuoteElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectURL] attribute USVString cite;
};

HTMLQuoteElement 인터페이스는 q 요소에서도 사용된다.

blockquote 요소는 다른 출처에서 인용한 섹션을 나타낸다.

blockquote 안의 콘텐츠는 다른 출처에서 인용해야 하며, 해당 출처에 주소가 있는 경우 그 주소를 cite 속성에 지정할 수 있다.

cite 속성이 있으면 그 값은 공백으로 둘러싸일 수 있는 유효한 URL이어야 한다. 대응하는 인용 링크를 얻으려면 속성 값을 요소의 노드 문서를 기준으로 구문 분석해야 한다. 사용자 에이전트는 사용자가 이러한 인용 링크를 따라가도록 허용할 수 있지만, 이 링크는 주로 독자가 아니라 비공개 용도 (예: 사이트의 인용문 사용에 관한 통계를 수집하는 서버 측 스크립트)를 위한 것이다.

blockquote의 콘텐츠는 축약하거나 텍스트 언어의 관례적인 방식으로 맥락을 추가할 수 있다.

예를 들어 영어에서는 전통적으로 대괄호를 사용한다. "Jane ate the cracker. She then said she liked apples and fish."라는 문장이 있는 페이지를 생각해 보자. 다음과 같이 인용할 수 있다:

<blockquote>
 <p>[Jane] then said she liked [...] fish.</p>
</blockquote>

인용문의 출처 표시는 있는 경우 blockquote 요소 밖에 배치해야 한다.

예를 들어 여기서는 인용문 뒤의 단락에 출처 표시가 제공된다:

<blockquote>
 <p>I contend that we are both atheists. I just believe in one fewer
 god than you do. When you understand why you dismiss all the other
 possible gods, you will understand why I dismiss yours.</p>
</blockquote>
<p>— Stephen Roberts</p>

아래의 다른 예제에서는 출처 표시를 나타내는 다른 방법을 보여 준다.

여기서는 blockquote 요소를 figure 요소 및 그 figcaption과 함께 사용하여 인용문과 출처 표시를 명확하게 연결한다. 출처 표시는 인용문의 일부가 아니므로 blockquote 자체 안에 속하지 않는다:

<figure>
 <blockquote>
  <p>The truth may be puzzling. It may take some work to grapple with.
  It may be counterintuitive. It may contradict deeply held
  prejudices. It may not be consonant with what we desperately want to
  be true. But our preferences do not determine what's true. We have a
  method, and that method helps us to reach not absolute truth, only
  asymptotic approaches to the truth — never there, just closer
  and closer, always finding vast new oceans of undiscovered
  possibilities. Cleverly designed experiments are the key.</p>
 </blockquote>
 <figcaption>Carl Sagan, in "<cite>Wonder and Skepticism</cite>", from
 the <cite>Skeptical Inquirer</cite> Volume 19, Issue 1 (January-February
 1995)</figcaption>
</figure>

다음 예제에서는 citeblockquote와 함께 사용하는 방법을 보여 준다:

<p>His next piece was the aptly named <cite>Sonnet 130</cite>:</p>
<blockquote cite="https://quotes.example.org/s/sonnet130.html">
  <p>My mistress' eyes are nothing like the sun,<br>
  Coral is far more red, than her lips red,<br>
  ...

이 예제에서는 포럼 게시물이 blockquote를 사용하여 사용자가 어떤 게시물에 답글을 작성하는지 보여 주는 방법을 설명한다. article 요소는 스레드 구조를 마크업하기 위해 각 게시물에 사용된다.

<article>
 <h1><a href="https://bacon.example.com/?blog=109431">Bacon on a crowbar</a></h1>
 <article>
  <header><strong>t3yw</strong> 12 points 1 hour ago</header>
  <p>I bet a narwhal would love that.</p>
  <footer><a href="?pid=29578">permalink</a></footer>
  <article>
   <header><strong>greg</strong> 8 points 1 hour ago</header>
   <blockquote><p>I bet a narwhal would love that.</p></blockquote>
   <p>Dude narwhals don't eat bacon.</p>
   <footer><a href="?pid=29579">permalink</a></footer>
   <article>
    <header><strong>t3yw</strong> 15 points 1 hour ago</header>
    <blockquote>
     <blockquote><p>I bet a narwhal would love that.</p></blockquote>
     <p>Dude narwhals don't eat bacon.</p>
    </blockquote>
    <p>Next thing you'll be saying they don't get capes and wizard
    hats either!</p>
    <footer><a href="?pid=29580">permalink</a></footer>
    <article>
     <article>
      <header><strong>boing</strong> -5 points 1 hour ago</header>
      <p>narwhals are worse than ceiling cat</p>
      <footer><a href="?pid=29581">permalink</a></footer>
     </article>
    </article>
   </article>
  </article>
  <article>
   <header><strong>fred</strong> 1 points 23 minutes ago</header>
   <blockquote><p>I bet a narwhal would love that.</p></blockquote>
   <p>I bet they'd love to peel a banana too.</p>
   <footer><a href="?pid=29582">permalink</a></footer>
  </article>
 </article>
</article>

이 예제에서는 짧은 코드 조각에 blockquote를 사용하는 방법을 보여 주며, p 요소를 blockquote 요소 안에서 반드시 사용할 필요는 없음을 보여 준다:

<p>He began his list of "lessons" with the following:</p>
<blockquote>One should never assume that his side of
the issue will be recognized, let alone that it will
be conceded to have merits.</blockquote>
<p>He continued with a number of similar points, ending with:</p>
<blockquote>Finally, one should be prepared for the threat
of breakdown in negotiations at any given moment and not
be cowed by the possibility.</blockquote>
<p>We shall now discuss these points...

뒤의 섹션에는 대화를 나타내는 방법의 예제가 제시되어 있으며, 이 목적으로 citeblockquote 요소를 사용하는 것은 적절하지 않다.

4.4.5 ol 요소

Element/ol

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLOListElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
요소의 자식에 하나 이상의 li 요소가 포함된 경우: 실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
0개 이상의 li스크립트 지원 요소.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
reversed — 목록의 번호를 역순으로 지정
start — 목록의 시작 값
type — 목록 마커의 종류
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본, 속성: reversed, start, type.
DOM 인터페이스:
[Exposed=Window]
interface HTMLOListElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute boolean reversed;
  [CEReactions, Reflect, ReflectDefault=1] attribute long start;
  [CEReactions, Reflect] attribute DOMString type;

  // also has obsolete members
};

ol 요소는 항목의 순서를 변경하면 문서의 의미가 바뀌도록 항목이 의도적으로 정렬된 목록을 나타낸다.

목록의 항목은 ol 요소의 li 요소 자식 노드이며, 트리 순서를 따른다.

Element/ol#attr-reversed

현재의 모든 엔진에서 지원된다.

Firefox18+Safari6+Chrome18+
Opera?Edge79+
Edge (Legacy)≤79+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

reversed 속성은 불리언 속성이다. 이 속성이 있으면 목록이 내림차순 목록 (..., 3, 2, 1)임을 나타낸다. 속성을 생략하면 목록은 오름차순 목록(1, 2, 3, ...)이다.

start 속성이 있으면 유효한 정수여야 한다. 이 속성은 목록의 시작 값을 결정하는 데 사용된다.

ol 요소에는 다음과 같이 결정되는 정수인 시작 값이 있다:

  1. ol 요소에 start 속성이 있으면:

    1. parsed속성 값을 정수로 구문 분석한 결과로 둔다.

    2. parsed가 오류가 아니면 parsed를 반환한다.

  2. ol 요소에 reversed 속성이 있으면 소유한 li 요소의 수를 반환한다.

  3. 1을 반환한다.

type 속성은 목록에서 사용할 마커의 종류가 중요한 경우(예: 항목을 번호나 문자로 참조하는 경우)에 이를 지정하는 데 사용할 수 있다. 이 속성을 지정하는 경우 다음 표의 행 가운데 첫 번째 셀에 제시된 문자 중 하나와 동일한 값이어야 한다. type 속성은 첫 번째 셀이 속성 값과 일치하는 행의 두 번째 열 셀에 제시된 상태를 나타낸다. 일치하는 셀이 없거나 속성을 생략한 경우 이 속성은 decimal 상태를 나타낸다.

키워드 상태 설명 값 1~3 및 3999~4001의 예
1 (U+0031) decimal 10진수 1. 2. 3. ... 3999. 4000. 4001. ...
a (U+0061) lower-alpha 라틴 소문자 a. b. c. ... ewu. ewv. eww. ...
A (U+0041) upper-alpha 라틴 대문자 A. B. C. ... EWU. EWV. EWW. ...
i (U+0069) lower-roman 로마 숫자 소문자 i. ii. iii. ... mmmcmxcix. i̅v̅. i̅v̅i. ...
I (U+0049) upper-roman 로마 숫자 대문자 I. II. III. ... MMMCMXCIX. I̅V̅. I̅V̅I. ...

사용자 에이전트는 ol 요소의 type 속성 상태와 일치하는 방식으로 목록의 항목을 렌더링해야 한다. 0 이하의 숫자는 type 속성과 관계없이 항상 10진법을 사용해야 한다.

CSS 사용자 에이전트의 경우 이 속성을 'list-style-type' CSS 속성에 매핑하는 방법이 렌더링 섹션에 제시되어 있다. 이 매핑은 단순하며 위의 상태는 대응하는 CSS 값과 같은 이름을 가진다.

CSS 사용자 에이전트에서 이 속성을 구현하는 데 사용하는 기본 CSS 목록 스타일을 다시 정의할 수 있으며, 이렇게 하면 목록 항목의 렌더링 방식에 영향을 준다.

[ReflectDefault]로 인해 start IDL 속성은 start 콘텐츠 속성이 생략되고 reversed 콘텐츠 속성이 지정된 경우 목록의 시작 값과 반드시 일치하지는 않는다.

다음 마크업은 순서가 중요하여 ol 요소가 적절한 목록을 보여 준다. 동일한 항목에 ul 요소를 사용하는 예를 보려면 이 목록을 ul 섹션의 동등한 목록과 비교하라.

<p>I have lived in the following countries (given in the order of when
I first lived there):</p>
<ol>
 <li>Switzerland
 <li>United Kingdom
 <li>United States
 <li>Norway
</ol>

목록의 순서를 변경하면 문서의 의미가 어떻게 달라지는지 주목하라. 다음 예제에서는 처음 두 항목의 상대적인 순서를 변경하여 작성자의 출생지가 바뀌었다:

<p>I have lived in the following countries (given in the order of when
I first lived there):</p>
<ol>
 <li>United Kingdom
 <li>Switzerland
 <li>United States
 <li>Norway
</ol>

4.4.6 ul 요소

Element/ul

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLUListElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
요소의 자식에 하나 이상의 li 요소가 포함된 경우: 실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
0개 이상의 li스크립트 지원 요소.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLUListElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

ul 요소는 항목의 순서가 중요하지 않은 목록, 즉 순서를 변경해도 문서의 의미가 실질적으로 바뀌지 않는 목록을 나타낸다.

목록의 항목은 ul 요소의 li 요소 자식 노드이다.

다음 마크업은 순서가 중요하지 않아 ul 요소가 적절한 목록을 보여 준다. 동일한 항목에 ol 요소를 사용하는 예를 보려면 이 목록을 ol 섹션의 동등한 목록과 비교하라.

<p>I have lived in the following countries:</p>
<ul>
 <li>Norway
 <li>Switzerland
 <li>United Kingdom
 <li>United States
</ul>

목록의 순서를 변경해도 문서의 의미가 달라지지 않는다는 점에 주목하라. 위 코드 조각의 항목은 알파벳순으로 제시되어 있지만, 아래 코드 조각에서는 문서의 의미를 전혀 바꾸지 않고 2007년 당시 계좌 잔액의 크기순으로 제시한다:

<p>I have lived in the following countries:</p>
<ul>
 <li>Switzerland
 <li>Norway
 <li>United Kingdom
 <li>United States
</ul>

4.4.7 menu 요소

Element/menu

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLMenuElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
요소의 자식에 하나 이상의 li 요소가 포함된 경우: 실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
0개 이상의 li스크립트 지원 요소.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLMenuElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

menu 요소는 콘텐츠로 구성된 도구 모음을 나타낸다. 콘텐츠는 항목의 순서 없는 목록(li 요소로 나타냄) 형식이며, 각 항목은 사용자가 수행하거나 활성화할 수 있는 명령을 나타낸다.

menu 요소는 명령의 순서 없는 목록("도구 모음")을 표현하기 위한 ul의 의미론적 대안일 뿐이다.

이 예제에서 텍스트 편집 애플리케이션은 menu 요소를 사용하여 일련의 편집 명령을 제공한다:

<menu>
 <li><button onclick="copy()"><img src="copy.svg" alt="Copy"></button></li>
 <li><button onclick="cut()"><img src="cut.svg" alt="Cut"></button></li>
 <li><button onclick="paste()"><img src="paste.svg" alt="Paste"></button></li>
</menu>

이를 일반적인 도구 모음 메뉴처럼 보이게 하는 스타일링은 애플리케이션이 담당한다는 점에 주목하라.

4.4.8 li 요소

Element/li

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLLIElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
없음.
이 요소를 사용할 수 있는 맥락:
ol 요소 내부.
ul 요소 내부.
menu 요소 내부.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
li 요소 바로 뒤에 다른 li 요소가 오거나 부모 요소에 더 이상의 콘텐츠가 없으면 li 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
요소가 ul 또는 menu 요소의 자식이 아닌 경우: value — 목록 항목의 서수 값
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본, 속성: value.
DOM 인터페이스:
[Exposed=Window]
interface HTMLLIElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute long value;

  // also has obsolete members
};

li 요소는 목록 항목을 나타낸다. 부모 요소가 ol, ul 또는 menu 요소이면 이 요소는 해당 요소에 정의된 부모 요소 목록의 항목이다. 그렇지 않으면 목록 항목에는 다른 li 요소와의 목록 관련 관계가 정의되지 않는다.

value 속성이 있으면 유효한 정수여야 한다. 이 속성은 li목록 소유자ol 요소인 경우 목록 항목의 서수 값을 결정하는 데 사용된다.


'display'계산 값이 'list-item'인 모든 요소에는 다음과 같이 결정되는 목록 소유자가 있다:

  1. 요소가 렌더링 중이 아니면 null을 반환한다. 요소에는 목록 소유자가 없다.

  2. ancestor를 요소의 부모로 둔다.

  3. 요소에 ol, ul 또는 menu 조상이 있으면 ancestor를 그중 가장 가까운 조상 요소로 설정한다.

  4. ancestor의 포괄 조상 중 CSS 박스를 생성하는 가장 가까운 조상을 반환한다.

    최소한 문서 요소는 항상 CSS 박스를 생성하므로 이러한 요소는 항상 존재한다.

주어진 목록 소유자 owner가 소유한 각 요소의 서수 값을 결정하려면 다음 단계를 수행한다:

  1. i를 1로 둔다.

  2. ownerol 요소이면 numberingowner시작 값으로 둔다. 그렇지 않으면 numbering을 1로 둔다.

  3. 반복: iowner가 소유한 목록 항목의 수보다 크면 반환한다. owner소유한 모든 목록 항목서수 값이 할당되었다.

  4. item트리 순서에서 owner소유한 목록 항목i번째 항목으로 둔다.

  5. itemli 요소이고 value 속성이 있으면:

    1. parsed속성 값을 정수로 구문 분석한 결과로 둔다.

    2. parsed가 오류가 아니면 numberingparsed로 설정한다.

  6. item서수 값numbering이다.

  7. ownerol 요소이고 ownerreversed 속성이 있으면 numbering을 1만큼 감소시킨다. 그렇지 않으면 numbering을 1만큼 증가시킨다.

  8. i를 1만큼 증가시킨다.

  9. 반복이라고 표시된 단계로 이동한다.


요소의 value IDL 속성은 요소의 서수 값과 직접 대응하지 않는다. 단지 콘텐츠 속성을 반영할 뿐이다. 예를 들어 다음 목록이 있다고 하자:

<ol>
 <li>Item 1
 <li value="3">Item 3
 <li>Item 4
</ol>

서수 값은 1, 3, 4인 반면 value IDL 속성은 가져올 때 0, 3, 0을 반환한다.

다음 예제에서는 상위 10개 영화를 역순으로 나열한다. figure 요소와 그 figcaption 요소를 사용하여 목록에 제목을 부여하는 방식에 주목하라.

<figure>
 <figcaption>The top 10 movies of all time</figcaption>
 <ol>
  <li value="10"><cite>Josie and the Pussycats</cite>, 2001</li>
  <li value="9"><cite lang="sh">Црна мачка, бели мачор</cite>, 1998</li>
  <li value="8"><cite>A Bug's Life</cite>, 1998</li>
  <li value="7"><cite>Toy Story</cite>, 1995</li>
  <li value="6"><cite>Monsters, Inc</cite>, 2001</li>
  <li value="5"><cite>Cars</cite>, 2006</li>
  <li value="4"><cite>Toy Story 2</cite>, 1999</li>
  <li value="3"><cite>Finding Nemo</cite>, 2003</li>
  <li value="2"><cite>The Incredibles</cite>, 2004</li>
  <li value="1"><cite>Ratatouille</cite>, 2007</li>
 </ol>
</figure>

ol 요소에 reversed 속성을 사용하여 다음과 같이 마크업할 수도 있다:

<figure>
 <figcaption>The top 10 movies of all time</figcaption>
 <ol reversed>
  <li><cite>Josie and the Pussycats</cite>, 2001</li>
  <li><cite lang="sh">Црна мачка, бели мачор</cite>, 1998</li>
  <li><cite>A Bug's Life</cite>, 1998</li>
  <li><cite>Toy Story</cite>, 1995</li>
  <li><cite>Monsters, Inc</cite>, 2001</li>
  <li><cite>Cars</cite>, 2006</li>
  <li><cite>Toy Story 2</cite>, 1999</li>
  <li><cite>Finding Nemo</cite>, 2003</li>
  <li><cite>The Incredibles</cite>, 2004</li>
  <li><cite>Ratatouille</cite>, 2007</li>
 </ol>
</figure>

li 요소 안에 제목 요소(예: h1)를 포함하는 것은 적합하지만, 작성자가 의도한 의미 체계를 전달하지 못할 가능성이 높다. 제목은 새 섹션을 시작하므로 목록 안의 제목은 암시적으로 목록을 여러 섹션에 걸치도록 분할한다.

4.4.9 dl 요소

Element/dl

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLDListElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
요소의 자식에 하나 이상의 이름-값 그룹이 포함된 경우: 실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
다음 중 하나: 하나 이상의 dt 요소 뒤에 하나 이상의 dd 요소가 오는 그룹 0개 이상. 선택적으로 스크립트 지원 요소를 중간에 섞을 수 있다.
또는: 하나 이상의 div 요소. 선택적으로 스크립트 지원 요소를 중간에 섞을 수 있다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLDListElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

dl 요소는 0개 이상의 이름-값 그룹으로 구성된 연관 목록(설명 목록)을 나타낸다. 이름-값 그룹은 하나 이상의 이름(dt 요소, div 요소 자식의 자식일 수 있음) 뒤에 하나 이상의 값(dd 요소, div 요소 자식의 자식일 수 있음)이 오는 형식이다. 이때 dtdd 요소 자식과 div 요소 자식의 자식인 dtdd 요소를 제외한 노드는 무시한다. 하나의 dl 요소 안에는 각 이름마다 하나를 초과하는 dt 요소가 없어야 한다.

이름-값 그룹은 용어와 정의, 메타데이터 주제와 값, 질문과 답변 또는 다른 모든 이름-값 데이터 그룹일 수 있다.

그룹 안의 값은 대안 관계이다. 같은 값의 일부를 구성하는 여러 단락은 모두 같은 dd 요소 안에 제공해야 한다.

그룹 목록의 순서와 각 그룹 안의 이름 및 값의 순서는 중요할 수 있다.

그룹에 마이크로데이터 속성이나 전체 그룹에 적용되는 기타 전역 속성을 주석으로 추가하거나 단순히 스타일링하기 위해 dl 요소의 각 그룹을 div 요소로 감쌀 수 있다. 이는 dl 요소의 의미 체계를 변경하지 않는다.

dl 요소 dl의 이름-값 그룹은 다음 알고리즘을 사용하여 결정한다. 이름-값 그룹에는 이름(초기에는 비어 있는 dt 요소의 목록)과 값(초기에는 비어 있는 dd 요소의 목록)이 있다.

  1. groups를 이름-값 그룹의 빈 목록으로 둔다.

  2. current를 새 이름-값 그룹으로 둔다.

  3. seenDd를 false로 둔다.

  4. childdl첫 번째 자식으로 둔다.

  5. grandchild를 null로 둔다.

  6. child가 null이 아닌 동안:

    1. childdiv 요소이면:

      1. grandchildchild첫 번째 자식으로 둔다.

      2. grandchild가 null이 아닌 동안:

        1. grandchild에 대해 dt 또는 dd 처리를 수행한다.

        2. grandchildgrandchild다음 형제로 설정한다.

    2. 그렇지 않으면 child에 대해 dt 또는 dd 처리를 수행한다.

    3. childchild다음 형제로 설정한다.

  7. current가 비어 있지 않으면 currentgroups에 추가한다.

  8. groups를 반환한다.

노드 node에 대해 dt 또는 dd를 처리한다는 것은 다음 단계를 수행하는 것을 의미한다:

  1. groups, currentseenDd를 이 단계를 호출한 알고리즘에서 같은 이름을 가진 변수와 동일한 변수로 둔다.

  2. nodedt 요소이면:

    1. seenDd가 true이면 currentgroups에 추가하고, current를 새 이름-값 그룹으로 설정한 다음 seenDd를 false로 설정한다.

    2. nodecurrent의 이름에 추가한다.

  3. 그렇지 않고 nodedd 요소이면 nodecurrent의 값에 추가하고 seenDd를 true로 설정한다.

이름-값 그룹의 이름 또는 값이 빈 목록이면 대개 dd 요소를 dt 요소 대신 사용하거나 그 반대로 잘못 사용했기 때문이다. 적합성 검사기는 이러한 실수를 찾아내고 작성자에게 마크업을 올바르게 사용하는 방법을 안내할 수 있다.

다음 예제에서는 하나의 항목("Authors")이 두 값("John"과 "Luke")에 연결되어 있다.

<dl>
 <dt> Authors
 <dd> John
 <dd> Luke
 <dt> Editor
 <dd> Frank
</dl>

다음 예제에서는 하나의 정의가 두 용어에 연결되어 있다.

<dl>
 <dt lang="en-US"> <dfn>color</dfn> </dt>
 <dt lang="en-GB"> <dfn>colour</dfn> </dt>
 <dd> A sensation which (in humans) derives from the ability of
 the fine structure of the eye to distinguish three differently
 filtered analyses of a view. </dd>
</dl>

다음 예제는 dl 요소를 사용하여 일종의 메타데이터를 마크업하는 방법을 보여 준다. 예제의 마지막에는 하나의 그룹에 두 메타데이터 레이블 ("Authors"와 "Editors")과 두 값("Robert Rothman"과 "Daniel Jackson")이 있다. 이 예제에서는 스타일링을 돕기 위해 dtdd 요소 그룹 주위에 div 요소도 사용한다.

<dl>
 <div>
  <dt> Last modified time </dt>
  <dd> 2004-12-23T23:33Z </dd>
 </div>
 <div>
  <dt> Recommended update interval </dt>
  <dd> 60s </dd>
 </div>
 <div>
  <dt> Authors </dt>
  <dt> Editors </dt>
  <dd> Robert Rothman </dd>
  <dd> Daniel Jackson </dd>
 </div>
</dl>

다음 예제는 dl 요소를 사용하여 일련의 지침을 제공하는 방법을 보여 준다. 여기서는 지침의 순서가 중요하다. 다른 예제에서는 블록의 순서가 중요하지 않았다.

<p>Determine the victory points as follows (use the
first matching case):</p>
<dl>
 <dt> If you have exactly five gold coins </dt>
 <dd> You get five victory points </dd>
 <dt> If you have one or more gold coins, and you have one or more silver coins </dt>
 <dd> You get two victory points </dd>
 <dt> If you have one or more silver coins </dt>
 <dd> You get one victory point </dd>
 <dt> Otherwise </dt>
 <dd> You get no victory points </dd>
</dl>

다음 코드 조각은 dl 요소를 용어집으로 사용하는 방법을 보여 준다. 정의되는 단어를 나타내기 위해 dfn을 사용하는 점에 주목하라.

<dl>
 <dt><dfn>Apartment</dfn>, n.</dt>
 <dd>An execution context grouping one or more threads with one or
 more COM objects.</dd>
 <dt><dfn>Flat</dfn>, n.</dt>
 <dd>A deflated tire.</dd>
 <dt><dfn>Home</dfn>, n.</dt>
 <dd>The user's login directory.</dd>
</dl>

이 예제는 dl 요소에서 마이크로데이터 속성과 div 요소를 함께 사용하여 프랑스 레스토랑의 아이스크림 디저트에 주석을 추가한다.

<dl>
 <div itemscope itemtype="http://schema.org/Product">
  <dt itemprop="name">Café ou Chocolat Liégeois
  <dd itemprop="offers" itemscope itemtype="http://schema.org/Offer">
   <span itemprop="price">3.50</span>
   <data itemprop="priceCurrency" value="EUR"></data>
  <dd itemprop="description">
   2 boules Café ou Chocolat, 1 boule Vanille, sauce café ou chocolat, chantilly
 </div>

 <div itemscope itemtype="http://schema.org/Product">
  <dt itemprop="name">Américaine
  <dd itemprop="offers" itemscope itemtype="http://schema.org/Offer">
   <span itemprop="price">3.50</span>
   <data itemprop="priceCurrency" value="EUR"></data>
  <dd itemprop="description">
   1 boule Crème brûlée, 1 boule Vanille, 1 boule Caramel, chantilly
 </div>
</dl>

div 요소가 없으면 다음과 같이 itemref 속성을 사용하여 dd 요소의 데이터를 항목과 연결해야 한다.

<dl>
 <dt itemscope itemtype="http://schema.org/Product" itemref="1-offer 1-description">
  <span itemprop="name">Café ou Chocolat Liégeois</span>
 <dd id="1-offer" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
  <span itemprop="price">3.50</span>
  <data itemprop="priceCurrency" value="EUR"></data>
 <dd id="1-description" itemprop="description">
  2 boules Café ou Chocolat, 1 boule Vanille, sauce café ou chocolat, chantilly

 <dt itemscope itemtype="http://schema.org/Product" itemref="2-offer 2-description">
  <span itemprop="name">Américaine</span>
 <dd id="2-offer" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
  <span itemprop="price">3.50</span>
  <data itemprop="priceCurrency" value="EUR"></data>
 <dd id="2-description" itemprop="description">
  1 boule Crème brûlée, 1 boule Vanille, 1 boule Caramel, chantilly
</dl>

dl 요소는 대화를 마크업하는 데 적절하지 않다. 대화를 마크업하는 방법의 예제를 참조하라.

4.4.10 dt 요소

Element/dt

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
없음.
이 요소를 사용할 수 있는 맥락:
dl 요소 안의 dd 또는 dt 요소 앞.
dl 요소의 자식인 div 요소 안의 dd 또는 dt 요소 앞.
콘텐츠 모델:
플로 콘텐츠. 단, header, footer, 섹셔닝 콘텐츠 또는 제목 콘텐츠 자손은 없어야 한다.
text/html에서의 태그 생략:
dt 요소 바로 뒤에 다른 dt 요소 또는 dd 요소가 오면 dt 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

dt 요소는 설명 목록(dl 요소)에 있는 용어-설명 그룹의 용어 또는 이름 부분을 나타낸다.

dt 요소 자체는 dl 요소에서 사용될 때 그 콘텐츠가 정의되는 용어임을 나타내지 않지만, 이는 dfn 요소를 사용하여 나타낼 수 있다.

이 예제는 질문에는 dt 요소를 사용하고 답변에는 dd 요소를 사용하여 마크업한 자주 묻는 질문(FAQ) 목록을 보여 준다.

<article>
 <h1>FAQ</h1>
 <dl>
  <dt>What do we want?</dt>
  <dd>Our data.</dd>
  <dt>When do we want it?</dt>
  <dd>Now.</dd>
  <dt>Where is it?</dt>
  <dd>We are not sure.</dd>
 </dl>
</article>

4.4.11 dd 요소

Element/dd

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
없음.
이 요소를 사용할 수 있는 맥락:
dl 요소 안의 dt 또는 dd 요소 뒤.
dl 요소의 자식인 div 요소 안의 dt 또는 dd 요소 뒤.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
dd 요소 바로 뒤에 다른 dd 요소 또는 dt 요소가 오거나 부모 요소에 더 이상의 콘텐츠가 없으면 dd 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

dd 요소는 설명 목록(dl 요소)에 있는 용어-설명 그룹의 설명, 정의 또는 값 부분을 나타낸다.

dl은 사전처럼 어휘 목록을 정의하는 데 사용할 수 있다. 다음 예제에서 dfn을 포함한 dt로 제공되는 각 항목에는 정의의 여러 부분을 보여 주는 여러 dd가 있다.

<dl>
 <dt><dfn>happiness</dfn></dt>
 <dd class="pronunciation">/ˈhæpinəs/</dd>
 <dd class="part-of-speech"><i><abbr>n.</abbr></i></dd>
 <dd>The state of being happy.</dd>
 <dd>Good fortune; success. <q>Oh <b>happiness</b>! It worked!</q></dd>
 <dt><dfn>rejoice</dfn></dt>
 <dd class="pronunciation">/rɪˈdʒɔɪs/</dd>
 <dd><i class="part-of-speech"><abbr>v.intr.</abbr></i> To be delighted oneself.</dd>
 <dd><i class="part-of-speech"><abbr>v.tr.</abbr></i> To cause one to be delighted.</dd>
</dl>

4.4.12 figure 요소

Element/figure

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5.1+Chrome8+
Opera11+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11+
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
다음 중 하나: 하나의 figcaption 요소 뒤에 플로 콘텐츠.
또는: 플로 콘텐츠 뒤에 하나의 figcaption 요소.
또는: 플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

figure 요소는 선택적으로 캡션을 포함하며 자체적으로 완결된(완전한 문장과 같은) 일부 플로 콘텐츠나타낸다. 일반적으로 문서의 주요 흐름에서 하나의 단위로 참조된다.

이 맥락에서 "자체적으로 완결된"은 반드시 독립적이라는 의미는 아니다. 예를 들어 단락의 각 문장은 자체적으로 완결되어 있다. 문장의 일부인 이미지는 figure에 적절하지 않지만, 이미지로 구성된 전체 문장은 적절하다.

따라서 이 요소는 삽화, 다이어그램, 사진, 코드 목록 등에 주석을 달기 위해 사용할 수 있다.

figure를 캡션(예: 그림 번호)으로 식별하여 문서의 주요 콘텐츠에서 참조하면, 문서의 흐름에 영향을 주지 않고 해당 콘텐츠를 주요 콘텐츠에서 멀리, 예를 들어 페이지 옆, 전용 페이지 또는 부록으로 쉽게 이동할 수 있다.

figure 요소를 상대적 위치로 참조하는 경우, 예를 들어 "위 사진에서" 또는 "다음 그림에서 보듯이"라고 하면 그림을 이동할 때 페이지의 의미가 손상된다. 작성자는 페이지의 의미에 영향을 주지 않고 쉽게 스타일을 다시 지정할 수 있도록 이러한 상대적 참조 대신 레이블을 사용하여 그림을 참조하는 것을 고려하는 것이 권장된다.

요소의 첫 번째 figcaption 요소 자식이 있으면 해당 요소는 figure 요소 콘텐츠의 캡션을 나타낸다. 자식 figcaption 요소가 없으면 캡션도 없다.

figure 요소의 콘텐츠는 주변 흐름의 일부이다. 이미지 공유 사이트의 사진처럼 페이지의 목적이 그림을 표시하는 것이라면 figurefigcaption 요소를 사용하여 해당 그림의 캡션을 명시적으로 제공할 수 있다. 주변 흐름과 간접적으로만 관련되거나 주변 흐름과 별개의 목적을 제공하는 콘텐츠에는 aside 요소를 사용해야 하며, 이 요소 자체가 figure를 감쌀 수 있다. 예를 들어 article의 콘텐츠를 반복하는 강조 인용문은 콘텐츠의 일부가 아니라 독자의 관심을 끌거나 핵심 주제를 강조하기 위해 콘텐츠를 반복하는 것이므로 figure보다 aside에 배치하는 것이 더 적절하다.

이 예제는 figure 요소를 사용하여 코드 목록을 마크업하는 방법을 보여 준다.

<p>In <a href="#l4">listing 4</a> we see the primary core interface
API declaration.</p>
<figure id="l4">
 <figcaption>Listing 4. The primary core interface API declaration.</figcaption>
 <pre><code>interface PrimaryCore {
 boolean verifyDataLine();
 undefined sendData(sequence&lt;byte> data);
 undefined initSelfDestruct();
}</code></pre>
</figure>
<p>The API is designed to use UTF-8.</p>

여기서는 페이지의 주요 콘텐츠인 사진을 갤러리에서처럼 마크업하기 위한 figure 요소를 보여 준다.

<!DOCTYPE HTML>
<html lang="en">
<title>Bubbles at work — My Gallery™</title>
<figure>
 <img src="bubbles-work.jpeg"
      alt="Bubbles, sitting in his office chair, works on his
           latest project intently.">
 <figcaption>Bubbles at work</figcaption>
</figure>
<nav><a href="19414.html">Prev</a><a href="19416.html">Next</a></nav>

이 예제에서는 그림이 아닌 이미지와 그림인 이미지 및 비디오를 함께 보여 준다. 첫 번째 이미지는 문자 그대로 예제의 두 번째 문장의 일부이므로 자체적으로 완결된 단위가 아니며, 따라서 figure는 적절하지 않다.

<h2>Malinko's comics</h2>

<p>This case centered on some sort of "intellectual property"
infringement related to a comic (see Exhibit A). The suit started
after a trailer ending with these words:

<blockquote>
 <img src="promblem-packed-action.png" alt="ROUGH COPY! Promblem-Packed Action!">
</blockquote>

<p>...was aired. A lawyer, armed with a Bigger Notebook, launched a
preemptive strike using snowballs. A complete copy of the trailer is
included with Exhibit B.

<figure>
 <img src="ex-a.png" alt="Two squiggles on a dirty piece of paper.">
 <figcaption>Exhibit A. The alleged <cite>rough copy</cite> comic.</figcaption>
</figure>

<figure>
 <video src="ex-b.mov"></video>
 <figcaption>Exhibit B. The <cite>Rough Copy</cite> trailer.</figcaption>
</figure>

<p>The case was resolved out of court.

여기서는 시의 일부를 figure를 사용하여 마크업한다.

<figure>
 <p>'Twas brillig, and the slithy toves<br>
 Did gyre and gimble in the wabe;<br>
 All mimsy were the borogoves,<br>
 And the mome raths outgrabe.</p>
 <figcaption><cite>Jabberwocky</cite> (first verse). Lewis Carroll, 1832-98</figcaption>
</figure>

성에 관해 논의하는 훨씬 더 큰 저작의 일부일 수 있는 이 예제에서는 중첩된 figure 요소를 사용하여 그룹 캡션과 그룹 내 각 그림의 개별 캡션을 모두 제공한다:

<figure>
 <figcaption>The castle through the ages: 1423, 1858, and 1999 respectively.</figcaption>
 <figure>
  <figcaption>Etching. Anonymous, ca. 1423.</figcaption>
  <img src="castle1423.jpeg" alt="The castle has one tower, and a tall wall around it.">
 </figure>
 <figure>
  <figcaption>Oil-based paint on canvas. Maria Towle, 1858.</figcaption>
  <img src="castle1858.jpeg" alt="The castle now has two towers and two walls.">
 </figure>
 <figure>
  <figcaption>Film photograph. Peter Jankle, 1999.</figcaption>
  <img src="castle1999.jpeg" alt="The castle lies in ruins, the original tower all that remains in one piece.">
 </figure>
</figure>

앞의 예제는 다음과 같이 더 간결하게 작성할 수도 있다. 중첩된 figure/figcaption 쌍 대신 title 속성을 사용한다:

<figure>
 <img src="castle1423.jpeg" title="Etching. Anonymous, ca. 1423."
      alt="The castle has one tower, and a tall wall around it.">
 <img src="castle1858.jpeg" title="Oil-based paint on canvas. Maria Towle, 1858."
      alt="The castle now has two towers and two walls.">
 <img src="castle1999.jpeg" title="Film photograph. Peter Jankle, 1999."
      alt="The castle lies in ruins, the original tower all that remains in one piece.">
 <figcaption>The castle through the ages: 1423, 1858, and 1999 respectively.</figcaption>
</figure>

그림은 때때로 콘텐츠에서 암시적으로만 참조된다:

<article>
 <h1>Fiscal negotiations stumble in Congress as deadline nears</h1>
 <figure>
  <img src="obama-reid.jpeg" alt="Obama and Reid sit together smiling in the Oval Office.">
  <figcaption>Barack Obama and Harry Reid. White House press photograph.</figcaption>
 </figure>
 <p>Negotiations in Congress to end the fiscal impasse sputtered on Tuesday, leaving both chambers
 grasping for a way to reopen the government and raise the country's borrowing authority with a
 Thursday deadline drawing near.</p>
 ...
</article>

4.4.13 figcaption 요소

Element/figcaption

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5.1+Chrome8+
Opera11+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android11+
범주:
없음.
이 요소를 사용할 수 있는 맥락:
figure 요소의 첫 번째 또는 마지막 자식.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

figcaption 요소는 부모 figure 요소가 있는 경우 그 요소에서 나머지 콘텐츠를 설명하는 캡션 또는 범례를 나타낸다.

이 요소에는 출처에 관한 추가 정보를 포함할 수 있다:

<figcaption>
 <p>A duck.</p>
 <p><small>Photograph courtesy of 🌟 News.</small></p>
</figcaption>
<figcaption>
 <p>Average rent for 3-room apartments, excluding non-profit apartments</p>
 <p>Zürich’s Statistics Office — <time datetime=2017-11-14>14 November 2017</time></p>
</figcaption>

4.4.14 main 요소

Element/main

현재의 모든 엔진에서 지원된다.

Firefox21+Safari7+Chrome26+
Opera16+Edge79+
Edge (Legacy)12+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳. 단, 계층적으로 올바른 main 요소인 경우에만 해당한다.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

main 요소는 문서의 주요 콘텐츠를 나타낸다.

문서에는 hidden 속성이 지정되지 않은 main 요소가 둘 이상 있어서는 안 된다.

계층적으로 올바른 main 요소는 조상 요소가 html, body, div, 접근 가능한 이름이 없는 form자율 사용자 정의 요소로 제한되는 요소이다. 각 main 요소는 계층적으로 올바른 main 요소여야 한다.

이 예제에서 작성자는 페이지의 각 구성 요소가 상자 안에 렌더링되는 표현 방식을 사용했다. 헤더, 푸터, 내비게이션 바 및 사이드바와 구별하여 페이지의 주요 콘텐츠를 감싸기 위해 main 요소를 사용한다.

<!DOCTYPE html>
<html lang="en">
<title>RPG System 17</title>
<style>
 header, nav, aside, main, footer {
   margin: 0.5em; border: thin solid; padding: 0.5em;
   background: #EFF; color: black; box-shadow: 0 0 0.25em #033;
 }
 h1, h2, p { margin: 0; }
 nav, main { float: left; }
 aside { float: right; }
 footer { clear: both; }
</style>
<header>
 <h1>System Eighteen</h1>
</header>
<nav>
 <a href="../16/">← System 17</a>
 <a href="../18/">RPXIX →</a>
</nav>
<aside>
 <p>This system has no HP mechanic, so there's no healing.
</aside>
<main>
 <h2>Character creation</h2>
 <p>Attributes (magic, strength, agility) are purchased at the cost of one point per level.</p>
 <h2>Rolls</h2>
 <p>Each encounter, roll the dice for all your skills. If you roll more than the opponent, you win.</p>
</main>
<footer>
 <p>Copyright © 2013
</footer>
</html>

다음 예제에서는 여러 main 요소를 사용하고, 서버 왕복 없이 내비게이션이 작동하도록 스크립트를 사용하며 현재 항목이 아닌 요소에는 hidden 속성을 설정한다:

<!doctype html>
<html lang=en-CA>
<meta charset=utf-8>
<title></title>
<link rel=stylesheet href=spa.css>
<script src=spa.js async></script>
<nav>
 <a href=/>Home</a>
 <a href=/about>About</a>
 <a href=/contact>Contact</a>
</nav>
<main>
 <h1>Home</h1></main>
<main hidden>
 <h1>About</h1></main>
<main hidden>
 <h1>Contact</h1></main>
<footer>Made with ❤️ by <a href=https://example.com/>Example 👻</a>.</footer>

4.4.15 search 요소

Element/search

현재 엔진에서는 지원되지 않는다.

Firefox아니요Safari아니요Chrome아니요
Opera아니요Edge아니요
Edge (Legacy)아니요Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android아니요WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
콘텐츠 모델:
플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

search 요소는 검색 또는 필터링 작업 수행과 관련된 일련의 폼 컨트롤이나 기타 콘텐츠를 포함하는 문서 또는 애플리케이션의 일부를 나타낸다. 이는 웹 사이트나 애플리케이션 검색, 현재 웹 페이지에서 검색 결과를 검색하거나 필터링하는 방법 또는 전역이나 인터넷 전체를 대상으로 하는 검색 기능일 수 있다.

검색 결과를 표시하기 위해서만 search 요소를 사용하는 것은 적절하지 않다. 다만 "빠른 검색" 결과의 일부인 제안과 링크는 검색 기능의 일부로 포함할 수 있다. 대신 반환된 검색 결과 웹 페이지는 해당 웹 페이지의 주요 콘텐츠 일부로 표시되어야 한다.

다음 예제에서 작성자는 웹 페이지의 header 안에 검색 폼을 포함한다:

<header>
  <h1><a href="/">My fancy blog</a></h1>
  ...
  <search>
    <form action="search.php">
      <label for="query">Find an article</label>
      <input id="query" name="q" type="search">
      <button type="submit">Go!</button>
    </form>
  </search>
</header>

이 예제에서 작성자는 웹 애플리케이션의 검색 기능을 전적으로 JavaScript로 구현했다. 서버 측 제출을 수행하기 위해 form 요소를 사용하지 않지만, 이를 포함하는 search 요소는 자손 콘텐츠가 검색 기능을 나타낸다는 목적을 의미론적으로 식별한다.

<search>
  <label>
    Find and filter your query
    <input type="search" id="query">
  </label>
  <label>
    <input type="checkbox" id="exact-only">
    Exact matches only
  </label>

  <section>
    <h3>Results found:</h3>
    <ul id="results">
      <li>
        <p><a href="services/consulting">Consulting services</a></p>
        <p>
          Find out how can we help you improve your business with our integrated consultants, Bob and Bob.
        </p>
      </li>
      ...
    </ul>
    <!--
      when a query returns or filters out all results
      render the no results message here
    -->
    <output id="no-results"></output>
  </section>
</search>

다음 예제에서 페이지에는 두 가지 검색 기능이 있다. 첫 번째 기능은 웹 페이지의 header에 있으며 웹 사이트의 콘텐츠를 검색하는 전역 메커니즘으로 사용된다. 그 목적은 지정된 title 속성으로 나타낸다. 두 번째 기능은 현재 페이지의 콘텐츠를 검색하고 필터링하는 메커니즘을 나타내므로 페이지의 주요 콘텐츠 일부로 포함된다. 이 기능은 목적을 나타내는 제목을 포함한다.

<body>
  <header>
    ...
    <search title="Website">
      ...
    </search>
  </header>
  <main>
    <h1>Hotels near your location</h1>
     <search>
       <h2>Filter results</h2>
       ...
     </search>
     <article>
      <!-- search result content -->
    </article>
  </main>
</body>

4.4.16 div 요소

Element/div

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLDivElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
플로 콘텐츠가 예상되는 곳.
dl 요소의 자식.
option 요소, optgroup 요소 또는 select 요소의 자손.
콘텐츠 모델:
요소가 dl 요소의 자식인 경우: 하나 이상의 dt 요소 뒤에 하나 이상의 dd 요소가 오며, 선택적으로 스크립트 지원 요소를 중간에 섞을 수 있다.
그렇지 않고 요소가 option 요소, optgroup 요소 또는 select 요소의 자손인 경우: 투명.
그렇지 않은 경우: 플로 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLDivElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

div 요소에는 특별한 의미가 전혀 없다. 이 요소는 자식들을 나타낸다. 연속된 요소 그룹에 공통되는 의미 체계를 마크업하기 위해 class, langtitle 속성과 함께 사용할 수 있다. 또한 dl 요소에서 dtdd 요소 그룹을 감싸는 데 사용할 수 있다.

작성자는 다른 적절한 요소가 없을 때 사용하는 최후의 수단으로 div 요소를 간주하는 것이 강력히 권장된다. div 요소 대신 더 적절한 요소를 사용하면 독자의 접근성이 향상되고 작성자가 더 쉽게 유지보수할 수 있다.

예를 들어 블로그 게시물은 article, 장은 section, 페이지의 내비게이션 보조 수단은 nav, 폼 컨트롤 그룹은 fieldset을 사용하여 마크업한다.

한편 div 요소는 스타일 지정 목적이나 한 섹션에서 모두 유사한 방식으로 주석을 달아야 하는 여러 단락을 감싸는 데 유용할 수 있다. 다음 예제에서는 두 단락 요소에 각각 언어를 설정하는 대신 div 요소를 사용하여 두 단락의 언어를 한 번에 설정한다:

<article lang="en-US">
 <h1>My use of language and my cats</h1>
 <p>My cat's behavior hasn't changed much since her absence, except
 that she plays her new physique to the neighbors regularly, in an
 attempt to get pets.</p>
 <div lang="en-GB">
  <p>My other cat, coloured black and white, is a sweetie. He followed
  us to the pool today, walking down the pavement with us. Yesterday
  he apparently visited our neighbours. I wonder if he recognises that
  their flat is a mirror image of ours.</p>
  <p>Hm, I just noticed that in the last paragraph I used British
  English. But I'm supposed to write in American English. So I
  shouldn't say "pavement" or "flat" or "colour"...</p>
 </div>
 <p>I should say "sidewalk" and "apartment" and "color"!</p>
</article>

4.5 텍스트 수준 의미 체계

4.5.1 a 요소

Element/a

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAnchorElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLAnchorElement/download

현재의 모든 엔진에서 지원된다.

Firefox20+Safari10.1+Chrome15+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAnchorElement/rel

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLAnchorElement/relList

현재의 모든 엔진에서 지원된다.

Firefox30+Safari9+Chrome65+
Opera?Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
요소에 href 속성이 있는 경우: 대화형 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
투명. 단, 대화형 콘텐츠 자손, a 요소 자손 또는 tabindex 속성이 지정된 자손이 없어야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
href하이퍼링크의 주소
target하이퍼링크 내비게이션을 위한 내비게이션 가능 객체
download — 리소스로 이동하는 대신 다운로드할지 여부 및 다운로드할 경우의 파일 이름
ping — ping할 URL
rel하이퍼링크를 포함하는 문서 내 위치와 대상 리소스 사이의 관계
hreflang — 연결된 리소스의 언어
type — 참조된 리소스 유형에 대한 힌트
referrerpolicy — 요소가 시작한 가져오기에 적용할 리퍼러 정책
접근성 고려 사항:
요소에 href 속성이 있는 경우: 작성자용; 구현자용.
그렇지 않은 경우: 작성자용; 구현자용.
정제:
기본, 속성: href, hreflang, type내비게이션 URL 속성 href.
DOM 인터페이스:
[Exposed=Window]
interface HTMLAnchorElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute DOMString download;
  [CEReactions, Reflect] attribute USVString ping;
  [CEReactions, Reflect] attribute DOMString rel;
  [SameObject, PutForwards=value, Reflect="rel"] readonly attribute DOMTokenList relList;

  [CEReactions] attribute DOMString text;

  [CEReactions] attribute DOMString referrerPolicy;

  // also has obsolete members
};
HTMLAnchorElement includes HyperlinkElementUtils;
HTMLAnchorElement includes HTMLHyperlinkElementUtils;

a 요소에 href 속성이 있으면, 그 요소는 콘텐츠로 레이블이 지정된 하이퍼링크(하이퍼텍스트 앵커)를 나타낸다.

a 요소에 href 속성이 없으면, 그 요소는 관련성이 있었다면 링크가 배치되었을 위치를 나타내는 자리표시자를 나타내며, 요소의 콘텐츠로만 구성된다.

target, download, ping, rel, hreflang, typereferrerpolicy 속성은 href 속성이 없으면 생략해야 한다.

itemprop 속성이 a 요소에 지정된 경우, href 속성도 지정해야 한다.

사이트가 모든 페이지에서 일관된 내비게이션 도구 모음을 사용하는 경우, 일반적으로 페이지 자체로 연결되는 링크를 a 요소를 사용하여 마크업할 수 있다:

<nav>
 <ul>
  <li> <a href="/">Home</a> </li>
  <li> <a href="/news">News</a> </li>
  <li> <a>Examples</a> </li>
  <li> <a href="/legal">Legal</a> </li>
 </ul>
</nav>

href, target, download, pingreferrerpolicy 속성은 사용자가 a 요소를 사용하여 생성된 하이퍼링크를 따라갈 때나 하이퍼링크를 다운로드할 때 발생하는 동작에 영향을 준다. rel, hreflangtype 속성은 사용자가 링크를 따라가기 전에 대상 리소스의 예상 특성을 사용자에게 나타내는 데 사용할 수 있다.

a.text

textContent와 동일하다.

HTMLAnchorElement/referrerPolicy

현재의 모든 엔진에서 지원된다.

Firefox50+Safari14+Chrome52+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

IDL 속성 referrerPolicyreferrerpolicy 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

text 속성의 getter는 이 요소의 자손 텍스트 콘텐츠를 반환해야 한다.

text 속성의 setter는 이 요소 내의 모든 문자열을 주어진 값으로 문자열 전체 교체해야 한다.

a 요소는 내부에 대화형 콘텐츠 (예: 버튼이나 다른 링크)가 없는 한 전체 단락, 목록, 표 등은 물론 전체 섹션까지 감쌀 수 있다. 다음 예제는 이를 사용하여 전체 광고 블록을 링크로 만드는 방법을 보여 준다:

<aside class="advertising">
 <h1>Advertising</h1>
 <a href="https://ad.example.com/?adid=1929&amp;pubid=1422">
  <section>
   <h1>Mellblomatic 9000!</h1>
   <p>Turn all your widgets into mellbloms!</p>
   <p>Only $9.99 plus shipping and handling.</p>
  </section>
 </a>
 <a href="https://ad.example.com/?adid=375&amp;pubid=1422">
  <section>
   <h1>The Mellblom Browser</h1>
   <p>Web browsing at the speed of light.</p>
   <p>No other browser goes faster!</p>
  </section>
 </a>
</aside>

다음 예제는 약간의 스크립트를 사용하여 채용 공고 표의 전체 행을 사실상 하이퍼링크로 만드는 방법을 보여 준다:

<table>
 <tr>
  <th>Position
  <th>Team
  <th>Location
 <tr>
  <td><a href="/jobs/manager">Manager</a>
  <td>Remotees
  <td>Remote
 <tr>
  <td><a href="/jobs/director">Director</a>
  <td>Remotees
  <td>Remote
 <tr>
  <td><a href="/jobs/astronaut">Astronaut</a>
  <td>Architecture
  <td>Remote
</table>
<script>
document.querySelector("table").onclick = ({ target }) => {
  if (target.parentElement.localName === "tr") {
    const link = target.parentElement.querySelector("a");
    if (link) {
      link.click();
    }
  }
}
</script>

4.5.2 em 요소

Element/em

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

em 요소는 콘텐츠의 강세 강조를 나타낸다.

특정 콘텐츠의 강세 수준은 그 콘텐츠의 조상 em 요소 수로 정해진다.

강세 강조의 위치를 바꾸면 문장의 의미가 달라진다. 따라서 이 요소는 콘텐츠의 필수적인 부분을 이룬다. 이와 같은 방식으로 강세를 사용하는 정확한 방법은 언어에 따라 달라진다.

다음 예제는 강세 강조를 변경하면 의미가 어떻게 달라지는지 보여 준다. 먼저 강세가 없는 일반적인 사실 진술이다:

<p>Cats are cute animals.</p>

첫 번째 단어를 강조하면 논의 중인 동물의 종류에 의문이 있다는 의미를 암시한다 (예를 들어 누군가 개가 귀엽다고 주장할 수 있다):

<p><em>Cats</em> are cute animals.</p>

강세를 동사로 옮기면 문장 전체의 진실성이 의문시되고 있음을 강조한다 (예를 들어 누군가 고양이는 귀엽지 않다고 말할 수 있다):

<p>Cats <em>are</em> cute animals.</p>

강세를 형용사로 옮기면 고양이의 정확한 특성을 다시 주장하게 된다 (예를 들어 누군가 고양이는 못된 동물이라고 제안했을 수 있다):

<p>Cats are <em>cute</em> animals.</p>

마찬가지로 누군가 고양이는 채소라고 주장했다면 이를 바로잡는 사람이 마지막 단어를 강조할 수 있다:

<p>Cats are cute <em>animals</em>.</p>

문장 전체를 강조하면 화자가 요점을 전달하기 위해 강하게 주장하고 있음이 분명해진다. 이러한 종류의 강세 강조는 일반적으로 문장 부호에도 영향을 주므로 여기서는 느낌표를 사용한다.

<p><em>Cats are cute animals!</em></p>

분노와 귀여움에 대한 강조가 섞이면 다음과 같은 마크업이 될 수 있다:

<p><em>Cats are <em>cute</em> animals!</em></p>

em 요소는 일반적인 "기울임꼴" 요소가 아니다. 때로는 텍스트를 다른 분위기나 목소리로 말하는 것처럼 단락의 나머지 부분과 구별해 돋보이게 하려는 경우가 있다. 이 경우에는 i 요소가 더 적절하다.

em 요소는 중요성을 전달하기 위한 것도 아니다. 그 목적에는 strong 요소가 더 적절하다.

4.5.3 strong 요소

Element/strong

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

strong 요소는 콘텐츠의 강한 중요성, 심각성 또는 긴급성을 나타낸다.

중요성: strong 요소는 제목, 캡션 또는 단락에서 정말 중요한 부분을 더 상세하거나, 더 유쾌하거나, 단순히 상용구인 다른 부분과 구별하는 데 사용할 수 있다. (이는 부제목을 마크업하는 것과는 다르며, 부제목에는 hgroup 요소가 적절하다.)

예를 들어 앞 단락의 첫 번째 단어는 단락 나머지 부분의 더 자세한 텍스트와 구별하기 위해 strong으로 마크업되어 있다.

심각성: strong 요소는 경고나 주의 알림을 마크업하는 데 사용할 수 있다.

긴급성: strong 요소는 사용자가 문서의 다른 부분보다 더 먼저 확인해야 하는 콘텐츠를 나타내는 데 사용할 수 있다.

특정 콘텐츠의 상대적 중요도는 그 콘텐츠의 조상 strong 요소 수로 정해진다. 각 strong 요소는 콘텐츠의 중요도를 높인다.

strong 요소를 사용하여 텍스트 일부의 중요도를 변경해도 문장의 의미는 달라지지 않는다.

여기서 "chapter"라는 단어와 실제 장 번호는 단순한 상용구이며, 장의 실제 이름은 strong으로 마크업된다:

<h1>Chapter 1: <strong>The Praxis</strong></h1>

다음 예제에서는 캡션 안의 다이어그램 이름을 앞의 상용구 텍스트와 뒤의 설명에서 구별하기 위해 strong으로 마크업한다:

<figcaption>Figure 1. <strong>Ant colony dynamics</strong>. The ants in this colony are
affected by the heat source (upper left) and the food source (lower right).</figcaption>

이 예제에서 제목은 실제로 "Flowers, Bees, and Honey"이지만 작성자는 제목에 가벼운 농담을 덧붙였다. 따라서 strong 요소를 사용하여 첫 번째 부분을 뒤의 부분과 구별한다.

<h1><strong>Flowers, Bees, and Honey</strong> and other things I don't understand</h1>

다음은 게임의 경고 알림에서 각 부분을 중요도에 따라 마크업한 예이다:

<p><strong>Warning.</strong> This dungeon is dangerous.
<strong>Avoid the ducks.</strong> Take any gold you find.
<strong><strong>Do not take any of the diamonds</strong>,
they are explosive and <strong>will destroy anything within
ten meters.</strong></strong> You have been warned.</p>

이 예제에서 strong 요소는 사용자가 먼저 읽어야 하는 텍스트 부분을 나타내는 데 사용된다.

<p>Welcome to Remy, the reminder system.</p>
<p>Your tasks for today:</p>
<ul>
 <li><p><strong>Turn off the oven.</strong></p></li>
 <li><p>Put out the trash.</p></li>
 <li><p>Do the laundry.</p></li>
</ul>

4.5.4 small 요소

Element/small

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

small 요소는 작은 글씨와 같은 부가 설명을 나타낸다.

작은 글씨에는 일반적으로 면책 조항, 주의 사항, 법적 제한 또는 저작권이 포함된다. 작은 글씨는 출처 표시나 라이선스 요구 사항을 충족하는 데 사용되기도 한다.

small 요소는 em 요소로 강조된 텍스트의 강조를 "약화"하거나 strong 요소로 중요하게 표시된 텍스트의 중요도를 낮추지 않는다. 텍스트를 강조되거나 중요하지 않은 것으로 표시하려면 각각 em 또는 strong 요소로 마크업하지 않으면 된다.

small 요소는 여러 단락, 목록 또는 텍스트 섹션과 같이 긴 범위의 텍스트에 사용해서는 안 된다. 이 요소는 짧은 텍스트 구간에만 사용하도록 의도되었다. 예를 들어 이용 약관을 나열하는 페이지의 텍스트는 small 요소에 적합하지 않다. 그러한 경우 텍스트는 부가 설명이 아니라 페이지의 주요 콘텐츠이기 때문이다.

small 요소는 부제목에 사용해서는 안 된다. 그 목적에는 hgroup 요소를 사용한다.

이 예제에서 small 요소는 호텔 객실 가격에 부가가치세가 포함되지 않았음을 나타내는 데 사용된다:

<dl>
 <dt>Single room
 <dd>199 € <small>breakfast included, VAT not included</small>
 <dt>Double room
 <dd>239 € <small>breakfast included, VAT not included</small>
</dl>

두 번째 예제에서 small 요소는 기사 안의 부가 설명에 사용된다.

<p>Example Corp today announced record profits for the
second quarter <small>(Full Disclosure: Foo News is a subsidiary of
Example Corp)</small>, leading to speculation about a third quarter
merger with Demo Group.</p>

이는 여러 단락 길이일 수 있고 텍스트의 주요 흐름에서 분리되는 사이드바와는 다르다. 다음 예제에서는 같은 기사의 사이드바를 보여 준다. 이 사이드바에도 작은 글씨가 있으며, 사이드바에 있는 정보의 출처를 나타낸다.

<aside>
 <h1>Example Corp</h1>
 <p>This company mostly creates small software and Web
 sites.</p>
 <p>The Example Corp company mission is "To provide entertainment
 and news on a sample basis".</p>
 <p><small>Information obtained from <a
 href="https://example.com/about.html">example.com</a> home
 page.</small></p>
</aside>

마지막 예제에서 small 요소는 중요한 작은 글씨로 표시된다.

<p><strong><small>Continued use of this service will result in a kiss.</small></strong></p>

4.5.5 s 요소

Element/s

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

s 요소는 더 이상 정확하지 않거나 더 이상 관련이 없는 콘텐츠를 나타낸다.

s 요소는 문서 편집을 나타내는 데 적절하지 않다. 문서에서 제거된 텍스트 범위를 마크업하려면 del 요소를 사용한다.

이 예제에서는 해당 제품에 새로운 할인 가격이 있으므로 권장 소매 가격을 더 이상 관련이 없는 것으로 표시한다.

<p>Buy our Iced Tea and Lemonade!</p>
<p><s>Recommended retail price: $3.99 per bottle</s></p>
<p><strong>Now selling for just $2.99 a bottle!</strong></p>

4.5.6 cite 요소

Element/cite

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

cite 요소는 저작물의 제목(예: 책, 논문, 수필, 시, 악보, 노래, 대본, 영화, TV 프로그램, 게임, 조각, 그림, 연극 공연, 희곡, 오페라, 뮤지컬, 전시회, 판례 보고서, 컴퓨터 프로그램 등)을 나타낸다. 이는 인용되거나 자세히 참조되는 저작물(즉, 출전)일 수도 있고, 단순히 지나가듯 언급되는 저작물일 수도 있다.

사람의 이름은 저작물의 제목이 아니다. 사람들이 그 사람을 하나의 작품이라고 부르더라도 마찬가지이다. 따라서 이 요소를 사람의 이름을 마크업하는 데 사용해서는 안 된다. (어떤 경우에는 이름에 b 요소가 적절할 수 있다. 예를 들어 유명인의 이름이 주의를 끌기 위해 다른 스타일로 렌더링되는 키워드인 가십 기사에서 그렇다. 다른 경우에는 요소가 정말로 필요하다면 span 요소를 사용할 수 있다.)

다음 예는 cite 요소의 일반적인 사용법을 보여 줍니다:

<p>내가 가장 좋아하는 책은 Peter F. Hamilton의 <cite>The Reality Dysfunction</cite>입니다.
내가 가장 좋아하는 만화는 Stephan Pastis의 <cite>Pearls Before
Swine</cite>입니다. 내가 가장 좋아하는 트랙은 Cannonball Adderley Sextet의 <cite>Jive
Samba</cite>입니다.</p>

다음은 올바른 사용법입니다:

<p>2008년 2월 중순 당시의 Wikipedia 문서 <cite>HTML</cite>에 따르면,
속성 값을 따옴표로 묶지 않는 것은 안전하지 않습니다. 이는 명백히 지나치게
단순화한 설명입니다.</p>

그러나 다음은 잘못된 사용법입니다. 여기서 cite 요소는 작품의 제목보다 훨씬 많은 내용을 포함하기 때문입니다:

<!-- 이 예를 복사하지 마세요. 잘못된 사용법의 예입니다! -->
<p>2008년 2월 중순 당시의 <cite>HTML에 관한 Wikipedia 문서</cite>에 따르면,
속성 값을 따옴표로 묶지 않는 것은 안전하지 않습니다. 이는 명백히 지나치게
단순화한 설명입니다.</p>

cite 요소는 참고 문헌의 모든 인용에서 핵심적인 부분이지만, 제목을 표시하는 데만 사용됩니다:

<p><cite>세계 인권 선언</cite>, 국제 연합,
1948년 12월. 총회 결의 217 A (III)로 채택됨.</p>

인용 표기인용문이 아닙니다(인용문에는 q 요소가 적절합니다).

다음은 잘못된 사용법입니다. cite는 인용문을 위한 요소가 아니기 때문입니다:

<p><cite>이것은 잘못되었습니다!</cite>라고 Ian이 말했습니다.</p>

다음 역시 잘못된 사용법입니다. 사람은 작품이 아니기 때문입니다:

<p><q>이것도 여전히 잘못되었습니다!</q>라고 <cite>Ian</cite>이 말했습니다.</p>

올바른 사용법에서는 cite 요소를 사용하지 않습니다:

<p><q>이것은 올바릅니다</q>라고 Ian이 말했습니다.</p>

위에서 언급했듯이, b 요소는 특정 종류의 문서에서 이름을 키워드로 표시하는 데 적절할 수 있습니다:

<p>그리고 <b>Ian</b><q>가십 칼럼에서는 어쩌면 이것이
맞을 수도 있습니다!</q>라고 말했습니다.</p>

작품의 제목을 관례적으로 문장 부호로 구분하는 경우 — 예를 들어 영어에서 문서 제목 주위에 사용하는 따옴표나 일본어에서 책 제목 주위에 사용하는 겹낫표(『』) — 해당 문장 부호는 제목의 일부가 아니며 cite 요소 밖에 위치합니다.

다음은 올바른 사용법입니다:

<p><cite lang="ja">阪急電車</cite>』에 대한 내 서평의 제목은 “<cite>귀여운 단편 소설 모음</cite>”이었습니다.</p>

4.5.7 q 요소

Element/q

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
cite — 인용문 출처 또는 편집에 대한 추가 정보로 연결되는 링크
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLQuoteElement를 사용한다.

q 요소는 다른 출처에서 인용한 일부 구문 콘텐츠나타낸다.

요소의 콘텐츠를 인용하는 인용 부호 문장 부호(예: 따옴표)는 q 요소 바로 앞, 뒤 또는 내부에 나타나서는 안 된다. 사용자 에이전트가 렌더링에 삽입한다.

q 요소 내부의 콘텐츠는 다른 출처에서 인용한 것이어야 하며, 주소가 있다면 cite 속성에서 인용할 수 있다. 소설이나 각본의 인물을 인용하는 경우처럼 출처는 허구일 수 있다.

cite 속성이 있으면 공백으로 둘러싸일 수 있는 유효한 URL이어야 한다. 해당 인용 링크를 얻으려면 속성 값을 요소의 노드 문서를 기준으로 구문 분석해야 한다. 사용자 에이전트는 사용자가 이러한 인용 링크를 따라가도록 허용할 수 있지만, 이 링크는 주로 독자가 아니라 비공개 용도(예: 사이트의 인용문 사용에 관한 통계를 수집하는 서버 측 스크립트)를 위한 것이다.

q 요소를 인용문이 아닌 따옴표 대신 사용해서는 안 된다. 예를 들어 빈정대는 문장을 마크업하는 데 q 요소를 사용하는 것은 적절하지 않다.

인용문을 마크업할 때 q 요소를 사용하는 것은 전적으로 선택 사항이다. q 요소 없이 명시적인 인용 부호 문장 부호를 사용하는 것도 똑같이 올바르다.

다음은 q 요소를 사용하는 간단한 예이다:

<p>The man said <q>Things that are impossible just take
longer</q>. I disagreed with him.</p>

다음은 q 요소 안의 명시적인 인용 링크와 요소 밖의 명시적인 출전을 모두 포함한 예이다:

<p>The W3C page <cite>About W3C</cite> says the W3C's
mission is <q cite="https://www.w3.org/Consortium/">To lead the
World Wide Web to its full potential by developing protocols and
guidelines that ensure long-term growth for the Web</q>. I
disagree with this mission.</p>

다음 예제에서는 인용문 자체가 인용문을 포함한다:

<p>In <cite>Example One</cite>, he writes <q>The man
said <q>Things that are impossible just take longer</q>. I
disagreed with him</q>. Well, I disagree even more!</p>

다음 예제에서는 q 요소 대신 따옴표를 사용한다:

<p>His best argument was ❝I disagree❞, which
I thought was laughable.</p>

다음 예제에는 인용문이 없다. 따옴표는 단어의 이름을 나타내기 위해 사용된다. 이 경우 q 요소를 사용하는 것은 적절하지 않다.

<p>The word "ineffable" could have been used to describe the disaster
resulting from the campaign's mismanagement.</p>

4.5.8 dfn 요소

Element/dfn

현재의 모든 엔진에서 지원된다.

Firefox1+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠. 단, dfn 요소 자손은 없어야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
또한 title 속성은 이 요소에서 특별한 의미 체계를 가진다: 전체 용어 또는 약어의 확장형
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

dfn 요소는 용어를 정의하는 인스턴스를 나타낸다. dfn 요소의 가장 가까운 조상인 단락, 설명 목록 그룹 또는 섹션에는 dfn 요소가 제공하는 용어의 정의도 포함되어야 한다.

정의되는 용어: dfn 요소에 title 속성이 있으면 그 속성의 정확한 값이 정의되는 용어이다. 그렇지 않고 정확히 하나의 요소 자식 노드를 포함하며 자식 Text 노드는 없고, 그 자식 요소가 title 속성을 가진 abbr 요소라면 속성의 정확한 값이 정의되는 용어이다. 그렇지 않으면 dfn 요소의 자손 텍스트 콘텐츠가 정의되는 용어를 제공한다.

dfn 요소의 title 속성이 있으면 정의되는 용어만 포함해야 한다.

조상 요소의 title 속성은 dfn 요소에 영향을 주지 않는다.

dfn 요소로 연결되는 a 요소는 dfn 요소가 정의한 용어의 인스턴스를 나타낸다.

다음 조각에서는 "Garage Door Opener"라는 용어가 첫 번째 단락에서 처음 정의된 다음 두 번째 단락에서 사용된다. 두 경우 모두 실제로 표시되는 것은 그 약어이다.

<p>The <dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>
is a device that allows off-world teams to open the iris.</p>
<!-- ... later in the document: -->
<p>Teal'c activated his <abbr title="Garage Door Opener">GDO</abbr>
and so Hammond ordered the iris to be opened.</p>

a 요소를 추가하면 참조를 명시적으로 만들 수 있다:

<p>The <dfn id=gdo><abbr title="Garage Door Opener">GDO</abbr></dfn>
is a device that allows off-world teams to open the iris.</p>
<!-- ... later in the document: -->
<p>Teal'c activated his <a href=#gdo><abbr title="Garage Door Opener">GDO</abbr></a>
and so Hammond ordered the iris to be opened.</p>

4.5.9 abbr 요소

Element/abbr

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome2+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer7+
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
또한 title 속성은 이 요소에서 특별한 의미 체계를 가진다: 전체 용어 또는 약어의 확장형
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

abbr 요소는 선택적으로 확장형과 함께 약어 또는 두문자어를 나타낸다. title 속성을 사용하여 약어의 확장형을 제공할 수 있다. 이 속성을 지정하는 경우 약어의 확장형만 포함해야 한다.

아래 단락은 abbr 요소로 마크업된 약어를 포함한다. 이 단락은 "Web Hypertext Application Technology Working Group"이라는 용어를 정의한다.

<p>The <dfn id=whatwg><abbr
title="Web Hypertext Application Technology Working Group">WHATWG</abbr></dfn>
is a loose unofficial collaboration of web browser manufacturers and
interested parties who wish to develop new technologies designed to
allow authors to write and deploy Applications over the World Wide
Web.</p>

이를 작성하는 다른 방법은 다음과 같다:

<p>The <dfn id=whatwg>Web Hypertext Application Technology
Working Group</dfn> (<abbr
title="Web Hypertext Application Technology Working Group">WHATWG</abbr>)
is a loose unofficial collaboration of web browser manufacturers and
interested parties who wish to develop new technologies designed to
allow authors to write and deploy Applications over the World Wide
Web.</p>

이 단락에는 두 개의 약어가 있다. 하나만 정의되어 있음에 유의한다. 연결된 확장형이 없는 다른 약어에는 abbr 요소를 사용하지 않는다.

<p>The
<abbr title="Web Hypertext Application Technology Working Group">WHATWG</abbr>
started working on HTML5 in 2004.</p>

이 단락은 약어를 그 정의에 연결한다.

<p>The <a href="#whatwg"><abbr
title="Web Hypertext Application Technology Working Group">WHATWG</abbr></a>
community does not have much representation from Asia.</p>

이 단락은 확장형을 제공하지 않고 약어를 마크업한다. 이는 약어에 스타일(예: 작은 대문자)을 적용하기 위한 훅일 수 있다.

<p>Philip` and Dashiva both denied that they were going to
get the issue counts from past revisions of the specification to
backfill the <abbr>WHATWG</abbr> issue graph.</p>

약어가 복수형이면 확장형의 문법적 수(복수형 또는 단수형)는 요소 콘텐츠의 문법적 수와 일치해야 한다.

여기서는 복수형이 요소 밖에 있으므로 확장형은 단수형이다:

<p>Two <abbr title="Working Group">WG</abbr>s worked on
this specification: the <abbr>WHATWG</abbr> and the
<abbr>HTMLWG</abbr>.</p>

여기서는 복수형이 요소 안에 있으므로 확장형은 복수형이다:

<p>Two <abbr title="Working Groups">WGs</abbr> worked on
this specification: the <abbr>WHATWG</abbr> and the
<abbr>HTMLWG</abbr>.</p>

약어는 반드시 이 요소를 사용하여 마크업할 필요는 없다. 이 요소는 다음과 같은 경우에 유용할 것으로 예상된다:

title 속성에서 확장형을 한 번 제공해도 같은 문서에서 같은 콘텐츠를 가지지만 title 속성이 없는 다른 abbr 요소가 같은 확장형을 가진 것처럼 동작하지는 않는다. 모든 abbr 요소는 독립적이다.

4.5.10 ruby 요소

Element/ruby

현재의 모든 엔진에서 지원된다.

Firefox38+Safari5+Chrome5+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
본문 설명을 참조한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

ruby 요소를 사용하면 하나 이상의 구문 콘텐츠 범위에 루비 주석을 표시할 수 있다. 루비 주석은 기본 텍스트 옆에 표시되는 짧은 텍스트 구간으로, 주로 동아시아 조판에서 발음 안내나 기타 주석을 포함하기 위해 사용된다. 일본어에서는 이러한 조판 형식을 후리가나라고도 한다.

ruby 요소의 콘텐츠 모델은 다음 시퀀스 중 하나 이상으로 구성된다:

  1. 다음 중 하나:

  2. 다음 중 하나:

rubyrt 요소는 아래에 설명된 것을 포함하되 이에 한정되지 않는 다양한 종류의 주석에 사용할 수 있다. 특히 일본어 루비와 일본어에서 루비를 렌더링하는 방법에 관한 자세한 내용은 일본어 조판 요구 사항을 참조한다. [JLREQ]

작성 시점에는 CSS가 아직 HTML ruby 요소의 렌더링을 완전히 제어하는 방법을 제공하지 않는다. CSS가 적절한 시기에 아래에 설명된 스타일을 지원하도록 확장되기를 기대한다.

일본어에서 개별 기본 문자에 대한 모노 루비

하나 이상의 히라가나 또는 가타카나 문자(루비 주석)가 각 표의 문자(기본 텍스트)와 함께 배치된다. 이는 한자의 읽는 법을 제공하는 데 사용된다.

<ruby>B<rt>annotation</ruby>

이 예제에서는 각 주석이 하나의 기본 문자에 대응함에 유의한다.

<ruby><rt>くん</ruby><ruby><rt></ruby><ruby><rt></ruby>して<ruby><rt>どう</ruby>ぜず。

くんしてどう ぜず。

이 예제는 각각 하나의 기본 텍스트 구간과 주석을 가진 두 개의 연속된 ruby 요소(위 마크업과 같음) 대신, 기본 텍스트 구간 두 개와 주석 두 개(각각 하나씩)를 가진 하나의 ruby 요소를 사용하여 다음과 같이 작성할 수도 있다:

<ruby><rt>くん</rt><rt></ruby><ruby><rt></ruby>して<ruby><rt>どう</ruby>ぜず。
복합어(주쿠고)에 대한 모노 루비

이는 앞의 경우와 비슷하다. 복합어의 각 표의 문자(기본 텍스트)에 히라가나 또는 가타카나 문자(루비 주석)로 읽는 법을 제공한다. 차이점은 기본 텍스트 구간이 서로 분리된 것이 아니라 복합어를 이룬다는 점이다.

<ruby>B<rt>annotation</rt>B<rt>annotation</ruby>

이 예제에서도 각 주석이 하나의 기본 문자에 대응함에 유의한다. 이 예제에서 각 복합어(주쿠고)는 하나의 ruby 요소에 대응한다.

여기서 예상되는 렌더링은 각 주석이 해당 기본 문자 위(세로쓰기에서는 옆)에 배치되고, 주석이 인접한 문자 위로 돌출하지 않는 것이다.

<ruby><rt></rt><rt>もん</rt></ruby><ruby><rt>ほう</rt><rt>がく</rt></ruby><ruby><rt>ぎょう</rt><rt></rt></ruby>する

もんほうがくぎょうする

주쿠고 루비

이는 의미론적으로 앞의 경우와 동일하다(기본 복합어의 각 개별 표의 문자에 히라가나 또는 가타카나 문자로 읽는 법이 주석으로 제공됨). 다만 렌더링은 더 복잡한 주쿠고 루비 렌더링이다.

이는 위의 복합어 모노 루비 예제와 같다. 서로 다른 렌더링은 서로 다른 스타일 지정(예: CSS)을 사용하여 구현될 것으로 예상되며 여기에는 표시하지 않는다.

<ruby><rt></rt><rt>もん</rt></ruby><ruby><rt>ほう</rt><rt>がく</rt></ruby><ruby><rt>ぎょう</rt><rt></rt></ruby>する

주쿠고 루비 렌더링에 관한 자세한 내용은 일본어 조판 요구 사항의 부록 F를 참조한다. [JLREQ]

의미를 설명하기 위한 그룹 루비

주석은 발음 대신 또는 발음과 함께 기본 텍스트의 의미를 설명한다. 따라서 기본 텍스트와 주석 모두 여러 문자 길이일 수 있다.

<ruby>BASE<rt>annotation</ruby>

여기서는 복합 표의어에 대응하는 가타카나를 주석으로 제공한다.

<ruby>境界面<rt>インターフェース</ruby>

境界面インターフェース

여기서는 복합 표의어의 영어 번역을 주석으로 제공한다.

<ruby lang="ja">編集者<rt lang="en">editor</ruby>

編集者editor

주쿠지 읽기를 위한 그룹 루비

일대일 대응이 어려우므로 여러 기본 문자에 대응하는 음성 읽기이다. (영어에서는 "Colonel"과 "Lieutenant"가 일부 방언에서 발음과 개별 문자의 직접적인 대응이 상당히 불분명한 단어의 예이다.)

이 예제에서는 꽃 종의 이름에 그룹 루비를 사용하여 음성 읽기를 제공한다:

<ruby>紫陽花<rt>あじさい</ruby>

紫陽花あじさい

음성 주석과 의미 주석을 모두 포함한 텍스트(양면 루비)

때로는 위에서 설명한 루비 스타일을 결합한다.

그 결과 두 주석이 같은 하나의 기본 구간을 덮는다면 주석을 연속해서 배치하면 된다.

<ruby>BASE<rt>annotation 1<rt>annotation 2</ruby>
<ruby>B<rt>a<rt>a</ruby><ruby>A<rt>a<rt>a</ruby><ruby>S<rt>a<rt>a</ruby><ruby>E<rt>a<rt>a</ruby>

이 인위적인 예제에서는 일부 기호에 영어와 프랑스어 이름을 제공한다.

<ruby><rt> Heart <rt lang=fr> Cœur </rt><rt> Shamrock <rt lang=fr> Trèfle </rt><rt> Star <rt lang=fr> Étoile </rt>
</ruby>

다음 예제와 같이 더 복잡한 상황에서는 중첩된 ruby 요소를 사용하여 내부 주석을 제공한 다음, 그 전체 ruby에 "외부" 수준의 주석을 제공한다.

<ruby><ruby>B<rt>a</rt>A<rt>n</rt>S<rt>t</rt>E<rt>n</rt></ruby><rt>annotation</ruby>

여기서는 음성 읽기와 의미를 모두 루비 주석으로 제공한다. 중첩된 ruby 요소의 주석은 각 기본 문자에 대한 모노 루비 음성 주석을 제공하고, 외부 ruby 요소의 자식인 rt 요소의 주석은 히라가나를 사용하여 의미를 제공한다.

<ruby><ruby><rt>とう</rt><rt>なん</rt></ruby><rt>たつみ</rt></ruby>の方角

とうなん たつみ の方角

이는 같은 예제이지만 의미를 일본어 대신 영어로 제공한다:

<ruby><ruby><rt>とう</rt><rt>なん</rt></ruby><rt lang=en>Southeast</rt></ruby>の方角

とうなん Southeast の方角


ruby 요소 조상이 없는 ruby 요소 안에서 콘텐츠는 구간으로 나뉘며, 구간은 기본 텍스트 구간, 주석 구간 및 무시되는 구간의 세 범주로 배치된다. 무시되는 구간은 문서의 의미 체계 일부를 이루지 않는다. 이들은 일부 요소 간 공백rp 요소로 구성되며, 후자는 루비를 전혀 지원하지 않는 레거시 사용자 에이전트를 위해 사용된다. 기본 텍스트 구간은 겹칠 수 있다(DOM의 어느 한 위치에서도 겹치는 구간은 최대 두 개이며, 겹치는 구간보다 시작점이 이른 구간은 종료점도 같거나 더 늦고, 겹치는 구간보다 종료점이 늦은 구간은 시작점도 같거나 더 이르다). 주석 구간은 rt 요소에 대응한다. 각 주석 구간은 기본 텍스트 구간과 연결될 수 있으며, 각 기본 텍스트 구간에는 주석 구간이 연결될 수 있다. (적합한 문서에서는 각 기본 텍스트 구간이 최소 하나의 주석 구간과 연결되고, 각 주석 구간은 하나의 기본 텍스트 구간과 연결된다.) ruby 요소는 포함하는 기본 텍스트 구간의 합집합과, 해당 기본 텍스트 구간에서 주석 구간으로의 매핑을 나타낸다. 구간은 DOM 범위로 설명하며, 주석 구간 범위는 항상 정확히 하나의 요소로 구성된다. [DOM]

특정 시점의 ruby 요소 콘텐츠의 구간화와 범주화는 다음 알고리즘을 실행하여 얻는 결과이다:

  1. base text segments를 기본 텍스트 구간의 빈 목록으로 둔다. 각 구간은 기본 텍스트 하위 구간 목록을 가질 수 있다.

  2. annotation segments를 주석 구간의 빈 목록으로 둔다. 각 구간은 기본 텍스트 구간 또는 하위 구간과 연결될 수 있다.

  3. root를 알고리즘을 실행하는 대상인 ruby 요소로 둔다.

  4. rootruby 요소 조상이 있으면 end 레이블이 지정된 단계로 이동한다.

  5. current parentroot로 둔다.

  6. index를 0으로 둔다.

  7. start index를 null로 둔다.

  8. saved start index를 null로 둔다.

  9. current base text를 null로 둔다.

  10. Start mode: indexcurrent parent의 자식 노드 수보다 크거나 같으면 end mode 레이블이 지정된 단계로 이동한다.

  11. current parentindex번째 노드가 rt 또는 rp 요소이면 annotation mode 레이블이 지정된 단계로 이동한다.

  12. start indexindex의 값으로 설정한다.

  13. Base mode: current parentindex번째 노드가 ruby 요소이고 current parentroot와 같은 요소이면 루비 수준을 푸시한 다음 start mode 레이블이 지정된 단계로 이동한다.

  14. current parentindex번째 노드가 rt 또는 rp 요소이면 현재 기본 텍스트를 설정한 다음 annotation mode 레이블이 지정된 단계로 이동한다.

  15. index를 1만큼 증가시킨다.

  16. Base mode post-increment: indexcurrent parent의 자식 노드 수보다 크거나 같으면 end mode 레이블이 지정된 단계로 이동한다.

  17. base mode 레이블이 지정된 단계로 돌아간다.

  18. Annotation mode: current parentindex번째 노드가 rt 요소이면 루비 주석을 푸시하고 annotation mode increment 레이블이 지정된 단계로 이동한다.

  19. current parentindex번째 노드가 rp 요소이면 annotation mode increment 레이블이 지정된 단계로 이동한다.

  20. current parentindex번째 노드가 Text 노드가 아니거나, Text 노드이지만 요소 간 공백이 아니면 base mode 레이블이 지정된 단계로 이동한다.

  21. Annotation mode increment: lookahead indexindex에 1을 더한 값으로 둔다.

  22. Annotation mode white-space skipper: lookahead indexcurrent parent의 자식 노드 수와 같으면 end mode 레이블이 지정된 단계로 이동한다.

  23. current parentlookahead index번째 노드가 rt 요소 또는 rp 요소이면 indexlookahead index로 설정하고 annotation mode 레이블이 지정된 단계로 이동한다.

  24. current parentlookahead index번째 노드가 Text 노드가 아니거나, Text 노드이지만 요소 간 공백이 아니면 base mode 레이블이 지정된 단계로 이동한다(index를 더 증가시키지 않으므로 지금까지 확인한 요소 간 공백은 다음 기본 텍스트 구간의 일부가 된다).

  25. lookahead index를 1만큼 증가시킨다.

  26. annotation mode white-space skipper 레이블이 지정된 단계로 이동한다.

  27. End mode: current parentroot와 같은 요소가 아니면 루비 수준을 팝하고 base mode post-increment 레이블이 지정된 단계로 이동한다.

  28. End: base text segmentsannotation segments를 반환한다. 두 목록 중 어느 쪽의 구간으로도 설명되지 않는 ruby 요소의 콘텐츠는 암시적으로 무시되는 구간에 속한다.

위 단계에서 현재 기본 텍스트를 설정하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:

  1. text range를 DOM 범위로 둔다. 그 시작경계점(current parent, start index)이고, 경계점 (current parent, index)이다.

  2. new text segmenttext range 범위로 설명되는 기본 텍스트 구간으로 둔다.

  3. new text segmentbase text segments에 추가한다.

  4. current base textnew text segment로 둔다.

  5. start index를 null로 둔다.

위 단계에서 루비 수준을 푸시하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:

  1. current parentcurrent parentindex번째 노드로 둔다.

  2. index를 0으로 둔다.

  3. saved start indexstart index의 값으로 설정한다.

  4. start index를 null로 둔다.

위 단계에서 루비 수준을 팝하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:

  1. indexroot 안에서 current parent의 위치로 둔다.

  2. current parentroot로 둔다.

  3. index를 1만큼 증가시킨다.

  4. start indexsaved start index의 값으로 설정한다.

  5. saved start index를 null로 둔다.

위 단계에서 루비 주석을 푸시하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:

  1. rtcurrent parentindex번째 노드인 rt 요소로 둔다.

  2. annotation range를 DOM 범위로 둔다. 그 시작경계점(current parent, index)이고, 경계점 (current parent, index에 1을 더한 값)이다(즉, rt만 포함한다).

  3. new annotation segmentannotation range 범위로 설명되는 주석 구간으로 둔다.

  4. current base text가 null이 아니면 new annotation segmentcurrent base text와 연결한다.

  5. new annotation segmentannotation segments에 추가한다.

이 예제에서는 일본어 텍스트 漢字의 각 표의 문자에 히라가나 읽기를 주석으로 제공한다.

...
<ruby><rt>かん</rt><rt></rt></ruby>
...

다음과 같이 렌더링될 수 있다:

The two main ideographs, each with its annotation in hiragana rendered in a smaller font above it.

이 예제에서는 번체 중국어 텍스트 漢字의 각 표의 문자에 주음부호 읽기를 주석으로 제공한다.

<ruby><rt>ㄏㄢˋ</rt><rt>ㄗˋ</rt></ruby>

다음과 같이 렌더링될 수 있다:

The two main ideographs, each with its bopomofo annotation rendered in a smaller font next to it.

이 예제에서는 간체 중국어 텍스트 汉字의 각 표의 문자에 병음 읽기를 주석으로 제공한다.

...<ruby><rt>hàn</rt><rt></rt></ruby>...

다음과 같이 렌더링될 수 있다:

The two main ideographs, each with its pinyin annotation rendered in a smaller font above it.

이 더 인위적인 예제에서 두문자어 "HTML"에는 네 개의 주석이 있다. 하나는 전체 두문자어가 무엇인지 간단히 설명하고, 하나는 "HT"를 "Hypertext"로 확장하며, 하나는 문자 "M"을 "Markup"으로 확장하고, 하나는 문자 "L"을 "Language"로 확장한다.

<ruby>
 <ruby>HT<rt>Hypertext</rt>M<rt>Markup</rt>L<rt>Language</rt></ruby>
 <rt>An abstract language for describing documents and applications
</ruby>

4.5.11 rt 요소

Element/rt

현재의 모든 엔진에서 지원된다.

Firefox38+Safari5+Chrome5+
Opera?Edge79+
Edge (Legacy)?Internet Explorer5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
없음.
이 요소를 사용할 수 있는 맥락:
ruby 요소의 자식.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
rt 요소 바로 뒤에 rt 또는 rp 요소가 오거나, 부모 요소에 더 이상의 콘텐츠가 없으면 rt 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

rt 요소는 루비 주석의 루비 텍스트 구성 요소를 표시한다. ruby 요소의 자식인 경우, 그 자체로는 아무것도 나타내지 않지만, ruby 요소는 자신이 무엇을 나타내는지 결정하는 과정의 일부로 이 요소를 사용한다.

ruby 요소의 자식이 아닌 rt 요소는 자신의 자식과 같은 것을 나타낸다.

4.5.12 rp 요소

Element/rp

현재의 모든 엔진에서 지원된다.

Firefox38+Safari5+Chrome5+
Opera?Edge79+
Edge (Legacy)?Internet Explorer5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
없음.
이 요소를 사용할 수 있는 맥락:
ruby 요소의 자식으로서, rt 요소 바로 앞이나 바로 뒤.
콘텐츠 모델:
텍스트.
text/html에서의 태그 생략:
rp 요소 바로 뒤에 rt 또는 rp 요소가 오거나, 부모 요소에 더 이상의 콘텐츠가 없으면 rp 요소의 종료 태그를 생략할 수 있다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

rp 요소는 루비 주석을 지원하지 않는 사용자 에이전트에서 표시할 수 있도록 루비 주석의 루비 텍스트 구성 요소 주위에 괄호나 기타 콘텐츠를 제공하는 데 사용할 수 있다.

ruby 요소의 자식인 rp 요소는 아무것도 나타내지 않는다. 부모 요소가 ruby 요소가 아닌 rp 요소는 자신의 자식을 나타낸다.

텍스트 漢字의 각 표의 문자에 음성 읽기를 주석으로 제공한 위 예제는, 레거시 사용자 에이전트에서 읽기가 괄호 안에 표시되도록 rp를 사용하여 확장할 수 있다:

...
<ruby><rp></rp><rt>かん</rt><rp></rp><rp></rp><rt></rt><rp></rp></ruby>
...

적합한 사용자 에이전트에서는 위와 같이 렌더링되지만, 루비를 지원하지 않는 사용자 에이전트에서는 다음과 같이 렌더링된다:

... 漢(かん)字(じ)...

하나의 구간에 여러 주석이 있는 경우 rp 요소를 주석 사이에도 배치할 수 있다. 다음은 일부 기호에 영어와 프랑스어 이름을 제공했던 앞의 인위적인 예제를 rp 요소도 포함하여 다시 나타낸 것이다:

<ruby><rp>: </rp><rt>Heart</rt><rp>, </rp><rt lang=fr>Cœur</rt><rp>.</rp><rp>: </rp><rt>Shamrock</rt><rp>, </rp><rt lang=fr>Trèfle</rt><rp>.</rp><rp>: </rp><rt>Star</rt><rp>, </rp><rt lang=fr>Étoile</rt><rp>.</rp>
</ruby>

이렇게 하면 루비를 지원하지 않는 사용자 에이전트에서 예제가 다음과 같이 렌더링된다:

♥: Heart, Cœur. ☘: Shamrock, Trèfle. ✶: Star, Étoile.

4.5.13 data 요소

Element/data

현재의 모든 엔진에서 지원된다.

Firefox22+Safari10+Chrome62+
Opera?Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLDataElement

현재의 모든 엔진에서 지원된다.

Firefox22+Safari10+Chrome62+
Opera?Edge79+
Edge (Legacy)14+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLDataElement/value

현재의 모든 엔진에서 지원된다.

Firefox22+Safari10+Chrome62+
Opera?Edge79+
Edge (Legacy)14+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
value — 기계가 읽을 수 있는 값
접근성 고려 사항:
작성자용.
구현자용.
정제:
속성 value가 있는 기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLDataElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute DOMString value;
};

data 요소는 자신의 콘텐츠와, value 속성에 있는 해당 콘텐츠의 기계가 읽을 수 있는 형식을 함께 나타낸다.

value 속성은 반드시 존재해야 한다. 그 값은 요소 콘텐츠를 기계가 읽을 수 있는 형식으로 나타낸 것이어야 한다.

값이 날짜 또는 시간과 관련된 경우에는 더 구체적인 time 요소를 대신 사용할 수 있다.

이 요소는 여러 목적으로 사용할 수 있다.

이 명세에 정의된 마이크로포맷 또는 마이크로데이터 속성과 함께 사용하면, 이 요소는 데이터 처리기를 위한 기계가 읽을 수 있는 값과 웹 브라우저 렌더링을 위한 사람이 읽을 수 있는 값을 모두 제공한다. 이 경우 value 속성에 사용할 형식은 사용 중인 마이크로포맷 또는 마이크로데이터 어휘에 의해 결정된다.

그러나 페이지의 스크립트와 함께 사용하여 사람이 읽을 수 있는 값 옆에 스크립트가 저장할 리터럴 값을 제공할 수도 있다. 그러한 경우 사용할 형식은 오직 스크립트의 필요에 따라 결정된다. (data-* 속성도 그러한 상황에서 유용할 수 있다.)

여기서는 짧은 표의 숫자 값을 data 요소를 사용하여 인코딩한다. 따라서 한 열에서는 숫자가 텍스트 형식으로 표시되고 다른 열에서는 분해된 형식으로 표시되더라도, 표 정렬 JavaScript 라이브러리가 각 열에 정렬 메커니즘을 제공할 수 있다.

<script src="sortable.js"></script>
<table class="sortable">
 <thead> <tr> <th> Game <th> Corporations <th> Map Size
 <tbody>
  <tr> <td> 1830 <td> <data value="8">Eight</data> <td> <data value="93">19+74 hexes (93 total)</data>
  <tr> <td> 1856 <td> <data value="11">Eleven</data> <td> <data value="99">12+87 hexes (99 total)</data>
  <tr> <td> 1870 <td> <data value="10">Ten</data> <td> <data value="149">4+145 hexes (149 total)</data>
</table>

4.5.14 time 요소

Element/time

현재의 모든 엔진에서 지원된다.

Firefox22+Safari7+Chrome62+
Opera49+Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS4+Chrome Android?WebView Android?Samsung Internet?Opera Android46+

HTMLTimeElement

현재의 모든 엔진에서 지원된다.

Firefox22+Safari10+Chrome62+
Opera49+Edge79+
Edge (Legacy)14+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android46+

HTMLTimeElement/dateTime

현재의 모든 엔진에서 지원된다.

Firefox22+Safari10+Chrome62+
Opera49+Edge79+
Edge (Legacy)14+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android46+
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
요소에 datetime 속성이 있는 경우: 구문 콘텐츠.
그렇지 않은 경우: 텍스트. 단, 아래 본문에 설명된 요구 사항과 일치해야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
datetime — 기계가 읽을 수 있는 값
접근성 고려 사항:
작성자용.
구현자용.
정제:
속성 datetime이 있는 기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLTimeElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute DOMString dateTime;
};

time 요소는 자신의 콘텐츠와, datetime 속성에 있는 해당 콘텐츠의 기계가 읽을 수 있는 형식을 함께 나타낸다. 콘텐츠의 종류는 아래에 설명된 다양한 종류의 날짜, 시간, 시간대 오프셋 및 기간으로 제한된다.

datetime 속성은 존재할 수 있다. 존재하는 경우 그 값은 요소 콘텐츠를 기계가 읽을 수 있는 형식으로 나타낸 것이어야 한다.

datetime 콘텐츠 속성이 없는 time 요소에는 요소 자손이 없어야 한다.

time 요소의 날짜시간 값은 요소에 datetime 콘텐츠 속성이 있으면 그 속성의 값이고, 그렇지 않으면 time 요소의 자식 텍스트 콘텐츠이다.

time 요소의 날짜시간 값은 다음 구문 중 하나와 일치해야 한다.

유효한 월 문자열
<time>2011-11</time>
유효한 날짜 문자열
<time>2011-11-18</time>
유효한 연도 없는 날짜 문자열
<time>11-18</time>
유효한 시간 문자열
<time>14:54</time>
<time>14:54:39</time>
<time>14:54:39.929</time>
유효한 현지 날짜 및 시간 문자열
<time>2011-11-18T14:54</time>
<time>2011-11-18T14:54:39</time>
<time>2011-11-18T14:54:39.929</time>
<time>2011-11-18 14:54</time>
<time>2011-11-18 14:54:39</time>
<time>2011-11-18 14:54:39.929</time>

날짜는 있지만 시간대 오프셋이 없는 시간은 하루 동안 각 시간대의 동일한 특정 시각에 관찰되는 이벤트를 지정하는 데 유용하다. 예를 들어 2020년 새해는 모든 시간대에서 정확히 같은 순간이 아니라 각 시간대의 2020-01-01 00:00에 기념된다. 화상 회의처럼 모든 시간대에서 동일한 시점에 발생하는 이벤트에는 유효한 전역 날짜 및 시간 문자열이 더 유용할 가능성이 크다.

유효한 시간대 오프셋 문자열
<time>Z</time>
<time>+0000</time>
<time>+00:00</time>
<time>-0800</time>
<time>-08:00</time>

날짜가 없는 시간 또는 여러 날짜에 반복되는 이벤트를 가리키는 시간에서는, 시간을 제어하는 지리적 위치를 지정하는 것이 시간대 오프셋을 지정하는 것보다 일반적으로 더 유용하다. 지리적 위치의 시간대 오프셋은 일광 절약 시간제로 인해 변경되기 때문이다. 일부 경우에는 시간대 경계가 다시 그려질 때처럼 지리적 위치의 시간대 자체가 바뀌기도 한다. 이는 2011년 말 사모아에서 일어났다. 시간대의 경계와 각 시간대 안에서 적용되는 규칙을 설명하는 데이터베이스가 있으며, 이를 시간대 데이터베이스라고 한다. [TZDATABASE]

유효한 전역 날짜 및 시간 문자열
<time>2011-11-18T14:54Z</time>
<time>2011-11-18T14:54:39Z</time>
<time>2011-11-18T14:54:39.929Z</time>
<time>2011-11-18T14:54+0000</time>
<time>2011-11-18T14:54:39+0000</time>
<time>2011-11-18T14:54:39.929+0000</time>
<time>2011-11-18T14:54+00:00</time>
<time>2011-11-18T14:54:39+00:00</time>
<time>2011-11-18T14:54:39.929+00:00</time>
<time>2011-11-18T06:54-0800</time>
<time>2011-11-18T06:54:39-0800</time>
<time>2011-11-18T06:54:39.929-0800</time>
<time>2011-11-18T06:54-08:00</time>
<time>2011-11-18T06:54:39-08:00</time>
<time>2011-11-18T06:54:39.929-08:00</time>
<time>2011-11-18 14:54Z</time>
<time>2011-11-18 14:54:39Z</time>
<time>2011-11-18 14:54:39.929Z</time>
<time>2011-11-18 14:54+0000</time>
<time>2011-11-18 14:54:39+0000</time>
<time>2011-11-18 14:54:39.929+0000</time>
<time>2011-11-18 14:54+00:00</time>
<time>2011-11-18 14:54:39+00:00</time>
<time>2011-11-18 14:54:39.929+00:00</time>
<time>2011-11-18 06:54-0800</time>
<time>2011-11-18 06:54:39-0800</time>
<time>2011-11-18 06:54:39.929-0800</time>
<time>2011-11-18 06:54-08:00</time>
<time>2011-11-18 06:54:39-08:00</time>
<time>2011-11-18 06:54:39.929-08:00</time>

날짜와 시간대 오프셋이 있는 시간은 특정 이벤트나, 시간이 특정 지리적 위치에 고정되지 않은 반복 가상 이벤트를 지정하는 데 유용하다. 예를 들어 소행성이 충돌한 정확한 시각이나, 세계의 특정 지역이 일광 절약 시간제를 적용하는지와 관계없이 매일 1400 UTC에 열리는 일련의 회의 중 특정 회의가 이에 해당한다. 정확한 시각이 특정 지리적 위치의 현지 시간대 오프셋에 따라 달라지는 이벤트에는 해당 지리적 위치와 결합한 유효한 현지 날짜 및 시간 문자열이 더 유용할 가능성이 크다.

유효한 주 문자열
<time>2011-W47</time>
네 개 이상의 ASCII 숫자. 그중 적어도 하나는 U+0030 DIGIT ZERO (0)가 아님
<time>2011</time>
<time>0001</time>
유효한 기간 문자열
<time>PT4H18M3S</time>
<time>4h 18m 3s</time>

요소 콘텐츠의 기계가 읽을 수 있는 등가물은 요소의 날짜시간 값에서 다음 알고리즘을 사용하여 얻어야 한다:

  1. 요소의 날짜시간 값에서 월 문자열을 구문 분석한 결과가 이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  2. 요소의 날짜시간 값에서 날짜 문자열을 구문 분석한 결과가 날짜이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  3. 요소의 날짜시간 값에서 연도 없는 날짜 문자열을 구문 분석한 결과가 연도 없는 날짜이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  4. 요소의 날짜시간 값에서 시간 문자열을 구문 분석한 결과가 시간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  5. 요소의 날짜시간 값에서 현지 날짜 및 시간 문자열을 구문 분석한 결과가 현지 날짜 및 시간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  6. 요소의 날짜시간 값에서 시간대 오프셋 문자열을 구문 분석한 결과가 시간대 오프셋이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  7. 요소의 날짜시간 값에서 전역 날짜 및 시간 문자열을 구문 분석한 결과가 전역 날짜 및 시간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  8. 요소의 날짜시간 값에서 주 문자열을 구문 분석한 결과가 이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  9. 요소의 날짜시간 값이 오직 ASCII 숫자로만 구성되고, 그중 적어도 하나가 U+0030 DIGIT ZERO (0)가 아니면, 기계가 읽을 수 있는 등가물은 해당 숫자를 연도로 나타내는 십진수 해석이다. 반환한다.

  10. 요소의 날짜시간 값에서 기간 문자열을 구문 분석한 결과가 기간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.

  11. 기계가 읽을 수 있는 등가물이 없다.

위에서 참조한 알고리즘은 임의의 문자열 s에 대해 오직 하나의 알고리즘만 값을 반환하도록 설계된 것이다. 더 효율적인 방법은 이러한 모든 데이터 유형을 한 번에 구문 분석하는 단일 알고리즘을 만드는 것일 수 있다. 그러한 알고리즘의 개발은 독자의 연습 문제로 남겨 둔다.

time 요소는 예를 들어 마이크로포맷에서 날짜를 인코딩하는 데 사용할 수 있다. 다음은 time 요소를 사용하는 hCalendar 변형을 통해 이벤트를 인코딩하는 가상의 방법을 보여 준다:

<div class="vevent">
 <a class="url" href="http://www.web2con.com/">http://www.web2con.com/</a>
 <span class="summary">Web 2.0 Conference</span>:
 <time class="dtstart" datetime="2005-10-05">October 5</time> -
 <time class="dtend" datetime="2005-10-07">7</time>,
 at the <span class="location">Argent Hotel, San Francisco, CA</span>
</div>

여기서는 Atom 어휘를 기반으로 한 가상의 마이크로데이터 어휘를 time 요소와 함께 사용하여 블로그 게시물의 게시 날짜를 마크업한다.

<article itemscope itemtype="https://n.example.org/rfc4287">
 <h1 itemprop="title">Big tasks</h1>
 <footer>Published <time itemprop="published" datetime="2009-08-29">two days ago</time>.</footer>
 <p itemprop="content">Today, I went out and bought a bike for my kid.</p>
</article>

이 예제에서는 다른 기사의 게시 날짜를 time을 사용하여 마크업한다. 이번에는 schema.org 마이크로데이터 어휘를 사용한다:

<article itemscope itemtype="http://schema.org/BlogPosting">
 <h1 itemprop="headline">Small tasks</h1>
 <footer>Published <time itemprop="datePublished" datetime="2009-08-30">yesterday</time>.</footer>
 <p itemprop="articleBody">I put a bike bell on her bike.</p>
</article>

다음 조각에서는 나중에 스크립트로 처리할 수 있도록 time 요소를 사용하여 ISO8601 형식으로 날짜를 인코딩한다:

<p>Our first date was <time datetime="2006-09-23">a Saturday</time>.</p>

두 번째 조각에서는 값에 시간이 포함된다:

<p>We stopped talking at <time datetime="2006-09-24T05:00-07:00">5am the next morning</time>.</p>

페이지가 로드한 스크립트는 페이지가 날짜와 시간을 time 요소로 마크업한다는 내부 규칙을 알고 있으므로, 페이지를 훑으면서 그 안의 모든 time 요소를 확인하여 날짜와 시간의 색인을 만들 수 있다.

예를 들어 이 요소는 "Friday"라는 문자열에, 2011년 11월 18일이 "Friday"에 대응하는 의미라는 추가 의미 체계를 함께 전달한다:

Today is <time datetime="2011-11-18">Friday</time>.

이 예제에서는 태평양 표준시 시간대의 특정 시각을 지정한다:

Your next meeting is at <time datetime="2011-11-18T15:00-08:00">3pm</time>.

4.5.15 code 요소

Element/code

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

code 요소는 컴퓨터 코드의 조각을 나타낸다. 이는 XML 요소 이름, 파일 이름, 컴퓨터 프로그램 또는 컴퓨터가 인식할 수 있는 기타 문자열일 수 있다.

마크업되는 컴퓨터 코드의 언어를 나타내는 공식적인 방법은 없다. 예를 들어 구문 강조 스크립트가 올바른 규칙을 사용할 수 있도록 code 요소에 사용된 언어를 표시하려는 작성자는 class 속성을 사용할 수 있다. 예를 들어 요소에 "language-" 접두사가 붙은 클래스를 추가할 수 있다.

다음 예제는 문장 부호를 포함하여 요소 이름과 컴퓨터 코드를 마크업하기 위해 단락에서 이 요소를 사용하는 방법을 보여 준다.

<p>The <code>code</code> element represents a fragment of computer
code.</p>

<p>When you call the <code>activate()</code> method on the
<code>robotSnowman</code> object, the eyes glow.</p>

<p>The example below uses the <code>begin</code> keyword to indicate
the start of a statement block. It is paired with an <code>end</code>
keyword, which is followed by the <code>.</code> punctuation character
(full stop) to indicate the end of the program.</p>

다음 예제는 precode 요소를 사용하여 코드 블록을 마크업하는 방법을 보여 준다.

<pre><code class="language-pascal">var i: Integer;
begin
   i := 1;
end.</code></pre>

이 예제에서는 사용된 언어를 나타내기 위해 클래스를 사용한다.

자세한 내용은 pre 요소를 참조한다.

4.5.16 var 요소

Element/var

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

var 요소는 변수를 나타낸다. 이는 수학 표현식이나 프로그래밍 맥락의 실제 변수, 상수를 나타내는 식별자, 물리량을 식별하는 기호, 함수 매개변수 또는 산문에서 자리표시자로 사용되는 용어일 수 있다.

아래 단락에서는 문자 "n"을 산문 안의 변수로 사용한다:

<p>If there are <var>n</var> pipes leading to the ice
cream factory then I expect at <em>least</em> <var>n</var>
flavors of ice cream to be available for purchase!</p>

수학, 특히 가장 간단한 표현식을 넘어서는 모든 경우에는 MathML이 더 적절하다. 그러나 var 요소는 이후 MathML 표현식에서 언급되는 특정 변수를 참조하는 데 여전히 사용할 수 있다.

이 예제에서는 방정식과 그 방정식의 변수를 참조하는 범례를 보여 준다. 표현식 자체는 MathML로 마크업하지만, 그림의 범례에 언급되는 변수에는 var를 사용한다.

<figure>
 <math>
  <mi>a</mi>
  <mo>=</mo>
  <msqrt>
   <msup><mi>b</mi><mn>2</mn></msup>
   <mi>+</mi>
   <msup><mi>c</mi><mn>2</mn></msup>
  </msqrt>
 </math>
 <figcaption>
  Using Pythagoras' theorem to solve for the hypotenuse <var>a</var> of
  a triangle with sides <var>b</var> and <var>c</var>
 </figcaption>
</figure>

여기서는 질량-에너지 등가성을 설명하는 방정식을 문장 안에서 사용하고, var 요소를 사용하여 그 방정식의 변수와 상수를 마크업한다:

<p>Then she turned to the blackboard and picked up the chalk. After a few moment's
thought, she wrote <var>E</var> = <var>m</var> <var>c</var><sup>2</sup>. The teacher
looked pleased.</p>

4.5.17 samp 요소

Element/samp

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

samp 요소는 다른 프로그램 또는 컴퓨팅 시스템의 예제 출력이나 인용된 출력을 나타낸다.

자세한 내용은 prekbd 요소를 참조한다.

이 요소는 웹 애플리케이션에서 즉각적인 출력을 제공하는 데 사용할 수 있는 output 요소와 대비할 수 있다.

이 예제는 samp 요소를 인라인으로 사용하는 방법을 보여 준다:

<p>The computer said <samp>Too much cheese in tray
two</samp> but I didn't know what that meant.</p>

두 번째 예제는 콘솔 프로그램의 예제 출력 블록을 보여 준다. 중첩된 sampkbd 요소를 사용하면 스타일시트로 예제 출력의 특정 요소에 스타일을 지정할 수 있다. 또한 samp의 일부에는 훨씬 더 상세한 마크업으로 주석을 달아 매우 정밀한 스타일 지정을 가능하게 한다. 이를 위해 span 요소를 사용한다.

<pre><samp><span class="prompt">jdoe@mowmow:~$</span> <kbd>ssh demo.example.com</kbd>
Last login: Tue Apr 12 09:10:17 2005 from mowmow.example.com on pts/1
Linux demo 2.6.10-grsec+gg3+e+fhs6b+nfs+gr0501+++p3+c4a+gr2b-reslog-v6.189 #1 SMP Tue Feb 1 11:22:36 PST 2005 i686 unknown

<span class="prompt">jdoe@demo:~$</span> <span class="cursor">_</span></samp></pre>

세 번째 예제는 입력 블록과 그에 대응하는 출력을 보여 준다. 이 예제는 codesamp 요소를 모두 사용한다.

<pre>
<code class="language-javascript">console.log(2.3 + 2.4)</code>
<samp>4.699999999999999</samp>
</pre>

4.5.18 kbd 요소

Element/kbd

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

kbd 요소는 사용자 입력 (일반적으로 키보드 입력이지만 음성 명령과 같은 다른 입력을 나타내는 데도 사용할 수 있음)을 나타낸다.

kbd 요소가 samp 요소 안에 중첩되면, 시스템에서 에코된 입력을 나타낸다.

kbd 요소가 samp 요소를 포함하면, 메뉴 항목을 호출하는 경우처럼 시스템 출력을 기반으로 한 입력을 나타낸다.

kbd 요소가 다른 kbd 요소 안에 중첩되면, 입력 메커니즘에 적합한 실제 키 또는 기타 단일 입력 단위를 나타낸다.

여기서는 kbd 요소를 사용하여 눌러야 할 키를 나타낸다:

<p>To make George eat an apple, press <kbd><kbd>Shift</kbd> + <kbd>F3</kbd></kbd></p>

두 번째 예제에서는 사용자에게 특정 메뉴 항목을 선택하라고 지시한다. 바깥쪽 kbd 요소는 입력 블록을 마크업하고, 안쪽 kbd 요소는 입력의 각 개별 단계를 나타내며, 그 안의 samp 요소는 각 단계가 시스템에 표시되는 것, 이 경우에는 메뉴 레이블을 기반으로 한 입력임을 나타낸다:

<p>To make George eat an apple, select
    <kbd><kbd><samp>File</samp></kbd>|<kbd><samp>Eat Apple...</samp></kbd></kbd>
</p>

이 정도의 정밀함은 필요하지 않다. 다음도 똑같이 적절하다:

<p>To make George eat an apple, select <kbd>File | Eat Apple...</kbd></p>

4.5.19 subsup 요소

Element/sub

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Element/sup

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
sub 요소: 작성자용; 구현자용.
sup 요소: 작성자용; 구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

sup 요소는 위 첨자를 나타내고, sub 요소는 아래 첨자를 나타낸다.

이 요소들은 단지 표현을 위한 조판이 아니라 특정 의미가 있는 조판 관례를 마크업하는 데만 사용해야 한다. 예를 들어 LaTeX 문서 작성 시스템의 이름에 subsup 요소를 사용하는 것은 적절하지 않다. 일반적으로 작성자는 이 요소가 없으면 콘텐츠의 의미가 달라지는 경우에만 이 요소를 사용해야 한다.

일부 언어에서는 위 첨자가 특정 약어의 조판 관례 일부이다.

<p>Their names are
<span lang="fr"><abbr>M<sup>lle</sup></abbr> Gwendoline</span> and
<span lang="fr"><abbr>M<sup>me</sup></abbr> Denise</span>.</p>

sub 요소는 아래 첨자가 있는 변수의 경우 var 요소 안에서 사용할 수 있다.

여기서는 sub 요소를 사용하여 변수군에서 변수를 식별하는 아래 첨자를 나타낸다:

<p>The coordinate of the <var>i</var>th point is
(<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>).
For example, the 10th point has coordinate
(<var>x<sub>10</sub></var>, <var>y<sub>10</sub></var>).</p>

수학 표현식에서는 아래 첨자와 위 첨자를 자주 사용한다. 작성자는 수학 마크업에 MathML을 사용하는 것이 권장되지만, 자세한 수학적 마크업이 필요하지 않은 경우 subsup 사용을 선택할 수 있다. [MATHML]

<var>E</var>=<var>m</var><var>c</var><sup>2</sup>
f(<var>x</var>, <var>n</var>) = log<sub>4</sub><var>x</var><sup><var>n</var></sup>

4.5.20 i 요소

Element/i

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

i 요소는 분류학적 명칭, 전문 용어, 다른 언어의 관용구, 음역, 생각 또는 서양 문서의 선박 이름처럼 다른 특성을 가진 텍스트임을 나타내는 방식으로 대체 목소리나 분위기의 텍스트 구간 또는 일반적인 산문과 달리 구별되는 텍스트 구간을 나타낸다.

본문과 다른 언어의 용어에는 lang 속성(XML에서는 XML 네임스페이스lang 속성)으로 주석을 달아야 한다.

아래 예제는 i 요소의 사용법을 보여 준다:

<p>The <i class="taxonomy">Felis silvestris catus</i> is cute.</p>
<p>The term <i>prose content</i> is defined above.</p>
<p>There is a certain <i lang="fr">je ne sais quoi</i> in the air.</p>

다음 예제에서는 꿈의 장면을 i 요소로 마크업한다.

<p>Raymond tried to sleep.</p>
<p><i>The ship sailed away on Thursday</i>, he
dreamt. <i>The ship had many people aboard, including a beautiful
princess called Carey. He watched her, day-in, day-out, hoping she
would notice him, but she never did.</i></p>
<p><i>Finally one night he picked up the courage to speak with
her—</i></p>
<p>Raymond woke with a start as the fire alarm rang out.</p>

작성자는 i 요소에 class 속성을 사용하여 요소를 사용하는 이유를 식별할 수 있다. 그러면 특정 사용 방식의 스타일(예: 분류학적 용어와 대비되는 꿈의 장면)을 나중에 변경할 때 작성자가 문서 전체(또는 관련 문서 묶음)를 훑으면서 각 사용 부분에 주석을 추가할 필요가 없다.

작성자는 i 요소보다 다른 요소가 더 적절한지 고려하는 것이 권장된다. 예를 들어 강세 강조를 마크업하려면 em 요소를, 용어의 정의 인스턴스를 마크업하려면 dfn 요소를 사용한다.

다른 요소의 스타일을 변경할 수 있는 것과 마찬가지로 스타일시트를 사용하여 i 요소의 형식을 지정할 수 있다. 따라서 i 요소의 콘텐츠가 반드시 기울임꼴로 표시되는 것은 아니다.

4.5.21 b 요소

Element/b

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

b 요소는 추가적인 중요성을 전달하거나 대체 목소리나 분위기를 암시하지 않으면서 실용적인 목적으로 주의를 끄는 텍스트 구간을 나타낸다. 예를 들어 문서 초록의 키워드, 리뷰의 제품 이름, 대화형 텍스트 기반 소프트웨어의 실행 가능한 단어 또는 기사의 리드가 이에 해당한다.

다음 예제는 키워드를 중요하다고 마크업하지 않으면서 강조하기 위해 b 요소를 사용하는 방법을 보여 준다:

<p>The <b>frobonitor</b> and <b>barbinator</b> components are fried.</p>

다음 예제에서는 텍스트 어드벤처의 객체를 b 요소를 사용하여 특별한 것으로 강조한다.

<p>You enter a small room. Your <b>sword</b> glows
brighter. A <b>rat</b> scurries past the corner wall.</p>

b 요소가 적절한 또 다른 경우는 리드 문장이나 단락을 마크업할 때이다. 다음 예제는 새끼 고양이가 토끼를 어미로 받아들인 것에 관한 BBC 기사를 마크업하는 방법을 보여 준다:

<article>
 <h2>Kittens 'adopted' by pet rabbit</h2>
 <p><b class="lede">Six abandoned kittens have found an
 unexpected new mother figure — a pet rabbit.</b></p>
 <p>Veterinary nurse Melanie Humble took the three-week-old
 kittens to her Aberdeen home.</p>
[...]

i 요소와 마찬가지로 작성자는 b 요소에 class 속성을 사용하여 요소를 사용하는 이유를 식별할 수 있다. 그러면 특정 사용 방식의 스타일을 나중에 변경할 때 작성자가 각 사용 부분에 일일이 주석을 추가할 필요가 없다.

b 요소는 더 적절한 다른 요소가 없을 때 최후의 수단으로 사용해야 한다. 특히 제목에는 h1 부터 h6 요소를 사용하고, 강세 강조에는 em 요소를 사용하며, 중요성은 strong 요소로 나타내고, 표시하거나 강조하는 텍스트에는 mark 요소를 사용해야 한다.

다음은 잘못된 사용법이다:

<p><b>WARNING!</b> Do not frob the barbinator!</p>

앞 예제에서 올바른 요소는 b가 아니라 strong이다.

다른 요소의 스타일을 변경할 수 있는 것과 마찬가지로 스타일시트를 사용하여 b 요소의 형식을 지정할 수 있다. 따라서 b 요소의 콘텐츠가 반드시 굵게 표시되는 것은 아니다.

4.5.22 u 요소

Element/u

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

u 요소는 명확히 표현되어 렌더링되지만 말로 표현되지 않은 비텍스트 주석이 있는 텍스트 구간을 나타낸다. 예를 들어 중국어 텍스트에서 고유명사라고 표시하거나(중국어 고유명사 표시), 철자가 틀렸다고 표시하는 경우가 이에 해당한다.

대부분의 경우 다른 요소가 더 적절할 가능성이 높다. 강세 강조에는 em 요소를 사용해야 한다. 키워드나 구문을 표시할 때는 맥락에 따라 b 요소 또는 mark 요소를 사용해야 한다. 책 제목에는 cite 요소를 사용해야 한다. 명시적인 텍스트 주석으로 텍스트에 레이블을 지정할 때는 ruby 요소를 사용해야 한다. 전문 용어, 분류학적 명칭, 음역, 생각 또는 서양 문서의 선박 이름에는 i 요소를 사용해야 한다.

시각적 표현에서 u 요소의 기본 렌더링은 하이퍼링크의 관례적인 렌더링(밑줄)과 충돌한다. 작성자는 하이퍼링크로 오인될 수 있는 곳에서 u 요소를 사용하지 않는 것이 권장된다.

이 예제에서는 u 요소를 사용하여 단어의 철자가 틀렸음을 표시한다:

<p>The <u>see</u> is full of fish.</p>

4.5.23 mark 요소

Element/mark

현재의 모든 엔진에서 지원된다.

Firefox4+Safari5.1+Chrome7+
Opera11+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

mark 요소는 다른 맥락에서의 관련성 때문에 한 문서에서 참조 목적으로 표시하거나 강조한 텍스트 구간을 나타낸다. 산문에서 참조하는 인용문이나 기타 텍스트 블록에 사용하면 원래는 존재하지 않았지만, 블록을 처음 작성할 때 원저자가 중요하다고 생각하지 않았을 수 있으나 이제 예상하지 못한 관점에서 검토 대상이 된 텍스트 부분에 독자의 주의를 끌기 위해 추가된 강조를 나타낸다. 문서의 본문에 사용하면 사용자의 현재 활동과 관련될 가능성이 높아 강조한 문서의 일부를 나타낸다.

이 예제는 인용문의 특정 부분에 주의를 끌기 위해 mark 요소를 사용하는 방법을 보여 준다:

<p lang="en-US">Consider the following quote:</p>
<blockquote lang="en-GB">
 <p>Look around and you will find, no-one's really
 <mark>colour</mark> blind.</p>
</blockquote>
<p lang="en-US">As we can tell from the <em>spelling</em> of the word,
the person writing this quote is clearly not American.</p>

(그러나 요소를 철자가 틀린 것으로 표시하는 것이 목적이라면, 클래스가 지정될 수도 있는 u 요소가 더 적절하다.)

mark 요소의 또 다른 예는 일부 검색 문자열과 일치하는 문서 부분을 강조하는 것이다. 누군가 문서를 보고 있고 서버가 사용자가 "kitten"이라는 단어를 검색 중임을 안다면, 서버는 단락 하나를 다음과 같이 수정한 문서를 반환할 수 있다:

<p>I also have some <mark>kitten</mark>s who are visiting me
these days. They're really cute. I think they like my garden! Maybe I
should adopt a <mark>kitten</mark>.</p>

다음 조각에서는 텍스트 단락이 코드 조각의 특정 부분을 참조한다.

<p>The highlighted part below is where the error lies:</p>
<pre><code>var i: Integer;
begin
   i := <mark>1.1</mark>;
end.</code></pre>

이는 구문 강조와는 별개이며, 구문 강조에는 span이 더 적절하다. 두 가지를 결합하면 다음과 같다:

<p>The highlighted part below is where the error lies:</p>
<pre><code><span class=keyword>var</span> <span class=ident>i</span>: <span class=type>Integer</span>;
<span class=keyword>begin</span>
   <span class=ident>i</span> := <span class=literal><mark>1.1</mark></span>;
<span class=keyword>end</span>.</code></pre>

이는 원래 강조되지 않았던 인용 텍스트의 일부를 강조하기 위해 mark를 사용하는 또 다른 예이다. 이 예제에서는 일반적인 조판 관례에 따라 작성자가 인용문 안의 mark 요소를 명시적으로 기울임꼴로 렌더링하도록 스타일을 지정했다.

<style>
 blockquote mark, q mark {
   font: inherit; font-style: italic;
   text-decoration: none;
   background: transparent; color: inherit;
 }
 .bubble em {
   font: inherit; font-size: larger;
   text-decoration: underline;
 }
</style>
<article>
 <h1>She knew</h1>
 <p>Did you notice the subtle joke in the joke on panel 4?</p>
 <blockquote>
  <p class="bubble">I didn't <em>want</em> to believe. <mark>Of course
  on some level I realized it was a known-plaintext attack.</mark> But I
  couldn't admit it until I saw for myself.</p>
 </blockquote>
 <p>(Emphasis mine.) I thought that was great. It's so pedantic, yet it
 explains everything neatly.</p>
</article>

덧붙여 이 예제에서 원래 인용된 텍스트의 일부인 em 요소와, 설명을 위해 일부를 강조하는 mark 요소의 차이에 유의한다.

다음 예제는 텍스트 구간의 중요성(strong)을 나타내는 것과 텍스트 구간의 관련성(mark)을 나타내는 것의 차이를 보여 준다. 이는 교과서에서 발췌한 것으로, 시험과 관련된 부분을 강조했다. 안전 경고는 중요할 수 있지만 시험과는 관련이 없는 것으로 보인다.

<h3>Wormhole Physics Introduction</h3>

<p><mark>A wormhole in normal conditions can be held open for a
maximum of just under 39 minutes.</mark> Conditions that can increase
the time include a powerful energy source coupled to one or both of
the gates connecting the wormhole, and a large gravity well (such as a
black hole).</p>

<p><mark>Momentum is preserved across the wormhole. Electromagnetic
radiation can travel in both directions through a wormhole,
but matter cannot.</mark></p>

<p>When a wormhole is created, a vortex normally forms.
<strong>Warning: The vortex caused by the wormhole opening will
annihilate anything in its path.</strong> Vortexes can be avoided when
using sufficiently advanced dialing technology.</p>

<p><mark>An obstruction in a gate will prevent it from accepting a
wormhole connection.</mark></p>

4.5.24 bdi 요소

Element/bdi

현재의 모든 엔진에서 지원된다.

Firefox10+Safari6+Chrome16+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
또한 dir 전역 속성은 이 요소에서 특별한 의미 체계를 가진다.
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

bdi 요소는 양방향 텍스트 형식 지정의 목적으로 주변 환경에서 격리할 텍스트 구간을 나타낸다. [BIDI]

dir 전역 속성은 이 요소에서 기본값이 auto이다(다른 요소에서처럼 부모 요소로부터 상속되지 않는다).

이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.

이 요소는 방향성을 알 수 없는 사용자 생성 콘텐츠를 삽입할 때 특히 유용하다.

이 예제에서는 사용자 이름과 사용자가 제출한 게시물 수를 함께 표시한다. bdi 요소를 사용하지 않았다면 아랍어 사용자의 사용자 이름이 텍스트를 혼란스럽게 만들었을 것이다(양방향 알고리즘은 콜론과 숫자 "3"을 "posts"라는 단어 옆이 아니라 "User"라는 단어 옆에 배치했을 것이다).

<ul>
 <li>User <bdi>jcranmer</bdi>: 12 posts.
 <li>User <bdi>hober</bdi>: 5 posts.
 <li>User <bdi>إيان</bdi>: 3 posts.
</ul>
bdi 요소를 사용하면 사용자 이름이 예상대로 동작한다.
bdi 요소를 b 요소로 바꾸면, 사용자 이름이 양방향 알고리즘을 혼란스럽게 하여 세 번째 항목은 "User 3 :"라고 표시된 뒤 아랍어 이름(오른쪽에서 왼쪽 방향), "posts" 및 마침표가 이어진다.

4.5.25 bdo 요소

Element/bdo

현재의 모든 엔진에서 지원된다.

Firefox10+Safari4+Chrome15+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
또한 dir 전역 속성은 이 요소에서 특별한 의미 체계를 가진다.
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

bdo 요소는 자식의 명시적인 텍스트 방향성 형식 제어를 나타낸다. 작성자는 명시적으로 방향 재정의를 지정하여 유니코드 양방향 알고리즘을 재정의할 수 있다. [BIDI]

작성자는 이 요소에 dir 속성을 반드시 지정해야 한다. 왼쪽에서 오른쪽 방향 재정의를 지정하려면 값 ltr을 사용하고, 오른쪽에서 왼쪽 방향 재정의를 지정하려면 값 rtl을 사용한다. auto 값은 지정해서는 안 된다.

이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.

4.5.26 span 요소

Element/span

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLSpanElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
구문 콘텐츠.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLSpanElement : HTMLElement {
  [HTMLConstructor] constructor();
};

span 요소는 그 자체로는 아무런 의미가 없지만, 예를 들어 class, lang 또는 dir과 같은 전역 속성과 함께 사용하면 유용할 수 있다. 이 요소는 자신의 자식을 나타낸다.

이 예제에서는 코드 조각을 span 요소와 class 속성으로 마크업하여, CSS에서 키워드와 식별자에 색상을 지정할 수 있게 한다:

<pre><code class="lang-c"><span class="keyword">for</span> (<span class="ident">j</span> = 0; <span class="ident">j</span> &lt; 256; <span class="ident">j</span>++) {
  <span class="ident">i_t3</span> = (<span class="ident">i_t3</span> & 0x1ffff) | (<span class="ident">j</span> &lt;&lt; 17);
  <span class="ident">i_t6</span> = (((((((<span class="ident">i_t3</span> >> 3) ^ <span class="ident">i_t3</span>) >> 1) ^ <span class="ident">i_t3</span>) >> 8) ^ <span class="ident">i_t3</span>) >> 5) & 0xff;
  <span class="keyword">if</span> (<span class="ident">i_t6</span> == <span class="ident">i_t1</span>)
    <span class="keyword">break</span>;
}</code></pre>

4.5.27 br 요소

Element/br

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLBRElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
구문 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그가 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
[Exposed=Window]
interface HTMLBRElement : HTMLElement {
  [HTMLConstructor] constructor();

  // also has obsolete members
};

br 요소는 줄 바꿈을 나타낸다.

줄 바꿈은 일반적으로 시각 매체에서 뒤따르는 텍스트를 물리적으로 새 줄로 이동하여 나타내지만, 스타일시트나 사용자 에이전트가 줄 바꿈을 녹색 점이나 추가 간격과 같은 다른 방식으로 렌더링해도 마찬가지로 타당하다.

br 요소는 시나 주소처럼 실제로 콘텐츠의 일부인 줄 바꿈에만 사용해야 한다.

다음 예제는 br 요소를 올바르게 사용한 것이다:

<p>P. Sherman<br>
42 Wallaby Way<br>
Sydney</p>

br 요소는 단락 안에서 주제별 그룹을 구분하는 데 사용해서는 안 된다.

다음 예제는 br 요소를 오용하므로 적합하지 않다:

<p><a ...>34 comments.</a><br>
<a ...>Add a comment.</a></p>
<p><label>Name: <input name="name"></label><br>
<label>Address: <input name="address"></label></p>

다음은 위 예제의 올바른 대안이다:

<p><a ...>34 comments.</a></p>
<p><a ...>Add a comment.</a></p>
<p><label>Name: <input name="name"></label></p>
<p><label>Address: <input name="address"></label></p>

단락이 단 하나의 br 요소로만 구성된 경우, 자리표시자 빈 줄(예: 템플릿에서)을 나타낸다. 이러한 빈 줄은 표현 목적으로 사용해서는 안 된다.

br 요소 내부의 모든 콘텐츠는 주변 텍스트의 일부로 간주해서는 안 된다.

이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.

4.5.28 wbr 요소

Element/wbr

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera11.6+Edge79+
Edge (Legacy)?Internet Explorer5.5–7
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+
범주:
플로 콘텐츠.
구문 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그가 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
기본.
DOM 인터페이스:
HTMLElement를 사용한다.

wbr 요소는 줄 바꿈 기회를 나타낸다.

다음 예제에서는 효과를 위해 누군가가 말한 내용을 하나의 긴 단어로 작성했다. 그러나 텍스트를 읽기 쉬운 방식으로 줄 바꿈할 수 있도록 인용문의 각 단어를 wbr 요소로 구분한다.

<p>So then she pointed at the tiger and screamed
"there<wbr>is<wbr>no<wbr>way<wbr>you<wbr>are<wbr>ever<wbr>going<wbr>to<wbr>catch<wbr>me"!</p>

wbr 요소 내부의 모든 콘텐츠는 주변 텍스트의 일부로 간주해서는 안 된다.

var wbr = document.createElement("wbr");
wbr.textContent = "This is wrong";
document.body.appendChild(wbr);

이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.

4.5.29 사용 요약

이 절은 비규범적이다.

요소 목적 예제
a 하이퍼링크
Visit my <a href="drinks.html">drinks</a> page.
em 강세 강조
I must say I <em>adore</em> lemonade.
strong 중요성
This tea is <strong>very hot</strong>.
small 부가 설명
These grapes are made into wine. <small>Alcohol is addictive.</small>
s 부정확한 텍스트
Price: <s>£4.50</s> £2.00!
cite 작품 제목
The case <cite>Hugo v. Danielle</cite> is relevant here.
q 인용문
The judge said <q>You can drink water from the fish tank</q> but advised against it.
dfn 정의 인스턴스
The term <dfn>organic food</dfn> refers to food produced without synthetic chemicals.
abbr 약어
Organic food in Ireland is certified by the <abbr title="Irish Organic Farmers and Growers Association">IOFGA</abbr>.
ruby, rt, rp 루비 주석
<ruby> OJ <rp>(<rt>Orange Juice<rp>)</ruby>
data 기계가 읽을 수 있는 등가물
Available starting today! <data value="UPC:022014640201">North Coast Organic Apple Cider</data>
time 날짜 또는 시간 관련 데이터의 기계가 읽을 수 있는 등가물
Available starting on <time datetime="2011-11-18">November 18th</time>!
code 컴퓨터 코드
The <code>fruitdb</code> program can be used for tracking fruit production.
var 변수
If there are <var>n</var> fruit in the bowl, at least <var>n</var>÷2 will be ripe.
samp 컴퓨터 출력
The computer said <samp>Unknown error -3</samp>.
kbd 사용자 입력
Hit <kbd>F1</kbd> to continue.
sub 아래 첨자
Water is H<sub>2</sub>O.
sup 위 첨자
The Hydrogen in heavy water is usually <sup>2</sup>H.
i 대체 목소리
Lemonade consists primarily of <i>Citrus limon</i>.
b 키워드
Take a <b>lemon</b> and squeeze it with a <b>juicer</b>.
u 주석
The mixture of apple juice and <u class="spelling">eldeflower</u> juice is very pleasant.
mark 강조 표시
Elderflower cordial, with one <mark>part</mark> cordial to ten <mark>part</mark>s water, stands a<mark>part</mark> from the rest.
bdi 텍스트 방향성 격리
The recommended restaurant is <bdi lang="">My Juice Café (At The Beach)</bdi>.
bdo 텍스트 방향성 형식 지정
The proposal is to write English, but in reverse order. "Juice" would become "<bdo dir=rtl>Juice</bdo>">
span 기타
In French we call it <span lang="fr">sirop de sureau</span>.
br 줄 바꿈
Simply Orange Juice Company<br>Apopka, FL 32703<br>U.S.A.
wbr 줄 바꿈 기회
www.simply<wbr>orange<wbr>juice.com

4.6.1 소개

링크는 a, area, formlink 요소가 생성하는 개념적 구성으로, 두 리소스 사이의 연결을 나타낸다. 그중 하나는 현재의 Document이다. HTML에는 세 종류의 링크가 있다:

외부 리소스에 대한 링크

현재 문서를 보강하는 데 사용할 리소스에 대한 링크로, 일반적으로 사용자 에이전트가 자동으로 처리한다. 모든 외부 리소스 링크에는 리소스를 가져오는 방법을 설명하는 링크된 리소스를 가져와 처리하는 알고리즘이 있다.

하이퍼링크

일반적으로 사용자 에이전트가 사용자에게 노출하여, 사용자가 브라우저에서 방문하거나 다운로드하는 등의 방식으로 사용자 에이전트가 해당 리소스로 탐색하게 할 수 있는 다른 리소스에 대한 링크이다.

내부 리소스 링크

현재 문서 안의 리소스에 대한 링크로, 해당 리소스에 특별한 의미나 동작을 부여하는 데 사용한다.

href 속성과 rel 속성이 있는 link 요소에서는, 링크 유형 절에서 해당 키워드에 관해 정의한 대로 rel 속성의 키워드에 대한 링크를 생성해야 한다.

마찬가지로 href 속성과 rel 속성이 있는 aarea 요소에서는, 링크 유형 절에서 해당 키워드에 관해 정의한 대로 rel 속성의 키워드에 대한 링크를 생성해야 한다. 그러나 link 요소와 달리, href 속성이 있으면서 rel 속성이 없거나, rel 속성에 하이퍼링크를 지정한다고 정의된 키워드가 없는 aarea 요소도 하이퍼링크를 생성해야 한다. 이 암시적 하이퍼링크는 요소의 노드 문서를 요소의 href 속성이 지정한 리소스에 연결하는 것 외에는 특별한 의미가 없다(링크 유형이 없다).

마찬가지로 rel 속성이 있는 form 요소에서는, 링크 유형 절에서 해당 키워드에 관해 정의한 대로 rel 속성의 키워드에 대한 링크를 생성해야 한다. rel 속성이 없거나, rel 속성에 하이퍼링크를 지정한다고 정의된 키워드가 없는 form 요소도 하이퍼링크를 생성해야 한다.

하이퍼링크에는 해당 하이퍼링크의 처리 의미 체계를 변경하는 하나 이상의 하이퍼링크 주석이 있을 수 있다.

aarea 요소의 href 속성 값은 공백으로 둘러싸일 수 있는 유효한 URL이어야 한다.

aarea 요소에는 href 속성이 필수는 아니다. 이러한 요소에 href 속성이 없으면 하이퍼링크를 생성하지 않는다.

target 속성이 존재하는 경우, 그 값은 유효한 탐색 가능 대상 이름 또는 키워드여야 한다. 이 속성은 사용할 탐색 가능 객체의 이름을 제공한다. 사용자 에이전트는 하이퍼링크를 따라갈 때 이 이름을 사용한다.

download 속성이 존재하는 경우, 작성자가 하이퍼링크를 리소스를 다운로드하는 데 사용하려 함을 나타낸다. 속성에는 값이 있을 수 있으며, 값이 있으면 로컬 파일 시스템에서 리소스에 레이블을 지정할 때 작성자가 사용하도록 권장하는 기본 파일 이름을 지정한다. 허용되는 값에는 제한이 없지만, 대부분의 파일 시스템은 파일 이름에서 지원하는 문장 부호에 제한이 있으며 사용자 에이전트가 이에 맞게 파일 이름을 조정할 가능성이 있다는 점에 작성자는 주의해야 한다.

Element/a#attr-ping

현재의 모든 엔진에서 지원된다.

Firefox🔰 1+Safari6+Chrome12+
Opera?Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android≤37+Samsung Internet?Opera Android?

ping 속성이 존재하는 경우, 사용자가 하이퍼링크를 따라갔을 때 알림을 받는 데 관심이 있는 리소스의 URL을 제공한다. 값은 공백으로 구분된 토큰 집합이어야 하며, 각 토큰은 유효한 비어 있지 않은 URL이어야 하고, 해당 URL의 스킴HTTP(S) 스킴이어야 한다. 사용자 에이전트는 이 값을 하이퍼링크 감사에 사용한다.

aarea 요소의 rel 속성은 요소가 생성하는 링크의 종류를 제어한다. 속성 값은 고유하며 공백으로 구분된 토큰의 순서 없는 집합이어야 한다. 허용되는 키워드와 그 의미는 아래에서 정의한다.

rel지원되는 토큰aarea 요소에 허용되고, 처리 모델에 영향을 주며, 사용자 에이전트가 지원하는 HTML 링크 유형에 정의된 키워드이다. 가능한 지원되는 토큰noreferrer, noopeneropener이다. rel지원되는 토큰에는 이 목록에서 사용자 에이전트가 처리 모델을 구현한 토큰만 포함되어야 한다.

rel 속성에는 기본값이 없다. 속성을 생략했거나 속성의 값 중 사용자 에이전트가 인식하는 값이 없으면, 문서와 대상 리소스 사이에는 두 리소스를 연결하는 하이퍼링크가 있다는 것 외에 특별한 관계가 없다.

referrerpolicy 속성은 리퍼러 정책 속성이다. 이 속성의 목적은 하이퍼링크를 따라갈 때 사용할 리퍼러 정책을 설정하는 것이다. [REFERRERPOLICY]


a 또는 area 요소의 활성화 동작이 호출되면, 사용자 에이전트는 사용자에게 하이퍼링크를 탐색에 사용할지 또는 하이퍼링크가 지정한 리소스를 다운로드할지에 관한 선호를 표시하도록 허용할 수 있다.

사용자 선호가 없는 경우, 요소에 download 속성이 없으면 기본값은 탐색이어야 하고, 속성이 있으면 지정된 리소스를 다운로드하는 것이어야 한다.

이벤트 event가 주어졌을 때 a 또는 area 요소 element활성화 동작은 다음과 같다:

  1. elementhref 속성이 없으면 반환한다.

  2. hyperlinkSuffix를 null로 둔다.

  3. elementa 요소이고, event대상ismap 속성이 지정된 img이면:

    1. xy를 0으로 둔다.

    2. eventisTrusted 속성이 true로 초기화되었으면, x를 이미지의 왼쪽 가장자리부터 클릭 위치까지의 CSS 픽셀 단위 거리로 설정하고, y를 이미지의 위쪽 가장자리부터 클릭 위치까지의 CSS 픽셀 단위 거리로 설정한다.

    3. x가 음수이면 x를 0으로 설정한다.

    4. y가 음수이면 y를 0으로 설정한다.

    5. hyperlinkSuffix를 U+003F (?), ASCII 숫자를 사용하여 십진 정수로 표현한 x의 값, U+002C (,), 그리고 ASCII 숫자를 사용하여 십진 정수로 표현한 y의 값을 이어 붙인 값으로 설정한다.

  4. userInvolvementevent사용자 탐색 관여로 둔다.

  5. 사용자가 하이퍼링크를 다운로드하겠다는 선호를 표시했으면, userInvolvement를 "브라우저 UI"로 설정한다.

    즉, 사용자가 다운로드에 대한 명시적 선호를 표시했다면 더 이상 단순한 "활성화"로 간주하지 않는다.

  6. elementdownload 속성이 있거나 사용자가 하이퍼링크를 다운로드하겠다는 선호를 표시했으면, hyperlinkSuffixhyperlinkSuffix로, userInvolvementuserInvolvement로 설정하여 element가 생성한 하이퍼링크를 다운로드한다.

  7. 그렇지 않으면 hyperlinkSuffixhyperlinkSuffix로, userInvolvementuserInvolvement로 설정하여 element가 생성한 하이퍼링크를 따라간다.

interface mixin HyperlinkElementUtils {
  readonly attribute USVString origin;
  [CEReactions] attribute USVString protocol;
  [CEReactions] attribute USVString username;
  [CEReactions] attribute USVString password;
  [CEReactions] attribute USVString host;
  [CEReactions] attribute USVString hostname;
  [CEReactions] attribute USVString port;
  [CEReactions] attribute USVString pathname;
  [CEReactions] attribute USVString search;
  [CEReactions] attribute USVString hash;

  [CEReactions, Reflect] attribute DOMString hreflang;
  [CEReactions, Reflect] attribute DOMString type;
};
hyperlink.origin

HTMLAnchorElement/origin

현재의 모든 엔진에서 지원된다.

Firefox26+Safari5.1+Chrome8+
Opera?Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android?

HTMLAreaElement/origin

현재의 모든 엔진에서 지원된다.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android?

하이퍼링크 URL의 출처를 반환한다.

hyperlink.protocol

HTMLAnchorElement/protocol

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/protocol

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 스킴을 반환한다.

URL의 스킴을 변경하도록 설정할 수 있다.

hyperlink.username

HTMLAnchorElement/username

현재의 모든 엔진에서 지원된다.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/username

현재의 모든 엔진에서 지원된다.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 사용자 이름을 반환한다.

URL의 사용자 이름을 변경하도록 설정할 수 있다.

hyperlink.password

HTMLAnchorElement/password

현재의 모든 엔진에서 지원된다.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/password

현재의 모든 엔진에서 지원된다.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 비밀번호를 반환한다.

URL의 비밀번호를 변경하도록 설정할 수 있다.

hyperlink.host

HTMLAnchorElement/host

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/host

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 호스트와 포트(스킴의 기본 포트와 다른 경우)를 반환한다.

URL의 호스트와 포트를 변경하도록 설정할 수 있다.

hyperlink.hostname

HTMLAnchorElement/hostname

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/hostname

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 호스트를 반환한다.

URL의 호스트를 변경하도록 설정할 수 있다.

hyperlink.port

HTMLAnchorElement/port

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/port

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 포트를 반환한다.

URL의 포트를 변경하도록 설정할 수 있다.

hyperlink.pathname

HTMLAnchorElement/pathname

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/pathname

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 경로를 반환한다.

URL의 경로를 변경하도록 설정할 수 있다.

hyperlink.search

HTMLAnchorElement/search

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/search

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 쿼리를 반환한다(비어 있지 않으면 앞의 "?"를 포함한다).

URL의 쿼리를 변경하도록 설정할 수 있다(앞의 "?"는 무시한다).

hyperlink.hash

HTMLAnchorElement/hash

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/hash

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크 URL의 조각을 반환한다(비어 있지 않으면 앞의 "#"을 포함한다).

URL의 조각을 변경하도록 설정할 수 있다(앞의 "#"은 무시한다).

HyperlinkElementUtils 믹스인을 구현하는 요소는 하이퍼링크 요소이다.

하이퍼링크 요소에는 연관된 url(null 또는 URL)이 있다. 초기값은 null이다.

하이퍼링크 요소에는 다음 출처 추출 단계가 있다:

  1. thisurl이 null이면 null을 반환한다.

  2. thisurl출처를 반환한다.

하이퍼링크 요소에는 연관된 url 설정 알고리즘이 있어야 한다.

하이퍼링크 요소가 생성되면 사용자 에이전트는 url을 설정해야 한다.

하이퍼링크 요소에는 연관된 url 다시 초기화 알고리즘이 있으며, 다음 단계를 실행한다:

  1. 요소의 url이 null이 아니고, 그 스킴이 "blob"이며, 불투명 경로가 있으면 이 단계를 종료한다.

  2. url을 설정한다.

하이퍼링크 요소에는 연관된 href 업데이트 알고리즘이 있어야 한다.

하이퍼링크 요소하이퍼링크를 생성하는 요소에서 hreflang 속성이 존재하는 경우, 링크된 리소스의 언어를 제공한다. 이는 전적으로 참고용이다. 값은 유효한 BCP 47 언어 태그여야 한다. [BCP47] 사용자 에이전트는 이 속성을 권위 있는 것으로 간주해서는 안 된다. 리소스를 가져온 후 사용자 에이전트는 리소스의 언어를 결정할 때 리소스에 대한 링크에 포함된 메타데이터가 아니라 리소스와 연관된 언어 정보만 사용해야 한다.

하이퍼링크 요소에서 type 속성이 존재하는 경우, 링크된 리소스의 MIME 유형을 제공한다. 이는 전적으로 참고용이다. 값은 유효한 MIME 유형 문자열이어야 한다. 사용자 에이전트는 type 속성을 권위 있는 것으로 간주해서는 안 된다. 리소스를 가져온 후 사용자 에이전트는 리소스의 유형을 결정할 때 리소스에 대한 링크에 포함된 메타데이터를 사용해서는 안 된다.


origin getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. thisurl이 null이면 빈 문자열을 반환한다.

  3. thisurl출처직렬화한 값을 반환한다.

protocol getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. thisurl이 null이면 ":"를 반환한다.

  3. thisurl스킴 뒤에 ":"를 붙여 반환한다.

protocol setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. thisurl이 null이면 반환한다.

  3. 주어진 값 뒤에 ":"를 붙인 값을 기본 URL 구문 분석한다. 이때 thisurlurl로, 스킴 시작 상태상태 재정의로 사용한다.

    URL 구문 분석기는 연속된 여러 콜론을 무시하므로 "https:" 또는 "https::::" 값을 제공하는 것은 "https" 값을 제공하는 것과 같다.

  4. href를 업데이트한다.

username getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. thisurl이 null이면 빈 문자열을 반환한다.

  3. thisurl사용자 이름을 반환한다.

username setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url사용자 이름/비밀번호/포트가 있을 수 없으면 반환한다.

  4. url과 주어진 값을 사용하여 사용자 이름을 설정한다.

  5. href를 업데이트한다.

password getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이면 빈 문자열을 반환한다.

  4. url비밀번호를 반환한다.

password setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url사용자 이름/비밀번호/포트가 있을 수 없으면 반환한다.

  4. url과 주어진 값을 사용하여 비밀번호를 설정한다.

  5. href를 업데이트한다.

host getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url 또는 url호스트가 null이면 빈 문자열을 반환한다.

  4. url포트가 null이면 url호스트직렬화하여 반환한다.

  5. url호스트직렬화한 값 뒤에 ":"와 url포트직렬화한 값을 붙여 반환한다.

host setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url불투명 경로가 있으면 반환한다.

  4. 주어진 값을 기본 URL 구문 분석한다. 이때 urlurl로, 호스트 상태상태 재정의로 사용한다.

  5. href를 업데이트한다.

hostname getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url 또는 url호스트가 null이면 빈 문자열을 반환한다.

  4. url호스트직렬화하여 반환한다.

hostname setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url불투명 경로가 있으면 반환한다.

  4. 주어진 값을 기본 URL 구문 분석한다. 이때 urlurl로, 호스트 이름 상태상태 재정의로 사용한다.

  5. href를 업데이트한다.

port getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url 또는 url포트가 null이면 빈 문자열을 반환한다.

  4. url포트직렬화하여 반환한다.

port setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url사용자 이름/비밀번호/포트가 있을 수 없으면 반환한다.

  4. 주어진 값이 빈 문자열이면 url포트를 null로 설정한다.

  5. 그렇지 않으면 주어진 값을 기본 URL 구문 분석한다. 이때 urlurl로, 포트 상태상태 재정의로 사용한다.

  6. href를 업데이트한다.

pathname getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이면 빈 문자열을 반환한다.

  4. urlURL 경로 직렬화한 결과를 반환한다.

pathname setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url불투명 경로가 있으면 반환한다.

  4. url경로를 빈 목록으로 설정한다.

  5. 주어진 값을 기본 URL 구문 분석한다. 이때 urlurl로, 경로 시작 상태상태 재정의로 사용한다.

  6. href를 업데이트한다.

search getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url쿼리가 null 또는 빈 문자열이면 빈 문자열을 반환한다.

  4. "?" 뒤에 url쿼리를 붙여 반환한다.

search setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이면 이 단계를 종료한다.

  4. 주어진 값이 빈 문자열이면 url쿼리를 null로 설정한다.

  5. 그렇지 않으면:

    1. input을 주어진 값에서 맨 앞의 "?" 하나가 있으면 제거한 값으로 둔다.

    2. url쿼리를 빈 문자열로 설정한다.

    3. input기본 URL 구문 분석한다. 이때 urlurl로, 쿼리 상태상태 재정의로 사용한다.

  6. href를 업데이트한다.

hash getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이거나 url조각이 null 또는 빈 문자열이면 빈 문자열을 반환한다.

  4. "#" 뒤에 url조각을 붙여 반환한다.

hash setter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이면 반환한다.

  4. 주어진 값이 빈 문자열이면 url조각을 null로 설정한다.

  5. 그렇지 않으면:

    1. input을 주어진 값에서 맨 앞의 "#" 하나가 있으면 제거한 값으로 둔다.

    2. url조각을 빈 문자열로 설정한다.

    3. input기본 URL 구문 분석한다. 이때 urlurl로, 조각 상태상태 재정의로 사용한다.

  6. href를 업데이트한다.

4.6.4 aarea 요소용 API

interface mixin HTMLHyperlinkElementUtils {
  [CEReactions, ReflectSetter] stringifier attribute USVString href;
  [CEReactions, Reflect] attribute DOMString target;
};
hyperlink.toString()
hyperlink.href

HTMLAnchorElement/href

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLAnchorElement/toString

현재의 모든 엔진에서 지원된다.

Firefox22+Safari3+Chrome52+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/href

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLAreaElement/toString

현재의 모든 엔진에서 지원된다.

Firefox22+Safari10.1+Chrome32+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

하이퍼링크의 URL을 반환한다.

URL을 변경하도록 설정할 수 있다.

href getter 단계는 다음과 같다:

  1. url을 다시 초기화한다.

  2. urlthisurl로 둔다.

  3. url이 null이고 thishref 콘텐츠 속성이 없으면 빈 문자열을 반환한다.

  4. 그렇지 않고 url이 null이면 thishref 콘텐츠 속성 값을 반환한다.

  5. url직렬화하여 반환한다.

insertedNode가 주어졌을 때 aarea 요소의 HTML 요소 삽입 단계는 다음과 같다:

  1. insertedNode연결되어 있지 않으면 반환한다.

  2. insertedNode노드 문서를 사용하여 추측적 로드를 고려한다.

removedNode, isSubtreeRootoldAncestor가 주어졌을 때 aarea 요소의 HTML 요소 제거 단계는 다음과 같다:

  1. oldAncestor연결되어 있지 않으면 반환한다.

  2. oldAncestor노드 문서를 사용하여 추측적 로드를 고려한다.

movedNode가 주어졌을 때 aarea 요소의 HTML 요소 이동 단계는 다음과 같다:

  1. movedNode노드 문서를 사용하여 추측적 로드를 고려한다.

element, localName, oldValue, valuenamespace가 주어졌을 때 다음 속성 변경 단계는 모든 aarea 요소에 사용된다:

  1. namespace가 null이 아니면 반환한다.

  2. oldValuevalue와 같으면 반환한다.

  3. localNamehref이면 element를 사용하여 url을 설정한다.

    이는 blob: URL에서만 관찰할 수 있다. 이를 구문 분석할 때 Blob URL Store 조회가 포함되기 때문이다.

  4. localNamehref, referrerpolicy 또는 rel이면 element노드 문서를 사용하여 추측적 로드를 고려한다.

HTMLAnchorElement 또는 HTMLAreaElement 요소의 href를 업데이트하려면, 요소의 href 콘텐츠 속성 값을 요소의 url직렬화한 값으로 설정한다.

HTMLAnchorElementHTMLAreaElement 요소의 url 설정 알고리즘은 다음과 같다:

  1. 이 요소의 url을 null로 설정한다.

  2. 이 요소의 href 콘텐츠 속성이 없으면 반환한다.

  3. url을 이 요소의 href 콘텐츠 속성 값과 이 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

  4. url이 실패가 아니면 이 요소의 urlurl로 설정한다.

다음 중 하나라도 참이면 요소 element탐색할 수 없다:

이는 form 요소의 양식 제출에서도 사용된다. a 요소에 대한 예외는 웹 콘텐츠와의 호환성을 위한 것이다.

a, area 또는 form 요소 element, URL 레코드 url 및 문자열 target이 주어졌을 때 요소의 noopener를 가져오려면 다음 단계를 수행한다. 이 단계는 불리언을 반환한다.

  1. element링크 유형noopener 또는 noreferrer 키워드가 포함되면 true를 반환한다.

  2. element링크 유형opener 키워드가 포함되지 않고 target이 "_blank"와 ASCII 대소문자를 구분하지 않고 일치하면 true를 반환한다.

  3. urlblob URL 항목이 null이 아니면:

    1. blobOriginurlblob URL 항목환경출처로 둔다.

    2. topLevelOriginelement관련 설정 객체최상위 출처로 둔다.

    3. blobOrigintopLevelOrigin동일 사이트가 아니면 true를 반환한다.

  4. false를 반환한다.

요소 subject가 생성한 하이퍼링크를 따라가려면, 선택적 hyperlinkSuffix(기본값 null) 및 선택적 userInvolvement(기본값 "없음")이 주어졌을 때:

  1. subject탐색할 수 없으면 반환한다.

  2. targetAttributeValue를 빈 문자열로 둔다.

  3. subjecta 또는 area 요소이면, targetAttributeValuesubject를 사용하여 요소의 대상을 가져온 결과로 설정한다.

  4. urlRecordsubjecthref 속성 값과 subject노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

  5. urlRecord가 실패이면 반환한다.

  6. noopenersubject, urlRecordtargetAttributeValue를 사용하여 요소의 noopener를 가져온 결과로 둔다.

  7. targetNavigabletargetAttributeValue, subject노드 내비게이션 가능 객체noopener를 사용하여 내비게이션 가능 객체를 선택하는 규칙을 적용한 첫 번째 반환 값으로 둔다.

  8. targetNavigable이 null이면 반환한다.

  9. urlStringurlRecordURL 직렬 변환기를 적용한 결과로 둔다.

  10. hyperlinkSuffix가 null이 아니면 이를 urlString에 추가한다.

  11. subject노드 문서를 사용하여 targetNavigableurlString으로 탐색한다. 이때 referrerPolicysubject하이퍼링크 리퍼러 정책으로, userInvolvementuserInvolvement로, sourceElementsubject로 설정한다.

    다른 많은 유형의 탐색과 달리 하이퍼링크 따라가기는 문서가 완전히 로드되지 않았을 때 특별한 "replace" 동작을 하지 않는다. 이는 사용자가 시작한 하이퍼링크 따라가기뿐 아니라 예를 들어 aElement.click()을 통해 스크립트가 트리거한 경우에도 해당한다.

요소 subject하이퍼링크 리퍼러 정책은 다음 단계가 반환하는 값이다:

  1. subject링크 유형noreferrer 키워드가 포함되면 "no-referrer"를 반환한다.

  2. subjectreferrerpolicy 콘텐츠 속성의 현재 상태를 반환한다.

4.6.6 리소스 다운로드

HTMLAnchorElement/download

현재의 모든 엔진에서 지원된다.

Firefox20+Safari10.1+Chrome15+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

일부 경우에는 리소스를 즉시 보는 대신 나중에 사용하려는 경우가 있다. 리소스를 즉시 사용하는 대신 나중에 사용하기 위해 다운로드하려는 것임을 나타내려면, 해당 리소스에 대한 하이퍼링크를 생성하는 a 또는 area 요소에 download 속성을 지정할 수 있다.

또한 이 속성에는 사용자 에이전트가 파일 시스템에 리소스를 저장할 때 사용할 파일 이름을 지정하는 값을 부여할 수 있다. 이 값은 `Content-Disposition` HTTP 헤더의 파일 이름 매개변수가 재정의할 수 있다. [RFC6266]

교차 출처 상황에서는 잠재적으로 악의적인 활동에 관해 사용자에게 경고하지 않도록 download 속성을 `Content-Disposition` HTTP 헤더, 특히 attachment disposition 유형과 함께 사용해야 한다. (이는 사용자가 충분히 이해하지 못한 상태에서 민감한 개인 정보나 기밀 정보를 다운로드하도록 만드는 상황으로부터 사용자를 보호하기 위한 것이다.)


요소 subject가 생성한 하이퍼링크를 다운로드하려면, 선택적 hyperlinkSuffix(기본값 null) 및 선택적 userInvolvement(기본값 "없음")이 주어졌을 때:

  1. subject탐색할 수 없으면 반환한다.

  2. subject노드 문서활성 샌드박싱 플래그 집합샌드박스된 다운로드 탐색 컨텍스트 플래그가 설정되어 있으면 반환한다.

  3. urlStringsubjecthref 속성 값과 subject노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 둔다.

  4. urlString이 실패이면 반환한다.

  5. hyperlinkSuffix가 null이 아니면 이를 urlString에 추가한다.

  6. userInvolvement가 "브라우저 UI"가 아니면:

    1. 단언: subject에는 download 속성이 있다.

    2. navigationsubject관련 전역 객체내비게이션 API로 둔다.

    3. filenamesubjectdownload 속성 값으로 둔다.

    4. continuenavigation에서 다운로드 요청 navigate 이벤트를 발생시킨 결과로 둔다. 이때 destinationURLurlString으로, userInvolvementuserInvolvement로, sourceElementsubject로, filenamefilename으로 설정한다.

    5. continue가 false이면 반환한다.

    6. subject노드 내비게이션 가능 객체를 사용하여 탐색 중단을 내비게이션 API에 알린다.

  7. 다음 단계를 병렬로 실행한다:

    1. 선택적으로 사용자 에이전트는 잠재적으로 적대적인 다운로드로부터 사용자를 보호할 수 있다고 판단하면 이 단계를 중단할 수 있다.

    2. request를 새 요청으로 둔다. 이 요청의 URLurlString, 클라이언트진입 설정 객체, 개시자는 "download", 대상은 빈 문자열이며, 동기 플래그URL 자격 증명 사용 플래그가 설정되어 있다.

    3. responserequest가져온 결과로 둔다.

    4. subject노드 내비게이션 가능 객체와 null을 사용하여 response다운로드로 처리한다.

응답 response내비게이션 가능 객체 navigable내비게이션 ID 또는 null인 navigationId와 함께 다운로드로 처리하려면:

  1. suggestedFilenameresponse에 대해 제안된 파일 이름을 가져온 결과로 둔다.

  2. download behaviornavigable 및 새 WebDriver BiDi 내비게이션 상태와 함께 WebDriver BiDi 다운로드가 시작됨을 실행한 결과로 둔다. 새 상태의 idnavigationId, 상태는 "pending", urlresponseURL, suggestedFilenamesuggestedFilename이다.

  3. download behavior가 null이 아니고 download behaviorallowed가 false이면:

    1. navigable 및 새 WebDriver BiDi 내비게이션 상태와 함께 WebDriver BiDi 다운로드 종료를 호출한다. 새 상태의 idnavigationId, 상태는 "canceled", urlresponseURL이다.

    2. 반환한다.

  4. download behavior가 null이 아니면 destinationFolderdownload behaviordestinationFolder로 둔다.

  5. 다음 단계를 병렬로 실행한다:

    1. response를 나중에 사용하도록 저장하기 위한 구현 정의 단계를 실행한다. destinationFolder가 null이 아니면 사용자 에이전트는 파일을 해당 경로에 저장해야 한다. 사용자 에이전트에 파일 이름이 필요하면 suggestedFilename을 사용해야 한다.

    2. 다음 중 하나라도 참이면:

      • 사용자가 다운로드를 취소했다.

      • 사용자 에이전트가 다운로드를 취소했다.

      • 오류가 발생했다(예: 네트워크 오류, 저장 공간 부족, 사용할 수 없는 대상 폴더).

      그러면:

      1. navigable 및 새 WebDriver BiDi 내비게이션 상태와 함께 WebDriver BiDi 다운로드 종료를 호출한다. 새 상태의 idnavigationId, 상태는 "canceled", urlresponseURL이다.

      2. 반환한다.

    3. 다운로드가 성공적으로 완료되면 navigable 및 새 WebDriver BiDi 내비게이션 상태와 함께 WebDriver BiDi 다운로드 종료를 호출한다. 새 상태의 idnavigationId, 상태는 "complete", downloadedFilepath는 사용할 수 있으면 다운로드한 파일의 절대 경로이고, 그렇지 않으면 null이며, urlresponseURL이다.

응답 response에 대해 제안된 파일 이름을 가져오려면:

이 알고리즘은 신뢰할 수 없는 사이트에서 파일을 다운로드할 때 발생하는 보안 위험을 완화하기 위한 것이며, 사용자 에이전트는 이를 따르는 것이 강력히 권장된다.

  1. filename을 undefined 값으로 둔다.

  2. response에 `Content-Disposition` 헤더가 있고, 해당 헤더가 attachment disposition 유형을 지정하며, 헤더에 파일 이름 정보가 포함되어 있으면 filename을 헤더가 지정한 값으로 두고 아래의 정제라고 표시된 단계로 이동한다. [RFC6266]

  3. interface origin을 다운로드가 발생한 다운로드 또는 탐색 작업이 시작된 Document가 있으면 그 출처로 둔다.

  4. response originresponse의 URL의 출처로 둔다. 단, 해당 URL의 스킴 구성 요소가 data이면 response origininterface origin이 있는 경우 그와 동일하게 둔다.

  5. interface origin이 없으면 trusted operation을 true로 둔다. 그렇지 않으면 response origininterface origin동일 출처이면 trusted operation을 true로, 그렇지 않으면 false로 둔다.

  6. trusted operation이 true이고 response에 `Content-Disposition` 헤더가 있으며 해당 헤더에 파일 이름 정보가 포함되어 있으면 filename을 헤더가 지정한 값으로 두고 아래의 정제라고 표시된 단계로 이동한다. [RFC6266]

  7. 다운로드가 a 또는 area 요소가 생성한 하이퍼링크에서 시작되지 않았거나, 다운로드를 시작한 하이퍼링크의 요소에 다운로드가 시작될 당시 download 속성이 없었거나, 해당 속성이 있었지만 다운로드가 시작될 당시 그 값이 빈 문자열이었다면 제안된 파일 이름 없음이라고 표시된 단계로 이동한다.

  8. proposed filename을 다운로드가 시작될 당시 다운로드를 시작한 하이퍼링크 요소의 download 속성 값으로 둔다.

  9. trusted operation이 true이면 filenameproposed filename의 값으로 두고 아래의 정제라고 표시된 단계로 이동한다.

  10. response에 `Content-Disposition` 헤더가 있고 해당 헤더가 attachment disposition 유형을 지정하면 filenameproposed filename의 값으로 두고 아래의 정제라고 표시된 단계로 이동한다. [RFC6266]

  11. 제안된 파일 이름 없음: trusted operation이 true이거나 사용자가 해당 응답을 다운로드하겠다는 선호를 표시했다면, filenameresponseURL에서 구현 정의 방식으로 파생한 값으로 두고 아래의 정제라고 표시된 단계로 이동한다.

  12. filename을 사용자가 선호하는 파일 이름 또는 사용자 에이전트가 선택한 파일 이름으로 설정하고 아래의 정제라고 표시된 단계로 이동한다.

    알고리즘이 이 단계에 도달했다면 response와 다른 출처에서 다운로드가 시작되었고, 해당 출처가 파일을 다운로드하기에 적합하다고 표시하지 않았으며, 사용자가 다운로드를 시작하지도 않았다는 뜻이다. 이는 download 속성을 사용하여 다운로드를 트리거했거나 response의 유형을 사용자 에이전트가 지원하지 않기 때문일 수 있다.

    이는 위험할 수 있다. 예를 들어 적대적인 서버가 데이터가 해당 적대적인 서버에서 온 것이라고 사용자가 믿도록 속여, 사용자가 자신도 모르게 개인 정보를 다운로드한 다음 적대적인 서버에 다시 업로드하도록 시도할 수 있기 때문이다.

    따라서 response가 상당히 다른 출처에서 왔다는 사실을 어떤 방식으로든 사용자에게 알리는 것이 사용자의 이익에 부합하며, 혼동을 방지하기 위해 잠재적으로 적대적인 interface origin에서 제안한 파일 이름은 무시해야 한다.

  13. 정제: 선택적으로 사용자가 filename에 영향을 줄 수 있도록 한다. 예를 들어 사용자 에이전트는 위에서 결정한 filename 값을 기본값으로 제시하면서 사용자에게 파일 이름을 입력하라고 요청할 수 있다.

  14. filename을 로컬 파일 시스템에 적합하도록 조정한다.

    예를 들어 파일 이름에서 허용되지 않는 문자를 제거하거나 앞뒤 공백을 잘라낼 수 있다.

  15. 플랫폼 관례가 파일 시스템의 파일 유형을 결정하는 데 확장자를 어떤 방식으로도 사용하지 않는다면, filename을 파일 이름으로 반환한다.

  16. claimed type을 알려진 경우 responseContent-Type 메타데이터가 지정한 유형으로 둔다. named type을 알려진 경우 filename확장자가 지정한 유형으로 둔다. 이 단계에서 유형MIME 유형확장자의 대응 관계이다.

  17. named type이 사용자의 선호와 일치하면(예: 사용자에게 묻는 방식으로 filename의 값을 결정했기 때문) filename을 파일 이름으로 반환한다.

  18. claimed typenamed type이 동일한 유형이면(즉, responseContent-Type 메타데이터가 지정한 유형이 filename확장자가 지정한 유형과 일치하면) filename을 파일 이름으로 반환한다.

  19. claimed type이 알려져 있으면 filename을 변경하여 claimed type에 대응하는 확장자를 추가한다.

    그렇지 않고 named type이 잠재적으로 위험한 것으로 알려져 있으면(예: 플랫폼 관례에 따라 네이티브 실행 파일, 셸 스크립트, HTML 애플리케이션 또는 실행 가능한 매크로를 포함할 수 있는 문서로 처리되는 경우), 선택적으로 filename을 변경하여 안전한 것으로 알려진 확장자(예: ".txt")를 추가한다.

    이 마지막 단계는 실행 파일을 다운로드할 수 없게 만들 수 있으며, 이는 바람직하지 않을 수 있다. 언제나 그렇듯 구현자는 이 문제에서 보안과 사용성 사이의 균형을 맞춰야 한다.

  20. filename을 파일 이름으로 반환한다.

이 알고리즘에서 파일 확장자는 플랫폼 관례상 파일 유형을 식별하는 데 사용되는 파일 이름의 모든 부분으로 구성된다. 예를 들어 많은 운영 체제는 파일 이름에서 마지막 마침표(".") 뒤의 부분을 사용하여 파일 유형을 결정하고, 이를 통해 파일을 여는 방식이나 실행하는 방식을 결정한다.

사용자 에이전트는 결과 파일을 사용자의 파일 시스템에서 저장할 위치를 결정할 때 응답 자체, 응답의 URL 및 모든 download 속성이 제공한 디렉터리 또는 경로 정보를 무시해야 한다.

a 또는 area 요소가 생성한 하이퍼링크ping 속성이 있고, 사용자가 하이퍼링크를 따라가며, 요소의 href 속성 값을 요소의 노드 문서를 기준으로 실패 없이 구문 분석할 수 있으면, 사용자 에이전트는 ping 속성 값을 가져와 해당 문자열을 ASCII 공백에서 분할하고, 결과로 얻은 각 토큰을 요소의 노드 문서를 기준으로 구문 분석한 다음, 구문 분석이 실패를 반환하는 경우는 무시하고 결과로 얻은 각 URL ping URL에 대해 다음 단계를 실행해야 한다:

  1. ping URL스킴HTTP(S) 스킴이 아니면 반환한다.

  2. 선택적으로 반환한다. (예를 들어 사용자 에이전트는 사용자가 표시한 선호에 따라 일부 또는 모든 ping URL을 무시할 수 있다.)

  3. settingsObject를 요소의 노드 문서관련 설정 객체로 둔다.

  4. request를 새 요청으로 둔다. 이 요청의 URLping URL, 메서드는 `POST`, 헤더 목록은 « (`Content-Type`, `text/ping`) », 본문은 `PING`, 클라이언트settingsObject, 대상은 빈 문자열, 자격 증명 모드는 "include", 리퍼러는 "no-referrer"이며, URL 자격 증명 사용 플래그가 설정되고, 개시자 유형은 "ping"이다.

  5. target URL을 요소의 href 속성 값을 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 두고, 다음을 수행한다:

    감사 중인 하이퍼링크를 포함하는 Document 객체의 URLping URL동일 출처인 경우
    출처가 서로 다르지만, 감사 중인 하이퍼링크를 포함하는 DocumentURL스킴이 "https"가 아닌 경우
    request에는 하이퍼링크를 포함하는 문서의 URL을 값으로 하는 `Ping-From` 헤더와, target URL을 값으로 하는 `Ping-To` HTTP 헤더가 포함되어야 한다.
    그렇지 않은 경우
    request에는 target URL을 값으로 하는 `Ping-To` HTTP 헤더가 포함되어야 한다. request에는 `Ping-From` 헤더가 포함되지 않는다.
  6. request가져온다.

이는 기본 가져오기와 병렬로 수행할 수 있으며, 해당 가져오기의 결과와는 독립적이다.

사용자 에이전트는 예를 들어 HTTP `Referer` (원문 그대로) 헤더 전송을 비활성화하는 설정과 연계하여 사용자가 이 동작을 조정할 수 있게 해야 한다. 사용자의 선호에 따라 UA는 ping 속성을 완전히 무시하거나 목록에 있는 URL을 선택적으로 무시할 수 있다(예: 모든 서드 파티 URL 무시). 이는 위 단계에서 명시적으로 고려된다.

사용자 에이전트는 응답으로 반환된 모든 엔터티 본문을 무시해야 한다. 사용자 에이전트는 응답 본문을 받기 시작한 뒤 연결을 조기에 닫을 수 있다.

(This is a tracking vector.) 하이퍼링크를 생성하고 ping 속성이 있는 a 또는 area 요소가 존재하는 경우, 사용자 에이전트는 하이퍼링크를 따라가면 백그라운드에서 보조 요청도 전송되며 실제 대상 URL 목록이 포함될 수도 있음을 사용자에게 나타낼 수 있다.

예를 들어 시각적 사용자 에이전트는 상태 표시줄이나 도구 설명에서 하이퍼링크의 실제 URL과 함께 대상 ping URL의 호스트 이름을 표시할 수 있다.

ping 속성은 웹 페이지가 어떤 외부 사이트 링크가 가장 인기 있는지 추적하거나 광고주가 클릭률을 추적할 수 있게 한다는 점에서 HTTP 리디렉션이나 JavaScript 같은 기존 기술과 중복된다.

그러나 ping 속성은 이러한 대안에 비해 사용자에게 다음과 같은 이점을 제공한다:

4.6.7.1 `Ping-From` 및 `Ping-To` 헤더

`Ping-From` 및 `Ping-To` HTTP 요청 헤더는 하이퍼링크 감사 요청에 포함된다. 그 값은 URL직렬화한 값이다.

4.6.8 링크 유형

Link_types

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

Link_types

다음 표는 이 명세에서 정의하는 링크 유형을 해당 키워드별로 요약한다. 이 표는 비규범적이며, 링크 유형의 실제 정의는 이어지는 여러 절에 제시되어 있다.

이 절에서 참조된 문서라는 용어는 링크를 나타내는 요소가 식별하는 리소스를 가리키며, 현재 문서라는 용어는 링크를 나타내는 요소가 위치한 리소스를 가리킨다.

link, a, area 또는 form 요소에 적용되는 링크 유형을 결정하려면 요소의 rel 속성을 ASCII 공백에서 분할해야 한다. 결과로 얻은 토큰은 해당 요소에 적용되는 링크 유형의 키워드이다.

별도로 명시되지 않는 한 키워드는 각 rel 속성에 두 번 이상 지정해서는 안 된다.

아래 표 뒤에 이어지는 일부 절에서는 특정 키워드의 동의어를 나열한다. 표시된 동의어는 사용자 에이전트가 명시된 대로 처리해야 하지만 문서에서는 사용해서는 안 된다(예: "copyright" 키워드).

키워드는 항상 ASCII 대소문자를 구분하지 않으며, 그에 따라 비교해야 한다.

따라서 rel="next"rel="NEXT"와 같다.

body-ok인 키워드는 link 요소가 본문에서 허용되는지에 영향을 준다. body-ok 키워드는 dns-prefetch, modulepreload, pingback, preconnect, prefetch, preloadstylesheet이다.

웹 브라우저가 구현할 새로운 링크 유형은 이 표준에 추가해야 한다. 나머지는 확장으로 등록할 수 있다.

4.6.8.1 링크 유형 "alternate"

Alternative_style_sheets

하나의 엔진에서만 지원된다.

Firefox3+Safari?Chrome1–48
OperaEdge아니요
Edge (Legacy)?Internet Explorer8+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

alternate 키워드는 link, aarea 요소와 함께 사용할 수 있다.

이 키워드의 의미는 다른 속성의 값에 따라 달라진다.

요소가 link 요소이고 rel 속성에도 stylesheet 키워드가 포함된 경우

alternate 키워드는 해당 키워드에 관해 설명된 방식으로 stylesheet 키워드의 의미를 수정한다. alternate 키워드는 자체적으로 링크를 생성하지 않는다.

여기서는 일련의 link 요소가 몇 가지 스타일시트를 제공한다:

<!-- a persistent style sheet -->
<link rel="stylesheet" href="default.css">

<!-- the preferred alternate style sheet -->
<link rel="stylesheet" href="green.css" title="Green styles">

<!-- some alternate style sheets -->
<link rel="alternate stylesheet" href="contrast.css" title="High contrast">
<link rel="alternate stylesheet" href="big.css" title="Big fonts">
<link rel="alternate stylesheet" href="wide.css" title="Wide screen">
alternate 키워드를 type 속성이 application/rss+xml 또는 application/atom+xml 값으로 설정된 상태에서 사용하는 경우

이 키워드는 신디케이션 피드를 참조하는 하이퍼링크를 생성한다(현재 페이지와 정확히 같은 콘텐츠를 신디케이션하는 것은 아닐 수 있다).

피드 자동 탐색을 위해 사용자 에이전트는 문서에서 alternate 키워드가 사용되고 type 속성이 application/rss+xml 또는 application/atom+xml 값으로 설정된 모든 link 요소를 고려해야 한다. 사용자 에이전트에 기본 신디케이션 피드라는 개념이 있으면 그러한 첫 번째 요소(트리 순서상)를 기본값으로 사용해야 한다.

다음 link 요소는 블로그의 신디케이션 피드를 제공한다:

<link rel="alternate" type="application/atom+xml" href="posts.xml" title="Cool Stuff Blog">
<link rel="alternate" type="application/atom+xml" href="posts.xml?category=robots" title="Cool Stuff Blog: robots category">
<link rel="alternate" type="application/atom+xml" href="comments.xml" title="Cool Stuff Blog: Comments">

이러한 link 요소는 피드 자동 탐색을 수행하는 사용자 에이전트가 사용하며, 첫 번째 요소가 기본값이 된다(해당되는 경우).

다음 예제는 a 요소를 사용하여 사용자에게 여러 신디케이션 피드를 제공한다:

<p>You can access the planets database using Atom feeds:</p>
<ul>
 <li><a href="recently-visited-planets.xml" rel="alternate" type="application/atom+xml">Recently Visited Planets</a></li>
 <li><a href="known-bad-planets.xml" rel="alternate" type="application/atom+xml">Known Bad Planets</a></li>
 <li><a href="unexplored-planets.xml" rel="alternate" type="application/atom+xml">Unexplored Planets</a></li>
</ul>

이 링크들은 피드 자동 탐색에 사용되지 않는다.

그렇지 않은 경우

이 키워드는 현재 문서의 대체 표현을 참조하는 하이퍼링크를 생성한다.

참조된 문서의 성격은 hreflangtype 속성으로 제공된다.

alternate 키워드를 hreflang 속성과 함께 사용하고 해당 속성 값이 문서 요소언어와 다르면 참조된 문서가 번역본임을 나타낸다.

alternate 키워드를 type 속성과 함께 사용하면 참조된 문서가 지정된 형식으로 현재 문서를 재구성한 것임을 나타낸다.

hreflangtype 속성은 alternate 키워드와 함께 지정할 때 결합할 수 있다.

다음 예제는 대체 형식을 사용하고, 다른 언어를 대상으로 하며, 다른 미디어를 위한 페이지 버전을 지정하는 방법을 보여준다:

<link rel=alternate href="/en/html" hreflang=en type=text/html title="English HTML">
<link rel=alternate href="/fr/html" hreflang=fr type=text/html title="French HTML">
<link rel=alternate href="/en/html/print" hreflang=en type=text/html media=print title="English HTML (for printing)">
<link rel=alternate href="/fr/html/print" hreflang=fr type=text/html media=print title="French HTML (for printing)">
<link rel=alternate href="/en/pdf" hreflang=en type=application/pdf title="English PDF">
<link rel=alternate href="/fr/pdf" hreflang=fr type=application/pdf title="French PDF">

이 관계는 추이적이다. 즉, 문서가 링크 유형 "alternate"로 다른 두 문서에 링크하면 해당 문서들이 첫 번째 문서의 대체 표현임을 암시할 뿐 아니라, 두 문서도 서로의 대체 표현임을 암시한다.

author 키워드는 link, aarea 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

aarea 요소의 경우, author 키워드는 하이퍼링크를 정의하는 요소에서 가장 가까운 article 요소 조상이 있으면 그 작성자에 관한 추가 정보를, 그렇지 않으면 페이지 전체의 작성자에 관한 추가 정보를 참조된 문서가 제공함을 나타낸다.

link 요소의 경우, author 키워드는 참조된 문서가 페이지 전체의 작성자에 관한 추가 정보를 제공함을 나타낸다.

"참조된 문서"는 작성자의 이메일 주소를 제공하는 mailto: URL일 수 있으며 흔히 그러하다. [MAILTO]

동의어: 역사적인 이유로 사용자 에이전트는 값이 "made"인 rev 속성을 가진 link, aarea 요소도 링크 관계로 author 키워드가 지정된 것으로 처리해야 한다.

bookmark 키워드는 aarea 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

bookmark 키워드는 해당 링크 요소에서 가장 가까운 조상 article 요소의 영구 링크를 제공하거나, 조상 article 요소가 없으면 링크 요소와 가장 밀접하게 연관된 섹션의 영구 링크를 제공한다.

다음 코드 조각에는 세 개의 영구 링크가 있다. 사용자 에이전트는 영구 링크가 제공된 위치를 살펴보아 각 영구 링크가 명세의 어느 부분에 적용되는지 결정할 수 있다.

 ...
 <body>
  <h1>Example of permalinks</h1>
  <div id="a">
   <h2>First example</h2>
   <p><a href="a.html" rel="bookmark">This permalink applies to
   only the content from the first H2 to the second H2</a>. The DIV isn't
   exactly that section, but it roughly corresponds to it.</p>
  </div>
  <h2>Second example</h2>
  <article id="b">
   <p><a href="b.html" rel="bookmark">This permalink applies to
   the outer ARTICLE element</a> (which could be, e.g., a blog post).</p>
   <article id="c">
    <p><a href="c.html" rel="bookmark">This permalink applies to
    the inner ARTICLE element</a> (which could be, e.g., a blog comment).</p>
   </article>
  </article>
 </body>
 ...

canonical 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

canonical 키워드는 href 속성이 제공한 URL이 현재 문서의 선호 URL임을 나타낸다. 이는 The Canonical Link Relation에 더 자세히 설명된 대로 검색 엔진이 중복 콘텐츠를 줄이는 데 도움이 된다. [RFC6596]

Link_types/dns-prefetch

Firefox3+Safari?Chrome46+
Opera?Edge79+
Edge (Legacy)아니요Internet Explorer?
Firefox Android?Safari iOS?Chrome AndroidWebView Android46+Samsung Internet?Opera Android?

dns-prefetch 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다. 이 키워드는 body-ok이다.

dns-prefetch 키워드는 사용자가 해당 출처에 위치한 리소스를 필요로 할 가능성이 매우 높고, DNS 확인과 관련된 지연 비용을 선제적으로 처리하면 사용자 경험이 개선되므로, 지정된 리소스의 출처에 대해 선제적으로 DNS 확인을 수행하는 것이 유익할 가능성이 높음을 나타낸다.

dns-prefetch 키워드가 제공하는 리소스에는 기본 유형이 없다.

이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:

link 요소 el이 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스를 가져와 처리하는 단계는 다음과 같다:

  1. urlelhref 속성 값을 el노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

  2. url이 실패이면 반환한다.

  3. partitionKeyel노드 문서관련 설정 객체를 사용하여 네트워크 파티션 키를 결정한 결과로 둔다.

  4. 사용자 에이전트는 partitionKeyurl출처를 사용하여 출처를 확인해야 한다.

    이 알고리즘의 결과를 캐시할 수 있으므로 이후의 가져오기가 더 빨라질 수 있다.

expect 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 내부 리소스 링크를 생성한다.

expect 키워드가 생성한 내부 리소스 링크는 링크가 가리키는 요소가 문서에 연결되고 완전히 구문 분석될 때까지 렌더링을 차단하는 데 사용할 수 있다.

expect 키워드가 제공하는 리소스에는 기본 유형이 없다.

link 요소 el에 대해 다음 조건 중 하나가 발생할 때마다:

그러면 el처리한다.

link 요소 el이 주어졌을 때 내부 리소스 링크를 처리하려면 다음 단계를 실행한다:

  1. docel노드 문서로 둔다.

  2. urlelhref 속성 값을 doc을 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

  3. 이 작업이 실패하거나, 조각 제외를 true로 설정했을 때 urldocURL같지 않으면, el렌더링 차단을 해제하고 반환한다.

  4. indicatedElementdocurl을 사용하여 가리킨 부분을 선택한 결과로 둔다.

  5. 다음이 모두 참이면:

    그러면 el렌더링을 차단한다.

  6. 그렇지 않으면 el렌더링 차단을 해제한다.

Document doc이 주어졌을 때 내부 리소스 링크를 처리하려면:

  1. doc렌더링 차단 요소 집합에 있는 expect link 요소 link 각각에 대해 link처리한다.

element, localName, oldValue, valuenamespace가 주어졌을 때, 다음 속성 변경 단계expect link 요소가 동적인 idname 변경에 응답하도록 보장하는 데 사용된다:

  1. namespace가 null이 아니면 반환한다.

  2. elementHTML 파서열린 요소 스택에 있으면 반환한다.

  3. 다음 중 하나라도 참이면:

    • localNameid이다; 또는

    • localNamename이고 elementa 요소이다,

    그러면 element노드 문서를 사용하여 내부 리소스 링크를 처리한다.

external 키워드는 a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크 (다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.

external 키워드는 링크가 현재 문서가 속한 사이트의 일부가 아닌 문서로 이어짐을 나타낸다.

help 키워드는 link, a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

a, areaform 요소의 경우, help 키워드는 참조된 문서가 하이퍼링크를 정의하는 요소의 부모와 그 자식에 대한 추가 도움말 정보를 제공함을 나타낸다.

다음 예제에서 양식 컨트롤에는 맥락에 맞는 도움말이 연결되어 있다. 사용자 에이전트는 예를 들어 사용자가 "Help" 또는 "F1" 키를 누르면 참조된 문서를 표시하는 데 이 정보를 사용할 수 있다.

 <p><label> Topic: <input name=topic> <a href="help/topic.html" rel="help">(Help)</a></label></p>

link 요소의 경우, help 키워드는 참조된 문서가 페이지 전체에 대한 도움말을 제공함을 나타낸다.

aarea 요소의 경우 일부 브라우저에서 help 키워드로 인해 링크가 다른 커서를 사용한다.

4.6.8.9 링크 유형 "icon"

Link_types#icon

현재의 모든 엔진에서 지원된다.

Firefox2+Safari3.1+Chrome4+
Opera9+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android4+Safari iOS아니요Chrome Android18+WebView Android38+Samsung Internet4.0+Opera Android아니요
caniuse.com 표

icon 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다.

지정된 리소스는 페이지 또는 사이트를 나타내는 아이콘이며, 사용자 에이전트는 사용자 인터페이스에서 페이지를 나타낼 때 이를 사용해야 한다.

아이콘은 청각적 아이콘, 시각적 아이콘 또는 다른 종류의 아이콘일 수 있다. 여러 아이콘이 제공되면 사용자 에이전트는 type, mediasizes 속성에 따라 가장 적절한 아이콘을 선택해야 한다. 똑같이 적절한 아이콘이 여러 개 있으면 사용자 에이전트는 아이콘 목록을 수집한 시점의 트리 순서에서 마지막으로 선언된 아이콘을 사용해야 한다. 사용자 에이전트가 아이콘을 사용하려 했지만 자세히 검사한 결과 해당 아이콘이 실제로 부적절하다고 판정되면(예: 지원되지 않는 형식을 사용하기 때문), 사용자 에이전트는 속성에 따라 결정된 다음으로 적절한 아이콘을 시도해야 한다.

아이콘 목록이 변경될 때 사용자 에이전트가 아이콘을 업데이트할 의무는 없지만 그렇게 하는 것이 권장된다.

icon 키워드가 제공하는 리소스에는 기본 유형이 없다. 그러나 리소스 유형을 결정하기 위해 사용자 에이전트는 리소스가 이미지일 것으로 예상해야 한다.

sizes 키워드는 원시 픽셀 단위의 아이콘 크기를 나타낸다(CSS 픽셀과 반대).

기기 픽셀 밀도가 CSS 픽셀당 기기 픽셀 2개인 디스플레이(2x, 192dpi)를 위해 너비가 50 CSS 픽셀인 아이콘은 너비가 원시 픽셀 100개이다. 이 기능은 작은 고해상도 아이콘과 큰 저해상도 아이콘에 서로 다른 리소스를 사용하도록 나타내는 것을 지원하지 않는다(예: 50×50 2x와 100×100 1x).

속성 값을 구문 분석하고 처리하려면 사용자 에이전트는 먼저 속성 값을 ASCII 공백에서 분할한 다음, 결과로 얻은 각 키워드를 구문 분석하여 무엇을 나타내는지 결정해야 한다.

any 키워드는 리소스에 SVG 이미지가 제공하는 것과 같은 확장 가능한 아이콘이 포함되어 있음을 나타낸다.

다른 키워드가 나타내는 것을 결정하려면 다음과 같이 추가로 구문 분석해야 한다:

  1. 키워드에 U+0078 LATIN SMALL LETTER X 또는 U+0058 LATIN CAPITAL LETTER X 문자가 정확히 하나 포함되어 있지 않으면 이 키워드는 아무것도 나타내지 않는다. 해당 키워드에 대해 반환한다.

  2. width string을 "x" 또는 "X" 앞의 문자열로 둔다.

  3. height string을 "x" 또는 "X" 뒤의 문자열로 둔다.

  4. width string 또는 height string 중 하나라도 U+0030 DIGIT ZERO (0) 문자로 시작하거나 ASCII 숫자 이외의 문자를 포함하면 이 키워드는 아무것도 나타내지 않는다. 해당 키워드에 대해 반환한다.

  5. width string음이 아닌 정수를 구문 분석하는 규칙을 적용하여 width를 얻는다.

  6. height string음이 아닌 정수를 구문 분석하는 규칙을 적용하여 height를 얻는다.

  7. 이 키워드는 리소스에 너비가 width 기기 픽셀이고 높이가 height 기기 픽셀인 비트맵 아이콘이 포함되어 있음을 나타낸다.

sizes 속성에 지정된 키워드는 링크된 리소스에서 실제로 사용할 수 없는 아이콘 크기를 나타내서는 안 된다.

link 요소 el요청 request가 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스 가져오기 설정 단계는 다음과 같다:

  1. request대상을 "image"로 설정한다.

  2. true를 반환한다.

이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.

icon 키워드를 가진 link가 없는 경우, URL스킴HTTP(S) 스킴Document 객체에 대해 사용자 에이전트는 대신 다음 단계를 병렬로 실행할 수 있다:

  1. request를 새 요청으로 둔다. 이 요청의 URLDocument 객체의 URL을 기준으로 URL "/favicon.ico"를 해석하여 얻은 URL 레코드이고, 클라이언트Document 객체의 관련 설정 객체, 대상은 "image", 동기 플래그는 설정되어 있고, 자격 증명 모드는 "include"이며, URL 자격 증명 사용 플래그가 설정되어 있다.

  2. responserequest가져온 결과로 둔다.

  3. response안전하지 않은 응답icon 키워드를 사용하여 선언한 것처럼 아이콘으로 사용한다.

다음 코드 조각은 여러 아이콘이 있는 애플리케이션의 상단 부분을 보여준다.

<!DOCTYPE HTML>
<html lang="en">
 <head>
  <title>lsForums — Inbox</title>
  <link rel=icon href=favicon.png sizes="16x16" type="image/png">
  <link rel=icon href=windows.ico sizes="32x32 48x48" type="image/vnd.microsoft.icon">
  <link rel=icon href=mac.icns sizes="128x128 512x512 8192x8192 32768x32768">
  <link rel=icon href=iphone.png sizes="57x57" type="image/png">
  <link rel=icon href=gnome.svg sizes="any" type="image/svg+xml">
  <link rel=stylesheet href=lsforums.css>
  <script src=lsforums.js></script>
  <meta name=application-name content="lsForums">
 </head>
 <body>
  ...

역사적인 이유로 icon 키워드 앞에는 "shortcut" 키워드를 둘 수 있다. "shortcut" 키워드가 존재하면 rel 속성의 전체 값은 문자열 "shortcut icon"과 ASCII 대소문자를 구분하지 않고 일치해야 한다(토큰 사이에는 U+0020 SPACE 문자 하나만 있고 다른 ASCII 공백은 없어야 한다).

license 키워드는 link, a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

license 키워드는 참조된 문서가 현재 문서의 주요 콘텐츠를 제공할 때 적용되는 저작권 라이선스 조건을 제공함을 나타낸다.

이 명세는 문서의 주요 콘텐츠와 해당 주요 콘텐츠의 일부로 간주되지 않는 콘텐츠를 구별하는 방법을 지정하지 않는다. 이 구별은 사용자에게 명확히 제시해야 한다.

사진 공유 사이트를 생각해 보자. 해당 사이트의 페이지는 사진을 설명하고 표시할 수 있으며, 페이지는 다음과 같이 마크업할 수 있다:

<!DOCTYPE HTML>
<html lang="en">
 <head>
  <title>Exampl Pictures: Kissat</title>
  <link rel="stylesheet" href="/style/default">
 </head>
 <body>
  <h1>Kissat</h1>
  <nav>
   <a href="../">Return to photo index</a>
  </nav>
  <figure>
   <img src="/pix/39627052_fd8dcd98b5.jpg">
   <figcaption>Kissat</figcaption>
  </figure>
  <p>One of them has six toes!</p>
  <p><small><a rel="license" href="http://www.opensource.org/licenses/mit-license.php">MIT Licensed</a></small></p>
  <footer>
   <a href="/">Home</a> | <a href="../">Photo index</a>
   <p><small>© copyright 2009 Exampl Pictures. All Rights Reserved.</small></p>
  </footer>
 </body>
</html>

이 경우 license는 문서 전체가 아니라 사진(문서의 주요 콘텐츠)에만 적용된다. 특히 문서 하단에 표시된 저작권의 적용을 받는 페이지 자체의 디자인에는 적용되지 않는다. 스타일에서 이를 더 명확히 할 수 있다(예: 라이선스 링크를 사진 가까이에 눈에 띄게 배치하면서 페이지 저작권은 페이지 하단에 옅은 작은 텍스트로 표시).

동의어: 역사적인 이유로 사용자 에이전트는 "copyright" 키워드도 license 키워드처럼 처리해야 한다.

Link_types/manifest

하나의 엔진에서만 지원된다.

Firefox?Safari?Chrome아니요
Opera?Edge아니요
Edge (Legacy)?Internet Explorer?
Firefox Android?Safari iOS?Chrome Android39+WebView Android?Samsung Internet?Opera Android?

manifest 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다.

manifest 키워드는 현재 문서와 연관된 메타데이터를 제공하는 매니페스트 파일을 나타낸다.

manifest 키워드가 제공하는 리소스에는 기본 유형이 없다.

웹 애플리케이션이 설치되어 있지 않은 경우, 이 링크 유형의 링크된 리소스를 가져와 처리하기에 적절한 시점은 사용자 에이전트가 필요하다고 판단할 때이다. 예를 들어 사용자가 웹 애플리케이션을 설치하기로 선택할 때이다.

설치된 웹 애플리케이션의 경우, 이 링크 유형의 링크된 리소스를 가져와 처리하기에 적절한 시점은 다음과 같다:

어떤 경우든 rel 속성에 manifest 토큰을 포함하는 link 요소 중 트리 순서에서 첫 번째 요소만 사용할 수 있다.

사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.

link 요소 el요청 request가 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스 가져오기 설정 단계는 다음과 같다:

  1. navigableel노드 문서노드 내비게이션 가능 객체로 둔다.

  2. navigable이 null이면 false를 반환한다.

  3. navigable최상위 순회 가능 객체가 아니면 false를 반환한다.

  4. request개시자를 "manifest"로 설정한다.

  5. request대상을 "manifest"로 설정한다.

  6. request모드를 "cors"로 설정한다.

  7. request자격 증명 모드elcrossorigin 콘텐츠 속성에 대한 CORS 설정 속성 자격 증명 모드로 설정한다.

  8. true를 반환한다.

link 요소 el, 불리언 success, 응답 response바이트 시퀀스 bodyBytes가 주어졌을 때 이 유형의 링크된 리소스를 처리하려면:

  1. responseContent-Type 메타데이터JSON MIME 유형이 아니면 success를 false로 설정한다.

  2. success가 true이면:

    1. document URLel노드 문서URL로 둔다.

    2. manifest URLresponseURL로 둔다.

    3. clientel노드 문서관련 설정 객체로 둔다.

    4. document URL, manifest URL, bodyBytesclient를 사용하여 매니페스트를 처리한다. [MANIFEST]

이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.

Link_types/modulepreload

Firefox115+Safari?Chrome66+
Opera?Edge79+
Edge (Legacy)아니요Internet Explorer?
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

modulepreload 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다. 이 키워드는 body-ok이다.

modulepreload 키워드는 모듈 스크립트를 미리 로드하는 데 맞춰진 처리 모델을 갖는 preload 키워드의 특수한 대안이다. 특히 모듈 스크립트에 특화된 가져오기 동작(예: crossorigin 속성을 다르게 해석하는 것 포함)을 사용하고, 결과를 나중에 평가할 수 있도록 적절한 모듈 맵에 배치한다. 반면 preload 키워드를 사용하는 유사한 외부 리소스 링크는 문서의 모듈 맵에 영향을 주지 않고 결과를 미리 로드 캐시에 배치한다.

또한 구현은 모듈 스크립트가 종속성을 선언한다는 사실을 활용하여 지정된 모듈의 종속성도 가져올 수 있다. 사용자 에이전트는 해당 종속성도 나중에 필요할 가능성이 매우 높음을 알고 있으므로 이는 최적화 기회를 제공하기 위한 것이다. 이는 일반적으로 서비스 워커 같은 기술을 사용하거나 서버 측에서 모니터링하지 않으면 관찰할 수 없다. 특히 적절한 load 또는 error 이벤트는 지정된 모듈을 가져온 후 발생하며 종속성을 기다리지 않는다.

사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.

모듈 미리 로드 대상은 "json", "style", "text" 또는 스크립트 유사 대상이다.

이러한 링크의 링크된 리소스를 가져와 처리하기에 적절한 시점은 다음과 같다:

일부 다른 링크 관계와 달리 이러한 link의 관련 속성(예: as, crossoriginreferrerpolicy)을 변경해도 새 가져오기가 트리거되지 않는다. 이는 이전 가져오기로 문서의 모듈 맵이 이미 채워졌으므로 다시 가져오는 것이 무의미하기 때문이다.

link 요소 el이 주어졌을 때 modulepreload 링크에 대한 링크된 리소스를 가져와 처리하는 알고리즘은 다음과 같다:

  1. elhref 속성 값이 빈 문자열이면 반환한다.

  2. destinationelas 속성의 현재 상태 (대상)로 두거나, 어떤 상태에도 속하지 않으면 "script"로 둔다.

  3. destination모듈 미리 로드 대상이 아니면, el에 이름이 error이벤트를 발생시키도록 el을 사용하여 네트워킹 작업 소스요소 작업을 큐에 추가하고 반환한다.

  4. urlelhref 속성 값을 el노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

  5. url이 실패이면 반환한다.

  6. settings objectel노드 문서관련 설정 객체로 둔다.

  7. credentials modeelcrossorigin 속성에 대한 CORS 설정 속성 자격 증명 모드로 둔다.

  8. cryptographic nonceel.[[CryptographicNonce]]로 둔다.

  9. integrity metadataelintegrity 속성이 지정되어 있으면 그 값으로, 그렇지 않으면 빈 문자열로 둔다.

  10. elintegrity 속성이 없으면 integrity metadataurlsettings object를 사용하여 모듈 무결성 메타데이터를 결정한 결과로 설정한다.

  11. referrer policyelreferrerpolicy 속성의 현재 상태로 둔다.

  12. fetch priorityelfetchpriority 속성의 현재 상태로 둔다.

  13. options스크립트 가져오기 옵션으로 둔다. 그 암호화 noncecryptographic nonce, 무결성 메타데이터integrity metadata, 파서 메타데이터는 "not-parser-inserted", 자격 증명 모드credentials mode, 리퍼러 정책referrer policy, 가져오기 우선순위fetch priority이다.

  14. url, destination, settings objectoptions를 사용하여 modulepreload 모듈 스크립트 그래프를 가져오고, result가 주어졌을 때 다음 단계를 실행한다:

    1. result가 null이면 el에 이름이 error이벤트를 발생시키고 반환한다.

    2. el에 이름이 load이벤트를 발생시킨다.

이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.

다음 코드 조각은 여러 모듈을 미리 로드한 애플리케이션의 상단 부분을 보여준다:

<!DOCTYPE html>
<html lang="en">
<title>IRCFog</title>

<link rel="modulepreload" href="app.mjs">
<link rel="modulepreload" href="helpers.mjs">
<link rel="modulepreload" href="irc.mjs">
<link rel="modulepreload" href="fog-machine.mjs">

<script type="module" src="app.mjs">
...

애플리케이션의 모듈 그래프가 다음과 같다고 가정한다:

The module graph is rooted at app.mjs, which depends on irc.mjs and fog-machine.mjs. In turn, irc.mjs depends on helpers.mjs.

여기서 애플리케이션 개발자가 모듈 그래프의 모든 모듈을 선언하는 데 modulepreload 를 사용하여 사용자 에이전트가 모든 모듈의 가져오기를 시작하도록 보장한 것을 볼 수 있다. 이러한 미리 로드가 없으면 HTTP/2 Server Push 같은 기술이 사용되지 않는 경우 사용자 에이전트가 helpers.mjs를 발견하기 전에 여러 번의 네트워크 왕복을 거쳐야 할 수 있다. 이러한 방식으로 modulepreload link 요소를 애플리케이션 모듈의 일종의 "매니페스트"로 사용할 수 있다.

다음 코드는 네트워크 가져오기가 미리 수행되도록 modulepreload 링크를 import() 와 함께 사용하여, import() 가 호출될 때 모듈이 모듈 맵에서 이미 준비되어 있도록(단, 평가되지는 않음) 하는 방법을 보여준다:

<link rel="modulepreload" href="awesome-viewer.mjs">

<button onclick="import('./awesome-viewer.mjs').then(m => m.view())">
  View awesome thing
</button>

nofollow 키워드는 a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크 (다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.

nofollow 키워드는 해당 링크가 페이지의 원래 작성자 또는 게시자의 지지를 받지 않거나, 참조된 문서로 연결되는 링크가 두 페이지 관계자 사이의 상업적 관계 때문에 주로 포함되었음을 나타낸다.

Link_types/noopener

현재의 모든 엔진에서 지원된다.

Firefox52+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

Link_types/noopener

현재의 모든 엔진에서 지원된다.

Firefox52+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

noopener 키워드는 a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크 (다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.

이 키워드는 하이퍼링크를 따라가면서 새로 생성된 모든 최상위 순회 가능 객체보조 브라우징 컨텍스트가 포함되지 않음을 나타낸다. 예를 들어 결과 Windowopener getter는 null을 반환한다.

처리 모델도 참조한다.

이는 일반적으로 보조 브라우징 컨텍스트를 가진 최상위 순회 가능 객체를 생성한다(대상 이름이 "example"인 기존 내비게이션 가능 객체가 없다고 가정):

<a href=help.html target=example>Help!</a>

이는 비-보조 브라우징 컨텍스트를 가진 최상위 순회 가능 객체를 생성한다(같은 조건을 가정):

<a href=help.html target=example rel=noopener>Help!</a>

다음은 서로 동등하며 부모 내비게이션 가능 객체만 탐색한다:

<a href=index.html target=_parent>Home</a>
<a href=index.html target=_parent rel=noopener>Home</a>

Link_types/noreferrer

현재의 모든 엔진에서 지원된다.

Firefox33+Safari5+Chrome16+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer🔰 11
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet1.5+Opera Android?

Link_types/noreferrer

현재의 모든 엔진에서 지원된다.

Firefox33+Safari5+Chrome16+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer🔰 11
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet1.5+Opera Android?

noreferrer 키워드는 a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크 (다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.

이는 링크를 따라갈 때 리퍼러 정보가 유출되지 않아야 함을 나타내며, 같은 조건에서 noopener 키워드 동작도 암시한다.

리퍼러를 직접 조작하는 처리 모델도 참조한다.

<a href="..." rel="noreferrer" target="_blank"><a href="..." rel="noreferrer noopener" target="_blank">와 같은 동작을 한다.

opener 키워드는 a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크 (다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.

이 키워드는 하이퍼링크를 따라가면서 새로 생성된 모든 최상위 순회 가능 객체보조 브라우징 컨텍스트가 포함됨을 나타낸다.

처리 모델도 참조한다.

다음 예제에서는 사용자가 찾는 내용을 다른 곳에서 찾을 수 있는 경우 등에 도움말 페이지 팝업이 자신을 연 페이지를 탐색할 수 있도록 opener를 사용한다. _blank 대신 이름이 지정된 대상을 사용하는 방법도 있지만, 이는 기존 이름과 충돌할 가능성이 있다.

<a href="..." rel=opener target=_blank>Help!</a>

pingback 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다. 이 키워드는 body-ok이다.

pingback 키워드의 의미 체계는 Pingback 1.0을 참조한다. [PINGBACK]

Link_types/preconnect

현재의 모든 엔진에서 지원된다.

Firefox39+Safari11.1+Chrome46+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet4.0+Opera Android?

preconnect 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다. 이 키워드는 body-ok이다.

preconnect 키워드는 사용자가 해당 출처에 위치한 리소스를 필요로 할 가능성이 매우 높고 연결 설정과 관련된 지연 비용을 선제적으로 처리하면 사용자 경험이 개선되므로, 지정된 리소스의 출처에 선제적으로 연결을 시작하는 것이 유익할 가능성이 높음을 나타낸다.

preconnect 키워드가 제공하는 리소스에는 기본 유형이 없다.

사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.

이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:

link 요소 el이 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스를 가져와 처리하는 단계는 el에서 링크 옵션을 생성하고 그 결과를 사용하여 미리 연결하는 것이다.

링크 처리 옵션 options이 주어졌을 때 이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계는 options을 사용하여 미리 연결하는 것이다.

링크 처리 옵션 options이 주어졌을 때 미리 연결하려면:

  1. optionshref가 빈 문자열이면 반환한다.

  2. urloptionshrefoptions기준 URL을 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

    문서 또는 환경 대신 기준 URL을 전달하는 문제는 이슈 #9715에서 추적한다.

  3. url이 실패이면 반환한다.

  4. url스킴HTTP(S) 스킴이 아니면 반환한다.

  5. partitionKeyoptions환경을 사용하여 네트워크 파티션 키를 결정한 결과로 둔다.

  6. useCredentials를 true로 둔다.

  7. optionscrossoriginAnonymous이고 options출처url출처동일 출처가 아니면 useCredentials를 false로 설정한다.

  8. 사용자 에이전트는 partitionKey, url출처useCredentials를 사용하여 연결을 확보해야 한다.

    이 연결은 확보되지만 직접 사용되지는 않는다. 이후 사용을 위해 연결 풀에 남아 있게 된다.

    사용자 에이전트는 가능할 때마다 미리 연결을 시작하고 전체 연결 핸드셰이크(HTTP의 경우 DNS+TCP, HTTPS 출처의 경우 DNS+TCP+TLS)를 수행해야 하지만, 리소스 제약 또는 다른 이유로 부분 핸드셰이크 (HTTP의 경우 DNS만, HTTPS 출처의 경우 DNS 또는 DNS+TCP)만 수행하거나 완전히 건너뛸 수 있다.

    출처당 최적의 연결 수는 협상된 프로토콜, 사용자의 현재 연결 프로필, 사용 가능한 기기 리소스, 전역 연결 제한 및 기타 맥락별 변수에 따라 달라진다. 따라서 몇 개의 연결을 열지에 대한 결정은 사용자 에이전트에 맡긴다.

Link_types/prefetch

Firefox2+Safari아니요Chrome8+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet1.5+Opera Android?

prefetch 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다. 이 키워드는 body-ok이다.

prefetch 키워드는 사용자가 향후 내비게이션에서 이 리소스를 필요로 할 가능성이 매우 높으므로 지정된 리소스 또는 동일 사이트 문서를 선제적으로 가져와 캐시하는 것이 유익할 가능성이 높음을 나타낸다.

prefetch 키워드가 제공하는 리소스에는 기본 유형이 없다.

이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:

link 요소 el이 주어졌을 때 prefetch 링크에 대한 링크된 리소스를 가져와 처리하는 알고리즘은 다음과 같다:

  1. elhref 속성 값이 빈 문자열이면 반환한다.

  2. optionsel에서 링크 옵션을 생성한 결과로 둔다.

  3. requestoptions을 사용하여 링크 요청을 생성한 결과로 둔다.

  4. request가 null이면 반환한다.

  5. request개시자를 "prefetch"로 설정한다.

  6. processPrefetchResponse응답 response와 null, 실패 또는 바이트 시퀀스 bytesOrNull이 주어졌을 때 실행하는 다음 단계로 둔다:

    1. response네트워크 오류이면 el에 이름이 error이벤트를 발생시킨다.

    2. 그렇지 않으면 el에 이름이 load이벤트를 발생시킨다.

  7. 사용자 에이전트는 processResponseConsumeBodyprocessPrefetchResponse로 설정하여 request가져와야 한다. 사용자 에이전트는 현재 문서에 필요한 다른 요청을 우선 처리하기 위해 request의 가져오기를 지연할 수 있다.

이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.

Link_types/preload

하나의 엔진에서만 지원된다.

Firefox85+Safari?Chrome🔰 50+
Opera37+Edge🔰 79+
Edge (Legacy)아니요Internet Explorer?
Firefox Android?Safari iOS?Chrome Android?WebView Android50+Samsung Internet5.0+Opera Android?

preload 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스 링크를 생성한다. 이 키워드는 body-ok이다.

preload 키워드는 사용자가 현재 내비게이션에서 이 리소스를 필요로 할 가능성이 매우 높으므로, 사용자 에이전트가 as 속성이 제공한 미리 로드 대상fetchpriority 속성이 제공한 우선순위에 따라 지정된 리소스를 선제적으로 가져와 캐시할 것임을 나타낸다.

사용자 에이전트는 리소스를 로드할 때 이미지를 선제적으로 디코딩하거나 스타일시트를 생성하는 등의 추가 작업을 수행할 수 있다. 그러나 이러한 추가 작업은 관찰 가능한 효과를 가져서는 안 된다.

preload 키워드가 제공하는 리소스에는 기본 유형이 없다.

사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.

이러한 링크의 링크된 리소스를 가져와 처리하기에 적절한 시점은 다음과 같다:

Document에는 미리 로드된 리소스 맵이 있으며, 이는 처음에 비어 있는 순서 있는 맵이다.

미리 로드 키구조체이다. 다음 항목을 가진다:

URL
URL
대상
미리 로드 대상
모드
요청 모드로, "same-origin", "cors" 또는 "no-cors" 중 하나
자격 증명 모드
자격 증명 모드

미리 로드 항목구조체이다. 다음 항목을 가진다:

무결성 메타데이터
문자열
응답
Null 또는 응답
응답 사용 가능 시
Null 또는 응답이나 null을 받는 알고리즘

Window window에 대해, URL url, 문자열 destination, 문자열 mode, 문자열 credentialsMode, 문자열 integrityMetadata응답을 받는 알고리즘 onResponseAvailable이 주어졌을 때 미리 로드된 리소스를 소비하려면:

  1. key미리 로드 키로 둔다. 그 URLurl, 대상destination, 모드mode, 자격 증명 모드credentialsMode이다.

  2. preloadswindow연관된 Document미리 로드된 리소스 맵으로 둔다.

  3. keypreloads존재하지 않으면 false를 반환한다.

  4. entrypreloads[key]로 둔다.

  5. consumerIntegrityMetadataintegrityMetadata구문 분석한 결과로 둔다.

  6. preloadIntegrityMetadataentry무결성 메타데이터구문 분석한 결과로 둔다.

  7. 다음 조건 중 어느 것도 적용되지 않으면:

    • consumerIntegrityMetadatano metadata이다;

    • consumerIntegrityMetadatapreloadIntegrityMetadata와 같다; 또는

      이 비교는 알 수 없는 무결성 옵션을 무시한다. 이슈 #116을 참조한다.

    그러면 false를 반환한다.

    미리 로드와 소비자 사이의 무결성 메타데이터가 서로 일치하지 않으면 둘 다 데이터와 일치하더라도 네트워크에서 추가 가져오기가 발생한다.

    미리 로드 요청에서 오류가 발생한 경우 잘못된 응답을 나중에 네트워크에서 다시 요청하지 않도록 네트워크 오류를 미리 로드 캐시에 추가하는 것이 중요하다. 이는 보안에도 영향을 미친다. 개발자가 미리 로드 요청에는 하위 리소스 무결성 메타데이터를 지정하지만 이후의 리소스 요청에는 지정하지 않는 경우를 생각해 보자. 미리 로드 요청이 하위 리소스 무결성 검증에 실패하여 폐기되면 리소스 요청은 무결성을 검증하지 않고 네트워크에서 잠재적으로 악의적인 응답을 가져와 소비한다. [SRI]

  8. preloads[key]를 제거한다.

  9. entry응답이 null이면 entry응답 사용 가능 시onResponseAvailable로 설정한다.

  10. 그렇지 않으면 entry응답을 사용하여 onResponseAvailable을 호출한다.

  11. true를 반환한다.

이 절의 목적상 문자열 type은 다음 알고리즘이 true를 반환하면 미리 로드 대상 destination일치한다:

  1. type이 빈 문자열이면 true를 반환한다.

  2. destination이 "fetch"이면 true를 반환한다.

  3. mimeTypeRecordtype구문 분석한 결과로 둔다.

  4. mimeTypeRecord가 실패이면 false를 반환한다.

  5. mimeTypeRecord사용자 에이전트에서 지원되지 않으면 false를 반환한다.

  6. 다음 중 하나라도 참이면:

    그러면 true를 반환한다.

  7. false를 반환한다.

요청 request에 대한 미리 로드 키를 생성하려면, 새 미리 로드 키를 반환한다. 그 URLrequestURL, 대상request대상, 모드request모드, 자격 증명 모드request자격 증명 모드이다.

미리 로드 대상은 "fetch", "font", "image", "script", "style" 또는 "track"이다.

문자열 destination이 주어졌을 때 미리 로드 대상을 변환하려면:

  1. destination미리 로드 대상이 아니면 null을 반환한다.

  2. destination변환한 결과를 반환한다.

링크 처리 옵션 options과 선택적 processResponse가 주어졌을 때 미리 로드하려면. 여기서 processResponse응답을 받는 알고리즘이다:

  1. options유형options대상일치하지 않으면 반환한다.

  2. options대상이 "image"이고 options소스 집합이 null이 아니면 optionshrefoptions소스 집합에서 이미지 소스를 선택한 결과로 설정한다.

  3. requestoptions을 사용하여 링크 요청을 생성한 결과로 둔다.

  4. request가 null이면 반환한다.

  5. unsafeEndTime을 0으로 둔다.

  6. entry를 새 미리 로드 항목으로 둔다. 그 무결성 메타데이터options무결성이다.

  7. keyrequest를 사용하여 미리 로드 키를 생성한 결과로 둔다.

  8. options문서가 null이면 request개시자 유형을 "early hint"로 설정한다.

  9. controller를 null로 둔다.

  10. Document document가 주어졌을 때 reportTiming을, document관련 전역 객체를 사용하여 controller에 대해 타이밍을 보고하는 것으로 둔다.

  11. controllerprocessResponseConsumeBody응답 response와 null, 실패 또는 바이트 시퀀스 bodyBytes가 주어졌을 때 실행하는 다음 단계로 설정하여 request가져온 결과로 설정한다:

    1. bodyBytes바이트 시퀀스이면 response본문bodyBytes본문으로 만든 것으로 설정한다.

      processResponseConsumeBody를 사용하여 전체 본문추출했다. 이는 미리 로드가 소비될지 여부가 현재 불확실하더라도 미리 로더가 네트워크에서 전체 본문을 로드하도록 보장하는 데 필요하다. 그런 다음 이 단계에서는 요청 본문을 동일한 바이트를 포함하는 새 본문으로 재설정하여, 이미 한 번 읽었더라도 다른 명세가 실제 소비 시점에 이를 읽을 수 있도록 한다.

    2. 그렇지 않으면 response네트워크 오류로 설정한다.

    3. unsafeEndTime안전하지 않은 공유 현재 시각으로 설정한다.

    4. options문서가 null이 아니면 options문서를 사용하여 reportTiming을 호출한다.

    5. entry응답 사용 가능 시가 null이면 entry응답response로 설정하고, 그렇지 않으면 response를 사용하여 entry응답 사용 가능 시를 호출한다.

    6. processResponse가 주어졌으면 response를 사용하여 processResponse를 호출한다.

  12. Document document가 주어졌을 때 commit을 다음 단계로 둔다:

    1. entry응답이 null이 아니면 document를 사용하여 reportTiming을 호출한다.

    2. document미리 로드된 리소스 맵[key]을 entry로 설정한다.

  13. options문서가 null이면 options문서 준비 시commit으로 설정한다. 그렇지 않으면 options문서를 사용하여 commit을 호출한다.

link 요소 el이 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스를 가져와 처리하는 단계는 다음과 같다:

  1. el소스 집합을 업데이트한다.

  2. optionsel에서 링크 옵션을 생성한 결과로 둔다.

  3. destinationelas 속성 상태를 나타내는 키워드를 변환한 결과로 둔다.

  4. destination이 null이면 반환한다.

  5. options대상destination으로 설정한다.

  6. options미리 로드하고, 응답 response가 주어졌을 때 다음 단계를 실행한다:

    1. response네트워크 오류이면 el에 이름이 error이벤트를 발생시킨다. 그렇지 않으면 el에 이름이 load이벤트를 발생시킨다.

      실제 브라우저의 동작은 이 부분에서 명세와 다르며, 동작 변경의 실현 가능성은 아직 조사되지 않았다. 이슈 #1142를 참조한다.

링크 처리 옵션 options이 주어졌을 때 이 유형의 링크에 대한 링크 헤더 처리 단계는 options미리 로드하는 것이다.

privacy-policy 키워드는 link, aarea 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

privacy-policy 키워드는 Additional Link Relation Types에 더 자세히 설명된 대로 참조된 문서에 현재 문서에 적용되는 데이터 수집 및 사용 관행에 관한 정보가 포함되어 있음을 나타낸다. 참조된 문서는 독립된 개인정보 보호 정책일 수도 있고, 보다 일반적인 문서의 특정 절일 수도 있다. [RFC6903]

search 키워드는 link, a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

search 키워드는 참조된 문서가 문서와 그 관련 리소스를 검색하기 위한 인터페이스를 특별히 제공함을 나타낸다.

OpenSearch 설명 문서는 link 요소 및 search 링크 유형과 함께 사용하여 사용자 에이전트가 검색 인터페이스를 자동 탐색할 수 있게 한다. [OPENSEARCH]

stylesheet 키워드는 link 요소와 함께 사용할 수 있다. 이 키워드는 스타일링 처리 모델에 기여하는 외부 리소스 링크를 생성한다. 이 키워드는 body-ok이다.

지정된 리소스는 문서를 표시하는 방법을 설명하는 CSS 스타일시트이다.

Alternative_style_sheets

하나의 엔진에서만 지원된다.

Firefox3+Safari?Chrome1–48
OperaEdge아니요
Edge (Legacy)?Internet Explorer8+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

alternate 키워드도 link 요소에 지정되면 해당 링크는 대체 스타일시트이다. 이 경우 title 속성을 비어 있지 않은 값으로 link 요소에 지정해야 한다.

stylesheet 키워드가 제공하는 리소스의 기본 유형은 text/css이다.

이 유형의 link 요소가 해당 요소의 노드 문서의 파서에 의해 생성되었다면 암시적으로 잠재적인 렌더링 차단 요소이다.

stylesheet 키워드가 있는 link 요소의 disabled 속성이 설정되면 연관된 CSS 스타일시트비활성화한다.

이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:

쿼크: 문서가 쿼크 모드로 설정되어 있고 외부 리소스의 URL동일 출처이며 외부 리소스의 Content-Type 메타데이터가 지원되는 스타일시트 유형이 아닌 경우, 사용자 에이전트는 대신 이를 text/css로 간주해야 한다.

link 요소 el요청 request가 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스 가져오기 설정 단계는 다음과 같다:

  1. eldisabled 속성이 설정되어 있으면 false를 반환한다.

  2. el스크립트 차단 스타일시트에 기여하면 el을 그 노드 문서스크립트 차단 스타일시트 집합추가한다.

  3. elmedia 속성 값이 환경과 일치하고 el잠재적으로 렌더링을 차단하면 el렌더링을 차단한다.

  4. el이 현재 렌더링을 차단하고 있으면 request렌더링 차단을 true로 설정한다.

  5. true를 반환한다.

기본 링크된 리소스 가져오기 및 처리 알고리즘 대신 CSSOM의 CSS 스타일시트 가져오기 알고리즘을 사용할 계획은 이슈 #968을 참조한다. 그동안 모든 중요 하위 리소스 요청link 요소가 현재 렌더링을 차단하는지 여부에 따라 그 렌더링 차단을 설정해야 한다.

link 요소 el, 불리언 success, 응답 response바이트 시퀀스 bodyBytes가 주어졌을 때 이 유형의 링크된 리소스를 처리하려면:

  1. 리소스의 Content-Type 메타데이터text/css가 아니면 success를 false로 설정한다.

  2. el이 더 이상 스타일링 처리 모델에 기여하는 외부 리소스 링크를 생성하지 않거나, 해당 리소스를 가져온 후 다시 가져오는 것이 적절해진 경우:

    1. elel노드 문서스크립트 차단 스타일시트 집합에서 제거한다.

    2. 반환한다.

  3. el연관된 CSS 스타일시트가 있으면 CSS 스타일시트를 제거한다.

  4. success가 true이면:

    1. 다음 속성을 사용하여 CSS 스타일시트를 생성한다:

      유형

      text/css

      위치

      responseURL 목록[0]

      w3c/csswg-drafts 이슈 #9316이 수정될 것이라는 가정하에 여기에서 URL을 제공한다.

      소유자 노드

      el

      미디어

      elmedia 속성.

      이는 속성의 현재 값 복사본이 아니라 현재 존재하지 않을 수도 있는 속성에 대한 참조이다. CSSOM은 속성이 동적으로 설정, 변경 또는 제거될 때 발생하는 일을 정의한다.

      제목

      el문서 트리에 있으면 eltitle 속성, 그렇지 않으면 빈 문자열.

      이 역시 속성의 현재 값 복사본이 아니라 속성에 대한 참조이다.

      대체 플래그

      링크가 대체 스타일시트이고 el명시적으로 활성화됨이 false이면 설정하고, 그렇지 않으면 설정하지 않는다.

      출처 정리 플래그

      리소스가 CORS 동일 출처이면 설정하고, 그렇지 않으면 설정하지 않는다.

      부모 CSS 스타일시트
      소유자 CSS 규칙

      null

      비활성화 플래그

      기본값으로 둔다.

      CSS 규칙

      초기화하지 않은 상태로 둔다.

      이는 올바르지 않아 보인다. 아마 bodyBytes를 사용해야 할까? 이슈 #2997에서 추적한다.

      CSS 환경 인코딩은 다음 단계를 실행한 결과이다: [CSSSYNTAX]

      1. elcharset 속성이 있으면 그 속성 값에서 인코딩을 가져온다. 성공하면 결과 인코딩을 반환한다. [ENCODING]

      2. 그렇지 않으면 문서의 문자 인코딩을 반환한다. [DOM]

    2. el에 이름이 load이벤트를 발생시킨다.

  5. 그렇지 않으면 el에 이름이 error이벤트를 발생시킨다.

  6. el스크립트 차단 스타일시트에 기여하면:

    1. 단언: el노드 문서스크립트 차단 스타일시트 집합el포함한다.

    2. el을 그 노드 문서스크립트 차단 스타일시트 집합에서 제거한다.

  7. el렌더링 차단을 해제한다.

이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.

tag 키워드는 aarea 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

tag 키워드는 참조된 문서가 나타내는 태그가 현재 문서에 적용됨을 나타낸다.

태그가 현재 문서에 적용됨을 나타내므로, 여러 페이지에서 인기 있는 태그를 나열하는 태그 클라우드의 마크업에 이 키워드를 사용하는 것은 부적절하다.

이 문서는 몇 가지 보석에 관한 것이므로, 미국의 도시나 Ruby 패키지 형식 또는 스위스 기관차 등급이 아닌 "보석" 종류의 보석에 적용된다는 것을 명확하게 분류하기 위해 "https://en.wikipedia.org/wiki/Gemstone"으로 태그가 지정되어 있다:

<!DOCTYPE HTML>
<html lang="en">
 <head>
  <title>My Precious</title>
 </head>
 <body>
  <header><h1>My precious</h1> <p>Summer 2012</p></header>
  <p>Recently I managed to dispose of a red gem that had been
  bothering me. I now have a much nicer blue sapphire.</p>
  <p>The red gem had been found in a bauxite stone while I was digging
  out the office level, but nobody was willing to haul it away. The
  same red gem stayed there for literally years.</p>
  <footer>
   Tags: <a rel=tag href="https://en.wikipedia.org/wiki/Gemstone">Gemstone</a>
  </footer>
 </body>
</html>

문서에는 두 개의 글이 있다. 그러나 "tag" 링크는 페이지 전체에 적용된다. 이는 article 요소 안을 포함하여 어디에 배치하더라도 마찬가지이다.

<!DOCTYPE HTML>
<html lang="en">
 <head>
  <title>Gem 4/4</title>
 </head>
 <body>
  <article>
   <h1>801: Steinbock</h1>
   <p>The number 801 Gem 4/4 electro-diesel has an ibex and was rebuilt in 2002.</p>
  </article>
  <article>
   <h1>802: Murmeltier</h1>
   <figure>
    <img src="https://upload.wikimedia.org/wikipedia/commons/b/b0/Trains_de_la_Bernina_en_hiver_2.jpg"
         alt="The 802 was red with pantographs and tall vents on the side.">
    <figcaption>The 802 in the 1980s, above Lago Bianco.</figcaption>
   </figure>
   <p>The number 802 Gem 4/4 electro-diesel has a marmot and was rebuilt in 2003.</p>
  </article>
  <p class="topic"><a rel=tag href="https://en.wikipedia.org/wiki/Rhaetian_Railway_Gem_4/4">Gem 4/4</a></p>
 </body>
</html>

terms-of-service 키워드는 link, aarea 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

terms-of-service 키워드는 Additional Link Relation Types에 더 자세히 설명된 대로 참조된 문서에 현재 문서의 제공자와 현재 문서를 사용하려는 사용자 간의 계약에 관한 정보가 포함되어 있음을 나타낸다. [RFC6903]

일부 문서는 문서 시퀀스의 일부를 이룬다.

문서 시퀀스는 각 문서에 이전 형제다음 형제가 있을 수 있는 시퀀스이다. 이전 형제가 없는 문서는 시퀀스의 시작이고, 다음 형제가 없는 문서는 시퀀스의 끝이다.

문서는 여러 시퀀스의 일부일 수 있다.

next 키워드는 link, a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

next 키워드는 문서가 시퀀스의 일부이며 해당 링크가 시퀀스에서 논리적으로 다음 문서로 이어짐을 나타낸다.

next 키워드를 link 요소와 함께 사용할 때 사용자 에이전트는 해당 링크를 dns-prefetch, preconnect 또는 prefetch 키워드 중 하나를 사용한 것처럼 처리해야 한다. 사용자 에이전트가 어떤 키워드를 사용할지는 구현에 따라 달라진다. 예를 들어 사용자 에이전트는 데이터, 배터리 전력 또는 처리 능력을 절약하려 할 때 비용이 더 적게 드는 preconnect 처리 모델을 사용하거나, 유사한 상황에서 과거 사용자 행동을 휴리스틱으로 분석한 결과에 따라 키워드를 선택할 수 있다.

prev 키워드는 link, a, areaform 요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.

prev 키워드는 문서가 시퀀스의 일부이며 해당 링크가 시퀀스에서 논리적으로 이전 문서로 이어짐을 나타낸다.

동의어: 역사적인 이유로 사용자 에이전트는 "previous" 키워드도 prev 키워드처럼 처리해야 한다.

미리 정의된 링크 유형 집합의 확장기존 rel 값에 대한 microformats 페이지에 등록할 수 있다. [MFREL]

누구나 언제든지 기존 rel 값에 대한 microformats 페이지를 편집하여 유형을 추가할 수 있다. 확장 유형에는 다음 정보를 지정해야 한다:

키워드

정의하는 실제 값. 이 값은 정의된 다른 값과 혼동될 정도로 비슷해서는 안 된다(예: 대소문자만 다른 경우).

값에 U+003A COLON 문자(:)가 포함되어 있으면 절대 URL이어야 한다.

...에 대한 효과 link

다음 중 하나:

허용되지 않음
키워드를 link 요소에 지정해서는 안 된다.
하이퍼링크
키워드를 link 요소에 지정할 수 있으며, 하이퍼링크를 생성한다.
외부 리소스
키워드를 link 요소에 지정할 수 있으며, 외부 리소스 링크를 생성한다.
...에 대한 효과 aarea

다음 중 하나:

허용되지 않음
키워드를 aarea 요소에 지정해서는 안 된다.
하이퍼링크
키워드를 aarea 요소에 지정할 수 있으며, 하이퍼링크를 생성한다.
외부 리소스
키워드를 aarea 요소에 지정할 수 있으며, 외부 리소스 링크를 생성한다.
하이퍼링크 주석
키워드를 aarea 요소에 지정할 수 있으며, 요소가 생성한 다른 하이퍼링크주석을 단다.
...에 대한 효과 form

다음 중 하나:

허용되지 않음
키워드를 form 요소에 지정해서는 안 된다.
하이퍼링크
키워드를 form 요소에 지정할 수 있으며, 하이퍼링크를 생성한다.
외부 리소스
키워드를 form 요소에 지정할 수 있으며, 외부 리소스 링크를 생성한다.
하이퍼링크 주석
키워드를 form 요소에 지정할 수 있으며, 요소가 생성한 다른 하이퍼링크주석을 단다.
간략한 설명

키워드의 의미에 대한 짧은 비규범적 설명.

명세

키워드의 의미 체계와 요구 사항에 대한 더 자세한 설명으로 연결되는 링크. 위키의 다른 페이지일 수도 있고 외부 페이지로 연결되는 링크일 수도 있다.

동의어

처리 요구 사항이 정확히 같은 다른 키워드 값의 목록. 작성자는 동의어로 정의된 값을 사용해서는 안 되며, 이는 사용자 에이전트가 레거시 콘텐츠를 지원할 수 있도록 하기 위한 것일 뿐이다. 실제로 사용되지 않는 동의어는 누구나 제거할 수 있으며, 레거시 콘텐츠와의 호환성을 위해 동의어로 처리할 필요가 있는 이름만 이 방식으로 등록해야 한다.

상태

다음 중 하나:

제안됨
키워드가 광범위한 동료 검토와 승인을 받지 않았다. 누군가 제안했고 사용 중이거나 곧 사용할 예정이다.
비준됨
키워드가 광범위한 동료 검토와 승인을 받았다. 잘못된 방식으로 사용하는 경우를 포함하여 이 키워드를 사용하는 페이지를 처리하는 방법을 모호하지 않게 정의하는 명세가 있다.
중단됨
키워드가 광범위한 동료 검토를 받았고 문제가 있는 것으로 판명되었다. 기존 페이지에서 이 키워드를 사용하고 있지만 새 페이지에서는 피해야 한다. "간략한 설명" 및 "명세" 항목은 작성자가 대신 사용해야 할 것이 있는 경우 그 세부 정보를 제공한다.

키워드가 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열해야 한다.

키워드가 "제안됨" 상태로 한 달 이상 등록되어 있지만 사용되거나 명세화되지 않았다면 레지스트리에서 제거할 수 있다.

키워드가 "제안됨" 상태로 추가된 뒤 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열해야 한다. 키워드가 "제안됨" 상태로 추가된 뒤 유해한 것으로 판명되면 상태를 "중단됨"으로 변경해야 한다.

누구나 언제든지 상태를 변경할 수 있지만 위 정의에 따라서만 변경해야 한다.

적합성 검사기는 기존 rel 값에 대한 microformats 페이지에 제공된 정보를 사용하여 값이 허용되는지 여부를 판단해야 한다. 이 명세에 정의되었거나 "제안됨" 또는 "비준됨"으로 표시된 값은 "…에 대한 효과" 필드에 설명된 대로 적용되는 요소에서 사용되면 허용해야 하지만, "중단됨"으로 표시되었거나 이 명세 또는 앞서 언급한 페이지 어디에도 나열되지 않은 값은 유효하지 않은 것으로 거부해야 한다. 적합성 검사기는 이 정보를 캐시할 수 있다(예: 성능상의 이유 또는 신뢰할 수 없는 네트워크 연결 사용을 피하기 위해).

작성자가 이 명세나 위키 페이지에 정의되지 않은 새 유형을 사용하면 적합성 검사기는 위에서 설명한 세부 정보와 함께 "제안됨" 상태로 해당 값을 위키에 추가하도록 제안해야 한다.

기존 rel 값에 대한 microformats 페이지에서 "제안됨" 또는 "비준됨" 상태의 확장으로 정의된 유형은 "…에 대한 효과" 필드에 따라 rel 속성을 link, aarea 요소에서 사용할 수 있다. [MFREL]

4.7 편집

insdel 요소는 문서에 대한 편집을 나타낸다.

4.7.1 ins 요소

Element/ins

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
투명.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
cite — 인용문의 출처 또는 편집에 관한 추가 정보로 연결되는 링크
datetime — 변경 날짜와 선택적으로 시간
접근성 고려 사항:
작성자용.
구현자용.
정제:
속성 cite, datetime을 포함한 기본.
DOM 인터페이스:
HTMLModElement를 사용한다.

ins 요소는 문서에 대한 추가를 나타낸다.

다음은 단일 단락의 추가를 나타낸다:

<aside>
 <ins>
  <p> I like fruit. </p>
 </ins>
</aside>

다음도 마찬가지이다. 여기에서 aside 요소 안의 모든 것이 구문 콘텐츠로 간주되므로 단락이 하나뿐이기 때문이다:

<aside>
 <ins>
  Apples are <em>tasty</em>.
 </ins>
 <ins>
  So are pears.
 </ins>
</aside>

ins 요소는 암시된 단락 경계를 넘어서는 안 된다.

다음 예제는 두 단락의 추가를 나타내며, 두 번째 단락은 두 부분으로 삽입되었다. 따라서 이 예제의 첫 번째 ins 요소는 단락 경계를 가로지르며, 이는 좋지 않은 형식으로 간주된다.

<aside>
 <!-- don't do this -->
 <ins datetime="2005-03-16 00:00Z">
  <p> I like fruit. </p>
  Apples are <em>tasty</em>.
 </ins>
 <ins datetime="2007-12-19 00:00Z">
  So are pears.
 </ins>
</aside>

다음은 이를 마크업하는 더 나은 방법이다. 더 많은 요소를 사용하지만 어떤 요소도 암시된 단락 경계를 넘지 않는다.

<aside>
 <ins datetime="2005-03-16 00:00Z">
  <p> I like fruit. </p>
 </ins>
 <ins datetime="2005-03-16 00:00Z">
  Apples are <em>tasty</em>.
 </ins>
 <ins datetime="2007-12-19 00:00Z">
  So are pears.
 </ins>
</aside>

4.7.2 del 요소

Element/del

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
투명.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
cite — 인용문의 출처 또는 편집에 관한 추가 정보로 연결되는 링크
datetime — 변경 날짜와 선택적으로 시간
접근성 고려 사항:
작성자용.
구현자용.
정제:
속성 cite, datetime을 포함한 기본.
DOM 인터페이스:
HTMLModElement를 사용한다.

del 요소는 문서에서 제거된 내용을 나타낸다.

del 요소는 암시된 단락 경계를 넘어서는 안 된다.

다음은 완료된 항목에 완료 날짜와 시간을 함께 취소선을 표시한 "할 일" 목록이다.

<h1>To Do</h1>
<ul>
 <li>Empty the dishwasher</li>
 <li><del datetime="2009-10-11T01:25-07:00">Watch Walter Lewin's lectures</del></li>
 <li><del datetime="2009-10-10T23:38-07:00">Download more tracks</del></li>
 <li>Buy a printer</li>
</ul>

4.7.3 insdel 요소에 공통인 속성

cite 속성은 변경을 설명하는 문서의 URL을 지정하는 데 사용할 수 있다. 예를 들어 회의록처럼 해당 문서가 긴 경우 작성자는 변경을 논의하는 문서의 특정 부분을 가리키는 조각을 포함하는 것이 권장된다.

cite 속성이 존재하면 변경을 설명하는 공백으로 둘러싸일 수 있는 유효한 URL이어야 한다. 대응하는 출전 링크를 얻으려면 속성 값을 요소의 노드 문서를 기준으로 구문 분석해야 한다. 사용자 에이전트는 사용자가 이러한 출전 링크를 따라갈 수 있게 할 수 있지만, 이 링크는 주로 독자용이 아니라 비공개 용도(예: 사이트의 편집에 관한 통계를 수집하는 서버 측 스크립트)를 위한 것이다.

datetime 속성은 변경 날짜와 시간을 지정하는 데 사용할 수 있다.

datetime 속성이 존재하면 그 값은 선택적 시간이 포함된 유효한 날짜 문자열이어야 한다.

사용자 에이전트는 datetime 속성을 날짜 또는 시간 문자열 구문 분석 알고리즘에 따라 구문 분석해야 한다. 이 알고리즘이 날짜 또는 전역 날짜와 시간을 반환하지 않으면 해당 변경에는 연관된 타임스탬프가 없다(값이 부적합하며 선택적 시간이 포함된 유효한 날짜 문자열이 아니다). 그렇지 않으면 해당 변경은 주어진 날짜 또는 전역 날짜와 시간에 이루어진 것으로 표시된다. 주어진 값이 전역 날짜와 시간이면 사용자 에이전트는 연관된 시간대 오프셋 정보를 사용하여 주어진 날짜 및 시간을 어느 시간대로 표시할지 결정해야 한다.

이 값은 사용자에게 표시할 수 있지만 주로 비공개 용도를 위한 것이다.

insdel 요소는 HTMLModElement 인터페이스를 구현해야 한다:

HTMLModElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
[Exposed=Window]
interface HTMLModElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectURL] attribute USVString cite;
  [CEReactions, Reflect] attribute DOMString dateTime;
};

4.7.4 편집과 단락

이 절은 비규범적이다.

insdel 요소는 단락 구분에 영향을 주지 않으므로, 단락이 명시적인 p 요소 없이 암시되는 일부 경우에는 ins 또는 del 요소가 전체 단락 또는 다른 비-구문 콘텐츠 요소와 다른 단락의 일부를 모두 걸칠 수 있다. 예를 들면:

<section>
 <ins>
  <p>
   This is a paragraph that was inserted.
  </p>
  This is another paragraph whose first sentence was inserted
  at the same time as the paragraph above.
 </ins>
 This is a second sentence, which was there all along.
</section>

일부 단락만 p 요소로 감싸면 한 단락의 끝, 두 번째 단락 전체 및 세 번째 단락의 시작이 동일한 ins 또는 del 요소에 포함될 수도 있다(그러나 이는 매우 혼란스럽고 좋은 관행으로 간주되지 않는다):

<section>
 This is the first paragraph. <ins>This sentence was
 inserted.
 <p>This second paragraph was inserted.</p>
 This sentence was inserted too.</ins> This is the
 third paragraph in this example.
 <!-- (don't do this) -->
</section>

그러나 암시된 단락의 정의 방식 때문에 동일한 ins 또는 del 요소를 사용하여 한 단락의 끝과 바로 다음 단락의 시작을 마크업하는 것은 불가능하다. 대신 다음 예제처럼 하나 또는 두 개의 p 요소와 두 개의 ins 또는 del 요소를 사용해야 한다:

<section>
 <p>This is the first paragraph. <del>This sentence was
 deleted.</del></p>
 <p><del>This sentence was deleted too.</del> That
 sentence needed a separate &lt;del&gt; element.</p>
</section>

부분적으로는 위에서 설명한 혼란 때문에 작성자는 ins 또는 del 요소가 암시된 단락 경계를 가로지르게 하는 대신, 모든 단락을 항상 p 요소로 마크업하는 것이 강력히 권장된다.

4.7.5 편집과 목록

이 절은 비규범적이다.

olul 요소의 콘텐츠 모델은 insdel 요소를 자식으로 허용하지 않는다. 목록은 그렇지 않으면 삭제된 것으로 표시되었을 항목을 포함하여 항상 모든 항목을 나타낸다.

항목이 삽입되거나 삭제되었음을 나타내려면 ins 또는 del 요소로 li 요소의 콘텐츠를 감쌀 수 있다. 항목이 다른 항목으로 대체되었음을 나타내려면 단일 li 요소에 하나 이상의 del 요소를 두고 그 뒤에 하나 이상의 ins 요소를 둘 수 있다.

다음 예제에서는 처음에 비어 있던 목록에 시간이 지나면서 항목이 추가되고 제거되었다. 예제에서 강조된 부분은 목록의 "현재" 상태인 부분을 보여준다. 하지만 목록 항목 번호에는 편집 내용이 반영되지 않는다.

<h1>Stop-ship bugs</h1>
<ol>
 <li><ins datetime="2008-02-12T15:20Z">Bug 225:
 Rain detector doesn't work in snow</ins></li>
 <li><del datetime="2008-03-01T20:22Z"><ins datetime="2008-02-14T12:02Z">Bug 228:
 Water buffer overflows in April</ins></del></li>
 <li><ins datetime="2008-02-16T13:50Z">Bug 230:
 Water heater doesn't use renewable fuels</ins></li>
 <li><del datetime="2008-02-20T21:15Z"><ins datetime="2008-02-16T14:25Z">Bug 232:
 Carbon dioxide emissions detected after startup</ins></del></li>
</ol>

다음 예제에서는 처음에 과일만 있던 목록이 색상만 있는 목록으로 대체되었다.

<h1>List of <del>fruits</del><ins>colors</ins></h1>
<ul>
 <li><del>Lime</del><ins>Green</ins></li>
 <li><del>Apple</del></li>
 <li>Orange</li>
 <li><del>Pear</del></li>
 <li><ins>Teal</ins></li>
 <li><del>Lemon</del><ins>Yellow</ins></li>
 <li>Olive</li>
 <li><ins>Purple</ins></li>
</ul>

4.7.6 편집과 표

이 절은 비규범적이다.

표 모델의 일부를 이루는 요소는 insdel 요소를 허용하지 않는 복잡한 콘텐츠 모델 요구 사항을 가지므로 표의 편집을 나타내기 어려울 수 있다.

행 전체 또는 열 전체가 추가되거나 제거되었음을 나타내려면 해당 행이나 열의 각 셀 전체 콘텐츠를 각각 ins 또는 del 요소로 감쌀 수 있다.

여기서는 표에 행이 추가되었다:

<table>
 <thead>
  <tr> <th> Game name           <th> Game publisher   <th> Verdict
 <tbody>
  <tr> <td> Diablo 2            <td> Blizzard         <td> 8/10
  <tr> <td> Portal              <td> Valve            <td> 10/10
  <tr> <td> <ins>Portal 2</ins> <td> <ins>Valve</ins> <td> <ins>10/10</ins>
</table>

여기서는 열이 제거되었다. 제거된 시간과 제거 이유를 설명하는 페이지로 연결되는 링크도 함께 제공된다:

<table>
 <thead>
  <tr> <th> Game name           <th> Game publisher   <th> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">Verdict</del>
 <tbody>
  <tr> <td> Diablo 2            <td> Blizzard         <td> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">8/10</del>
  <tr> <td> Portal              <td> Valve            <td> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">10/10</del>
  <tr> <td> Portal 2            <td> Valve            <td> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">10/10</del>
</table>

일반적으로 더 복잡한 편집(예: 셀 하나가 제거되어 뒤의 모든 셀이 위쪽이나 왼쪽으로 이동한 경우)을 나타내는 좋은 방법은 없다.

4.8 임베디드 콘텐츠

4.8.1 picture 요소

Element/picture

현재의 모든 엔진에서 지원된다.

Firefox38+Safari9.1+Chrome38+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLPictureElement

현재의 모든 엔진에서 지원된다.

Firefox38+Safari9.1+Chrome38+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
범주:
플로 콘텐츠.
구문 콘텐츠.
임베디드 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
임베디드 콘텐츠가 예상되는 곳.
콘텐츠 모델:
0개 이상의 source 요소 뒤에 하나의 img 요소가 오며, 선택적으로 스크립트 지원 요소가 섞일 수 있다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLPictureElement : HTMLElement {
  [HTMLConstructor] constructor();
};

picture 요소는 포함된 img 요소에 여러 소스를 제공하는 컨테이너로, 화면 픽셀 밀도, 뷰포트 크기, 이미지 형식 및 기타 요인에 따라 어떤 이미지 리소스를 사용할지 작성자가 선언적으로 제어하거나 사용자 에이전트에 힌트를 제공할 수 있게 한다. 이 요소는 자식을 나타낸다.

picture 요소는 비슷해 보이는 videoaudio 요소와는 다소 다르다. 이들 모두 source 요소를 포함하지만, source 요소의 src 속성은 요소가 picture 요소 안에 중첩될 때 아무 의미가 없으며, 리소스 선택 알고리즘도 다르다. 또한 picture 요소 자체는 아무것도 표시하지 않는다. 이 요소는 포함된 img 요소가 여러 URL 중에서 선택할 수 있게 하는 맥락만 제공한다.

4.8.2 source 요소

Element/source

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLSourceElement

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+
범주:
없음.
이 요소를 사용할 수 있는 맥락:
picture 요소의 자식으로, img 요소 앞.
미디어 요소의 자식으로, 모든 플로 콘텐츠 또는 track 요소 앞.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
type — 임베디드 리소스의 유형
media — 적용할 수 있는 미디어
src (audio 또는 video에서) — 리소스의 주소
srcset (picture에서) — 고해상도 디스플레이, 작은 모니터 등 서로 다른 상황에서 사용할 이미지
sizes (picture에서) — 서로 다른 페이지 레이아웃을 위한 이미지 크기
width (picture에서) — 수평 치수
height (picture에서) — 수직 치수
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLSourceElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectURL] attribute USVString src;
  [CEReactions, Reflect] attribute DOMString type;
  [CEReactions, Reflect] attribute USVString srcset;
  [CEReactions, Reflect] attribute DOMString sizes;
  [CEReactions, Reflect] attribute DOMString media;
  [CEReactions, Reflect] attribute unsigned long width;
  [CEReactions, Reflect] attribute unsigned long height;
};

source 요소를 사용하면 작성자는 img 요소에 여러 대체 소스 집합을 지정하거나 미디어 요소에 여러 대체 미디어 리소스를 지정할 수 있다. 이 요소 자체는 아무것도 나타내지 않는다.

type 속성이 존재할 수 있다. 존재하는 경우 값은 유효한 MIME 유형 문자열이어야 한다.

media 속성도 존재할 수 있다. 존재하는 경우 값은 유효한 미디어 쿼리 목록을 포함해야 한다. 값이 환경과 일치하지 않으면 사용자 에이전트는 다음 source 요소로 건너뛴다.

media 속성은 미디어 요소리소스 선택 알고리즘 중 한 번만 평가된다. 반대로 picture 요소를 사용할 때 사용자 에이전트는 환경 변화에 반응한다.

나머지 요구 사항은 부모가 picture 요소인지 미디어 요소인지에 따라 달라진다:

source 요소의 부모가 picture 요소인 경우

srcset 속성이 존재해야 하며, 이는 srcset 속성이다.

srcset 속성은 source 요소가 선택된 경우 이미지 소스소스 집합에 기여한다.

srcset 속성에 너비 설명자를 사용하는 이미지 후보 문자열이 하나라도 있으면 sizes 속성도 존재할 수 있다. 또한 뒤따르는 형제 img 요소가 자동 크기를 허용하지 않으면 sizes 속성이 반드시 존재해야 한다. sizes 속성은 sizes 속성이며, source 요소가 선택된 경우 소스 크기소스 집합에 기여한다.

img 요소가 자동 크기를 허용하면 이전 형제 source 요소에서 sizes 속성을 생략할 수 있다. 이러한 경우에는 auto를 지정한 것과 같다.

source 요소는 치수 속성을 지원한다. img 요소는 렌더링된 치수와 종횡비를 결정할 때 img 요소 자체의 속성 대신 source 요소의 widthheight 속성을 사용할 수 있다. 이는 렌더링 절에 정의되어 있다.

type 속성은 소스 집합의 이미지 유형을 제공하여 사용자 에이전트가 주어진 유형을 지원하지 않는 경우 다음 source 요소로 건너뛸 수 있게 한다.

type 속성을 지정하지 않으면, 사용자 에이전트는 이미지를 가져온 뒤 그 이미지 형식을 지원하지 않는다는 사실을 알게 되더라도 다른 source 요소를 선택하지 않는다.

source 요소에 뒤따르는 형제 source 요소가 있거나 srcset 속성이 지정된 img 요소가 있으면, 다음 중 하나 이상을 가져야 한다:

src 속성이 존재해서는 안 된다.

source 요소의 부모가 미디어 요소인 경우

src 속성은 미디어 리소스URL을 제공한다. 값은 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL이어야 한다. 이 속성은 반드시 존재해야 한다.

type 속성은 미디어 리소스의 유형을 제공하여 사용자 에이전트가 해당 미디어 리소스를 가져오기 전에 재생할 수 있는지 판단하는 데 도움을 준다. 특정 MIME 유형이 정의하는 codecs 매개변수는 리소스가 정확히 어떻게 인코딩되었는지 지정하는 데 필요할 수 있다. [RFC6381]

source 요소가 이미 video 또는 audio 요소에 삽입된 상태에서 그 src 또는 type 속성을 동적으로 수정해도 아무 효과가 없다. 재생 중인 항목을 변경하려면 미디어 요소src 속성을 직접 사용하고, 사용 가능한 리소스 중에서 선택하기 위해 canPlayType() 메서드를 사용할 수 있다. 일반적으로 문서가 구문 분석된 뒤 source 요소를 수동으로 조작하는 것은 불필요하게 복잡한 접근 방식이다.

다음 목록은 type 속성에서 codecs= MIME 매개변수를 사용하는 몇 가지 예를 보여준다.

MP4 컨테이너의 H.264 제한 기준 프로파일 비디오(메인 및 확장 비디오 호환) 레벨 3과 저복잡도 AAC 오디오
<source src='video.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
MP4 컨테이너의 H.264 확장 프로파일 비디오(기준 프로파일 호환) 레벨 3과 저복잡도 AAC 오디오
<source src='video.mp4' type='video/mp4; codecs="avc1.58A01E, mp4a.40.2"'>
MP4 컨테이너의 H.264 메인 프로파일 비디오 레벨 3과 저복잡도 AAC 오디오
<source src='video.mp4' type='video/mp4; codecs="avc1.4D401E, mp4a.40.2"'>
MP4 컨테이너의 H.264 'High' 프로파일 비디오(메인, 기준 또는 확장 프로파일과 호환되지 않음) 레벨 3과 저복잡도 AAC 오디오
<source src='video.mp4' type='video/mp4; codecs="avc1.64001E, mp4a.40.2"'>
MP4 컨테이너의 MPEG-4 Visual Simple Profile Level 0 비디오와 저복잡도 AAC 오디오
<source src='video.mp4' type='video/mp4; codecs="mp4v.20.8, mp4a.40.2"'>
MP4 컨테이너의 MPEG-4 Advanced Simple Profile Level 0 비디오와 저복잡도 AAC 오디오
<source src='video.mp4' type='video/mp4; codecs="mp4v.20.240, mp4a.40.2"'>
3GPP 컨테이너의 MPEG-4 Visual Simple Profile Level 0 비디오와 AMR 오디오
<source src='video.3gp' type='video/3gpp; codecs="mp4v.20.8, samr"'>
Ogg 컨테이너의 Theora 비디오와 Vorbis 오디오
<source src='video.ogv' type='video/ogg; codecs="theora, vorbis"'>
Ogg 컨테이너의 Theora 비디오와 Speex 오디오
<source src='video.ogv' type='video/ogg; codecs="theora, speex"'>
Ogg 컨테이너의 Vorbis 오디오만
<source src='audio.ogg' type='audio/ogg; codecs=vorbis'>
Ogg 컨테이너의 Speex 오디오만
<source src='audio.spx' type='audio/ogg; codecs=speex'>
Ogg 컨테이너의 FLAC 오디오만
<source src='audio.oga' type='audio/ogg; codecs=flac'>
Ogg 컨테이너의 Dirac 비디오와 Vorbis 오디오
<source src='video.ogv' type='video/ogg; codecs="dirac, vorbis"'>

srcsetsizes 속성이 존재해서는 안 된다.

insertedNode가 주어졌을 때 sourceHTML 요소 삽입 단계는 다음과 같다:

  1. parentinsertedNode부모로 둔다.

  2. parentsrc 속성이 없고 networkStateNETWORK_EMPTY 값인 미디어 요소이면, 해당 미디어 요소리소스 선택 알고리즘을 호출한다.

  3. parentpicture 요소이면 parent자식 각각의 child에 대해 반복하고, childimg 요소이면 이를 child에 대한 관련 변이로 간주한다.

movedNode, isSubtreeRootoldAncestor가 주어졌을 때 sourceHTML 요소 이동 단계는 다음과 같다:

  1. isSubtreeRoot가 true이고 oldAncestorpicture 요소이면, oldAncestor자식 각각의 child에 대해 반복한다. childimg 요소이면 이를 child에 대한 관련 변이로 간주한다.

removedNode, isSubtreeRootoldAncestor가 주어졌을 때 sourceHTML 요소 제거 단계는 다음과 같다:

  1. isSubtreeRoot가 true이고 oldAncestorpicture 요소이면, oldAncestor자식 각각의 child에 대해 반복한다. childimg 요소이면 이를 child에 대한 관련 변이로 간주한다.

제공된 미디어 리소스를 모든 사용자 에이전트가 렌더링할 수 있을지 작성자가 확신하지 못한다면, 마지막 source 요소에서 error 이벤트를 수신하고 대체 동작을 트리거할 수 있다:

<script>
 function fallback(video) {
   // replace <video> with its contents
   while (video.hasChildNodes()) {
     if (video.firstChild instanceof HTMLSourceElement)
       video.removeChild(video.firstChild);
     else
       video.parentNode.insertBefore(video.firstChild, video);
   }
   video.parentNode.removeChild(video);
 }
</script>
<video controls autoplay>
 <source src='video.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
 <source src='video.ogv' type='video/ogg; codecs="theora, vorbis"'
         onerror="fallback(parentNode)">
 ...
</video>

4.8.3 img 요소

Element/img

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLImageElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

HTMLImageElement/alt

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLImageElement/srcset

현재의 모든 엔진에서 지원된다.

Firefox38+Safari8+Chrome34+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLImageElement/sizes

현재의 모든 엔진에서 지원된다.

Firefox38+Safari9.1+Chrome38+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLImageElement/useMap

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLImageElement/isMap

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
구문 콘텐츠.
임베디드 콘텐츠.
폼 연관 요소.
요소에 usemap 또는 controls 속성이 있는 경우: 대화형 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
임베디드 콘텐츠가 예상되는 곳.
picture 요소의 자식으로, 모든 source 요소 뒤.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
alt — 이미지를 사용할 수 없을 때 사용할 대체 텍스트
src — 리소스의 주소
srcset — 고해상도 디스플레이, 작은 모니터 등 서로 다른 상황에서 사용할 이미지
sizes — 서로 다른 페이지 레이아웃을 위한 이미지 크기
crossorigin — 요소가 교차 출처 요청을 처리하는 방법
usemap — 사용할 이미지 맵의 이름
ismap — 이미지가 서버 측 이미지 맵인지 여부
controls — 사용자 에이전트 컨트롤 표시
width — 수평 치수
height — 수직 치수
referrerpolicy — 요소가 시작한 가져오기에 대한 리퍼러 정책
decoding — 표시를 위해 이 이미지를 처리할 때 사용할 디코딩 힌트
loading — 로딩 지연을 결정할 때 사용
fetchpriority — 요소가 시작한 가져오기우선순위를 설정
접근성 고려 사항:
요소에 비어 있지 않은 alt 속성이 있는 경우: 작성자용; 구현자용.
그렇지 않은 경우: 작성자용; 구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window,
 LegacyFactoryFunction=Image(optional unsigned long width, optional unsigned long height)]
interface HTMLImageElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute DOMString alt;
  [CEReactions, ReflectURL] attribute USVString src;
  [CEReactions, Reflect] attribute USVString srcset;
  [CEReactions, Reflect] attribute DOMString sizes;
  [CEReactions] attribute DOMString? crossOrigin;
  [CEReactions, Reflect] attribute DOMString useMap;
  [CEReactions, Reflect] attribute boolean isMap;
  [CEReactions, Reflect] attribute boolean controls;
  [CEReactions, ReflectSetter] attribute unsigned long width;
  [CEReactions, ReflectSetter] attribute unsigned long height;
  readonly attribute unsigned long naturalWidth;
  readonly attribute unsigned long naturalHeight;
  readonly attribute boolean complete;
  readonly attribute USVString currentSrc;
  [CEReactions] attribute DOMString referrerPolicy;
  [CEReactions] attribute DOMString decoding;
  [CEReactions] attribute DOMString loading;
  [CEReactions] attribute DOMString fetchPriority;

  Promise<undefined> decode();

  // also has obsolete members
};

img 요소는 이미지를 나타낸다.

img 요소에는 처음에 요소 자체로 설정되는 치수 속성 소스가 있다.

HTMLImageElement/src

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

Element/img#attr-srcset

현재의 모든 엔진에서 지원된다.

Firefox38+Safari8+Chrome34+
Opera?Edge79+
Edge (Legacy)≤18+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

srcsrcset 속성이 제공하는 이미지와, 부모가 picture 요소인 경우 모든 이전 형제 source 요소의 srcset 속성이 제공하는 이미지는 임베디드 콘텐츠이다. alt 속성의 값은 이미지를 처리할 수 없거나 이미지 로딩을 비활성화한 사람에게 동등한 콘텐츠를 제공한다. 즉, 이는 img 요소의 대체 콘텐츠이다.

alt 속성 값에 대한 요구 사항은 별도의 절에 설명되어 있다.

srcsrcset 속성 중 하나 이상이 존재해야 한다.

src 속성이 존재하면, 페이지로 나뉘지 않고 스크립트가 적용되지 않은 비대화형 이미지 리소스를 참조하는 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL을 포함해야 한다. 이미지 리소스에는 선택적으로 애니메이션이 적용될 수 있다.

위 요구 사항은 이미지가 정적 비트맵(예: PNG, GIF, JPEG), 단일 페이지 벡터 문서(단일 페이지 PDF, SVG 문서 요소가 있는 XML 파일), 애니메이션 비트맵(APNG, 애니메이션 GIF), 애니메이션 벡터 그래픽(선언적 SMIL 애니메이션을 사용하는 SVG 문서 요소가 있는 XML 파일) 등이 될 수 있음을 뜻한다. 그러나 이러한 정의는 스크립트가 포함된 SVG 파일, 다중 페이지 PDF 파일, 대화형 MNG 파일, HTML 문서, 일반 텍스트 문서 등을 배제한다. [PNG] [GIF] [JPEG] [PDF] [XML] [APNG] [SVG] [MNG]

srcset 속성은 srcset 속성이다.

srcset 속성과 너비 설명자가 사용되지 않는 경우의 src 속성은 source 요소가 선택되지 않은 경우 이미지 소스소스 집합에 기여한다.

srcset 속성이 존재하고 너비 설명자를 사용하는 이미지 후보 문자열이 하나라도 있으면 sizes 속성도 존재해야 한다. srcset 속성이 지정되지 않고 loading 속성이 지연 상태이면, sizes 속성을 "auto" 값으로 지정할 수 있다(ASCII 대소문자 구분 없음). sizes 속성은 sizes 속성이며, source 요소가 선택되지 않은 경우 소스 크기소스 집합에 기여한다.

img 요소는 다음 조건을 충족하면 자동 크기를 허용한다:

Attributes/crossorigin

현재의 모든 엔진에서 지원된다.

Firefox8+Safari6+Chrome13+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

crossorigin 속성은 CORS 설정 속성이다. 이 속성의 목적은 교차 출처 접근을 허용하는 타사 사이트의 이미지를 canvas와 함께 사용할 수 있게 하는 것이다.

referrerpolicy 속성은 리퍼러 정책 속성이다. 이 속성의 목적은 이미지를 가져올 때 사용할 리퍼러 정책을 설정하는 것이다. [REFERRERPOLICY]

decoding 속성은 이 이미지를 디코딩하는 선호 방법을 나타낸다. 속성이 존재하면 이미지 디코딩 힌트여야 한다. 이 속성의 누락 값 기본값유효하지 않은 값 기본값은 모두 자동 상태이다.

HTMLImageElement/fetchPriority

Firefox아니요Safari🔰 preview+Chrome102+
Opera?Edge102+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

fetchpriority 속성은 가져오기 우선순위 속성이다. 이 속성의 목적은 이미지를 가져올 때 사용할 우선순위를 설정하는 것이다.

loading 속성은 지연 로딩 속성이다. 이 속성의 목적은 뷰포트 밖에 있는 이미지를 로드하는 정책을 나타내는 것이다.

loading 속성의 상태가 즉시 로드 상태로 변경되면 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. resumptionStepsimg 요소의 지연 로드 재개 단계로 둔다.

  2. resumptionSteps가 null이면 반환한다.

  3. img 요소의 지연 로드 재개 단계를 null로 설정한다.

  4. resumptionSteps를 호출한다.

<img src="1.jpeg" alt="1">
<img src="2.jpeg" loading=eager alt="2">
<img src="3.jpeg" loading=lazy alt="3">
<div id=very-large></div> <!-- Everything after this div is below the viewport -->
<img src="4.jpeg" alt="4">
<img src="5.jpeg" loading=lazy alt="5">

위 예제에서 이미지는 다음과 같이 로드된다:

1.jpeg, 2.jpeg, 4.jpeg

이미지는 즉시 로드되며 창의 load 이벤트를 지연시킨다.

3.jpeg

이미지가 뷰포트 안에 있으므로 레이아웃이 알려지면 로드되지만, 창의 load 이벤트를 지연시키지는 않는다.

5.jpeg

이미지는 스크롤되어 뷰포트 안으로 들어온 뒤에만 로드되며, 창의 load 이벤트를 지연시키지 않는다.

개발자는 CSS가 이미지의 너비 및 높이 속성을 설정하더라도, 이미지가 로드된 뒤 페이지 레이아웃이 이동하는 것을 방지하기 위해 지연 로드 이미지에 widthheight 속성으로 선호 종횡비를 지정하는 것이 권장된다.

insertedNode가 주어졌을 때 imgHTML 요소 삽입 단계는 다음과 같다:

  1. insertedNode의 부모가 picture 요소이면, 이를 insertedNode에 대한 관련 변이로 간주한다.

movedNode, isSubtreeRootoldAncestor가 주어졌을 때 imgHTML 요소 이동 단계는 다음과 같다:

  1. isSubtreeRoot가 true이고 oldAncestorpicture 요소이면, 이를 movedNode에 대한 관련 변이로 간주한다.

removedNode, oldAncestorisSubtreeRoot가 주어졌을 때 imgHTML 요소 제거 단계는 다음과 같다:

  1. isSubtreeRoot가 true이고 oldAncestorpicture 요소이면, 이를 removedNode에 대한 관련 변이로 간주한다.


img 요소를 레이아웃 도구로 사용해서는 안 된다. 특히 투명 이미지는 의미를 전달하는 경우가 드물고 문서에 유용한 내용을 추가하는 경우도 드물기 때문에 img 요소를 사용하여 투명 이미지를 표시해서는 안 된다.


img 요소가 나타내는 것은 src 속성과 alt 속성에 따라 달라진다.

src 속성이 설정되어 있고 alt 속성이 빈 문자열로 설정된 경우

이미지는 장식용이거나 나머지 콘텐츠를 보완하며, 문서의 다른 정보와 중복된다.

이미지를 사용할 수 있고 사용자 에이전트가 해당 이미지를 표시하도록 구성되어 있으면 요소는 요소의 이미지 데이터를 나타낸다.

그렇지 않으면 요소는 아무것도 나타내지 않으며 렌더링에서 완전히 생략할 수 있다. 사용자 에이전트는 이미지가 있지만 렌더링에서 생략되었다는 알림을 사용자에게 제공할 수 있다.

src 속성이 설정되어 있고 alt 속성이 비어 있지 않은 값으로 설정된 경우

이미지는 콘텐츠의 핵심 부분이며, alt 속성은 이미지에 대한 텍스트 등가물 또는 대체물을 제공한다.

이미지를 사용할 수 있고 사용자 에이전트가 해당 이미지를 표시하도록 구성되어 있으면 요소는 요소의 이미지 데이터를 나타낸다.

그렇지 않으면 요소는 alt 속성이 제공하는 텍스트를 나타낸다. 사용자 에이전트는 이미지가 있지만 렌더링에서 생략되었다는 알림을 사용자에게 제공할 수 있다.

src 속성이 설정되어 있고 alt 속성이 설정되지 않은 경우

이미지는 콘텐츠의 핵심 부분일 수 있으며, 사용할 수 있는 이미지의 텍스트 등가물이 없다.

적합한 문서에서 alt 속성이 없다는 것은 이미지가 콘텐츠의 핵심 부분이지만 이미지가 생성될 때 이미지의 텍스트 대체물을 사용할 수 없었음을 나타낸다.

이미지를 사용할 수 있고 사용자 에이전트가 해당 이미지를 표시하도록 구성되어 있으면 요소는 요소의 이미지 데이터를 나타낸다.

이미지에 값이 빈 문자열인 src 속성이 있으면 요소는 아무것도 나타내지 않는다.

그렇지 않으면 사용자 에이전트는 렌더링되지 않는 이미지가 있음을 나타내는 일종의 표시기를 보여줘야 하며, 사용자가 요청하거나 그렇게 구성되었거나 내비게이션에 대한 응답으로 맥락 정보를 제공해야 하는 경우 다음과 같이 파생된 이미지 캡션 정보를 제공할 수 있다:

  1. 이미지에 값이 빈 문자열이 아닌 title 속성이 있으면 해당 속성의 값을 반환한다.

  2. 이미지가 자식 figcaption 요소를 가진 figure 요소의 자손이고, figcaption 요소와 그 자손을 무시했을 때 figure 요소에 요소 간 공백img 요소 이외의 플로 콘텐츠 자손이 없다면, 첫 번째 해당 figcaption 요소의 콘텐츠를 반환한다.

  3. 아무것도 반환하지 않는다. 캡션 정보가 없다.

src 속성이 설정되지 않았고 alt 속성이 빈 문자열로 설정되었거나 alt 속성이 전혀 설정되지 않은 경우

요소는 아무것도 나타내지 않는다.

그렇지 않은 경우

요소는 alt 속성이 제공하는 텍스트를 나타낸다.

alt 속성은 참고 정보를 나타내지 않는다. 사용자 에이전트는 alt 속성의 콘텐츠를 title 속성의 콘텐츠와 같은 방식으로 표시해서는 안 된다.

사용자 에이전트는 언제든지 사용자가 모든 이미지를 표시하거나 모든 이미지가 표시되지 않도록 하는 옵션을 제공할 수 있다. 또한 시각 장애가 있거나 그래픽 기능이 없는 텍스트 터미널을 사용하는 등의 이유로 사용자가 이미지를 볼 수 없는 경우 이미지를 활용할 수 있도록 휴리스틱을 적용할 수 있다. 이러한 휴리스틱에는 예를 들어 이미지에서 발견된 텍스트에 대한 광학 문자 인식(OCR)이 포함될 수 있다.

사용자 에이전트가 누락된 alt 속성을 복구하는 것이 권장되지만, 작성자는 이러한 동작에 의존해서는 안 된다. 이미지의 대체물로 사용할 텍스트를 제공하기 위한 요구 사항은 아래에 자세히 설명되어 있다.

img 요소의 콘텐츠가 있는 경우에도 렌더링 목적에서는 무시된다.


usemap 속성이 존재하면 이미지에 연관된 이미지 맵이 있음을 나타낼 수 있다.

ismap 속성을 href 속성이 있는 a 요소의 자손인 요소에 사용하면, 이 속성의 존재는 요소가 서버 측 이미지 맵에 대한 접근을 제공함을 나타낸다. 이는 해당 a 요소에서 이벤트를 처리하는 방식에 영향을 준다.

ismap 속성은 불리언 속성이다. href 속성이 있는 조상 a 요소가 없는 요소에는 이 속성을 지정해서는 안 된다.

usemapismap 속성을 picture 요소 안에서 media 속성이 지정된 source 요소와 함께 사용하면 혼란스러운 동작이 발생할 수 있다.

controls 속성은 불리언 속성이다. 속성이 존재하면 사용자 에이전트가 사용자에게 사용자 인터페이스를 노출할 수 있음을 나타낸다. alt 속성이 없거나 alt 속성 값이 빈 문자열인 요소에는 이 속성을 지정해서는 안 된다.

controls 속성이 존재하면 사용자 에이전트는 이미지에 대한 컨트롤을 노출할 수 있다(예: 전체 화면 보기 컨트롤). 제공되는 구체적인 컨트롤은 구현 정의이며 플랫폼별이거나 사용자의 환경설정에 기반할 수 있다.

사용자 에이전트가 img 요소 위에 컨트롤을 표시하여 사용자 인터페이스를 노출하는 경우, 사용자 에이전트는 사용자가 이 인터페이스와 상호작용하는 동안 모든 사용자 상호작용 이벤트를 억제해야 한다.

이슈 #12318에서는 이미지 컨트롤과 애니메이션 이미지 사이의 상호작용을 추적한다. 이 이슈가 해결되기 전에는 사용자 에이전트가 이미지에 대한 애니메이션 컨트롤을 노출해서는 안 된다.


img 요소는 치수 속성을 지원한다.

HTMLImageElement/crossOrigin

현재의 모든 엔진에서 지원된다.

Firefox8+Safari6+Chrome13+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

crossOrigin IDL 속성은 crossorigin 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

HTMLImageElement/referrerPolicy

현재의 모든 엔진에서 지원된다.

Firefox50+Safari14+Chrome52+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

referrerPolicy IDL 속성은 referrerpolicy 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

HTMLImageElement/decoding

현재의 모든 엔진에서 지원된다.

Firefox63+Safari11.1+Chrome65+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

SVGImageElement/decoding

Firefox63+Safari아니요Chrome65+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

decoding IDL 속성은 decoding 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

HTMLImageElement/loading

현재의 모든 엔진에서 지원된다.

Firefox75+Safari15.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

loading IDL 속성은 loading 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

fetchPriority IDL 속성은 fetchpriority 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

image.width [ = value ]

HTMLImageElement/width

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
image.height [ = value ]

HTMLImageElement/height

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

이 속성들은 이미지의 실제 렌더링된 치수를 반환하며, 치수를 알 수 없으면 0을 반환한다.

이 속성들을 설정하여 대응하는 콘텐츠 속성을 변경할 수 있다.

image.naturalWidth

HTMLImageElement/naturalWidth

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
image.naturalHeight

HTMLImageElement/naturalHeight

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

이 속성들은 이미지의 밀도 보정 자연 너비와 높이를 반환하며, 이미지를 사용할 수 없으면 0을 반환한다.

image.complete

HTMLImageElement/complete

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

이미지가 완전히 다운로드되었거나 이미지가 지정되지 않은 경우 true를 반환하고, 그렇지 않으면 false를 반환한다.

image.currentSrc

HTMLImageElement/currentSrc

현재의 모든 엔진에서 지원된다.

Firefox38+Safari9.1+Chrome38+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

이미지의 절대 URL을 반환한다.

image.decode()

HTMLImageElement/decode

현재의 모든 엔진에서 지원된다.

Firefox68+Safari11.1+Chrome64+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

SVGImageElement/decode

Firefox68+Safari아니요Chrome64+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

이 메서드는 사용자 에이전트가 이미지를 병렬로 디코딩하게 하며, 디코딩이 완료되면 이행되는 프로미스를 반환한다.

이미지를 디코딩할 수 없는 경우 프로미스는 "EncodingError" DOMException으로 거부된다.

image = new Image([ width [, height ] ])

HTMLImageElement/Image

현재의 모든 엔진에서 지원된다.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

해당하는 경우 관련 인수로 전달된 값으로 widthheight 속성이 설정된 새로운 img 요소를 반환한다.

img 요소 image치수를 결정하려면:

  1. image렌더링 중이면 CSS 픽셀 단위의 렌더링된 너비와 높이를 반환한다. [CSS]

  2. image사용할 수 있고 밀도 보정 자연 너비와 높이가 있으면, 밀도 보정 자연 너비와 높이CSS 픽셀 단위로 반환한다.

  3. 너비 0과 높이 0을 반환한다.

width getter 단계에서는 this치수의 너비를 반환한다.

height getter 단계에서는 this치수의 높이를 반환한다.

naturalWidthnaturalHeight getter 단계는 다음과 같다:

  1. 이미지를 사용할 수 없으면 0을 반환한다.

  2. 이미지의 밀도 보정 자연 너비와 높이에서 각각 해당하는 구성 요소를 CSS 픽셀 단위로 반환한다. [CSS]

이미지의 밀도 보정 자연 너비와 높이는 메타데이터에 지정된 모든 방향을 고려하므로, naturalWidthnaturalHeight'image-orientation' 속성 값과 관계없이 이미지를 올바르게 배치하는 데 필요한 회전을 적용한 후의 치수를 반영한다.

complete getter 단계는 다음과 같다:

  1. 다음 중 하나라도 true이면:

    그러면 true를 반환한다.

  2. false를 반환한다.

currentSrc IDL 속성은 img 요소의 현재 요청현재 URL을 반환해야 한다.

decode() 메서드는 호출되면 다음 단계를 수행해야 한다:

  1. promise를 새 프로미스로 둔다.

  2. 다음 단계를 수행하도록 마이크로태스크를 큐에 넣는다:

    이미지 데이터 업데이트도 마이크로태스크에서 이루어지기 때문에 이렇게 한다. 따라서 다음과 같은 코드가

    img.src = "stars.jpg";
    img.decode();

    stars.jpg를 올바르게 디코딩하도록 하려면 모든 처리를 마이크로태스크 하나만큼 지연해야 한다.

    1. globalthis관련 전역 객체로 둔다.

    2. 다음 중 하나라도 true이면:

      그러면 promise"EncodingError" DOMException으로 거부한다.

    3. 그렇지 않으면 병렬로 다음 사례 중 하나가 발생할 때까지 기다린 후 해당하는 동작을 수행한다:

      img 요소의 노드 문서완전히 활성 상태가 아니게 된다
      img 요소의 현재 요청이 변경되거나 변이된다
      img 요소의 현재 요청상태손상됨이 된다

      global을 사용해 DOM 조작 태스크 소스전역 태스크를 큐에 넣어 promise"EncodingError" DOMException으로 거부한다.

      img 요소의 현재 요청상태완전히 사용 가능이 된다

      이미지를 디코딩한다.

      이 이미지에 디코딩을 수행할 필요가 없거나(예: 벡터 그래픽이기 때문) 디코딩 과정이 성공적으로 완료되면 global을 사용해 DOM 조작 태스크 소스전역 태스크를 큐에 넣어 promise를 undefined로 이행한다.

      디코딩이 실패하면(예: 유효하지 않은 이미지 데이터로 인해) global을 사용해 DOM 조작 태스크 소스전역 태스크를 큐에 넣어 promise"EncodingError" DOMException으로 거부한다.

      사용자 에이전트는 디코딩된 미디어 데이터가 적어도 이벤트 루프의 다음 성공적인 렌더링 업데이트 단계가 끝날 때까지 즉시 사용할 수 있는 상태로 유지되도록 해야 한다. 이는 API 계약의 중요한 부분이며 가능한 한 위반해서는 안 된다. 일반적으로 이는 디코딩된 이미지 데이터를 제거해야 하는 메모리 부족 상황이나, 이미지가 이 기간 동안 디코딩된 형태로 유지하기에 너무 큰 경우에만 위반된다.

      애니메이션 이미지는 모든 프레임이 로드된 뒤에만 완전히 사용 가능하게 된다. 따라서 구현이 그 시점 전에 첫 번째 프레임을 디코딩할 수 있더라도 위 단계에서는 그렇게 하지 않고 모든 프레임을 사용할 수 있을 때까지 기다린다.

  3. promise를 반환한다.

decode() 메서드가 없다면 img 요소를 로드한 뒤 표시하는 과정은 다음과 같을 수 있다:

const img = new Image();
img.src = "nebula.jpg";
img.onload = () => {
    document.body.appendChild(img);
};
img.onerror = () => {
    document.body.appendChild(new Text("Could not load the nebula :("));
};

그러나 이미지를 DOM에 삽입한 뒤 발생하는 페인트가 메인 스레드에서 동기 디코딩을 유발하므로 눈에 띄게 프레임이 누락될 수 있다.

대신 decode() 메서드를 사용하여 다음과 같이 다시 작성할 수 있다:

const img = new Image();
img.src = "nebula.jpg";
img.decode().then(() => {
    document.body.appendChild(img);
}).catch(() => {
    document.body.appendChild(new Text("Could not load the nebula :("));
});

후자의 형식은 사용자 에이전트가 이미지를 병렬로 디코딩하고 디코딩 과정이 완료된 뒤에만 DOM에 삽입하여 페인트가 발생하게 함으로써 원래 형식의 프레임 누락을 방지한다.

decode() 메서드는 디코딩된 이미지 데이터를 적어도 한 프레임 동안 사용할 수 있도록 보장하려 하므로 requestAnimationFrame() API와 결합할 수 있다. 즉, 모든 DOM 수정 사항을 애니메이션 프레임 콜백으로 함께 일괄 처리하도록 보장하는 코딩 스타일이나 프레임워크와 함께 사용할 수 있다:

const container = document.querySelector("#container");

const { containerWidth, containerHeight } = computeDesiredSize();
requestAnimationFrame(() => {
 container.style.width = containerWidth;
 container.style.height = containerHeight;
});

// ...

const img = new Image();
img.src = "supernova.jpg";
img.decode().then(() => {
    requestAnimationFrame(() => container.appendChild(img));
});

DOM의 createElement()과 같은 팩터리 메서드 외에 HTMLImageElement 객체를 생성하기 위한 레거시 팩터리 함수 Image(width, height)가 제공된다. 레거시 팩터리 함수는 호출되면 다음 단계를 수행해야 한다:

  1. document현재 전역 객체연관된 Document로 둔다.

  2. imgdocument, "img" 및 HTML 네임스페이스가 주어졌을 때 요소를 생성한 결과로 둔다.

  3. width가 주어지면 "width"와 width를 사용하여 img속성 값을 설정한다.

  4. height가 주어지면 "height"와 height를 사용하여 img속성 값을 설정한다.

  5. img를 반환한다.

하나의 이미지라도 맥락에 따라 적절한 대체 텍스트가 달라질 수 있다.

다음 각 사례에서는 동일한 이미지를 사용하지만 alt 텍스트는 매번 다르다. 이미지는 스위스 제네바주 카루주 지방 자치체의 문장이다.

여기에서는 보조 아이콘으로 사용한다:

<p>I lived in <img src="carouge.svg" alt=""> Carouge.</p>

여기에서는 도시를 나타내는 아이콘으로 사용한다:

<p>Home town: <img src="carouge.svg" alt="Carouge"></p>

여기에서는 도시에 관한 텍스트의 일부로 사용한다:

<p>Carouge has a coat of arms.</p>
<p><img src="carouge.svg" alt="The coat of arms depicts a lion, sitting in front of a tree."></p>
<p>It is used as decoration all over the town.</p>

여기에서는 이미지의 대체물로 설명을 제공하는 대신 이미지와 함께 설명도 제공하는 유사한 텍스트를 지원하는 데 사용한다:

<p>Carouge has a coat of arms.</p>
<p><img src="carouge.svg" alt=""></p>
<p>The coat of arms depicts a lion, sitting in front of a tree.
It is used as decoration all over the town.</p>

여기에서는 이야기의 일부로 사용한다:

<p>She picked up the folder and a piece of paper fell out.</p>
<p><img src="carouge.svg" alt="Shaped like a shield, the paper had a
red background, a green tree, and a yellow lion with its tongue
hanging out and whose tail was shaped like an S."></p>
<p>She stared at the folder. S! The answer she had been looking for all
this time was simply the letter S! How had she not seen that before? It all
came together now. The phone call where Hector had referred to a lion's tail,
the time Maria had stuck her tongue out...</p>

여기에서는 게시 시점에 이미지가 무엇이 될지 알 수 없고 어떤 종류의 문장이라는 것만 알 수 있으므로 대체 텍스트를 제공할 수 없다. 대신 이미지의 간략한 캡션만 title 속성에 제공한다:

<p>The last user to have uploaded a coat of arms uploaded this one:</p>
<p><img src="last-uploaded-coat-of-arms.cgi" title="User-uploaded coat of arms."></p>

이상적으로는 작성자가 이전 사용자에게 묻는 등의 방법으로 이 경우에도 실제 대체 텍스트를 제공할 방법을 찾아야 한다. 대체 텍스트를 제공하지 않으면 시각 장애인, 대역폭이 매우 낮은 연결을 사용하는 사용자, 바이트 단위로 요금을 지불하는 사용자 또는 텍스트 전용 웹 브라우저를 사용해야 하는 사용자처럼 이미지를 볼 수 없는 사람이 문서를 사용하기 더 어려워진다.

다음은 같은 그림을 서로 다른 맥락에서 사용하고 매번 적절한 대체 텍스트를 다르게 제공하는 몇 가지 추가 예제이다.

<article>
 <h1>My cats</h1>
 <h2>Fluffy</h2>
 <p>Fluffy is my favorite.</p>
 <img src="fluffy.jpg" alt="She likes playing with a ball of yarn.">
 <p>She's just too cute.</p>
 <h2>Miles</h2>
 <p>My other cat, Miles just eats and sleeps.</p>
</article>
<article>
 <h1>Photography</h1>
 <h2>Shooting moving targets indoors</h2>
 <p>The trick here is to know how to anticipate; to know at what speed and
 what distance the subject will pass by.</p>
 <img src="fluffy.jpg" alt="A cat flying by, chasing a ball of yarn, can be
 photographed quite nicely using this technique.">
 <h2>Nature by night</h2>
 <p>To achieve this, you'll need either an extremely sensitive film, or
 immense flash lights.</p>
</article>
<article>
 <h1>About me</h1>
 <h2>My pets</h2>
 <p>I've got a cat named Fluffy and a dog named Miles.</p>
 <img src="fluffy.jpg" alt="Fluffy, my cat, tends to keep itself busy.">
 <p>My dog Miles and I like go on long walks together.</p>
 <h2>music</h2>
 <p>After our walks, having emptied my mind, I like listening to Bach.</p>
</article>
<article>
 <h1>Fluffy and the Yarn</h1>
 <p>Fluffy was a cat who liked to play with yarn. She also liked to jump.</p>
 <aside><img src="fluffy.jpg" alt="" title="Fluffy"></aside>
 <p>She would play in the morning, she would play in the evening.</p>
</article>

4.8.4 이미지

4.8.4.1 소개

이 절은 비규범적이다.

HTML에 이미지를 임베드할 때 이미지 리소스가 하나뿐이면 img 요소와 그 src 속성을 사용한다.

<h2>From today's featured article</h2>
<img src="/uploads/100-marie-lloyd.jpg" alt="" width="100" height="150">
<p><b><a href="/wiki/Marie_Lloyd">Marie Lloyd</a></b> (1870–1922)
was an English <a href="/wiki/Music_hall">music hall</a> singer, ...

그러나 작성자가 사용자 에이전트가 선택할 수 있는 여러 이미지 리소스를 사용하려는 상황이 여러 가지 있다:

위 상황들은 서로 배타적이지 않다. 예를 들어 서로 다른 기기 픽셀 비율에 대한 서로 다른 리소스와 아트 디렉션에 대한 서로 다른 리소스를 결합하는 것은 합리적이다.

스크립팅을 사용하여 이러한 문제를 해결할 수 있지만, 그렇게 하면 다른 문제들이 발생한다:

이를 고려하여 이 명세는 위 문제를 선언적인 방식으로 해결하기 위한 여러 기능을 도입한다.

이미지의 렌더링 크기가 고정된 경우 기기 픽셀 비율 기반 선택

img 요소의 srcsrcset 속성은 x 설명자를 사용하여 크기만 다른 여러 이미지(작은 이미지는 큰 이미지를 축소한 버전)를 제공하는 데 사용할 수 있다.

x 설명자는 이미지의 렌더링 크기가 뷰포트 너비에 따라 달라지는 경우(뷰포트 기반 선택)에는 적절하지 않지만, 아트 디렉션과 함께 사용할 수 있다.

<h2>From today's featured article</h2>
<img src="/uploads/100-marie-lloyd.jpg"
     srcset="/uploads/150-marie-lloyd.jpg 1.5x, /uploads/200-marie-lloyd.jpg 2x"
     alt="" width="100" height="150">
<p><b><a href="/wiki/Marie_Lloyd">Marie Lloyd</a></b> (1870–1922)
was an English <a href="/wiki/Music_hall">music hall</a> singer, ...

사용자 에이전트는 사용자의 화면 픽셀 밀도, 확대/축소 수준 및 사용자의 네트워크 상태와 같은 다른 요인에 따라 주어진 리소스 중 어느 것이든 선택할 수 있다.

srcset 속성을 아직 이해하지 못하는 이전 사용자 에이전트와의 하위 호환성을 위해 URL 중 하나를 img 요소의 src 속성에 지정한다. 그러면 이전 사용자 에이전트에서도 유용한 항목이 표시된다(사용자가 원하는 것보다 해상도가 낮을 수는 있다). 새로운 사용자 에이전트에서는 src 속성이 srcset1x 설명자와 함께 지정된 것처럼 리소스 선택에 참여한다.

이미지의 렌더링 크기는 widthheight 속성에 주어지며, 사용자 에이전트는 이를 통해 이미지가 다운로드되기 전에 이미지 공간을 할당할 수 있다.

뷰포트 기반 선택

srcsetsizes 속성은 w 설명자를 사용하여 크기만 다른 여러 이미지(작은 이미지는 큰 이미지를 축소한 버전)를 제공하는 데 사용할 수 있다.

이 예제에서는 배너 이미지가 적절한 CSS를 사용하여 전체 뷰포트 너비를 차지한다.

<h1><img sizes="100vw" srcset="wolf-400.jpg 400w, wolf-800.jpg 800w, wolf-1600.jpg 1600w"
     src="wolf-400.jpg" alt="The rad wolf"></h1>

사용자 에이전트는 지정된 w 설명자와 sizes 속성에 지정된 렌더링 크기로 각 이미지의 유효 픽셀 밀도를 계산한다. 그런 다음 사용자의 화면 픽셀 밀도, 확대/축소 수준 및 사용자의 네트워크 상태와 같은 다른 요인에 따라 주어진 리소스 중 어느 것이든 선택할 수 있다.

사용자의 화면 너비가 320 CSS 픽셀이면 이는 wolf-400.jpg 1.25x, wolf-800.jpg 2.5x, wolf-1600.jpg 5x를 지정한 것과 같다. 반면 사용자의 화면 너비가 1200 CSS 픽셀이면 이는 wolf-400.jpg 0.33x, wolf-800.jpg 0.67x, wolf-1600.jpg 1.33x를 지정한 것과 같다. w 설명자와 sizes 속성을 사용하면 사용자 에이전트는 사용자 기기의 크기에 관계없이 다운로드할 올바른 이미지 소스를 선택할 수 있다.

하위 호환성을 위해 URL 중 하나를 img 요소의 src 속성에 지정한다. 새로운 사용자 에이전트에서는 src 속성이 srcset 속성에서 w 설명자를 사용할 때 무시된다.

이 예제에서 웹 페이지에는 뷰포트 너비에 따른 세 가지 레이아웃이 있다. 좁은 레이아웃에는 이미지가 한 열로 배치되고(각 이미지 너비는 약 100%), 중간 레이아웃에는 이미지가 두 열로 배치되며(각 이미지 너비는 약 50%), 가장 넓은 레이아웃에는 이미지가 세 열로 배치되고 페이지 여백도 있다(각 이미지 너비는 약 33%). 이러한 레이아웃은 뷰포트 너비가 각각 30em50em일 때 전환된다.

<img sizes="(max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
     srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
     src="swing-400.jpg" alt="Kettlebell Swing">

sizes 속성은 30em50em에 레이아웃 중단점을 설정하고, 이 중단점 사이의 이미지 크기를 100vw, 50vw 또는 calc(33vw - 100px)로 선언한다. 이러한 크기가 CSS에 지정된 실제 이미지 너비와 반드시 정확히 일치할 필요는 없다.

사용자 에이전트는 sizes 속성에서 true로 평가되는 <media-condition>(괄호 안 부분)이 있는 첫 번째 항목을 사용하거나, 모두 false로 평가되는 경우 마지막 항목(calc(33vw - 100px))을 사용하여 너비를 선택한다.

예를 들어 뷰포트 너비가 29em이면 (max-width: 30em)이 true로 평가되고 100vw가 사용되므로 리소스 선택을 위한 이미지 크기는 29em이다. 반대로 뷰포트 너비가 32em이면 (max-width: 30em)은 false로 평가되지만 (max-width: 50em)은 true로 평가되고 50vw가 사용되므로 리소스 선택을 위한 이미지 크기는 16em(뷰포트 너비의 절반)이다. 약간 더 넓은 뷰포트가 다른 레이아웃 때문에 더 작은 이미지를 생성한다는 점에 유의한다.

그런 다음 사용자 에이전트는 앞의 예제와 유사하게 유효 픽셀 밀도를 계산하고 적절한 리소스를 선택할 수 있다.

이 예제는 앞의 예제와 같지만 이미지가 지연 로드된다. 이 경우 sizes 속성에서 auto 키워드를 사용할 수 있으며, 사용자 에이전트는 width 속성(또는 CSS에 지정된 너비)을 소스 크기로 사용한다.

<img loading="lazy" width="200" height="200" sizes="auto"
     srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
     src="swing-400.jpg" alt="Kettlebell Swing">

auto 키워드를 지원하지 않는 레거시 사용자 에이전트와 더 나은 하위 호환성을 제공하기 위해 필요한 경우 대체 크기를 지정할 수 있다.

<img loading="lazy" width="200" height="200"
     sizes="auto, (max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
     srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
     src="swing-400.jpg" alt="Kettlebell Swing">
아트 디렉션 기반 선택

picture 요소와 source 요소를 media 속성과 함께 사용하여 이미지 콘텐츠가 서로 다른 여러 이미지(예를 들어 작은 이미지는 큰 이미지를 자른 버전일 수 있음)를 제공할 수 있다.

<picture>
  <source media="(min-width: 45em)" srcset="large.jpg">
  <source media="(min-width: 32em)" srcset="med.jpg">
  <img src="small.jpg" alt="The wolf runs through the snow.">
</picture>

사용자 에이전트는 media 속성의 미디어 쿼리가 일치하는 첫 번째 source 요소를 선택한 다음, 해당 요소의 srcset 속성에서 적절한 URL을 선택한다.

이미지의 렌더링 크기는 선택된 리소스에 따라 달라진다. 이미지가 다운로드되기 전에 사용자 에이전트가 사용할 수 있는 치수를 지정하려면 CSS를 사용할 수 있다.

img { width: 300px; height: 300px }
@media (min-width: 32em) { img { width: 500px; height:300px } }
@media (min-width: 45em) { img { width: 700px; height:400px } }

이 예제는 아트 디렉션 기반 선택과 기기 픽셀 비율 기반 선택을 결합한다. 뷰포트의 절반을 차지하는 배너가 넓은 화면용과 좁은 화면용 두 가지 버전으로 제공된다.

<h1>
 <picture>
  <source media="(max-width: 500px)" srcset="banner-phone.jpeg, banner-phone-HD.jpeg 2x">
  <img src="banner.jpeg" srcset="banner-HD.jpeg 2x" alt="The Breakfast Combo">
 </picture>
</h1>
이미지 형식 기반 선택

source 요소의 type 속성을 사용하여 서로 다른 형식의 여러 이미지를 제공할 수 있다.

<h2>From today's featured article</h2>
<picture>
 <source srcset="/uploads/100-marie-lloyd.webp" type="image/webp">
 <source srcset="/uploads/100-marie-lloyd.jxr" type="image/vnd.ms-photo">
 <img src="/uploads/100-marie-lloyd.jpg" alt="" width="100" height="150">
</picture>
<p><b><a href="/wiki/Marie_Lloyd">Marie Lloyd</a></b> (1870–1922)
was an English <a href="/wiki/Music_hall">music hall</a> singer, ...

이 예제에서 사용자 에이전트는 지원되는 MIME 유형을 가진 type 속성이 있는 첫 번째 소스를 선택한다. 사용자 에이전트가 WebP 이미지를 지원하면 첫 번째 source 요소가 선택된다. 지원하지 않지만 JPEG XR 이미지를 지원하면 두 번째 source 요소가 선택된다. 두 형식 모두 지원하지 않으면 img 요소가 선택된다.

4.8.4.1.1 적응형 이미지

이 절은 비규범적이다.

CSS와 미디어 쿼리를 사용하여 사용자 환경, 특히 서로 다른 뷰포트 치수와 픽셀 밀도에 동적으로 적응하는 그래픽 페이지 레이아웃을 구성할 수 있다. 그러나 콘텐츠에는 CSS가 도움이 되지 않는다. 대신 img 요소의 srcset 속성과 picture 요소를 사용한다. 이 절에서는 이러한 기능을 사용하는 방법을 보여주는 예제 사례를 단계별로 살펴본다.

넓은 화면(600 CSS 픽셀보다 넓음)에서는 a-rectangle.png라는 이름의 300×150 이미지를 사용하고, 더 작은 화면(600 CSS 픽셀 이하)에서는 a-square.png라는 이름의 더 작은 100×100 이미지를 사용하는 상황을 생각해 보자. 이에 대한 마크업은 다음과 같다:

<figure>
 <picture>
  <source srcset="a-square.png" media="(max-width: 600px)">
  <img src="a-rectangle.png" alt="Barney Frank wears a suit and glasses.">
 </picture>
 <figcaption>Barney Frank, 2011</figcaption>
</figure>

alt 속성에 넣을 내용에 대한 자세한 내용은 이미지의 대체물로 사용할 텍스트를 제공하기 위한 요구 사항 절을 참조한다.

이 방식의 문제점은 이미지가 로드되는 동안 사용자 에이전트가 이미지에 사용할 치수를 반드시 알 수 있는 것은 아니라는 점이다. 페이지가 로드되는 동안 레이아웃을 여러 번 리플로해야 하는 상황을 피하기 위해 CSS와 CSS 미디어 쿼리를 사용하여 치수를 제공할 수 있다:

<style>
 #a { width: 300px; height: 150px; }
 @media (max-width: 600px) { #a { width: 100px; height: 100px; } }
</style>
<figure>
 <picture>
  <source srcset="a-square.png" media="(max-width: 600px)">
  <img src="a-rectangle.png" alt="Barney Frank wears a suit and glasses." id="a">
 </picture>
 <figcaption>Barney Frank, 2011</figcaption>
</figure>

또는 sourceimg 요소에서 widthheight 속성을 사용하여 너비와 높이를 제공할 수 있다:

<figure>
 <picture>
  <source srcset="a-square.png" media="(max-width: 600px)" width="100" height="100">
  <img src="a-rectangle.png" width="300" height="150"
  alt="Barney Frank wears a suit and glasses.">
 </picture>
 <figcaption>Barney Frank, 2011</figcaption>
</figure>

img 요소는 picture 요소를 지원하지 않는 레거시 사용자 에이전트에서 사용할 이미지의 URL을 제공하는 src 속성과 함께 사용된다. 이로 인해 src 속성에 어떤 이미지를 제공해야 하는지에 대한 의문이 생긴다.

작성자가 레거시 사용자 에이전트에서 가장 큰 이미지를 사용하려 한다면 마크업은 다음과 같을 수 있다:

<picture>
 <source srcset="pear-mobile.jpeg" media="(max-width: 720px)">
 <source srcset="pear-tablet.jpeg" media="(max-width: 1280px)">
 <img src="pear-desktop.jpeg" alt="The pear is juicy.">
</picture>

그러나 레거시 모바일 사용자 에이전트가 더 중요하다면 세 이미지를 모두 source 요소에 나열하여 src 속성을 완전히 재정의할 수 있다.

<picture>
 <source srcset="pear-mobile.jpeg" media="(max-width: 720px)">
 <source srcset="pear-tablet.jpeg" media="(max-width: 1280px)">
 <source srcset="pear-desktop.jpeg">
 <img src="pear-mobile.jpeg" alt="The pear is juicy.">
</picture>

이 시점에는 src 속성이 실제로 picture를 지원하는 사용자 에이전트에서 완전히 무시되므로, src 속성의 기본값은 가장 작거나 가장 큰 이미지가 아닌 이미지를 포함하여 어떤 이미지든 될 수 있다:

<picture>
 <source srcset="pear-mobile.jpeg" media="(max-width: 720px)">
 <source srcset="pear-tablet.jpeg" media="(max-width: 1280px)">
 <source srcset="pear-desktop.jpeg">
 <img src="pear-tablet.jpeg" alt="The pear is juicy.">
</picture>

위에서는 이미지가 사용될 최대 (뷰포트) 치수를 제공하는 max-width 미디어 기능을 사용했다. 대신 min-width를 사용할 수도 있다.

<picture>
 <source srcset="pear-desktop.jpeg" media="(min-width: 1281px)">
 <source srcset="pear-tablet.jpeg" media="(min-width: 721px)">
 <img src="pear-mobile.jpeg" alt="The pear is juicy.">
</picture>
4.8.4.2 source, imglink 요소에 공통인 속성
4.8.4.2.1 Srcset 속성

srcset 속성은 이 절에 정의된 요구 사항을 가진 속성이다.

존재하는 경우 그 값은 하나 이상의 이미지 후보 문자열로 구성되어야 하며, 각 문자열은 다음 문자열과 U+002C COMMA 문자(,)로 구분된다. 이미지 후보 문자열에 설명자가 없고 URL 뒤에 ASCII 공백이 없으면, 뒤따르는 이미지 후보 문자열이 있는 경우 하나 이상의 ASCII 공백으로 시작해야 한다.

이미지 후보 문자열은 아래 목록에 설명된 추가 제한을 따르며 다음 구성 요소로 순서대로 이루어진다:

  1. 0개 이상의 ASCII 공백.

  2. U+002C COMMA 문자(,)로 시작하거나 끝나지 않으며, 페이지로 나뉘지 않고 스크립트가 적용되지 않은 비대화형 이미지 리소스를 참조하는 유효한 비어 있지 않은 URL. 이미지 리소스에는 선택적으로 애니메이션이 적용될 수 있다.

  3. 0개 이상의 ASCII 공백.

  4. 다음 중 0개 또는 1개:

  5. 0개 이상의 ASCII 공백.

한 요소에 대해 다른 이미지 후보 문자열너비 설명자 값과 동일한 너비 설명자 값을 가진 이미지 후보 문자열이 있어서는 안 된다.

한 요소에 대해 다른 이미지 후보 문자열픽셀 밀도 설명자 값과 동일한 픽셀 밀도 설명자 값을 가진 이미지 후보 문자열이 있어서는 안 된다. 이 요구 사항의 목적상 설명자가 없는 이미지 후보 문자열1x 설명자가 있는 이미지 후보 문자열과 같다.

한 요소의 이미지 후보 문자열너비 설명자가 지정되면 해당 요소의 다른 모든 이미지 후보 문자열에도 너비 설명자가 지정되어야 한다.

이미지 후보 문자열너비 설명자에 지정된 너비는 이미지 후보 문자열의 URL이 제공하는 리소스에 자연 너비가 있는 경우 그 리소스의 자연 너비와 일치해야 한다.

요소에 sizes 속성이 존재하면 해당 요소의 모든 이미지 후보 문자열너비 설명자가 지정되어야 한다.

4.8.4.2.2 Sizes 속성

sizes 속성은 이 절에 정의된 요구 사항을 가진 속성이다.

존재하는 경우 그 값은 유효한 소스 크기 목록이어야 한다.

유효한 소스 크기 목록은 다음 문법과 일치하는 문자열이다: [CSSVALUES] [MQ]

<source-size-list> = <source-size>#? , <source-size-value>
<source-size> = <media-condition> <source-size-value> | auto
<source-size-value> = <length> | auto

<source-size-value><length>인 경우 음수여서는 안 되며, 수학 함수 이외의 CSS 함수를 사용해서는 안 된다.

auto 키워드는 sizes 속성 구문 분석에서 계산되는 너비이다. 존재하는 경우 첫 번째 항목이어야 하며 전체 <source-size-list> 값은 문자열 "auto"와 ASCII 대소문자를 구분하지 않고 일치하거나 문자열 "auto,"로 ASCII 대소문자를 구분하지 않고 시작해야 한다.

이미지 데이터 업데이트 또는 환경 변화에 반응 알고리즘으로 이미지 로딩을 시작한 img 요소가 자동 크기를 허용하고 렌더링 중이면, auto구체적 객체 크기의 너비이다. 그렇지 않으면 auto 값이 무시되고, 다음 소스 크기가 있으면 대신 사용된다.

다음 조건을 충족하는 경우 source 요소의 sizes 속성과 img 요소의 sizes 속성에 auto 키워드를 지정할 수 있다. 그렇지 않으면 auto를 지정해서는 안 된다.

또한 widthheight 속성이나 CSS를 사용하여 치수를 지정하는 것이 강력히 권장된다. 치수가 지정되지 않으면 sizes="auto"렌더링 절에서 contain-intrinsic-size: 300px 150px를 의미하므로 이미지가 300x150 치수로 렌더링될 가능성이 높다.

<source-size-value>는 이미지의 의도된 레이아웃 너비를 제공한다. 작성자는 <media-condition>을 사용하여 서로 다른 환경에 서로 다른 너비를 지정할 수 있다.

무엇을 기준으로 한 백분율인지에 관한 혼동을 피하기 위해 <source-size-value>에는 백분율을 사용할 수 없다. 'vw' 단위는 뷰포트 너비에 상대적인 크기에 사용할 수 있다.

4.8.4.3 처리 모델

img 요소에는 현재 요청대기 중인 요청이 있다. 현재 요청은 처음에 새로운 이미지 요청으로 설정된다. 대기 중인 요청은 처음에 null로 설정된다.

이미지 요청에는 상태, 현재 URL이미지 데이터가 있다.

이미지 요청상태는 다음 중 하나이다:

사용 불가
사용자 에이전트가 이미지 데이터를 전혀 얻지 못했거나, 이미지 데이터의 일부 또는 전부를 얻었지만 이미지 치수를 얻을 만큼 충분히 디코딩하지 못한 상태.
부분적으로 사용 가능
사용자 에이전트가 이미지 데이터의 일부를 얻었고 적어도 이미지 치수를 사용할 수 있는 상태.
완전히 사용 가능
사용자 에이전트가 모든 이미지 데이터를 얻었고 적어도 이미지 치수를 사용할 수 있는 상태.
손상됨
사용자 에이전트가 얻을 수 있는 이미지 데이터를 모두 얻었지만 이미지 치수를 얻을 만큼 이미지를 디코딩할 수도 없는 상태(예: 이미지가 손상되었거나 형식이 지원되지 않거나 데이터를 전혀 얻을 수 없음).

이미지 요청현재 URL은 처음에 빈 문자열이다.

이미지 요청이미지 데이터는 디코딩된 이미지 데이터이다.

이미지 요청상태부분적으로 사용 가능 또는 완전히 사용 가능이면, 해당 이미지 요청사용 가능하다고 한다.

img 요소의 현재 요청상태완전히 사용 가능이고 사용자 에이전트가 오류 없이 미디어 데이터를 디코딩할 수 있으면 img 요소를 완전히 디코딩 가능하다고 한다.

이미지 요청상태는 처음에 사용 불가이다.

img 요소의 현재 요청사용할 수 있으면, img 요소는 너비가 이미지의 밀도 보정 자연 너비(있는 경우)이고, 높이가 이미지의 밀도 보정 자연 높이(있는 경우)이며, 외형이 이미지의 자연스러운 외형인 페인트 소스를 제공한다.


img 요소에 srcset 속성이 지정되어 있거나 부모가 picture 요소이면, 해당 요소가 srcset 또는 picture를 사용한다고 한다.


img 요소에는 마지막으로 선택된 소스가 있으며, 처음에는 null이어야 한다.

이미지 요청에는 현재 픽셀 밀도가 있으며, 처음에는 1이어야 한다.

이미지 요청에는 선호 밀도 보정 치수가 있으며, 이는 너비와 높이로 구성된 구조체 또는 null이다. 처음에는 null이어야 한다.

img 요소 img밀도 보정 자연 너비와 높이를 결정하려면:

  1. densityimg현재 요청현재 픽셀 밀도로 둔다.

  2. dimensionsimg현재 요청선호 밀도 보정 치수로 둔다.

    선호 밀도 보정 치수는 이미지의 메타 정보를 기반으로 표시할 이미지 준비 알고리즘에서 설정된다.

  3. dimensions가 null이 아니면 dimensions의 너비를 dimensions의 너비를 density로 나눈 값으로 설정하고, dimensions의 높이를 dimensions의 높이를 density로 나눈 값으로 설정한 다음 dimensions를 반환한다.

  4. intrinsicWidth, intrinsicHeightintrinsicRatio를 각각 img자연 너비, 자연 높이 및 자연 종횡비가 있는 경우 그 값으로 둔다.

  5. intrinsicWidth가 부재하지 않으면 intrinsicWidthintrinsicWidthdensity로 나눈 값으로 설정한다.

  6. intrinsicHeight가 부재하지 않으면 intrinsicHeightintrinsicHeightdensity로 나눈 값으로 설정한다.

  7. intrinsicWidth, intrinsicHeightintrinsicRatio를 사용하고 300×150의 기본 객체 크기를 사용하여 기본 크기 조정 알고리즘을 적용한 결과를 반환한다.

예를 들어 현재 픽셀 밀도가 3.125이면 이는 CSS 인치당 기기 픽셀이 300개 있다는 의미이므로, 이미지 데이터가 300x600이면 밀도 보정 자연 너비와 높이는 96 CSS 픽셀×192 CSS 픽셀이다.

모든 imglink 요소는 소스 집합과 연관된다.

소스 집합은 0개 이상의 이미지 소스로 구성된 순서 있는 집합과 소스 크기이다.

이미지 소스URL이며, 선택적으로 픽셀 밀도 설명자 또는 너비 설명자 중 하나를 가진다.

소스 크기<source-size-value>이다. 소스 크기뷰포트에 상대적인 단위가 있으면 img 요소의 노드 문서뷰포트에 상대적으로 해석해야 한다. 다른 단위는 미디어 쿼리에서와 동일하게 해석해야 한다. [MQ]


이 절의 알고리즘에서 구문 분석 오류는 입력과 요구 사항 간의 치명적이지 않은 불일치를 나타낸다. 사용자 에이전트는 어떤 방식으로든 구문 분석 오류를 노출하는 것이 권장된다.


이미지의 유형과 유효한 이미지인지 여부를 결정할 때 이미지 가져오기의 성공 여부(예: 응답 상태가 정상 상태였는지 여부)는 무시해야 한다.

이를 통해 서버가 오류 응답과 함께 이미지를 반환해도 해당 이미지가 표시될 수 있다.

사용자 에이전트는 이미지의 유형을 결정하기 위해 이미지 스니핑 규칙을 적용해야 하며, 이미지의 연관된 Content-Type 헤더공식 유형을 제공한다. 이 규칙을 적용하지 않으면 이미지 유형은 이미지의 연관된 Content-Type 헤더가 제공하는 유형이어야 한다.

사용자 에이전트는 img 요소에서 이미지가 아닌 리소스(예: 문서 요소가 HTML 요소인 XML 파일)를 지원해서는 안 된다. 사용자 에이전트는 이미지 리소스에 임베드된 실행 가능한 코드(예: 스크립트)를 실행해서는 안 된다. 사용자 에이전트는 여러 페이지로 구성된 리소스(예: PDF 파일)의 첫 번째 페이지만 표시해야 한다. 사용자 에이전트는 리소스가 대화형으로 동작하도록 허용해서는 안 되지만 리소스의 애니메이션은 존중해야 한다.

이 명세는 어떤 이미지 유형을 지원해야 하는지 지정하지 않는다.

4.8.4.3.1 이미지를 가져오는 시점

기본적으로 이미지는 즉시 가져온다. 사용자 에이전트는 사용자에게 필요할 때 대신 가져오도록 하는 옵션을 제공할 수 있다. (예를 들어 대역폭에 제약이 있는 사용자가 필요할 때 가져오기 옵션을 사용할 수 있다.)

이미지를 즉시 가져올 때 사용자 에이전트는 해당 요소가 생성되거나 관련 변이를 겪을 때마다, 그렇게 명시된 경우 애니메이션 재시작 플래그를 설정하여 img 요소의 이미지 데이터를 업데이트해야 한다.

이미지를 필요할 때 가져올 때 사용자 에이전트는 이미지 데이터가 필요할 때마다(즉, 필요할 때) img 요소의 이미지 데이터를 업데이트해야 하지만, 이는 img 요소의 현재 요청상태사용 불가인 경우에만 해당한다. img 요소가 관련 변이를 겪었고, 사용자 에이전트가 이미지를 필요할 때만 가져오는 경우 img 요소의 현재 요청상태사용 불가로 돌아가야 한다.

4.8.4.3.2 DOM 변이에 반응하기

img 요소에 대한 관련 변이는 다음과 같다:

4.8.4.3.3 사용 가능한 이미지 목록

Document 객체에는 사용 가능한 이미지 목록이 있어야 한다. 이 목록의 각 이미지는 절대 URL, CORS 설정 속성 모드, 그리고 모드가 CORS 없음이 아닌 경우 출처로 구성된 튜플로 식별된다. 또한 각 이미지에는 상위 계층 캐싱 무시 플래그가 있다. 사용자 에이전트는 언제든지 한 Document 객체의 사용 가능한 이미지 목록에서 다른 객체로 항목을 복사할 수 있다(예: Document가 생성될 때 사용자 에이전트는 다른 Document들에 로드된 모든 이미지를 추가할 수 있다). 그러나 이렇게 복사할 때 복사된 항목의 키를 변경해서는 안 되며, 복사된 항목의 상위 계층 캐싱 무시 플래그를 해제해야 한다. 사용자 에이전트는 언제든지 이러한 목록에서 이미지를 제거할 수도 있다(예: 메모리를 절약하기 위해). 사용자 에이전트는 상위 계층 캐싱 무시 플래그가 해제된 경우 리소스에 대한 상위 계층 캐싱 의미 체계(예: HTTP `Cache-Control` 응답 헤더)에 따라 적절하게 사용 가능한 이미지 목록의 항목을 제거해야 한다.

사용 가능한 이미지 목록은 이전에 로드한 URL로 src 속성을 변경할 때 동기적으로 전환할 수 있도록 하고, HTTP에 따라 캐싱을 허용하지 않더라도 같은 문서에서 이미지를 다시 다운로드하지 않도록 하기 위한 것이다. 이전 이미지가 아직 로드 중인 동안 동일한 이미지를 다시 다운로드하지 않도록 하기 위해 사용되는 것은 아니다.

사용자 에이전트는 이미지 데이터를 사용 가능한 이미지 목록과 별도로 저장할 수도 있다.

예를 들어 리소스에 HTTP 응답 헤더 `Cache-Control: must-revalidate`가 있고 상위 계층 캐싱 무시 플래그가 해제되어 있으면 사용자 에이전트는 해당 리소스를 사용 가능한 이미지 목록에서 제거하지만 이미지 데이터는 별도로 유지할 수 있으며, 서버가 304 Not Modified 상태로 응답하면 이를 사용할 수 있다.

4.8.4.3.4 이미지 디코딩

이미지 데이터는 일반적으로 파일 크기를 줄이기 위해 인코딩된다. 이는 사용자 에이전트가 이미지를 화면에 표시하려면 데이터를 디코딩해야 한다는 뜻이다. 디코딩은 이미지의 미디어 데이터를 화면에 표시하기에 적합한 비트맵 형태로 변환하는 과정이다. 이 과정은 콘텐츠 표시와 관련된 다른 과정에 비해 느릴 수 있다는 점에 유의한다. 따라서 사용자 에이전트는 최상의 사용자 경험을 만들기 위해 디코딩을 수행할 시점을 선택할 수 있다.

이미지 디코딩이 완료될 때까지 다른 콘텐츠의 표시를 막으면 동기식이라고 한다. 일반적으로 이는 이미지와 다른 콘텐츠를 동시에 원자적으로 표시하는 효과가 있다. 그러나 이러한 표시는 디코딩에 걸리는 시간만큼 지연된다.

이미지 디코딩이 다른 콘텐츠의 표시를 막지 않으면 비동기식이라고 한다. 이는 이미지가 아닌 콘텐츠를 더 빠르게 표시하는 효과가 있다. 그러나 디코딩이 완료될 때까지 화면에는 이미지 콘텐츠가 없다. 디코딩이 완료되면 이미지로 화면이 업데이트된다.

동기 및 비동기 디코딩 모드 모두에서 같은 시간이 경과한 뒤 최종 콘텐츠가 화면에 표시된다. 주요 차이점은 사용자 에이전트가 최종 콘텐츠를 표시하기 전에 이미지가 아닌 콘텐츠를 먼저 표시하는지 여부이다.

사용자 에이전트가 동기 또는 비동기 디코딩을 수행할지 결정하는 데 도움을 주기 위해 img 요소에 decoding 속성을 설정할 수 있다. decoding 속성에 사용할 수 있는 값은 다음 이미지 디코딩 힌트 키워드이다:

키워드 상태 설명
sync 동기 다른 콘텐츠와 원자적으로 표시하기 위해 이 이미지를 동기적으로 디코딩하는 것을 선호함을 나타낸다.
async 비동기 다른 콘텐츠의 표시가 지연되는 것을 피하기 위해 이 이미지를 비동기적으로 디코딩하는 것을 선호함을 나타낸다.
auto 자동 디코딩 모드에 대한 선호가 없음을 나타낸다(기본값).

이미지를 디코딩할 때 사용자 에이전트는 decoding 속성의 상태가 나타내는 선호를 존중해야 한다. 표시된 상태가 자동이면 사용자 에이전트는 어떤 디코딩 동작이든 자유롭게 선택할 수 있다.

decode() 메서드를 사용하여 디코딩 동작을 제어할 수도 있다. decode() 메서드는 콘텐츠를 화면에 표시하는 과정과 독립적으로 디코딩을 수행하므로 decoding 속성의 영향을 받지 않는다.

4.8.4.3.5 이미지 데이터 업데이트

이 알고리즘은 병렬로 실행 중인 단계에서 호출할 수 없다. 사용자 에이전트가 병렬로 실행 중인 단계에서 이 알고리즘을 호출해야 하는 경우, 이를 수행하도록 태스크를 큐에 넣어야 한다.

사용자 에이전트가 img 요소의 이미지 데이터를 업데이트할 때, 선택적으로 애니메이션 재시작 플래그를 설정하고 선택적으로 이벤트를 생략할 수 있음 플래그를 설정하여 다음 단계를 실행해야 한다:

  1. 요소의 노드 문서완전히 활성 상태가 아니면:

    1. 이 알고리즘을 병렬로 계속 실행한다.

    2. 요소의 노드 문서완전히 활성 상태가 될 때까지 기다린다.

    3. img 요소에 대한 이 알고리즘의 다른 인스턴스가 이 인스턴스보다 나중에 시작되었으면 (중단되어 더 이상 실행 중이 아니더라도) 반환한다.

    4. 이 알고리즘을 계속하도록 마이크로태스크를 큐에 넣는다.

  2. 사용자 에이전트가 이미지를 지원할 수 없거나 이미지 지원이 비활성화되었으면 현재 요청대기 중인 요청에 대한 이미지 요청을 중단하고, 현재 요청상태사용 불가로 설정하고, 대기 중인 요청을 null로 설정한 뒤 반환한다.

  3. previousURL현재 요청현재 URL로 둔다.

  4. selected source를 null로, selected pixel density를 undefined로 둔다.

  5. 요소가 srcset 또는 picture를 사용하지 않고, 값이 빈 문자열이 아닌 src 속성이 지정되어 있으면 selected source를 요소의 src 속성 값으로 설정하고 selected pixel density를 1.0으로 설정한다.

  6. 요소의 마지막으로 선택된 소스selected source로 설정한다.

  7. selected source가 null이 아니면:

    1. urlStringselected source와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 둔다.

    2. urlString이 실패이면 이 내부 단계 집합을 중단한다.

    3. keyurlString, img 요소의 crossorigin 속성 모드, 그리고 해당 모드가 CORS 없음이 아닌 경우 노드 문서출처로 구성된 튜플로 둔다.

    4. 사용 가능한 이미지 목록key에 대한 항목이 있으면:

      1. 해당 항목의 상위 계층 캐싱 무시 플래그를 설정한다.

      2. 현재 요청대기 중인 요청에 대한 이미지 요청을 중단한다.

      3. 대기 중인 요청을 null로 설정한다.

      4. 현재 요청이미지 데이터가 해당 항목의 이미지 데이터이고 상태완전히 사용 가능인 새로운 이미지 요청으로 설정한다.

      5. img 요소가 주어졌을 때 현재 요청을 표시하도록 준비한다.

      6. 현재 요청현재 픽셀 밀도selected pixel density로 설정한다.

      7. img 요소와 다음 단계가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 넣는다:

        1. 애니메이션 재시작이 설정되어 있으면 애니메이션을 재시작한다.

        2. 현재 요청현재 URLurlString으로 설정한다.

        3. 이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURLurlString과 같지 않으면 img 요소에 load라는 이름의 이벤트를 발생시킨다.

      8. 이미지 데이터 업데이트 알고리즘을 중단한다.

  8. 이 알고리즘을 호출한 태스크가 계속될 수 있도록 이 알고리즘의 나머지 부분을 수행할 마이크로태스크를 큐에 넣는다.

  9. img 요소에 대한 이 알고리즘의 다른 인스턴스가 이 인스턴스보다 나중에 시작되었으면 (중단되어 더 이상 실행 중이 아니더라도) 반환한다.

    예를 들어 src, srcsetcrossorigin 속성이 연속해서 모두 설정될 때 여러 요청이 발생하지 않도록 마지막 인스턴스만 적용된다.

  10. selected sourceselected pixel density를 각각 이미지 소스를 선택한 결과인 URL과 픽셀 밀도로 둔다.

  11. selected source가 null이면:

    1. 현재 요청상태손상됨으로 설정하고, 현재 요청대기 중인 요청에 대한 이미지 요청을 중단한 뒤, 대기 중인 요청을 null로 설정한다.

    2. img 요소와 다음 단계가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 넣는다:

      1. 현재 요청현재 URL을 빈 문자열로 변경한다.

      2. 다음이 모두 true이면:

        img 요소에 error라는 이름의 이벤트를 발생시킨다.

    3. 반환한다.

  12. urlStringselected source와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 둔다.

  13. urlString이 실패이면:

    1. 현재 요청대기 중인 요청에 대한 이미지 요청을 중단한다.

    2. 현재 요청상태손상됨으로 설정한다.

    3. 대기 중인 요청을 null로 설정한다.

    4. img 요소와 다음 단계가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 넣는다:

      1. 현재 요청현재 URLselected source로 변경한다.

      2. 이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURLselected source와 같지 않으면 img 요소에 error라는 이름의 이벤트를 발생시킨다.

    5. 반환한다.

  14. 대기 중인 요청이 null이 아니고 urlString대기 중인 요청현재 URL과 같으면 반환한다.

  15. urlString현재 요청현재 URL과 같고 현재 요청상태부분적으로 사용 가능이면:

    1. 대기 중인 요청에 대한 이미지 요청을 중단한다.

    2. 애니메이션 재시작이 설정되어 있으면 img 요소가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 넣어 애니메이션을 재시작한다.

    3. 반환한다.

  16. 대기 중인 요청에 대한 이미지 요청을 중단한다.

  17. image request현재 URLurlString인 새로운 이미지 요청으로 설정한다.

  18. 현재 요청상태사용 불가 또는 손상됨이면 현재 요청image request로 설정한다. 그렇지 않으면 대기 중인 요청image request로 설정한다.

  19. requesturlString, "image" 및 요소의 crossorigin 콘텐츠 속성의 현재 상태가 주어졌을 때 잠재적 CORS 요청을 생성한 결과로 둔다.

  20. request클라이언트를 요소의 노드 문서관련 설정 객체로 설정한다.

  21. 요소가 srcset 또는 picture를 사용하면 request개시자를 "imageset"으로 설정한다.

  22. request리퍼러 정책을 요소의 referrerpolicy 속성의 현재 상태로 설정한다.

  23. request우선순위를 요소의 fetchpriority 속성의 현재 상태로 설정한다.

  24. delay load eventimg지연 로딩 속성즉시 로드 상태이거나, img에 대해 스크립팅이 비활성화되어 있으면 true로, 그렇지 않으면 false로 둔다.

  25. img가 주어졌을 때 요소를 지연 로드할지 결정하는 단계가 true를 반환하면:

    1. img지연 로드 재개 단계이미지 가져오기라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 설정한다.

    2. img 요소에 대해 지연 로딩 요소의 교차 관찰을 시작한다.

    3. 반환한다.

  26. 이미지 가져오기: request가져온다. 이 알고리즘에서 반환하고, 나머지 단계를 응답 response에 대한 가져오기의 processResponse의 일부로 실행한다.

    이 방식으로 얻은 리소스가 있는 경우 이는 image request이미지 데이터이다. 이는 CORS 동일 출처 또는 CORS 교차 출처일 수 있으며, 이는 이미지가 다른 API와 상호작용하는 방식에 영향을 준다(예: canvas에서 사용될 때).

    delay load event가 true이면 이미지 가져오기는 리소스를 가져온 뒤 (아래에 정의됨) 네트워킹 태스크 소스큐에 넣은 태스크가 실행될 때까지 요소의 노드 문서load 이벤트를 지연해야 한다.

    안타깝게도 이를 사용하여 사용자의 로컬 네트워크에 대한 기초적인 포트 스캔을 수행할 수 있다(특히 스크립팅과 함께 사용할 때이지만, 실제로 이러한 공격을 수행하는 데 스크립팅이 필요한 것은 아니다). 사용자 에이전트는 이 공격을 완화하기 위해 위에 설명된 것보다 더 엄격한 교차 출처 접근 제어 정책을 구현할 수 있지만, 안타깝게도 이러한 정책은 일반적으로 기존 웹 콘텐츠와 호환되지 않는다.

  27. 가능한 한 빨리 다음 목록에서 처음으로 적용되는 항목으로 이동한다:

    리소스 유형이 multipart/x-mixed-replace인 경우

    이미지를 가져오는 동안 네트워킹 태스크 소스가 다음으로 큐에 넣는 태스크는 다음 단계를 실행해야 한다:

    1. image request대기 중인 요청이고 본문 부분 하나 이상이 완전히 디코딩되었으면 현재 요청에 대한 이미지 요청을 중단하고 대기 중인 요청을 현재 요청으로 승격한다.

    2. 그렇지 않고 image request대기 중인 요청이며 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으면 현재 요청에 대한 이미지 요청을 중단하고, 대기 중인 요청을 현재 요청으로 승격한 뒤, 현재 요청상태손상됨으로 설정한다.

    3. 그렇지 않고 image request현재 요청이며, 그 상태사용 불가이고, 사용자 에이전트가 image request 이미지의 너비와 높이를 결정할 수 있으면 현재 요청상태부분적으로 사용 가능으로 설정한다.

    4. 그렇지 않고 image request현재 요청이며, 그 상태사용 불가이고, 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으면 현재 요청상태손상됨으로 설정한다.

    이미지를 가져오는 동안 네트워킹 태스크 소스큐에 넣는태스크는 이미지 표시를 업데이트해야 한다. 새 본문 부분이 들어올 때마다 사용자 에이전트가 이미지의 너비와 높이를 결정할 수 있으면 img 요소가 주어졌을 때 img 요소의 현재 요청을 표시하도록 준비하고 이전 이미지를 대체해야 한다. 본문 부분 하나가 완전히 디코딩되면 다음 단계를 수행한다:

    1. img 요소의 현재 요청상태완전히 사용 가능으로 설정한다.

    2. 이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURLurlString과 같지 않으면 img 요소가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 넣어 img 요소에 load라는 이름의 이벤트를 발생시킨다.

    리소스 유형과 데이터가 아래에 설명된 대로 지원되는 이미지 형식에 해당하는 경우

    이미지를 가져오는 동안 네트워킹 태스크 소스가 다음으로 큐에 넣는 태스크는 다음 단계를 실행해야 한다:

    1. 사용자 에이전트가 image request 이미지의 너비와 높이를 결정할 수 있고 image request대기 중인 요청이면 image request상태부분적으로 사용 가능으로 설정한다.

    2. 그렇지 않고 사용자 에이전트가 image request 이미지의 너비와 높이를 결정할 수 있으며 image request현재 요청이면, img 요소가 주어졌을 때 image request를 표시하도록 준비하고 image request상태부분적으로 사용 가능으로 설정한다.

    3. 그렇지 않고 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으며 image request대기 중인 요청이면:

      1. 현재 요청대기 중인 요청에 대한 이미지 요청을 중단한다.

      2. 대기 중인 요청을 현재 요청으로 승격한다.

      3. 현재 요청상태손상됨으로 설정한다.

      4. img 요소에 error라는 이름의 이벤트를 발생시킨다.

    4. 그렇지 않고 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으며 image request현재 요청이면:

      1. image request에 대한 이미지 요청을 중단한다.

      2. 이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURLurlString과 같지 않으면 img 요소에 error라는 이름의 이벤트를 발생시킨다.

    해당 태스크와 이미지를 가져오는 동안 네트워킹 태스크 소스가 이후 큐에 넣는태스크image request현재 요청인 경우 이미지 표시를 적절하게 업데이트해야 한다(예: 이미지가 프로그레시브 JPEG이면 각 패킷이 이미지 해상도를 향상시킬 수 있다).

    또한 리소스를 가져온 뒤 네트워킹 태스크 소스가 마지막으로 큐에 넣는 태스크는 다음 단계도 추가로 실행해야 한다:

    1. image request대기 중인 요청이면 현재 요청에 대한 이미지 요청을 중단하고, 대기 중인 요청을 현재 요청으로 승격한 뒤, img 요소가 주어졌을 때 image request를 표시하도록 준비한다.

    2. image request완전히 사용 가능 상태로 설정한다.

    3. 상위 계층 캐싱 무시 플래그를 설정하여 key를 사용해 이미지를 사용 가능한 이미지 목록에 추가한다.

    4. 이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURLurlString과 같지 않으면 img 요소에 load라는 이름의 이벤트를 발생시킨다.

    그렇지 않은 경우

    이미지 데이터가 지원되는 파일 형식이 아니다. 사용자 에이전트는 image request상태손상됨으로 설정하고, 현재 요청대기 중인 요청에 대한 이미지 요청을 중단하고, image request대기 중인 요청이면 대기 중인 요청을 현재 요청으로 승격한다. 그런 다음 이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURLurlString과 같지 않으면 img 요소가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 넣어 img 요소에 error라는 이름의 이벤트를 발생시킨다.

사용자 에이전트가 요소 x에 대해 위 알고리즘을 실행하는 동안, 해당 요소가 연결되어 있지 않더라도 요소의 노드 문서에서 요소 x로 향하는 강한 참조가 있어야 한다.

이미지 요청 또는 null인 image request에 대한 이미지 요청을 중단한다는 것은 다음 단계를 실행하는 것을 의미한다:

  1. image request가 null이면 반환한다.

  2. image request이미지 데이터가 있으면 이를 잊는다.

  3. image request에 대한 가져오기 알고리즘의 모든 인스턴스를 중단하고 해당 알고리즘이 생성한 모든 대기 중인 태스크를 폐기한다.

img 요소에 대해 대기 중인 요청을 현재 요청으로 승격한다는 것은 다음 단계를 실행하는 것을 의미한다:

  1. img 요소의 현재 요청대기 중인 요청으로 설정한다.

  2. img 요소의 대기 중인 요청을 null로 설정한다.

4.8.4.3.6 표시할 이미지 준비

이미지 요소 img가 주어졌을 때 이미지 요청 req에 대해 표시할 이미지를 준비하려면:

  1. exifTagMap을 관련 코덱에서 정의한 대로 req이미지 데이터에서 얻은 EXIF 태그로 둔다. [EXIF]

  2. physicalWidthphysicalHeight를 관련 코덱에서 정의한 대로 req이미지 데이터에서 얻은 너비와 높이로 둔다.

  3. dimXexifTagMap의 태그 0xA002 (PixelXDimension) 값으로 둔다.

  4. dimYexifTagMap의 태그 0xA003 (PixelYDimension) 값으로 둔다.

  5. resXexifTagMap의 태그 0x011A (XResolution) 값으로 둔다.

  6. resYexifTagMap의 태그 0x011B (YResolution) 값으로 둔다.

  7. resUnitexifTagMap의 태그 0x0128 (ResolutionUnit) 값으로 둔다.

  8. 다음이 모두 true이면:

    • dimX가 양의 정수이다.

    • dimY가 양의 정수이다.

    • resX가 양의 부동 소수점 수이다.

    • resY가 양의 부동 소수점 수이다.

    • physicalWidth × 72 / resXdimX이다.

    • physicalHeight × 72 / resYdimY이다.

    • resUnit2(Inch)이다.

    그러면:

    1. req이미지 데이터CORS 교차 출처이면, img자연 치수dimXdimY로 설정하고 img의 픽셀 데이터를 그에 따라 조정한다.

    2. 그렇지 않으면 req선호 밀도 보정 치수를 너비가 dimX로 설정되고 높이가 dimY로 설정된 구조체로 설정한다.

  9. reqimg 요소의 표시를 적절히 업데이트한다.

EXIF의 해상도는 인치당 CSS 포인트와 같으므로 해상도에서 크기를 계산할 때 72를 기준으로 사용한다.

이미지가 이미 표시된 뒤 EXIF가 도착하는 경우 어떻게 처리할지는 아직 지정되지 않았다. 이슈 #4929를 참조한다.

4.8.4.3.7 이미지 소스 선택

img 요소 el이 주어졌을 때 이미지 소스를 선택하려면:

  1. el소스 집합을 업데이트한다.

  2. el소스 집합이 비어 있으면 URL로 null을, 픽셀 밀도로 undefined를 반환한다.

  3. el소스 집합에서 이미지를 선택한 결과를 반환한다.

소스 집합 sourceSet이 주어졌을 때 소스 집합에서 이미지 소스를 선택하려면:

  1. sourceSet의 항목 bsourceSet의 이전 항목 a와 동일한 연관 픽셀 밀도 설명자를 가지면 항목 b를 제거한다. sourceSet의 어떤 항목도 이전 항목과 동일한 연관 픽셀 밀도 설명자를 가지지 않을 때까지 이 단계를 반복한다.

  2. 구현 정의 방식으로 sourceSet에서 하나의 이미지 소스를 선택한다. selectedSource를 이 선택으로 둔다.

  3. selectedSource와 그에 연결된 픽셀 밀도를 반환한다.

4.8.4.3.8 속성에서 소스 집합 생성

문자열 default source, 문자열 srcset, 문자열 sizes, 요소 또는 null인 img가 주어졌을 때 소스 집합을 생성하라는 요청을 받으면:

  1. source set을 빈 소스 집합으로 둔다.

  2. srcset이 빈 문자열이 아니면 source setsrcset구문 분석한 결과로 설정한다.

  3. source set소스 크기img와 함께 sizes구문 분석한 결과로 설정한다.

  4. default source가 빈 문자열이 아니고 source set픽셀 밀도 설명자 값이 1인 이미지 소스가 없으며, 너비 설명자가 있는 이미지 소스도 없으면 default sourcesource set에 추가한다.

  5. source set소스 밀도를 정규화한다.

  6. source set을 반환한다.

4.8.4.3.9 소스 집합 업데이트

주어진 img 또는 link 요소 el소스 집합을 업데이트하라는 요청을 받으면 사용자 에이전트는 다음을 수행해야 한다:

  1. el소스 집합을 빈 소스 집합으로 설정한다.

  2. elements를 « el »로 둔다.

  3. el이 부모 노드가 picture 요소인 img 요소이면, 상대적 순서를 유지하면서 elements의 내용을 el의 부모 노드의 자식 요소로 대체한다.

  4. elimg 요소이면 imgel로, 그렇지 않으면 null로 둔다.

  5. elements의 각 child에 대해 반복한다:

    1. childel이면:

      1. default source를 빈 문자열로 둔다.

      2. srcset을 빈 문자열로 둔다.

      3. sizes를 빈 문자열로 둔다.

      4. elsrcset 속성을 가진 img 요소이면 srcset을 해당 속성의 값으로 설정한다.

      5. 그렇지 않고 elimagesrcset 속성을 가진 link 요소이면 srcset을 해당 속성의 값으로 설정한다.

      6. elsizes 속성을 가진 img 요소이면 sizes를 해당 속성의 값으로 설정한다.

      7. 그렇지 않고 elimagesizes 속성을 가진 link 요소이면 sizes를 해당 속성의 값으로 설정한다.

      8. elsrc 속성을 가진 img 요소이면 default source를 해당 속성의 값으로 설정한다.

      9. 그렇지 않고 elhref 속성을 가진 link 요소이면 default source를 해당 속성의 값으로 설정한다.

      10. el소스 집합default source, srcset, sizes, img가 주어졌을 때 소스 집합을 생성한 결과로 설정한다.

      11. 반환한다.

        ellink 요소이면 elements에는 el만 포함되므로 이 단계에 즉시 도달하고 알고리즘의 나머지는 실행되지 않는다.

    2. childsource 요소가 아니면 계속한다.

    3. childsrcset 속성이 없으면 다음 자식으로 계속한다.

    4. childsrcset 속성을 구문 분석하고 반환된 소스 집합source set으로 둔다.

    5. source set이미지 소스가 하나도 없으면 다음 자식으로 계속한다.

    6. childmedia 속성이 있고 그 값이 환경과 일치하지 않으면 다음 자식으로 계속한다.

    7. img와 함께 childsizes 속성을 구문 분석하고 반환된 값을 source set소스 크기로 둔다.

    8. childtype 속성이 있고 그 값이 알 수 없거나 지원되지 않는 MIME 유형이면 다음 자식으로 계속한다.

    9. childwidth 또는 height 속성이 있으면 el치수 속성 소스child로 설정한다. 그렇지 않으면 el치수 속성 소스el로 설정한다.

    10. source set소스 밀도를 정규화한다.

    11. el소스 집합source set으로 설정한다.

    12. 반환한다.

img 요소는 이전 형제인 source 요소와 img 요소 자체를 독립적으로 고려하여 이미지 소스를 선택하며, 같은 picture 요소의 다른 img 요소나 관련 img 요소의 뒤따르는 형제인 source 요소를 포함한 다른 모든 유효하지 않은 요소는 무시한다.

4.8.4.3.10 srcset 속성 구문 분석

요소에서 srcset 속성을 구문 분석하라는 요청을 받으면 요소의 srcset 속성 값을 다음과 같이 구문 분석한다:

  1. input을 이 알고리즘에 전달된 값으로 둔다.

  2. position을 처음에는 문자열의 시작을 가리키는 input 내부의 포인터로 둔다.

  3. candidates를 처음에는 비어 있는 소스 집합으로 둔다.

  4. 분할 루프: position이 주어졌을 때 input에서 ASCII 공백 또는 U+002C COMMA 문자인 코드 포인트 시퀀스를 수집한다. U+002C COMMA 문자가 하나라도 수집되면 구문 분석 오류이다.

  5. positioninput의 끝을 지났으면 candidates를 반환한다.

  6. position이 주어졌을 때 input에서 ASCII 공백이 아닌 코드 포인트 시퀀스를 수집하고 그 결과를 url로 둔다.

  7. descriptors를 새로운 빈 목록으로 둔다.

  8. url이 U+002C(,)로 끝나면:

    1. url 끝의 모든 U+002C COMMA 문자를 제거한다. 두 개 이상의 문자를 제거한 경우 구문 분석 오류이다.

    그렇지 않으면:

    1. 설명자 토크나이저: position이 주어졌을 때 input 안의 ASCII 공백을 건너뛴다.

    2. current descriptor를 빈 문자열로 둔다.

    3. state설명자 내부로 둔다.

    4. cposition의 문자로 둔다. state의 값에 따라 다음을 수행한다. 이 단계에서 "EOF"는 positioninput의 끝을 지났음을 나타내는 특수 문자이다.

      설명자 내부

      c의 값에 따라 다음을 수행한다:

      ASCII 공백

      current descriptor가 비어 있지 않으면 current descriptordescriptors에 추가하고 current descriptor를 빈 문자열로 둔다. state설명자 뒤로 설정한다.

      U+002C COMMA (,)

      positioninput의 다음 문자로 이동한다. current descriptor가 비어 있지 않으면 current descriptordescriptors에 추가한다. 설명자 파서라고 표시된 단계로 이동한다.

      U+0028 LEFT PARENTHESIS (()

      ccurrent descriptor에 추가한다. state괄호 내부로 설정한다.

      EOF

      current descriptor가 비어 있지 않으면 current descriptordescriptors에 추가한다. 설명자 파서라고 표시된 단계로 이동한다.

      그 밖의 모든 경우

      ccurrent descriptor에 추가한다.

      괄호 내부

      c의 값에 따라 다음을 수행한다:

      U+0029 RIGHT PARENTHESIS ())

      ccurrent descriptor에 추가한다. state설명자 내부로 설정한다.

      EOF

      current descriptordescriptors에 추가한다. 설명자 파서라고 표시된 단계로 이동한다.

      그 밖의 모든 경우

      ccurrent descriptor에 추가한다.

      설명자 뒤

      c의 값에 따라 다음을 수행한다:

      ASCII 공백

      이 상태를 유지한다.

      EOF

      설명자 파서라고 표시된 단계로 이동한다.

      그 밖의 모든 경우

      state설명자 내부로 설정한다. positioninput이전 문자로 설정한다.

      positioninput의 다음 문자로 이동한다. 이 단계를 반복한다.

      향후 추가 사항과 호환되도록 이 알고리즘은 여러 설명자와 괄호가 있는 설명자를 지원한다.

  9. 설명자 파서: error아니요로 둔다.

  10. width부재로 둔다.

  11. density부재로 둔다.

  12. future-compat-h부재로 둔다.

  13. descriptors의 각 설명자에 대해 다음 목록에서 적절한 단계 집합을 실행한다:

    설명자가 유효한 음이 아닌 정수와 그 뒤의 U+0077 LATIN SMALL LETTER W 문자로 구성되는 경우
    1. 사용자 에이전트가 sizes 속성을 지원하지 않으면 error로 둔다.

      준수하는 사용자 에이전트는 sizes 속성을 지원한다. 그러나 실제로 사용자 에이전트는 일반적으로 기능을 점진적으로 구현하고 출시한다.

    2. widthdensity가 모두 부재인 것이 아니면 error로 둔다.

    3. 설명자에 음이 아닌 정수 구문 분석 규칙을 적용한다. 결과가 0이면 error로 둔다. 그렇지 않으면 width를 결과로 둔다.

    설명자가 유효한 부동 소수점 수와 그 뒤의 U+0078 LATIN SMALL LETTER X 문자로 구성되는 경우
    1. width, densityfuture-compat-h가 모두 부재인 것이 아니면 error로 둔다.

    2. 설명자에 부동 소수점 수 값 구문 분석 규칙을 적용한다. 결과가 0보다 작으면 error로 둔다. 그렇지 않으면 density를 결과로 둔다.

      density가 0이면 자연 치수는 무한대가 된다. 사용자 에이전트는 이미지가 렌더링될 수 있는 크기에 제한을 둘 것으로 예상된다.

    설명자가 유효한 음이 아닌 정수와 그 뒤의 U+0068 LATIN SMALL LETTER H 문자로 구성되는 경우

    이는 구문 분석 오류이다.

    1. future-compat-hdensity가 모두 부재인 것이 아니면 error로 둔다.

    2. 설명자에 음이 아닌 정수 구문 분석 규칙을 적용한다. 결과가 0이면 error로 둔다. 그렇지 않으면 future-compat-h를 결과로 둔다.

    그 밖의 모든 경우

    error로 둔다.

  14. future-compat-h부재가 아니고 width부재이면 error로 둔다.

  15. error가 여전히 아니요이면 URL이 url이고, width부재가 아니면 너비 width와 연결되고, density부재가 아니면 픽셀 밀도 density와 연결된 새로운 이미지 소스candidates에 추가한다. 그렇지 않으면 구문 분석 오류이다.

  16. 분할 루프라고 표시된 단계로 돌아간다.

4.8.4.3.11 sizes 속성 구문 분석

img 요소 또는 null인 img와 함께 요소 element에서 sizes 속성을 구문 분석하라는 요청을 받으면:

  1. unparsed sizes listelementsizes 속성 값(속성이 없으면 빈 문자열)에서 쉼표로 구분된 구성 요소 값 목록을 구문 분석한 결과로 둔다. [CSSSYNTAX]

  2. size를 null로 둔다.

  3. unparsed sizes list의 각 unparsed size에 대해:

    1. unparsed size 끝의 연속된 모든 <whitespace-token>을 제거한다. 이제 unparsed size가 비어 있으면 구문 분석 오류이며, 계속한다.

    2. unparsed size의 마지막 구성 요소 값이 유효한 음이 아닌 <source-size-value>이면 size를 그 값으로 설정하고 unparsed size에서 구성 요소 값을 제거한다. 수학 함수 이외의 CSS 함수는 모두 유효하지 않다. 그렇지 않으면 구문 분석 오류이며, 계속한다.

    3. sizeauto이고, img가 null이 아니며, img렌더링 중이고, img자동 크기를 허용하면 sizeimg의 구체적 객체 크기 너비로 설정하며, 단위는 CSS 픽셀이다.

      size가 여전히 auto이면 무시된다.

    4. unparsed size 끝의 연속된 모든 <whitespace-token>을 제거한다. 이제 unparsed size가 비어 있으면:

      1. 이 항목이 unparsed sizes list의 마지막 항목이 아니었다면 구문 분석 오류이다.

      2. sizeauto가 아니면 size를 반환한다. 그렇지 않으면 계속한다.

    5. unparsed size에 남아 있는 구성 요소 값<media-condition>으로 구문 분석한다. 올바르게 구문 분석되지 않거나, 올바르게 구문 분석되었지만 <media-condition>이 false로 평가되면 계속한다. [MQ]

    6. sizeauto가 아니면 size를 반환한다. 그렇지 않으면 계속한다.

  4. 100vw를 반환한다.

<media-condition>이 함께하지 않는 <length>인 단독 <source-size-value><source-size-list>의 마지막 항목이 아닌 항목으로 사용하는 것은 유효하지 않다. 그러나 구문 분석 알고리즘은 <source-size-list>의 어느 위치에서든 이를 허용하며, 목록의 이전 항목이 사용되지 않았다면 즉시 크기로 받아들인다. 이는 향후 확장을 가능하게 하고 마지막에 쉼표를 추가하는 것과 같은 단순한 작성자 오류로부터 보호하기 위함이다. 단독 auto 키워드 뒤에는 레거시 사용자 에이전트에 대한 대체 항목을 제공하기 위해 다른 항목이 올 수 있다.

4.8.4.3.12 소스 밀도 정규화

이미지 소스에는 URL과 함께 픽셀 밀도 설명자, 너비 설명자 또는 설명자가 전혀 없을 수 있다. 소스 집합을 정규화하면 모든 이미지 소스픽셀 밀도 설명자가 부여된다.

소스 집합 source set소스 밀도를 정규화하라는 요청을 받으면 사용자 에이전트는 다음을 수행해야 한다:

  1. source sizesource set소스 크기로 둔다.

  2. source set의 각 이미지 소스에 대해:

    1. 이미지 소스픽셀 밀도 설명자가 있으면 다음 이미지 소스계속한다.

    2. 그렇지 않고 이미지 소스너비 설명자가 있으면 너비 설명자너비 설명자 값source size로 나눈 x 단위를 가진 픽셀 밀도 설명자로 대체한다.

      소스 크기가 0이면 밀도는 무한대가 되며, 그 결과 자연 치수는 0×0이 된다.

    3. 그렇지 않으면 이미지 소스1x픽셀 밀도 설명자를 부여한다.

4.8.4.3.13 환경 변화에 반응하기

사용자 에이전트는 환경 변화에 반응하기 위해 언제든지 다음 알고리즘을 실행하여 img 요소의 이미지를 업데이트할 수 있다. (사용자 에이전트는 이 알고리즘을 실행할 필요가 없다. 예를 들어 사용자가 더 이상 페이지를 보고 있지 않으면 그동안 환경이 다시 변경될 경우를 고려하여 어떤 이미지를 사용할지 결정하기 전에 사용자가 페이지로 돌아올 때까지 기다릴 수 있다.)

특히 사용자가 뷰포트의 크기를 변경할 때(예: 창 크기를 조정하거나 페이지 확대/축소를 변경할 때), 그리고 img 요소가 문서에 삽입될 때 사용자 에이전트가 이 알고리즘을 실행하는 것이 권장된다. 그러면 밀도 보정 자연 너비와 높이가 새 뷰포트와 일치하고, 아트 디렉션이 관련될 때 올바른 이미지가 선택된다.

  1. 안정 상태를 기다린다. 동기 구간은 알고리즘에서 동기 구간이 종료되었다고 할 때까지 이 알고리즘의 남은 모든 단계로 구성된다. (동기 구간의 단계에는 ⌛ 표시가 있다.)

  2. img 요소가 srcset 또는 picture를 사용하지 않고, 그 노드 문서완전히 활성 상태가 아니거나, 리소스 유형이 multipart/x-mixed-replace인 이미지 데이터가 있거나, 그 대기 중인 요청이 null이 아니면 반환한다.

  3. selected sourceselected pixel density를 각각 이미지 소스를 선택한 결과인 URL과 픽셀 밀도로 둔다.

  4. selected source가 null이면 반환한다.

  5. selected sourceselected pixel density가 각각 요소의 마지막으로 선택된 소스현재 픽셀 밀도와 같으면 반환한다.

  6. urlStringselected source와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 둔다.

  7. urlString이 실패이면 반환한다.

  8. corsAttributeState를 요소의 crossorigin 콘텐츠 속성의 상태로 둔다.

  9. originimg 요소의 노드 문서출처로 둔다.

  10. clientimg 요소의 노드 문서관련 설정 객체로 둔다.

  11. keyurlString, corsAttributeState, 그리고 corsAttributeStateCORS 없음이 아닌 경우 origin으로 구성된 튜플로 둔다.

  12. image request현재 URLurlString인 새로운 이미지 요청으로 둔다.

  13. ⌛ 요소의 대기 중인 요청image request로 설정한다.

  14. 동기 구간을 종료하고 남은 단계를 병렬로 계속한다.

  15. 사용 가능한 이미지 목록key에 대한 항목이 있으면 image request이미지 데이터를 해당 항목의 이미지 데이터로 설정한다. 다음 단계로 계속한다.

    그렇지 않으면:

    1. requesturlString, "image", corsAttributeState가 주어졌을 때 잠재적 CORS 요청을 생성한 결과로 둔다.

    2. request클라이언트client로 설정하고, request개시자를 "imageset"으로 설정하며, request동기 플래그를 설정한다.

    3. request리퍼러 정책을 요소의 referrerpolicy 속성의 현재 상태로 설정한다.

    4. request우선순위를 요소의 fetchpriority 속성의 현재 상태로 설정한다.

    5. responserequest가져온 결과로 둔다.

    6. response안전하지 않은 응답네트워크 오류이거나, 이미지 형식이 지원되지 않거나(앞에서 언급한 대로 이미지 스니핑 규칙을 적용하여 결정), 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있거나, 리소스 유형이 multipart/x-mixed-replace이면 대기 중인 요청을 null로 설정하고 이 단계를 중단한다.

    7. 그렇지 않으면 response안전하지 않은 응답image request이미지 데이터이다. 이는 CORS 동일 출처 또는 CORS 교차 출처일 수 있으며, 이는 이미지가 다른 API와 상호작용하는 방식에 영향을 준다(예: canvas에서 사용될 때).

  16. img 요소와 다음 단계가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 넣는다:

    1. img 요소가 이 알고리즘이 시작된 이후 관련 변이를 겪었으면 대기 중인 요청을 null로 설정하고 이 단계를 중단한다.

    2. img 요소의 마지막으로 선택된 소스selected source로 설정하고, img 요소의 현재 픽셀 밀도selected pixel density로 설정한다.

    3. image request상태완전히 사용 가능으로 설정한다.

    4. 상위 계층 캐싱 무시 플래그를 설정하여 키 key를 사용해 이미지를 사용 가능한 이미지 목록에 추가한다.

    5. 대기 중인 요청을 현재 요청으로 승격한다.

    6. img 요소가 주어졌을 때 image request를 표시하도록 준비한다.

    7. img 요소에 load라는 이름의 이벤트를 발생시킨다.

4.8.4.4 이미지의 대체물로 사용할 텍스트를 제공하기 위한 요구 사항
4.8.4.4.1 일반 지침

달리 지정된 경우를 제외하고 alt 속성을 지정해야 하며 그 값은 비어 있어서는 안 된다. 그 값은 이미지의 적절한 대체물이어야 한다. alt 속성에 대한 구체적인 요구 사항은 다음 절에서 설명하는 것처럼 이미지가 나타내려는 대상에 따라 달라진다.

대체 텍스트를 작성할 때 고려해야 할 가장 일반적인 규칙은 다음과 같다: 모든 이미지를 해당 alt 속성의 텍스트로 대체해도 페이지의 의미가 바뀌지 않도록 하는 것이 목적이다.

따라서 일반적으로 이미지를 포함할 수 없었다면 무엇을 작성했을지 고려하여 대체 텍스트를 작성할 수 있다.

이에 따른 한 가지 결과는 alt 속성의 값에 이미지의 캡션, 제목 또는 범례로 간주될 수 있는 텍스트를 절대로 포함해서는 안 된다는 것이다. 이 속성은 사용자가 이미지 대신 사용할 수 있는 대체 텍스트를 포함해야 하며 이미지를 보충하기 위한 것이 아니다. title 속성은 보충 정보에 사용할 수 있다.

또 다른 결과는 alt 속성의 값이 이미지 옆의 산문에 이미 제공된 정보를 반복해서는 안 된다는 것이다.

대체 텍스트를 생각하는 한 가지 방법은 이미지가 있다는 사실을 언급하지 않고 해당 이미지가 포함된 페이지를 전화로 누군가에게 어떻게 읽어 줄지 생각하는 것이다. 이미지 대신 말하는 내용은 일반적으로 대체 텍스트를 작성하기 위한 좋은 출발점이다.

하이퍼링크를 생성하는 a 요소 또는 button 요소에 텍스트 콘텐츠가 없고 하나 이상의 이미지가 포함되어 있으면 alt 속성에는 함께 링크 또는 버튼의 목적을 전달하는 텍스트가 포함되어야 한다.

이 예제에서는 사용자에게 세 가지 색상 목록에서 선호하는 색상을 선택하도록 요청한다. 각 색상은 이미지로 제공되지만 이미지를 표시하지 않도록 사용자 에이전트를 구성한 사용자에게는 색상 이름이 대신 사용된다:

<h1>Pick your color</h1>
<ul>
 <li><a href="green.html"><img src="green.jpeg" alt="Green"></a></li>
 <li><a href="blue.html"><img src="blue.jpeg" alt="Blue"></a></li>
 <li><a href="red.html"><img src="red.jpeg" alt="Red"></a></li>
</ul>

이 예제에서는 각 버튼에 사용자가 원하는 색상 출력의 종류를 나타내는 이미지 집합이 있다. 각 경우 첫 번째 이미지를 사용하여 대체 텍스트를 제공한다.

<button name="rgb"><img src="red" alt="RGB"><img src="green" alt=""><img src="blue" alt=""></button>
<button name="cmyk"><img src="cyan" alt="CMYK"><img src="magenta" alt=""><img src="yellow" alt=""><img src="black" alt=""></button>

각 이미지가 텍스트의 한 부분을 나타내므로 다음과 같이 작성할 수도 있다:

<button name="rgb"><img src="red" alt="R"><img src="green" alt="G"><img src="blue" alt="B"></button>
<button name="cmyk"><img src="cyan" alt="C"><img src="magenta" alt="M"><img src="yellow" alt="Y"><img src="black" alt="K"></button>

그러나 다른 대체 텍스트에서는 이 방식이 적합하지 않을 수 있으며 각 경우 모든 대체 텍스트를 하나의 이미지에 넣는 것이 더 타당할 수 있다:

<button name="rgb"><img src="red" alt="sRGB profile"><img src="green" alt=""><img src="blue" alt=""></button>
<button name="cmyk"><img src="cyan" alt="CMYK profile"><img src="magenta" alt=""><img src="yellow" alt=""><img src="black" alt=""></button>
4.8.4.4.3 대체 그래픽 표현이 있는 구 또는 문단: 차트, 다이어그램, 그래프, 지도, 삽화

때로는 어떤 내용을 순서도, 다이어그램, 그래프 또는 길 안내를 보여 주는 간단한 지도와 같은 그래픽 형태로 더 명확하게 표현할 수 있다. 이러한 경우 img 요소를 사용하여 이미지를 제공할 수 있지만, 이미지를 볼 수 없는 사용자(예: 연결이 매우 느리거나, 텍스트 전용 브라우저를 사용하거나, 핸즈프리 자동차 음성 웹 브라우저가 페이지를 읽어 주는 내용을 듣고 있거나, 단순히 시각 장애가 있는 사용자)도 전달되는 메시지를 이해할 수 있도록 덜 효과적인 텍스트 버전도 여전히 제공해야 한다.

텍스트는 alt 속성에 제공해야 하며 src 속성에 지정된 이미지와 동일한 메시지를 전달해야 한다.

대체 텍스트는 이미지의 설명이 아니라 이미지의 대체물이라는 점을 이해하는 것이 중요하다.

다음 예제에는 이미지 형태의 순서도가 있으며, alt 속성의 텍스트는 순서도를 산문 형태로 바꾸어 표현한다:

<p>In the common case, the data handled by the tokenization stage
comes from the network, but it can also come from script.</p>
<p><img src="images/parsing-model-overview.svg" alt="The Network
passes data to the Input Stream Preprocessor, which passes it to the
Tokenizer, which passes it to the Tree Construction stage. From there,
data goes to both the DOM and to Script Execution. Script Execution is
linked to the DOM, and, using document.write(), passes data to the
Tokenizer."></p>

다음은 설명에 이미지를 포함하는 문제에 대한 좋은 해결책과 나쁜 해결책을 보여 주는 또 다른 예제이다.

먼저 좋은 해결책이다. 이 예제는 이미지가 애초에 존재하지 않았다면 산문에 넣었을 내용을 대체 텍스트로 그대로 사용해야 함을 보여 준다.

<!-- This is the correct way to do things. -->
<p>
 You are standing in an open field west of a house.
 <img src="house.jpeg" alt="The house is white, with a boarded front door.">
 There is a small mailbox here.
</p>

두 번째는 나쁜 해결책이다. 이 잘못된 방식에서는 대체 텍스트가 이미지의 텍스트 대체물이 아니라 단순히 이미지의 설명이다. 이미지가 표시되지 않을 때 텍스트의 흐름이 첫 번째 예제만큼 자연스럽지 않으므로 좋지 않다.

<!-- This is the wrong way to do things. -->
<p>
 You are standing in an open field west of a house.
 <img src="house.jpeg" alt="A white house, with a boarded front door.">
 There is a small mailbox here.
</p>

"판자로 막힌 문이 있는 흰색 주택의 사진"과 같은 텍스트도 마찬가지로 나쁜 대체 텍스트이다 (다만 이 이미지가 있는 figurefigcaption 요소나 title 속성에는 적합할 수 있다).

4.8.4.4.4 대체 그래픽 표현이 있는 짧은 구 또는 레이블: 아이콘, 로고

문서에는 아이콘 형태의 정보가 포함될 수 있다. 아이콘은 시각적 브라우저 사용자가 기능을 한눈에 알아볼 수 있도록 돕기 위한 것이다.

어떤 경우에는 아이콘이 같은 의미를 전달하는 텍스트 레이블을 보충한다. 이러한 경우 alt 속성이 존재해야 하지만 비어 있어야 한다.

여기서 아이콘은 같은 의미를 전달하는 텍스트 옆에 있으므로 빈 alt 속성을 가진다:

<nav>
 <p><a href="/help/"><img src="/icons/help.png" alt=""> Help</a></p>
 <p><a href="/configure/"><img src="/icons/configuration.png" alt="">
 Configuration Tools</a></p>
</nav>

다른 경우에는 아이콘 옆에 그 의미를 설명하는 텍스트가 없으며 아이콘 자체로 의미가 명확해야 한다. 이러한 경우 동등한 텍스트 레이블을 alt 속성에 제공해야 한다.

여기서는 뉴스 사이트의 게시물에 주제를 나타내는 아이콘으로 레이블을 지정한다.

<body>
 <article>
  <header>
   <h1>Ratatouille wins <i>Best Movie of the Year</i> award</h1>
   <p><img src="movies.png" alt="Movies"></p>
  </header>
  <p>Pixar has won yet another <i>Best Movie of the Year</i> award,
  making this its 8th win in the last 12 years.</p>
 </article>
 <article>
  <header>
   <h1>Latest TWiT episode is online</h1>
   <p><img src="podcasts.png" alt="Podcasts"></p>
  </header>
  <p>The latest TWiT episode has been posted, in which we hear
  several tech news stories as well as learning much more about the
  iPhone. This week, the panelists compare how reflective their
  iPhones' Apple logos are.</p>
 </article>
</body>

많은 페이지에는 회사, 조직, 프로젝트, 밴드, 소프트웨어 패키지, 국가 등 특정 대상을 나타내는 로고, 휘장, 깃발 또는 문장이 포함된다.

로고가 페이지 제목 등에서 대상을 나타내기 위해 사용되면 alt 속성에는 로고가 나타내는 대상의 이름이 포함되어야 한다. alt 속성에는 "로고"라는 단어와 같은 텍스트가 포함되어서는 안 된다. 전달되는 것은 로고라는 사실이 아니라 대상 자체이기 때문이다.

로고가 나타내는 대상의 이름 옆에 사용되면 로고는 보충적인 것이므로 alt 속성은 비어 있어야 한다.

로고가 단순한 장식 자료로 사용되는 경우(브랜딩 또는 로고가 속한 대상을 언급하는 기사 옆의 이미지 등) 아래의 순수 장식 이미지에 관한 항목이 적용된다. 실제로 로고 자체를 논의하는 경우에는 대체 그래픽 표현 (로고 자체)이 있는 구 또는 문단(로고에 대한 설명)으로 사용되는 것이므로 위의 첫 번째 항목이 적용된다.

다음 코드 조각에는 위의 네 가지 경우가 모두 나타난다. 먼저 회사를 나타내기 위해 사용되는 로고를 볼 수 있다:

<h1><img src="XYZ.gif" alt="The XYZ company"></h1>

다음으로 회사 이름 바로 옆에 로고를 사용하는 문단을 볼 수 있으며 따라서 대체 텍스트가 없다:

<article>
 <h2>News</h2>
 <p>We have recently been looking at buying the <img src="alpha.gif"
 alt=""> ΑΒΓ company, a small Greek company
 specializing in our type of product.</p>

세 번째 코드 조각에서는 인수에 관해 논의하는 더 큰 기사의 일부로 로고가 별도 콘텐츠에서 사용된다:

<aside><p><img src="alpha-large.gif" alt=""></p></aside>
 <p>The ΑΒΓ company has had a good quarter, and our
 pie chart studies of their accounts suggest a much bigger blue slice
 than its green and orange slices, which is always a good sign.</p>
</article>

마지막으로 로고에 관해 이야기하는 의견 기사가 있으므로 로고는 대체 텍스트에서 자세히 설명된다.

<p>Consider for a moment their logo:</p>

<p><img src="/images/logo" alt="It consists of a green circle with a
green question mark centered inside it."></p>

<p>How unoriginal can you get? I mean, oooooh, a question mark, how
<em>revolutionary</em>, how utterly <em>ground-breaking</em>, I'm
sure everyone will rush to adopt those specifications now! They could
at least have tried for some sort of, I don't know, sequence of
rounded squares with varying shades of green and bold white outlines,
at least that would look good on the cover of a blue book.</p>

이 예제는 이미지가 사용 가능하지 않아 텍스트가 대신 사용되는 경우에도 이미지가 처음부터 없었던 것처럼 텍스트가 주변 텍스트에 자연스럽게 이어지도록 대체 텍스트를 작성해야 함을 보여 준다.

4.8.4.4.5 타이포그래피 효과를 위해 그래픽으로 렌더링된 텍스트

때로는 이미지가 단순히 텍스트로 구성되며 이미지의 목적은 텍스트를 렌더링하는 데 사용된 실제 타이포그래피 효과를 강조하는 것이 아니라 텍스트 자체를 전달하는 것이다.

이러한 경우 alt 속성이 존재해야 하며 이미지 자체에 작성된 것과 동일한 텍스트로 구성되어야 한다.

글자가 모두 꽃과 식물로 장식되어 있지만 "Earth Day"라는 텍스트가 포함된 그래픽을 생각해 보자. 텍스트가 단순히 제목으로 사용되어 그래픽 사용자에게 페이지를 꾸미기 위한 것이라면 올바른 대체 텍스트는 동일한 "Earth Day"이며 장식에 관해서는 언급할 필요가 없다:

<h1><img src="earthdayheading.png" alt="Earth Day"></h1>

채색 필사본은 일부 문자에 그래픽을 사용할 수 있다. 이러한 상황에서 대체 텍스트는 이미지가 나타내는 문자 자체이다.

<p><img src="initials/o.svg" alt="O">nce upon a time and a long long time ago, late at
night, when it was dark, over the hills, through the woods, across a great ocean, in a land far
away, in a small house, on a hill, under a full moon...

가이지, 이타이지 또는 새로운 통화 기호와 같은 새 문자처럼 Unicode로 나타낼 수 없는 문자를 이미지로 나타낼 때 대체 텍스트는 같은 내용을 작성하는 더 일반적인 방법이어야 한다. 예를 들어 음성적 히라가나나 가타카나를 사용하여 문자의 발음을 제공할 수 있다.

1997년의 이 예제에서는 가운데 가로줄이 하나가 아니라 두 개인 굽은 E처럼 보이는 새로운 통화 기호를 이미지로 나타낸다. 대체 텍스트는 문자의 발음을 제공한다.

<p>Only <img src="euro.png" alt="euro ">5.99!

문자가 동일한 목적을 수행할 수 있다면 이미지를 사용해서는 안 된다. 장식 때문에 또는 적절한 문자가 없기 때문에(가이지의 경우처럼) 텍스트를 직접 나타낼 수 없는 경우에만 이미지가 적절하다.

작성자가 기본 시스템 글꼴이 특정 문자를 지원하지 않기 때문에 이미지를 사용하고 싶다면 이미지보다 웹 글꼴이 더 나은 해결책이다.

4.8.4.4.6 주변 텍스트 일부의 그래픽 표현

많은 경우 이미지는 실제로 단지 보충적인 것이며 그 존재는 주변 텍스트를 강화할 뿐이다. 이러한 경우 alt 속성이 존재해야 하지만 그 값은 빈 문자열이어야 한다.

일반적으로 이미지를 제거해도 페이지의 유용성이 줄어들지 않지만 이미지를 포함하면 시각적 브라우저 사용자가 개념을 훨씬 쉽게 이해할 수 있는 경우 이미지가 이 범주에 속한다.

앞의 문단을 그래픽 형태로 반복하는 순서도:

<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<p><img src="images/parsing-model-overview.svg" alt=""></p>

이러한 경우 단순히 캡션으로 구성된 대체 텍스트를 포함하는 것은 잘못이다. 캡션을 포함하려면 title 속성을 사용하거나 figurefigcaption 요소를 사용할 수 있다. 후자의 경우 이미지는 실제로 대체 그래픽 표현이 있는 구 또는 문단이므로 대체 텍스트가 필요하다.

<!-- Using the title="" attribute -->
<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<p><img src="images/parsing-model-overview.svg" alt=""
        title="Flowchart representation of the parsing model."></p>
<!-- Using <figure> and <figcaption> -->
<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<figure>
 <img src="images/parsing-model-overview.svg" alt="The Network leads to
 the Input Stream Preprocessor, which leads to the Tokenizer, which
 leads to the Tree Construction stage. The Tree Construction stage
 leads to two items. The first is Script Execution, which leads via
 document.write() back to the Tokenizer. The second item from which
 Tree Construction leads is the DOM. The DOM is related to the Script
 Execution.">
 <figcaption>Flowchart representation of the parsing model.</figcaption>
</figure>
<!-- This is WRONG. Do not do this. Instead, do what the above examples do. -->
<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<p><img src="images/parsing-model-overview.svg"
        alt="Flowchart representation of the parsing model."></p>
<!-- Never put the image's caption in the alt="" attribute! -->

앞의 문단을 그래픽 형태로 반복하는 그래프:

<p>According to a study covering several billion pages,
about 62% of documents on the web in 2007 triggered the Quirks
rendering mode of web browsers, about 30% triggered the Almost
Standards mode, and about 9% triggered the Standards mode.</p>
<p><img src="rendering-mode-pie-chart.png" alt=""></p>
4.8.4.4.7 부수적 이미지

때로는 이미지가 콘텐츠에 필수적이지 않지만 순수한 장식도 아니며 텍스트와 완전히 중복되지도 않는다. 이러한 경우 alt 속성이 존재해야 하며 그 값은 빈 문자열 또는 이미지가 전달하는 정보의 텍스트 표현이어야 한다. 이미지의 제목을 제공하는 캡션이 있으면 alt 속성의 값은 비어 있어서는 안 된다(그렇게 하면 비시각적 독자가 상당히 혼란스러울 수 있다).

정치 인물에 관한 뉴스 기사에서 해당 인물의 얼굴이 이미지로 표시되는 경우를 생각해 보자. 이미지는 기사와 관련이 있으므로 순수한 장식이 아니다. 정치인의 외모를 보여 주므로 기사와 완전히 중복되지도 않는다. 대체 텍스트를 제공할 필요가 있는지는 이미지가 산문의 해석에 영향을 미치는지에 따라 작성자가 결정한다.

이 첫 번째 변형에서는 이미지가 맥락 없이 표시되며 대체 텍스트가 제공되지 않는다:

<p><img src="president.jpeg" alt=""> Ahead of today's referendum,
the President wrote an open letter to all registered voters. In it, she admitted that the country was
divided.</p>

사진이 단순한 얼굴이라면 이를 설명하는 데 가치가 없을 수 있다. 해당 인물이 붉은 머리인지 금발인지, 피부가 흰색인지 검은색인지, 눈이 하나인지 두 개인지는 독자에게 중요하지 않다.

그러나 사진이 정치인이 화가 났거나, 특히 행복하거나, 절망한 모습처럼 더 역동적이라면 기사의 분위기를 설정하는 데 대체 텍스트가 유용하다. 그렇지 않으면 그 분위기를 놓칠 수 있다:

<p><img src="president.jpeg" alt="The President is sad.">
Ahead of today's referendum, the President wrote an open letter to all
registered voters. In it, she admitted that the country was divided.
</p>
<p><img src="president.jpeg" alt="The President is happy!">
Ahead of today's referendum, the President wrote an open letter to all
registered voters. In it, she admitted that the country was divided.
</p>

인물이 "슬픈지" 또는 "행복한지"는 문단의 나머지를 해석하는 방식에 차이를 만든다. 나라가 분열된 것에 불만이 있다고 말하는 것일 가능성이 큰가, 아니면 분열된 나라의 전망이 자신의 정치 경력에 도움이 된다고 말하는 것인가? 해석은 이미지에 따라 달라진다.

이미지에 캡션이 있으면 대체 텍스트를 포함하여 비시각적 사용자가 캡션이 무엇을 가리키는지 혼란스러워하지 않도록 할 수 있다.

<p>Ahead of today's referendum, the President wrote an open letter to
all registered voters. In it, she admitted that the country was divided.</p>
<figure>
 <img src="president.jpeg"
      alt="A high forehead, cheerful disposition, and dark hair round out the President's face.">
 <figcaption> The President of Ruritania. Photo © 2014 PolitiPhoto. </figcaption>
</figure>
4.8.4.4.8 정보를 추가하지 않는 순수 장식 이미지

이미지가 장식용이지만 특정 페이지에 특별히 한정되지 않는 경우(예: 사이트 전체 디자인 체계의 일부를 구성하는 이미지) 이미지는 문서의 마크업이 아니라 사이트의 CSS에 지정해야 한다.

그러나 주변 텍스트에서 논의되지 않지만 여전히 어느 정도 관련성이 있는 장식 이미지는 img 요소를 사용하여 페이지에 포함할 수 있다. 이러한 이미지는 장식적이지만 여전히 콘텐츠의 일부를 구성한다. 이러한 경우 alt 속성이 존재해야 하지만 그 값은 빈 문자열이어야 한다.

관련성이 있음에도 이미지가 순수 장식인 예로는 Burning Man의 행사에 관한 블로그 게시물에 있는 Black Rock City 풍경 사진이나, 시를 낭송하는 페이지에 있는 그 시에서 영감을 받은 그림 등이 있다. 다음 코드 조각은 후자의 예를 보여 준다(이 코드 조각에는 첫 번째 연만 포함됨):

<h1>The Lady of Shalott</h1>
<p><img src="shalott.jpeg" alt=""></p>
<p>On either side the river lie<br>
Long fields of barley and of rye,<br>
That clothe the wold and meet the sky;<br>
And through the field the road run by<br>
To many-tower'd Camelot;<br>
And up and down the people go,<br>
Gazing where the lilies blow<br>
Round an island there below,<br>
The island of Shalott.</p>

그림을 더 작은 이미지 파일로 나눈 다음 다시 완전한 그림을 구성하도록 함께 표시하는 경우, 이미지 중 하나의 alt 속성을 그림 전체에 적합한 관련 규칙에 따라 설정해야 하며, 나머지 모든 이미지의 alt 속성은 빈 문자열로 설정해야 한다.

다음 예제에서는 XYZ Corp의 회사 로고를 나타내는 그림을 두 조각으로 나누었으며, 첫 번째 조각에는 "XYZ"라는 글자가, 두 번째 조각에는 "Corp"라는 단어가 들어 있다. 대체 텍스트("XYZ Corp")는 모두 첫 번째 이미지에 있다.

<h1><img src="logo1.png" alt="XYZ Corp"><img src="logo2.png" alt=""></h1>

다음 예제에서는 채워진 별 세 개와 빈 별 두 개로 평점이 표시된다. 대체 텍스트를 "★★★☆☆"로 할 수도 있었지만 작성자는 대신 "5점 만점에 3점" 형식으로 평점을 제공하는 것이 더 유용하다고 결정했다. 이것이 첫 번째 이미지의 대체 텍스트이며 나머지는 빈 대체 텍스트를 가진다.

<p>Rating: <meter max=5 value=3><img src="1" alt="3 out of 5"
  ><img src="1" alt=""><img src="1" alt=""><img src="0" alt=""
  ><img src="0" alt=""></meter></p>

일반적으로 링크를 위해 이미지를 조각내는 대신 이미지 맵을 사용해야 한다.

그러나 실제로 이미지가 조각나 있고 조각난 그림의 구성 요소 중 하나라도 링크의 유일한 콘텐츠라면 링크마다 이미지 하나의 alt 속성에 링크의 목적을 나타내는 대체 텍스트가 있어야 한다.

다음 예제에서는 날아다니는 스파게티 괴물의 문장을 나타내는 그림에서 왼쪽의 면발 모양 부속지와 오른쪽의 면발 모양 부속지가 서로 다른 이미지에 있으므로 사용자가 모험에서 왼쪽 또는 오른쪽을 선택할 수 있다.

<h1>The Church</h1>
<p>You come across a flying spaghetti monster. Which side of His
Noodliness do you wish to reach out for?</p>
<p><a href="?go=left" ><img src="fsm-left.png"  alt="Left side. "></a
  ><img src="fsm-middle.png" alt=""
  ><a href="?go=right"><img src="fsm-right.png" alt="Right side."></a></p>
4.8.4.4.11 콘텐츠의 핵심 부분

어떤 경우에는 이미지가 콘텐츠의 핵심 부분이다. 예를 들어 사진 갤러리의 일부인 페이지가 이에 해당할 수 있다. 이미지는 이를 포함하는 페이지의 전체 핵심이다.

콘텐츠의 핵심 부분인 이미지에 대체 텍스트를 제공하는 방법은 이미지의 출처에 따라 달라진다.

일반적인 경우

자세한 대체 텍스트를 제공할 수 있는 경우, 예를 들어 이미지가 잡지 리뷰의 스크린샷 시리즈 일부이거나, 만화의 일부이거나, 해당 사진을 다루는 블로그 글의 사진인 경우 이미지의 대체물로 사용할 수 있는 텍스트를 alt 속성의 콘텐츠로 제공해야 한다.

새 OS의 스크린샷 갤러리에 있는 대체 텍스트가 포함된 스크린샷:

<figure>
 <img src="KDE%20Light%20desktop.png"
      alt="The desktop is blue, with icons along the left hand side in
           two columns, reading System, Home, K-Mail, etc. A window is
           open showing that menus wrap to a second line if they
           cannot fit in the window. The window has a list of icons
           along the top, with an address bar below it, a list of
           icons for tabs along the left edge, a status bar on the
           bottom, and two panes in the middle. The desktop has a bar
           at the bottom of the screen with a few buttons, a pager, a
           list of open applications, and a clock.">
 <figcaption>Screenshot of a KDE desktop.</figcaption>
</figure>

재무 보고서의 그래프:

<img src="sales.gif"
     title="Sales graph"
     alt="From 1998 to 2005, sales increased by the following percentages
     with each year: 624%, 75%, 138%, 40%, 35%, 9%, 21%">

"판매 그래프"는 판매 그래프의 대체 텍스트로 충분하지 않다는 점에 유의한다. 좋은 캡션이 될 텍스트가 일반적으로 대체 텍스트로 적합한 것은 아니다.

완전한 설명이 불가능한 이미지

어떤 경우에는 이미지의 특성상 철저한 대체 텍스트를 제공하는 것이 비현실적일 수 있다. 예를 들어 이미지가 불분명하거나, 복잡한 프랙탈이거나, 상세한 지형도일 수 있다.

이러한 경우 alt 속성에는 적절한 대체 텍스트가 어느 정도 포함되어야 하지만 다소 간략할 수 있다.

때로는 이미지의 가치를 제대로 전달할 수 있는 텍스트가 전혀 없다. 예를 들어 로르샤흐 잉크 얼룩 검사를 유용하게 설명할 수 있는 내용은 거의 없다. 그러나 설명이 간략하더라도 아무것도 없는 것보다는 낫다:

<figure>
 <img src="/commons/a/a7/Rorschach1.jpg" alt="A shape with left-right
 symmetry with indistinct edges, with a small gap in the center, two
 larger gaps offset slightly from the center, with two similar gaps
 under them. The outline is wider in the top half than the bottom
 half, with the sides extending upwards higher than the center, and
 the center extending below the sides.">
 <figcaption>A black outline of the first of the ten cards
 in the Rorschach inkblot test.</figcaption>
</figure>

다음은 대체 텍스트를 매우 잘못 사용한 예이다:

<!-- This example is wrong. Do not copy it. -->
<figure>
 <img src="/commons/a/a7/Rorschach1.jpg" alt="A black outline
 of the first of the ten cards in the Rorschach inkblot test.">
 <figcaption>A black outline of the first of the ten cards
 in the Rorschach inkblot test.</figcaption>
</figure>

이처럼 대체 텍스트에 캡션을 포함하는 것은 이미지가 없는 사용자에게 캡션을 사실상 중복해서 제공하여 두 번 조롱할 뿐, 캡션을 한 번 읽거나 들었을 때보다 더 도움을 주지 않으므로 유용하지 않다.

완전한 설명이 불가능한 이미지의 또 다른 예는 정의상 세부 사항이 무한한 프랙탈이다.

다음 예제는 만델브로 집합 이미지의 전체 보기에 대체 텍스트를 제공하는 한 가지 가능한 방법을 보여 준다.

<img src="ms1.jpeg" alt="The Mandelbrot set appears as a cardioid with
its cusp on the real axis in the positive direction, with a smaller
bulb aligned along the same center line, touching it in the negative
direction, and with these two shapes being surrounded by smaller bulbs
of various sizes.">

마찬가지로 예를 들어 전기에 포함된 사람 얼굴 사진은 콘텐츠와 상당히 관련 있고 핵심적인 것으로 간주될 수 있지만 텍스트로 완전히 대체하기는 어려울 수 있다:

<section class="bio">
 <h1>A Biography of Isaac Asimov</h1>
 <p>Born <b>Isaak Yudovich Ozimov</b> in 1920, Isaac was a prolific author.</p>
 <p><img src="headpics/asimov.jpeg" alt="Isaac Asimov had dark hair, a tall forehead, and wore glasses.
 Later in life, he wore long white sideburns."></p>
 <p>Asimov was born in Russia, and moved to the US when he was three years old.</p>
 <p>...</p>
</section>

이러한 경우 대체 텍스트에 이미지 자체가 존재한다는 언급을 포함하는 것은 필요하지 않으며 실제로 권장되지 않는다. 그러한 텍스트는 브라우저 자체가 이미지의 존재를 알리는 것과 중복되기 때문이다. 예를 들어 대체 텍스트가 "아이작 아시모프의 사진"이면 준수하는 사용자 에이전트는 더 유용한 "(이미지) 아이작 아시모프는 검은 머리와 높은 이마를 가졌고 안경을 썼다..." 대신 "(이미지) 아이작 아시모프의 사진"으로 읽을 수 있다.

콘텐츠를 알 수 없는 이미지

안타깝게도 어떤 경우에는 전혀 이용 가능한 대체 텍스트가 없을 수 있다. 이미지가 관련 대체 텍스트 없이 자동화된 방식으로 얻어졌거나 (예: 웹캠), 사용자가 적합하거나 사용할 수 있는 대체 텍스트를 제공하지 않은 사용자 제공 이미지를 사용하는 스크립트로 페이지가 생성되거나(예: 사진 공유 사이트), 작성자 자신도 이미지가 무엇을 나타내는지 알지 못하기 때문일 수 있다(예: 시각 장애가 있는 사진작가가 블로그에 이미지를 공유하는 경우).

이러한 경우 alt 속성을 생략할 수 있지만 다음 조건 중 하나도 충족해야 한다:

이러한 경우는 절대적인 최소한으로 유지해야 한다. 작성자가 실제 대체 텍스트를 제공할 수 있을 가능성이 조금이라도 있다면 alt 속성을 생략하는 것은 허용되지 않는다.

사진 공유 사이트가 캡션 외에는 메타데이터가 없는 이미지를 받은 경우 해당 사진을 다음과 같이 마크업할 수 있다:

<figure>
 <img src="1100670787_6a7c664aef.jpg">
 <figcaption>Bubbles traveled everywhere with us.</figcaption>
</figure>

그러나 사용자에게서 이미지의 중요한 부분에 대한 자세한 설명을 얻어 페이지에 포함하는 것이 더 좋다.

시각 장애가 있는 사용자가 촬영한 사진을 보여 주는 블로그이다. 처음에는 사용자가 자신이 찍은 사진에 무엇이 나타나는지 전혀 알지 못할 수 있다:

<article>
 <h1>I took a photo</h1>
 <p>I went out today and took a photo!</p>
 <figure>
  <img src="photo2.jpeg">
  <figcaption>A photograph taken blindly from my front porch.</figcaption>
 </figure>
</article>

하지만 결국 사용자는 친구에게서 이미지에 대한 설명을 얻고 대체 텍스트를 포함할 수 있다:

<article>
 <h1>I took a photo</h1>
 <p>I went out today and took a photo!</p>
 <figure>
  <img src="photo2.jpeg" alt="The photograph shows my squirrel
  feeder hanging from the edge of my roof. It is half full, but there
  are no squirrels around. In the background, out-of-focus trees fill the
  shot. The feeder is made of wood with a metal grate, and it contains
  peanuts. The edge of the roof is wooden too, and is painted white
  with light blue streaks.">
  <figcaption>A photograph taken blindly from my front porch.</figcaption>
 </figure>
</article>

때로는 텍스트 설명을 사용할 수 없고 사용자가 설명을 제공해야 한다는 사실 자체가 이미지의 전체 목적이다. 예를 들어 CAPTCHA 이미지의 목적은 사용자가 그래픽을 실제로 읽을 수 있는지 확인하는 것이다. 다음은 CAPTCHA를 마크업하는 한 가지 방법이다(title 속성에 유의한다):

<p><label>What does this image say?
<img src="captcha.cgi?id=8934" title="CAPTCHA">
<input type=text name=captcha></label>
(If you cannot see the image, you can use an <a
href="?audio">audio</a> test instead.)</p>

또 다른 예로는 올바른 대체 텍스트가 있는 페이지를 작성하려는 바로 그 목적으로 이미지를 표시하고 대체 텍스트를 요청하는 소프트웨어가 있다. 이러한 페이지에는 다음과 같은 이미지 표가 있을 수 있다:

<table>
 <thead>
  <tr> <th> Image <th> Description
 <tbody>
  <tr>
   <td> <img src="2421.png" title="Image 640 by 100, filename 'banner.gif'">
   <td> <input name="alt2421">
  <tr>
   <td> <img src="2422.png" title="Image 200 by 480, filename 'ad3.gif'">
   <td> <input name="alt2422">
</table>

이 예제에서도 가능한 한 많은 유용한 정보가 여전히 title 속성에 포함된다는 점에 유의한다.

일부 사용자는 이미지를 전혀 사용할 수 없으므로(예: 연결이 매우 느리거나, 텍스트 전용 브라우저를 사용하거나, 핸즈프리 자동차 음성 웹 브라우저가 읽어 주는 페이지를 듣고 있거나, 단순히 시각 장애가 있기 때문에), 위 예제처럼 대체 텍스트가 없고 제공할 수도 없는 경우에만 alt 속성을 대체 텍스트와 함께 제공하지 않고 생략할 수 있다. 작성자가 노력을 기울이지 않았다는 것은 alt 속성을 생략할 수 있는 허용 가능한 이유가 아니다.

4.8.4.4.12 사용자를 위한 것이 아닌 이미지

일반적으로 작성자는 이미지를 표시하는 것 이외의 목적으로 img 요소를 사용하는 것을 피해야 한다.

img 요소가 페이지 조회 수를 계산하는 서비스의 일부와 같이 이미지를 표시하는 것 이외의 목적으로 사용되는 경우 alt 속성은 빈 문자열이어야 한다.

이러한 경우 widthheight 속성을 모두 0으로 설정해야 한다.

4.8.4.4.13 이미지를 볼 수 있다고 알려진 특정인을 위한 이메일 또는 비공개 문서의 이미지

이 절은 공개적으로 접근 가능한 문서 또는 웹사이트의 문서, 공개 메일링 리스트로 전송된 이메일, 소프트웨어 문서처럼 대상 독자를 작성자가 반드시 개인적으로 알지 못하는 문서에는 적용되지 않는다.

이미지를 볼 수 있다고 알려진 특정인을 대상으로 하는 비공개 통신 (예: HTML 이메일)에 이미지가 포함된 경우 alt 속성을 생략할 수 있다. 그러나 이러한 경우에도 이미지 종류에 따라 적절한 대체 텍스트(위 항목에서 설명한 대로)를 포함할 것을 작성자에게 강력히 권장한다. 그러면 사용자가 이미지를 지원하지 않는 메일 클라이언트를 사용하거나 문서가 이미지를 쉽게 볼 수 없는 다른 사용자에게 전달되더라도 이메일을 계속 사용할 수 있다.

4.8.4.4.14 마크업 생성기를 위한 지침

마크업 생성기(WYSIWYG 작성 도구 등)는 가능한 모든 경우 사용자에게서 대체 텍스트를 받아야 한다. 그러나 많은 경우 이것이 가능하지 않다는 점은 인정된다.

링크의 유일한 콘텐츠인 이미지의 경우 마크업 생성기는 링크 대상을 검사하여 대상의 제목 또는 대상의 URL을 확인하고 이러한 방식으로 얻은 정보를 대체 텍스트로 사용해야 한다.

캡션이 있는 이미지의 경우 마크업 생성기는 figurefigcaption 요소 또는 title 속성을 사용하여 이미지의 캡션을 제공해야 한다.

최후의 수단으로 구현자는 이미지가 정보를 추가하지 않지만 여전히 주변 콘텐츠에 특화된 순수 장식 이미지라고 가정하여 alt 속성을 빈 문자열로 설정하거나, 이미지가 콘텐츠의 핵심 부분이라고 가정하여 alt 속성을 완전히 생략해야 한다.

마크업 생성기는 대체 텍스트를 얻을 수 없어 alt 속성을 생략한 img 요소에 generator-unable-to-provide-required-alt 속성을 지정할 수 있다. 이 속성의 값은 빈 문자열이어야 한다. 이러한 속성을 포함하는 문서는 준수하지 않지만 적합성 검사기는 이 오류를 조용히 무시한다.

이는 최신 자동화 적합성 검사기가 가짜 대체 텍스트와 올바른 대체 텍스트를 구분할 수 없기 때문에, 마크업 생성기가 alt 속성을 생략하는 오류를 가짜 대체 텍스트를 제공하는 훨씬 더 심각한 오류로 대체하도록 압박받는 일을 방지하기 위한 것이다.

마크업 생성기는 일반적으로 이미지 자체의 파일 이름을 대체 텍스트로 사용하는 것을 피해야 한다. 마찬가지로 마크업 생성기는 프레젠테이션 사용자 에이전트 (예: 웹 브라우저)에도 동일하게 제공될 콘텐츠에서 대체 텍스트를 생성하는 것을 피해야 한다.

이는 페이지가 생성된 뒤에는 일반적으로 업데이트되지 않지만, 나중에 페이지를 읽는 브라우저는 사용자가 업데이트할 수 있으므로 브라우저가 페이지 생성 당시 마크업 생성기보다 더 최신이고 정교하게 조정된 휴리스틱을 가질 가능성이 높기 때문이다.

4.8.4.4.15 적합성 검사기를 위한 지침

적합성 검사기는 아래 나열된 조건 중 하나가 적용되지 않는 한 alt 속성의 부재를 오류로 보고해야 한다:

4.8.5 iframe 요소

Element/iframe

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera15+Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android14+

HTMLIFrameElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLIFrameElement/src

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLObjectElement/width

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLObjectElement/height

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
구문 콘텐츠.
임베디드 콘텐츠.
대화형 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
임베디드 콘텐츠가 예상되는 곳.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
src — 리소스의 주소
srcdociframe에 렌더링할 문서
name콘텐츠 내비게이션 가능 객체의 이름
sandbox — 중첩 콘텐츠에 대한 보안 규칙
allowiframe의 콘텐츠에 적용할 권한 정책
allowfullscreeniframe의 콘텐츠가 requestFullscreen()을 사용하도록 허용할지 여부
width — 가로 치수
height — 세로 치수
referrerpolicy — 요소가 시작한 가져오기에 대한 리퍼러 정책
loading — 로딩 지연을 결정할 때 사용됨
접근성 고려 사항:
작성자용.
구현자용.
정제:
안전하지 않음.
DOM 인터페이스:
[Exposed=Window]
interface HTMLIFrameElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectURL] attribute USVString src;
  [CEReactions] attribute (TrustedHTML or DOMString) srcdoc;
  [CEReactions, Reflect] attribute DOMString name;
  [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList sandbox;
  [CEReactions, Reflect] attribute DOMString allow;
  [CEReactions, Reflect] attribute boolean allowFullscreen;
  [CEReactions, Reflect] attribute DOMString width;
  [CEReactions, Reflect] attribute DOMString height;
  [CEReactions] attribute DOMString referrerPolicy;
  [CEReactions] attribute DOMString loading;
  readonly attribute Document? contentDocument;
  readonly attribute WindowProxy? contentWindow;
  Document? getSVGDocument();

  // also has obsolete members
};

iframe 요소는 자신의 콘텐츠 내비게이션 가능 객체나타낸다.

src 속성은 요소의 콘텐츠 내비게이션 가능 객체가 포함할 페이지의 URL을 제공한다. 속성이 있는 경우 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL이어야 한다. iframe 요소에 itemprop 속성이 지정된 경우 src 속성도 지정해야 한다.

Element/iframe#attr-srcdoc

현재의 모든 엔진에서 지원된다.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android?

srcdoc 속성은 요소의 콘텐츠 내비게이션 가능 객체가 포함할 페이지의 콘텐츠를 제공한다. 속성 값은 구성에 사용되어 iframe srcdoc 문서를 만들며, 이는 URLabout:srcdoc과 일치하는 Document이다.

srcdoc 속성이 있는 경우 그 값은 다음 구문 구성 요소로 이루어진 HTML 구문을 주어진 순서대로 사용해야 한다:

  1. 임의 개수의 주석ASCII 공백.
  2. 선택적으로 DOCTYPE.
  3. 임의 개수의 주석ASCII 공백.
  4. html 요소 형태의 문서 요소.
  5. 임의 개수의 주석ASCII 공백.

위 요구 사항은 XML 문서에도 적용된다.

여기서 블로그는 아래에 설명된 sandbox 속성과 함께 srcdoc 속성을 사용하여, 이 기능을 지원하는 사용자 에이전트의 사용자에게 블로그 게시물 댓글의 스크립트 삽입으로부터 추가 보호 계층을 제공한다:

<article>
 <h1>I got my own magazine!</h1>
 <p>After much effort, I've finally found a publisher, and so now I
 have my own magazine! Isn't that awesome?! The first issue will come
 out in September, and we have articles about getting food, and about
 getting in boxes, it's going to be great!</p>
 <footer>
  <p>Written by <a href="/users/cap">cap</a>, 1 hour ago.
 </footer>
 <article>
  <footer> Thirteen minutes ago, <a href="/users/ch">ch</a> wrote: </footer>
  <iframe sandbox srcdoc="<p>did you get a cover picture yet?"></iframe>
 </article>
 <article>
  <footer> Nine minutes ago, <a href="/users/cap">cap</a> wrote: </footer>
  <iframe sandbox srcdoc="<p>Yeah, you can see it <a href=&quot;/gallery?mode=cover&amp;amp;page=1&quot;>in my gallery</a>."></iframe>
 </article>
 <article>
  <footer> Five minutes ago, <a href="/users/ch">ch</a> wrote: </footer>
  <iframe sandbox srcdoc="<p>hey that's earl's table.
<p>you should get earl&amp;amp;me on the next cover."></iframe>
 </article>

따옴표를 이스케이프해야 하는 방식(그렇지 않으면 srcdoc 속성이 조기에 종료됨)과 샌드박스된 콘텐츠에 언급된 원시 앰퍼샌드(예: URL 또는 산문 안)가 이중으로 이스케이프되어야 하는 방식에 유의한다. 처음에는 srcdoc 속성을 구문 분석할 때 앰퍼샌드를 보존하기 위해 한 번, 그리고 샌드박스된 콘텐츠를 구문 분석할 때 앰퍼샌드가 잘못 해석되는 것을 방지하기 위해 한 번 더 이스케이프한다.

또한 iframe srcdoc 문서에서는 DOCTYPE이 선택 사항이고, html, headbody 요소에는 선택 가능한 시작 및 종료 태그가 있으며, iframe srcdoc 문서에서는 title 요소도 선택 사항이므로, srcdoc 속성의 마크업은 전체 문서를 나타내더라도 비교적 간결할 수 있다. 구문에는 body 요소의 콘텐츠만 문자 그대로 나타나면 되기 때문이다. 다른 요소도 여전히 존재하지만 암시적으로만 존재한다.

HTML 구문에서 작성자는 속성 콘텐츠를 감쌀 때 U+0022 QUOTATION MARK 문자(")를 사용한 뒤 모든 U+0026 AMPERSAND(&) 및 U+0022 QUOTATION MARK(") 문자를 이스케이프하고 sandbox 속성을 지정하면 콘텐츠를 안전하게 임베드할 수 있다는 점만 기억하면 된다. (또한 따옴표보다 앰퍼샌드를 먼저 이스케이프하여 따옴표가 &amp;quot;가 아니라 &quot;가 되도록 해야 한다.)

XML에서는 U+003C LESS-THAN SIGN 문자(<)도 이스케이프해야 한다. 속성 값 정규화를 방지하려면 XML의 일부 공백 문자, 특히 U+0009 CHARACTER TABULATION(tab), U+000A LINE FEED(LF) 및 U+000D CARRIAGE RETURN(CR)도 이스케이프해야 한다. [XML]

src 속성과 srcdoc 속성이 함께 지정된 경우 srcdoc 속성이 우선한다. 이를 통해 작성자는 srcdoc 속성을 지원하지 않는 레거시 사용자 에이전트에 대한 대체 URL을 제공할 수 있다.


insertedNode가 주어졌을 때 iframeHTML 요소 연결 후 단계는 다음과 같다:

  1. insertedNodesandbox 속성이 있으면 속성 값과 insertedNodeiframe 샌드박스 플래그 집합이 주어졌을 때 샌드박스 지시문을 구문 분석한다.

  2. insertedNode에 대해 새로운 자식 내비게이션 가능 객체를 생성한다.

  3. insertedNode에 대해 initialInsertion을 true로 설정하여 iframe 속성을 처리한다.

removedNode가 주어졌을 때 iframeHTML 요소 제거 단계removedNode가 주어졌을 때 자식 내비게이션 가능 객체를 파괴하는 것이다.

이는 unload 이벤트가 발생하지 않은 상태에서 일어난다(요소의 콘텐츠 문서언로드되는 것이 아니라 파괴된다).

위에 따라 iframe섀도 트리 안에 있을 때 처리되지만, 그 동작의 여러 다른 측면은 섀도 트리와 관련하여 명확하게 정의되지 않았다. 자세한 내용은 이슈 #763을 참조한다.

null이 아닌 콘텐츠 내비게이션 가능 객체를 가진 iframe 요소의 srcdoc 속성이 설정, 변경 또는 제거될 때마다 사용자 에이전트는 iframe 속성을 처리해야 한다.

마찬가지로 null이 아닌 콘텐츠 내비게이션 가능 객체를 가지지만 srcdoc 속성이 지정되지 않은 iframe 요소의 src 속성이 설정, 변경 또는 제거될 때마다 사용자 에이전트는 iframe 속성을 처리해야 한다.

요소 element에 대해 선택적 불리언 initialInsertion (기본값 false)과 함께 iframe 속성을 처리하려면:

  1. elementsrcdoc 속성이 지정되어 있으면:

    1. element현재 내비게이션이 지연 로드됨 불리언을 false로 설정한다.

    2. element이 주어졌을 때 요소를 지연 로드할지 결정하는 단계가 true를 반환하면:

      1. element지연 로드 재개 단계srcdoc 리소스로 내비게이션이라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 설정한다.

      2. element현재 내비게이션이 지연 로드됨 불리언을 true로 설정한다.

      3. element에 대해 지연 로딩 요소의 교차 관찰을 시작한다.

      4. 반환한다.

    3. srcdoc 리소스로 내비게이션: element, about:srcdoc, 빈 문자열 및 elementsrcdoc 속성 값이 주어졌을 때 iframe 또는 frame을 내비게이션한다.

      그 결과인 Documentiframe srcdoc 문서로 간주해야 한다.

  2. 그렇지 않으면:

    1. urlelementinitialInsertion이 주어졌을 때 iframeframe 요소의 공유 속성 처리 단계를 실행한 결과로 둔다.

    2. url이 null이면 반환한다.

    3. urlabout:blank과 일치하고 initialInsertion이 true이면:

      1. element이 주어졌을 때 iframe load 이벤트 단계를 실행한다.

      2. 반환한다.

    4. referrerPolicyelementreferrerpolicy 콘텐츠 속성의 현재 상태로 둔다.

    5. element현재 내비게이션이 지연 로드됨 불리언을 false로 설정한다.

    6. element이 주어졌을 때 요소를 지연 로드할지 결정하는 단계가 true를 반환하면:

      1. element지연 로드 재개 단계내비게이션이라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 설정한다.

      2. element현재 내비게이션이 지연 로드됨 불리언을 true로 설정한다.

      3. element에 대해 지연 로딩 요소의 교차 관찰을 시작한다.

      4. 반환한다.

    7. 내비게이션: element, urlreferrerPolicy가 주어졌을 때 iframe 또는 frame을 내비게이션한다.

요소 element와 불리언 initialInsertion이 주어졌을 때 iframeframe 요소의 공유 속성 처리 단계는 다음과 같다:

  1. urlURL 레코드 about:blank로 둔다.

  2. elementsrc 속성이 지정되어 있고 그 값이 빈 문자열이 아니면:

    1. maybeURL을 해당 속성 값과 element노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

    2. maybeURL이 실패가 아니면 urlmaybeURL로 설정한다.

  3. element노드 내비게이션 가능 객체포괄적 조상 내비게이션 가능 객체활성 문서URL프래그먼트 제외를 true로 설정했을 때 url같은 내비게이션 가능 객체가 포함되면 null을 반환한다.

  4. urlabout:blank과 일치하고 initialInsertion이 true이면 element콘텐츠 내비게이션 가능 객체활성 문서url이 주어졌을 때 URL 및 이력 업데이트 단계를 수행한다.

    이는 urlabout:blank?foo와 같은 경우에 필요하다. url이 단순한 about:blank이면 아무 작업도 하지 않는다.

  5. url을 반환한다.

요소 element, URL url, 리퍼러 정책 referrerPolicy, 선택적 문자열 또는 null srcdocString(기본값 null), 선택적 불리언 initialInsertion(기본값 false)이 주어졌을 때 iframe 또는 frame을 내비게이션하려면:

  1. historyHandling을 "auto"로 둔다.

  2. element콘텐츠 내비게이션 가능 객체활성 문서완전히 로드되지 않았으면 historyHandling을 "replace"로 설정한다.

  3. elementiframe이면:

    1. element대기 중인 리소스 타이밍 시작 시간element노드 문서관련 전역 객체가 주어졌을 때 현재 고해상도 시간으로 설정한다.

    2. element대기 중인 리소스 타이밍 URLurl로 설정한다.

  4. element노드 문서를 사용하여 element콘텐츠 내비게이션 가능 객체url내비게이션하며, historyHandlinghistoryHandling로 설정하고, referrerPolicyreferrerPolicy로 설정하며, documentResourcesrcdocString으로 설정하고, initialInsertioninitialInsertion으로 설정한다.

Document에는 iframe 로드 진행 중 플래그와 iframe 로드 음소거 플래그가 있다. Document가 생성될 때 해당 Document에 대해 이 플래그들을 해제해야 한다.

iframe 요소 element이 주어졌을 때 iframe load 이벤트 단계를 실행하려면:

  1. 단언: element콘텐츠 내비게이션 가능 객체는 null이 아니다.

  2. childDocumentelement콘텐츠 내비게이션 가능 객체활성 문서로 둔다.

  3. childDocumentiframe 로드 음소거 플래그가 설정되어 있으면 반환한다.

  4. element대기 중인 리소스 타이밍 시작 시간이 null이 아니면:

    1. 단언: element대기 중인 리소스 타이밍 URL은 null이 아니다.

    2. globalelement노드 문서관련 전역 객체로 둔다.

    3. fallbackTimingInfo시작 시간element대기 중인 리소스 타이밍 시작 시간이고, 응답 종료 시간global이 주어졌을 때 현재 고해상도 시간인 새로운 가져오기 타이밍 정보로 둔다.

    4. fallbackTimingInfo, element대기 중인 리소스 타이밍 URL구문 분석한 결과, "iframe", global, 빈 문자열, 새로운 응답 본문 정보 및 0이 주어졌을 때 리소스 타이밍을 표시한다.

    5. element대기 중인 리소스 타이밍 시작 시간을 null로 설정한다.

    6. element대기 중인 리소스 타이밍 URL을 null로 설정한다.

  5. childDocumentiframe 로드 진행 중 플래그를 설정한다.

  6. elementload라는 이름의 이벤트를 발생시킨다.

  7. childDocumentiframe 로드 진행 중 플래그를 해제한다.

이는 스크립팅과 함께 사용하여 로컬 네트워크 HTTP 서버의 URL 공간을 조사하는 데 사용할 수 있다. 사용자 에이전트는 이 공격을 완화하기 위해 위에 설명된 것보다 더 엄격한 교차 출처 접근 제어 정책을 구현할 수 있지만, 안타깝게도 이러한 정책은 일반적으로 기존 웹 콘텐츠와 호환되지 않는다.

요소 유형이 load 이벤트를 잠재적으로 지연시키는 경우, 해당 유형의 각 요소 element에 대해 element콘텐츠 내비게이션 가능 객체가 null이 아니고 다음 중 하나가 true이면 사용자 에이전트는 element노드 문서load 이벤트를 지연해야 한다:

load 이벤트를 처리하는 동안 element콘텐츠 내비게이션 가능 객체가 다시 내비게이션되면 load 이벤트가 추가로 지연된다.

iframe 요소에는 처음에 false인 현재 내비게이션이 지연 로드됨 불리언이 연결되어 있다. 이 값은 iframe 속성 처리 알고리즘에서 설정되고 해제된다.

현재 내비게이션이 지연 로드됨 불리언이 false인 iframe 요소는 load 이벤트를 잠재적으로 지연시킨다.

iframe 요소에는 처음에 null로 설정되는 연결된 null 또는 DOMHighResTimeStamp 대기 중인 리소스 타이밍 시작 시간이 있다.

iframe 요소에는 처음에 null로 설정되는 연결된 null 또는 URL 대기 중인 리소스 타이밍 URL이 있다.

요소가 생성될 때 srcdoc 속성이 설정되지 않고 src 속성도 설정되지 않았거나 설정되었지만 그 값을 구문 분석할 수 없으면 요소의 콘텐츠 내비게이션 가능 객체초기 about:blank Document에 남는다.

사용자가 이 페이지에서 벗어나도록 내비게이션하면 iframe콘텐츠 내비게이션 가능 객체활성 WindowProxy 객체는 새로운 Document 객체를 위한 새로운 Window 객체를 프록시하지만 src 속성은 변경되지 않는다.


name 속성이 있는 경우 유효한 내비게이션 가능 대상 이름이어야 한다. 주어진 값은 요소의 콘텐츠 내비게이션 가능 객체생성될 때 존재하는 경우 그 이름을 지정하는 데 사용된다.


Element/iframe#attr-sandbox

현재의 모든 엔진에서 지원된다.

Firefox17+Safari5+Chrome4+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

sandbox 속성을 지정하면 iframe이 호스팅하는 모든 콘텐츠에 추가 제한 집합이 적용된다. 그 값은 고유한 공백 구분 토큰의 순서 없는 집합이어야 하며, 토큰은 ASCII 대소문자를 구분하지 않는다. 허용되는 값은 다음과 같다:

속성이 설정되면 콘텐츠는 고유한 불투명 출처에서 온 것으로 취급되고, 폼, 스크립트 및 잠재적으로 성가신 여러 API가 비활성화되며, 링크가 다른 내비게이션 가능 객체를 대상으로 삼지 못하게 된다. allow-same-origin 키워드는 콘텐츠를 불투명 출처로 강제하는 대신 실제 출처에서 온 것으로 취급하게 한다. allow-top-navigation 키워드는 콘텐츠가 자신의 순회 가능 내비게이션 가능 객체내비게이션하도록 허용한다. allow-top-navigation-by-user-activation 키워드는 비슷하게 동작하지만 브라우징 컨텍스트의 활성 창일시적 활성화가 있을 때만 이러한 내비게이션을 허용한다. allow-top-navigation-to-custom-protocols 키워드는 가져오기 스킴이 아닌 대상으로 향하는 내비게이션을 외부 소프트웨어에 넘기도록 다시 활성화한다. 그리고 allow-forms, allow-modals, allow-orientation-lock, allow-pointer-lock, allow-popups, allow-presentation, allow-scriptsallow-popups-to-escape-sandbox 키워드는 각각 폼, 모달 대화 상자, 화면 방향 잠금, 포인터 잠금 API, 팝업, 프레젠테이션 API, 스크립트 및 샌드박스되지 않은 보조 브라우징 컨텍스트의 생성을 다시 활성화한다. allow-downloads 키워드는 콘텐츠가 다운로드를 수행하도록 허용한다. [POINTERLOCK] [SCREENORIENTATION] [PRESENTATION]

allow-top-navigationallow-top-navigation-by-user-activation 키워드를 둘 다 지정해서는 안 된다. 그렇게 하면 중복되며, 이러한 준수하지 않는 마크업에서는 allow-top-navigation만 효과가 있다.

마찬가지로 allow-top-navigation-to-custom-protocols 키워드는 allow-top-navigation 또는 allow-popups 중 하나가 지정된 경우 중복되므로 지정해서는 안 된다.

샌드박스된 콘텐츠 안에서 alert(), confirm()prompt()를 허용하려면 allow-modalsallow-same-origin 키워드를 모두 지정해야 하고, 로드된 URL은 최상위 출처동일 출처여야 한다. allow-same-origin 키워드가 없으면 콘텐츠는 항상 교차 출처로 취급되며 교차 출처 콘텐츠는 단순 대화 상자를 표시할 수 없다.

임베드된 페이지가 iframe을 포함하는 페이지와 동일 출처일 때 allow-scriptsallow-same-origin 키워드를 함께 설정하면 임베드된 페이지가 단순히 sandbox 속성을 제거한 뒤 자신을 다시 로드하여 사실상 샌드박스에서 완전히 벗어날 수 있다.

이러한 플래그는 iframe 요소의 콘텐츠 내비게이션 가능 객체내비게이션될 때만 효과가 있다. 이들을 제거하거나 전체 sandbox 속성을 제거해도 이미 로드된 페이지에는 효과가 없다.

잠재적으로 적대적인 파일은 iframe 요소를 포함하는 파일과 같은 서버에서 제공해서는 안 된다. 공격자가 사용자를 설득하여 iframe 안이 아니라 적대적 콘텐츠를 직접 방문하게 할 수 있다면 적대적 콘텐츠를 샌드박스하는 것은 거의 도움이 되지 않는다. 적대적 HTML 콘텐츠가 일으킬 수 있는 피해를 제한하려면 별도의 전용 도메인에서 제공해야 한다. 다른 도메인을 사용하면 사용자가 sandbox 속성의 보호 없이 해당 페이지를 직접 방문하도록 속더라도 파일의 스크립트가 사이트를 공격할 수 없게 된다.

null이 아닌 콘텐츠 내비게이션 가능 객체를 가진 동안 iframe 요소의 sandbox 속성이 설정되거나 변경되면 사용자 에이전트는 속성 값과 iframe 요소의 iframe 샌드박스 플래그 집합이 주어졌을 때 샌드박스 지시문을 구문 분석해야 한다.

null이 아닌 콘텐츠 내비게이션 가능 객체를 가진 동안 iframe 요소의 sandbox 속성이 제거되면 사용자 에이전트는 iframe 요소의 iframe 샌드박스 플래그 집합을 비워야 한다.

이 예제에서는 완전히 알 수 없고 잠재적으로 적대적인 사용자 제공 HTML 콘텐츠가 페이지에 임베드된다. 별도의 도메인에서 제공되므로 일반적인 모든 교차 사이트 제한의 영향을 받는다. 또한 임베드된 페이지는 스크립팅, 플러그인 및 폼이 비활성화되며 자신(또는 자신이 임베드한 프레임이나 창) 이외의 프레임이나 창을 내비게이션할 수 없다.

<p>We're not scared of you! Here is your content, unedited:</p>
<iframe sandbox src="https://usercontent.example.net/getusercontent.cgi?id=12193"></iframe>

공격자가 사용자를 설득하여 해당 페이지를 직접 방문하게 하더라도 페이지가 사이트 출처의 컨텍스트에서 실행되지 않도록 별도의 도메인을 사용하는 것이 중요하다. 그렇지 않으면 사용자가 페이지에서 발견되는 모든 공격에 취약해진다.

이 예제에서는 다른 사이트의 가젯이 임베드된다. 가젯은 스크립팅과 폼이 활성화되어 있고 출처 샌드박스 제한이 해제되어 가젯이 원래 서버와 통신할 수 있다. 그러나 샌드박스는 플러그인과 팝업을 비활성화하므로 사용자가 악성 코드 및 기타 불편에 노출될 위험을 줄인다는 점에서 여전히 유용하다.

<iframe sandbox="allow-same-origin allow-forms allow-scripts"
        src="https://maps.example.com/embedded.html"></iframe>

파일 A에 다음 조각이 포함되어 있다고 가정한다:

<iframe sandbox="allow-same-origin allow-forms" src=B></iframe>

파일 B에도 iframe이 포함되어 있다고 가정한다:

<iframe sandbox="allow-scripts" src=C></iframe>

또한 파일 C에 링크가 포함되어 있다고 가정한다:

<a href=D>Link</a>

이 예제에서는 모든 파일이 text/html로 제공되었다고 가정한다.

이 시나리오의 페이지 C에는 모든 샌드박스 플래그가 설정되어 있다. A의 iframe에서 스크립트가 비활성화되어 있고 이것이 B의 iframe에 설정된 allow-scripts 키워드를 재정의하므로 스크립트가 비활성화된다. 내부 iframe(B에 있음)에 allow-forms 키워드가 설정되어 있지 않으므로 폼도 비활성화된다.

이제 A의 스크립트가 A와 B의 모든 sandbox 속성을 제거한다고 가정한다. 이는 즉시 아무것도 변경하지 않는다. 사용자가 C의 링크를 클릭하여 페이지 D를 B의 iframe에 로드하면 페이지 D는 이제 B의 iframeallow-same-originallow-forms 키워드가 설정된 것처럼 동작한다. 이는 페이지 B가 로드될 때 A의 iframe콘텐츠 내비게이션 가능 객체 상태가 그러했기 때문이다.

일반적으로 sandbox 속성을 동적으로 제거하거나 변경하는 것은 권장되지 않는다. 무엇이 허용되고 무엇이 허용되지 않는지 추론하기가 상당히 어려워질 수 있기 때문이다.


allow 속성을 지정하면 iframe콘텐츠 내비게이션 가능 객체에 있는 Document권한 정책이 초기화될 때 사용할 컨테이너 정책을 결정한다. 그 값은 직렬화된 권한 정책이어야 한다. [PERMISSIONSPOLICY]

이 예제에서는 iframe을 사용하여 온라인 내비게이션 서비스의 지도를 임베드한다. 중첩된 컨텍스트 안에서 Geolocation API를 활성화하기 위해 allow 속성을 사용한다.

<iframe src="https://maps.example.com/" allow="geolocation"></iframe>

allowfullscreen 속성은 불리언 속성이다. 이를 지정하면 iframe 요소의 콘텐츠 내비게이션 가능 객체에 있는 Document 객체가 모든 출처에서 "fullscreen" 기능을 사용할 수 있게 하는 권한 정책으로 초기화됨을 나타낸다. 이는 권한 정책 속성 처리 알고리즘에 의해 적용된다. [PERMISSIONSPOLICY]

여기서는 iframe을 사용하여 동영상 사이트의 플레이어를 임베드한다. 플레이어가 동영상을 전체 화면으로 표시할 수 있게 하려면 allowfullscreen 속성이 필요하다.

<article>
 <header>
  <p><img src="/usericons/1627591962735"> <b>Fred Flintstone</b></p>
  <p><a href="/posts/3095182851" rel=bookmark>12:44</a><a href="#acl-3095182851">Private Post</a></p>
 </header>
 <p>Check out my new ride!</p>
 <iframe src="https://video.example.com/embed?id=92469812" allowfullscreen></iframe>
</article>

요소의 노드 문서가 해당 기능을 사용할 수 있도록 이미 허용되지 않은 경우 allowallowfullscreen 중 어느 것도 iframe 요소의 콘텐츠 내비게이션 가능 객체에서 기능에 대한 접근 권한을 부여할 수 없다.

Document 객체 document가 정책 제어 기능 feature사용하도록 허용되는지 결정하려면 다음 단계를 실행한다:

  1. document브라우징 컨텍스트가 null이면 false를 반환한다.

  2. document완전히 활성 상태가 아니면 false를 반환한다.

  3. feature, documentdocument출처에 대해 출처에 대해 문서에서 기능이 활성화되었는지 여부를 실행한 결과가 "Enabled"이면 true를 반환한다.

  4. false를 반환한다.

allowallowfullscreen 속성은 콘텐츠 내비게이션 가능 객체활성 문서권한 정책에만 영향을 주므로 iframe콘텐츠 내비게이션 가능 객체내비게이션될 때만 효과가 있다. 이들을 추가하거나 제거해도 이미 로드된 문서에는 효과가 없다.


iframe 요소는 임베드된 콘텐츠에 특정 치수가 있는 경우(예: 광고 단위의 치수가 잘 정의됨)를 위해 치수 속성을 지원한다.

iframe 요소는 지정된 초기 콘텐츠가 성공적으로 사용되는지와 관계없이 항상 새로운 자식 내비게이션 가능 객체를 생성하므로 대체 콘텐츠를 절대로 가지지 않는다.


referrerpolicy 속성은 리퍼러 정책 속성이다. 그 목적은 iframe 속성을 처리할 때 사용되는 리퍼러 정책을 설정하고, 내부 조상 출처 객체 목록 생성 단계에서 일부 출처를 마스킹할 수 있게 하는 것이다. [REFERRERPOLICY]

loading 속성은 지연 로딩 속성이다. 그 목적은 뷰포트 밖에 있는 iframe 요소를 로드하는 정책을 나타내는 것이다.

loading 속성의 상태가 즉시 로드 상태로 변경되면 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. resumptionStepsiframe 요소의 지연 로드 재개 단계로 둔다.

  2. resumptionSteps가 null이면 반환한다.

  3. iframe지연 로드 재개 단계를 null로 설정한다.

  4. resumptionSteps를 호출한다.


iframe 요소의 자손은 아무것도 나타내지 않는다. (iframe 요소를 지원하지 않는 레거시 사용자 에이전트에서는 콘텐츠가 대체 콘텐츠로 작동할 수 있는 마크업으로 구문 분석된다.)

HTML 파서iframe 요소 안의 마크업을 텍스트로 취급한다.


HTMLIFrameElement/srcdoc

현재의 모든 엔진에서 지원된다.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

srcdoc getter 단계는 다음과 같다:

  1. attribute를 null, srcdoc로컬 이름this가 주어졌을 때 네임스페이스와 로컬 이름으로 속성을 가져온 결과로 둔다.

  2. attribute가 null이면 빈 문자열을 반환한다.

  3. attribute을 반환한다.

srcdoc setter 단계는 다음과 같다:

  1. compliantStringTrustedHTML, this관련 전역 객체, 주어진 값, "HTMLIFrameElement srcdoc" 및 "script"를 사용하여 신뢰할 수 있는 유형 준수 문자열 가져오기 알고리즘을 호출한 결과로 둔다.

  2. this, srcdoc로컬 이름compliantString이 주어졌을 때 속성 값을 설정한다.

sandboxDOMTokenList에 대한 지원되는 토큰sandbox 속성에 정의되고 사용자 에이전트가 지원하는 허용 값이다.

HTMLIFrameElement/referrerPolicy

현재의 모든 엔진에서 지원된다.

Firefox50+Safari14+Chrome52+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

referrerPolicy IDL 속성은 referrerpolicy 콘텐츠 속성을 반영해야 하며, 알려진 값으로만 제한된다.

loading IDL 속성은 loading 콘텐츠 속성을 반영해야 하며, 알려진 값으로만 제한된다.

HTMLIFrameElement/contentDocument

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer8+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

contentDocument getter 단계는 this콘텐츠 문서를 반환하는 것이다.

HTMLIFrameElement/contentWindow

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

contentWindow getter 단계는 this콘텐츠 창을 반환하는 것이다.

다음은 iframe을 사용하여 광고 중개업체의 광고를 포함하는 페이지의 예이다:

<iframe src="https://ads.example.com/?customerid=923513721&amp;format=banner"
        width="468" height="60"></iframe>

4.8.6 embed 요소

Element/embed

현재의 모든 엔진에서 지원된다.

Firefox1+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLEmbedElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
구문 콘텐츠.
임베디드 콘텐츠.
대화형 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
임베디드 콘텐츠가 예상되는 곳.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
src — 리소스의 주소
type — 임베디드 리소스의 유형
width — 가로 치수
height — 세로 치수
네임스페이스가 없는 그 밖의 모든 속성(본문 참조).
접근성 고려 사항:
작성자용.
구현자용.
정제:
안전하지 않음.
DOM 인터페이스:
[Exposed=Window]
interface HTMLEmbedElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectURL] attribute USVString src;
  [CEReactions, Reflect] attribute DOMString type;
  [CEReactions, Reflect] attribute DOMString width;
  [CEReactions, Reflect] attribute DOMString height;
  Document? getSVGDocument();

  // also has obsolete members
};

embed 요소는 외부 애플리케이션 또는 대화형 콘텐츠를 위한 통합 지점을 제공한다.

src 속성은 임베드되는 리소스의 URL을 제공한다. 속성이 있는 경우 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL을 포함해야 한다.

embed 요소에 itemprop 속성이 지정된 경우 src 속성도 지정해야 한다.

type 속성이 있는 경우 인스턴스화할 플러그인을 선택하는 데 사용되는 MIME 유형을 제공한다. 값은 유효한 MIME 유형 문자열이어야 한다. type 속성과 src 속성이 모두 있는 경우 type 속성은 src 속성이 제공한 리소스의 명시적 Content-Type 메타데이터와 동일한 유형을 지정해야 한다.

다음 조건 중 하나라도 발생하는 동안 요소에 대해 인스턴스화된 모든 플러그인을 제거해야 하며 embed 요소는 아무것도 나타내지 않는다:

embed 요소는 다음 조건이 모두 동시에 충족될 때 잠재적으로 활성 상태라고 한다:

잠재적으로 활성 상태가 아니었던 embed 요소가 잠재적으로 활성 상태가 될 때마다, 그리고 잠재적으로 활성 상태를 유지하는 embed 요소의 src 속성이 설정, 변경 또는 제거되거나 type 속성이 설정, 변경 또는 제거될 때마다 사용자 에이전트는 해당 요소가 주어졌을 때 embed 태스크 소스에서 요소 태스크를 큐에 넣어 그 요소에 대한 embed 요소 설정 단계를 실행해야 한다.

주어진 embed 요소 element에 대한 embed 요소 설정 단계는 다음과 같다:

  1. 그 이후 element에 대해 embed 요소 설정 단계를 실행할 다른 태스크가 큐에 들어갔다면 반환한다.

  2. elementsrc 속성이 설정되어 있으면:

    1. urlelementsrc 속성 값과 element노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

    2. url이 실패이면 반환한다.

    3. requestURLurl이고, 클라이언트element노드 문서관련 설정 객체이고, 대상이 "embed"이며, 자격 증명 모드가 "include"이고, 모드가 "navigate"이며, 개시자 유형이 "embed"이고, URL 자격 증명 사용 플래그가 설정된 새로운 요청으로 둔다.

    4. request가져오기하되, processResponse응답 response가 주어졌을 때 다음 단계로 설정한다:

      1. 그 이후 element에 대해 embed 요소 설정 단계를 실행할 다른 태스크가 큐에 들어갔다면 반환한다.

      2. response네트워크 오류이면 elementload라는 이름의 이벤트를 발생시키고 반환한다.

      3. typeelementresponse가 주어졌을 때 콘텐츠 유형을 결정한 결과로 둔다.

      4. type에 따라 전환한다:

        null
        1. element에 대해 플러그인 없음을 표시한다.

        그렇지 않으면
        1. element콘텐츠 내비게이션 가능 객체가 null이면 element에 대해 새로운 자식 내비게이션 가능 객체를 생성한다.

        2. element노드 문서를 사용하여 element콘텐츠 내비게이션 가능 객체responseURL내비게이션하되, responseresponse로 설정하고 historyHandling을 "replace"로 설정한다.

          element콘텐츠 내비게이션 가능 객체가 다른 위치로 추가로 내비게이션되더라도 elementsrc 속성은 업데이트되지 않는다.

        3. 이제 element는 자신의 콘텐츠 내비게이션 가능 객체나타낸다.

      리소스를 가져오는 것은 element노드 문서load 이벤트를 지연해야 한다.

  3. 그렇지 않으면 element에 대해 플러그인 없음을 표시한다.

embed 요소 element응답 response가 주어졌을 때 콘텐츠 유형을 결정하려면 다음 단계를 실행한다:

  1. elementtype 속성이 있고 그 속성 값이 플러그인이 지원하는 유형이면 type 속성 값을 반환한다.

  2. responseurl경로 구성 요소가 플러그인이 지원하는 패턴과 일치하면 해당 플러그인이 처리할 수 있는 유형을 반환한다.

    예를 들어 플러그인은 네 문자 문자열 ".swf"로 끝나는 경로 구성 요소를 가진 URL을 처리할 수 있다고 명시할 수 있다.

  3. response명시적 Content-Type 메타데이터가 있고 그 값이 플러그인이 지원하는 유형이면 그 값을 반환한다.

  4. null을 반환한다.

위 알고리즘에서 response정상 상태가 아니어도 허용하는 것은 의도된 것이다. 이를 통해 서버는 오류 응답에서도 플러그인용 데이터를 반환할 수 있다(예: HTTP 500 Internal Server Error 코드에도 플러그인 데이터가 포함될 수 있다).

embed 요소 element에 대해 플러그인 없음을 표시하려면:

  1. element가 주어졌을 때 자식 내비게이션 가능 객체를 파괴한다.

  2. element에 대한 플러그인을 찾을 수 없다는 표시를 element의 콘텐츠로 표시한다.

  3. 이제 element는 아무것도 나타내지 않는다.

embed 요소에는 대체 콘텐츠가 없으며, 그 자손은 무시된다.

잠재적으로 활성 상태였던 embed 요소가 잠재적으로 활성 상태이기를 멈출 때마다 그 요소에 대해 인스턴스화되었던 모든 플러그인을 언로드해야 한다.

embed 요소는 load 이벤트를 잠재적으로 지연시킨다.

embed 요소는 치수 속성을 지원한다.

4.8.7 object 요소

Element/object

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLObjectElement

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLObjectElement/data

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLObjectElement/type

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLObjectElement/name

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
구문 콘텐츠.
임베디드 콘텐츠.
나열된 폼 연관 요소.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
임베디드 콘텐츠가 예상되는 곳.
콘텐츠 모델:
투명.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
data — 리소스의 주소
type — 임베디드 리소스의 유형
name콘텐츠 내비게이션 가능 객체의 이름
form — 요소를 form 요소와 연결
width — 가로 치수
height — 세로 치수
접근성 고려 사항:
작성자용.
구현자용.
정제:
안전하지 않음.
DOM 인터페이스:
[Exposed=Window]
interface HTMLObjectElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, ReflectURL] attribute USVString data;
  [CEReactions, Reflect] attribute DOMString type;
  [CEReactions, Reflect] attribute DOMString name;
  readonly attribute HTMLFormElement? form;
  [CEReactions, Reflect] attribute DOMString width;
  [CEReactions, Reflect] attribute DOMString height;
  readonly attribute Document? contentDocument;
  readonly attribute WindowProxy? contentWindow;
  Document? getSVGDocument();

  readonly attribute boolean willValidate;
  readonly attribute ValidityState validity;
  readonly attribute DOMString validationMessage;
  boolean checkValidity();
  boolean reportValidity();
  undefined setCustomValidity(DOMString error);

  // also has obsolete members
};

object 요소가 인스턴스화한 콘텐츠의 유형에 따라 노드는 다른 인터페이스도 지원한다.

object 요소는 외부 리소스를 나타낼 수 있으며, 리소스 유형에 따라 이미지 또는 자식 내비게이션 가능 객체로 취급된다.

data 속성은 리소스의 URL을 지정한다. 이 속성은 반드시 존재해야 하며 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL을 포함해야 한다.

type 속성이 있는 경우 리소스의 유형을 지정한다. 속성이 있는 경우 유효한 MIME 유형 문자열이어야 한다.

name 속성이 있는 경우 유효한 내비게이션 가능 대상 이름이어야 한다. 주어진 값은 해당하는 경우 요소의 콘텐츠 내비게이션 가능 객체의 이름을 지정하는 데 사용되며, 요소의 콘텐츠 내비게이션 가능 객체생성될 때 존재하는 경우에 적용된다.

다음 조건 중 하나가 발생할 때마다:

...사용자 에이전트는 object 요소가 주어졌을 때 DOM 조작 태스크 소스에서 요소 태스크를 큐에 넣어, object 요소가 무엇을 나타내는지 (다시) 결정하기 위한 다음 단계를 실행해야 한다. 이 태스크큐에 들어가 있거나 실행 중이면 요소의 노드 문서load 이벤트를 지연해야 한다.

  1. 사용자가 이 object 요소의 일반적인 동작 대신 요소의 대체 콘텐츠를 표시하기를 선호한다고 나타낸 경우 아래의 대체라고 표시된 단계로 이동한다.

    예를 들어 사용자는 요소의 대체 콘텐츠가 자신에게 더 접근하기 쉬운 형식을 사용하므로 이를 표시하도록 요청할 수 있다.

  2. 요소에 미디어 요소 조상이 있거나, 자신의 대체 콘텐츠를 표시하고 있지 않은 object 조상 요소가 있거나, 요소가 브라우징 컨텍스트가 null이 아닌 문서 안에 있지 않거나, 요소의 노드 문서완전히 활성 상태가 아니거나, 요소가 여전히 HTML 파서 또는 XML 파서열린 요소 스택에 있거나, 요소가 렌더링 중이 아니면 아래의 대체라고 표시된 단계로 이동한다.

  3. data 속성이 존재하고 그 값이 빈 문자열이 아니면:

    1. type 속성이 존재하고 그 값이 사용자 에이전트가 지원하는 유형이 아니면, 사용자 에이전트는 실제 유형을 검사하기 위해 콘텐츠를 가져오지 않고 아래의 대체라고 표시된 단계로 이동할 수 있다.

    2. urldata 속성 값과 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

    3. url이 실패이면 요소에 error라는 이름의 이벤트를 발생시키고 아래의 대체라고 표시된 단계로 이동한다.

    4. requestURLurl이고, 클라이언트가 요소의 노드 문서관련 설정 객체이고, 대상이 "object"이며, 자격 증명 모드가 "include"이고, 모드가 "navigate"이며, 개시자 유형이 "object"이고, URL 자격 증명 사용 플래그가 설정된 새로운 요청으로 둔다.

    5. request가져오기한다.

      리소스를 가져오는 것은 리소스가 가져와진 뒤(다음에 정의됨) 네트워킹 태스크 소스큐에 넣은 태스크가 실행될 때까지 요소의 노드 문서load 이벤트를 지연해야 한다.

    6. 리소스를 아직 사용할 수 없으면(예: 리소스가 캐시에 없어 리소스를 로드하기 위해 네트워크를 통해 요청해야 했기 때문) 아래의 대체라고 표시된 단계로 이동한다. 리소스를 사용할 수 있게 된 뒤 네트워킹 태스크 소스큐에 넣은 태스크는 이 단계부터 이 알고리즘을 다시 시작해야 한다. 리소스는 점진적으로 로드될 수 있으며, 사용자 에이전트는 리소스 처리를 시작하기에 충분한 데이터를 얻은 때마다 리소스를 "사용 가능"한 것으로 간주할 수 있다.

    7. 로드에 실패하면(예: HTTP 404 오류 또는 DNS 오류가 발생함) 요소에 error라는 이름의 이벤트를 발생시킨 뒤 아래의 대체라고 표시된 단계로 이동한다.

    8. 다음과 같이 리소스 유형을 결정한다:

      1. 리소스 유형을 알 수 없음으로 둔다.

      2. 사용자 에이전트가 이 리소스에 대해 Content-Type 헤더를 엄격히 따르도록 구성되어 있고, 리소스에 연결된 Content-Type 메타데이터가 있으면 리소스 유형리소스의 Content-Type 메타데이터에 지정된 유형으로 둔 뒤 아래의 처리기라고 표시된 단계로 이동한다.

        이는 사이트가 특정 유형을 사용하는 리소스를 임베드하려 하지만 원격 사이트가 이를 재정의하고 대신 서로 다른 보안 특성을 가진 다른 유형의 콘텐츠를 작동시키는 리소스를 사용자 에이전트에 제공하는 취약성을 발생시킬 수 있다.

      3. 다음 목록에서 적절한 단계 집합을 실행한다:

        리소스에 연결된 Content-Type 메타데이터가 있는 경우
        1. binary를 false로 둔다.

        2. 리소스의 Content-Type 메타데이터에 지정된 유형이 "text/plain"이고, 리소스에 리소스가 텍스트인지 바이너리인지 구분하는 규칙을 적용한 결과 리소스가 text/plain이 아니면 binary를 true로 설정한다.

        3. 리소스의 Content-Type 메타데이터에 지정된 유형이 "application/octet-stream"이면 binary를 true로 설정한다.

        4. binary가 false이면 리소스 유형리소스의 Content-Type 메타데이터에 지정된 유형으로 두고 아래의 처리기라고 표시된 단계로 이동한다.

        5. object 요소에 type 속성이 존재하고 그 값이 application/octet-stream이 아니면 다음 단계를 실행한다:

          1. 속성 값이 "image/"로 시작하면서 XML MIME 유형이 아닌 유형이면 리소스 유형을 해당 type 속성에 지정된 유형으로 둔다.

          2. 아래의 처리기라고 표시된 단계로 이동한다.

        그렇지 않고 리소스에 연결된 Content-Type 메타데이터가 없는 경우
        1. object 요소에 type 속성이 존재하면 임시 유형을 해당 type 속성에 지정된 유형으로 둔다.

          그렇지 않으면 임시 유형리소스의 계산된 유형으로 둔다.

        2. 임시 유형application/octet-stream아니면 리소스 유형임시 유형으로 두고 아래의 처리기라고 표시된 단계로 이동한다.

      4. 지정된 리소스의 URL(모든 리디렉션 이후)에 URL 파서 알고리즘을 적용한 결과, 경로 구성 요소가 플러그인이 지원하는 패턴과 일치하는 URL 레코드가 생성되면 리소스 유형을 해당 플러그인이 처리할 수 있는 유형으로 둔다.

        예를 들어 플러그인은 네 문자 문자열 ".swf"로 끝나는 경로 구성 요소를 가진 리소스를 처리할 수 있다고 명시할 수 있다.

      이 단계가 끝났거나 위의 하위 단계 중 하나가 바로 다음 단계로 이동했을 때에도 리소스 유형이 여전히 알 수 없음일 수 있다. 두 경우 모두 다음 단계에서 대체 콘텐츠가 작동한다.

    9. 처리기: 다음 경우 중 처음으로 일치하는 경우에 따라 콘텐츠를 처리한다:

      리소스 유형XML MIME 유형이거나 리소스 유형이 "image/"로 시작하지 않는 경우

      object 요소의 콘텐츠 내비게이션 가능 객체가 null이면 요소에 대해 새로운 자식 내비게이션 가능 객체를 생성한다.

      response가져오기에서 얻은 응답으로 둔다.

      responseURLabout:blank과 일치하지 않으면 요소의 콘텐츠 내비게이션 가능 객체responseURL로 요소의 노드 문서를 사용하여 내비게이션하되, historyHandling을 "replace"로 설정한다.

      object 요소의 data 속성은 콘텐츠 내비게이션 가능 객체가 다른 위치로 추가로 내비게이션되더라도 업데이트되지 않는다.

      object 요소는 자신의 콘텐츠 내비게이션 가능 객체나타낸다.

      리소스 유형이 "image/"로 시작하고 이미지 지원이 비활성화되지 않은 경우

      object 요소가 주어졌을 때 자식 내비게이션 가능 객체를 파괴한다.

      이미지 유형을 결정하기 위해 이미지 스니핑 규칙을 적용한다.

      object 요소는 지정된 이미지를 나타낸다.

      이미지가 잘못 구성되었거나 지원되지 않는 형식이어서 렌더링할 수 없으면 아래의 대체라고 표시된 단계로 이동한다.

      그렇지 않으면

      주어진 리소스 유형은 지원되지 않는다. 아래의 대체라고 표시된 단계로 이동한다.

      이전 단계가 리소스 유형이 알 수 없음인 상태로 끝났다면 이 경우가 작동한다.

    10. 요소의 콘텐츠는 object 요소가 나타내는 것의 일부가 아니다.

    11. object 요소가 자신의 콘텐츠 내비게이션 가능 객체를 나타내지 않으면, 리소스가 완전히 로드된 뒤 object 요소가 주어졌을 때 DOM 조작 태스크 소스에서 요소 태스크를 큐에 넣어 요소에 load라는 이름의 이벤트를 발생시킨다.

      요소가 자신의 콘텐츠 내비게이션 가능 객체를 실제로 나타내는 경우에는 생성된 Document로드를 완전히 마쳤을 때 이와 유사한 태스크가 큐에 들어간다.

    12. 반환한다.

  4. 대체: object 요소는 요소의 자식을 나타낸다. 이것이 요소의 대체 콘텐츠이다. 요소가 주어졌을 때 자식 내비게이션 가능 객체를 파괴한다.

위 알고리즘으로 인해 object 요소의 콘텐츠는 참조된 리소스를 표시할 수 없을 때만 사용되는(예: 404 오류를 반환함) 대체 콘텐츠로 작동한다. 이를 통해 서로 다른 기능을 가진 여러 사용자 에이전트를 대상으로 여러 object 요소를 서로 중첩할 수 있으며 사용자 에이전트는 자신이 지원하는 첫 번째 요소를 선택한다.

object 요소는 load 이벤트를 잠재적으로 지연시킨다.

form 속성은 object 요소를 자신의 폼 소유자와 명시적으로 연결하는 데 사용된다.

object 요소는 치수 속성을 지원한다.

HTMLObjectElement/contentDocument

현재의 모든 엔진에서 지원된다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer8+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

contentDocument getter 단계는 this콘텐츠 문서를 반환하는 것이다.

HTMLObjectElement/contentWindow

현재의 모든 엔진에서 지원된다.

Firefox22+Safari13+Chrome53+
Opera?Edge79+
Edge (Legacy)17+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

contentWindow getter 단계는 this콘텐츠 창을 반환하는 것이다.

willValidate, validityvalidationMessage 속성과 checkValidity(), reportValidity()setCustomValidity() 메서드는 제약 조건 유효성 검사 API의 일부이다. form IDL 속성은 요소의 폼 API에 속한다.

이 예제에서는 object 요소를 사용하여 HTML 페이지를 다른 페이지 안에 임베드한다.

<figure>
 <object data="clock.html"></object>
 <figcaption>My HTML Clock</figcaption>
</figure>

4.8.8 video 요소

Element/video

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLVideoElement

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
범주:
플로 콘텐츠.
구문 콘텐츠.
임베디드 콘텐츠.
요소에 controls 속성이 있는 경우: 대화형 콘텐츠.
실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
임베디드 콘텐츠가 예상되는 곳.
콘텐츠 모델:
요소에 src 속성이 있는 경우: 0개 이상의 track 요소, 그 다음 투명. 단, 미디어 요소 자손은 없어야 한다.
요소에 src 속성이 없는 경우: 0개 이상의 source 요소, 그 다음 0개 이상의 track 요소, 그 다음 투명. 단, 미디어 요소 자손은 없어야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
src — 리소스의 주소
crossorigin — 요소가 교차 출처 요청을 처리하는 방식
poster — 비디오 재생 전에 표시할 포스터 프레임
preload미디어 리소스에 필요한 버퍼링 양을 암시
autoplay — 페이지가 로드될 때 미디어 리소스를 자동으로 시작할 수 있음을 암시
playsinline — 사용자 에이전트가 요소의 재생 영역 안에 비디오 콘텐츠를 표시하도록 권장
loop미디어 리소스를 반복할지 여부
muted — 기본적으로 미디어 리소스를 음소거할지 여부
controls — 사용자 에이전트 컨트롤 표시
loading — 로딩 지연을 결정할 때 사용
width — 가로 치수
height — 세로 치수
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLVideoElement : HTMLMediaElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute unsigned long width;
  [CEReactions, Reflect] attribute unsigned long height;
  readonly attribute unsigned long videoWidth;
  readonly attribute unsigned long videoHeight;
  [CEReactions, ReflectURL] attribute USVString poster;
  [CEReactions, Reflect] attribute boolean playsInline;

};

video 요소는 비디오나 영화, 그리고 자막이 있는 오디오 파일을 재생하는 데 사용된다.

video 요소 안에 콘텐츠를 제공할 수 있다. 사용자 에이전트는 이 콘텐츠를 사용자에게 표시하지 않아야 한다. 이 콘텐츠는 video를 지원하지 않는 오래된 웹 브라우저를 위한 것으로, 이러한 브라우저의 사용자에게 비디오 콘텐츠에 접근하는 방법을 알려 주는 텍스트를 표시할 수 있게 한다.

특히 이 콘텐츠는 접근성 문제를 해결하기 위한 것이 아니다. 저시력자, 시각 장애인, 난청인, 청각 장애인 및 그 밖의 신체적 또는 인지적 장애가 있는 사용자가 비디오 콘텐츠에 접근할 수 있도록 다양한 기능을 사용할 수 있다. 자막은 비디오 스트림에 임베드하거나 track 요소를 사용하여 외부 파일로 제공할 수 있다. 수어 트랙은 비디오 스트림에 임베드할 수 있다. 오디오 설명은 비디오 스트림에 임베드하거나 WebVTT 파일을 사용하여 텍스트 형식으로 제공하고, track 요소로 참조하여 사용자 에이전트가 음성으로 합성할 수 있다. WebVTT는 장 제목을 제공하는 데에도 사용할 수 있다. 미디어 요소를 전혀 사용하지 않으려는 사용자를 위해서는 video 요소 근처의 본문에서 대본이나 다른 텍스트 대체물로 링크하기만 하면 된다. [WEBVTT]

video 요소는 미디어 데이터가 표면상 비디오 데이터이며, 관련 오디오 데이터가 함께 있을 수 있는 미디어 요소이다.

video 요소에는 slot 요소가 없는 내부 섀도 트리가 있다.

src, crossorigin, preload, autoplay, loop, mutedcontrols 속성은 모든 미디어 요소에 공통인 속성이다.

poster 속성은 비디오 데이터를 사용할 수 없는 동안 사용자 에이전트가 표시할 수 있는 이미지 파일의 URL을 제공한다. 속성이 있는 경우 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL을 포함해야 한다.

지정된 리소스를 사용하는 경우, 요소가 생성되거나 poster 속성이 설정, 변경 또는 제거될 때 사용자 에이전트는 요소의 포스터 표시 플래그 값과 관계없이 요소의 포스터 프레임을 결정하기 위해 다음 단계를 실행해야 한다:

  1. video 요소에 대해 이미 실행 중인 이 알고리즘의 인스턴스가 있으면 포스터 프레임을 변경하지 않고 해당 인스턴스를 중단한다.

  2. poster 속성 값이 빈 문자열이거나 속성이 없는 경우:

    1. video 요소의 포스터 지연 로딩 재개 단계를 null로 설정한다.

    2. 포스터 프레임은 없다. 반환한다.

  3. urlposter 속성 값과 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.

  4. url이 실패이면 반환한다. 포스터 프레임은 없다.

  5. request요청으로 둔다. 그 URLurl이고, 클라이언트는 요소의 노드 문서관련 설정 객체이고, 대상은 "image"이고, 개시자 유형은 "video"이고, 자격 증명 모드는 "include"이며, URL 자격 증명 사용 플래그가 설정되어 있다.

  6. video가 주어졌을 때 요소를 지연 로딩할지 결정하는 단계가 true를 반환하면:

    1. posterResumptionSteps가져오기라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 둔다.

    2. video 요소의 포스터 지연 로딩 재개 단계posterResumptionSteps로 설정한다.

    3. 반환한다.

  7. request가져오기한다. 이는 요소의 노드 문서load 이벤트를 지연해야 한다.

  8. 그 결과 이미지를 얻으면 포스터 프레임은 그 이미지이다. 그렇지 않으면 포스터 프레임은 없다.

poster 속성이 제공한 이미지, 즉 포스터 프레임은 사용자가 비디오가 어떤 것인지 파악할 수 있게 하는 비디오의 대표 프레임 (일반적으로 처음 등장하는 비어 있지 않은 프레임 중 하나)을 의도한다.

playsinline 속성은 불리언 속성이다. 속성이 있으면 비디오가 전체 화면이나 독립적으로 크기를 조절할 수 있는 창에 표시되는 대신, 기본적으로 요소의 재생 영역으로 제한되어 문서 안에 "인라인"으로 표시되어야 함을 사용자 에이전트에 암시한다.

playsinline 속성이 없다고 해서 비디오가 기본적으로 전체 화면으로 표시된다는 의미는 아니다. 실제로 대부분의 사용자 에이전트는 모든 비디오를 기본적으로 인라인으로 재생하도록 선택했으며, 이러한 사용자 에이전트에서는 playsinline 속성이 아무런 효과도 갖지 않는다.

poster 속성이 존재하고 loading 속성이 지연 상태이면 사용자 에이전트는 요소의 지연 로딩 재개 단계가 호출될 때까지 포스터 이미지 소스 데이터의 로딩을 지연해야 한다.

<video src="1.mp4" poster="1.jpg" type="video/mp4">
<video src="2.mp4" type="video/mp4" loading="eager">
<video src="3.mp4" type="video/mp4" loading="lazy">
<video src="4.mp4" type="video/mp4" loading="lazy" autoplay>
<div id="very-large"></div> <!-- Everything after this div is below the viewport -->
<video src="5.mp4" type="video/mp4">
<video src="6.mp4" type="video/mp4" loading="lazy">
<video src="7.mp4" type="video/mp4" autoplay loading="lazy">
<video src="8.mp4" type="video/mp4" poster="8.jpg" loading="lazy">
<video src="9.mp4" type="video/mp4" preload="none" poster="9.jpg" loading="lazy">
<video src="10.mp4" type="video/mp4" preload="metadata" loading="lazy">
<video src="11.mp4" type="video/mp4" poster="11.jpg" preload="none" loading="eager">

위 예제에서 비디오는 다음과 같이 로드된다:

1.mp4

비디오와 포스터 이미지는 즉시 로드되며 창의 load 이벤트를 지연한다.

2.mp4, 5.mp4

비디오는 즉시 로드되며 창의 load 이벤트를 지연한다.

3.mp4

비디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되지만, 창의 load 이벤트를 지연하지 않는다.

4.mp4

비디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되고 자동 재생이 시작되지만, 창의 load 이벤트를 지연하지 않는다.

6.mp4

비디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.

7.mp4

비디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되고 자동 재생이 시작되며, 창의 load 이벤트를 지연하지 않는다.

8.mp4

비디오와 포스터 이미지는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.

9.mp4

비디오는 재생할 때까지 로드되지 않는다. 포스터 이미지는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.

10.mp4

비디오의 메타데이터는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.

11.mp4

비디오는 재생할 때까지 로드되지 않는다. 포스터 이미지는 즉시 로드되며 창의 load 이벤트를 지연한다.


video 요소는 아래 목록에서 처음으로 일치하는 조건에 주어진 것을 나타낸다:

비디오 데이터를 사용할 수 없는 경우(요소의 readyState 속성이 HAVE_NOTHING이거나, HAVE_METADATA이지만 아직 어떠한 비디오 데이터도 전혀 얻지 못했거나, 요소의 readyState 속성이 그 이후의 값이지만 미디어 리소스에 비디오 채널이 없는 경우)
video 요소는 포스터 프레임이 있으면 그 포스터 프레임나타내고, 그렇지 않으면 자연 치수가 없는 투명한 검정색을 나타낸다.
video 요소가 일시 정지되어 있고, 현재 재생 위치가 비디오의 첫 번째 프레임이며, 요소의 포스터 표시 플래그가 설정된 경우
video 요소는 포스터 프레임이 있으면 그 포스터 프레임나타내고, 그렇지 않으면 비디오의 첫 번째 프레임을 나타낸다.
video 요소가 일시 정지되어 있고, 현재 재생 위치에 해당하는 비디오 프레임을 사용할 수 없는 경우(예: 비디오가 탐색 중이거나 버퍼링 중인 경우)
video 요소가 잠재적으로 재생 중이지도 않고 일시 정지되어 있지도 않은 경우(예: 탐색 중이거나 정지된 경우)
video 요소는 마지막으로 렌더링된 비디오 프레임을 나타낸다.
video 요소가 일시 정지된 경우
video 요소는 현재 재생 위치에 해당하는 비디오 프레임을 나타낸다.
그렇지 않으면(video 요소에 비디오 채널이 있고 잠재적으로 재생 중인 경우)
video 요소는 계속 증가하는 "현재" 위치의 비디오 프레임을 나타낸다. 현재 재생 위치가 변경되어 마지막으로 렌더링된 프레임이 더 이상 비디오에서 현재 재생 위치에 해당하는 프레임이 아니게 되면, 새 프레임을 렌더링해야 한다.

비디오 프레임은 이벤트 루프가 마지막으로 단계 1에 도달했을 때 선택된 비디오 트랙에서 얻어야 한다.

비디오 스트림에서 특정 재생 위치에 해당하는 프레임은 비디오 스트림의 형식에 의해 정의된다.

video 요소는 텍스트 트랙 큐 활성 플래그가 설정되어 있고 텍스트 트랙표시 모드인 모든 텍스트 트랙 큐와, 현재 재생 위치에서의 미디어 리소스의 모든 오디오도 나타낸다.

미디어 리소스와 관련된 모든 오디오는 재생되는 경우 요소의 유효 미디어 음량으로 현재 재생 위치와 동기화하여 재생해야 한다. 사용자 에이전트는 이벤트 루프가 마지막으로 단계 1에 도달했을 때 활성화된 오디오 트랙의 오디오를 재생해야 한다.

위의 사항에 더하여 사용자 에이전트는 비디오나 요소 재생 영역의 다른 부분에 텍스트 또는 아이콘을 오버레이하거나 다른 적절한 방식으로 사용자에게 메시지(예: "버퍼링 중", "로드된 비디오 없음", "오류" 또는 더 자세한 정보)를 제공할 수 있다.

비디오를 렌더링할 수 없는 사용자 에이전트는 대신 요소가 외부 비디오 재생 유틸리티 또는 비디오 데이터 자체로 연결되는 링크를 나타내도록 할 수 있다.

video 요소의 미디어 리소스에 비디오 채널이 있으면, 요소는 너비가 미디어 리소스자연 너비이고, 높이가 미디어 리소스자연 높이이며, 외형이 사용 가능한 경우 현재 재생 위치에 해당하는 비디오 프레임인 페인트 소스를 제공한다. 사용할 수 없으면 (예: 비디오가 탐색 중이거나 버퍼링 중인 경우) 이전 외형이 있으면 그 외형을 사용하고, 그렇지 않으면(예: 비디오가 아직 첫 번째 프레임을 로드 중인 경우) 검은색을 사용한다.


video.videoWidth

HTMLVideoElement/videoWidth

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
video.videoHeight

HTMLVideoElement/videoHeight

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+

이 속성들은 비디오의 자연 치수를 반환하며, 치수를 알 수 없으면 0을 반환한다.

미디어 리소스자연 너비자연 높이는 리소스에서 사용하는 형식에 정의된 대로 리소스의 치수, 종횡비, 클린 애퍼처, 해상도 등을 고려한 뒤의 CSS 픽셀 단위 치수이다. 아나모픽 형식이 "올바른" 치수를 얻기 위해 비디오 데이터의 치수에 종횡비를 적용하는 방식을 정의하지 않은 경우 사용자 에이전트는 한 치수를 늘리고 다른 치수는 변경하지 않는 방식으로 비율을 적용해야 한다.

videoWidth getter 단계는 다음과 같다:

  1. thisreadyState 속성이 HAVE_NOTHING이면 0을 반환한다.

  2. CSS 픽셀 단위로 비디오의 자연 너비를 반환한다.

videoHeight getter 단계는 다음과 같다:

  1. thisreadyState 속성이 HAVE_NOTHING이면 0을 반환한다.

  2. CSS 픽셀 단위로 비디오의 자연 높이를 반환한다.

비디오의 자연 너비 또는 자연 높이가 변경될 때마다 (예를 들어 선택된 비디오 트랙이 변경되어 발생한 경우 포함), 요소의 readyState 속성이 HAVE_NOTHING이 아니면 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 넣어 미디어 요소에서 resize라는 이름의 이벤트를 발생시켜야 한다.

video 요소는 치수 속성을 지원한다.

반대되는 스타일 규칙이 없으면 비디오 콘텐츠는 요소의 재생 영역 안에서 종횡비를 유지한 채 재생 영역 안에 완전히 들어가는 가능한 가장 큰 크기로 중앙에 표시되도록 렌더링해야 한다. 따라서 재생 영역의 종횡비가 비디오의 종횡비와 일치하지 않으면 비디오는 레터박스 또는 필러박스 형태로 표시된다. 비디오를 포함하지 않는 요소 재생 영역의 부분은 아무것도 나타내지 않는다.

CSS를 구현하는 사용자 에이전트에서는 위 요구 사항을 렌더링 절에 제안된 스타일 규칙을 사용하여 구현할 수 있다.

video 요소 재생 영역의 자연 너비는 포스터 프레임을 사용할 수 있고 요소가 현재 자신의 포스터 프레임을 나타내는 경우 포스터 프레임자연 너비이다. 그렇지 않고 비디오 리소스의 자연 너비를 사용할 수 있으면 그 값이다. 그렇지 않으면 자연 너비는 누락된다.

video 요소 재생 영역의 자연 높이는 포스터 프레임을 사용할 수 있고 요소가 현재 자신의 포스터 프레임을 나타내는 경우 포스터 프레임자연 높이이다. 그렇지 않고 비디오 리소스의 자연 높이를 사용할 수 있으면 그 값이다. 그렇지 않으면 자연 높이는 누락된다.

기본 객체 크기는 너비 300 CSS 픽셀, 높이 150 CSS 픽셀이다. [CSSIMAGES]


사용자 에이전트는 폐쇄 자막, 오디오 설명 트랙 및 비디오 스트림과 관련된 기타 추가 데이터의 표시를 활성화하거나 비활성화하는 컨트롤을 제공해야 한다. 다만 이러한 기능 역시 페이지의 정상적인 렌더링을 방해해서는 안 된다.

사용자 에이전트는 사용자가 전체 화면이나 독립적으로 크기를 조절할 수 있는 창과 같이 사용자에게 더 적합한 방식으로 비디오 콘텐츠를 볼 수 있게 할 수 있다. 사용자 에이전트는 비디오를 재생할 때 이러한 보기 모드를 기본적으로 작동시킬 수도 있지만, playsinline 속성이 지정된 경우에는 그렇게 하지 않아야 한다. 다른 사용자 인터페이스 기능과 마찬가지로 이를 활성화하는 컨트롤은 사용자 에이전트가 사용자에게 사용자 인터페이스를 노출하는 경우가 아니면 페이지의 정상적인 렌더링을 방해해서는 안 된다. 그러나 이러한 독립 보기 모드에서는 controls 속성이 없어도 사용자 에이전트가 완전한 사용자 인터페이스를 표시할 수 있다.

사용자 에이전트는 비디오 재생이 사용자의 경험을 방해할 수 있는 시스템 기능에 영향을 주도록 허용할 수 있다. 예를 들어 비디오를 재생하는 동안 화면 보호기를 비활성화할 수 있다.


이 예제는 비디오가 올바르게 재생되지 못했음을 감지하는 방법을 보여 준다:

<script>
 function failed(e) {
   // video playback failed - show a message saying why
   switch (e.target.error.code) {
     case e.target.error.MEDIA_ERR_ABORTED:
       alert('You aborted the video playback.');
       break;
     case e.target.error.MEDIA_ERR_NETWORK:
       alert('A network error caused the video download to fail part-way.');
       break;
     case e.target.error.MEDIA_ERR_DECODE:
       alert('The video playback was aborted due to a corruption problem or because the video used features your browser did not support.');
       break;
     case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
       alert('The video could not be loaded, either because the server or network failed or because the format is not supported.');
       break;
     default:
       alert('An unknown error occurred.');
       break;
   }
 }
</script>
<p><video src="tgif.vid" autoplay controls onerror="failed(event)"></video></p>
<p><a href="tgif.vid">Download the video file</a>.</p>

4.8.9 audio 요소

Element/audio

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android3+Samsung Internet?Opera Android11+

HTMLAudioElement

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
범주:
플로 콘텐츠.
구문 콘텐츠.
임베디드 콘텐츠.
요소에 controls 속성이 있는 경우: 대화형 콘텐츠.
요소에 controls 속성이 있는 경우: 실체적 콘텐츠.
이 요소를 사용할 수 있는 맥락:
임베디드 콘텐츠가 예상되는 곳.
콘텐츠 모델:
요소에 src 속성이 있는 경우: 0개 이상의 track 요소, 그 다음 투명. 단, 미디어 요소 자손은 없어야 한다.
요소에 src 속성이 없는 경우: 0개 이상의 source 요소, 그 다음 0개 이상의 track 요소, 그 다음 투명. 단, 미디어 요소 자손은 없어야 한다.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없다.
콘텐츠 속성:
전역 속성
src — 리소스의 주소
crossorigin — 요소가 교차 출처 요청을 처리하는 방식
preload미디어 리소스에 필요한 버퍼링 양을 암시
autoplay — 페이지가 로드될 때 미디어 리소스를 자동으로 시작할 수 있음을 암시
loop미디어 리소스를 반복할지 여부
muted — 기본적으로 미디어 리소스를 음소거할지 여부
controls — 사용자 에이전트 컨트롤 표시
loading — 로딩 지연을 결정할 때 사용
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window,
 LegacyFactoryFunction=Audio(optional DOMString src)]
interface HTMLAudioElement : HTMLMediaElement {
  [HTMLConstructor] constructor();
};

audio 요소는 소리 또는 오디오 스트림을 나타낸다.

audio 요소 안에 콘텐츠를 제공할 수 있다. 사용자 에이전트는 이 콘텐츠를 사용자에게 표시하지 않아야 한다. 이 콘텐츠는 audio를 지원하지 않는 오래된 웹 브라우저를 위한 것으로, 이러한 브라우저의 사용자에게 오디오 콘텐츠에 접근하는 방법을 알려 주는 텍스트를 표시할 수 있게 한다.

특히 이 콘텐츠는 접근성 문제를 해결하기 위한 것이 아니다. 청각 장애인이나 그 밖의 신체적 또는 인지적 장애가 있는 사용자가 오디오 콘텐츠에 접근할 수 있도록 다양한 기능을 사용할 수 있다. 자막이나 수어 비디오를 사용할 수 있으면 audio 요소 대신 video 요소를 사용하여 오디오를 재생함으로써 사용자가 시각적 대체물을 활성화할 수 있다. 내비게이션을 돕기 위해 track 요소와 WebVTT 파일을 사용하여 장 제목을 제공할 수 있다. 그리고 당연히 audio 요소 근처의 본문에서 대본이나 다른 텍스트 대체물로 링크하기만 하면 된다. [WEBVTT]

audio 요소는 미디어 데이터가 표면상 오디오 데이터인 미디어 요소이다.

audio 요소에는 slot 요소가 없는 내부 섀도 트리가 있다.

src, crossorigin, preload, autoplay, loop, muted, controlsloading 속성은 모든 미디어 요소에 공통인 속성이다.

audio 요소에 controls 속성이 없으면 사용자 에이전트가 표시하지 않으므로 지연 로딩할 수 없다.

<audio src="1.mp3" type="audio/mpeg" controls>
<audio src="2.mp3" type="audio/mpeg" controls loading="eager">
<audio src="3.mp3" type="audio/mpeg" controls loading="lazy">
<audio src="4.mp3" type="audio/mpeg" controls loading="lazy" autoplay>
<div id="very-large"></div> <!-- Everything after this div is below the viewport -->
<audio src="5.mp3" type="audio/mpeg" controls>
<audio src="6.mp3" type="audio/mpeg" controls loading="lazy">
<audio src="7.mp3" type="audio/mpeg" controls autoplay loading="lazy">
<audio src="8.mp3" type="audio/mpeg" controls preload="metadata" loading="lazy">

위 예제에서 오디오 파일은 다음과 같이 로드된다:

1.mp3, 2.mp3, 5.mp3

오디오 파일은 즉시 로드되며 창의 load 이벤트를 지연한다.

3.mp3

오디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되지만, 창의 load 이벤트를 지연하지 않는다.

4.mp3

오디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되고 자동 재생이 시작되지만, 창의 load 이벤트를 지연하지 않는다.

6.mp3

오디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.

7.mp3

오디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되고 자동 재생이 시작되며, 창의 load 이벤트를 지연하지 않는다.

8.mp3

오디오의 메타데이터는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.

audio = new Audio([ url ])

HTMLAudioElement/Audio

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

해당하는 경우 인수로 전달한 값으로 src 속성이 설정된 새로운 audio 요소를 반환한다.

HTMLAudioElement 객체를 생성하기 위해 DOM의 createElement()와 같은 팩터리 메서드에 더하여 레거시 팩터리 함수 Audio(src)가 제공된다. 호출되면 레거시 팩터리 함수는 다음 단계를 수행해야 한다:

  1. document현재 전역 객체연결된 Document로 둔다.

  2. audiodocument, "audio" 및 HTML 네임스페이스가 주어졌을 때 요소를 생성한 결과로 둔다.

  3. "preload"와 "auto"를 사용하여 audio속성 값을 설정한다.

  4. src가 주어진 경우 "src"와 src를 사용하여 audio속성 값을 설정한다. (이로 인해 반환하기 전에 사용자 에이전트가 객체의 리소스 선택 알고리즘호출하게 된다.)

  5. audio를 반환한다.

4.8.10 track 요소

Element/track

현재의 모든 엔진에서 지원된다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android25+WebView Android?Samsung Internet?Opera Android12.1+

HTMLTrackElement

현재의 모든 엔진에서 지원된다.

Firefox31+Safari6+Chrome23+
Opera12+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+

HTMLTrackElement/src

현재의 모든 엔진에서 지원된다.

Firefox31+Safari6+Chrome23+
Opera12+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+
범주:
없음.
이 요소를 사용할 수 있는 맥락:
미디어 요소의 자식으로서, 모든 플로 콘텐츠보다 앞.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그 없음.
콘텐츠 속성:
전역 속성
kind — 텍스트 트랙의 유형
src — 리소스의 주소
srclang — 텍스트 트랙의 언어
label — 사용자에게 표시되는 레이블
default — 다른 텍스트 트랙이 더 적합하지 않으면 트랙 활성화
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLTrackElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions] attribute DOMString kind;
  [CEReactions, ReflectURL] attribute USVString src;
  [CEReactions, Reflect] attribute DOMString srclang;
  [CEReactions, Reflect] attribute DOMString label;
  [CEReactions, Reflect] attribute boolean default;

  const unsigned short NONE = 0;
  const unsigned short LOADING = 1;
  const unsigned short LOADED = 2;
  const unsigned short ERROR = 3;
  readonly attribute unsigned short readyState;

  readonly attribute TextTrack track;
};

track 요소를 사용하면 작성자가 미디어 요소를 위한 명시적인 외부 시간 지정 텍스트 트랙을 지정할 수 있다. 이 요소는 그 자체로는 아무것도 나타내지 않는다.

kind 속성은 다음 키워드와 상태를 갖는 열거형 속성이다:

키워드 상태 간략한 설명
subtitles 자막 소리는 들리지만 이해할 수 없는 경우에 적합한 대화의 전사 또는 번역 (예: 사용자가 미디어 리소스 오디오 트랙의 언어를 이해하지 못하는 경우). 비디오 위에 오버레이된다.
captions 폐쇄 자막 소리를 사용할 수 없거나 명확하게 들을 수 없는 경우에 적합한 대화, 음향 효과, 관련 음악 신호 및 그 밖의 관련 오디오 정보의 전사 또는 번역 (예: 음소거되었거나 주변 소음에 묻혔거나 사용자가 청각 장애인인 경우). 비디오 위에 오버레이되며 난청인에게 적합한 것으로 레이블된다.
descriptions 설명 시각적 구성 요소가 가려졌거나 사용할 수 없거나 사용할 수 없는 경우 오디오 합성을 위해 의도된 미디어 리소스의 비디오 구성 요소에 대한 텍스트 설명 (예: 사용자가 운전 중 화면 없이 애플리케이션과 상호작용하거나 사용자가 시각 장애인인 경우). 오디오로 합성된다.
chapters 장 메타데이터 스크립트에서 사용하도록 의도된 트랙. 사용자 에이전트가 표시하지 않는다.
metadata 메타데이터

속성의 누락 값 기본값자막 상태이고, 유효하지 않은 값 기본값메타데이터 상태이다.

src 속성은 텍스트 트랙 데이터의 URL을 제공한다. 값은 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL이어야 한다. 이 속성은 반드시 존재해야 한다.

요소에는 연결된 트랙 URL(문자열)이 있으며 처음에는 빈 문자열이다.

요소의 src 속성이 설정되면 다음 단계를 실행한다:

  1. trackURL을 실패로 둔다.

  2. value를 요소의 src 속성 값으로 둔다.

  3. value가 빈 문자열이 아니면 trackURLvalue와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 설정한다.

  4. trackURL이 실패가 아니면 요소의 트랙 URLtrackURL로 설정하고, 그렇지 않으면 빈 문자열로 설정한다.

요소의 트랙 URL이 WebVTT 리소스를 식별하고, 요소의 kind 속성이 장 메타데이터 또는 메타데이터 상태가 아니면 WebVTT 파일은 큐 텍스트를 사용하는 WebVTT 파일이어야 한다. [WEBVTT]

srclang 속성은 텍스트 트랙 데이터의 언어를 제공한다. 값은 유효한 BCP 47 언어 태그여야 한다. 요소의 kind 속성이 자막 상태이면 이 속성이 반드시 존재해야 한다. [BCP47]

요소에 값이 빈 문자열이 아닌 srclang 속성이 있으면 요소의 트랙 언어는 그 속성 값이다. 그렇지 않으면 요소에는 트랙 언어가 없다.

label 속성은 사용자가 읽을 수 있는 트랙의 제목을 제공한다. 사용자 에이전트는 사용자 인터페이스에 자막, 폐쇄 자막오디오 설명 트랙을 나열할 때 이 제목을 사용한다.

label 속성이 존재하는 경우 그 값은 빈 문자열이어서는 안 된다. 또한 동일한 미디어 요소track 자식 요소 둘이, kind 속성이 동일한 상태이고, srclang 속성이 둘 다 없거나 동일한 언어를 나타내는 값을 가지며, label 속성도 둘 다 없거나 동일한 값을 가져서는 안 된다.

요소에 값이 빈 문자열이 아닌 label 속성이 있으면 요소의 트랙 레이블은 그 속성 값이다. 그렇지 않으면 요소의 트랙 레이블은 빈 문자열이다.

default 속성은 불리언 속성이며, 지정된 경우 사용자의 환경설정에서 다른 트랙이 더 적합하다고 나타내지 않으면 해당 트랙을 활성화해야 함을 나타낸다.

미디어 요소에는 kind 속성이 자막 또는 폐쇄 자막 상태이고 default 속성이 지정된 track 자식 요소가 하나를 초과해서는 안 된다.

미디어 요소에는 kind 속성이 설명 상태이고 default 속성이 지정된 track 자식 요소가 하나를 초과해서는 안 된다.

미디어 요소에는 kind 속성이 장 메타데이터 상태이고 default 속성이 지정된 track 자식 요소가 하나를 초과해서는 안 된다.

kind 속성이 메타데이터 상태이고 default 속성이 지정된 track 요소의 수에는 제한이 없다.

track.readyState

다음 목록의 숫자로 나타낸 텍스트 트랙 준비 상태를 반환한다:

track.NONE (0)

텍스트 트랙이 로드되지 않음 상태.

track.LOADING (1)

텍스트 트랙 로딩 중 상태.

track.LOADED (2)

텍스트 트랙이 로드됨 상태.

track.ERROR (3)

텍스트 트랙 로드 실패 상태.

track.track

track 요소의 텍스트 트랙을 반환한다.

readyState 속성은 다음 목록에 정의된 대로 track 요소의 텍스트 트랙텍스트 트랙 준비 상태에 해당하는 숫자 값을 반환해야 한다:

NONE (숫자 값 0)
텍스트 트랙이 로드되지 않음 상태.
LOADING (숫자 값 1)
텍스트 트랙 로딩 중 상태.
LOADED (숫자 값 2)
텍스트 트랙이 로드됨 상태.
ERROR (숫자 값 3)
텍스트 트랙 로드 실패 상태.

track getter 단계는 this텍스트 트랙을 반환하는 것이다.

kind IDL 속성은 같은 이름의 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

이 비디오에는 여러 언어의 자막이 있다:

<video src="brave.webm">
 <track kind=subtitles src=brave.en.vtt srclang=en label="English">
 <track kind=captions src=brave.en.hoh.vtt srclang=en label="English for the Hard of Hearing">
 <track kind=subtitles src=brave.fr.vtt srclang=fr lang=fr label="Français">
 <track kind=subtitles src=brave.de.vtt srclang=de lang=de label="Deutsch">
</video>

(마지막 두 요소의 lang 속성은 자막 자체의 언어가 아니라 label 속성의 언어를 설명한다. 자막의 언어는 srclang 속성으로 제공된다.)

4.8.11 미디어 요소

HTMLMediaElement 객체(이 명세에서는 audiovideo)는 간단히 미디어 요소라고 한다.

HTMLMediaElement

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+

HTMLMediaElement/src

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLMediaElement/autoplay

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLMediaElement/loop

현재의 모든 엔진에서 지원된다.

Firefox11+Safari4+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLMediaElement/controls

현재의 모든 엔진에서 지원된다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLMediaElement/defaultMuted

현재의 모든 엔진에서 지원된다.

Firefox11+Safari6+Chrome15+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
enum CanPlayTypeResult { "" /* empty string */, "maybe", "probably" };
typedef (MediaStream or MediaSource or Blob) MediaProvider;

[Exposed=Window]
interface HTMLMediaElement : HTMLElement {

  // error state
  readonly attribute MediaError? error;

  // network state
  [CEReactions, ReflectURL] attribute USVString src;
  attribute MediaProvider? srcObject;
  readonly attribute USVString currentSrc;
  [CEReactions] attribute DOMString? crossOrigin;
  const unsigned short NETWORK_EMPTY = 0;
  const unsigned short NETWORK_IDLE = 1;
  const unsigned short NETWORK_LOADING = 2;
  const unsigned short NETWORK_NO_SOURCE = 3;
  readonly attribute unsigned short networkState;
  [CEReactions] attribute DOMString preload;
  readonly attribute TimeRanges buffered;
  undefined load();
  CanPlayTypeResult canPlayType(DOMString type);

  // ready state
  const unsigned short HAVE_NOTHING = 0;
  const unsigned short HAVE_METADATA = 1;
  const unsigned short HAVE_CURRENT_DATA = 2;
  const unsigned short HAVE_FUTURE_DATA = 3;
  const unsigned short HAVE_ENOUGH_DATA = 4;
  readonly attribute unsigned short readyState;
  readonly attribute boolean seeking;

  // playback state
  attribute double currentTime;
  undefined fastSeek(double time);
  readonly attribute unrestricted double duration;
  object getStartDate();
  readonly attribute boolean paused;
  attribute double defaultPlaybackRate;
  attribute double playbackRate;
  attribute boolean preservesPitch;
  readonly attribute TimeRanges played;
  readonly attribute TimeRanges seekable;
  readonly attribute boolean ended;
  [CEReactions, Reflect] attribute boolean autoplay;
  [CEReactions, Reflect] attribute boolean loop;
  Promise<undefined> play();
  undefined pause();

  // controls
  [CEReactions, Reflect] attribute boolean controls;
  attribute double volume;
  attribute boolean muted;
  [CEReactions, Reflect="muted"] attribute boolean defaultMuted;
  [CEReactions] attribute DOMString loading;

  // tracks
  [SameObject] readonly attribute AudioTrackList audioTracks;
  [SameObject] readonly attribute VideoTrackList videoTracks;
  [SameObject] readonly attribute TextTrackList textTracks;
  TextTrack addTextTrack(TextTrackKind kind, optional DOMString label = "", optional DOMString language = "");
};

미디어 요소 속성src, crossorigin, preload, autoplay, loop, muted, controlsloading은 모든 미디어 요소에 적용된다. 이들은 이 절에서 정의된다.

loading 속성은 지연 로딩 속성이다. 그 목적은 뷰포트 밖에 있는 미디어 리소스의 로딩 정책을 나타내는 것이다.

loading 속성의 상태가 즉시 로드 상태로 변경되면 사용자 에이전트는 다음 단계를 실행해야 한다:

  1. resumptionSteps미디어 요소지연 로딩 재개 단계로 둔다.

  2. posterResumptionSteps를 null로 둔다.

    미디어 요소video 요소이면 posterResumptionStepsvideo 요소의 포스터 지연 로딩 재개 단계로 설정한다.

  3. resumptionSteps가 null이고 posterResumptionSteps도 null이면 반환한다.

  4. resumptionSteps가 null이 아니면:

    1. 미디어 요소지연 로딩 재개 단계를 null로 설정한다.

    2. resumptionSteps를 호출한다.

  5. posterResumptionSteps가 null이 아니면:

    1. video 요소의 포스터 지연 로딩 재개 단계를 null로 설정한다.

    2. posterResumptionSteps를 호출한다.

loading IDL 속성은 loading 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 한다.

loading 속성이 지연 상태이면 데이터 가져오기를 지연함으로써 preload 속성보다 우선한다.

autoplay 속성이 존재하고 loading 속성이 지연 상태이면 사용자 에이전트는 요소의 지연 로딩 재개 단계가 호출될 때까지 재생 시작(및 autoplay가 발생시킬 수 있는 관련 네트워크 요청)도 지연해야 한다.

미디어 요소는 오디오 데이터 또는 비디오와 오디오 데이터를 사용자에게 제공하는 데 사용된다. 이 절은 오디오 또는 비디오용 미디어 요소에 동일하게 적용되므로 이 절에서는 이를 미디어 데이터라고 한다. 미디어 리소스라는 용어는 완전한 비디오 파일이나 완전한 오디오 파일과 같은 미디어 데이터의 전체 집합을 가리키는 데 사용된다.

미디어 리소스에는 연결된 출처가 있으며, 이는 "none", "multiple", "rewritten" 또는 출처이다. 처음에는 "none"으로 설정된다.

미디어 리소스에는 여러 오디오 및 비디오 트랙이 있을 수 있다. 미디어 요소의 목적상 미디어 리소스의 비디오 데이터는 이벤트 루프가 마지막으로 단계 1에 도달했을 때 요소의 videoTracks 속성이 제공한 현재 선택된 트랙(있는 경우)의 데이터뿐이고, 미디어 리소스의 오디오 데이터는 이벤트 루프가 마지막으로 단계 1에 도달했을 때 요소의 audioTracks 속성이 제공한 현재 활성화된 모든 트랙(있는 경우)을 혼합한 결과이다.

audiovideo 요소는 모두 오디오와 비디오에 사용할 수 있다. 둘 사이의 주요 차이는 단순히 audio 요소에는 시각적 콘텐츠(예: 비디오 또는 자막)를 위한 재생 영역이 없지만 video 요소에는 있다는 점이다.

미디어 요소에는 고유한 미디어 요소 이벤트 태스크 소스가 있다.

미디어 요소 element와 일련의 단계 steps를 사용하여 미디어 요소 태스크를 큐에 넣으려면, elementsteps가 주어졌을 때 미디어 요소미디어 요소 이벤트 태스크 소스에서 요소 태스크를 큐에 넣는다.

4.8.11.1 오류 코드

MediaError

현재 모든 엔진에서 지원됩니다.

Firefox4+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+
media.error

HTMLMediaElement/error

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

요소의 현재 오류 상태를 나타내는 MediaError 객체를 반환합니다.

오류가 없으면 null을 반환합니다.

모든 미디어 요소에는 연관된 오류 상태가 있으며, 이 상태는 요소의 리소스 선택 알고리즘이 마지막으로 호출된 이후 요소가 마주친 마지막 오류를 기록합니다. error 속성은 가져올 때 이 마지막 오류를 위해 생성된 MediaError 객체를 반환해야 하며, 오류가 발생하지 않았다면 null을 반환해야 합니다.

[Exposed=Window]
interface MediaError {
  const unsigned short MEDIA_ERR_ABORTED = 1;
  const unsigned short MEDIA_ERR_NETWORK = 2;
  const unsigned short MEDIA_ERR_DECODE = 3;
  const unsigned short MEDIA_ERR_SRC_NOT_SUPPORTED = 4;

  readonly attribute unsigned short code;
  readonly attribute DOMString message;
};
media.error.code

MediaError/code

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

아래 목록에서 현재 오류의 오류 코드를 반환합니다.

media.error.message

MediaError/message

현재 모든 엔진에서 지원됩니다.

Firefox52+Safari15+Chrome59+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

발생한 오류 조건에 관한 구체적이고 유용한 진단 메시지를 반환합니다. 메시지와 메시지 형식은 일반적으로 서로 다른 사용자 에이전트 간에 동일하지 않습니다. 이러한 메시지를 사용할 수 없으면 빈 문자열을 반환합니다.

모든 MediaError 객체에는 문자열인 메시지와 다음 중 하나인 코드가 있습니다.

MEDIA_ERR_ABORTED (숫자 값 1)
미디어 리소스의 가져오기 과정이 사용자의 요청에 따라 사용자 에이전트에 의해 중단되었습니다.
MEDIA_ERR_NETWORK (숫자 값 2)
리소스를 사용할 수 있음이 확인된 후, 어떤 종류의 네트워크 오류로 인해 사용자 에이전트가 미디어 리소스 가져오기를 중지했습니다.
MEDIA_ERR_DECODE (숫자 값 3)
리소스를 사용할 수 있음이 확인된 후, 미디어 리소스를 디코딩하는 동안 어떤 종류의 오류가 발생했습니다.
MEDIA_ERR_SRC_NOT_SUPPORTED (숫자 값 4)
src 속성 또는 할당된 미디어 제공자 객체가 나타내는 미디어 리소스가 적합하지 않았습니다.

위 값 중 하나인 오류 코드가 주어졌을 때 MediaError를 생성하려면, 코드가 주어진 오류 코드이고 메시지가 오류 조건의 원인에 관해 사용자 에이전트가 제공할 수 있는 모든 세부 정보를 포함하는 문자열인 새로운 MediaError 객체를 반환합니다. 사용자 에이전트가 이러한 세부 정보를 제공할 수 없으면 메시지는 빈 문자열입니다. 이 메시지 문자열에는 제공된 오류 코드를 통해 이미 알 수 있는 정보만 포함되어서는 안 됩니다. 예를 들어, 단순히 코드를 문자열 형식으로 번역한 것이어서는 안 됩니다. 오류 코드가 제공하는 정보 외에 추가 정보를 사용할 수 없다면 메시지를 빈 문자열로 설정해야 합니다.

code getter 단계는 this코드를 반환하는 것입니다.

message getter 단계는 this메시지를 반환하는 것입니다.

4.8.11.2 미디어 리소스의 위치

미디어 요소src 콘텐츠 속성은 표시할 미디어 리소스 (비디오, 오디오)의 URL을 제공합니다. 이 속성이 존재한다면 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL을 포함해야 합니다.

미디어 요소itemprop 속성이 지정된 경우, src 속성도 지정되어야 합니다.

미디어 요소crossorigin 콘텐츠 속성은 CORS 설정 속성입니다.

미디어 요소src 속성과 함께 생성되면, 사용자 에이전트는 즉시 해당 미디어 요소리소스 선택 알고리즘을 호출해야 합니다.

미디어 요소src 속성이 설정되거나 변경되면, 사용자 에이전트는 해당 미디어 요소미디어 요소 로드 알고리즘을 호출해야 합니다. (source 요소가 존재하더라도 src 속성을 제거하는 경우에는 이렇게 하지 않습니다.)

HTMLMediaElement/crossOrigin

현재 모든 엔진에서 지원됩니다.

Firefox22+Safari10+Chrome33+
Opera?Edge79+
Edge (Legacy)13+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

crossOrigin IDL 속성은 알려진 값으로만 제한하여 crossorigin 콘텐츠 속성을 반영해야 합니다.

미디어 제공자 객체URL과 별도로 미디어 리소스를 나타낼 수 있는 객체입니다. MediaStream 객체, MediaSource 객체 및 Blob 객체는 모두 미디어 제공자 객체입니다.

미디어 요소에는 할당된 미디어 제공자 객체가 있으며, 이는 미디어 제공자 객체 또는 null이고, 초기값은 null입니다.

media.srcObject [ = source ]

HTMLMediaElement/srcObject

하나의 엔진에서만 지원됩니다.

Firefox🔰 42+Safari11+Chrome🔰 108+
Opera?Edge🔰 108+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

미디어 요소미디어 제공자 객체를 할당할 수 있게 합니다.

media.currentSrc

HTMLMediaElement/currentSrc

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

현재 미디어 리소스가 존재하는 경우 그 URL을 반환합니다.

미디어 리소스가 없거나 URL을 갖지 않으면 빈 문자열을 반환합니다.

currentSrc IDL 속성은 처음에 빈 문자열로 설정되어야 합니다. 그 값은 아래에 정의된 리소스 선택 알고리즘에 의해 변경됩니다.

srcObject getter 단계는 this할당된 미디어 제공자 객체를 반환하는 것입니다.

srcObject setter 단계는 다음과 같습니다.

  1. this할당된 미디어 제공자 객체를 주어진 값으로 설정합니다.

  2. this미디어 요소 로드 알고리즘을 호출합니다.

미디어 리소스를 지정하는 방법에는 세 가지가 있습니다. srcObject IDL 속성, src 콘텐츠 속성, 그리고 source 요소입니다. IDL 속성이 가장 높은 우선순위를 가지며, 그다음은 콘텐츠 속성이고, 그다음은 요소입니다.

4.8.11.3 MIME 유형

미디어 리소스는 그 유형, 구체적으로는 경우에 따라 codecs 매개변수를 포함하는 MIME 유형으로 설명할 수 있습니다. (codecs 매개변수의 허용 여부는 MIME 유형에 따라 달라집니다.) [RFC6381]

유형은 일반적으로 다소 불완전한 설명입니다. 예를 들어 "video/mpeg"은 컨테이너 유형 외에는 아무것도 알려주지 않으며, "video/mp4; codecs="avc1.42E01E, mp4a.40.2"" 같은 유형조차 실제 비트 전송률과 같은 정보는 포함하지 않습니다(최대 비트 전송률만 포함합니다). 따라서 유형이 주어지면 사용자 에이전트는 흔히 그 유형의 미디어를 재생할 수 있을 가능성이 있는지 (신뢰도는 다양할 수 있음), 또는 그 유형의 미디어를 확실히 재생할 수 없는지만 알 수 있습니다.

사용자 에이전트가 렌더링할 수 없음을 알고 있는 유형은, 예를 들어 컨테이너 유형을 인식하지 못하거나 나열된 코덱을 지원하지 않기 때문에 사용자 에이전트가 확실히 지원하지 않는 리소스를 설명하는 유형입니다.

매개변수가 없는 MIME 유형 "application/octet-stream"은 절대로 사용자 에이전트가 렌더링할 수 없음을 알고 있는 유형이 아닙니다. 사용자 에이전트는 잠재적인 미디어 리소스에 이 유형이 표시된 경우, 이를 명시적인 Content-Type 메타데이터가 없는 것과 동등하게 취급해야 합니다.

여기서는 매개변수가 없는 MIME 유형 "application/octet-stream"만 특별하게 처리됩니다. 매개변수가 하나라도 있으면 다른 모든 MIME 유형과 동일하게 취급됩니다. 이는 알 수 없는 MIME 유형 매개변수를 무시해야 한다는 규칙에서 벗어나는 것입니다.

media.canPlayType(type)

HTMLMediaElement/canPlayType

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari4+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

사용자 에이전트가 주어진 유형의 미디어 리소스를 재생할 수 있다고 얼마나 확신하는지에 따라 빈 문자열(부정적인 응답), "maybe" 또는 "probably"를 반환합니다.

canPlayType(type) 메서드는 type사용자 에이전트가 렌더링할 수 없음을 알고 있는 유형이거나 유형 "application/octet-stream"이면 빈 문자열을 반환해야 합니다. 사용자 에이전트가 그 유형이 이 audio 또는 video 요소와 함께 사용할 때 렌더링할 수 있는 미디어 리소스를 나타낸다고 확신한다면 "probably"를 반환해야 하며, 그 외의 경우에는 "maybe"를 반환해야 합니다. 구현자는 해당 유형이 지원되거나 지원되지 않는다고 확실하게 판단할 수 없는 한 "maybe"를 반환하는 것이 권장됩니다. 일반적으로 사용자 에이전트는 codecs 매개변수를 허용하는 유형에 해당 매개변수가 존재하지 않는다면 "probably"를 반환해서는 안 됩니다.

이 스크립트는 사용자 에이전트가 (가상의) 새로운 형식을 지원하는지 테스트하여 video 요소를 사용할지 동적으로 결정합니다.

<section id="video">
 <p><a href="playing-cats.nfv">Download video</a></p>
</section>
<script>
 const videoSection = document.getElementById('video');
 const videoElement = document.createElement('video');
 const support = videoElement.canPlayType('video/x-new-fictional-format;codecs="kittens,bunnies"');
 if (support === "probably") {
   videoElement.setAttribute("src", "playing-cats.nfv");
   videoSection.replaceChildren(videoElement);
 }
</script>

source 요소의 type 속성을 사용하면 사용자 에이전트가 렌더링할 수 없는 형식을 사용하는 리소스의 다운로드를 피할 수 있습니다.

4.8.11.4 네트워크 상태
media.networkState

HTMLMediaElement/networkState

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android4+Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

아래 목록의 코드 중 하나로 요소의 현재 네트워크 활동 상태를 반환합니다.

미디어 요소가 네트워크와 상호 작용할 때, 현재 네트워크 활동은 networkState 속성으로 나타냅니다. 가져올 때 이 속성은 다음 값 중 하나여야 하는 요소의 현재 네트워크 상태를 반환해야 합니다.

NETWORK_EMPTY (숫자 값 0)
요소가 아직 초기화되지 않았습니다. 모든 속성이 초기 상태입니다.
NETWORK_IDLE (숫자 값 1)
요소의 리소스 선택 알고리즘이 활성 상태이고 리소스를 선택했지만, 현재 실제로 네트워크를 사용하고 있지는 않습니다.
NETWORK_LOADING (숫자 값 2)
사용자 에이전트가 데이터를 다운로드하려고 적극적으로 시도하고 있습니다.
NETWORK_NO_SOURCE (숫자 값 3)
요소의 리소스 선택 알고리즘이 활성 상태이지만, 사용할 리소스를 아직 찾지 못했습니다.

아래에 정의된 리소스 선택 알고리즘networkState 속성 값이 정확히 언제 변경되는지와 이 상태의 변경을 나타내기 위해 어떤 이벤트가 발생하는지를 설명합니다.

4.8.11.5 미디어 리소스 로드
media.load()

HTMLMediaElement/load

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

요소를 재설정하고 새로운 미디어 리소스를 처음부터 선택하고 로드하기 시작하게 합니다.

모든 미디어 요소에는 자동 재생 가능 플래그가 있으며, 이 플래그는 true 상태로 시작해야 합니다. 또한 load 이벤트 지연 플래그가 있으며, 이 플래그는 false 상태로 시작해야 합니다. load 이벤트 지연 플래그가 true인 동안 요소는 문서의 load 이벤트를 지연해야 합니다.

미디어 요소load() 메서드가 호출되면 사용자 에이전트는 다음 단계를 실행해야 합니다.

  1. resumptionSteps미디어 요소지연 로드 재개 단계로 둡니다.

  2. resumptionSteps가 null이 아니면 다음을 수행합니다.

    1. 미디어 요소지연 로드 재개 단계를 null로 설정합니다.

    2. resumptionSteps를 호출합니다.

  3. 미디어 요소 로드 알고리즘을 실행합니다.

미디어 요소에는 연관된 불리언 현재 정지됨이 있으며, 초기값은 false입니다.

미디어 요소 로드 알고리즘은 다음 단계로 구성됩니다.

  1. 이 요소의 현재 정지됨을 false로 설정합니다.

  2. 이 요소에 대해 이미 실행 중인 리소스 선택 알고리즘의 모든 인스턴스를 중단합니다.

  3. pending tasks태스크 큐 중 하나에 있는 미디어 요소미디어 요소 이벤트 태스크 소스에서 온 모든 태스크의 목록으로 둡니다.

  4. pending tasks의 각 태스크 중 대기 중인 재생 프로미스를 이행하거나 대기 중인 재생 프로미스를 거부하려는 태스크마다, 해당 태스크가 큐에 추가된 순서대로 그 프로미스를 즉시 이행하거나 거부합니다.

  5. pending tasks의 각 태스크를 해당 태스크 큐에서 제거합니다.

    기본적으로 미디어 요소가 새로운 리소스를 로드하기 시작하면 대기 중인 이벤트와 콜백은 폐기되며, 이행 또는 거부가 진행 중인 프로미스는 즉시 이행되거나 거부됩니다.

  6. 미디어 요소networkStateNETWORK_LOADING 또는 NETWORK_IDLE로 설정되어 있으면, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 abort라는 이름의 이벤트를 발생시킵니다.

  7. 미디어 요소networkStateNETWORK_EMPTY로 설정되어 있지 않으면 다음을 수행합니다.

    1. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 emptied라는 이름의 이벤트를 발생시킵니다.

    2. 미디어 요소에 대해 가져오기 과정이 진행 중이라면 사용자 에이전트는 이를 중지하는 것이 좋습니다.

    3. 미디어 요소할당된 미디어 제공자 객체MediaSource 객체이면, 이를 분리합니다.

    4. 미디어 요소의 미디어 리소스별 트랙을 잊습니다.

    5. readyStateHAVE_NOTHING로 설정되어 있지 않으면 해당 상태로 설정합니다.

    6. paused 속성이 false이면 다음을 수행합니다.

      1. paused 속성을 true로 설정합니다.

      2. 대기 중인 재생 프로미스를 가져오고, 그 결과와 "AbortError" DOMException을 사용하여 대기 중인 재생 프로미스를 거부합니다.

    7. seeking이 true이면 false로 설정합니다.

    8. 현재 재생 위치를 0으로 설정합니다.

      공식 재생 위치를 0으로 설정합니다.

      이로 인해 공식 재생 위치가 변경되었다면, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 timeupdate라는 이름의 이벤트를 발생시킵니다.

    9. 타임라인 오프셋을 Not-a-Number(NaN)로 설정합니다.

    10. duration 속성을 Not-a-Number(NaN)로 업데이트합니다.

      사용자 에이전트는 이 특정 재생 시간 변경에 대해 durationchange 이벤트를 발생시키지 않습니다.

  8. playbackRate 속성을 defaultPlaybackRate 속성의 값으로 설정합니다.

  9. error 속성을 null로 설정하고, 자동 재생 가능 플래그를 true로 설정합니다.

  10. 미디어 요소리소스 선택 알고리즘을 호출합니다.

  11. 이 요소에서 이전에 재생 중이던 모든 미디어 리소스의 재생이 중지됩니다.

미디어 요소리소스 선택 알고리즘은 다음과 같습니다. 이 알고리즘은 항상 태스크의 일부로 호출되지만, 알고리즘의 첫 단계 중 하나에서 반환한 뒤 나머지 단계를 병렬로 계속 실행합니다. 또한 이 알고리즘은 이벤트 루프 메커니즘과 긴밀하게 상호 작용합니다. 특히 이 알고리즘에는 이벤트 루프 알고리즘의 일부로 트리거되는 동기 구간이 있습니다. 이러한 구간의 단계는 ⌛로 표시됩니다.

  1. 요소의 networkState 속성을 NETWORK_NO_SOURCE 값으로 설정합니다.

  2. 요소의 포스터 표시 플래그를 true로 설정합니다.

  3. 미디어 요소지연 로딩 속성Eager 상태이거나 스크립팅이 비활성화되어 있으면, 미디어 요소load 이벤트 지연 플래그를 true로 설정합니다(이는 load 이벤트를 지연합니다).

  4. 이 알고리즘을 호출한 태스크가 계속 진행할 수 있도록 안정 상태를 기다립니다. 동기 구간은 알고리즘이 동기 구간이 끝났다고 말할 때까지 이 알고리즘의 남은 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)

  5. 미디어 요소파서에 의해 차단됨 플래그가 false이면, 대기 중인 텍스트 트랙 목록을 채웁니다.

  6. mode를 null로 둡니다.

  7. candidate를 null로 둡니다.

  8. 미디어 요소할당된 미디어 제공자 객체가 null이 아니면 modeobject로 설정합니다.

  9. ⌛ 그렇지 않고 미디어 요소src 속성이 있으면 modeattribute로 설정합니다.

  10. ⌛ 그렇지 않고 미디어 요소source 요소 자식이 있으면, modechildren으로 설정하고 candidate트리 순서에서 첫 번째 source 요소 자식으로 설정합니다.

  11. ⌛ 그렇지 않으면 다음을 수행합니다.

    1. networkStateNETWORK_EMPTY로 설정합니다.

    2. ⌛ 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

    3. 동기 구간을 끝내고 반환합니다.

  12. 미디어 요소networkStateNETWORK_LOADING으로 설정합니다.

  13. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 loadstart라는 이름의 이벤트를 발생시킵니다.

  14. 다음 목록에서 적절한 단계를 실행합니다.

    modeobject인 경우
    1. currentSrc 속성을 빈 문자열로 설정합니다.

    2. 동기 구간을 끝내고, 나머지 단계를 병렬로 계속합니다.

    3. 할당된 미디어 제공자 객체를 사용하여 리소스 가져오기 알고리즘을 실행합니다. 해당 알고리즘이 알고리즘을 중단하지 않고 반환하면 로드가 실패한 것입니다.

    4. 미디어 제공자에서 실패: 이 단계에 도달했다는 것은 미디어 리소스 로드가 실패했음을 나타냅니다. 대기 중인 재생 프로미스를 가져오고, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 그 결과와 함께 전용 미디어 소스 실패 단계를 실행합니다.

    5. 이전 단계에서 큐에 추가한 태스크가 실행될 때까지 기다립니다.

    6. 반환합니다. 이 알고리즘이 다시 트리거될 때까지 요소는 다른 리소스의 로드를 시도하지 않습니다.

    modeattribute인 경우
    1. src 속성 값이 빈 문자열이면 동기 구간을 끝내고 아래의 속성에서 실패 단계로 이동합니다.

    2. urlRecordsrc 속성 값과, src 속성이 마지막으로 변경되었을 때의 미디어 요소노드 문서를 기준으로 URL을 인코딩 파싱한 결과로 둡니다.

    3. urlRecord가 실패가 아니면, currentSrc 속성을 urlRecordURL 직렬 변환기를 적용한 결과로 설정합니다.

    4. 동기 구간을 끝내고, 나머지 단계를 병렬로 계속합니다.

    5. urlRecord가 실패가 아니면, urlRecord를 사용하여 리소스 가져오기 알고리즘을 실행합니다. 해당 알고리즘이 알고리즘을 중단하지 않고 반환하면 로드가 실패한 것입니다.

    6. 속성에서 실패: 이 단계에 도달했다는 것은 미디어 리소스 로드가 실패했거나 urlRecord가 실패임을 나타냅니다. 대기 중인 재생 프로미스를 가져오고, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 그 결과와 함께 전용 미디어 소스 실패 단계를 실행합니다.

    7. 이전 단계에서 큐에 추가한 태스크가 실행될 때까지 기다립니다.

    8. 반환합니다. 이 알고리즘이 다시 트리거될 때까지 요소는 다른 리소스의 로드를 시도하지 않습니다.

    그 외의 경우(modechildren)
    1. pointer미디어 요소의 자식 목록에 있는 인접한 두 노드로 정의되는 위치로 둡니다. 목록의 시작(목록에 자식이 있다면 첫 번째 자식 앞)과 목록의 끝(목록에 자식이 있다면 마지막 자식 뒤)은 각각 독립적인 노드로 취급합니다. 한 노드는 pointer 앞의 노드이고, 다른 노드는 pointer 뒤의 노드입니다. 처음에는 다음 노드가 있다면 candidate 노드와 다음 노드 사이의 위치를 pointer로 두고, 마지막 노드라면 목록의 끝을 pointer로 둡니다.

      노드가 삽입, 제거이동되어 미디어 요소에 들어갈 때, pointer는 다음과 같이 업데이트되어야 합니다.

      새 노드가 pointer를 정의하는 두 노드 사이에 삽입되거나 이동된 경우
      pointerpointer 앞의 노드와 새 노드 사이의 지점으로 둡니다. 즉, pointer에서의 삽입은 pointer 뒤로 이동합니다.
      pointer 앞의 노드가 제거된 경우
      pointerpointer 뒤의 노드와 그 노드 앞의 노드 사이의 지점으로 둡니다. 즉, pointer는 남은 노드에 상대적으로 이동하지 않습니다.
      pointer 뒤의 노드가 제거된 경우
      pointerpointer 앞의 노드와 그 노드 뒤의 노드 사이의 지점으로 둡니다. 앞의 경우와 마찬가지로 pointer는 남은 노드에 상대적으로 이동하지 않습니다.

      다른 변경은 pointer에 영향을 주지 않습니다.

    2. 후보 처리: candidatesrc 속성이 없거나, 그 src 속성 값이 빈 문자열이면 동기 구간을 끝내고, 아래의 요소에서 실패 단계로 이동합니다.

    3. candidate에 값이 환경과 일치하지 않는 media 속성이 있으면 동기 구간을 끝내고, 아래의 요소에서 실패 단계로 이동합니다.

    4. urlRecordcandidatesrc 속성 값과, 해당 src 속성이 마지막으로 변경되었을 때의 candidate노드 문서를 기준으로 URL을 인코딩 파싱한 결과로 둡니다.

    5. urlRecord가 실패이면 동기 구간을 끝내고, 아래의 요소에서 실패 단계로 이동합니다.

    6. candidate에, MIME 유형으로 파싱했을 때 (codecs 매개변수를 정의하는 유형에서는 해당 매개변수에 설명된 코덱 포함) 사용자 에이전트가 렌더링할 수 없음을 알고 있는 유형을 나타내는 값의 type 속성이 있으면 동기 구간을 끝내고, 아래의 요소에서 실패 단계로 이동합니다.

    7. currentSrc 속성을 urlRecordURL 직렬 변환기를 적용한 결과로 설정합니다.

    8. 동기 구간을 끝내고, 나머지 단계를 병렬로 계속합니다.

    9. urlRecord를 사용하여 리소스 가져오기 알고리즘을 실행합니다. 해당 알고리즘이 알고리즘을 중단하지 않고 반환하면 로드가 실패한 것입니다.

    10. 요소에서 실패: 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 candidate에서 error라는 이름의 이벤트를 발생시킵니다.

    11. 안정 상태를 기다립니다. 동기 구간은 알고리즘이 동기 구간이 끝났다고 말할 때까지 이 알고리즘의 남은 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)

    12. 미디어 요소의 미디어 리소스별 트랙을 잊습니다.

    13. 다음 후보 찾기: candidate를 null로 둡니다.

    14. 검색 루프: pointer 뒤의 노드가 목록의 끝이면 아래의 대기 단계로 이동합니다.

    15. pointer 뒤의 노드가 source 요소이면, candidate를 해당 요소로 둡니다.

    16. pointer 앞의 노드가 이제 이전에 pointer 뒤에 있던 노드가 되고, pointer 뒤의 노드가 존재한다면 이전에 pointer 뒤에 있던 노드의 다음 노드가 되도록 pointer를 전진시킵니다.

    17. candidate가 null이면 검색 루프 단계로 돌아갑니다. 그렇지 않으면 후보 처리 단계로 돌아갑니다.

    18. 대기: 요소의 networkState 속성을 NETWORK_NO_SOURCE 값으로 설정합니다.

    19. ⌛ 요소의 포스터 표시 플래그를 true로 설정합니다.

    20. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

    21. 동기 구간을 끝내고, 나머지 단계를 병렬로 계속합니다.

    22. pointer 뒤의 노드가 목록의 끝이 아닌 노드가 될 때까지 기다립니다. (이 단계는 영원히 기다릴 수 있습니다.)

    23. 안정 상태를 기다립니다. 동기 구간은 알고리즘이 동기 구간이 끝났다고 말할 때까지 이 알고리즘의 남은 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)

    24. ⌛ 요소의 load 이벤트 지연 플래그를 다시 true로 설정합니다(아직 발생하지 않았다면 이는 load 이벤트를 다시 지연합니다).

    25. networkState를 다시 NETWORK_LOADING으로 설정합니다.

    26. ⌛ 위의 다음 후보 찾기 단계로 돌아갑니다.

    프로미스 목록 promises가 주어진 전용 미디어 소스 실패 단계는 다음과 같습니다.

    1. error 속성을 MEDIA_ERR_SRC_NOT_SUPPORTEDMediaError를 생성한 결과로 설정합니다.

    2. 미디어 요소의 미디어 리소스별 트랙을 잊습니다.

    3. 요소의 networkState 속성을 NETWORK_NO_SOURCE 값으로 설정합니다.

    4. 요소의 포스터 표시 플래그를 true로 설정합니다.

    5. 미디어 요소에서 error라는 이름의 이벤트를 발생시킵니다.

    6. promises"NotSupportedError" DOMException을 사용하여 대기 중인 재생 프로미스를 거부합니다.

    7. 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

응답 response, 미디어 리소스 resource, 그리고 "entire resource" 또는 (숫자, 숫자 또는 "until end") 튜플 byteRange가 주어졌을 때 미디어 응답을 검증하려면 다음을 수행합니다.

  1. response네트워크 오류이면 false를 반환합니다.

  2. byteRange가 "entire resource"이면 true를 반환합니다.

  3. internalResponseresponse안전하지 않은 응답으로 둡니다.

  4. internalResponse상태가 200이면 true를 반환합니다.

  5. internalResponse상태가 206이 아니면 false를 반환합니다.

  6. internalResponse에서 content-range 값을 추출한 결과가 실패이면 false를 반환합니다.

    추출된 값은 사용되지 않으며, 특히 byteRange와 비교되지도 않습니다. 따라서 이 단계는 `Content-Range` 헤더를 구문적으로 검증하는 역할을 하지만, 응답의 `Content-Range` 값과 요청의 `Range` 값이 일치하지 않더라도 실패로 간주하지 않습니다.

  7. internalResponseURL이 null이면 origin을 "rewritten"으로 두고, 그렇지 않으면 internalResponseURL출처로 둡니다.

  8. previousOriginresource출처로 둡니다.

  9. 다음 중 하나라도 true이면 다음을 수행합니다.

    • previousOrigin이 "none"입니다.

    • originpreviousOrigin이 모두 "rewritten"입니다.

    • originpreviousOrigin출처이고, originpreviousOrigin동일 출처입니다.

    그러면 resource출처origin으로 설정합니다.

    그렇지 않고 responseCORS 교차 출처이면 false를 반환합니다.

    그렇지 않으면 resource출처를 "multiple"로 설정합니다.

    이는 범위 헤더가 있는 불투명 응답을 서로 다른 출처의 다른 응답과 이어 붙여 정보가 유출되는 것을 방지합니다.

  10. true를 반환합니다.

미디어 요소와 주어진 URL 레코드 또는 미디어 제공자 객체를 위한 리소스 가져오기 알고리즘은 다음과 같습니다.

  1. 미디어 요소가 주어졌을 때 요소가 지연 로드될지 결정하는 단계가 true를 반환하면 다음을 수행합니다.

    1. resumptionStepsmode를 remote로 둡니다라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 둡니다.

    2. 미디어 요소지연 로드 재개 단계resumptionSteps로 설정합니다.

    3. 미디어 요소에 대해 지연 로딩 요소의 교차 관찰을 시작합니다.

    4. 반환합니다.

  2. moderemote로 둡니다.

  3. 알고리즘이 미디어 제공자 객체와 함께 호출되었다면 modelocal로 설정합니다.

    그렇지 않으면 다음을 수행합니다.

    1. isTopLevelSelfFetch를 false로 둡니다.

    2. settingsObject미디어 요소노드 문서관련 설정 객체로 둡니다.

    3. global미디어 요소노드 문서관련 전역 객체로 둡니다.

    4. 다음 조건이 모두 true이면 다음을 수행합니다.

      그러면 isTopLevelSelfFetch를 true로 설정합니다.

    5. isTopLevelSelfFetch가 true이면 stringOrEnvironment을 "top-level-self-fetch"로 두고, 그렇지 않으면 settingsObject로 둡니다.

    6. objectURL 레코드blob URL 항목stringOrEnvironment을 사용하여 blob 객체를 얻은 결과로 둡니다.

    7. object미디어 제공자 객체이면 modelocal로 설정합니다.

  4. moderemote이면 current media resource를 이 알고리즘에 전달된 URL 레코드가 제공하는 리소스로 두고, 그렇지 않으면 current media resource미디어 제공자 객체가 제공하는 리소스로 둡니다. 어느 경우든 이제 current media resource는 요소의 미디어 리소스입니다.

  5. 미디어 요소대기 중인 텍스트 트랙 목록이 있다면, 그 목록에서 모든 미디어 리소스별 텍스트 트랙을 제거합니다.

  6. 다음 목록에서 적절한 단계를 실행합니다.

    mode가 remote인 경우
    1. 선택적으로 다음 하위 단계를 실행합니다. 사용자 에이전트가 사용자가 명시적으로 요청할 때까지 리소스 가져오기를 시도하지 않으려는 경우 (예: preload 속성의 none 키워드를 구현하는 방법) 예상되는 동작입니다.

      1. networkStateNETWORK_IDLE로 설정합니다.

      2. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 suspend라는 이름의 이벤트를 발생시킵니다.

      3. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

      4. 태스크가 실행될 때까지 기다립니다.

      5. 구현 정의 이벤트 (예: 사용자가 미디어 요소에 재생 시작을 요청함)를 기다립니다.

      6. 요소의 load 이벤트 지연 플래그를 다시 true로 설정합니다(아직 발생하지 않았다면 이는 load 이벤트를 다시 지연합니다).

      7. networkStateNETWORK_LOADING으로 설정합니다.

    2. 미디어 요소audio 요소이면 destination을 "audio"로 두고, 그렇지 않으면 "video"로 둡니다.

    3. requestcurrent media resourceURL 레코드, destination, 그리고 미디어 요소crossorigin 콘텐츠 속성의 현재 상태가 주어졌을 때 잠재적 CORS 요청을 생성한 결과로 둡니다.

    4. request클라이언트미디어 요소노드 문서관련 설정 객체로 설정합니다.

    5. request개시자 유형destination으로 설정합니다.

    6. byteRange를 "entire resource" 또는 (숫자, 숫자 또는 "until end") 튜플이며, 미디어 데이터에서 누락된 데이터를 충족하는 데 필요한 바이트 범위로 둡니다. 이 값은 구현 정의이며 코덱, 네트워크 상태 또는 다른 휴리스틱에 의존할 수 있습니다. 사용자 에이전트는 리소스 전체를 가져오도록 결정할 수 있으며, 이 경우 byteRange는 "entire resource"가 됩니다. 바이트 오프셋부터 끝까지 가져오도록 결정할 수 있으며, 이 경우 byteRange는 (숫자, "until end")가 됩니다. 또는 두 바이트 오프셋 사이의 범위를 가져오도록 결정할 수 있으며, 이 경우 byteRange는 두 오프셋을 나타내는 (숫자, 숫자) 튜플이 됩니다.

    7. byteRange가 "entire resource"가 아니면 다음을 수행합니다.

      1. byteRange[1]이 "until end"이면, byteRange[0]이 주어졌을 때 request범위 헤더를 추가합니다.

      2. 그렇지 않으면 byteRange[0]과 byteRange[1]이 주어졌을 때 request범위 헤더를 추가합니다.

    8. request가져옵니다. 이때 processResponse를, 응답 response가 주어졌을 때의 다음 단계로 설정합니다.

      1. global미디어 요소노드 문서관련 전역 객체로 둡니다.

      2. updateMedia미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 아래의 미디어 데이터 처리 단계 목록에서 첫 번째로 적절한 단계를 실행하는 것으로 둡니다. (아래 설명된 작업이 네트워킹 태스크 소스를 사용하는 대신 적절한 미디어 요소 이벤트 태스크 소스를 기준으로 이루어지도록 새 태스크를 사용합니다.)

      3. processEndOfMedia를 다음 단계로 둡니다. 미디어 데이터 디코딩을 포함한 가져오기 과정이 오류 없이 완료되었고 모든 데이터를 네트워크 접근 없이 사용자 에이전트가 사용할 수 있다면, 사용자 에이전트는 아래의 마지막 단계로 진행해야 합니다. 웹 라디오 같은 무한 리소스를 스트리밍하거나 리소스가 사용자 에이전트의 데이터 캐시 용량보다 긴 경우처럼, 이 상황은 결코 발생하지 않을 수도 있습니다.

      4. response, current media resourcebyteRange가 주어졌을 때 검증한 결과가 false이면 이 단계를 중단합니다.

      5. 그렇지 않으면 updateMedia, processEndOfMedia, 빈 알고리즘 및 global이 주어졌을 때 response본문점진적으로 읽습니다.

      6. 이 방식으로 얻은 response안전하지 않은 응답의 내용으로 미디어 데이터를 업데이트합니다. responseCORS 동일 출처 또는 CORS 교차 출처일 수 있습니다. 이는 미디어 데이터에서 참조된 자막이 API에 노출되는지와, video 요소의 경우 비디오를 canvas에 그릴 때 canvas가 오염되는지에 영향을 줍니다.

      미디어 요소 정지 시간 제한구현 정의 시간 길이이며, 약 3초여야 합니다. 미디어 데이터를 적극적으로 얻으려는 미디어 요소미디어 요소 정지 시간 제한과 같은 기간 동안 데이터를 전혀 수신하지 못했다면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음을 수행해야 합니다.

      1. 요소의 현재 정지됨을 true로 설정합니다.

      2. 요소에서 stalled라는 이름의 이벤트를 발생시킵니다.

      사용자 에이전트는 사용자가 미디어 데이터 다운로드를 선택적으로 차단하거나 느리게 할 수 있도록 허용할 수 있습니다. 미디어 요소의 다운로드가 완전히 차단되었다면, 사용자 에이전트는 연결이 닫힌 것처럼 동작하는 대신 정지된 것처럼 동작해야 합니다. 또한 사용자 에이전트는 예를 들어 동일한 대역폭을 공유하는 다른 연결과 다운로드의 균형을 맞추기 위해 다운로드 속도를 자동으로 제한할 수 있습니다.

      사용자 에이전트는 언제든지 더 많은 콘텐츠를 다운로드하지 않기로 결정할 수 있습니다. 예를 들어 한 시간짜리 미디어 리소스의 5분 분량을 버퍼링한 뒤 사용자가 리소스를 재생할지 결정하기를 기다리는 동안, 대화형 리소스에서 사용자 입력을 기다리는 동안, 또는 사용자가 페이지를 떠날 때입니다. 미디어 요소의 다운로드가 일시 중단되면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 networkStateNETWORK_IDLE로 설정하고 요소에서 suspend라는 이름의 이벤트를 발생시켜야 합니다. 리소스 다운로드가 재개되면 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 networkStateNETWORK_LOADING으로 설정해야 합니다. 이러한 태스크가 큐에 추가되는 사이에는 로드가 일시 중단됩니다. 따라서 위에서 설명한 것처럼 progress 이벤트가 발생하지 않습니다.

      preload 속성은 autoplay 속성이 없더라도 작성자가 어느 정도의 버퍼링이 적절하다고 생각하는지에 관한 힌트를 제공합니다.

      사용자 에이전트가 다운로드를 완전히 일시 중단하기로 결정한 경우, 예를 들어 사용자가 재생을 시작할 때까지 추가 콘텐츠를 다운로드하지 않고 기다리는 경우, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소의 load 이벤트 지연 플래그를 false로 설정해야 합니다. 이는 load 이벤트 지연을 중지합니다.

      위의 단계는 요청을 발행하기 위한 알고리즘을 제공하지만, 사용자 에이전트는 특히 오류 조건에서 정확히 이러한 방법 외의 다른 수단을 사용할 수 있습니다. 예를 들어 사용자 에이전트는 서버에 다시 연결하거나 스트리밍 프로토콜로 전환할 수 있습니다. 사용자 에이전트가 리소스 가져오기를 포기한 경우에만 리소스를 오류가 있는 것으로 간주하고 위 단계의 오류 분기로 진행해야 합니다.

      미디어 리소스의 형식을 결정하기 위해 사용자 에이전트는 오디오와 비디오를 구체적으로 스니핑하기 위한 규칙을 사용해야 합니다.

      로드가 일시 중단되지 않은 동안(아래 참조), 350ms(±200ms)마다 또는 수신한 각 바이트마다 중 빈도가 더 낮은 쪽에 따라, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음을 수행합니다.

      1. 요소의 현재 정지됨을 false로 설정합니다.

      2. 요소에서 progress라는 이름의 이벤트를 발생시킵니다.

      사용자 에이전트가 미디어 리소스의 일부를 얻기 위해 여전히 네트워크 접근이 필요할 수 있는 동안 사용자 에이전트는 이 단계에 머물러야 합니다.

      예를 들어 사용자 에이전트가 비디오의 전반부를 폐기했다면, 사용자가 시작 부분으로 다시 탐색할 가능성이 항상 있으므로 재생이 끝난 뒤에도 사용자 에이전트는 이 단계에 머뭅니다. 실제로 이 상황에서는 재생이 끝난 뒤 사용자 에이전트가 앞에서 설명한 대로 결국 suspend 이벤트를 발생시키게 됩니다.

    그 외의 경우(modelocal)

    current media resource가 설명하는 리소스가 있다면 그 리소스가 미디어 데이터를 포함합니다. 이는 CORS 동일 출처입니다.

    current media resource가 원시 데이터 스트림 (예: File 객체에서 온 것)이면, 미디어 리소스의 형식을 결정하기 위해 사용자 에이전트는 오디오와 비디오를 구체적으로 스니핑하기 위한 규칙을 사용해야 합니다. 그렇지 않고 데이터 스트림이 사전 디코딩되어 있다면, 형식은 관련 명세에서 지정한 형식입니다.

    current media resource의 새 데이터를 사용할 수 있게 될 때마다, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 아래의 미디어 데이터 처리 단계 목록에서 첫 번째로 적절한 단계를 실행합니다.

    current media resource가 영구적으로 소진되면 (예: Blob의 모든 바이트가 처리됨), 디코딩 오류가 없었다면 사용자 에이전트는 아래의 마지막 단계로 진행해야 합니다. current media resourceMediaStream인 경우처럼, 이 상황은 결코 발생하지 않을 수도 있습니다.

    미디어 데이터 처리 단계 목록은 다음과 같습니다.

    네트워크 오류로 인해 미디어 데이터를 전혀 가져올 수 없고, 사용자 에이전트가 리소스 가져오기를 포기한 경우
    미디어 데이터를 가져올 수 있지만 검사 결과 지원되지 않는 형식이거나, 다른 이유로 전혀 렌더링할 수 없는 경우

    사용자 에이전트가 current media resource를 사용할 수 있는지 확인하기 전에 발생한 DNS 오류, HTTP 4xx 및 5xx 오류(및 다른 프로토콜의 동등한 오류), 그 밖의 치명적인 네트워크 오류, 지원되지 않는 컨테이너 형식을 사용하는 파일, 또는 모든 데이터에 지원되지 않는 코덱을 사용하는 파일은 사용자 에이전트가 다음 단계를 실행하게 해야 합니다.

    1. 사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.

    2. 이 하위 알고리즘을 중단하고 리소스 선택 알고리즘으로 돌아갑니다.

    미디어 리소스에 오디오 트랙이 있는 것으로 확인된 경우
    1. 오디오 트랙을 나타내는 AudioTrack 객체를 생성합니다.

    2. 미디어 요소audioTracks 속성의 AudioTrackList 객체를 새 AudioTrack 객체로 업데이트합니다.

    3. enableunknown으로 둡니다.

    4. 미디어 리소스 또는 current media resourceURL이 활성화할 특정 오디오 트랙 집합을 나타내거나, 사용자 에이전트에 사용자 경험을 개선하기 위해 특정 오디오 트랙을 선택하는 데 도움이 되는 정보가 있다면, 이 오디오 트랙이 활성화할 트랙 중 하나인 경우 enabletrue로 설정하고, 그렇지 않으면 false로 설정합니다.

      이는 미디어 조각 구문에 의해 트리거될 수 있지만, 예를 들어 사용자 에이전트가 스테레오 오디오 트랙보다 5.1 서라운드 사운드 오디오 트랙을 선택하는 경우에도 트리거될 수 있습니다.

    5. enable이 여전히 unknown이면, 미디어 요소에 아직 활성화된 오디오 트랙이 없을 경우 enabletrue로 설정하고, 그렇지 않으면 false로 설정합니다.

    6. enabletrue이면 이 오디오 트랙을 활성화하고, 그렇지 않으면 활성화하지 않습니다.

    7. AudioTrackList 객체에서 addtrack이라는 이름의 이벤트를 발생시킵니다. 이때 TrackEvent를 사용하고, track 속성을 새 AudioTrack 객체로 초기화합니다.

    미디어 리소스에 비디오 트랙이 있는 것으로 확인된 경우
    1. 비디오 트랙을 나타내는 VideoTrack 객체를 생성합니다.

    2. 미디어 요소videoTracks 속성의 VideoTrackList 객체를 새 VideoTrack 객체로 업데이트합니다.

    3. enableunknown으로 둡니다.

    4. 미디어 리소스 또는 current media resourceURL이 활성화할 특정 비디오 트랙 집합을 나타내거나, 사용자 에이전트에 사용자 경험을 개선하기 위해 특정 비디오 트랙을 선택하는 데 도움이 되는 정보가 있다면, 이 비디오 트랙이 그러한 첫 번째 비디오 트랙인 경우 enabletrue로 설정하고, 그렇지 않으면 false로 설정합니다.

      이 역시 미디어 조각 구문에 의해 트리거될 수 있습니다.

    5. enable이 여전히 unknown이면, 미디어 요소에 아직 선택된 비디오 트랙이 없을 경우 enabletrue로 설정하고, 그렇지 않으면 false로 설정합니다.

    6. enabletrue이면 이 트랙을 선택하고 이전에 선택된 모든 비디오 트랙의 선택을 해제하며, 그렇지 않으면 이 비디오 트랙을 선택하지 않습니다. 다른 트랙의 선택이 해제되면 change 이벤트가 발생합니다.

    7. VideoTrackList 객체에서 addtrack이라는 이름의 이벤트를 발생시킵니다. 이때 TrackEvent를 사용하고, track 속성을 새 VideoTrack 객체로 초기화합니다.

    미디어 데이터가 미디어 리소스의 재생 시간, 크기 및 기타 메타데이터를 결정하기에 충분할 만큼 가져와진 경우

    이는 리소스를 사용할 수 있음을 나타냅니다. 사용자 에이전트는 다음 하위 단계를 따라야 합니다.

    1. 미디어 데이터를 기반으로, 현재 재생 위치가능한 가장 이른 위치를 위한 미디어 타임라인을 설정합니다.

    2. 이전 단계에서 설정한 미디어 타임라인의 0 시간에 해당하는 날짜와 시간이 있다면 타임라인 오프셋을 해당 날짜와 시간으로 업데이트합니다. 미디어 리소스에 명시적인 날짜와 시간이 없다면 타임라인 오프셋을 Not-a-Number(NaN)로 설정해야 합니다.

    3. 현재 재생 위치공식 재생 위치가능한 가장 이른 위치로 설정합니다.

    4. 위에서 설정한 미디어 타임라인에서 리소스의 마지막 프레임 시간을 알고 있다면 그 시간으로 duration 속성을 업데이트합니다. 알 수 없다면 (예: 원칙적으로 무한한 스트림), duration 속성을 양의 Infinity 값으로 업데이트합니다.

      사용자 에이전트는 이 시점에 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 durationchange라는 이름의 이벤트를 발생시킵니다.

    5. video 요소의 경우 videoWidthvideoHeight 속성을 설정하고, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 resize라는 이름의 이벤트를 발생시킵니다.

      이후 크기가 변경되면 추가 resize 이벤트가 발생합니다.

    6. readyState 속성을 HAVE_METADATA로 설정합니다.

      readyState 속성을 새 값으로 설정하는 과정의 일부로 loadedmetadata DOM 이벤트가 발생합니다.

    7. jumped를 false로 둡니다.

    8. 미디어 요소기본 재생 시작 위치가 0보다 크면 해당 시간으로 탐색하고, jumped를 true로 둡니다.

    9. 미디어 요소기본 재생 시작 위치를 0으로 설정합니다.

    10. initial playback position을 0으로 둡니다.

    11. 미디어 리소스 또는 current media resourceURL이 특정 시작 시간을 나타내면 initial playback position을 해당 시간으로 설정하고, jumped가 여전히 false이면 해당 시간으로 탐색합니다.

      예를 들어 미디어 조각 구문을 지원하는 미디어 형식에서는 조각을 사용하여 시작 위치를 나타낼 수 있습니다.

    12. 활성화된 오디오 트랙이 없으면 오디오 트랙 하나를 활성화합니다. 이로 인해 change 이벤트가 발생합니다.

    13. 선택된 비디오 트랙이 없으면 비디오 트랙 하나를 선택합니다. 이로 인해 change 이벤트가 발생합니다.

    readyState 속성이 HAVE_CURRENT_DATA에 도달하면, loadeddata 이벤트가 발생한 뒤 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

    미디어 리소스의 메타데이터를 계속 가져오면서 네트워크 사용량을 줄이려는 사용자 에이전트는 이 시점에서 버퍼링도 중지할 것입니다. 이는 앞서 설명한 규칙을 따르며, networkState 속성이 NETWORK_IDLE 값으로 전환되고 suspend 이벤트가 발생하는 것을 포함합니다.

    사용자 에이전트는 재생 전에 미디어 리소스의 재생 시간을 결정하고 이 단계를 거쳐야 합니다.

    전체 미디어 리소스를 가져온 경우 (단, 일부도 아직 디코딩되지 않았을 수 있음)

    미디어 요소에서 progress라는 이름의 이벤트를 발생시킵니다.

    networkStateNETWORK_IDLE로 설정하고, 미디어 요소에서 suspend라는 이름의 이벤트를 발생시킵니다.

    사용자 에이전트가 미디어 데이터를 폐기한 뒤 다시 얻기 위해 네트워크 활동을 재개해야 한다면, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 networkStateNETWORK_LOADING으로 설정해야 합니다.

    사용자 에이전트가 미디어 리소스를 로드된 상태로 유지할 수 있다면 알고리즘은 아래의 마지막 단계로 진행하여 알고리즘을 중단합니다.

    일부 미디어 데이터를 수신한 뒤 연결이 중단되어, 사용자 에이전트가 리소스 가져오기를 포기한 경우

    사용자 에이전트가 current media resource를 사용할 수 있는지 확인한 뒤 (즉, 미디어 요소readyState 속성이 더 이상 HAVE_NOTHING이 아닌 뒤) 발생한 치명적인 네트워크 오류는 사용자 에이전트가 다음 단계를 실행하게 해야 합니다.

    1. 사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.

    2. error 속성을 MEDIA_ERR_NETWORKMediaError를 생성한 결과로 설정합니다.

    3. 요소의 networkState 속성을 NETWORK_IDLE 값으로 설정합니다.

    4. 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

    5. 미디어 요소에서 error라는 이름의 이벤트를 발생시킵니다.

    6. 전체 리소스 선택 알고리즘을 중단합니다.

    미디어 데이터가 손상된 경우

    사용자 에이전트가 current media resource를 사용할 수 있는지 확인한 뒤 (즉, 미디어 요소readyState 속성이 더 이상 HAVE_NOTHING이 아닌 뒤) 미디어 데이터를 디코딩하는 동안 발생한 치명적인 오류는 사용자 에이전트가 다음 단계를 실행하게 해야 합니다.

    1. 사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.

    2. error 속성을 MEDIA_ERR_DECODEMediaError를 생성한 결과로 설정합니다.

    3. 요소의 networkState 속성을 NETWORK_IDLE 값으로 설정합니다.

    4. 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

    5. 미디어 요소에서 error라는 이름의 이벤트를 발생시킵니다.

    6. 전체 리소스 선택 알고리즘을 중단합니다.

    미디어 데이터 가져오기 과정이 사용자에 의해 중단된 경우

    예를 들어 사용자가 "중지" 버튼을 눌러 가져오기 과정이 중단되면 사용자 에이전트는 다음 단계를 실행해야 합니다. 이 단계를 실행하는 동안 load() 메서드 자체가 호출된 경우에는 위 단계가 그러한 종류의 중단을 처리하므로 이 단계를 따르지 않습니다.

    1. 사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.

    2. error 속성을 MEDIA_ERR_ABORTEDMediaError를 생성한 결과로 설정합니다.

    3. 미디어 요소에서 abort라는 이름의 이벤트를 발생시킵니다.

    4. 미디어 요소readyState 속성 값이 HAVE_NOTHING과 같으면, 요소의 networkState 속성을 NETWORK_EMPTY 값으로 설정하고, 요소의 포스터 표시 플래그를 true로 설정하며, 요소에서 emptied라는 이름의 이벤트를 발생시킵니다.

      그렇지 않으면 요소의 networkState 속성을 NETWORK_IDLE 값으로 설정합니다.

    5. 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.

    6. 전체 리소스 선택 알고리즘을 중단합니다.

    미디어 데이터를 가져올 수 있지만 치명적이지 않은 오류가 있거나 일부 지원되지 않는 코덱을 사용하여, 사용자 에이전트가 콘텐츠를 완전히 올바르게 렌더링하지 못하지만 재생 자체가 불가능하지는 않은 경우

    서버가 부분적으로 사용할 수 있지만 최적으로 렌더링할 수 없는 데이터를 반환하면, 사용자 에이전트는 처리할 수 있는 부분만 렌더링하고 나머지는 무시해야 합니다.

    미디어 리소스가 사용자 에이전트가 지원하는 미디어 리소스별 텍스트 트랙을 선언한 것으로 확인된 경우

    미디어 데이터CORS 동일 출처이면, 관련 데이터를 사용하여 미디어 리소스별 텍스트 트랙을 노출하는 단계를 실행합니다.

    교차 출처 비디오는 자막을 노출하지 않습니다. 그렇게 하면 악의적인 사이트가 사용자의 인트라넷에 있는 기밀 비디오의 자막을 읽는 것과 같은 공격이 가능해지기 때문입니다.

  7. 마지막 단계: 사용자 에이전트가 이 단계에 도달하면 (이는 전체 리소스가 로드되고 사용 가능한 상태로 유지되는 경우에만 가능함), 전체 리소스 선택 알고리즘을 중단합니다.

미디어 요소미디어 요소의 미디어 리소스별 트랙을 잊어야 할 때, 사용자 에이전트는 미디어 요소텍스트 트랙 목록에서 모든 미디어 리소스별 텍스트 트랙을 제거한 다음, 미디어 요소audioTracks 속성의 AudioTrackList 객체를 비우고, 이어서 미디어 요소videoTracks 속성의 VideoTrackList 객체를 비워야 합니다. 이 과정의 일부로 이벤트 (특히 removetrack 이벤트)는 발생하지 않습니다. 대신 이 알고리즘을 호출하는 알고리즘에 의해 발생하는 erroremptied 이벤트를 사용할 수 있습니다.


preload 속성은 다음 키워드와 상태를 갖는 열거형 속성입니다.

키워드 상태 간략한 설명
auto 자동 전체 리소스를 낙관적으로 다운로드하는 것까지 포함하여, 서버에 위험을 주지 않는 범위에서 사용자 에이전트가 사용자의 필요를 우선할 수 있다는 힌트를 제공합니다.
none 없음 작성자가 사용자가 미디어 리소스를 필요로 할 것으로 예상하지 않거나, 서버가 불필요한 트래픽을 최소화하려 한다는 힌트를 사용자 에이전트에 제공합니다. 이 상태는 어쨌든 버퍼링이 시작된 경우 (예: 사용자가 "재생"을 누른 뒤) 미디어 리소스를 실제로 얼마나 적극적으로 다운로드할지에 관한 힌트를 제공하지 않습니다.
metadata 메타데이터 작성자가 사용자가 미디어 리소스를 필요로 할 것으로 예상하지 않지만, 리소스 메타데이터(크기, 트랙 목록, 재생 시간 등)와 경우에 따라 처음 몇 프레임까지 가져오는 것은 합리적이라는 힌트를 사용자 에이전트에 제공합니다. 사용자 에이전트가 정확히 메타데이터만 가져오면 미디어 요소readyState 속성은 결국 HAVE_METADATA로 설정됩니다. 하지만 일반적으로 일부 프레임도 함께 얻으므로 HAVE_CURRENT_DATA 또는 HAVE_FUTURE_DATA일 가능성이 큽니다. 미디어 리소스가 재생 중일 때는 대역폭을 희소한 것으로 간주해야 한다는 힌트를 사용자 에이전트에 제공합니다. 예를 들어 일관된 재생을 유지할 수 있는 가장 느린 속도로 미디어 데이터를 얻도록 다운로드를 제한할 것을 제안합니다.

속성의 빈 값 기본값자동 상태입니다.

속성의 누락 값 기본값유효하지 않은 값 기본값은 모두 구현 정의입니다. 다만 서버 부하 감소와 최적의 사용자 경험 제공 사이의 절충안으로 메타데이터 상태가 권장됩니다.

이 속성은 미디어 리소스가 버퍼링되거나 재생 중인 뒤에도 변경할 수 있습니다. 위 표의 설명은 이를 염두에 두고 해석해야 합니다.

작성자는 사용자가 재생을 시작한 뒤 속성을 "none" 또는 "metadata"에서 "auto"로 동적으로 전환할 수 있습니다. 예를 들어 많은 비디오가 있는 페이지에서는 여러 비디오를 요청받지 않는 한 다운로드하지 않도록 나타내되, 하나가 요청되면 해당 비디오를 적극적으로 다운로드하도록 나타내는 데 이를 사용할 수 있습니다.

preload 속성은 작성자가 최상의 사용자 경험으로 이어질 것이라고 생각하는 바에 관한 힌트를 사용자 에이전트에 제공하기 위한 것입니다. 이 속성은 명시적인 사용자 환경설정이나 사용 가능한 연결 상태 등을 근거로 완전히 무시될 수 있습니다.

preload IDL 속성은 알려진 값으로만 제한하여 같은 이름의 콘텐츠 속성을 반영해야 합니다.

autoplay 속성은 preload 속성을 재정의할 수 있습니다. 미디어가 재생된다면 preload 속성이 제공한 힌트와 관계없이 자연스럽게 먼저 버퍼링해야 하기 때문입니다. 그러나 두 속성을 모두 포함하는 것은 오류가 아닙니다.

audiovideo 요소에서 스크립팅이 활성화되어 있으면, loading 속성은 요소의 지연 로드 재개 단계가 실행될 때까지 preload 속성이 암시한 동작을 연기할 수 있습니다.


media.buffered

HTMLMediaElement/buffered

현재 모든 엔진에서 지원됩니다.

Firefox4+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

사용자 에이전트가 버퍼링한 미디어 리소스의 범위를 나타내는 TimeRanges 객체를 반환합니다.

buffered getter 단계는 this미디어 리소스가 있다면 사용자 에이전트가 버퍼링한 해당 리소스의 범위를 나타내는 새로운 정규화된 TimeRanges 객체를 반환하는 것입니다. 사용자 에이전트는 지루한 검사를 통해서만 확인할 수 있는 미디어 스트림에서도 사용 가능한 범위를 정확하게 결정해야 합니다.

일반적으로 이는 0 지점에 고정된 단일 범위이지만, 예를 들어 사용자 에이전트가 탐색에 응답하여 HTTP 범위 요청을 사용하면 여러 범위가 있을 수 있습니다.

사용자 에이전트는 이전에 버퍼링한 데이터를 폐기할 수 있습니다.

따라서 한 시점에 buffered 속성이 반환한 객체의 범위에 포함된 시간 위치가, 나중에 같은 속성이 반환한 객체의 범위에는 포함되지 않을 수 있습니다.

접근할 때마다 새 객체를 반환하는 것은 속성 getter에 좋지 않은 패턴이며, 변경 비용이 크기 때문에 여기에만 유지되어 있습니다. 새로운 API에서 이를 모방해서는 안 됩니다.

4.8.11.6 미디어 리소스 내 오프셋
media.duration

HTMLMediaElement/duration

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

미디어 리소스의 시작이 시간 0에 있다고 가정할 때, 미디어 리소스의 길이를 초 단위로 반환합니다.

재생 시간을 사용할 수 없으면 NaN을 반환합니다.

경계가 없는 스트림이면 Infinity를 반환합니다.

media.currentTime [ = value ]

HTMLMediaElement/currentTime

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

공식 재생 위치를 초 단위로 반환합니다.

주어진 시간으로 탐색하도록 설정할 수 있습니다.

미디어 리소스에는 시간(초)을 미디어 리소스의 위치에 매핑하는 미디어 타임라인이 있습니다. 타임라인의 원점은 가장 이른 정의된 위치입니다. 타임라인의 재생 시간은 마지막으로 정의된 위치입니다.

미디어 타임라인 설정: 미디어 리소스가 원점이 음수가 아닌 명시적 타임라인을 어떤 방식으로든 지정한다면 (즉, 각 프레임에 특정 시간 오프셋을 부여하고 첫 번째 프레임에 0 또는 양의 오프셋을 부여한다면), 미디어 타임라인은 해당 타임라인이어야 합니다. (미디어 리소스가 타임라인을 지정할 수 있는지 여부는 미디어 리소스의 형식에 따라 달라집니다.) 미디어 리소스가 명시적인 시작 시간과 날짜를 지정한다면, 해당 시간과 날짜를 미디어 타임라인의 0 지점으로 간주해야 합니다. 타임라인 오프셋은 해당 시간과 날짜가 되며, getStartDate() 메서드를 사용하여 노출됩니다.

미디어 리소스에 불연속적인 타임라인이 있는 경우, 사용자 에이전트는 리소스 시작 시 사용된 타임라인을 전체 리소스에 걸쳐 확장해야 합니다. 따라서 기반 미디어 데이터에 순서가 뒤바뀌거나 서로 겹치는 타임 코드가 있더라도, 미디어 리소스미디어 타임라인은 아래에 정의된 가능한 가장 이른 위치부터 선형적으로 증가해야 합니다.

예를 들어 두 클립을 하나의 비디오 파일로 연결했지만 비디오 형식이 두 클립의 원래 시간을 노출한다면, 비디오 데이터는 가령 00:15..00:29 다음에 00:05..00:38로 이어지는 타임라인을 노출할 수 있습니다. 그러나 사용자 에이전트는 이러한 시간을 노출하지 않고, 대신 하나의 비디오로서 00:15..00:29와 00:29..01:02로 노출합니다.

(추적 벡터입니다.) 드물게 명시적인 타임라인이 없는 미디어 리소스의 경우, 미디어 타임라인의 0 시간은 미디어 리소스의 첫 번째 프레임에 대응해야 합니다. 그보다도 더 드물게 프레임 재생 시간을 포함하여 어떤 종류의 명시적 시간 정보도 없는 미디어 리소스의 경우, 사용자 에이전트는 각 프레임의 시간을 구현 정의 방식으로 직접 결정해야 합니다.

명시적인 타임라인은 없지만 명시적인 프레임 재생 시간이 있는 파일 형식의 예로 Animated GIF 형식이 있습니다. 명시적인 시간 정보가 전혀 없는 파일 형식의 예로 JPEG-push 형식 (JPEG 프레임이 포함된 multipart/x-mixed-replace, 흔히 MJPEG 스트림 형식으로 사용됨)이 있습니다.

시간 정보가 없는 리소스의 경우에도 사용자 에이전트가 서버가 처음 제공한 프레임보다 앞선 지점으로 탐색할 수 있다면, 0 시간은 미디어 리소스의 가장 이른 탐색 가능 시간에 대응해야 합니다. 그렇지 않으면 서버에서 수신한 첫 번째 프레임 (사용자 에이전트가 스트림 수신을 시작한 미디어 리소스의 지점)에 대응해야 합니다.

이 글을 작성하는 시점에는 명시적인 프레임 시간 오프셋이 없으면서도 서버가 보낸 첫 번째 프레임보다 앞선 프레임으로 탐색할 수 있는 알려진 형식이 없습니다.

10월의 화창한 금요일 오후에 스트리밍을 시작하고, 연결하는 사용자 에이전트에 항상 동일한 미디어 타임라인상의 미디어 데이터를 전송하며, 0 시간을 이 스트림의 시작으로 설정하는 TV 방송국의 스트림을 생각해 보겠습니다. 몇 달 뒤 이 스트림에 연결한 사용자 에이전트는 자신이 수신한 첫 번째 프레임의 시간이 수백만 초에 달한다는 것을 알게 됩니다. getStartDate() 메서드는 항상 방송이 시작된 날짜를 반환합니다. 이를 통해 컨트롤러는 스크러버에 방송이 시작된 시점을 기준으로 한 시간("8개월, 4시간, 12분, 23초") 대신 실제 시간 (예: "오후 2:30")을 표시할 수 있습니다.

여러 개의 연결된 조각으로 구성된 비디오를 전달하는 스트림을 생각해 보겠습니다. 이 스트림은 사용자 에이전트가 특정 시간을 요청하는 것을 허용하지 않고, 첫 번째로 전달되는 프레임을 항상 시간 0인 프레임으로 식별하면서 미리 정해진 순서대로 비디오 데이터만 스트리밍하는 서버가 방송합니다. 사용자 에이전트가 이 스트림에 연결하여 타임스탬프 2010-03-20 23:15:00 UTC부터 2010-03-21 00:05:00 UTC까지와 2010-02-12 14:25:00 UTC부터 2010-02-12 14:35:00 UTC까지를 포함하는 것으로 정의된 조각을 수신하면, 0초에서 시작하여 3,600초(1시간)까지 이어지는 미디어 타임라인으로 이를 노출합니다. 스트리밍 서버가 두 번째 클립의 끝에서 연결을 끊었다고 가정하면, duration 속성은 3,600을 반환합니다. getStartDate() 메서드는 2010-03-20 23:15:00 UTC에 해당하는 시간을 가진 Date 객체를 반환합니다. 그러나 다른 사용자 에이전트가 5분 뒤 연결하면, 그 사용자 에이전트는 (아마도) 타임스탬프 2010-03-20 23:20:00 UTC부터 2010-03-21 00:05:00 UTC까지와 2010-02-12 14:25:00 UTC부터 2010-02-12 14:35:00 UTC까지를 포함하는 조각을 수신하고, 0초에서 시작하여 3,300초(55분)까지 이어지는 미디어 타임라인으로 이를 노출합니다. 이 경우 getStartDate() 메서드는 2010-03-20 23:20:00 UTC에 해당하는 시간을 가진 Date 객체를 반환합니다.

두 예제 모두에서 seekable 속성은 컨트롤러가 실제로 UI에 표시하려는 범위를 제공합니다. 일반적으로 서버가 임의의 시간으로 탐색하는 것을 지원하지 않는다면, 이는 사용자 에이전트가 스트림에 연결한 순간부터 사용자 에이전트가 얻은 최신 프레임까지의 시간 범위입니다. 그러나 사용자 에이전트가 이전 정보를 폐기하기 시작하면 실제 범위는 더 짧을 수 있습니다.

어떤 경우든 사용자 에이전트는 설정된 미디어 타임라인을 사용하는 아래에 정의된 가능한 가장 이른 위치가 0 이상이 되도록 보장해야 합니다.

미디어 타임라인에는 연관된 시계도 있습니다. 어떤 시계를 사용할지는 사용자 에이전트가 정의하며 미디어 리소스에 따라 달라질 수 있지만, 사용자의 벽시계와 비슷해야 합니다.

미디어 요소에는 현재 재생 위치가 있으며, 처음에는(즉, 미디어 데이터가 없을 때) 0초여야 합니다. 현재 재생 위치미디어 타임라인의 시간입니다.

미디어 요소에는 공식 재생 위치도 있으며, 처음에는 0초로 설정해야 합니다. 공식 재생 위치는 스크립트가 실행되는 동안 안정적으로 유지되는 현재 재생 위치의 근삿값입니다.

미디어 요소에는 기본 재생 시작 위치도 있으며, 처음에는 0초로 설정해야 합니다. 이 시간은 미디어가 로드되기 전에도 요소를 탐색할 수 있게 하는 데 사용됩니다.

미디어 요소에는 포스터 표시 플래그가 있습니다. 미디어 요소가 생성되면 이 플래그를 true로 설정해야 합니다. 이 플래그는 사용자 에이전트가 video 요소에 비디오 콘텐츠 대신 포스터 프레임을 표시할 시점을 제어하는 데 사용됩니다.

currentTime 속성은 가져올 때 미디어 요소기본 재생 시작 위치를 반환해야 합니다. 단, 그 값이 0이면 요소의 공식 재생 위치를 반환해야 합니다. 반환값은 초 단위로 표현해야 합니다. 설정할 때 미디어 요소readyStateHAVE_NOTHING이면, 미디어 요소기본 재생 시작 위치를 새 값으로 설정해야 합니다. 그렇지 않으면 공식 재생 위치를 새 값으로 설정한 다음 새 값으로 탐색해야 합니다. 새 값은 초 단위로 해석해야 합니다.

미디어 리소스가 스트리밍 리소스라면 사용자 에이전트는 버퍼에서 만료된 뒤 리소스의 특정 부분을 얻지 못할 수 있습니다. 마찬가지로 일부 미디어 리소스에는 0에서 시작하지 않는 미디어 타임라인이 있을 수 있습니다. 가능한 가장 이른 위치는 사용자 에이전트가 다시 얻을 수 있는 스트림 또는 리소스에서 가장 이른 위치입니다. 이 역시 미디어 타임라인의 시간입니다.

가능한 가장 이른 위치는 API에 명시적으로 노출되지 않습니다. 범위가 있다면 seekable 속성의 TimeRanges 객체에 있는 첫 번째 범위의 시작 시간에 대응하며, 그렇지 않으면 현재 재생 위치에 대응합니다.

가능한 가장 이른 위치가 변경될 때, 현재 재생 위치가능한 가장 이른 위치보다 앞에 있으면 사용자 에이전트는 가능한 가장 이른 위치탐색해야 합니다. 그렇지 않고 사용자 에이전트가 지난 15~250ms 동안 요소에서 timeupdate 이벤트를 발생시키지 않았고 해당 이벤트의 이벤트 처리기를 여전히 실행 중이지 않다면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 timeupdate라는 이름의 이벤트를 발생시켜야 합니다.

위 요구사항과 클립의 메타데이터를 알게 될 때 적용되는 리소스 가져오기 알고리즘의 요구사항으로 인해, 현재 재생 위치가능한 가장 이른 위치보다 작을 수 없습니다.

사용자 에이전트가 오디오 또는 비디오 트랙이 끝났으며 해당 트랙과 관련된 모든 미디어 데이터가능한 가장 이른 위치보다 앞선 미디어 타임라인 부분에 해당한다는 것을 언제든 알게 되면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음 단계를 실행할 수 있습니다.

  1. 적절한 경우 audioTracks 속성의 AudioTrackList 객체 또는 videoTracks 속성의 VideoTrackList 객체에서 해당 트랙을 제거합니다.

  2. 앞에서 언급한 미디어 요소AudioTrackList 또는 VideoTrackList 객체에서 removetrack이라는 이름의 이벤트를 발생시킵니다. 이때 TrackEvent를 사용하고 track 속성을 해당 트랙을 나타내는 AudioTrack 또는 VideoTrack 객체로 초기화합니다.

duration 속성은 미디어 타임라인에서 미디어 리소스가 끝나는 시간을 초 단위로 반환해야 합니다. 사용할 수 있는 미디어 데이터가 없다면 속성은 Not-a-Number(NaN) 값을 반환해야 합니다. 미디어 리소스의 경계가 정해져 있다고 알려지지 않은 경우(예: 스트리밍 라디오 또는 종료 시간이 공지되지 않은 라이브 이벤트), 속성은 양의 Infinity 값을 반환해야 합니다.

사용자 에이전트는 미디어 데이터의 어떤 부분이든 재생하기 전, 그리고 readyStateHAVE_METADATA 이상의 값으로 설정하기 전에, 리소스의 여러 부분을 가져와야 하더라도 미디어 리소스의 재생 시간을 결정해야 합니다.

미디어 리소스의 길이가 알려진 값으로 변경될 때 (예: 알 수 없는 값에서 알려진 값으로 변경되거나, 이전에 설정된 길이에서 새로운 길이로 변경될 때), 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 durationchange라는 이름의 이벤트를 발생시켜야 합니다. (새로운 미디어 리소스를 로드하는 과정의 일부로 재생 시간이 재설정될 때는 이벤트가 발생하지 않습니다.) 재생 시간이 변경되어 현재 재생 위치미디어 리소스가 끝나는 시간보다 커지면, 사용자 에이전트는 미디어 리소스가 끝나는 시간으로도 탐색해야 합니다.

"무한" 스트림이 어떤 이유로 끝나면 재생 시간은 양의 Infinity에서 스트림의 마지막 프레임 또는 샘플 시간으로 변경되고, durationchange 이벤트가 발생합니다. 마찬가지로 사용자 에이전트가 처음에 미디어 리소스의 재생 시간을 정확히 결정하지 않고 추정했다가 나중에 새로운 정보를 기반으로 추정치를 수정하면, 재생 시간이 변경되고 durationchange 이벤트가 발생합니다.

일부 비디오 파일에는 미디어 타임라인의 0 시간에 대응하는 명시적인 날짜와 시간도 있으며, 이를 타임라인 오프셋이라고 합니다. 처음에는 타임라인 오프셋을 Not-a-Number(NaN)로 설정해야 합니다.

getStartDate() 메서드는 현재 타임라인 오프셋을 나타내는 Date 객체를 반환해야 합니다.


loop 속성은 불리언 속성이며, 지정된 경우 미디어 요소미디어 리소스의 끝에 도달했을 때 시작 부분으로 다시 탐색해야 함을 나타냅니다.

4.8.11.7 준비 상태
media.readyState

HTMLMediaElement/readyState

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

아래 목록의 코드 중 하나를 사용하여 현재 재생 위치를 렌더링하는 것과 관련된 요소의 현재 상태를 나타내는 값을 반환합니다.

미디어 요소에는 현재 재생 위치에서 렌더링할 준비가 어느 정도 되어 있는지를 설명하는 준비 상태가 있습니다. 가능한 값은 다음과 같습니다. 특정 시점의 미디어 요소의 준비 상태는 요소의 상태를 설명하는 값 중 가장 큰 값입니다.

HAVE_NOTHING (숫자 값 0)

미디어 리소스에 관한 정보를 사용할 수 없습니다. 현재 재생 위치에 대한 데이터도 사용할 수 없습니다. networkState 속성이 NETWORK_EMPTY로 설정된 미디어 요소는 항상 HAVE_NOTHING 상태입니다.

HAVE_METADATA (숫자 값 1)

리소스의 재생 시간을 사용할 수 있을 만큼 충분한 리소스를 얻었습니다. video 요소의 경우 비디오 크기도 사용할 수 있습니다. 바로 현재의 현재 재생 위치에 사용할 수 있는 미디어 데이터는 없습니다.

HAVE_CURRENT_DATA (숫자 값 2)

바로 현재의 현재 재생 위치에 대한 데이터는 사용할 수 있지만, 사용자 에이전트가 현재 재생 위치재생 방향으로 조금이라도 성공적으로 진행시킨 뒤 즉시 HAVE_METADATA 상태로 되돌아가지 않을 만큼 충분한 데이터를 사용할 수 없거나, 재생 방향으로 얻을 수 있는 데이터가 더 이상 없습니다. 예를 들어 비디오에서는 현재 재생 위치가 현재 프레임의 끝에 있을 때 사용자 에이전트가 현재 프레임의 데이터는 가지고 있지만 다음 프레임의 데이터는 가지고 있지 않은 경우와, 재생이 끝난 경우에 해당합니다.

HAVE_FUTURE_DATA (숫자 값 3)

바로 현재의 현재 재생 위치에 대한 데이터를 사용할 수 있으며, 사용자 에이전트가 즉시 HAVE_METADATA 상태로 되돌아가지 않고 현재 재생 위치재생 방향으로 적어도 조금 진행시킬 만큼 충분한 데이터도 사용할 수 있고, 텍스트 트랙도 준비되어 있습니다. 예를 들어 비디오에서는 현재 재생 위치가 두 프레임 사이의 시점에 있을 때 사용자 에이전트가 적어도 현재 프레임과 다음 프레임에 대한 데이터를 가지고 있는 경우나, 현재 재생 위치가 프레임 중간에 있을 때 사용자 에이전트가 현재 프레임의 비디오 데이터와 적어도 조금 더 재생할 수 있는 오디오 데이터를 가지고 있는 경우에 해당합니다. 재생이 끝난 경우에는 현재 재생 위치가 더 이상 진행될 수 없으므로 사용자 에이전트는 이 상태일 수 없습니다.

HAVE_ENOUGH_DATA (숫자 값 4)

HAVE_FUTURE_DATA 상태에 대해 설명한 모든 조건이 충족되며, 추가로 다음 조건 중 하나도 true입니다.

실제로 HAVE_METADATAHAVE_CURRENT_DATA 사이의 차이는 무시할 만합니다. 실제로 차이가 중요한 유일한 경우는 video 요소를 canvas에 그릴 때입니다. 이 경우 무언가가 그려지는 경우 (HAVE_CURRENT_DATA 이상)와 아무것도 그려지지 않는 경우 (HAVE_METADATA 이하)를 구분합니다. 마찬가지로 HAVE_CURRENT_DATA (현재 프레임만)와 HAVE_FUTURE_DATA (적어도 이 프레임과 다음 프레임) 사이의 차이도 무시할 만할 수 있습니다 (극단적으로는 한 프레임 차이뿐입니다). 이 구분이 실제로 중요한 유일한 경우는 페이지가 "프레임 단위" 탐색 인터페이스를 제공할 때입니다.

networkStateNETWORK_EMPTY가 아닌 미디어 요소의 준비 상태가 변경되면, 사용자 에이전트는 아래 단계를 따라야 합니다.

  1. 다음 목록에서 처음으로 적용되는 하위 단계 집합을 적용합니다.

    이전 준비 상태가 HAVE_NOTHING이고, 새 준비 상태가 HAVE_METADATA인 경우

    미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 loadedmetadata라는 이름의 이벤트를 발생시킵니다.

    이 태스크가 실행되기 전에 이벤트 루프 메커니즘의 일부로 렌더링이 업데이트되어, 적절한 경우 video 요소의 크기가 조정됩니다.

    이전 준비 상태가 HAVE_METADATA이고, 새 준비 상태가 HAVE_CURRENT_DATA 이상인 경우

    미디어 요소에서 load() 알고리즘이 마지막으로 호출된 이후 이 상황이 처음 발생한 경우, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 loadeddata라는 이름의 이벤트를 발생시켜야 합니다.

    새 준비 상태가 HAVE_FUTURE_DATA 또는 HAVE_ENOUGH_DATA이면, 아래의 관련 단계도 실행해야 합니다.

    이전 준비 상태가 HAVE_FUTURE_DATA 이상이고, 새 준비 상태가 HAVE_CURRENT_DATA 이하인 경우

    미디어 요소readyState 속성이 HAVE_FUTURE_DATA보다 낮은 값으로 변경되기 전에 요소가 잠재적으로 재생 중이었고, 요소의 재생이 끝나지 않았으며, 재생이 오류로 인해 중지되지 않았고, 사용자 상호 작용을 위해 일시 정지되거나 대역 내 콘텐츠를 위해 일시 정지되지 않았다면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 timeupdate라는 이름의 이벤트를 발생시키고, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 waiting이라는 이름의 이벤트를 발생시켜야 합니다.

    이전 준비 상태가 HAVE_CURRENT_DATA 이하이고, 새 준비 상태가 HAVE_FUTURE_DATA인 경우

    사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 canplay라는 이름의 이벤트를 발생시켜야 합니다.

    요소의 paused 속성이 false이면 사용자 에이전트는 요소에 대해 재생 중임을 알림해야 합니다.

    새 준비 상태가 HAVE_ENOUGH_DATA인 경우

    이전 준비 상태가 HAVE_CURRENT_DATA 이하이면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 canplay이라는 이름의 이벤트를 발생시켜야 합니다. 또한 요소의 paused 속성이 false이면 요소에 대해 재생 중임을 알림해야 합니다.

    사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 canplaythrough라는 이름의 이벤트를 발생시켜야 합니다.

    요소가 자동 재생 가능 상태가 아니면 사용자 에이전트는 이 하위 단계를 중단해야 합니다.

    사용자 에이전트는 다음 하위 단계를 실행할 수 있습니다.

    1. paused 속성을 false로 설정합니다.
    2. 요소의 포스터 표시 플래그가 true이면 false로 설정하고 시간 진행 단계를 실행합니다.
    3. 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 play라는 이름의 이벤트를 발생시킵니다.
    4. 요소에 대해 재생 중임을 알림합니다.

    또는 요소가 video 요소인 경우, 사용자 에이전트는 요소가 뷰포트와 교차하는지 관찰하기 시작할 수 있습니다. 요소가 뷰포트와 교차하기 시작할 때 요소가 여전히 자동 재생 가능 상태이면 위 하위 단계를 실행합니다. 선택적으로 요소가 뷰포트와 교차하지 않게 될 때, 자동 재생 가능 플래그가 여전히 true이고 autoplay 속성이 여전히 지정되어 있다면 다음 하위 단계를 실행합니다.

    1. 내부 일시 정지 단계를 실행하고 자동 재생 가능 플래그를 true로 설정합니다.
    2. 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 pause라는 이름의 이벤트를 발생시킵니다.

    자동 재생 가능 플래그가 true인 동안에는 요소가 뷰포트와 교차하기 시작하거나 중지할 때 재생 및 일시 정지 하위 단계를 여러 번 실행할 수 있습니다.

    사용자 에이전트는 자동 재생을 지원할 필요가 없으며, 이 문제에 관한 사용자 환경설정을 따르는 것이 권장됩니다. 작성자는 사용자가 원할 경우 동작을 재정의할 수 있도록 스크립트로 비디오를 강제로 재생하는 대신 autoplay 속성을 사용하는 것이 강력히 권장됩니다.

미디어 요소의 준비 상태는 이러한 상태 사이를 불연속적으로 건너뛸 수 있습니다. 예를 들어 미디어 요소의 상태는 HAVE_CURRENT_DATAHAVE_FUTURE_DATA 상태를 거치지 않고 HAVE_METADATA에서 곧바로 HAVE_ENOUGH_DATA로 건너뛸 수 있습니다.

readyState IDL 속성은 가져올 때 미디어 요소의 현재 준비 상태를 설명하는 위의 값을 반환해야 합니다.

autoplay 속성은 불리언 속성입니다. 이 속성이 존재하면 사용자 에이전트는 여기 설명된 알고리즘에 따라 중단하지 않고 재생할 수 있게 되는 즉시 미디어 리소스의 재생을 자동으로 시작합니다.

작성자는 자동 재생이 원하지 않는 경우, 예를 들어 화면 판독기를 사용할 때 사용자가 자동 재생을 재정의할 수 있도록 스크립트로 자동 재생을 트리거하는 대신 autoplay 속성을 사용하는 것이 강력히 권장됩니다. 작성자는 자동 재생 동작을 전혀 사용하지 않고 사용자 에이전트가 사용자가 명시적으로 재생을 시작할 때까지 기다리도록 하는 것도 고려하는 것이 권장됩니다.

4.8.11.8 미디어 리소스 재생
media.paused

HTMLMediaElement/paused

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

재생이 일시 정지되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

media.ended

HTMLMediaElement/ended

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

재생이 미디어 리소스의 끝에 도달했으면 true를 반환합니다.

media.defaultPlaybackRate [ = value ]

HTMLMediaElement/defaultPlaybackRate

현재 모든 엔진에서 지원됩니다.

Firefox20+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

사용자가 미디어 리소스를 빨리 감거나 되감고 있지 않을 때의 기본 재생 속도를 반환합니다.

기본 재생 속도를 변경하도록 설정할 수 있습니다.

기본 속도는 재생에 직접적인 영향을 주지 않지만, 사용자가 빨리 감기 모드로 전환했다가 일반 재생 모드로 돌아오면 재생 속도가 기본 재생 속도로 복원될 것으로 예상됩니다.

media.playbackRate [ = value ]

HTMLMediaElement/playbackRate

현재 모든 엔진에서 지원됩니다.

Firefox20+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

1.0이 일반 속도인 현재 재생 속도를 반환합니다.

재생 속도를 변경하도록 설정할 수 있습니다.

media.preservesPitch

HTMLMediaElement/preservesPitch

Firefox101+Safari🔰 4+Chrome86+
Opera?Edge86+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS🔰 4+Chrome Android?WebView Android?Samsung Internet?Opera Android?

playbackRate가 1.0이 아닐 때 피치 보존 알고리즘을 사용하면 true를 반환합니다. 기본값은 true입니다.

false로 설정하면 미디어 리소스의 오디오 피치가 playbackRate에 따라 높아지거나 낮아지게 할 수 있습니다. 이는 미적 이유와 성능상의 이유로 유용합니다.

media.played

사용자 에이전트가 재생한 미디어 리소스의 범위를 나타내는 TimeRanges 객체를 반환합니다.

media.play()

HTMLMediaElement/play

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+

paused 속성을 false로 설정하고, 필요한 경우 미디어 리소스를 로드하여 재생을 시작합니다. 재생이 끝난 상태라면 시작 부분부터 다시 시작합니다.

media.pause()

HTMLMediaElement/pause

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

paused 속성을 true로 설정하고, 필요한 경우 미디어 리소스를 로드합니다.

paused 속성은 미디어 요소가 일시 정지되어 있는지를 나타냅니다. 이 속성은 처음에 true여야 합니다.

미디어 요소readyState 속성이 HAVE_NOTHING, HAVE_METADATA 또는 HAVE_CURRENT_DATA 상태이거나, 요소가 사용자 상호 작용을 위해 일시 정지되었거나 대역 내 콘텐츠를 위해 일시 정지된 경우, 해당 요소는 차단된 미디어 요소입니다.

미디어 요소paused 속성이 false이고, 요소의 재생이 끝나지 않았으며, 재생이 오류로 인해 중지되지 않았고, 요소가 차단된 미디어 요소가 아닐 때, 해당 요소는 잠재적으로 재생 중이라고 합니다.

잠재적으로 재생 중인 요소가 readyState 속성이 HAVE_FUTURE_DATA보다 낮은 값으로 변경되어 재생을 중지하면, 그 결과로 waiting DOM 이벤트가 발생할 수 있습니다.

다음 조건이 모두 true일 때 미디어 요소자동 재생 가능 상태라고 합니다.

사용자 에이전트와 시스템이 현재 컨텍스트에서 미디어 재생을 허용하는 경우 미디어 요소재생 허용됨 상태라고 합니다.

예를 들어 사용자 에이전트는 미디어 요소Window 객체에 일시적 활성화가 있을 때만 재생을 허용할 수 있지만, 음소거된 동안에는 재생을 허용하도록 예외를 둘 수 있습니다.

미디어 요소는 다음과 같은 경우 재생이 끝남 상태라고 합니다.

ended 속성은 이벤트 루프가 마지막으로 1단계에 도달했을 때 미디어 요소재생이 끝난 상태이고 재생 방향이 정방향이었다면 true를, 그렇지 않으면 false를 반환해야 합니다.

미디어 요소readyState 속성이 HAVE_METADATA 이상이고, 사용자 에이전트가 미디어 데이터를 처리하는 동안 치명적이지 않은 오류를 마주쳤으며, 그 오류로 인해 현재 재생 위치의 콘텐츠를 재생할 수 없는 경우, 해당 요소는 오류로 인해 중지됨 상태라고 합니다.

미디어 요소paused 속성이 false이고, readyState 속성이 HAVE_FUTURE_DATA 또는 HAVE_ENOUGH_DATA이며, 사용자 에이전트가 리소스를 계속하려면 사용자가 선택해야 하는 미디어 리소스의 지점에 도달한 경우, 해당 요소는 사용자 상호 작용을 위해 일시 정지됨 상태라고 합니다.

미디어 요소재생이 끝난 상태와 사용자 상호 작용을 위해 일시 정지된 상태를 동시에 가질 수 있습니다.

잠재적으로 재생 중미디어 요소사용자 상호 작용을 위해 일시 정지되어 재생을 중지하면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 timeupdate라는 이름의 이벤트를 발생시켜야 합니다.

미디어 요소paused 속성이 false이고, readyState 속성이 HAVE_FUTURE_DATA 또는 HAVE_ENOUGH_DATA이며, 사용자 에이전트가 미디어 리소스에 시간적으로 고정되어 있고 길이가 0이 아닌 콘텐츠를 재생하기 위해, 또는 미디어 리소스의 한 구간에 시간적으로 고정되어 있지만 해당 구간보다 긴 콘텐츠를 재생하기 위해 미디어 리소스의 재생을 일시 중단한 경우, 해당 요소는 대역 내 콘텐츠를 위해 일시 정지됨 상태라고 합니다.

미디어 요소대역 내 콘텐츠를 위해 일시 정지되는 한 가지 예는 사용자 에이전트가 외부 WebVTT 파일의 오디오 설명을 재생하고 있으며, 큐에 대해 생성된 합성 음성이 텍스트 트랙 큐 시작 시간텍스트 트랙 큐 종료 시간 사이의 시간보다 긴 경우입니다.


재생 방향이 정방향일 때 현재 재생 위치미디어 리소스의 끝에 도달하면, 사용자 에이전트는 다음 단계를 따라야 합니다.

  1. 미디어 요소loop 속성이 지정되어 있다면, 미디어 리소스가능한 가장 이른 위치탐색하고 반환합니다.

  2. 위에서 정의한 대로 ended IDL 속성은 이벤트 루프1단계로 돌아오면 true를 반환하기 시작합니다.

  3. 미디어 요소와 다음 단계가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.

    1. 미디어 요소에서 timeupdate라는 이름의 이벤트를 발생시킵니다.

    2. 미디어 요소재생이 끝났고, 재생 방향이 정방향이며, paused가 false이면 다음을 수행합니다.

      1. paused 속성을 true로 설정합니다.

      2. 미디어 요소에서 pause라는 이름의 이벤트를 발생시킵니다.

      3. 대기 중인 재생 프로미스를 가져오고, 그 결과와 "AbortError" DOMException을 사용하여 대기 중인 재생 프로미스를 거부합니다.

    3. 미디어 요소에서 ended라는 이름의 이벤트를 발생시킵니다.

재생 방향이 역방향일 때 현재 재생 위치미디어 리소스가능한 가장 이른 위치에 도달하면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 timeupdate라는 이름의 이벤트를 발생시키기만 해야 합니다.

여기서 "도달"이라는 단어는 현재 재생 위치가 일반 재생 중에 변경되어야 한다는 것을 의미하지 않습니다. 예를 들어 탐색을 통해 도달할 수도 있습니다.


defaultPlaybackRate 속성은 미디어 리소스가 재생되어야 하는 원하는 속도를 고유 속도의 배수로 제공합니다. 이 속성은 변경할 수 있습니다. 가져올 때 마지막으로 설정된 값을 반환해야 하며, 아직 설정되지 않았다면 1.0을 반환해야 합니다. 설정할 때 속성을 새 값으로 설정해야 합니다.

defaultPlaybackRate는 사용자 에이전트가 사용자에게 사용자 인터페이스를 노출할 때 사용합니다.

playbackRate 속성은 미디어 리소스가 재생되는 속도인 유효 재생 속도를 고유 속도의 배수로 제공합니다. 이 값이 defaultPlaybackRate와 같지 않다면 사용자가 빨리 감기 또는 느린 재생 같은 기능을 사용 중임을 의미합니다. 이 속성은 변경할 수 있습니다. 가져올 때 마지막으로 설정된 값을 반환해야 하며, 아직 설정되지 않았다면 1.0을 반환해야 합니다. 설정할 때 사용자 에이전트는 다음 단계를 따라야 합니다.

  1. 주어진 값을 사용자 에이전트가 지원하지 않으면 "NotSupportedError" DOMException을 throw합니다.

  2. playbackRate를 새 값으로 설정하고, 요소가 잠재적으로 재생 중이면 재생 속도를 변경합니다.

defaultPlaybackRate 또는 playbackRate 속성의 값이 변경되면(스크립트로 설정되거나 사용자 컨트롤에 대한 응답 등으로 사용자 에이전트가 직접 변경한 경우), 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 ratechange라는 이름의 이벤트를 발생시켜야 합니다. 사용자 에이전트는 속성 변경을 부드럽게 처리해야 하며, 이에 대한 응답으로 인지할 수 있는 재생 공백이나 음소거를 발생시켜서는 안 됩니다.

preservesPitch getter 단계는 재생 중 피치 보존 알고리즘이 적용 중이면 true를 반환하는 것입니다. setter 단계는 인지할 수 있는 재생 공백이나 음소거 없이 피치 보존 알고리즘을 그에 따라 켜거나 끄는 것입니다. 기본적으로 이러한 피치 보존 알고리즘이 적용되어야 합니다(즉, getter는 처음에 true를 반환합니다).


played getter 단계는 일반 재생 중 this현재 재생 위치가 일반적으로 단조 증가하여 도달한, this미디어 리소스미디어 타임라인 지점 범위를 나타내는 새로운 정규화된 TimeRanges 객체를 반환하는 것입니다.

접근할 때마다 새 객체를 반환하는 것은 속성 getter에 좋지 않은 패턴이며, 변경 비용이 크기 때문에 여기에만 유지되어 있습니다. 새로운 API에서 이를 모방해서는 안 됩니다.


미디어 요소에는 대기 중인 재생 프로미스 목록이 있으며, 처음에는 비어 있어야 합니다.

미디어 요소에 대해 대기 중인 재생 프로미스를 가져오려면, 사용자 에이전트는 다음 단계를 실행해야 합니다.

  1. promises를 비어 있는 프로미스 목록으로 둡니다.

  2. 미디어 요소대기 중인 재생 프로미스 목록promises에 복사합니다.

  3. 미디어 요소대기 중인 재생 프로미스 목록을 비웁니다.

  4. promises를 반환합니다.

프로미스 목록 promises가 있는 미디어 요소에 대해 대기 중인 재생 프로미스를 이행하려면, 사용자 에이전트는 promises의 각 프로미스를 undefined로 이행해야 합니다.

프로미스 목록 promises와 예외 이름 error가 있는 미디어 요소에 대해 대기 중인 재생 프로미스를 거부하려면, 사용자 에이전트는 promises의 각 프로미스를 error로 거부해야 합니다.

미디어 요소에 대해 재생 중임을 알리려면, 사용자 에이전트는 다음 단계를 실행해야 합니다.

  1. 대기 중인 재생 프로미스를 가져오고, 그 결과를 promises로 둡니다.

  2. 요소와 다음 단계가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.

    1. 요소에서 playing이라는 이름의 이벤트를 발생시킵니다.

    2. promises를 사용하여 대기 중인 재생 프로미스를 이행합니다.

미디어 요소에서 play() 메서드가 호출되면 사용자 에이전트는 다음 단계를 실행해야 합니다.

  1. 미디어 요소재생 허용됨 상태가 아니라면 다음으로 거부된 프로미스, 즉 "NotAllowedError" DOMException으로 거부된 프로미스를 반환합니다.

  2. 미디어 요소error 속성이 null이 아니고 해당 codeMEDIA_ERR_SRC_NOT_SUPPORTED라면 다음으로 거부된 프로미스, 즉 "NotSupportedError" DOMException으로 거부된 프로미스를 반환합니다.

    이는 전용 미디어 소스 실패 단계가 실행되었음을 의미합니다. 미디어 요소 로드 알고리즘error 속성을 지울 때까지 재생할 수 없습니다.

  3. resumptionSteps미디어 요소지연 로드 재개 단계로 둡니다.

  4. resumptionSteps가 null이 아니면 다음을 수행합니다.

    1. 미디어 요소지연 로드 재개 단계를 null로 설정합니다.

    2. resumptionSteps를 호출합니다.

  5. promise를 새로운 프로미스로 두고 promise대기 중인 재생 프로미스 목록에 추가합니다.

  6. 미디어 요소에 대해 내부 재생 단계를 실행합니다.

  7. promise를 반환합니다.

미디어 요소내부 재생 단계는 다음과 같습니다.

  1. 미디어 요소networkState 속성 값이 NETWORK_EMPTY이면, 미디어 요소리소스 선택 알고리즘을 호출합니다.

  2. 재생이 끝났고 재생 방향이 정방향이면 미디어 리소스가능한 가장 이른 위치탐색합니다.

    이 작업은 사용자 에이전트가 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에서 timeupdate라는 이름의 이벤트를 발생시키게 합니다.

  3. 미디어 요소paused 속성이 true이면 다음을 수행합니다.

    1. paused 값을 false로 변경합니다.

    2. 포스터 표시 플래그가 true이면 요소의 포스터 표시 플래그를 false로 설정하고 시간 진행 단계를 실행합니다.

    3. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 play라는 이름의 이벤트를 발생시킵니다.

    4. 미디어 요소readyState 속성 값이 HAVE_NOTHING, HAVE_METADATA 또는 HAVE_CURRENT_DATA이면, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 waiting이라는 이름의 이벤트를 발생시킵니다.

      그렇지 않으면 미디어 요소readyState 속성 값은 HAVE_FUTURE_DATA 또는 HAVE_ENOUGH_DATA입니다. 요소에 대해 재생 중임을 알림합니다.

  4. 그렇지 않고 미디어 요소readyState 속성 값이 HAVE_FUTURE_DATA 또는 HAVE_ENOUGH_DATA이면, 대기 중인 재생 프로미스를 가져오고, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 그 결과로 대기 중인 재생 프로미스를 이행합니다.

    미디어 요소는 이미 재생 중입니다. 그러나 큐에 추가된 태스크가 실행되기 전에 promise거부될 수도 있습니다.

  5. 미디어 요소자동 재생 가능 플래그를 false로 설정합니다.


pause() 메서드가 호출되거나 사용자 에이전트가 미디어 요소를 일시 정지해야 할 때, 사용자 에이전트는 다음 단계를 실행해야 합니다.

  1. 미디어 요소networkState 속성 값이 NETWORK_EMPTY이면, 미디어 요소리소스 선택 알고리즘을 호출합니다.

  2. 미디어 요소에 대해 내부 일시 정지 단계를 실행합니다.

미디어 요소내부 일시 정지 단계는 다음과 같습니다.

  1. 미디어 요소자동 재생 가능 플래그를 false로 설정합니다.

  2. 미디어 요소paused 속성이 false이면 다음 단계를 실행합니다.

    1. paused 값을 true로 변경합니다.

    2. 대기 중인 재생 프로미스를 가져오고, 그 결과를 promises로 둡니다.

    3. 미디어 요소와 다음 단계가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.

      1. 요소에서 timeupdate라는 이름의 이벤트를 발생시킵니다.

      2. 요소에서 pause라는 이름의 이벤트를 발생시킵니다.

      3. promises"AbortError" DOMException을 사용하여 대기 중인 재생 프로미스를 거부합니다.

    4. 공식 재생 위치현재 재생 위치로 설정합니다.


요소의 playbackRate가 양수 또는 0이면 재생 방향은 정방향입니다. 그렇지 않으면 역방향입니다.

미디어 요소잠재적으로 재생 중이고 그 Document완전히 활성 상태Document이면, 해당 요소의 현재 재생 위치미디어 타임라인 시계의 단위 시간당 요소의 playbackRate 단위의 미디어 시간으로 단조 증가해야 합니다. (이 명세에서는 항상 이를 증가라고 하지만, 요소의 playbackRate가 음수이면 실제로는 감소일 수 있습니다.)

요소의 playbackRate는 0.0일 수 있습니다. 이 경우 재생이 일시 정지되어 있지 않더라도 현재 재생 위치는 움직이지 않습니다 (paused가 true가 되지 않고, pause 이벤트도 발생하지 않습니다).

이 명세는 사용자 에이전트가 적절한 재생 속도를 달성하는 방법을 정의하지 않습니다. 사용 가능한 프로토콜과 미디어에 따라 사용자 에이전트가 서버와 협상하여 서버가 적절한 속도로 미디어 데이터를 제공하도록 할 수도 있습니다. 그러면 속도가 변경된 시점과 서버가 스트림의 재생 속도를 업데이트한 시점 사이의 기간을 제외하면 클라이언트가 실제로 프레임을 삭제하거나 보간할 필요가 없습니다.

사용자 에이전트가 안정 상태를 제공할 때마다 공식 재생 위치현재 재생 위치로 설정해야 합니다.

요소의 playbackRate가 1.0이 아니고 preservesPitch가 true이면 사용자 에이전트는 오디오의 원래 피치를 보존하기 위해 피치 조절을 적용해야 합니다. 그렇지 않으면 피치 조절 없이 오디오 속도를 높이거나 낮춰야 합니다.

미디어 요소잠재적으로 재생 중일 때 재생되는 오디오 데이터는 요소의 유효 미디어 볼륨으로 현재 재생 위치와 동기화되어야 합니다. 사용자 에이전트는 이벤트 루프가 마지막으로 1단계에 도달했을 때 활성화되어 있던 오디오 트랙의 오디오를 재생해야 합니다.

미디어 요소잠재적으로 재생 중이 아니면 요소의 오디오를 재생해서는 안 됩니다.

미디어 요소문서 안에 있지 않은 동안 잠재적으로 재생 중이면 비디오는 재생해서는 안 되지만, 오디오 구성 요소는 재생하는 것이 좋습니다. 미디어 요소에 대한 모든 참조가 제거되었다는 이유만으로 재생을 중지해서는 안 됩니다. 해당 미디어 요소가 더 이상 어떤 오디오도 재생할 수 없는 상태가 된 뒤에만 가비지 컬렉션할 수 있습니다.

명시적인 참조가 없는 요소도 오디오를 재생할 수 있습니다. 이러한 요소가 여전히 능동적으로 재생 중이지 않더라도 가능합니다. 예를 들어 일시 정지되지 않았지만 콘텐츠가 버퍼링되기를 기다리며 정지되어 있거나, 아직 버퍼링 중이지만 재생을 시작하는 suspend 이벤트 리스너가 있을 수 있습니다. 미디어 리소스에 오디오 트랙이 없는 미디어 요소조차도 미디어 리소스를 변경하는 이벤트 리스너가 있다면 나중에 다시 오디오를 재생할 수 있습니다.


미디어 요소에는 새로 도입된 큐 목록이 있으며, 처음에는 비어 있어야 합니다. 미디어 요소텍스트 트랙 목록에 있는 텍스트 트랙큐 목록텍스트 트랙 큐가 추가될 때마다, 해당 미디어 요소새로 도입된 큐 목록에 추가해야 합니다. 미디어 요소텍스트 트랙 목록텍스트 트랙이 추가될 때마다, 해당 텍스트 트랙큐 목록에 있는 모든 미디어 요소새로 도입된 큐 목록에 추가해야 합니다. 미디어 요소포스터 표시 플래그가 설정되어 있지 않은 동안 새로 도입된 큐 목록에 새 큐가 추가되면, 사용자 에이전트는 시간 진행 단계를 실행해야 합니다.

미디어 요소텍스트 트랙 목록에 있는 텍스트 트랙큐 목록에서 텍스트 트랙 큐가 제거될 때마다, 그리고 미디어 요소텍스트 트랙 목록에서 텍스트 트랙이 제거될 때마다, 미디어 요소포스터 표시 플래그가 설정되어 있지 않다면 사용자 에이전트는 시간 진행 단계를 실행해야 합니다.

미디어 요소현재 재생 위치가 변경되면 (예: 재생 또는 탐색으로 인해) 사용자 에이전트는 시간 진행 단계를 실행해야 합니다. 비디오의 장면 전환과 자막을 동기화하는 경우처럼 큐 이벤트 발생의 시간 정확도에 의존하는 사용 사례를 지원하기 위해 사용자 에이전트는 큐 이벤트를 미디어 타임라인상의 위치에 가능한 한 가깝게, 이상적으로는 20밀리초 이내에 발생시키는 것이 좋습니다. 단계가 실행되는 동안 현재 재생 위치가 변경되면, 사용자 에이전트는 단계가 완료될 때까지 기다린 다음 즉시 단계를 다시 실행해야 합니다. 따라서 이 단계는 가능한 한 자주 또는 필요한 만큼 실행됩니다.

한 번의 반복에 오랜 시간이 걸리면 사용자 에이전트가 "따라잡기" 위해 앞으로 빠르게 진행하면서 재생 시간이 짧은 를 건너뛸 수 있습니다. 그러면 이러한 큐는 activeCues 목록에 나타나지 않습니다.

시간 진행 단계는 다음과 같습니다.

  1. current cues를 큐 목록으로 둡니다. 이 목록은 미디어 요소숨김 또는 표시 중인 모든 텍스트 트랙 (단, 비활성화된 트랙은 제외)의 모든 중, 시작 시간현재 재생 위치 이하이고 종료 시간현재 재생 위치보다 큰 모든 를 포함하도록 초기화합니다.

  2. other cues를 큐 목록으로 둡니다. 이 목록은 current cues에 없는 미디어 요소숨김표시 중텍스트 트랙의 모든 를 포함하도록 초기화합니다.

  3. 이 알고리즘이 이 미디어 요소에 대해 처음 실행된 것이 아니라면, last time을 이 알고리즘이 마지막으로 실행되었을 때의 현재 재생 위치로 둡니다.

  4. 현재 재생 위치가 이 알고리즘이 마지막으로 실행된 이후 일반 재생 중의 일반적인 단조 증가를 통해서만 변경되었다면, missed cuesother cues에 있는 시작 시간last time 이상이고 종료 시간현재 재생 위치 이하인 큐의 목록으로 둡니다. 그렇지 않으면 missed cues를 빈 목록으로 둡니다.

  5. missed cues에 있는 미디어 요소새로 도입된 큐 목록에도 있는 모든 큐를 제거한 다음, 요소의 새로 도입된 큐 목록을 비웁니다.

  6. 일반 재생 중 현재 재생 위치의 일반적인 단조 증가를 통해 해당 시간에 도달했고, 사용자 에이전트가 지난 15~250ms 동안 요소에서 timeupdate 이벤트를 발생시키지 않았으며 해당 이벤트의 이벤트 처리기를 여전히 실행 중이지 않다면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 timeupdate라는 이름의 이벤트를 발생시켜야 합니다. (명시적 탐색 같은 다른 경우에는 현재 재생 위치를 변경하는 전체 과정의 일부로 관련 이벤트가 발생합니다.)

    따라서 이 이벤트는 약 66Hz보다 빠르거나 4Hz보다 느리게 발생해서는 안 됩니다 (이벤트 처리기를 실행하는 데 250ms보다 오래 걸리지 않는다고 가정). 사용자 에이전트는 비디오를 디코딩하면서 편안하게 처리할 수 있는 빈도보다 UI 업데이트가 더 자주 발생하지 않도록 시스템 부하와 매번 이벤트를 처리하는 평균 비용을 기반으로 이벤트 빈도를 변경하는 것이 권장됩니다.

  7. current cues의 모든 텍스트 트랙 큐 활성 플래그가 설정되어 있고, other cues의 어떤 에도 텍스트 트랙 큐 활성 플래그가 설정되어 있지 않으며, missed cues가 비어 있다면 반환합니다.

  8. 일반 재생 중 현재 재생 위치의 일반적인 단조 증가를 통해 해당 시간에 도달했고, other cues텍스트 트랙 큐 종료 시 일시 정지 플래그가 설정되어 있으며 텍스트 트랙 큐 활성 플래그도 설정되어 있거나 missed cues에도 있는 가 있다면, 미디어 요소즉시 일시 정지합니다.

    명시적 탐색 같은 다른 경우에는 텍스트 트랙 큐 종료 시 일시 정지 플래그가 설정되어 있더라도 해당 의 종료 시간을 지나갔다고 재생이 일시 정지되지는 않습니다.

  9. events를 처음에는 비어 있는 태스크 목록으로 둡니다. 이 목록의 각 태스크텍스트 트랙, 텍스트 트랙 큐 및 시간과 연결되며, 이는 태스크가 큐에 추가되기 전에 목록을 정렬하는 데 사용됩니다.

    affected tracks를 처음에는 비어 있는 텍스트 트랙 목록으로 둡니다.

    아래 단계에서 시간 time과 함께 텍스트 트랙 큐 target에 대해 event라는 이름의 이벤트를 준비하라고 하면 사용자 에이전트는 다음 단계를 실행해야 합니다.

    1. track텍스트 트랙 큐 target과 연결된 텍스트 트랙으로 둡니다.

    2. target에서 event라는 이름의 이벤트를 발생시키는 태스크를 생성합니다.

    3. 새로 생성한 태스크를 시간 time, 텍스트 트랙 track, 텍스트 트랙 큐 target과 연결하여 events에 추가합니다.

    4. trackaffected tracks에 추가합니다.

  10. missed cues의 각 텍스트 트랙 큐에 대해, 텍스트 트랙 큐 시작 시간을 사용하여 TextTrackCue 객체에 대해 enter라는 이름의 이벤트를 준비합니다.

  11. other cues의 각 텍스트 트랙 큐텍스트 트랙 큐 활성 플래그가 설정되어 있거나 missed cues에 있는 큐에 대해, 텍스트 트랙 큐 종료 시간텍스트 트랙 큐 시작 시간 중 더 늦은 시간을 사용하여 TextTrackCue 객체에 대해 exit라는 이름의 이벤트를 준비합니다.

  12. current cues의 각 텍스트 트랙 큐텍스트 트랙 큐 활성 플래그가 설정되어 있지 않은 큐에 대해, 텍스트 트랙 큐 시작 시간을 사용하여 TextTrackCue 객체에 대해 enter라는 이름의 이벤트를 준비합니다.

  13. events태스크를 시간 오름차순 (시간이 더 이른 태스크가 먼저)으로 정렬합니다.

    시간이 같은 events태스크를 해당 태스크와 연결된 텍스트 트랙 큐의 상대적인 텍스트 트랙 큐 순서로 추가 정렬합니다.

    마지막으로 시간과 텍스트 트랙 큐 순서가 모두 같은 events태스크exit 이벤트를 발생시키는 태스크보다 enter 이벤트를 발생시키는 태스크가 먼저 오도록 정렬합니다.

  14. events의 각 태스크에 대해 목록 순서대로 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.

  15. affected tracks미디어 요소텍스트 트랙 목록텍스트 트랙이 나타나는 것과 같은 순서로 정렬하고 중복을 제거합니다.

  16. affected tracks의 각 텍스트 트랙에 대해 목록 순서대로 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 TextTrack 객체에서 cuechange라는 이름의 이벤트를 발생시킵니다. 또한 텍스트 트랙에 대응하는 track 요소가 있다면, 이어서 track 요소에서도 cuechange라는 이름의 이벤트를 발생시킵니다.

  17. current cues의 모든 텍스트 트랙 큐 활성 플래그를 설정하고, other cues의 모든 에서 텍스트 트랙 큐 활성 플래그를 해제합니다.

  18. affected tracks에서 표시 중인 각 텍스트 트랙에 대해 텍스트 트랙 렌더링을 업데이트하는 규칙을 실행합니다. 이때 텍스트 트랙텍스트 트랙 언어가 빈 문자열이 아니라면 대체 언어로 제공합니다. 예를 들어 WebVTT 기반 텍스트 트랙의 경우 WebVTT 텍스트 트랙 표시를 업데이트하는 규칙입니다. [WEBVTT]

위 알고리즘의 목적상 텍스트 트랙 큐는 단순히 텍스트 트랙과 연결되어 있는 경우가 아니라, 텍스트 트랙 큐 목록에 나열된 경우에만 텍스트 트랙의 일부로 간주됩니다.

미디어 요소노드 문서완전히 활성 상태인 문서가 아니게 되면, 문서가 다시 활성 상태가 될 때까지 재생이 중지됩니다.

미디어 요소Document에서 제거되면, 사용자 에이전트는 다음 단계를 실행해야 합니다.

  1. 안정 상태를 기다려, 미디어 요소Document에서 제거한 태스크가 계속 진행할 수 있게 합니다. 동기 구간은 이 알고리즘의 나머지 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)

  2. 미디어 요소문서 안에 있으면 반환합니다.

  3. 미디어 요소에 대해 내부 일시 정지 단계를 실행합니다.

4.8.11.9 탐색
media.seeking

사용자 에이전트가 현재 탐색 중이면 true를 반환합니다.

media.seekable

HTMLMediaElement/seekable

현재 모든 엔진에서 지원됩니다.

Firefox8+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

사용자 에이전트가 탐색할 수 있는 미디어 리소스의 범위를 나타내는 TimeRanges 객체를 반환합니다.

media.fastSeek(time)

HTMLMediaElement/fastSeek

Firefox31+Safari8+Chrome아니요
Opera?Edge아니요
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

정밀도보다 속도를 우선하여 가능한 한 빠르게 주어진 time에 가까운 위치로 탐색합니다. (정확한 시간으로 탐색하려면 currentTime 속성을 사용합니다.)

미디어 리소스가 로드되지 않았다면 아무 작업도 하지 않습니다.

seeking 속성의 초기값은 false여야 합니다.

fastSeek(time) 메서드는 속도를 위해 근사 플래그를 설정한 상태로 time이 지정한 시간으로 탐색해야 합니다.

사용자 에이전트가 미디어 리소스에서 특정 new playback position으로 탐색해야 할 때, 선택적으로 속도를 위해 근사 플래그를 설정할 수 있으며, 이는 사용자 에이전트가 다음 단계를 실행해야 함을 의미합니다. 이 알고리즘은 이벤트 루프 메커니즘과 밀접하게 상호 작용합니다. 특히 이벤트 루프 알고리즘의 일부로 트리거되는 동기 구간이 있습니다. 해당 구간의 단계는 ⌛로 표시됩니다.

  1. 미디어 요소포스터 표시 플래그를 false로 설정합니다.

  2. 미디어 요소readyStateHAVE_NOTHING이면 반환합니다.

  3. 요소의 seeking IDL 속성이 true이면 이 알고리즘의 다른 인스턴스가 이미 실행 중입니다. 해당 인스턴스가 실행 중인 단계가 완료되기를 기다리지 않고 그 알고리즘 인스턴스를 중단합니다.

  4. seeking IDL 속성을 true로 설정합니다.

  5. 탐색이 DOM 메서드 호출 또는 IDL 속성 설정에 대한 응답으로 이루어졌다면 스크립트를 계속합니다. 나머지 단계는 병렬로 실행해야 합니다. ⌛로 표시된 단계를 제외하면 이 알고리즘의 다른 인스턴스가 호출되어 언제든 중단될 수 있습니다.

  6. new playback position미디어 리소스의 끝보다 뒤에 있다면, 대신 미디어 리소스의 끝으로 둡니다.

  7. new playback position가능한 가장 이른 위치보다 작다면, 대신 해당 위치로 둡니다.

  8. 현재 변경되었을 수도 있는 new playback positionseekable 속성에 지정된 범위 중 하나에 포함되지 않는다면, seekable 속성에 지정된 범위의 위치 중 new playback position에 가장 가까운 위치로 둡니다. 두 위치가 이 제약을 모두 충족한다면, 즉 new playback positionseekable 속성의 두 범위 사이 정중앙에 있다면, 현재 재생 위치에 가장 가까운 위치를 사용합니다. seekable 속성에 지정된 범위가 없다면 seeking IDL 속성을 false로 설정하고 반환합니다.

  9. 속도를 위해 근사 플래그가 설정되어 있다면 재생을 신속하게 재개할 수 있는 값으로 new playback position을 조정합니다. 이 단계 이전의 new playback position현재 재생 위치보다 앞에 있었다면, 조정된 new playback position현재 재생 위치보다 앞에 있어야 합니다. 마찬가지로 이 단계 이전의 new playback position현재 재생 위치보다 뒤에 있었다면, 조정된 new playback position현재 재생 위치보다 뒤에 있어야 합니다.

    예를 들어 사용자 에이전트는 재생을 재개하기 전에 중간 프레임을 디코딩한 뒤 폐기하는 데 시간을 소비하지 않아도 되도록 인접한 키 프레임에 맞출 수 있습니다.

  10. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 seeking이라는 이름의 이벤트를 발생시킵니다.

  11. 현재 재생 위치new playback position으로 설정합니다.

    미디어 요소가 탐색을 시작하기 직전에 잠재적으로 재생 중이었지만 탐색으로 인해 readyState 속성이 HAVE_FUTURE_DATA보다 낮은 값으로 변경되었다면 요소에서 waiting 이벤트가 발생합니다.

    이 단계는 현재 재생 위치를 설정하므로 사용자 에이전트가 해당 위치의 미디어 데이터를 실제로 렌더링할 수 있게 되기 전에도, 다음 단계에서 결정되는 것과 별개로 반복 처리를 다루는 논리의 일부인 재생이 "미디어 리소스의 끝에 도달"하는 시점에 관한 규칙과 같은 다른 조건을 즉시 트리거할 수 있습니다.

    currentTime 속성은 현재 재생 위치가 아니라 공식 재생 위치를 반환하므로 이 알고리즘과 별개로 스크립트 실행 전에 업데이트됩니다.

  12. 사용자 에이전트가 new playback position에 대한 미디어 데이터를 사용할 수 있는지 여부를 확정할 때까지 기다리고, 사용할 수 있다면 해당 위치를 재생할 수 있을 만큼 충분한 데이터를 디코딩할 때까지 기다립니다.

  13. 안정 상태를 기다립니다. 동기 구간은 이 알고리즘의 나머지 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)

  14. seeking IDL 속성을 false로 설정합니다.

  15. 시간 진행 단계를 실행합니다.

  16. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 timeupdate라는 이름의 이벤트를 발생시킵니다.

  17. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소에서 seeked라는 이름의 이벤트를 발생시킵니다.


seekable getter 단계는 사용자 에이전트가 탐색할 수 있는 this미디어 리소스 범위가 있다면 이를 나타내는 새로운 정규화된 TimeRanges 객체를 반환하는 것입니다.

예를 들어 단순한 동영상 파일이고 사용자 에이전트와 서버가 HTTP Range 요청을 지원하기 때문에 사용자 에이전트가 미디어 리소스의 어느 위치로든 탐색할 수 있다면, 이 속성은 하나의 범위를 가진 객체를 반환합니다. 해당 범위의 시작은 첫 번째 프레임의 시간 (일반적으로 0인 가능한 가장 이른 위치)이고, 끝은 첫 번째 프레임의 시간에 duration 속성 값을 더한 것과 같습니다. 이는 마지막 프레임의 시간과 같으며 양의 Infinity일 수도 있습니다.

사용자 에이전트가 무한 스트림에서 이동하는 창을 버퍼링하는 경우처럼 범위는 계속 변경될 수 있습니다. 예를 들어 라이브 TV를 시청하는 DVR에서 이러한 동작을 볼 수 있습니다.

접근할 때마다 새 객체를 반환하는 것은 속성 getter에 좋지 않은 패턴이며, 변경 비용이 크기 때문에 여기에만 유지되어 있습니다. 새로운 API에서 이를 모방해서는 안 됩니다.

사용자 에이전트는 탐색 가능한 범위를 매우 관대하고 낙관적으로 판단하는 것이 좋습니다. 또한 탐색을 빠르게 수행할 수 있도록 가능한 경우 최근 콘텐츠를 버퍼링하는 것이 좋습니다.

예를 들어 HTTP Range 요청을 지원하지 않는 HTTP 서버에서 제공되는 대용량 비디오 파일을 생각해 보겠습니다. 브라우저는 현재 프레임과 이후 프레임에 대해 얻은 데이터만 버퍼링하고, 재생을 다시 시작하여 맨 처음으로 탐색하는 경우를 제외하면 탐색을 전혀 허용하지 않는 방식으로 이를 구현할 수도 있습니다. 그러나 이는 좋지 않은 구현입니다. 고품질 구현이라면 최근 몇 분간의 콘텐츠를 버퍼링하고, 충분한 저장 공간이 있다면 그 이상을 버퍼링하여 사용자가 놀라운 장면으로 지연 없이 되돌아가 다시 볼 수 있게 합니다. 또한 필요한 경우 파일을 처음부터 다시 로드하여 임의의 위치로 탐색할 수 있게 합니다. 이는 더 느리지만 이전에 버퍼링되지 않은 지점에 도달하기 위해 비디오를 실제로 처음부터 다시 시작하고 끝까지 시청해야 하는 것보다는 편리합니다.

미디어 리소스는 내부적으로 스크립팅되거나 상호 작용형일 수 있습니다. 따라서 미디어 요소는 비선형 방식으로 재생될 수 있습니다. 이러한 일이 발생하면 사용자 에이전트는 현재 재생 위치가 불연속적으로 변경될 때마다 관련 이벤트가 발생하도록 탐색 알고리즘이 사용된 것처럼 동작해야 합니다.

4.8.11.10 여러 미디어 트랙이 있는 미디어 리소스

미디어 리소스에는 내장된 오디오 및 비디오 트랙이 여러 개 있을 수 있습니다. 예를 들어 기본 비디오 및 오디오 트랙 외에도 미디어 리소스에는 외국어 더빙 대화, 감독 해설, 오디오 설명, 대체 각도 또는 수어 오버레이가 있을 수 있습니다.

media.audioTracks

HTMLMediaElement/audioTracks

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

미디어 리소스에서 사용할 수 있는 오디오 트랙을 나타내는 AudioTrackList 객체를 반환합니다.

media.videoTracks

HTMLMediaElement/videoTracks

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

미디어 리소스에서 사용할 수 있는 비디오 트랙을 나타내는 VideoTrackList 객체를 반환합니다.

미디어 요소audioTracks 속성은 미디어 요소미디어 리소스에서 사용할 수 있는 오디오 트랙을 나타내는 라이브 AudioTrackList 객체를 반환해야 합니다.

미디어 요소videoTracks 속성은 미디어 요소미디어 리소스에서 사용할 수 있는 비디오 트랙을 나타내는 라이브 VideoTrackList 객체를 반환해야 합니다.

다른 미디어 리소스가 요소에 로드되더라도, 각 미디어 요소에는 항상 하나의 AudioTrackList 객체와 하나의 VideoTrackList 객체만 있으며 객체는 재사용됩니다. (그러나 AudioTrackVideoTrack 객체는 재사용되지 않습니다.)

4.8.11.10.1 AudioTrackListVideoTrackList 객체

AudioTrackList

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

VideoTrackList

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

AudioTrackList

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
caniuse.com 표

AudioTrackListVideoTrackList 인터페이스는 이전 절에서 정의한 속성에 사용됩니다.

AudioTrack

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari8+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

VideoTrack

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
[Exposed=Window]
interface AudioTrackList : EventTarget {
  readonly attribute unsigned long length;
  getter AudioTrack (unsigned long index);
  AudioTrack? getTrackById(DOMString id);

  attribute EventHandler onchange;
  attribute EventHandler onaddtrack;
  attribute EventHandler onremovetrack;
};

[Exposed=Window]
interface AudioTrack {
  readonly attribute DOMString id;
  readonly attribute DOMString kind;
  readonly attribute DOMString label;
  readonly attribute DOMString language;
  attribute boolean enabled;
};

[Exposed=Window]
interface VideoTrackList : EventTarget {
  readonly attribute unsigned long length;
  getter VideoTrack (unsigned long index);
  VideoTrack? getTrackById(DOMString id);
  readonly attribute long selectedIndex;

  attribute EventHandler onchange;
  attribute EventHandler onaddtrack;
  attribute EventHandler onremovetrack;
};

[Exposed=Window]
interface VideoTrack {
  readonly attribute DOMString id;
  readonly attribute DOMString kind;
  readonly attribute DOMString label;
  readonly attribute DOMString language;
  attribute boolean selected;
};
media.audioTracks.length

AudioTrackList/length

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
media.videoTracks.length

VideoTrackList/length

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

목록에 있는 트랙 수를 반환합니다.

audioTrack = media.audioTracks[index]
videoTrack = media.videoTracks[index]

지정된 AudioTrack 또는 VideoTrack 객체를 반환합니다.

audioTrack = media.audioTracks.getTrackById(id)

AudioTrackList/getTrackById

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
videoTrack = media.videoTracks.getTrackById(id)

VideoTrackList/getTrackById

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

주어진 식별자를 가진 AudioTrack 또는 VideoTrack 객체를 반환하고, 해당 식별자를 가진 트랙이 없다면 null을 반환합니다.

audioTrack.id

AudioTrack/id

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari8+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
videoTrack.id

VideoTrack/id

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

주어진 트랙의 ID를 반환합니다. 형식이 미디어 프래그먼트 구문을 지원한다면 이 ID를 프래그먼트와 함께 사용할 수 있으며, getTrackById() 메서드와 함께 사용할 수도 있습니다.

audioTrack.kind

AudioTrack/kind

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari8+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
videoTrack.kind

VideoTrack/kind

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

주어진 트랙이 속하는 범주를 반환합니다. 가능한 트랙 범주는 아래에 제시되어 있습니다.

audioTrack.label

AudioTrack/label

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari8+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
videoTrack.label

VideoTrack/label

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

알려져 있다면 주어진 트랙의 레이블을 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.

audioTrack.language

AudioTrack/language

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari8+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
videoTrack.language

VideoTrack/language

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

알려져 있다면 주어진 트랙의 언어를 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.

audioTrack.enabled [ = value ]

AudioTrack/enabled

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari8+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

주어진 트랙이 활성 상태이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

트랙의 활성화 여부를 변경하도록 설정할 수 있습니다. 여러 오디오 트랙이 동시에 활성화되면 서로 믹싱됩니다.

media.videoTracks.selectedIndex

VideoTrackList/selectedIndex

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

현재 선택된 트랙이 있다면 그 인덱스를 반환하고, 그렇지 않으면 −1을 반환합니다.

videoTrack.selected [ = value ]

VideoTrack/selected

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

주어진 트랙이 활성 상태이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

트랙의 선택 여부를 변경하도록 설정할 수 있습니다. 선택되는 비디오 트랙은 0개 또는 1개이며, 이전 트랙이 선택된 상태에서 새로운 트랙을 선택하면 이전 트랙의 선택이 해제됩니다.

AudioTrackList 객체는 0개 이상의 오디오 트랙으로 구성된 동적 목록을 나타내며, 한 번에 0개 이상의 트랙을 활성화할 수 있습니다. 각 오디오 트랙은 AudioTrack 객체로 나타냅니다.

VideoTrackList 객체는 0개 이상의 비디오 트랙으로 구성된 동적 목록을 나타내며, 한 번에 0개 또는 1개의 트랙을 선택할 수 있습니다. 각 비디오 트랙은 VideoTrack 객체로 나타냅니다.

AudioTrackListVideoTrackList 객체의 트랙은 일관된 순서로 정렬되어야 합니다. 미디어 리소스가 순서를 정의하는 형식이라면 해당 순서를 사용해야 합니다. 그렇지 않으면 트랙이 미디어 리소스에 선언된 상대적인 순서를 사용해야 합니다. 사용되는 순서를 목록의 자연 순서라고 합니다.

따라서 이러한 객체의 각 트랙에는 인덱스가 있습니다. 첫 번째 트랙의 인덱스는 0이고, 이후 각 트랙에는 이전 트랙보다 1 큰 번호가 지정됩니다. 미디어 리소스가 오디오 또는 비디오 트랙을 동적으로 추가하거나 제거하면 트랙의 인덱스도 동적으로 변경됩니다. 미디어 리소스가 완전히 변경되면 이전의 모든 트랙이 제거되고 새로운 트랙으로 교체됩니다.

AudioTrackList lengthVideoTrackList length 속성 getter는 가져오는 시점에 해당 객체가 나타내는 트랙 수를 반환해야 합니다.

특정 시점의 AudioTrackListVideoTrackList 객체의 지원되는 속성 인덱스는 트랙이 나타내어지는 경우 0부터 해당 객체가 나타내는 트랙 수에서 1을 뺀 값까지의 숫자입니다. AudioTrackList 또는 VideoTrackList 객체가 트랙을 나타내지 않는다면 지원되는 속성 인덱스가 없습니다.

AudioTrackList 또는 VideoTrackList 객체 list에서 주어진 인덱스 index에 대한 인덱스 속성의 값을 결정하려면, 사용자 에이전트는 list에서 index번째 트랙을 나타내는 AudioTrack 또는 VideoTrack 객체를 반환해야 합니다.

AudioTrackList getTrackById(id)VideoTrackList getTrackById(id) 메서드는 각각 AudioTrackList 또는 VideoTrackList 객체에서 식별자가 id 인수의 값과 같은 첫 번째 AudioTrack 또는 VideoTrack 객체를 위에서 정의한 목록의 자연 순서에 따라 반환해야 합니다. 주어진 인수와 일치하는 트랙이 없다면 메서드는 null을 반환해야 합니다.

AudioTrackVideoTrack 객체는 미디어 리소스의 특정 트랙을 나타냅니다. 각 트랙에는 식별자, 범주, 레이블 및 언어가 있을 수 있습니다. 트랙의 이러한 측면은 트랙의 수명 동안 영구적입니다. 트랙이 미디어 리소스AudioTrackList 또는 VideoTrackList 객체에서 제거되더라도 이러한 측면은 변경되지 않습니다.

또한 각 AudioTrack 객체는 활성화하거나 비활성화할 수 있습니다. 이를 오디오 트랙의 활성화 상태라고 합니다. AudioTrack이 생성되면 그 활성화 상태를 false(비활성화됨)로 설정해야 합니다. 리소스 가져오기 알고리즘이 이를 재정의할 수 있습니다.

마찬가지로 각 VideoTrackList 객체에서 하나의 VideoTrack 객체를 선택할 수 있으며, 이를 비디오 트랙의 선택 상태라고 합니다. VideoTrack이 생성되면 그 선택 상태를 false(선택되지 않음)로 설정해야 합니다. 리소스 가져오기 알고리즘이 이를 재정의할 수 있습니다.

AudioTrack idVideoTrack id 속성은 트랙에 식별자가 있다면 이를 반환하고, 그렇지 않으면 빈 문자열을 반환해야 합니다. 미디어 리소스미디어 프래그먼트 구문을 지원하는 형식이라면 특정 트랙에 대해 반환되는 식별자는 그러한 프래그먼트의 트랙 차원에서 트랙 이름으로 사용했을 때 해당 트랙을 활성화하는 식별자와 같아야 합니다. [INBAND]

예를 들어 Ogg 파일에서는 트랙의 Name 헤더 필드가 이에 해당합니다. [OGGSKELETONHEADERS]

AudioTrack kindVideoTrack kind 속성은 트랙에 범주가 있다면 이를 반환하고, 그렇지 않으면 빈 문자열을 반환해야 합니다.

트랙의 범주는 미디어 리소스의 트랙에 포함된 메타데이터를 기반으로 표의 두 번째 및 세 번째 열에 있는 정의에 따라 해당 트랙에 가장 적합한 아래 표의 첫 번째 열 문자열입니다. 행의 세 번째 열 셀은 해당 행의 첫 번째 열 셀에 있는 범주가 무엇에 적용되는지를 나타냅니다. 범주가 오디오 트랙에 적용되는 경우에만 오디오 트랙에 적합하며, 비디오 트랙에 적용되는 경우에만 비디오 트랙에 적합합니다. 범주는 오디오에 적합한 경우에만 AudioTrack 객체에 대해 반환해야 하며, 비디오에 적합한 경우에만 VideoTrack 객체에 대해 반환해야 합니다.

Ogg 파일에서는 트랙의 Role 헤더 필드가 관련 메타데이터를 제공합니다. DASH 미디어 리소스에서는 Role 요소가 정보를 전달합니다. WebM에서는 현재 FlagDefault 요소만 값에 매핑됩니다. 미디어 컨테이너의 대역 내 미디어 리소스 트랙을 HTML로 가져오기에 자세한 내용이 있습니다. [OGGSKELETONHEADERS] [DASH] [WEBMCG] [INBAND]

AudioTrackkindVideoTrackkind 반환값
범주 정의 적용 대상...
"alternative" 기본 트랙을 대체할 수 있는 트랙입니다. 예를 들어 노래의 다른 테이크(오디오) 또는 다른 각도 (비디오)입니다. 오디오 및 비디오. Ogg: "audio/alternate" 또는 "video/alternate"; DASH: "main" 및 "commentary" 역할이 없는 "alternate", 오디오의 경우 "dub" 역할도 없음(다른 역할은 무시).
"captions" 캡션이 영상에 삽입된 기본 비디오 트랙 버전입니다. (레거시 콘텐츠용이며 새로운 콘텐츠는 텍스트 트랙을 사용합니다.) 비디오 전용. DASH: "caption" 및 "main" 역할을 함께 사용(다른 역할은 무시).
"descriptions" 비디오 트랙의 오디오 설명입니다. 오디오 전용. Ogg: "audio/audiodesc".
"main" 기본 오디오 또는 비디오 트랙입니다. 오디오 및 비디오. Ogg: "audio/main" 또는 "video/main"; WebM: "FlagDefault" 요소가 설정됨; DASH: "caption", "subtitle" 및 "dub" 역할이 없는 "main" 역할(다른 역할은 무시).
"main-desc" 오디오 설명이 믹싱된 기본 오디오 트랙입니다. 오디오 전용. MPEG-2 TS의 AC3 오디오: bsmod=2 및 full_svc=1.
"sign" 오디오 트랙의 수어 통역입니다. 비디오 전용. Ogg: "video/sign".
"subtitles" 자막이 영상에 삽입된 기본 비디오 트랙 버전입니다. (레거시 콘텐츠용이며 새로운 콘텐츠는 텍스트 트랙을 사용합니다.) 비디오 전용. DASH: "subtitle" 및 "main" 역할을 함께 사용(다른 역할은 무시).
"translation" 기본 오디오 트랙의 번역된 버전입니다. 오디오 전용. Ogg: "audio/dub". DASH: "dub" 및 "main" 역할을 함께 사용(다른 역할은 무시).
"commentary" 감독 해설과 같은 기본 오디오 또는 비디오 트랙에 대한 해설입니다. 오디오 및 비디오. DASH: "main" 역할이 없는 "commentary" 역할(다른 역할은 무시).
"" (빈 문자열) 명시적인 종류가 없거나, 트랙 메타데이터가 지정한 종류를 사용자 에이전트가 인식하지 못합니다. 오디오 및 비디오.

AudioTrack labelVideoTrack label 속성은 트랙에 레이블이 있다면 이를 반환하고, 그렇지 않으면 빈 문자열을 반환해야 합니다. [INBAND]

AudioTrack languageVideoTrack language 속성은 트랙에 언어가 있다면 해당 언어의 BCP 47 언어 태그를 반환하고, 그렇지 않으면 빈 문자열을 반환해야 합니다. 사용자 에이전트가 해당 언어를 BCP 47 언어 태그로 표현할 수 없다면, 예를 들어 미디어 리소스 형식의 언어 정보가 정의된 해석이 없는 자유 형식 문자열이라면, 메서드는 트랙에 언어가 없는 것처럼 빈 문자열을 반환해야 합니다. [INBAND]

AudioTrack enabled 속성은 가져올 때 트랙이 현재 활성화되어 있다면 true를 반환하고, 그렇지 않으면 false를 반환해야 합니다. 설정할 때 새 값이 true이면 트랙을 활성화하고, 그렇지 않으면 비활성화해야 합니다. (트랙이 더 이상 AudioTrackList 객체에 없으면 트랙의 활성화 또는 비활성화는 AudioTrack 객체의 속성 값을 변경하는 것 외에는 아무런 효과가 없습니다.)

AudioTrackList에서 비활성화되어 있던 오디오 트랙이 활성화될 때마다, 그리고 활성화되어 있던 트랙이 비활성화될 때마다, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 AudioTrackList 객체에서 change라는 이름의 이벤트를 발생시켜야 합니다.

미디어 타임라인의 특정 위치에 대한 데이터가 없거나 해당 위치에 존재하지 않는 오디오 트랙은 타임라인의 해당 지점에서 무음인 것으로 해석해야 합니다.

VideoTrackList selectedIndex 속성은 현재 선택된 트랙이 있다면 그 인덱스를 반환해야 합니다. VideoTrackList 객체가 현재 트랙을 나타내지 않거나 어떤 트랙도 선택되지 않았다면 대신 −1을 반환해야 합니다.

VideoTrack selected 속성은 가져올 때 트랙이 현재 선택되어 있다면 true를 반환하고, 그렇지 않으면 false를 반환해야 합니다. 설정할 때 새 값이 true이면 트랙을 선택하고, 그렇지 않으면 선택을 해제해야 합니다. 트랙이 VideoTrackList에 있다면 해당 목록의 다른 모든 VideoTrack 객체의 선택을 해제해야 합니다. (트랙이 더 이상 VideoTrackList 객체에 없으면 트랙의 선택 또는 선택 해제는 VideoTrack 객체의 속성 값을 변경하는 것 외에는 아무런 효과가 없습니다.)

VideoTrackList에서 이전에 선택되지 않았던 트랙이 선택될 때마다, 그리고 VideoTrackList에서 선택되어 있던 트랙이 새로운 트랙으로 대체되지 않은 상태에서 선택 해제될 때마다, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 VideoTrackList 객체에서 change라는 이름의 이벤트를 발생시켜야 합니다. 이 태스크resize 이벤트를 발생시키는 태스크가 있다면 그 태스크보다 먼저 큐에 추가되어야 합니다.

미디어 타임라인의 특정 위치에 대한 데이터가 없는 비디오 트랙은 해당 위치 이전의 마지막 프레임과 같은 크기로 타임라인의 해당 지점에서 투명한 검은색인 것으로 해석해야 합니다. 해당 위치가 그 트랙의 모든 데이터보다 앞에 있다면 트랙의 첫 번째 프레임과 같은 크기를 사용합니다. 현재 위치에 전혀 존재하지 않는 트랙은 존재하지만 데이터가 없는 것처럼 처리해야 합니다.

예를 들어 비디오에 재생 시작 후 한 시간이 지나서야 도입되는 트랙이 있고 사용자가 해당 트랙을 선택한 다음 시작 부분으로 돌아가면, 사용자 에이전트는 해당 트랙이 미디어 리소스의 시작 부분에서 시작했지만 한 시간이 될 때까지 투명했던 것처럼 동작합니다.


다음은 AudioTrackListVideoTrackList 인터페이스를 구현하는 모든 객체가 이벤트 처리기 IDL 속성으로 지원해야 하는 이벤트 처리기와 이에 대응하는 이벤트 처리기 이벤트 유형입니다.

이벤트 처리기 이벤트 처리기 이벤트 유형
onchange

AudioTrackList/change_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

TextTrackList/change_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari7+Chrome33+
Opera?Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android?

VideoTrackList/change_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
change
onaddtrack

AudioTrackList/addtrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

TextTrackList/addtrack_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

VideoTrackList/addtrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
addtrack
onremovetrack

AudioTrackList/removetrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

TextTrackList/removetrack_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari7+Chrome33+
Opera20+Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android20+

VideoTrackList/removetrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
removetrack
4.8.11.10.2 특정 오디오 및 비디오 트랙을 선언적으로 선택하기

audioTracksvideoTracks 속성을 사용하면 스크립트가 재생할 트랙을 선택할 수 있지만, 미디어 리소스URL프래그먼트에 특정 트랙을 지정하여 특정 트랙을 선언적으로 선택할 수도 있습니다. 프래그먼트의 형식은 MIME 유형미디어 리소스의 형식에 따라 달라집니다. [RFC2046] [URL]

이 예에서는 미디어 프래그먼트 구문을 지원하는 형식을 사용하는 비디오를 기본 비디오 트랙 대신 "Alternative"라는 레이블이 붙은 대체 각도가 활성화되도록 삽입합니다.

<video src="myvideo#track=Alternative"></video>
4.8.11.11 시간 지정 텍스트 트랙
4.8.11.11.1 텍스트 트랙 모델

미디어 요소에는 연관된 텍스트 트랙 그룹이 있을 수 있으며, 이를 미디어 요소텍스트 트랙 목록이라고 합니다. 텍스트 트랙은 다음과 같이 정렬됩니다.

  1. 미디어 요소의 자식인 track 요소에 대응하는 텍스트 트랙트리 순서로 정렬합니다.

  2. addTextTrack() 메서드를 사용하여 추가된 모든 텍스트 트랙을 추가된 순서대로, 가장 오래된 것부터 정렬합니다.

  3. 모든 미디어 리소스별 텍스트 트랙 (미디어 리소스의 데이터에 대응하는 텍스트 트랙)을 미디어 리소스의 형식 명세가 정의한 순서로 정렬합니다.

텍스트 트랙TextTrack 객체이며 다음 항목으로 구성됩니다.

텍스트 트랙의 종류

이는 사용자 에이전트가 트랙을 처리하는 방법을 결정합니다. 종류는 문자열로 나타냅니다. 가능한 문자열은 다음과 같습니다.

track 요소에 대응하는 텍스트 트랙의 경우 트랙의 종류는 동적으로 변경될 수 있습니다.

레이블

사용자가 트랙을 식별할 수 있도록 제공되는 사람이 읽을 수 있는 문자열입니다.

track 요소에 대응하는 텍스트 트랙의 경우 트랙의 레이블은 동적으로 변경될 수 있습니다.

텍스트 트랙 레이블이 빈 문자열이면 사용자 에이전트는 사용자 인터페이스에서 사용할 수 있도록 텍스트 트랙의 다른 속성 (예: 텍스트 트랙의 종류 및 텍스트 트랙의 언어)에서 적절한 레이블을 자동으로 생성하는 것이 좋습니다. 이렇게 자동 생성된 레이블은 API에 노출되지 않습니다.

대역 내 메타데이터 트랙 디스패치 유형

문서에서 이러한 트랙을 서로 다른 스크립트에 디스패치할 수 있도록 특별히 대역 내 메타데이터 트랙에 대해 미디어 리소스에서 추출한 문자열입니다.

예를 들어 웹에서 스트리밍되고 웹 전용 상호 작용 기능으로 보강된 전통적인 TV 방송에는 광고 타기팅용 메타데이터, 퀴즈 프로그램 중의 퀴즈 게임 데이터, 스포츠 경기 중의 선수 상태, 요리 프로그램 중의 조리법 정보 등을 포함하는 텍스트 트랙이 있을 수 있습니다. 각 프로그램이 시작되고 종료될 때 스트림에 새로운 트랙이 추가되거나 제거될 수 있으며, 각 트랙이 추가될 때 사용자 에이전트는 이 속성의 값을 사용하여 이를 전용 스크립트 모듈에 바인딩할 수 있습니다.

대역 내 메타데이터 텍스트 트랙이 아닌 경우 대역 내 메타데이터 트랙 디스패치 유형은 빈 문자열입니다. 서로 다른 미디어 형식에서 이 값을 채우는 방법은 미디어 리소스별 텍스트 트랙을 노출하는 단계에 설명되어 있습니다.

언어

텍스트 트랙 큐의 언어를 나타내는 문자열(BCP 47 언어 태그)입니다. [BCP47]

track 요소에 대응하는 텍스트 트랙의 경우 텍스트 트랙의 언어는 동적으로 변경될 수 있습니다.

식별자

문자열입니다.

준비 상태

다음 중 하나입니다.

로드되지 않음

텍스트 트랙의 큐를 아직 가져오지 않았음을 나타냅니다.

로드 중

텍스트 트랙이 로드 중이며 지금까지 치명적인 오류가 발생하지 않았음을 나타냅니다. 파서가 트랙에 추가 큐를 계속 추가할 수도 있습니다.

로드됨

텍스트 트랙이 치명적인 오류 없이 로드되었음을 나타냅니다.

로드 실패

텍스트 트랙이 활성화되었지만 사용자 에이전트가 이를 가져오려고 시도했을 때 어떤 이유로 실패했음을 나타냅니다(예: URL파싱할 수 없음, 네트워크 오류, 알 수 없는 텍스트 트랙 형식). 일부 또는 모든 큐가 누락되었을 가능성이 높으며 가져오지 못합니다.

텍스트 트랙준비 상태는 트랙을 가져오는 동안 동적으로 변경됩니다.

모드

다음 중 하나입니다.

비활성화됨

텍스트 트랙이 활성 상태가 아님을 나타냅니다. DOM에 트랙을 노출하기 위한 목적을 제외하면 사용자 에이전트는 텍스트 트랙을 무시합니다. 활성 큐가 없고 이벤트도 발생하지 않으며 사용자 에이전트는 트랙의 큐를 가져오려고 시도하지 않습니다.

숨김

텍스트 트랙은 활성 상태이지만 사용자 에이전트가 큐를 능동적으로 표시하지 않음을 나타냅니다. 아직 트랙의 큐를 가져오려는 시도가 없었다면 사용자 에이전트는 곧 이러한 시도를 수행합니다. 사용자 에이전트는 활성 상태인 큐 목록을 유지하며 이에 따라 이벤트가 발생합니다.

표시 중

텍스트 트랙이 활성 상태임을 나타냅니다. 아직 트랙의 큐를 가져오려는 시도가 없었다면 사용자 에이전트는 곧 이러한 시도를 수행합니다. 사용자 에이전트는 활성 상태인 큐 목록을 유지하며 이에 따라 이벤트가 발생합니다. 또한 종류subtitles 또는 captions인 텍스트 트랙의 경우 큐가 적절하게 비디오 위에 오버레이됩니다. 종류descriptions인 텍스트 트랙의 경우 사용자 에이전트는 큐를 비시각적인 방식으로 사용자에게 제공합니다. 종류chapters인 텍스트 트랙의 경우 사용자 에이전트는 사용자가 큐를 선택하여 미디어 리소스의 임의의 지점으로 이동할 수 있는 메커니즘을 제공합니다.

0개 이상의 큐 목록

텍스트 트랙 렌더링을 업데이트하는 규칙과 함께 제공되는 텍스트 트랙 큐 목록입니다. 예를 들어 WebVTT의 경우 WebVTT 텍스트 트랙 표시를 업데이트하는 규칙입니다. [WEBVTT]

텍스트 트랙이 아직 로드되지 않았거나 여전히 로드 중이거나 DOM 조작으로 인해 텍스트 트랙의 큐 목록은 동적으로 변경될 수 있습니다.


미디어 요소에는 초기값이 비어 있어야 하는 대기 중인 텍스트 트랙 목록, 초기값이 false여야 하는 파서에서 차단됨 플래그, 역시 초기값이 false여야 하는 자동 트랙 선택 수행 완료 플래그가 있습니다.

사용자 에이전트가 미디어 요소대기 중인 텍스트 트랙 목록을 채워야 할 때, 사용자 에이전트는 요소의 텍스트 트랙 목록에 있는 각 텍스트 트랙텍스트 트랙 모드비활성화됨이 아니고 텍스트 트랙 준비 상태로드 중인 트랙을 요소의 대기 중인 텍스트 트랙 목록에 추가해야 합니다.

track 요소의 부모 노드가 변경될 때마다 사용자 에이전트는 이에 대응하는 텍스트 트랙을 포함하고 있는 모든 대기 중인 텍스트 트랙 목록에서 제거해야 합니다.

텍스트 트랙텍스트 트랙 준비 상태로드됨 또는 로드 실패로 변경될 때마다 사용자 에이전트는 해당 트랙을 포함하고 있는 모든 대기 중인 텍스트 트랙 목록에서 제거해야 합니다.

HTML 파서 또는 XML 파서미디어 요소를 생성하면 사용자 에이전트는 요소의 파서에서 차단됨 플래그를 true로 설정해야 합니다. 미디어 요소HTML 파서 또는 XML 파서열린 요소 스택에서 꺼내지면 사용자 에이전트는 자동 텍스트 트랙 선택에 대한 사용자 환경설정을 따르고, 대기 중인 텍스트 트랙 목록을 채운 다음 요소의 파서에서 차단됨 플래그를 false로 설정해야 합니다.

미디어 요소텍스트 트랙은 요소의 대기 중인 텍스트 트랙 목록이 비어 있고 요소의 파서에서 차단됨 플래그가 false일 때 준비된 상태입니다.

미디어 요소에는 초기에는 설정되지 않아야 하는 대기 중인 텍스트 트랙 변경 알림 플래그가 있습니다.

미디어 요소텍스트 트랙 목록에 있는 텍스트 트랙텍스트 트랙 모드 값이 변경될 때마다 사용자 에이전트는 미디어 요소에 대해 다음 단계를 실행해야 합니다.

  1. 미디어 요소대기 중인 텍스트 트랙 변경 알림 플래그가 설정되어 있다면 반환합니다.

  2. 미디어 요소대기 중인 텍스트 트랙 변경 알림 플래그를 설정합니다.

  3. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음 단계를 실행합니다.

    1. 미디어 요소대기 중인 텍스트 트랙 변경 알림 플래그를 설정 해제합니다.

    2. 미디어 요소textTracks 속성의 TextTrackList 객체에서 change라는 이름의 이벤트를 발생시킵니다.

  4. 미디어 요소포스터 표시 플래그가 설정되어 있지 않다면 시간 진행 단계를 실행합니다.

이 절에 나열된 태스크태스크 소스DOM 조작 태스크 소스입니다.


텍스트 트랙 큐텍스트 트랙에서 시간에 민감한 데이터의 단위이며, 예를 들어 자막과 캡션의 경우 특정 시간에 나타나고 다른 시간에 사라지는 텍스트에 대응합니다.

텍스트 트랙 큐는 다음 항목으로 구성됩니다.

식별자

임의의 문자열입니다.

시작 시간

큐가 적용되는 미디어 데이터 범위의 시작을 설명하는 초 및 초의 소수 단위 시간입니다.

종료 시간

큐가 적용되는 미디어 데이터 범위의 끝을 설명하는 초 및 초의 소수 단위 시간이거나, 경계가 없는 텍스트 트랙 큐의 경우 양의 Infinity입니다.

종료 시 일시 정지 플래그

큐가 적용되는 범위의 끝에 도달했을 때 미디어 리소스의 재생을 일시 정지할지를 나타내는 불리언입니다.

추가적인 형식별 데이터

큐의 실제 데이터를 포함하여 형식에 필요한 추가 필드입니다. 예를 들어 WebVTT에는 텍스트 트랙 큐 쓰기 방향 등이 있습니다. [WEBVTT]

경계가 없는 텍스트 트랙 큐텍스트 트랙 큐 종료 시간이 양의 Infinity로 설정된 텍스트 트랙 큐입니다. 활성 상태인 경계가 없는 텍스트 트랙 큐는 정상 재생 중 현재 재생 위치가 일반적으로 단조 증가하는 것만으로는 비활성 상태가 될 수 없습니다(예: 종료 시간이 발표되지 않은 라이브 이벤트의 챕터용 메타데이터 큐).

텍스트 트랙 큐 시작 시간텍스트 트랙 큐 종료 시간은 음수일 수 있습니다. (그러나 현재 재생 위치는 절대 음수가 될 수 없으므로 시간 0보다 완전히 앞에 있는 큐는 활성 상태가 될 수 없습니다.)

텍스트 트랙 큐에는 이에 대응하는 TextTrackCue 객체 (보다 구체적으로는 TextTrackCue를 상속하는 객체, 예를 들어 WebVTT 큐는 VTTCue 인터페이스를 사용함)가 있습니다. 텍스트 트랙 큐의 메모리 내 표현은 이 TextTrackCue API를 통해 동적으로 변경할 수 있습니다. [WEBVTT]

텍스트 트랙 큐에는 특정 종류의 텍스트 트랙 큐에 대한 명세에서 정의한 텍스트 트랙 렌더링을 업데이트하는 규칙이 연결됩니다. 이러한 규칙은 특히 큐를 나타내는 객체를 addCue() 메서드를 사용하여 TextTrack 객체에 추가할 때 사용됩니다.

또한 각 텍스트 트랙 큐에는 두 가지 동적 정보가 있습니다.

활성 플래그

이 플래그는 초기에는 설정되지 않아야 합니다. 큐가 활성 또는 비활성 상태가 될 때 이벤트가 적절하게 발생하도록 하고 올바른 큐가 렌더링되도록 하는 데 사용됩니다.

사용자 에이전트는 텍스트 트랙 큐가 해당 텍스트 트랙텍스트 트랙 큐 목록에서 제거될 때마다, 텍스트 트랙 자체가 해당 미디어 요소텍스트 트랙 목록에서 제거되거나 텍스트 트랙 모드비활성화됨으로 변경될 때마다, 그리고 미디어 요소readyState가 다시 HAVE_NOTHING으로 변경될 때마다 이 플래그를 동기적으로 설정 해제해야 합니다. 관련 상황이 발생하기 전에 표시 중이었던 텍스트 트랙의 하나 이상의 큐에 대해 이러한 방식으로 플래그가 설정 해제되면, 사용자 에이전트는 영향을 받은 모든 큐의 플래그를 설정 해제한 후 해당 텍스트 트랙텍스트 트랙 렌더링을 업데이트하는 규칙을 적용해야 합니다. 예를 들어 WebVTT 기반 텍스트 트랙의 경우 WebVTT 텍스트 트랙 표시를 업데이트하는 규칙입니다. [WEBVTT]

표시 상태

이는 렌더링 모델의 일부로 사용되어 큐를 일관된 위치에 유지합니다. 초기에는 비어 있어야 합니다. 텍스트 트랙 큐 활성 플래그가 설정 해제될 때마다 사용자 에이전트는 텍스트 트랙 큐 표시 상태를 비워야 합니다.

미디어 요소텍스트 트랙에 있는 텍스트 트랙 큐텍스트 트랙 큐 순서에 따라 서로 상대적으로 정렬되며, 이는 다음과 같이 결정됩니다. 먼저 를 해당 텍스트 트랙별로 그룹화하며, 그룹은 해당 텍스트 트랙미디어 요소텍스트 트랙 목록에 나타나는 것과 같은 순서로 정렬합니다. 그런 다음 각 그룹 내에서 시작 시간이 가장 이른 것부터 정렬합니다. 다음으로 시작 시간이 같은 모든 종료 시간이 가장 늦은 것부터 정렬합니다. 마지막으로 종료 시간이 동일한 모든 는 각자의 텍스트 트랙 큐 목록에 마지막으로 추가된 순서에 따라 가장 오래된 것부터 정렬해야 합니다(예를 들어 WebVTT 파일의 큐라면 처음에는 파일에 나열된 순서가 됩니다). [WEBVTT]

4.8.11.11.2 대역 내 텍스트 트랙 가져오기

미디어 리소스별 텍스트 트랙미디어 리소스에서 발견되는 데이터에 대응하는 텍스트 트랙입니다.

이러한 데이터를 처리하고 렌더링하는 규칙은 관련 명세, 예를 들어 미디어 리소스가 비디오인 경우 비디오 형식 명세에서 정의합니다. 일부 레거시 형식에 대한 자세한 내용은 미디어 컨테이너의 대역 내 미디어 리소스 트랙을 HTML로 가져오기에서 확인할 수 있습니다. [INBAND]

미디어 리소스에 사용자 에이전트가 텍스트 트랙과 동등한 것으로 인식하고 지원하는 데이터가 포함된 경우 사용자 에이전트는 다음과 같이 관련 데이터를 사용하여 미디어 리소스별 텍스트 트랙을 노출하는 단계실행합니다.

  1. 관련 데이터를 새로운 텍스트 트랙과 연결합니다. 이 텍스트 트랙미디어 리소스별 텍스트 트랙입니다.

  2. 관련 명세에서 정의한 관련 데이터의 의미에 따라 새로운 텍스트 트랙종류, 레이블, 언어식별자를 설정합니다. 해당 데이터에 레이블이 없다면 레이블을 빈 문자열로 설정해야 합니다.

    미디어 리소스미디어 프래그먼트 구문을 지원하는 형식이라면 식별자는 그러한 프래그먼트의 트랙 차원에서 트랙 이름으로 사용했을 때 해당 트랙을 활성화하는 식별자와 같아야 합니다.

  3. 텍스트 트랙 큐 목록을 해당 형식에 적합한 텍스트 트랙 렌더링을 업데이트하는 규칙과 연결합니다.

  4. 새로운 텍스트 트랙종류chapters 또는 metadata라면 미디어 리소스의 유형에 따라 텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형을 다음과 같이 설정합니다.

    미디어 리소스가 Ogg 파일인 경우
    텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형을 Name 헤더 필드의 값으로 설정해야 합니다. [OGGSKELETONHEADERS]
    미디어 리소스가 WebM 파일인 경우
    텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형CodecID 요소의 값으로 설정해야 합니다. [WEBMCG]
    미디어 리소스가 MPEG-2 파일인 경우
    stream type을 파일의 프로그램 맵 구간에서 텍스트 트랙의 유형을 설명하는 "stream_type" 필드의 값을 8비트 부호 없는 정수로 해석한 값으로 둡니다. length를 같은 프로그램 맵 구간 부분의 트랙에 대한 "ES_info_length" 필드의 값으로 두며, 이를 동영상 및 관련 오디오 정보의 일반 코딩에서 정의한 정수로 해석합니다. descriptor bytes를 "ES_info_length" 필드 뒤에 오는 length바이트로 둡니다. 텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형stream type 바이트와 0개 이상의 descriptor bytes 바이트를 연결한 값으로 설정해야 하며, ASCII 대문자 16진수 숫자를 사용하여 16진수로 표현합니다. [MPEG2]
    미디어 리소스가 MPEG-4 파일인 경우
    stsd box를 파일의 첫 번째 moov 상자에 있는 텍스트 트랙trak 상자에서 첫 번째 mdia 상자의 첫 번째 minf 상자의 첫 번째 stbl 상자의 첫 번째 stsd 상자로 두거나, 그러한 stsd 상자가 존재하지 않으면 null로 둡니다. stsd box가 null이거나 stsd boxmett 상자와 metx 상자가 모두 없다면 텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형을 빈 문자열로 설정해야 합니다. 그렇지 않고 stsd boxmett 상자가 있다면 텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형을 문자열 "mett", U+0020 SPACE 문자 및 stsd box의 첫 번째 mett 상자에 있는 첫 번째 mime_format 필드의 값을 연결한 값으로 설정해야 하며, 해당 상자에 그 필드가 없다면 빈 문자열로 설정해야 합니다. 그렇지 않고 stsd boxmett 상자는 없지만 metx 상자가 있다면 텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형을 문자열 "metx", U+0020 SPACE 문자 및 stsd box의 첫 번째 metx 상자에 있는 첫 번째 namespace 필드의 값을 연결한 값으로 설정해야 하며, 해당 상자에 그 필드가 없다면 빈 문자열로 설정해야 합니다. [MPEG4]
  5. 큐를 노출하기 위한 지침에 따라 지금까지 파싱된 큐로 새로운 텍스트 트랙큐 목록을 채우고 필요에 따라 이를 동적으로 업데이트하기 시작합니다.

  6. 새로운 텍스트 트랙준비 상태로드됨으로 설정합니다.

  7. 데이터에 대한 관련 명세의 요구사항 및 사용자의 환경설정과 일치하는 모드로 새로운 텍스트 트랙모드를 설정합니다.

    예를 들어 활성 상태인 다른 자막이 없고 이것이 강제 자막 트랙 (오디오 트랙의 기본 언어로 된 자막이지만 실제로 다른 언어로 된 오디오에 대해서만 자막을 제공하는 트랙)이라면 여기에서 해당 자막이 활성화될 수 있습니다.

  8. 새로운 텍스트 트랙미디어 요소텍스트 트랙 목록에 추가합니다.

  9. 미디어 요소textTracks 속성의 TextTrackList 객체에서 addtrack이라는 이름의 이벤트를 발생시킵니다. 이때 TrackEvent를 사용하고 track 속성을 텍스트 트랙으로 초기화합니다.

4.8.11.11.3 대역 외 텍스트 트랙 가져오기

track 요소가 생성되면 아래에서 정의한 대로 값이 설정된 새로운 텍스트 트랙과 연결되어야 합니다.

텍스트 트랙 종류는 다음 표에 따라 요소의 kind 속성 상태에서 결정됩니다. 첫 번째 열의 셀에 주어진 상태에 대해 종류는 두 번째 열에 주어진 문자열입니다.

상태 문자열
자막 subtitles
캡션 captions
설명 descriptions
챕터 메타데이터 chapters
메타데이터 metadata

텍스트 트랙 레이블은 요소의 트랙 레이블입니다.

텍스트 트랙 언어는 존재하는 경우 요소의 트랙 언어이고, 그렇지 않으면 빈 문자열입니다.

텍스트 트랙 식별자는 존재하는 경우 요소의 id 속성 값이고, 그렇지 않으면 빈 문자열입니다.

kind, label, srclangid 속성이 설정, 변경 또는 제거되면 텍스트 트랙은 위 정의에 따라 함께 업데이트되어야 합니다.

트랙 URL의 변경은 아래 알고리즘에서 처리합니다.

텍스트 트랙 준비 상태의 초기값은 로드되지 않음이고, 텍스트 트랙 모드의 초기값은 비활성화됨입니다.

텍스트 트랙 큐 목록의 초기값은 비어 있습니다. 참조된 파일이 파싱되면 동적으로 변경됩니다. 목록에는 해당 형식에 적합한 텍스트 트랙 렌더링을 업데이트하는 규칙이 연결됩니다. WebVTT의 경우 이는 WebVTT 텍스트 트랙 표시를 업데이트하는 규칙입니다. [WEBVTT]

track 요소의 부모 요소가 변경되고 새로운 부모가 미디어 요소인 경우 사용자 에이전트는 track 요소에 대응하는 텍스트 트랙미디어 요소텍스트 트랙 목록에 추가해야 합니다. 그런 다음 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소textTracks 속성의 TextTrackList 객체에서 addtrack이라는 이름의 이벤트를 발생시켜야 합니다. 이때 TrackEvent를 사용하고 track 속성을 텍스트 트랙으로 초기화합니다.

track 요소의 부모 요소가 변경되고 이전 부모가 미디어 요소였던 경우 사용자 에이전트는 track 요소에 대응하는 텍스트 트랙미디어 요소텍스트 트랙 목록에서 제거해야 합니다. 그런 다음 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소textTracks 속성의 TextTrackList 객체에서 removetrack이라는 이름의 이벤트를 발생시켜야 합니다. 이때 TrackEvent를 사용하고 track 속성을 텍스트 트랙으로 초기화합니다.


track 요소에 대응하는 텍스트 트랙미디어 요소텍스트 트랙 목록에 추가되면 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소에 대해 다음 단계를 실행해야 합니다.

  1. 요소의 파서에서 차단됨 플래그가 true라면 반환합니다.

  2. 요소의 자동 트랙 선택 수행 완료 플래그가 true라면 반환합니다.

  3. 이 요소에 대해 자동 텍스트 트랙 선택에 대한 사용자 환경설정을 따릅니다.

사용자 에이전트가 미디어 요소에 대해 자동 텍스트 트랙 선택에 대한 사용자 환경설정을 따라야 할 때 사용자 에이전트는 다음 단계를 실행해야 합니다.

  1. subtitlescaptions에 대해 자동 텍스트 트랙 선택을 수행합니다.

  2. descriptions에 대해 자동 텍스트 트랙 선택을 수행합니다.

  3. 미디어 요소텍스트 트랙 목록에 있는 텍스트 트랙텍스트 트랙 종류chapters 또는 metadata이고, default 속성이 설정된 track 요소에 대응하며, 텍스트 트랙 모드비활성화됨으로 설정된 트랙이 있다면 그러한 모든 트랙의 텍스트 트랙 모드숨김으로 설정합니다.

  4. 요소의 자동 트랙 선택 수행 완료 플래그를 true로 설정합니다.

위 단계에서 하나 이상의 텍스트 트랙 종류에 대해 자동 텍스트 트랙 선택을 수행하라고 명시한 경우 이는 다음 단계를 실행함을 의미합니다.

  1. candidates미디어 요소텍스트 트랙 목록에 있는 텍스트 트랙텍스트 트랙 종류가 알고리즘에 전달된 종류 중 하나인 트랙으로 구성된 목록으로 두며, 존재하는 경우 텍스트 트랙 목록에 주어진 순서를 사용합니다.

  2. candidates가 비어 있다면 반환합니다.

  3. candidates텍스트 트랙 중 하나라도 텍스트 트랙 모드표시 중으로 설정되어 있다면 반환합니다.

  4. 사용자가 candidates에 있는 트랙의 텍스트 트랙 종류, 텍스트 트랙 언어텍스트 트랙 레이블을 기반으로 해당 트랙을 활성화하고 싶다는 선호를 표시했다면 그 트랙의 텍스트 트랙 모드표시 중으로 설정합니다.

    예를 들어 사용자는 브라우저 환경설정을 "가능하면 항상 프랑스어 캡션을 표시", "제목에 'Commentary'가 있는 자막 트랙이 있으면 활성화" 또는 "오디오 설명 트랙을 사용할 수 있다면 하나를 활성화하되 가능하면 스위스 독일어를 사용하고, 그렇지 않으면 표준 스위스 독일어 또는 표준 독일어를 사용"하도록 설정할 수 있습니다.

    그렇지 않고 candidates텍스트 트랙default 속성이 설정된 track 요소에 대응하며 텍스트 트랙 모드비활성화됨으로 설정된 트랙이 있다면 그러한 첫 번째 트랙의 텍스트 트랙 모드표시 중으로 설정합니다.

track 요소에 대응하는 텍스트 트랙에서 다음 상황 중 하나가 발생하면 사용자 에이전트는 해당 텍스트 트랙 및 해당 track 요소에 대해 track 처리 모델을 시작해야 합니다.

사용자 에이전트가 텍스트 트랙 및 해당 track 요소에 대해 track 처리 모델을 시작할 때 다음 알고리즘을 실행해야 합니다. 이 알고리즘은 이벤트 루프 메커니즘과 밀접하게 상호 작용합니다. 특히 이벤트 루프 알고리즘의 일부로 트리거되는 동기 구간이 있습니다. 해당 구간의 단계는 ⌛로 표시됩니다.

  1. 텍스트 트랙 및 해당 track 요소에 대해 이 알고리즘의 다른 실행이 이미 진행 중이라면 그 다른 알고리즘이 이 요소를 처리하도록 두고 반환합니다.

  2. 텍스트 트랙텍스트 트랙 모드숨김 또는 표시 중 중 하나로 설정되어 있지 않다면 반환합니다.

  3. 텍스트 트랙track 요소의 부모가 미디어 요소가 아니라면 반환합니다.

  4. 이 단계들을 실행하도록 만든 원인이 계속 진행되도록 두고 나머지 단계를 병렬로 실행합니다.

  5. 상단: 안정 상태를 기다립니다. 동기 구간은 다음 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)

  6. 텍스트 트랙 준비 상태로드 중으로 설정합니다.

  7. URLtrack 요소의 트랙 URL로 둡니다.

  8. track 요소의 부모가 미디어 요소라면 corsAttributeState를 부모 미디어 요소crossorigin 콘텐츠 속성 상태로 둡니다. 그렇지 않으면 corsAttributeStateCORS 없음으로 둡니다.

  9. 동기 구간을 종료하고 나머지 단계를 병렬로 계속 실행합니다.

  10. URL이 빈 문자열이 아니라면 다음을 수행합니다.

    1. requestURL, "track" 및 corsAttributeState가 주어지고 동일 출처 폴백 플래그가 설정된 상태에서 잠재적 CORS 요청을 생성한 결과로 둡니다.

    2. request클라이언트track 요소의 노드 문서관련 설정 객체로 설정합니다.

    3. request개시자 유형을 "track"으로 설정합니다.

    4. request가져옵니다.

    데이터를 가져오는 동안 이를 처리하기 위해 가져오기 알고리즘이 네트워킹 태스크 소스큐에 추가태스크는 리소스의 유형을 결정해야 합니다. 리소스 유형이 지원되는 텍스트 트랙 형식이 아니라면 아래에서 설명한 대로 로드가 실패합니다. 그렇지 않으면 리소스의 데이터를 수신되는 대로 적절한 파서 (예: WebVTT 파서)에 전달해야 하며, 텍스트 트랙 큐 목록을 해당 파서의 출력으로 사용합니다. [WEBVTT]

    적절한 파서는 이러한 네트워킹 태스크 소스 태스크 동안 각 태스크가 네트워크에서 수신한 데이터로 실행될 때 텍스트 트랙 큐 목록을 점진적으로 업데이트합니다.

    이 명세는 현재 텍스트 트랙의 MIME 유형을 확인할지 또는 어떻게 확인할지, 실제 파일 데이터를 사용하여 파일 유형 스니핑을 수행할지 또는 어떻게 수행할지를 규정하지 않습니다. 구현자의 의도가 이 문제에 대해 서로 다르므로 올바른 해결책이 무엇인지 명확하지 않습니다. 여기에 요구사항이 없는 경우 Content-Type 헤더를 따라야 한다는 HTTP 명세의 엄격한 요구사항이 우선합니다("Content-Type은 기반 데이터의 미디어 유형을 지정합니다." ... "미디어 유형이 Content-Type 필드로 주어지지 않은 경우에만 수신자는 콘텐츠 검사 및/또는 리소스를 식별하는 데 사용된 URI의 이름 확장자를 통해 미디어 유형을 추측하려고 시도할 수 있습니다.").

    어떤 이유로든 가져오기가 실패하거나(네트워크 오류, 서버가 오류 코드를 반환함, CORS 실패 등) URL이 빈 문자열이라면 미디어 요소가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 추가하여 먼저 텍스트 트랙 준비 상태로드 실패로 변경한 다음 track 요소에서 error라는 이름의 이벤트를 발생시킵니다.

    가져오기가 실패하지 않았지만 리소스 유형이 지원되는 텍스트 트랙 형식이 아니거나 파일을 성공적으로 처리하지 못했다면(예: 해당 형식이 XML 형식이고 파일에 XML이 감지하여 애플리케이션에 보고하도록 요구하는 올바른 형식 오류가 포함된 경우), 앞서 언급한 문제가 발견된 네트워킹 태스크 소스큐에 추가된 태스크텍스트 트랙 준비 상태로드 실패로 변경하고 track 요소에서 error라는 이름의 이벤트를 발생시켜야 합니다.

    가져오기가 실패하지 않고 파일이 성공적으로 처리되었다면 데이터를 모두 파싱한 후 네트워킹 태스크 소스큐에 추가한 마지막 태스크텍스트 트랙 준비 상태로드됨으로 변경하고 track 요소에서 load라는 이름의 이벤트를 발생시켜야 합니다.

    가져오기가 진행되는 동안 다음 중 하나가 발생한다면:

    ...사용자 에이전트는 가져오기를 중단하고 해당 알고리즘이 생성한 대기 중인 태스크를 폐기해야 합니다 (특히 URL이 변경된 시점 이후에는 텍스트 트랙 큐 목록에 큐를 추가하지 않음). 그런 다음 track 요소가 주어졌을 때 DOM 조작 태스크 소스요소 태스크를 큐에 추가하여 먼저 텍스트 트랙 준비 상태로드 실패로 변경한 다음 track 요소에서 error라는 이름의 이벤트를 발생시킵니다.

  11. 텍스트 트랙 준비 상태가 더 이상 로드 중으로 설정되어 있지 않을 때까지 기다립니다.

  12. 텍스트 트랙 모드숨김 또는 표시 중으로 설정된 동시에 트랙 URL이 더 이상 URL과 같지 않을 때까지 기다립니다.

  13. 상단으로 표시된 단계로 이동합니다.

track 요소의 src 속성이 설정, 변경 또는 제거될 때마다 사용자 에이전트는 즉시 요소의 텍스트 트랙텍스트 트랙 큐 목록을 비워야 합니다. (이로 인해 위 알고리즘이 이전에 지정된 URL을 사용하여 가져오던 리소스의 큐를 더 이상 추가하지 않게 됩니다.)

4.8.11.11.4 다양한 형식의 텍스트 트랙 큐큐를 노출하기 위한 지침

HTML 사용자 에이전트가 처리하기 위해 특정 형식의 텍스트 트랙 큐를 해석하는 방법은 해당 형식에서 정의합니다. 그러한 명세가 없는 경우 이 절은 구현이 해당 형식을 일관되게 노출하려고 시도할 수 있는 일부 제약을 제공합니다.

HTML의 텍스트 트랙 모델을 지원하기 위해 시간 지정 데이터의 각 단위를 텍스트 트랙 큐로 변환합니다. 형식의 기능을 이 명세에서 정의한 텍스트 트랙 큐의 측면에 매핑하는 방법이 정의되어 있지 않다면 구현은 해당 매핑이 위에서 정의한 텍스트 트랙 큐의 각 측면에 대한 정의 및 다음 제약과 일치하도록 해야 합니다.

텍스트 트랙 큐 식별자

형식에 각 큐 식별자와 명백하게 대응하는 항목이 없다면 빈 문자열로 설정하는 것이 좋습니다.

텍스트 트랙 큐 종료 시 일시 정지 플래그

false로 설정하는 것이 좋습니다.

4.8.11.11.5 텍스트 트랙 API

TextTrackList

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
[Exposed=Window]
interface TextTrackList : EventTarget {
  readonly attribute unsigned long length;
  getter TextTrack (unsigned long index);
  TextTrack? getTrackById(DOMString id);

  attribute EventHandler onchange;
  attribute EventHandler onaddtrack;
  attribute EventHandler onremovetrack;
};
media.textTracks.length

HTMLMediaElement/textTracks

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet1.0+Opera Android12.1+

미디어 요소와 연결된 텍스트 트랙의 수를 반환합니다(예: track 요소에서 가져온 트랙). 이는 미디어 요소텍스트 트랙 목록에 있는 텍스트 트랙의 수입니다.

media.textTracks[ n ]

미디어 요소텍스트 트랙 목록에 있는 n번째 텍스트 트랙을 반환합니다.

textTrack = media.textTracks.getTrackById(id)

TextTrackList/getTrackById

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari8+Chrome33+
Opera?Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

주어진 식별자를 가진 TextTrack 객체를 반환하고, 해당 식별자를 가진 트랙이 없다면 null을 반환합니다.

TextTrackList 객체는 주어진 순서로 동적으로 업데이트되는 텍스트 트랙 목록을 나타냅니다.

미디어 요소textTracks 속성은 미디어 요소텍스트 트랙 목록에 있는 텍스트 트랙텍스트 트랙 목록과 같은 순서로 나타내는 TextTrackList 객체를 반환해야 합니다.

TextTrackList/length

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

TextTrackList 객체의 length 속성은 TextTrackList 객체가 나타내는 목록의 텍스트 트랙 수를 반환해야 합니다.

특정 시점의 TextTrackList 객체의 지원되는 속성 인덱스는 존재하는 경우 0부터 TextTrackList 객체가 나타내는 목록의 텍스트 트랙 수에서 1을 뺀 값까지의 숫자입니다. 목록에 텍스트 트랙이 없다면 지원되는 속성 인덱스가 없습니다.

TextTrackList 객체의 주어진 인덱스 index에 대한 인덱스 속성의 값을 결정하려면, 사용자 에이전트는 TextTrackList 객체가 나타내는 목록의 index번째 텍스트 트랙을 반환해야 합니다.

getTrackById(id) 메서드는 TextTrackList 객체에서 id IDL 속성이 id 인수의 값과 같은 값을 반환하는 첫 번째 TextTrack을 반환해야 합니다. 주어진 인수와 일치하는 트랙이 없다면 메서드는 null을 반환해야 합니다.


TextTrack

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android31+Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
enum TextTrackMode { "disabled",  "hidden",  "showing" };
enum TextTrackKind { "subtitles",  "captions",  "descriptions",  "chapters",  "metadata" };

[Exposed=Window]
interface TextTrack : EventTarget {
  readonly attribute TextTrackKind kind;
  readonly attribute DOMString label;
  readonly attribute DOMString language;

  readonly attribute DOMString id;
  readonly attribute DOMString inBandMetadataTrackDispatchType;

  attribute TextTrackMode mode;

  readonly attribute TextTrackCueList? cues;
  readonly attribute TextTrackCueList? activeCues;

  undefined addCue(TextTrackCue cue);
  undefined removeCue(TextTrackCue cue);

  attribute EventHandler oncuechange;
};
textTrack = media.addTextTrack(kind [, label [, language ] ])

새로운 TextTrack 객체를 생성하여 반환하며, 이 객체는 미디어 요소텍스트 트랙 목록에도 추가됩니다.

textTrack.kind

TextTrack/kind

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

텍스트 트랙 종류 문자열을 반환합니다.

textTrack.label

TextTrack/label

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

존재하는 경우 텍스트 트랙 레이블을 반환하고, 그렇지 않으면 빈 문자열을 반환합니다(객체가 사용자에게 노출되는 경우 객체의 다른 속성에서 사용자 지정 레이블을 생성해야 할 가능성이 있음을 나타냄).

textTrack.language

TextTrack/language

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

텍스트 트랙 언어 문자열을 반환합니다.

textTrack.id

TextTrack/id

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari8+Chrome33+
Opera?Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

주어진 트랙의 ID를 반환합니다.

대역 내 트랙의 경우 형식이 미디어 프래그먼트 구문을 지원한다면 프래그먼트와 함께 사용할 수 있으며, getTrackById() 메서드와 함께 사용할 수도 있는 ID입니다.

track 요소에 대응하는 텍스트 트랙의 경우 이는 track 요소의 ID입니다.

textTrack.inBandMetadataTrackDispatchType

TextTrack/inBandMetadataTrackDispatchType

Firefox31+Safari8+Chrome아니요
Opera?Edge아니요
Edge (Legacy)아니요Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형 문자열을 반환합니다.

textTrack.mode [ = value ]

TextTrack/mode

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android31+Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

다음 목록의 문자열로 나타낸 텍스트 트랙 모드를 반환합니다.

"disabled"

텍스트 트랙 비활성화됨 모드입니다.

"hidden"

텍스트 트랙 숨김 모드입니다.

"showing"

텍스트 트랙 표시 중 모드입니다.

모드를 변경하도록 설정할 수 있습니다.

textTrack.cues

TextTrack/cues

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android31+Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

텍스트 트랙 큐 목록TextTrackCueList 객체로 반환합니다.

textTrack.activeCues

TextTrack/activeCues

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android31+Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

텍스트 트랙 큐 목록에서 현재 활성 상태인 (즉, 현재 재생 위치보다 먼저 시작하고 그 이후에 끝나는) 텍스트 트랙 큐TextTrackCueList 객체로 반환합니다.

textTrack.addCue(cue)

TextTrack/addCue

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

주어진 큐를 textTrack텍스트 트랙 큐 목록에 추가합니다.

textTrack.removeCue(cue)

TextTrack/removeCue

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

주어진 큐를 textTrack텍스트 트랙 큐 목록에서 제거합니다.

미디어 요소addTextTrack(kind, label, language) 메서드가 호출되면 다음 단계를 실행해야 합니다.

  1. 새로운 텍스트 트랙을 생성하고, 해당 텍스트 트랙 종류kind로, 텍스트 트랙 레이블label로, 텍스트 트랙 언어language로, 텍스트 트랙 준비 상태텍스트 트랙 로드됨 상태로, 텍스트 트랙 모드텍스트 트랙 숨김 모드로, 텍스트 트랙 큐 목록을 빈 목록으로 설정합니다.

    처음에는 텍스트 트랙 큐 목록텍스트 트랙 렌더링을 업데이트하는 규칙이 연결되어 있지 않습니다. 텍스트 트랙 큐가 추가되면 텍스트 트랙 큐 목록의 규칙이 그에 따라 영구적으로 설정됩니다.

  2. 새로운 텍스트 트랙미디어 요소텍스트 트랙 목록에 추가합니다.

  3. 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 미디어 요소textTracks 속성의 TextTrackList 객체에서 addtrack이라는 이름의 이벤트를 발생시킵니다. 이때 TrackEvent를 사용하고, track 속성을 새로운 텍스트 트랙으로 초기화합니다.

  4. 새로운 텍스트 트랙을 반환합니다.


kind getter 단계는 this종류를 반환하는 것입니다.

label getter 단계는 this레이블을 반환하는 것입니다.

language getter 단계는 this언어를 반환하는 것입니다.

id getter 단계는 this식별자를 반환하는 것입니다.

inBandMetadataTrackDispatchType getter 단계는 this대역 내 메타데이터 트랙 디스패치 유형을 반환하는 것입니다.

mode getter 단계는 this모드에 따라 다음 문자열을 반환하는 것입니다.

텍스트 트랙 비활성화됨 모드
"disabled"
텍스트 트랙 숨김 모드
"hidden"
텍스트 트랙 표시 중 모드
"showing"

mode setter 단계는 주어진 값에 따라 this모드를 다음 모드로 설정하는 것입니다.

"disabled"
텍스트 트랙 비활성화됨 모드입니다.
"hidden"
텍스트 트랙 숨김 모드입니다.
"showing"
텍스트 트랙 표시 중 모드입니다.

cues getter 단계는 다음과 같습니다.

  1. this모드텍스트 트랙 비활성화됨 모드라면 null을 반환합니다.

  2. this텍스트 트랙 큐 목록종료 시간스크립트가 시작되었을 때 가능한 가장 이른 위치와 같거나 그 이후인 부분집합을 텍스트 트랙 큐 순서로 나타내는 라이브 TextTrackCueList 객체를 반환합니다.

TextTrack 객체에 대해 객체가 반환될 때마다 동일한 TextTrackCueList 객체를 반환해야 합니다.

스크립트가 시작되었을 때 가능한 가장 이른 위치이벤트 루프가 마지막으로 1단계에 도달했을 때의 가능한 가장 이른 위치입니다.

activeCues getter 단계는 다음과 같습니다.

  1. this모드텍스트 트랙 비활성화됨 모드라면 null을 반환합니다.

  2. this텍스트 트랙 큐 목록스크립트가 시작되었을 때 활성 플래그가 설정되어 있던 부분집합을 텍스트 트랙 큐 순서로 나타내는 라이브 TextTrackCueList 객체를 반환합니다.

TextTrack 객체에 대해 객체가 반환될 때마다 동일한 TextTrackCueList 객체를 반환해야 합니다.

텍스트 트랙 큐활성 플래그가 스크립트가 시작되었을 때 설정되어 있었음이벤트 루프가 마지막으로 1단계에 도달했을 때 해당 텍스트 트랙 큐 활성 플래그가 설정되어 있었음을 의미합니다.


addCue(cue) 메서드의 단계는 다음과 같습니다.

  1. listthis텍스트 트랙 큐 목록으로 둡니다.

  2. list에 아직 연결된 텍스트 트랙 렌더링을 업데이트하는 규칙이 없다면 listcue에 적합한 텍스트 트랙 렌더링을 업데이트하는 규칙과 연결합니다.

  3. list에 연결된 텍스트 트랙 렌더링을 업데이트하는 규칙cue에 적합한 텍스트 트랙 렌더링을 업데이트하는 규칙과 같지 않다면 "InvalidStateError" DOMException을 예외로 던집니다.

  4. 주어진 cue텍스트 트랙 큐 목록에 있다면 cue를 해당 텍스트 트랙 큐 목록에서 제거합니다.

  5. cuelist에 추가합니다.

removeCue(cue) 메서드의 단계는 다음과 같습니다.

  1. 주어진 cuethis텍스트 트랙 큐 목록에 없다면 "NotFoundError" DOMException을 예외로 던집니다.

  2. cuethis텍스트 트랙 큐 목록에서 제거합니다.

이 예에서는 audio 요소를 사용하여 여러 음향 효과가 포함된 사운드 파일에서 특정 음향 효과를 재생합니다. 브라우저가 스크립트를 실행하느라 바쁜 경우에도 클립의 끝에서 정확히 종료되도록 큐를 사용하여 오디오를 일시 정지합니다. 페이지가 스크립트를 사용하여 오디오를 일시 정지하는 방식에 의존했다면 브라우저가 지정된 정확한 시간에 스크립트를 실행하지 못할 경우 다음 클립의 시작 부분이 들릴 수도 있습니다.

var sfx = new Audio('sfx.wav');
var sounds = sfx.addTextTrack('metadata');

// add sounds we care about
function addFX(start, end, name) {
  var cue = new VTTCue(start, end, '');
  cue.id = name;
  cue.pauseOnExit = true;
  sounds.addCue(cue);
}
addFX(12.783, 13.612, 'dog bark');
addFX(13.612, 15.091, 'kitten mew');

function playSound(id) {
  sfx.currentTime = sounds.getCueById(id).startTime;
  sfx.play();
}

// play a bark as soon as we can
sfx.oncanplaythrough = function () {
  playSound('dog bark');
}
// meow when the user tries to leave,
// and have the browser ask them to stay
window.onbeforeunload = function (e) {
  playSound('kitten mew');
  e.preventDefault();
}

TextTrackCueList

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
[Exposed=Window]
interface TextTrackCueList {
  readonly attribute unsigned long length;
  getter TextTrackCue (unsigned long index);
  TextTrackCue? getCueById(DOMString id);
};
cuelist.length

목록에 있는 의 수를 반환합니다.

cuelist[index]

목록에서 인덱스가 index텍스트 트랙 큐를 반환합니다. 큐는 텍스트 트랙 큐 순서로 정렬됩니다.

cuelist.getCueById(id)

텍스트 트랙 큐 식별자id인 첫 번째 텍스트 트랙 큐를 (텍스트 트랙 큐 순서로) 반환합니다.

해당 식별자를 가진 큐가 없거나 인수가 빈 문자열이면 null을 반환합니다.

TextTrackCueList 객체는 주어진 순서로 동적으로 업데이트되는 텍스트 트랙 큐 목록을 나타냅니다.

TextTrackCueList/length

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

length 속성은 TextTrackCueList 객체가 나타내는 목록의 수를 반환해야 합니다.

특정 시점의 TextTrackCueList 객체의 지원되는 속성 인덱스는 존재하는 경우 0부터 TextTrackCueList 객체가 나타내는 목록의 수에서 1을 뺀 값까지의 숫자입니다. 목록에 가 없다면 지원되는 속성 인덱스가 없습니다.

주어진 인덱스 index에 대한 인덱스 속성의 값을 결정하려면 사용자 에이전트는 TextTrackCueList 객체가 나타내는 목록의 index번째 텍스트 트랙 큐를 반환해야 합니다.

TextTrackCueList/getCueById

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

getCueById(id) 메서드는 빈 문자열이 아닌 인수로 호출되면 TextTrackCueList 객체가 나타내는 목록에서 텍스트 트랙 큐 식별자id인 첫 번째 텍스트 트랙 큐가 있다면 이를 반환하고, 그렇지 않으면 null을 반환해야 합니다. 인수가 빈 문자열이면 메서드는 null을 반환해야 합니다.


TextTrackCue

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
[Exposed=Window]
interface TextTrackCue : EventTarget {
  readonly attribute TextTrack? track;

  attribute DOMString id;
  attribute double startTime;
  attribute unrestricted double endTime;
  attribute boolean pauseOnExit;

  attribute EventHandler onenter;
  attribute EventHandler onexit;
};
cue.track

존재하는 경우 이 텍스트 트랙 큐가 속한 TextTrack 객체를 반환하고, 그렇지 않으면 null을 반환합니다.

cue.id [ = value ]

텍스트 트랙 큐 식별자를 반환합니다.

설정할 수 있습니다.

cue.startTime [ = value ]

텍스트 트랙 큐 시작 시간을 초 단위로 반환합니다.

설정할 수 있습니다.

cue.endTime [ = value ]

텍스트 트랙 큐 종료 시간을 초 단위로 반환합니다.

경계가 없는 텍스트 트랙 큐의 경우 양의 Infinity를 반환합니다.

설정할 수 있습니다.

cue.pauseOnExit [ = value ]

텍스트 트랙 큐 종료 시 일시 정지 플래그가 설정되어 있다면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

설정할 수 있습니다.

TextTrackCue/track

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

track getter 단계는 this텍스트 트랙 큐가 포함된 큐 목록을 가진 텍스트 트랙이 있다면 이를 반환하고, 그렇지 않으면 null을 반환하는 것입니다.

TextTrackCue/id

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

id 속성은 가져올 때 TextTrackCue 객체가 나타내는 텍스트 트랙 큐텍스트 트랙 큐 식별자를 반환해야 합니다. 설정할 때 텍스트 트랙 큐 식별자를 새 값으로 설정해야 합니다.

TextTrackCue/startTime

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

startTime 속성은 가져올 때 TextTrackCue 객체가 나타내는 텍스트 트랙 큐텍스트 트랙 큐 시작 시간을 초 단위로 반환해야 합니다. 설정할 때 텍스트 트랙 큐 시작 시간을 초 단위로 해석한 새 값으로 설정해야 합니다. 그런 다음 TextTrackCue 객체의 텍스트 트랙 큐텍스트 트랙큐 목록에 있고, 해당 텍스트 트랙미디어 요소텍스트 트랙 목록에 있으며, 미디어 요소포스터 표시 플래그가 설정되어 있지 않다면 해당 미디어 요소에 대해 시간 진행 단계를 실행합니다.

TextTrackCue/endTime

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

endTime 속성은 가져올 때 TextTrackCue 객체가 나타내는 텍스트 트랙 큐텍스트 트랙 큐 종료 시간을 초 단위 또는 양의 Infinity로 반환해야 합니다. 설정할 때 새 값이 음의 Infinity 또는 숫자가 아님(NaN) 값이라면 TypeError 예외를 던집니다. 그렇지 않으면 텍스트 트랙 큐 종료 시간을 새 값으로 설정해야 합니다. 그런 다음 TextTrackCue 객체의 텍스트 트랙 큐텍스트 트랙큐 목록에 있고, 해당 텍스트 트랙미디어 요소텍스트 트랙 목록에 있으며, 미디어 요소포스터 표시 플래그가 설정되어 있지 않다면 해당 미디어 요소에 대해 시간 진행 단계를 실행합니다.

TextTrackCue/pauseOnExit

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

pauseOnExit 속성은 가져올 때 TextTrackCue 객체가 나타내는 텍스트 트랙 큐텍스트 트랙 큐 종료 시 일시 정지 플래그가 설정되어 있다면 true를 반환하고, 그렇지 않으면 false를 반환해야 합니다. 설정할 때 새 값이 true이면 텍스트 트랙 큐 종료 시 일시 정지 플래그를 설정하고, 그렇지 않으면 설정 해제해야 합니다.

4.8.11.11.6 텍스트 트랙 API 객체의 이벤트 처리기

다음은 TextTrackList 인터페이스를 구현하는 모든 객체가 이벤트 처리기 IDL 속성으로 지원해야 하는 이벤트 처리기와 이에 대응하는 이벤트 처리기 이벤트 유형입니다.

이벤트 처리기 이벤트 처리기 이벤트 유형
onchange change
onaddtrack addtrack
onremovetrack removetrack

다음은 TextTrack 인터페이스를 구현하는 모든 객체가 이벤트 처리기 IDL 속성으로 지원해야 하는 이벤트 처리기와 이에 대응하는 이벤트 처리기 이벤트 유형입니다.

이벤트 처리기 이벤트 처리기 이벤트 유형
oncuechange

TextTrack/cuechange_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
cuechange

다음은 TextTrackCue 인터페이스를 구현하는 모든 객체가 이벤트 처리기 IDL 속성으로 지원해야 하는 이벤트 처리기와 이에 대응하는 이벤트 처리기 이벤트 유형입니다.

이벤트 처리기 이벤트 처리기 이벤트 유형
onenter

TextTrackCue/enter_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
enter
onexit

TextTrackCue/exit_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
exit
4.8.11.11.7 메타데이터 텍스트 트랙의 모범 사례

이 절은 비규범적입니다.

텍스트 트랙은 상호 작용형 또는 보강된 보기를 위해 미디어 데이터와 관련된 데이터를 저장하는 데 사용할 수 있습니다.

예를 들어 스포츠 중계를 보여 주는 페이지에는 현재 점수에 대한 정보가 포함될 수 있습니다. 로봇 경기가 생중계되고 있다고 가정해 보겠습니다. 다음과 같이 영상 위에 점수를 오버레이할 수 있습니다.

사용자가 비디오의 임의의 지점으로 탐색할 때마다 점수 표시가 올바르게 렌더링되도록 하려면 메타데이터 텍스트 트랙 큐가 해당 점수에 적절한 기간만큼 길어야 합니다. 예를 들어 위 프레임에는 경기 번호를 제공하며 경기 전체 길이만큼 지속되는 큐 하나, 파란색 연합의 점수가 변경될 때까지 지속되는 큐 하나, 빨간색 연합의 점수가 변경될 때까지 지속되는 큐 하나가 있을 수 있습니다. 비디오가 단순히 라이브 이벤트 스트림이라면 오른쪽 아래의 시간은 큐를 기반으로 하지 않고 현재 비디오 시간에서 자동으로 파생될 것입니다. 그러나 비디오가 하이라이트만 보여 준다면 그 시간도 큐로 제공될 수 있습니다.

다음은 WebVTT 파일에서 이 내용의 일부가 어떻게 보일 수 있는지를 보여 줍니다.

WEBVTT

...

05:10:00.000 --> 05:12:15.000
matchtype:qual
matchnumber:37

...

05:11:02.251 --> 05:11:17.198
red:78

05:11:03.672 --> 05:11:54.198
blue:66

05:11:17.198 --> 05:11:25.912
red:80

05:11:25.912 --> 05:11:26.522
red:83

05:11:26.522 --> 05:11:26.982
red:86

05:11:26.982 --> 05:11:27.499
red:89

...

여기서 핵심은 정보가 관련 이벤트가 적용되는 시간 전체에 걸쳐 있는 큐로 제공된다는 점입니다. 대신 점수가 변경될 때 점수를 길이가 0인(또는 매우 짧아 거의 0인) 큐로 제공하여, 예를 들어 05:11:17.198에 "red+2", 05:11:25.912에 "red+3" 등을 지정한다면 문제가 발생합니다. 주된 문제는 스크립트가 알림을 놓치지 않았는지 확인하기 위해 전체 큐 목록을 순회해야 하므로 탐색을 구현하기가 훨씬 어려워진다는 것입니다. 또한 큐가 짧다면 스크립트가 해당 큐를 특별히 수신 대기하지 않는 한 큐가 활성 상태인 것을 전혀 확인하지 못할 수도 있습니다.

이러한 방식으로 큐를 사용할 때 작성자는 현재 주석을 업데이트하기 위해 cuechange 이벤트를 사용하는 것이 좋습니다. (특히 timeupdate 이벤트를 사용하면 큐가 변경되지 않은 경우에도 작업을 수행해야 하므로 덜 적절합니다. 더 중요한 것은 timeupdate 이벤트는 발생 빈도가 제한되므로 메타데이터 큐가 활성 상태가 된 시점과 표시가 업데이트되는 시점 사이에 더 큰 지연이 발생한다는 점입니다.)

4.8.11.12 URL을 통해 트랙 종류 식별하기

AudioTrack kind 또는 VideoTrack kind IDL 속성의 반환값을 식별하거나 텍스트 트랙의 종류를 식별하기 위해 URL이 필요한 다른 명세 또는 형식은 about:html-kind URL을 사용해야 합니다.

4.8.11.13 사용자 인터페이스

controls 속성은 불리언 속성입니다. 이 속성이 존재하면 작성자가 스크립트로 작성된 컨트롤러를 제공하지 않았으며 사용자 에이전트가 자체 컨트롤 세트를 제공하기를 원한다는 것을 나타냅니다.

속성이 존재하거나 미디어 요소에서 스크립팅이 비활성화되어 있다면 사용자 에이전트는 사용자에게 사용자 인터페이스를 노출하는 것이 좋습니다. 이 사용자 인터페이스에는 재생 시작, 재생 일시 정지, 콘텐츠의 임의 위치로 탐색(콘텐츠가 임의 탐색을 지원하는 경우), 음량 변경, 폐쇄 자막 또는 삽입된 수어 트랙의 표시 변경, 서로 다른 오디오 트랙 선택 또는 오디오 설명 활성화, 사용자에게 더 적합한 방식으로 미디어 콘텐츠 표시(예: 전체 화면 비디오 또는 독립적으로 크기를 조절할 수 있는 창) 기능이 포함되는 것이 좋습니다. 다른 컨트롤도 제공할 수 있습니다.

속성이 없는 경우에도 사용자 에이전트는 미디어 리소스의 재생에 영향을 주는 컨트롤 (예: 재생, 일시 정지, 탐색, 트랙 선택 및 음량 컨트롤)을 제공할 수 있지만, 이러한 기능이 페이지의 일반적인 렌더링을 방해해서는 안 됩니다. 예를 들어 이러한 기능은 미디어 요소의 컨텍스트 메뉴, 플랫폼 미디어 키 또는 리모컨에 노출할 수 있습니다. 사용자 에이전트는 위에서 설명한 대로 (controls 속성이 존재하는 것처럼) 사용자에게 사용자 인터페이스를 노출하는 방식으로 이를 간단히 구현할 수 있습니다.

사용자 에이전트가 미디어 요소 위에 컨트롤을 표시하여 사용자에게 사용자 인터페이스를 노출한다면 사용자 에이전트가 이 인터페이스와 상호 작용하는 동안 사용자 상호 작용 이벤트를 억제하는 것이 좋습니다. (예를 들어 사용자가 비디오 재생 컨트롤을 클릭할 경우 mousedown 이벤트 등이 페이지의 요소에서도 동시에 발생하지 않습니다.)

가능한 경우(특히 재생 시작, 중지, 일시 정지 및 재개, 탐색, 재생 속도 변경, 빨리 감기 또는 되감기, 텍스트 트랙 나열, 활성화 및 비활성화, 오디오 음소거 또는 음량 변경) 사용자 에이전트가 노출하는 사용자 인터페이스 기능은 예를 들어 동일한 이벤트가 모두 발생하도록 위에서 설명한 DOM API를 사용하여 구현해야 합니다.

빨리 감기나 되감기 같은 기능은 playbackRate 속성만 변경하여 구현해야 하며 defaultPlaybackRate 속성을 변경해서는 안 됩니다.

탐색은 미디어 요소미디어 타임라인에서 요청된 위치로 탐색하는 방식으로 구현해야 합니다. 임의 위치로 탐색하는 것이 느린 미디어 리소스의 경우 사용자 에이전트는 사용자가 탐색 막대와 같은 근사 위치 인터페이스를 조작한 것에 응답하여 탐색할 때 속도를 위해 근사 플래그를 사용하는 것이 좋습니다.


media.volume [ = value ]

HTMLMediaElement/volume

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS🔰 3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

현재 재생 음량을 0.0에서 1.0 범위의 숫자로 반환합니다. 0.0이 가장 조용하고 1.0이 가장 큽니다.

음량을 변경하도록 설정할 수 있습니다.

새 값이 0.0 .. 1.0 범위에 없으면 "IndexSizeError" DOMException을 예외로 던집니다.

media.muted [ = value ]

HTMLMediaElement/muted

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

오디오가 음소거되어 volume 속성을 재정의하는 경우 true를 반환하고, volume 속성이 적용되는 경우 false를 반환합니다.

오디오 음소거 여부를 변경하도록 설정할 수 있습니다.

미디어 요소에는 0.0(무음)에서 1.0(가장 큰 음량) 범위의 비율인 재생 음량이 있습니다. 초기 음량은 1.0인 것이 좋지만 사용자 에이전트는 사이트별 또는 다른 방식으로 세션 간에 마지막으로 설정한 값을 기억할 수 있으므로 다른 값으로 시작할 수도 있습니다.

미디어 요소 element재생 음량을 설정하여 숫자 value로 만들려면 다음을 수행합니다.

  1. element재생 음량value와 같다면 반환합니다.

  2. element재생 음량value로 설정합니다.

  3. element재생 허용됨 상태가 아니라면 element에 대해 내부 일시 정지 단계를 실행합니다.

  4. element가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 element에서 volumechange라는 이름의 이벤트를 발생시킵니다.

volume getter 단계는 this재생 음량을 반환하는 것입니다.

volume setter 단계는 다음과 같습니다.

  1. 주어진 값이 0.0 이상 1.0 이하의 범위에 없다면 "IndexSizeError" DOMException을 예외로 던집니다.

  2. this재생 음량을 설정하여 주어진 값으로 만듭니다.

미디어 요소는 다음 중 하나라도 true이면 음소거됨 상태입니다.

미디어 요소에는 true, false 또는 "default" 중 하나인 음소거 상태가 있으며, 초기값은 "default"입니다. 사용자 에이전트는 사이트별 또는 다른 방식으로 세션 간에 마지막으로 설정한 값을 기억하는 등의 이유로 미디어 요소음소거 상태를 설정하여 true 또는 false로 만들 수 있습니다.

미디어 요소 element음소거 상태를 설정하여 불리언 value로 만들려면 다음을 수행합니다.

  1. element음소거 상태value와 같다면 반환합니다.

  2. element음소거 상태value로 설정합니다.

  3. element재생 허용됨 상태가 아니라면 element에 대해 내부 일시 정지 단계를 실행합니다.

  4. element가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 element에서 volumechange라는 이름의 이벤트를 발생시킵니다.

muted getter 단계는 this음소거됨 상태라면 true를 반환하고, 그렇지 않으면 false를 반환하는 것입니다.

muted setter 단계는 this음소거 상태를 설정하여 주어진 값으로 만드는 것입니다.

사용자 에이전트에는 연결된 음량 잠금(불리언)이 있습니다. 해당 값은 구현 정의이며 재생 음량이 적용되는지를 결정합니다.

요소의 유효 미디어 음량은 다음과 같이 결정됩니다.

  1. 사용자가 사용자 에이전트가 요소의 음량을 재정의해야 한다고 지정했다면 사용자가 원하는 음량을 반환합니다.

  2. 사용자 에이전트의 음량 잠금이 true라면 시스템 음량을 반환합니다.

  3. 요소가 음소거됨 상태라면 0을 반환합니다.

  4. volume미디어 요소 오디오 부분의 재생 음량으로 두며, 범위는 0.0(무음)에서 1.0(가장 큰 음량)입니다.

  5. volume을 0.0에서 1.0 범위에 상대적으로 해석하여 반환합니다. 0.0은 무음이고 1.0은 가장 큰 설정이며 중간 값은 음량이 점점 커집니다. 범위는 선형일 필요가 없습니다. 가장 큰 설정은 시스템에서 가능한 가장 큰 설정보다 낮을 수 있습니다. 예를 들어 사용자가 최대 음량을 설정했을 수 있습니다.

미디어 요소muted 콘텐츠 속성은 음소거의 기본값을 제공하는 불리언 속성입니다.

muted setter가 호출되거나 사용자가 환경설정을 지정한 후에는 이 속성이 더 이상 영향을 주지 않습니다.

이 비디오(광고)는 자동으로 재생되지만 사용자를 방해하지 않도록 소리 없이 재생되며 사용자가 소리를 켤 수 있습니다. 사용자 상호 작용 없이 음소거가 해제되면 사용자 에이전트가 비디오를 일시 정지할 수 있습니다.

<video src="adverts.cgi?kind=video" controls autoplay loop muted></video>
4.8.11.14 시간 범위

TimeRanges

현재 모든 엔진에서 지원됩니다.

Firefox4+Safari3.1+Chrome6+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

TimeRanges 인터페이스를 구현하는 객체는 시간 범위(기간) 목록을 나타냅니다.

[Exposed=Window]
interface TimeRanges {
  readonly attribute unsigned long length;
  double start(unsigned long index);
  double end(unsigned long index);
};
media.length

TimeRanges/length

현재 모든 엔진에서 지원됩니다.

Firefox4+Safari3.1+Chrome6+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

객체의 범위 수를 반환합니다.

time = media.start(index)

TimeRanges/start

현재 모든 엔진에서 지원됩니다.

Firefox4+Safari3.1+Chrome6+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

주어진 인덱스에 해당하는 범위의 시작 시간을 반환합니다.

인덱스가 범위를 벗어나면 "IndexSizeError" DOMException을 예외로 던집니다.

time = media.end(index)

TimeRanges/end

현재 모든 엔진에서 지원됩니다.

Firefox4+Safari3.1+Chrome6+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

주어진 인덱스에 해당하는 범위의 종료 시간을 반환합니다.

인덱스가 범위를 벗어나면 "IndexSizeError" DOMException을 예외로 던집니다.

TimeRanges 객체에는 0개 이상의 시간 범위로 구성된 목록범위가 있습니다.

시간 범위는 다음 항목을 가진 구조체입니다.

length getter 단계는 this범위크기를 반환하는 것입니다.

start(index) 메서드의 단계는 다음과 같습니다.

  1. indexthis범위크기보다 크거나 같다면 "IndexSizeError" DOMException을 예외로 던집니다.

  2. this범위[index]의 시작을 반환합니다.

end(index) 메서드의 단계는 다음과 같습니다.

  1. indexthis범위크기보다 크거나 같다면 "IndexSizeError" DOMException을 예외로 던집니다.

  2. this범위[index]의 을 반환합니다.

TimeRanges 객체의 범위에 있는 각 시간 범위에 대해 다음이 참이라면 해당 객체는 정규화된 TimeRanges 객체입니다.

즉, 이러한 객체의 시간 범위는 순서대로 정렬되어 있고 서로 겹치지 않으며 맞닿지도 않습니다(서로 인접한 범위는 하나의 더 큰 시간 범위로 합쳐집니다). 시간 범위는 비어 있을 수 있습니다(시간상의 단일 순간만 참조). 예를 들어 미디어 요소가 일시 정지되어 있을 때 사용자 에이전트가 현재 프레임을 제외한 전체 미디어 리소스를 폐기한 경우 현재 하나의 프레임만 버퍼링되어 있음을 나타낼 수 있습니다.

시간 범위시작은 모두 포함됩니다.

따라서 시간 범위은 그 뒤에 이어지는 인접한 (맞닿지만 겹치지는 않는) 시간 범위시작과 같습니다. 마찬가지로 0을 기준으로 하는 전체 타임라인을 포함하는 시간 범위시작이 0이고 이 타임라인의 재생 시간과 같습니다.

미디어 요소buffered, seekableplayed IDL 속성이 반환하는 객체에서 사용하는 타임라인은 해당 요소의 미디어 타임라인이어야 합니다.

4.8.11.15 TrackEvent 인터페이스

TrackEvent

현재 모든 엔진에서 지원됩니다.

Firefox27+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
[Exposed=Window]
interface TrackEvent : Event {
  constructor(DOMString type, optional TrackEventInit eventInitDict = {});

  readonly attribute (VideoTrack or AudioTrack or TextTrack)? track;
};

dictionary TrackEventInit : EventInit {
  (VideoTrack or AudioTrack or TextTrack)? track = null;
};
event.track

TrackEvent/track

현재 모든 엔진에서 지원됩니다.

Firefox27+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

이벤트와 관련된 트랙 객체(TextTrack, AudioTrack 또는 VideoTrack)를 반환합니다.

track 속성은 초기화된 값을 반환해야 합니다. 이는 이벤트의 컨텍스트 정보를 나타냅니다.

4.8.11.16 이벤트 요약

이 절은 비규범적입니다.

다음 이벤트는 위에서 설명한 처리 모델의 일부로 미디어 요소에서 발생합니다.

이벤트 이름 인터페이스 발생 시점... 전제 조건
loadstart

HTMLMediaElement/loadstart_event

현재 모든 엔진에서 지원됩니다.

Firefox6+Safari4+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
Event 사용자 에이전트가 리소스 선택 알고리즘의 일부로 미디어 데이터를 찾기 시작합니다. networkStateNETWORK_LOADING과 같습니다.
progress

HTMLMediaElement/progress_event

현재 모든 엔진에서 지원됩니다.

Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
Event 사용자 에이전트가 미디어 데이터를 가져오는 중입니다. networkStateNETWORK_LOADING과 같습니다.
suspend

HTMLMediaElement/suspend_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 사용자 에이전트가 의도적으로 현재 미디어 데이터를 가져오지 않고 있습니다. networkStateNETWORK_IDLE과 같습니다.
abort

HTMLMediaElement/abort_event

현재 모든 엔진에서 지원됩니다.

Firefox9+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
Event 사용자 에이전트가 미디어 데이터의 다운로드가 완료되기 전에 가져오기를 중지했지만, 오류로 인한 것은 아닙니다. error는 코드가 MEDIA_ERR_ABORTED인 객체입니다. networkState는 다운로드가 중단된 시점에 따라 NETWORK_EMPTY 또는 NETWORK_IDLE 중 하나와 같습니다.
error

HTMLMediaElement/error_event

현재 모든 엔진에서 지원됩니다.

Firefox6+Safari3.1+Chrome3+
Opera11.6+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12+
Event 미디어 데이터를 가져오는 중에 오류가 발생했거나 리소스 유형이 지원되는 미디어 형식이 아닙니다. error는 코드가 MEDIA_ERR_NETWORK 이상인 객체입니다. networkState는 다운로드가 중단된 시점에 따라 NETWORK_EMPTY 또는 NETWORK_IDLE 중 하나와 같습니다.
emptied

HTMLMediaElement/emptied_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event networkState가 이전에는 NETWORK_EMPTY 상태가 아니었던 미디어 요소가 방금 해당 상태로 전환되었습니다 (곧 보고될 로드 중 치명적 오류 때문이거나, 리소스 선택 알고리즘이 이미 실행 중일 때 load() 메서드가 호출되었기 때문입니다). networkStateNETWORK_EMPTY이며, 모든 IDL 속성이 초기 상태입니다.
stalled

HTMLMediaElement/stalled_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 사용자 에이전트가 미디어 데이터를 가져오려 하고 있지만 예기치 않게 데이터가 도착하지 않습니다. networkStateNETWORK_LOADING입니다.
loadedmetadata

HTMLMediaElement/loadedmetadata_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 사용자 에이전트가 방금 미디어 리소스의 재생 시간과 크기를 결정했으며 텍스트 트랙이 준비되었습니다. readyState가 처음으로 새롭게 HAVE_METADATA 이상이 되었습니다.
loadeddata

HTMLMediaElement/loadeddata_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 사용자 에이전트가 처음으로 현재 재생 위치미디어 데이터를 렌더링할 수 있습니다. readyState가 처음으로 새롭게 HAVE_CURRENT_DATA 이상으로 증가했습니다.
canplay

HTMLMediaElement/canplay_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 사용자 에이전트가 미디어 데이터의 재생을 재개할 수 있지만, 지금 재생을 시작하면 콘텐츠를 추가로 버퍼링하기 위해 중지하지 않고 현재 재생 속도로 미디어 리소스 끝까지 렌더링할 수 없다고 판단합니다. readyState가 새롭게 HAVE_FUTURE_DATA 이상으로 증가했습니다.
canplaythrough

HTMLMediaElement/canplaythrough_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 사용자 에이전트가 지금 재생을 시작하면 추가 버퍼링을 위해 중지하지 않고 현재 재생 속도로 미디어 리소스 끝까지 렌더링할 수 있다고 판단합니다. readyState가 새롭게 HAVE_ENOUGH_DATA와 같습니다.
playing

HTMLMediaElement/playing_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 미디어 데이터 부족으로 재생이 일시 정지되거나 지연된 후 다시 시작할 준비가 되었습니다. readyState가 새롭게 HAVE_FUTURE_DATA 이상이고 paused가 false이거나, paused가 새롭게 false이고 readyStateHAVE_FUTURE_DATA 이상입니다. 이 이벤트가 발생하더라도 요소는 여전히 잠재적으로 재생 중이 아닐 수 있습니다. 예를 들어 요소가 사용자 상호 작용을 위해 일시 정지됨 상태이거나 대역 내 콘텐츠를 위해 일시 정지됨 상태일 수 있습니다.
waiting

HTMLMediaElement/waiting_event

현재 모든 엔진에서 지원됩니다.

Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+
Event 다음 프레임을 사용할 수 없어 재생이 중지되었지만 사용자 에이전트는 해당 프레임을 적절한 시기에 사용할 수 있게 될 것으로 예상합니다. readyStateHAVE_CURRENT_DATA 이하이고 paused가 false입니다. seeking이 true이거나 현재 재생 위치buffered의 어떤 범위에도 포함되지 않습니다. 다른 이유로 재생이 중지되면서도 paused가 false일 수 있지만, 이러한 이유로는 이 이벤트가 발생하지 않습니다(그리고 해당 상황이 해결되더라도 별도의 playing 이벤트도 발생하지 않습니다). 예를 들어 재생이 끝났거나, 재생이 오류로 인해 중지되었거나, 요소가 사용자 상호 작용을 위해 일시 정지됨 상태이거나 대역 내 콘텐츠를 위해 일시 정지됨 상태일 수 있습니다.
seeking

HTMLMediaElement/seeking_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event seeking IDL 속성이 true로 변경되었으며 사용자 에이전트가 새 위치로 탐색을 시작했습니다.
seeked

HTMLMediaElement/seeked_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 현재 재생 위치가 변경된 후 seeking IDL 속성이 false로 변경되었습니다.
ended

HTMLMediaElement/ended_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 미디어 리소스의 끝에 도달하여 재생이 중지되었습니다. currentTime미디어 리소스의 끝과 같고 ended가 true입니다.
durationchange

HTMLMediaElement/durationchange_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event duration 속성이 방금 업데이트되었습니다.
timeupdate

HTMLMediaElement/timeupdate_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 현재 재생 위치가 일반 재생의 일부로 또는 불연속적인 변경처럼 특별히 주목할 만한 방식으로 변경되었습니다.
play

HTMLMediaElement/play_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 요소가 더 이상 일시 정지되어 있지 않습니다. play() 메서드가 반환된 후 또는 autoplay 속성으로 인해 재생이 시작될 때 발생합니다. paused가 새롭게 false입니다.
pause

HTMLMediaElement/pause_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event 요소가 일시 정지되었습니다. pause() 메서드가 반환된 후 발생합니다. paused가 새롭게 true입니다.
ratechange

HTMLMediaElement/ratechange_event

현재 모든 엔진에서 지원됩니다.

Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+
Event defaultPlaybackRate 또는 playbackRate 속성이 방금 업데이트되었습니다.
resize Event videoWidthvideoHeight 속성 중 하나 또는 둘 모두가 방금 업데이트되었습니다. 미디어 요소video 요소이고, readyStateHAVE_NOTHING이 아닙니다.
volumechange

HTMLMediaElement/volumechange_event

현재 모든 엔진에서 지원됩니다.

Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+
Event volume 속성 또는 muted 속성이 변경되었습니다. 관련 속성의 setter가 반환된 후 발생합니다.

다음 이벤트는 source 요소에서 발생합니다.

이벤트 이름 인터페이스 발생 시점...
error Event 미디어 데이터를 가져오는 중에 오류가 발생했거나 리소스 유형이 지원되는 미디어 형식이 아닙니다.

다음 이벤트는 AudioTrackList, VideoTrackListTextTrackList 객체에서 발생합니다.

이벤트 이름 인터페이스 발생 시점...
change

AudioTrackList/change_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

TextTrackList/change_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari7+Chrome33+
Opera?Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android?

VideoTrackList/change_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
Event 트랙 목록에 있는 하나 이상의 트랙이 활성화되거나 비활성화되었습니다.
addtrack

AudioTrackList/addtrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

TextTrackList/addtrack_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

VideoTrackList/addtrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
TrackEvent 트랙 목록에 트랙이 추가되었습니다.
removetrack

AudioTrackList/removetrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

TextTrackList/removetrack_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari7+Chrome33+
Opera20+Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android20+

VideoTrackList/removetrack_event

현재 모든 엔진에서 지원됩니다.

Firefox🔰 33+Safari7+Chrome🔰 37+
Opera?Edge🔰 79+
Edge (Legacy)아니요Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
TrackEvent 트랙 목록에서 트랙이 제거되었습니다.

다음 이벤트는 TextTrack 객체와 track 요소에서 발생합니다.

이벤트 이름 인터페이스 발생 시점...
cuechange

HTMLTrackElement/cuechange_event

현재 모든 엔진에서 지원됩니다.

Firefox68+Safari10+Chrome32+
Opera19+Edge79+
Edge (Legacy)14+Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android4.4.3+Samsung Internet?Opera Android19+

TextTrack/cuechange_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
Event 트랙에 있는 하나 이상의 큐가 활성 상태가 되거나 더 이상 활성 상태가 아니게 되었습니다.

다음 이벤트는 track 요소에서 발생합니다.

이벤트 이름 인터페이스 발생 시점...
error Event 트랙 데이터를 가져오는 중에 오류가 발생했거나 리소스 유형이 지원되는 텍스트 트랙 형식이 아닙니다.
load Event 트랙 데이터를 가져와 성공적으로 처리했습니다.

다음 이벤트는 TextTrackCue 객체에서 발생합니다.

이벤트 이름 인터페이스 발생 시점...
enter

TextTrackCue/enter_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
Event 큐가 활성 상태가 되었습니다.
exit

TextTrackCue/exit_event

현재 모든 엔진에서 지원됩니다.

Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
Event 큐가 더 이상 활성 상태가 아닙니다.
4.8.11.17 보안 및 개인정보 보호 고려 사항

videoaudio 요소의 주요 보안 및 개인정보 보호 문제는 교차 출처 미디어를 삽입할 수 있다는 점에서 발생합니다. 위협은 적대적인 콘텐츠에서 피해 페이지로, 그리고 적대적인 페이지에서 피해 콘텐츠로 두 방향으로 흐를 수 있습니다.


피해 페이지가 적대적인 콘텐츠를 삽입하는 경우 위협은 해당 콘텐츠가 콘텐츠를 삽입한 Document와 상호 작용하려는 스크립트 코드를 포함할 수 있다는 것입니다. 이를 방지하기 위해 사용자 에이전트는 콘텐츠에서 삽입 페이지로 접근할 수 없도록 해야 합니다. DOM 개념을 사용하는 미디어 콘텐츠의 경우 삽입된 콘텐츠는 자체적인 서로 관련 없는 최상위 탐색 가능 항목에 있는 것처럼 취급해야 합니다.

예를 들어 SVG 애니메이션이 video 요소에 삽입된 경우 사용자 에이전트는 해당 애니메이션에 외부 페이지의 DOM에 대한 접근 권한을 부여하지 않습니다. SVG 리소스 내 스크립트의 관점에서 SVG 파일은 부모가 없는 단독 최상위 탐색 가능 항목에 있는 것처럼 보입니다.


적대적인 페이지가 피해 콘텐츠를 삽입하는 경우 위협은 삽입 페이지가 원래는 접근할 수 없었던 정보를 콘텐츠에서 얻을 수 있다는 것입니다. API는 미디어의 존재, 유형, 재생 시간, 크기 및 호스트의 성능 특성과 같은 일부 정보를 노출합니다. 이러한 정보도 잠재적으로 문제가 될 수 있지만 실제로는 img 요소를 사용하여 거의 동일한 정보를 얻을 수 있으므로 허용 가능한 것으로 간주되었습니다.

그러나 사용자 에이전트가 자막과 같은 콘텐츠 내부의 메타데이터를 추가로 노출한다면 훨씬 더 민감한 정보를 얻을 수 있습니다. 따라서 해당 정보는 비디오 리소스가 CORS를 사용하는 경우에만 노출됩니다. crossorigin 속성을 사용하면 작성자가 CORS를 활성화할 수 있습니다. [FETCH]

이 제한이 없다면 공격자는 기업 네트워크 내부에서 실행 중인 사용자를 속여 기업 인트라넷에서 이전에 유출된 위치의 비디오를 로드하려는 사이트를 방문하게 할 수 있습니다. 이러한 비디오에 신제품에 대한 기밀 계획이 포함되어 있다면 자막을 읽을 수 있는 것은 심각한 기밀성 침해로 이어질 수 있습니다.

4.8.11.18 미디어 요소를 사용하는 작성자를 위한 모범 사례

이 절은 비규범적입니다.

셋톱 박스나 휴대전화와 같은 소형 기기에서 오디오 및 비디오 리소스를 재생하는 작업은 기기의 제한된 하드웨어 리소스로 인해 제약되는 경우가 많습니다. 예를 들어 기기가 동시에 세 개의 비디오만 지원할 수도 있습니다. 이러한 이유로 재생이 끝난 미디어 요소가 보유한 리소스를 해제하는 것이 좋습니다. 이를 위해 요소에 대한 모든 참조를 매우 주의 깊게 제거하고 가비지 컬렉션되도록 하거나, 더 나은 방법으로는 요소의 src 속성을 빈 문자열로 설정할 수 있습니다. srcObject가 설정된 경우에는 대신 srcObject를 null로 설정합니다.

마찬가지로 재생 속도가 정확히 1.0이 아닌 경우 하드웨어, 소프트웨어 또는 형식의 제한으로 인해 비디오 프레임이 누락되고 오디오가 끊기거나 음소거될 수 있습니다.

4.8.11.19 미디어 요소 구현자를 위한 모범 사례

이 절은 비규범적입니다.

미디어 요소 API의 여러 측면이 얼마나 정확하게 구현되는지는 구현 품질 문제로 간주됩니다.

예를 들어 buffered 속성을 구현할 때, 구현이 버퍼링된 범위를 얼마나 정밀하게 보고하는지는 사용자 에이전트가 데이터를 얼마나 세심하게 검사하는지에 따라 달라집니다. API는 범위를 시간으로 보고하지만 데이터는 바이트 스트림으로 얻어지므로, 가변 비트 전송률 스트림을 수신하는 사용자 에이전트는 실제로 모든 데이터를 디코딩해야만 정확한 시간을 결정할 수 있을지도 모릅니다. 그러나 사용자 에이전트가 반드시 그렇게 해야 하는 것은 아닙니다. 대신 추정값(예: 지금까지 관찰한 평균 비트 전송률에 기반한 값)을 반환하고, 더 많은 정보를 사용할 수 있게 되면 이를 수정할 수 있습니다.

일반적으로 사용자 에이전트는 낙관적이기보다는 보수적으로 동작하는 것이 좋습니다. 예를 들어 모든 것이 버퍼링되지 않았는데도 모두 버퍼링되었다고 보고하는 것은 바람직하지 않습니다.

또 다른 구현 품질 문제는 코덱이 정방향 재생만을 위해 설계된 경우 비디오를 역방향으로 재생하는 것입니다(예: 키 프레임이 많지 않고 서로 멀리 떨어져 있으며, 중간 프레임은 이전 프레임과의 차이만을 포함하는 경우). 사용자 에이전트는 키 프레임만 표시하는 등 품질이 낮게 구현할 수도 있습니다. 그러나 더 나은 구현은 더 많은 작업을 수행하여 더 높은 품질을 제공할 수 있습니다. 예를 들어 실제로 비디오의 일부를 정방향으로 디코딩하고, 완전한 프레임을 저장한 뒤, 해당 프레임을 역방향으로 재생할 수 있습니다.

마찬가지로 구현은 언제든 버퍼링된 데이터를 폐기할 수 있지만(사용자 에이전트가 미디어 요소의 수명 동안 얻은 모든 미디어 데이터를 유지해야 한다는 요구 사항은 없습니다), 이 또한 구현 품질의 문제입니다. 모든 데이터를 유지할 수 있는 충분한 리소스가 있는 사용자 에이전트는 더 나은 사용자 경험을 제공할 수 있으므로 그렇게 하는 것이 좋습니다. 예를 들어 사용자가 라이브 스트림을 시청하는 경우 사용자 에이전트는 사용자가 라이브 비디오만 볼 수 있도록 할 수도 있습니다. 그러나 더 나은 사용자 에이전트라면 모든 내용을 버퍼링하여 사용자가 이전 자료를 탐색하고, 일시 정지하고, 정방향과 역방향으로 재생할 수 있도록 합니다.


일시 정지된 미디어 요소문서에서 제거되고, 다음에 이벤트 루프1단계에 도달하기 전에 다시 삽입되지 않은 경우, 리소스가 제한된 구현은 이 기회를 이용하여 미디어 요소가 사용하는 모든 하드웨어 리소스(예: 비디오 평면, 네트워크 리소스 및 데이터 버퍼)를 해제하는 것이 좋습니다. (다만 사용자 에이전트는 나중에 재생이 다시 시작될 경우를 대비해 재생 위치 등을 계속 추적해야 합니다.)

4.8.12 map 요소

Element/map

현재 모든 엔진에서 지원됩니다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android4+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLMapElement

현재 모든 엔진에서 지원됩니다.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
범주:
플로 콘텐츠.
구문 콘텐츠.
감지 가능한 콘텐츠.
이 요소를 사용할 수 있는 컨텍스트:
구문 콘텐츠가 예상되는 곳.
콘텐츠 모델:
투명.
text/html에서의 태그 생략:
어느 태그도 생략할 수 없습니다.
콘텐츠 속성:
전역 속성
nameusemap 속성에서 참조이미지 맵의 이름
접근성 고려 사항:
작성자용.
구현자용.
정제:
미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLMapElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute DOMString name;
  [SameObject] readonly attribute HTMLCollection areas;
};

map 요소는 img 요소 및 그 하위의 모든 area 요소와 함께 이미지 맵을 정의합니다. 이 요소는 자신의 자식을 나타냅니다.

name 속성은 맵을 참조할 수 있도록 맵에 이름을 부여합니다. 이 속성은 반드시 존재해야 하며, ASCII 공백이 없는 비어 있지 않은 값을 가져야 합니다. name 속성의 값은 같은 트리에 있는 다른 map 요소의 name 속성 값과 같아서는 안 됩니다. id 속성도 지정된 경우 두 속성은 같은 값을 가져야 합니다.

map.areas

map 안의 area 요소로 구성된 HTMLCollection을 반환합니다.

areas 속성은 map 요소를 루트로 하고 필터가 area 요소에만 일치하는 HTMLCollection을 반환해야 합니다.

유지 관리를 쉽게 하기 위해 이미지 맵은 페이지의 다른 콘텐츠와 함께 정의할 수 있습니다. 다음 예는 페이지 상단에 이미지 맵이 있고 하단에 이에 대응하는 텍스트 링크 집합이 있는 페이지입니다.

<!DOCTYPE HTML>
<HTML LANG="EN">
<TITLE>Babies™: Toys</TITLE>
<HEADER>
 <H1>Toys</H1>
 <IMG SRC="/images/menu.gif"
      ALT="Babies™ navigation menu. Select a department to go to its page."
      USEMAP="#NAV">
</HEADER>
 ...
<FOOTER>
 <MAP NAME="NAV">
  <P>
   <A HREF="/clothes/">Clothes</A>
   <AREA ALT="Clothes" COORDS="0,0,100,50" HREF="/clothes/"> |
   <A HREF="/toys/">Toys</A>
   <AREA ALT="Toys" COORDS="100,0,200,50" HREF="/toys/"> |
   <A HREF="/food/">Food</A>
   <AREA ALT="Food" COORDS="200,0,300,50" HREF="/food/"> |
   <A HREF="/books/">Books</A>
   <AREA ALT="Books" COORDS="300,0,400,50" HREF="/books/">
  </P>
 </MAP>
</FOOTER>

4.8.13 area 요소

Element/area

현재 모든 엔진에서 지원됩니다.

Firefox1+Safari1+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement

현재 모든 엔진에서 지원됩니다.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLAreaElement/rel

현재 모든 엔진에서 지원됩니다.

Firefox30+Safari9+Chrome54+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer11
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLAreaElement/relList

현재 모든 엔진에서 지원됩니다.

Firefox30+Safari9+Chrome65+
Opera41+Edge79+
Edge (Legacy)18Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android41+
범주:
플로 콘텐츠.
구문 콘텐츠.
이 요소를 사용할 수 있는 컨텍스트:
구문 콘텐츠가 예상되는 곳. 단, 조상에 map 요소가 있는 경우에만 해당합니다.
콘텐츠 모델:
없음.
text/html에서의 태그 생략:
종료 태그가 없습니다.
콘텐츠 속성:
전역 속성
alt — 이미지를 사용할 수 없을 때 사용할 대체 텍스트
coords이미지 맵에 생성할 도형의 좌표
shape이미지 맵에 생성할 도형의 종류
href하이퍼링크의 주소
target하이퍼링크 탐색을 위한 탐색 가능 항목
download — 리소스로 탐색하는 대신 다운로드할지 여부 및 다운로드할 경우의 파일 이름
ping — ping할 URL
rel하이퍼링크를 포함하는 문서 내 위치와 대상 리소스 사이의 관계
referrerpolicy — 요소가 시작한 가져오기에 사용할 리퍼러 정책
hreflang — 연결된 리소스의 언어
type — 참조된 리소스 유형에 대한 힌트
접근성 고려 사항:
요소에 href 속성이 있는 경우: 작성자용; 구현자용.
그렇지 않은 경우: 작성자용; 구현자용.
정제:
탐색 URL 속성 href를 포함하는 미분류.
DOM 인터페이스:
[Exposed=Window]
interface HTMLAreaElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions, Reflect] attribute DOMString alt;
  [CEReactions, Reflect] attribute DOMString coords;
  [CEReactions, Reflect] attribute DOMString shape;
  [CEReactions, Reflect] attribute DOMString download;
  [CEReactions, Reflect] attribute USVString ping;
  [CEReactions, Reflect] attribute DOMString rel;
  [SameObject, PutForwards=value, Reflect="rel"] readonly attribute DOMTokenList relList;
  [CEReactions] attribute DOMString referrerPolicy;

  // also has obsolete members
};
HTMLAreaElement includes HyperlinkElementUtils;
HTMLAreaElement includes HTMLHyperlinkElementUtils;

area 요소는 일부 텍스트와 이미지 맵의 대응하는 영역이 있는 하이퍼링크 또는 이미지 맵의 비활성 영역을 나타냅니다.

부모 노드가 있는 area 요소에는 조상으로 map 요소가 있어야 합니다.

area 요소에 href 속성이 있다면 area 요소는 하이퍼링크를 나타냅니다. 이 경우 alt 속성이 있어야 합니다. 이 속성은 하이퍼링크의 텍스트를 지정합니다. 그 값은 이미지 맵의 다른 하이퍼링크에 지정된 텍스트 및 이미지의 대체 텍스트와 함께 표시되되 이미지 자체는 표시되지 않을 때, 해당 하이퍼링크의 텍스트 없이 그 모양이 이미지에 적용된 상태로 사용했을 때와 동일한 종류의 선택지를 사용자에게 제공하는 텍스트여야 합니다. 같은 이미지 맵 안에 같은 리소스를 가리키며 비어 있지 않은 alt 속성을 가진 다른 area 요소가 있다면 alt 속성을 비워 둘 수 있습니다.

area 요소에 href 속성이 없다면 해당 요소가 나타내는 영역은 선택할 수 없으며, alt 속성을 생략해야 합니다.

두 경우 모두 shapecoords 속성이 영역을 지정합니다.

shape 속성은 다음 키워드와 상태를 갖는 열거형 속성입니다.

키워드 적합 상태 간략한 설명
circle 원 상태 coords 속성에 정확히 세 개의 정수를 사용하여 원을 지정합니다.
circ 아니요
default 기본 상태 이 영역은 이미지 전체입니다. (coords 속성은 사용되지 않습니다.)
poly 다각형 상태 coords 속성에 최소 여섯 개의 정수를 사용하여 다각형을 지정합니다.
polygon 아니요
rect 직사각형 상태 coords 속성에 정확히 네 개의 정수를 사용하여 직사각형을 지정합니다.
rectangle 아니요

이 속성의 누락 값 기본값유효하지 않은 값 기본값은 모두 직사각형 상태입니다.

coords 속성이 지정된 경우 유효한 부동 소수점 숫자 목록을 포함해야 합니다. 이 속성은 shape 속성이 설명하는 도형의 좌표를 제공합니다. 이 속성의 처리는 이미지 맵 처리 모델의 일부로 설명됩니다.

원 상태에서 area 요소는 세 개의 정수를 가진 coords 속성을 반드시 가져야 하며, 마지막 정수는 음수가 아니어야 합니다. 첫 번째 정수는 이미지의 왼쪽 가장자리에서 원의 중심까지의 거리를 CSS 픽셀 단위로 나타내야 하고, 두 번째 정수는 이미지의 위쪽 가장자리에서 원의 중심까지의 거리를 CSS 픽셀 단위로 나타내야 하며, 세 번째 정수는 원의 반지름을 역시 CSS 픽셀 단위로 나타내야 합니다.

기본 상태에서 area 요소는 coords 속성을 가져서는 안 됩니다. (영역은 이미지 전체입니다.)

다각형 상태에서 area 요소는 최소 여섯 개의 정수를 가진 coords 속성을 반드시 가져야 하며, 정수의 개수는 짝수여야 합니다. 각 정수 쌍은 각각 이미지의 왼쪽과 위쪽으로부터의 거리를 CSS 픽셀 단위로 나타낸 좌표를 표현해야 하며, 모든 좌표는 순서대로 다각형의 점을 나타내야 합니다.

직사각형 상태에서 area 요소는 정확히 네 개의 정수를 가진 coords 속성을 반드시 가져야 하며, 첫 번째 정수는 세 번째 정수보다 작고 두 번째 정수는 네 번째 정수보다 작아야 합니다. 네 값은 각각 이미지의 왼쪽 가장자리에서 직사각형의 왼쪽 면까지의 거리, 위쪽 가장자리에서 위쪽 면까지의 거리, 왼쪽 가장자리에서 오른쪽 면까지의 거리, 위쪽 가장자리에서 아래쪽 면까지의 거리를 모두 CSS 픽셀 단위로 나타내야 합니다.

사용자 에이전트가 사용자가 area 요소를 사용하여 생성한 하이퍼링크를 따라가거나 하이퍼링크를 다운로드하도록 허용할 때, href, target, downloadping 속성이 링크를 따라가는 방식을 결정합니다. rel 속성은 사용자가 링크를 따라가기 전에 대상 리소스의 예상되는 성격을 사용자에게 나타내는 데 사용할 수 있습니다.

href 속성이 없다면 target, download, ping, rel, referrerpolicy, hreflangtype 속성을 생략해야 합니다.

itemprop 속성이 area 요소에 지정된 경우 href 속성도 지정해야 합니다.

HTMLAreaElement/referrerPolicy

현재 모든 엔진에서 지원됩니다.

Firefox50+Safari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?Internet Explorer아니요
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

IDL 속성 referrerPolicyreferrerpolicy 콘텐츠 속성을 알려진 값으로만 제한하여 반영해야 합니다.

4.8.14 이미지 맵

4.8.14.1 작성

이미지 맵을 사용하면 이미지의 기하학적 영역을 하이퍼링크와 연결할 수 있습니다.

img 요소 형태의 이미지는 해당 img 요소에 usemap 속성을 지정하여 map 요소 형태의 이미지 맵과 연결할 수 있습니다. usemap 속성이 지정된 경우 해당 속성은 map 요소에 대한 유효한 해시 이름 참조여야 합니다.

다음과 같은 이미지를 살펴보겠습니다.

동일한 간격으로 배치된 네 개의 도형이 있는 선: 빨간색 속이 빈 상자, 녹색 원, 파란색 삼각형, 노란색 네 꼭짓점 별.

색칠된 영역만 클릭할 수 있도록 하려면 다음과 같이 할 수 있습니다.

<p>
 Please select a shape:
 <img src="shapes.png" usemap="#shapes"
      alt="Four shapes are available: a red hollow box, a green circle, a blue triangle, and a yellow four-pointed star.">
 <map name="shapes">
  <area shape=rect coords="50,50,100,100"> <!-- the hole in the red box -->
  <area shape=rect coords="25,25,125,125" href="red.html" alt="Red box.">
  <area shape=circle coords="200,75,50" href="green.html" alt="Green circle.">
  <area shape=poly coords="325,25,262,125,388,125" href="blue.html" alt="Blue triangle.">
  <area shape=poly coords="450,25,435,60,400,75,435,90,450,125,465,90,500,75,465,60"
        href="yellow.html" alt="Yellow star.">
 </map>
</p>
4.8.14.2 처리 모델

img 요소에 usemap 속성이 지정된 경우 사용자 에이전트는 다음과 같이 처리해야 합니다.

  1. 해당 요소를 컨텍스트 노드로 사용하여 map 요소에 대한 해시 이름 참조 파싱 규칙으로 속성 값을 파싱합니다. 그러면 요소(map) 또는 null이 반환됩니다.

  2. null이 반환되었다면 반환합니다. 결국 이미지는 이미지 맵과 연결되지 않은 것입니다.

  3. 그렇지 않다면 사용자 에이전트는 map의 하위 요소인 모든 area 요소를 수집해야 합니다. 이 목록을 areas라고 합니다.

이미지 맵을 구성하는 area 요소 목록 (areas)을 얻은 뒤, 대화형 사용자 에이전트는 이 목록을 두 가지 방법 중 하나로 처리해야 합니다.

사용자 에이전트가 img 요소가 나타내는 텍스트를 표시하려는 경우 다음 단계를 사용해야 합니다.

  1. areas에서 href 속성이 없는 모든 area 요소를 제거합니다.

  2. areashref 속성 값이 같고 비어 있지 않은 alt 속성을 가진 다른 area 요소가 있는 경우, alt 속성이 없거나 alt 속성 값이 빈 문자열인 모든 area 요소를 areas에서 제거합니다.

  3. areas에 남아 있는 각 area 요소는 하이퍼링크를 나타냅니다. 이러한 모든 하이퍼링크는 img의 텍스트와 연결된 방식으로 사용자에게 제공하는 것이 좋습니다.

    이 컨텍스트에서 사용자 에이전트는 areaimg 요소에 alt 속성이 지정되지 않았거나, 해당 alt 속성이 빈 문자열 또는 그 밖의 보이지 않는 텍스트인 경우, 적절한 작성자 제공 텍스트가 없음을 나타내기 위한 구현 정의 방식으로 해당 요소를 나타낼 수 있습니다.

사용자 에이전트가 이미지를 표시하고 이미지와의 상호 작용을 통해 하이퍼링크를 선택할 수 있도록 하려는 경우, 이미지는 areas에 있는 area 요소에서 가져온 계층화된 도형 집합과 연결되어야 합니다. 도형은 역순 트리 순서로 배치됩니다. 따라서 map에서 마지막으로 지정된 area 요소가 가장 아래쪽 도형이 되고, map에서 트리 순서상 첫 번째 요소가 가장 위쪽 도형이 됩니다.

areas의 각 area 요소는 이미지 위에 계층화할 도형을 얻기 위해 다음과 같이 처리해야 합니다.

  1. 요소의 shape 속성이 나타내는 상태를 찾습니다.

  2. 요소의 coords 속성이 존재한다면 부동 소수점 숫자 목록 파싱 규칙을 사용하여 파싱하고, 결과를 coords 목록이라고 합니다. 속성이 없다면 coords 목록을 빈 목록으로 설정합니다.

  3. 다음 표에 따라 coords 목록의 항목 수가 area 요소의 현재 상태에 주어진 최소 항목 수보다 적다면 도형은 비어 있습니다. 반환합니다.

    상태 최소 항목 수
    원 상태 3
    기본 상태 0
    다각형 상태 6
    직사각형 상태 4
  4. shape 속성의 상태에 해당하는 다음 목록의 항목에 따라 coords 목록에서 초과 항목을 검사합니다.

    원 상태
    목록에서 세 번째 이후의 모든 항목을 버립니다.
    기본 상태
    목록의 모든 항목을 버립니다.
    다각형 상태
    항목 수가 홀수라면 마지막 항목을 버립니다.
    직사각형 상태
    목록에서 네 번째 이후의 모든 항목을 버립니다.
  5. shape 속성이 직사각형 상태를 나타내고 목록의 첫 번째 숫자가 세 번째 숫자보다 수치상 크다면 두 숫자를 서로 바꿉니다.

  6. shape 속성이 직사각형 상태를 나타내고 목록의 두 번째 숫자가 네 번째 숫자보다 수치상 크다면 두 숫자를 서로 바꿉니다.

  7. shape 속성이 원 상태를 나타내고 목록의 세 번째 숫자가 0 이하라면 도형은 비어 있습니다. 반환합니다.

  8. 이제 요소가 나타내는 도형은 shape 속성의 상태에 대응하는 다음 목록의 항목에 설명된 도형입니다.

    원 상태

    xcoords의 첫 번째 숫자, y를 두 번째 숫자, r을 세 번째 숫자라고 합니다.

    도형은 중심이 이미지의 왼쪽 가장자리에서 x CSS 픽셀, 이미지의 위쪽 가장자리에서 y CSS 픽셀 떨어져 있고, 반지름이 r CSS 픽셀인 원입니다.

    기본 상태

    도형은 이미지 전체를 정확히 덮는 직사각형입니다.

    다각형 상태

    xicoords(2i)번째 항목으로, yicoords(2i+1)번째 항목으로 설정합니다 (coords의 첫 번째 항목 인덱스는 0입니다).

    좌표를 (xi, yi)로 설정합니다. 이는 이미지의 왼쪽 위를 기준으로 측정한 CSS 픽셀 단위로 해석하며, coords의 항목 수를 N이라고 할 때 0부터 (N/2)-1까지의 모든 정수 i 값에 대해 적용합니다.

    도형은 꼭짓점이 좌표로 주어지고 내부가 짝수-홀수 규칙을 사용하여 설정되는 다각형입니다. [GRAPHICS]

    직사각형 상태

    x1coords의 첫 번째 숫자, y1을 두 번째 숫자, x2를 세 번째 숫자, y2를 네 번째 숫자라고 합니다.

    도형은 왼쪽 위 모서리가 좌표 (x1, y1)로 주어지고 오른쪽 아래 모서리가 좌표 (x2, y2)로 주어지는 직사각형입니다. 해당 좌표는 이미지의 왼쪽 위 모서리를 기준으로 한 CSS 픽셀로 해석됩니다.

    역사적인 이유로 좌표는 CSS 'width''height' 속성으로 인해 늘어난 후의 표시된 이미지를 기준으로 해석해야 합니다. CSS를 지원하지 않는 브라우저에서는 이미지 요소의 widthheight 속성을 기준으로 합니다. CSS 브라우저는 이러한 속성을 앞서 언급한 CSS 속성에 매핑합니다.

    브라우저 확대/축소 기능과 CSS 또는 SVG를 사용해 적용한 변환은 좌표에 영향을 주지 않습니다.

위 알고리즘에 따라 계층화된 도형 집합과 연결된 이미지와 포인팅 장치가 상호 작용할 때, 관련 사용자 상호 작용 이벤트는 포인팅 장치가 가리킨 지점을 덮는 가장 위쪽 도형이 있다