- 웹 접근성을 공부하던 Patrick Weaver는 Eleventy 기반 개인 사이트에서 100개 이상의 HTML 태그를 실제 페이지에 적용하며 의미론적 HTML을 실험함
- 처음 목표는 향후 글 작성 때 낯선 요소의 CSS 때문에 발목 잡히지 않는 것이었지만, 이 한 글을 완성하는 데 1년 반이 걸림
- MDN Web Docs의 HTML 요소 목록을 기준으로
<article>,<main>,<nav>,<section>,<search>,<hgroup>같은 구조 요소를 재검토함 <bdi>,<ruby>,<samp>,<wbr>,<dialog>,<template>등 덜 익숙한 요소는 방향성, 발음 표기, 프로그램 출력, 줄바꿈, 상호작용, 웹 컴포넌트 같은 구체적 사용처를 드러냄- 브라우저 지원, 정적 사이트 생성, Safari 비디오 재생, deprecated 태그 동작처럼 HTML의 의미와 실제 구현 사이에는 호환성의 흔적이 남아 있음
실험의 출발점과 목표
- 웹 접근성을 더 배운 뒤, 흔히 쓰지 않는 HTML 요소를 살펴보고 개인 사이트에 반영하기 시작함
- 사이트는 Eleventy로 만들어졌고, 블로그 글 본문을
<article>로 감싸며 레이아웃 템플릿에<main>을 추가함 - 이미지 캡션을 위해
<figure>와<figcaption>스타일을 이미 다듬었고, Recurse 관련 footnote 또는 sidenote 구현에도 흥미를 느낌 - MDN Web Docs의 HTML 요소 목록을 기준으로 모든 요소를 한 글에서 써보기로 함
- 목표는 앞으로 글을 쓸 때 이전에 쓰지 않은 요소 때문에 CSS 업데이트가 지연되지 않게 하는 것이었음
- 실제로는 이 글 하나를 위해 스타일과 템플릿을 고치는 데 1년 반이 걸림
<html>처럼 글 본문에 직접 넣기 어려운 요소도 있지만, patrickweaver.net에서 보면 페이지 어딘가에 모든 요소가 쓰이도록 구성함
문서 구조와 메타데이터 요소
<html>에는 별도 변경이 필요 없었지만,lang="en"같은 lang 속성을 항상 기억하지 못한다는 점을 확인함<base>는 이 글을 쓰기 전에는 익숙하지 않았고, 이후 상대 링크와 함께 레이아웃 템플릿에 추가함- 로컬 개발과 상대 링크에서 몇 가지 문제가 생겼지만 쉽게 해결됨
<head>,<link>,<meta>,<style>,<title>은 이미 익숙하고 사이트에 존재하던 요소였음
<body>문서를 읽으며onbeforeprint,onblur같은 속성을 접함onbeforeprint는 이전에 더 우회적인 방식으로 처리했던 기능과 관련됨onblur는 주 용도가 성가신 팝업처럼 보였음
콘텐츠 섹션과 제목 계층
<address>는 우편 주소 전용이라고 생각했지만, 이메일 주소와 링크에도 쓸 수 있음을 알게 됨- 블로그 포스트 템플릿에는 이미
<article>을 적용했고, 문서를 읽은 뒤 사이트의 모든 페이지에도 맞을 수 있는지 고민함 - footnote 영역에는
<aside>를 사용함<aside>는 문서의 주요 내용과 간접적으로 관련된 부분을 나타냄- 향후 sidenote처럼 스타일링할 가능성을 남김
- 사이트 디자인에는 원래
<footer>가 없었지만 이 글에는 추가함 <header>는 페이지 상단에만 쓰고 있었으나, 여러 개를 써도 된다는 점을 확인하고 각 블로그 글의 헤더 영역에도 적용함- 제목 계층도 함께 정리함
- 기존에는 사이트 이름을
<h1>, 섹션명을<h2>, 글 제목을<h3>로 사용함 - 문서와 W3C 팁을 읽은 뒤, 페이지에 따라
<h1>의 대상이 달라지도록 바꾸고 스타일은 클래스로 처리함 - 이는 HTML과 CSS의 관심사 분리에 더 맞는 방식으로 판단함
- 기존에는 사이트 이름을
- 2022년 초 실험을 시작한 뒤 2023년 여름 공개 전까지
<hgroup>과<search>가 MDN 문서에 추가됨<hgroup>은 섹션 제목과 부제<p>를 묶는 데 사용함<search>는 검색 결과가 아니라 검색 입력을 나타내는 의미 요소임- 정적 생성 사이트라 서버 검색 결과 생성이 없어서 예제에는 JavaScript가 필요함
- 2023년 기준 MDN 헤더 검색이나 google.com에서도
<search>를 보지 못함
<main>은 이 탐구를 시작하게 만든 초기 호기심 중 하나였고, MDN 목록을 읽은 뒤 상단 메뉴에는<nav>를 추가함<section>도 글에 넣었지만, Markdown과 HTML을 섞어 작성할 때 시각적으로 중첩을 명확히 유지하기 어려워 다른 곳에서 자주 쓸지는 불확실함
텍스트 콘텐츠 요소에서 얻은 관찰
<blockquote>는 이전에 트윗 임베드에 썼지만, 이 글에서는 독립 인용문 스타일을 추가함- 문서를 자세히 보기 전에는
<blockquote>의cite속성과<cite>요소를 몰랐음
- 문서를 자세히 보기 전에는
<dd>,<dl>,<dt>는 뒤늦게 알게 된 요소이며,<ol>과<ul>에 비해<dl>은 상대적으로 덜 알려진 점을 이상하게 느낌<ol>과<ul>은 기본 margin이 있지만<dl>은<dd>에 margin이 있음
<div>는 과용 때문에 현대 웹에서 나쁜 평판이 있지만, 이 사이트에서는 처음엔 적게 쓰임- 함께 스타일링하려는 요소가 생기면서 약 20개 정도까지 늘어남
- 일반적인 “section”이 많지 않은 사이트에서는 많은
<div>가 불필요할 수 있음을 보여줌
<figure>와<figcaption>은 Medium에 있던 글을 옮기며 이미지 캡션을 의미론적으로 표현하려고 추가한 초기 요소임- 문서상
<figure>는 이미지뿐 아니라 일러스트, 다이어그램, 코드 스니펫에도 쓸 수 있음 - 현재 코드 블록 중에도
<figure>를 쓸 수 있는 곳이 많다고 판단함
- 문서상
<hr>는 시각적 가로선이 아니라 의미론적 구분으로 정의된다는 문서를 보고 스타일을 다시 살핌hr:after에 이모지를 넣었지만, 스크린 리더에서 어떻게 동작하는지 확인이 필요함
<menu>는 처음 접한 요소였고, 브라우저가 사실상<ul>처럼 취급한다는 점 때문에 HTML5까지 남은 것이 의외였음<p>문서는 기대보다 지침이 적었고, 긴 글이 아닌 텍스트가 “정말 문단인가”라는 질문을 남김<pre>는 코드 블록용으로만 생각했지만, 의미 있는 공백을 표시하는 데도 쓸 수 있음을 확인함
인라인 텍스트 의미 요소
<a href="#">link</a>는 placeholder처럼 써왔지만, 실제로는 페이지 맨 위로 이동하는 링크였음<abbr>는 MDN 문서가 “저자의 편의를 위한 것”이라고 설명해 가장 덜 쓰일 가능성이 높은 태그처럼 보였음<b>와<strong>의 차이는 HTML5에서<strong>이<b>를 대체한 것이라고 생각했던 기존 이해와 달랐음- 실용적 규칙으로는 대체로
<b>를 단어 단위,<strong>을 문장이나 구 단위에 쓰겠다고 정리함 - 이는 실제 구분을 단순화한 경험칙임
- 실용적 규칙으로는 대체로
<bdi>는 주변 텍스트와 방향이 다를 수 있는 텍스트를 다루는 요소임- 예시는 이름이지만, 임의의 사용자 입력 유니코드 텍스트에도 적용 가능하다고 봄
- 향후 임의 입력을 포함할 수 있는 태그를
<bdi>로 감싸려 함
<bdo>는 RTL 언어를 자주 다루지 않아 덜 쓸 것 같지만, 소량의 RTL 텍스트를 처리하는 법을 아는 것은 유용함<br>는 과거<div>처럼 오용되던 시기가 있었지만 CSS가 강해지며 덜 그럴 가능성이 있다고 봄- 문서의 예시가 시라는 점에서 문단과 독립 행 사이의 경계가 어떻게 고려됐는지 궁금해함
- 일부 경우
<pre>가 더 맞을 수도 있음
<cite>와<q>는 많은 언어에서 눈에 보이는 구두점으로 이미 표현되는 의미를 HTML 의미 요소로 다시 나타냄<cite>기본 스타일은 기울임이고<q>는 텍스트에 없는 따옴표를 추가함
<code>는 글 전체에서 많이 쓰였고, Google Docs의 Markdown 지원이<code>를 쓰는지 궁금했지만 문서 HTML을 보니 Google Docs는 현재<canvas>로 렌더링함<data>는 MDN 예시가 제품명에 제품 ID를value로 붙이는 방식이라 실제 사용처를 떠올리기 어려웠음- 사용자에게 보일 ID라면 표시하는 편이 낫고, 사용자에게 보이지 않을 ID라면 누구를 위한 데이터인지 불분명함
<data>는 W3C HTML5 specification에는 보이지 않는다고 확인함
<dfn>은 정의 자체가 아니라 정의 안의 용어를 감싸는 요소라 이름이 이상하다고 봄- 공식 채택되지 않은 HTML 2.0 제안에만 포함된 것으로 보인다고 정리함
<em>과<i>도<b>와<strong>처럼 사용 기준을 고민하게 만듦- 실용 규칙으로는 대체로
<em>은 단어,<i>는 문장이나 구에 쓰겠다고 정리함 - 문서 예시는
<i>를 혼동 가능성이 있는 표현에 주의를 끄는 용도로 많이 씀
- 실용 규칙으로는 대체로
<kbd>는 키보드 키 지정용이지만, “Right click” 같은 동작에도 맞는지 경계가 궁금하다고 봄<mark>는 사용자가 책에 형광펜을 긋는 것 같은 양방향 저작 웹의 흔적처럼 보였음<rp>,<rt>,<ruby>는 동아시아 타이포그래피에서 발음, 번역, 음역 정보를 제공하는 데 쓰임<rp>는 소스에 포함된 괄호 문자를 숨기는 데 쓰임
<s>는 이전에는 맞았지만 현재는 정확하지 않거나 관련 없는 텍스트를 나타내는 취소선 요소임- HTML 4.01에서 deprecated 됐다가 HTML5에서 의미가 재정의됨
- 일부 스크린 리더가 취소선을 알리지 않아 혼란을 줄 수 있고, MDN 권장 CSS를 사이트에 추가함
<samp>는 프로그램 출력 표시용이며, 이전에는<code>로 처리하던 Raspberry Pi 글을<samp>로 업데이트함<small>은 작은 텍스트 렌더링에 쓰이지만, 대부분은 CSS를 계속 쓸 것 같다고 봄<span>문서를 보며<div style="display: inline">이나<span style="display: block">처럼 모순적인 스타일을 허용하는 이유를 처음 궁금해함<sub>와<sup>는 이전에 CSS 구현을 썼을 가능성이 있지만, footnote와 수식 예시에 적용함<time>은 의미론적 HTML에 유용해 보여 블로그 글 날짜에 적용함- Google 검색 결과에서도
<time>을 쓰지 않는 것 같다고 관찰함
- Google 검색 결과에서도
<u>는 MDN이 “대부분의 경우 실제로 쓰고 싶지 않을 것”이라고 강하게 안내하는 요소로, 철자 오류 표시가 주요 권장 용도처럼 보였음<var>는 수학 또는 프로그래밍 변수 문자열을 의미론적으로 나타내며, 피타고라스 정리 예시에<sup>와 함께 사용함<wbr>는 긴 단어, 특히 URL을 특정 지점에서 줄바꿈하게 만드는 문제를 해결함- 긴 URL에 break point를 넣으면 화면 너비별로 더 읽기 좋게 줄바꿈됨
- 하이픈 문자를 URL에 포함해도 현대 브라우저에서 명확한 break point가 생김
- 줄바꿈 없는 URL은 레이아웃을 깨지 않도록 별도의 스크롤 가능한
<p>로 감쌈
이미지, 멀티미디어, 임베드
<area>와<map>은 예전에 이미지맵류 웹사이트를 만들었음에도 익숙하지 않았던 요소임- 요즘 잘 쓰이지 않는다는 점을 보여주듯
<area>경계 디버깅 도구가 쓰기 어려웠음 - 탭 포커스 중에는 한 번에 하나의
<area>경계만 보이고, 스타일링은 동작하지 않았음 <area>는 모양을 가진<a>에 가깝다고 봄
- 요즘 잘 쓰이지 않는다는 점을 보여주듯
<audio>는 HTML5의 대표 멀티미디어 태그라 이미 써봤지만, 2020년대에 예상보다 자주 보이지 않는 점이 의외였음- Bandcamp 플레이어는 UI가 커스텀
<a>,<div>,<table>조합이지만 숨겨진<audio>를 사용함
- Bandcamp 플레이어는 UI가 커스텀
<img>에서는srcset속성을 새롭게 살펴봄- 화면 폭별로 서로 다른 이미지 3개를 제공하는 데모를 만들었음
- 브라우저 캐시와 scaled display가 동작에 영향을 주므로, 효과를 보려면 private window와 non-scaled 또는 non-retina display가 필요할 수 있음
<audio>와<video>는<img>보다 덜 널리 쓰이고, 온라인 비디오는 주로 YouTube에 중앙화되어 보인다고 봄- 오디오는 팟캐스트처럼 개별 파일을 제공하는 방식이 더 분산되어 있음
<video>에는 몇 가지 제약이 있었음- self-closing tag로 만들었을 때 렌더링되지 않았음
- 작성 시점의 Safari는 개발 서버가 “Range” request header를 지원하지 않아 비디오를 지원하지 않았을 가능성이 있음
- GitHub Pages에 올린 호스팅 버전에서 Safari 재생이 되는지 궁금해함
<track>문제는 Eleventy 빌드에서.vtt파일을 제대로 설정하지 않은 것이 원인이었음
<embed>와<object>는 많은 용도가<video>와<iframe>같은 특정 태그로 대체됐는데도 deprecated 되지 않은 점이 의외였음<iframe>은 “inline frame”이라는 90년대식 이름이 살아남았고,<frame>은 HTML5에서 deprecated 됨display: inline으로 렌더링된다는 점도 확인함
<picture>와<source>는 서로 다른 상황에서 이미지 버전을 바꾸는 데 의도된 요소임- 마우스/트랙패드에서는 컴퓨터 아이콘, 터치스크린에서는 휴대폰 아이콘, 어느 쪽도 아니면 fallback 이미지를 보이는 예시를 만듦
<portal>은 iPad 스타일 링크 미리보기와 SPA 같은 성능 이점과 관련된 실험적 요소로 보였음- 2023년 기준 어떤 브라우저에서도 기본 활성화되어 있지 않음
- 예전 Chrome 실험 플래그가 있었던 것으로 보이나, 2023년에는
chrome://flags에서 사용할 수 없었음 - HTML 5 Spec에는 없는 것 같고, MDN 문서에 왜 포함됐는지는 불확실함
SVG, MathML, 스크립팅
- MDN 문서가
<svg>와<math>를 함께 묶는 점이 흥미로웠음<svg>는 Figma와 Sketch 같은 도구 덕분에 쉽게 프로토타입하고 내보낼 수 있어 널리 쓰임<math>는 더 드문 요소로 보임
<svg>는 직접 원을 그리는 예시에 사용함<math>는 MathML 네임스페이스의 비 HTML 요소를 감싸는 wrapper에 가깝다고 보고, 간단한 식만 넣음<canvas>는 2020년 Recurse Center에서 선을 선명하게 그리는 문제를 깊게 살펴본 적이 있음- MDN 문서를 통해 브라우저별
<canvas>최대 크기가 있다는 점을 새로 알게 됨 - 현대 브라우저는 각 차원이 약 32,000픽셀 수준임
<canvas>,<script>,<noscript>로 가짜<marquee>를 다시 구현함
- MDN 문서를 통해 브라우저별
<script>는 낡게 느껴질 요소라고 예상하지 않았지만, 글을 쓰며 실제로 직접 쓰는 일이 적다는 점을 깨달음- 대부분의 JavaScript는 빌드 도구가 하나의
<script>태그로 묶어 넣음 - 그래서
<script>는 markup 태그라기보다 boilerplate처럼 느껴짐
- 대부분의 JavaScript는 빌드 도구가 하나의
<noscript>는 대화형 웹사이트에서 충분히 넣지 않았던 요소라고 봄- 특히 minified/compiled SPA에서는
<noscript>가 없으면 사용자가 빈 페이지를 볼 수 있음 - 이 글에서는 모든
<script>태그와 함께<noscript>를 넣음
- 특히 minified/compiled SPA에서는
편집 표시, 표, 폼, 상호작용
<del>과<ins>는 MDN 문서를 보며 처음 접한 요소이며, 워드프로세서에서 쓰일 법한 요소처럼 보였음- Google Docs 렌더링도 떠올렸지만, 다시
<canvas>로 렌더링된다는 점을 확인함
- Google Docs 렌더링도 떠올렸지만, 다시
<table>은 초창기 웹에서 레이아웃 목적으로 과용됐지만, 데이터가 늘어난 최근 웹에서는 오히려 드물게 쓰이는 점을 아이러니하게 봄- 이유로는 투박한 기본 디자인과, 데이터베이스 테이블에 저장된 데이터를 웹 UI에서는 다른 관점으로 보여주려는 목적을 듦
- 글 자체는 문서 기반이라 실제 표 데이터는 없지만, 2023년 Apple emoji set 기준일 가능성이 있는 이모지 데이터를 예시 표로 넣음
<col>과<colgroup>은 이전에 몰랐고, 커스텀 비<table>디자인보다 이들을 쓸 경우가 많을지는 모르겠다고 봄
<form>과 관련 요소는 보통 제출 시 새 페이지로 이동하는 경우에 썼지만, 페이지 내 사용자 상호작용에도 유효함- 접근성 측면에서 폼 요소가 가장 중요할 가능성이 크다고 보고, 앞으로 구현 시 문서를 참고하려 함
<details>와<summary>는 “JavaScript 없이도 할 수 있다”는 사례로 흔함- 이런 펼침/접기 UI는 예전에 JavaScript나 jQuery로 처음 만들었던 기능이었고, HTML 몇 개 태그로 쉬워진 점이 흥미로움
- 오늘날 HTML spec에 제안됐다면 CSS 유사 효과로 대체되며 철회됐을지도 모른다고 추측함
<dialog>는 HTML만으로 존재한다는 점을 몰랐던 요소임- 스타일 효과 이상으로 유용하려면 JavaScript가 필요함
alert()보다 커스텀한 상호작용을 만들면서도, CSS로 스타일링할 수 있는 단순한 방식임
웹 컴포넌트와 deprecated 요소
- 웹 컴포넌트는 오래전부터 더 배워야 할 목록에 있었고, MDN의 해당 섹션을 읽게 되어 반가웠음
- 웹 컴포넌트 렌더링에 JavaScript와
Class문법이 필요하다는 점은 의외였음- Shadow DOM을 더 읽은 뒤, HTML에는 스타일 캡슐화 내장 방식이 없기 때문에 납득함
- 개념적으로
<iframe>과 어느 정도 비슷해 보인다고 봄
<slot>과<template>을 이용해 글의 목차를 만드는 데 웹 컴포넌트를 사용함- 프론트엔드 프레임워크 컴포넌트처럼 자식 템플릿 요소의 속성으로 쓰일 property를 넘기는 방법을 빨리 찾지 못함
- 각 자식에 전체
<a>요소를 넘겨<li>안에서 올바른href를 설정함
- deprecated HTML 요소도 글 끝에 포함함
<big>,<acronym>,<font>,<nobr>,<strike>는 레이아웃 관련 기능이 CSS로 이동한 예시임<content>와<shadow>는 웹 컴포넌트 spec의 일부였지만 완전히 구현되지 않아 실제 구현하지 못함<dir>은 디렉터리 나열을 위한 웹서버식<ul>처럼 보이며, Eleventy 정적 사이트의 디렉터리 목록 예시에 사용함
<frame>과<frameset>은<body>대신 쓰이도록 설계돼 일반 본문에 직접 넣기 어려웠고,<iframe>안에서만 사용함<image>는 공식 specification 일부가 아니었다는 MDN 설명 때문에 동작하지 않을 것으로 예상했지만, 2023년 일부 브라우저에서는 동작하는 것처럼 보였음- 이는
<img>와 혼동할 가능성에 대한 fallback일 수 있다고 봄
- 이는
<menuitem>은 Firefox 8~84에서 부분 지원됐다고 하지만, 로컬에 설치한 오래된 버전에서도 예시를 동작시키지 못함<noembed>는<noscript>같은 fallback에 가까운데 deprecated 됐고,<embed>는 spec에 남아 있는 점이 의외였음<param>은<object>속성 대신 왜 별도 요소였는지 불분명하다고 봄- 글을 시작했을 때는 MDN의 “Embedding Content” 섹션에 있었지만, 끝낼 때는 deprecated 됨
<plaintext>는 deprecated 요소 중 실제로 동작하는 점이 눈에 띔- 그대로 쓰면 이후 페이지가 소스 코드로 렌더링되기 때문에
<iframe>으로 감쌈
- 그대로 쓰면 이후 페이지가 소스 코드로 렌더링되기 때문에
<xmp>와<tt>는 닫는 태그가 있어 source code나 teletype식 monospace 텍스트 표시에 본문에서 사용할 수 있었음<rb>와<rtc>는 동아시아 문자 발음 표시용이었지만, spec이 단순화된 것으로 보인다고 정리함- MDN 목록에 없던
<!-- comment -->도 다른 HTML 태그 목록을 확인하며 추가함 - 2013년 MDN의 오래된 목록에는
<blink>,<spacer>,<bgsound>,<isindex>같은 요소가 있었음<blink>는 접근성 이유로 현재 대부분 브라우저가 무시함<spacer>는 현대 브라우저에서 동작하지 않고 CSS로 처리할 기능임<bgsound>는 더 멀티미디어적인 웹 문서 비전을 암시함<isindex>는 JavaScript가 없는 세계에서 온 요소처럼 보임
<applet>도 언급하지만 시도하지 않음- footnote를 위한 네이티브 HTML 구현은 없다는 점을 뒤늦게 발견함