"링크 없는 페이지는 문서야. 링크가 있어야 그게 웹 이 돼."
<a>: href 만이 아니야
모든 클릭 가능한 링크는 <a>. 가장 자주 만질 네 속성:
href— 목적지. 상대 (/quests), 절대 (https://...), 페이지 내 (#section-id), 또는 특수 (mailto:,tel:,javascript:— 마지막은 피해).target="_blank"— 새 탭에서 열기. 외부 링크에는 항상rel="noopener noreferrer"와 페어 — 아니면 새 탭이window.opener를 읽고 장난을 칠 수 있어.rel— 관계 metadata.noopener,noreferrer,nofollow,external,prefetch,canonical,license. 브라우저와 검색 엔진이 이걸 읽어.download— 네비게이션 대신 리소스를 파일로 저장. 선택적으로 이름 바꿈:download="report.pdf".
링크 텍스트는 의미를 가져야 해
"여기 클릭" 과 "더 보기" 는 접근성 위반이야. Screen reader 가 페이지의 모든 링크 목록을 뽑을 수 있어; 문맥 없이 너의 "여기 클릭" 링크들은 이렇게 들려: "링크: 여기 클릭. 링크: 여기 클릭. 링크: 여기 클릭." 쓸모없어.
목적지를 묘사하는 링크 텍스트를 써: "MDN HTML reference 읽기" 지 "여기 클릭" 이 아니야. 링크 텍스트가 곧 접근성 label 이야.
페이지 내 앵커
<a href="#section-id"> 는 그 ID 를 가진 element 로 스크롤해. ID 를 가진 semantic heading (<h2 id="the-mantra">) 과 결합하면 목차 링크와 공유 가능한 deep link 가 돼. <html> 의 CSS scroll-behavior: smooth 가 스크롤 자체를 부드럽게.
<img>: 명세가 alt 를 요구
alt 속성은 선택이 아니야. W3C 명세는 모호하지 않아: 모든 <img> 에 alt 필요. 규칙:
- 의미 있는 이미지 — alt 가 이미지가 전달하는 내용을 묘사. "고양이 이미지" 가 아니라 그냥 "잠자는 칼리코 아기 고양이" (Screen reader 가 "이미지:" 를 앞에 붙여).
- 장식용 이미지 — alt="" (빈 문자열). Screen reader 한테 건너뛰라고. Alt 를 완전 빼는 것과 달라.
- 기능적 이미지 (홈 링크 역할도 하는 로고) — alt 가 목적지/기능을 묘사 ("피파 홈"), 시각이 아니라.
- 텍스트가 들어 있는 이미지 — alt 에 그 텍스트. PNG 에 글자를 구운 탓에 screen reader 가 단어를 놓치게 만들지 마.
반응형 이미지: srcset, sizes,
모든 화면에 풀 사이즈 파일 하나는 모바일에서 대역폭을 낭비하고 레티나 데스크톱에 흐릿한 이미지를 출시해. 모던 반응형 이미지는 srcset + sizes 로 브라우저가 맞는 파일을 고르게 해:
srcset 은 "이 이미지의 여러 해상도 버전들이 여기 있어"; sizes 는 "각 viewport 너비에서 이미지가 얼마나 클지". 브라우저가 그러고 나서 디바이스 픽셀 밀도에서 여전히 선명한 가장 작은 파일을 다운로드.
다른 크기에 다른 이미지 가 필요할 때 (art direction — 데스크톱에 wide hero, 모바일에 tall hero), media query 를 가진 <source> 자식들이 있는 <picture> 를 써.
모던 포맷: AVIF, WebP, JPEG fallback
JPEG 와 PNG 가 아직 사방에 있지만 AVIF 와 WebP 가 같은 시각 품질에서 압축이 더 잘 돼. <picture> 가 JPEG fallback 과 함께 제공하게 해 줘:
<img loading="lazy" decoding="async">. 브라우저가 이미지가 viewport 가까이 올 때까지 로딩을 미뤄. 공짜 퍼포먼스, 속성 하나. 페이지 상단의 LCP (largest contentful paint) 이미지는 lazy-load 하지 마 — 체감 로딩 시간이 나빠져.캡션 미디어용 <figure> + <figcaption>
이미지 (또는 차트, 코드 블록, 인용) 에 캡션이 따라올 때, <figure> 로 감싸고 캡션을 <figcaption> 안에. Screen reader 가 "figure" 라고 announce 하고 캡션을 읽어 — 연관이 시각적 근접만이 아니라 명시적이야.
피파의 노트
<Image> component 로 렌더하고, 이게 srcset, sizes, 모던 포맷을 자동으로 생성해. 밑단 HTML 은 여전히 모든 속성 가진 <img> — Next 는 너가 손으로 할 일을 더 빠르게 해 줄 뿐이야. HTML 을 알아야 Next 의 마법이 빗나갈 때 디버깅할 수 있어.