THE Red: 견고한 UI 설계 - HTML === ###### tags: `석기` --- ## HTML을 어떻게 공부해야 하는가. ### HTML 명세를 읽는 법 / 확인하는 법 **QUIZ1** ```htmlembedded= <a>유효한가?</a> ``` - 유효한 문법이다. - a 태그의 href는 필수가 아니다. **QUIZ2** ```htmlembedded= <a> <div> 유효한가? </div> </a> ``` - 유효하다. - a 태그가 인라인만 가능했지만, HTML5에서부터는 상관이 없어졌다. **QUIZ3** ```htmlembedded= <p> <a> <div> 유효한가? </div> </a> </p> ``` - 마지막에 공개. - 유효하지 않다. - p 요소 안에 a는 가능. - a 요소는 투명한 요소. -> 부모의 content model를 따름. - phrasing 안에 div (flow, palpable) 가 올 수 없다. (?) **내 생각** - **이게.. 중요한가?** ### HTML 분류 #### Flow content - body 에 포함될 수 있는 모든 요소. - base, style, title 요소를 제외한 모든 요소. #### Metadata content ![](https://i.imgur.com/4knXmze.png) - 문서의 헤더에 포함된다. - 실제로 화면에 출력하진 않다. -> display: none으로 처리됨. #### Heading content - h1, h2... #### Sectioning content - 문서의 개요를 형성. - article, aside, nav, section #### Phrasing content - 단락을 형성하는 요소들/ - 예전에 inline contents #### Embedded content - 외부 자원을 참조하는 컨텐츠. - img, picture, audio... ### Interactive content - a, audio, button, 등등 --- ## 검색 엔진 밥상 차려주기 ==사용자에게 도달하지 않으면 아무 쓸모가 없다.== ### SEO에 영향을 주는 요인들 #### 페이지 타이틀 - 브라우저 제목에 달리는 요소. - 검색엔진은 title 태그 안에 있는 요소를 가장 중요하게 여긴다. - 브라우저 탭에 작성되기 때문에 사용자 경험에 큰 역할을 하기도 한다. - 화면 낭독기 사용자는 웹 페이지 접속시 페이지 타이틀을 음성으로 전달 받음. - 따라서 모두 중복되는 내용보다는 해당 페이지의 기능을 핵심적으로 묘사하는게 좋다. - 중요하게, 간결하게. - Javascript으로 동적으로 생성한 title도 크롤링 한다. #### 메타 데이타 ![](https://i.imgur.com/IpUerNI.png) - lang 속성을 통해 화면 낭독에 더 최적화 / 검색 엔진에 조금 도움을 준다. - 접근성 측면에서는 신경써야한다. - meta` - description: 검색엔진 화면에 노출되는 항목. - keywords: 구글 검색엔진은 신뢰하지 않음. - viewport: 모바일 디바이스에서 화면이 잘 보이는지. --- ## HTML 개요 알고리즘 이해 ### Outline / Heading - 개요 / 윤곽 - title vs heading - title - 문서의 제목. 한번만 사용. - h* - 섹션의 제목. 여러번 사용. - 문서 개요를 형성하는 기본 / 필수 아이템. - 웹 브라우저 및 화면 낭독기가 주목함. - Sectioning Root - HTML5에 새롭게 추가됨. - 독립적인 개요를 생성하는 개요 컨테이너 - 섹셔닝 루트 외부에서 접근 불가. ![](https://i.imgur.com/dQgYRRJ.png) - 아직은 알고리즘이 구현되지 않음 ... 사용하지말아아. - Sectioning Content - ![](https://i.imgur.com/1qVbAW2.png) - HTML5 에서 새롭게 추가된 명세. - 명시적 개요를 생성하는 개요 컨테이너 - 적절한 수준의 헤딩을 자식 요소로 사용해야함. - 명시적 섹션 - heading과 함께 섹녀닝 콘텐츠(article, aside, nav, section)를 사용하여 섹션의 범위를 명시적으로 알수있게. - 암시적 섹션 - heading만 사용. 쓰지말아라. - 어색한 섹션 - h1이 없는데 h2가 있는 경우. ### 요약 1. Heading을 사용하고, 해당 heading과 섹션(article, aside, nav, section)을 1:1로 맵핑해라. 2. HTML5 개요 알고리즘에 의존해서 작성하지 말아라. --- ## HTML 의미론 ### div, span - 마지막으로 선택하는, 아무의미 없는 태그. - 많이 쓰지 않았으면 좋겠다. - span을 대체할 수 있는 것들 - a, em, strong, data, time, mark, ... 등 ### Sectioning ![](https://i.imgur.com/EPh76fK.png) ### Header, footer ![](https://i.imgur.com/oywLpvA.png) ### section, article ![](https://i.imgur.com/2HvyKgX.png) ### nav ![](https://i.imgur.com/e4wDb4b.png) ### aside ![](https://i.imgur.com/ThLXoJ8.png) ### main ![](https://i.imgur.com/kWXhIJM.png) ![](https://i.imgur.com/udOl0oa.png) ### dialog ![](https://i.imgur.com/1g8gS8U.png) - 모달 내부 ### figure ![](https://i.imgur.com/egoyCjh.png) **예시** ![](https://i.imgur.com/9jgPZ9j.jpg) ### mark ![](https://i.imgur.com/CMSm3em.png) ### address ![](https://i.imgur.com/d7r2sfm.png) - footer에 있는 제작자 정보들. ### ins, del ![](https://i.imgur.com/Phx4PCd.png) --- ## 상호작용 콘텐츠의 올바른 용법 ### Interactive Contents #### a vs button **a tag의 특징** - 실행 결과를 가르킬 수 있는 고유한 URL이 있다면 a로. - 탭간 이동. - 대화 상자를 참조하는 경우 (모달) - 마우스를 올려보면 주석표시로 어느 링크로 연결되는지 나온다. **a tag - target** - 외부 새로운 페이지로 링크. - 사용자가 공격에 노출 될 수 있음. > 해결방법: HTML적으로 해결 가능. ```htmlembedded= <a href = '...' target = '_blank' rel = 'noopener_noreferrer' /> ``` `noopener_noreferrer` 속성을 통해 공격 방어. #### details, summary ![image](https://user-images.githubusercontent.com/52649378/160316440-b733bebf-e18f-4c21-9f84-47d71796e731.png) ![Uploading file..._r7z3spidz]() - 간편하게 열고 닫는 토글 기능이 지원된다. #### input - 타입을 아는것이 해당 태그를 다 아는 것. --- ## 이미지 마크업 최적화 ### 이미지 포맷의 다양화 - jpg, png - 용량이 크다. - fallback으로 쓰인다. - webp - jps, png 대비 30~70% 수준의 용량이다. - avif - 저용량 + 고품질 #### 따라서 다음과 같이 조건절처럼 이미지를 렌더링하자. ```htmlembedded= <picture> <source srcset='pic.avif' type='image/avif'> <source srcset='pic.webp' type='image/webp'> <img src='pic.jpg' alt> </picture> ``` - 세가지 이미지 모두 다운받지 않는다. - 최적화가 알아서 됨. - media 속성을 통해 반응형을 구현할 수 있음. #### img tag ```htmlembedded= <img loading='lazy' decoding='async' > ``` - 빠른 로딩 속도 지원