main요소의 id값은 => 사용자 건너뛰기 링크를 사용하기 위해 필요하다.
main과 h1태그는 똑같은 기능을 제공한다. 하지만 스크린리더 사용자가 다 같지 않기 때문에 두가지 태그 모두 필요하다.
날짜가 아니라 제목부터 쓰자(스크린리더가 위에서 아래로 읽어 내려가기 때문)
시간을 나타낼 때 => time 태그를 사용하자.
//이렇게 하지 말 것
<main id="main">
<div><time datetime="2023-07-02">July 2, 2023</time>
<h1>제에목</h1>
</div>
</main>
//이렇게 할 것
<main id="main">
<h1>제에목</h1>
<div><time datetime="2023-07-02">July 2, 2023</time>
</div>
</main>
<main>
<p>첫 번째 단락</p>
<p>두 번째 단락</p>
<div>첫 번째 div</div>
<span>첫 번째 span</span>
<span>두 번째 span</span>
</main>
main * + * {
color: red;
}
*는 모든요소를 선택하는 만능 선택자
따라서 위와같은 선택자는 => main요소 내부에 있는 모든 요소 중에서 인접한 형제요소 쌍에서 두번째 요소를 선택.
위의 HTML 예제에서 main 내부의 두 번째 p, div, 첫 번째 span, 두 번째 span 요소가 모두 빨간색으로 표시됨.
상단 마진을 적용할 때 유용하다.
<div class="upvote" data-action="upvote"></div>
다음과 같은 버튼의 문제점
텍스트가 아닌 콘텐츠 조항에 어긋남 => 버튼을 대체하는 대체 텍스트가 없다.
운용성 원칙에서 어긋남 => button이 아닌 div를 사용해 focus를 받을 수 없다.
호환성 => 마크업에서 실제로 버튼이라는 정보를 보조기술에 알리는 어떤 마크업도 없다.
<button data-action="upvote" aria-label="upvote">
<svg>
<use xlink:href="#upvote"></use>
</svg>
</button>
위와같이 svg 아이콘을 이용한 버튼으로 개선 가능
use 태그
- use 태그는 SVG (Scalable Vector Graphics) 문서에서 특정 SVG 요소를 재사용하는 데 사용됩된다. 다른 SVG 요소를 참조하여 해당 요소를 복사하여 사용합니다.
xlink:href 또는 href: 재사용할 SVG 요소를 참조하기 위한 URL입니다. SVG 2.0부터는 href 속성을 사용하지만, 이전 버전과의 호환성을 위해 xlink:href도 자주 사용됩니다.
x, y: 참조된 요소를 배치할 위치를 지정합니다.
width, height: 참조된 요소의 크기를 조정합니다.
<svg width="200" height="200">
<!-- 원본 요소 정의 -->
<circle id="myCircle" cx="50" cy="50" r="40" fill="blue" />
<!-- <use> 태그로 원본 요소 재사용 -->
<use href="#myCircle" x="100" y="0" />
</svg>
ref) https://developer.mozilla.org/ko/docs/Web/API/Web_components/Using_shadow_DOM
https://velog.io/@mochang2/Shadow-DOM
섀도 DOM(Shadow DOM)은 웹 컴포넌트(Web Components) 기술의 핵심 중 하나로, DOM 트리의 특정 부분을 캡슐화하여 외부 스크립트와 스타일링의 영향을 받지 않도록 하는 기능이다.
이는 웹 애플리케이션 개발에서 재사용 가능한 UI 구성 요소를 만들고, 이 구성 요소들이 서로 간섭하지 않도록 하는 데 매우 유용함.
기존 dom이 존재하는데, shadow dom은 dom안에 dom이라고 생각하면 된다. 필요할 때 dom 안에 추가해 렌더링 하는 기법
<a href="#">test</a>
<span class="shadow-host">
<a href="/to-somewhere">anchor text</a>
</span>
const shadowEl = document.querySelector('.shadow-host');
const shadow = shadowEl.attachShadow({ mode: 'open' });
const link = document.createElement('a');
link.href = shadowEl.querySelector('a').href;
link.innerHTML = `
<span></span>
${shadowEl.querySelector('a').textContent}
`;
shadow.appendChild(link);
nav > ul > li > a 이런식