ํ ์คํธ๋ง ์๋ ์น์ฌ์ดํธ๋ ๋จ์กฐ๋กญ๋ค. ๋ฌผ๋ก ๊ทธ๊ฒ์กฐ์ฐจ๋ ์ ๋๋ก ๋ง๋ค๊ธฐ ์ด๋ ต๊ธฐ์ motherfucking website์ ๊ฐ์ ๊ณณ๋ ์๊ธฐ์ง๋ง, ์ด๋ฏธ์ง์ ๋น๋์ค ๋ฑ์ด ํฌํจ๋ ์ฌ์ดํธ๊ฐ ๋ ๋ฉ์์ด ๋ณด์ธ๋ค๋ ๊ฑด ๋ถ์ธํ ์ ์๋ค.
์ด๋ฒ์๋ HTML์์ ๋ฉํฐ๋ฏธ๋์ด์ ์๋ฒ ๋ฉ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์.
1. ์ด๋ฏธ์ง
HTML์์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ๊ธฐ ์ํด์๋ img
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๋ด๋ถ ๋ด์ฉ์ด๋ ๋ซ๋ ํ๊ทธ๊ฐ ์์ง๋ง src ์์ฑ ํ๋๋ ์ฌ์ฉ๋์ด์ผ ํ๋ค.
src ์์ฑ์ ์ฝ์ ํ ์ด๋ฏธ์ง์ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋๋ฐ, ์ด๋ ์ ๋๊ฒฝ๋ก, ์๋๊ฒฝ๋ก, ๋๋ URL๋ก ํํํ ์ ์๋ค. ๊ฒ์ ์์ง์ ์ด๋ฏธ์ง ํ์ผ ์ด๋ฆ๋ ์ฝ๊ณ SEO์ ํฌํจ์ํค๋ฏ๋ก ํ์ผ ์ด๋ฆ์๋ ์ฃผ์ํ์.
<img src="assets/profile.jpg">
1.1. alt ์์ฑ
img ํ๊ทธ์ alt ์์ฑ์ ๋ฌธ์์ด์ ํ ๋นํด์ ์ด๋ฏธ์ง๊ฐ ๋ก๋๋์ง ์์์ ๋ ๋์ฒด ํ ์คํธ๋ฅผ ๋ฃ์ ์ ์๋ค. ์ด๋ path๋ ํ์ผ๋ช ์ ์๋ชป ์ ๊ฑฐ๋ ๋ก๋๊ฐ ์คํจํ์ ๋ ํ์๋๋ค.
๋ํ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ alt ์์ฑ์ ์ฝ์ด์ฃผ๋ฏ๋ก, ์ด๋ฏธ์ง๊ฐ ์๋ ํ ์คํธ๋ก ํํํ ์ ์๋ ๊ฒฝ์ฐ alt ์์ฑ์ ์ฌ์ฉํ๋ ๋์์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์ ์์ง์ alt ์์ฑ์ ์ฝ์ด์ SEO์ ํฌํจ์ํค๋ฏ๋ก ๊ฒ์ ์ต์ ํ์๋ ๋์์ด ๋๋ค.
Lynx์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ ํ ์คํธ๋ง ์ง์ํ๋ฏ๋ก ์ด๋ฐ ๋ธ๋ผ์ฐ์ ์ ์ฌ์ฉ์์๊ฒ๋ alt ์์ฑ์ด ํ์ํ๋ค.
๋ฐ๋ผ์ alt ์์ฑ์๋ ์ด๋ฏธ์ง๊ฐ ๋ํ๋์ง ์์ ๋ ์ฌ์ฉ์์๊ฒ ๋์ ์ ๊ณตํ ์ ์๋ ์ค๋ช ์ ๋ฃ์ด์ฃผ์.
1.2. ๊ธฐํ ์์ฑ
width, height ์์ฑ์ผ๋ก ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์๋ค. ํ์ง๋ง HTML ์์ฑ์ ํตํด ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๊ฒ๋ณด๋ค๋ CSS๋ฅผ ํตํด ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค. ํน์ ์ด๋ฏธ์ง ํธ์ง๊ธฐ๋ฅผ ์ฐ๊ฑฐ๋.
title ์์ฑ์ผ๋ก ์ด๋ฏธ์ง ์ ๋ชฉ์ ์ค์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ฏธ์ง์ ๋ง์ฐ์ค ํธ๋ฒ ์ ์ด๋ฏธ์ง ์ ๋ชฉ์ด ๋ํ๋๋ค.
1.3. ์บก์ ๋ฌ๊ธฐ
์ด๋ฏธ์ง์ ์บก์ ์ ๋ฌ ๋, div ํ๊ทธ๋ก ๊ฐ์ผ ํ divํ๊ทธ ๋ด๋ถ์ img ํ๊ทธ์ p ํ๊ทธ๋ฅผ ๋ฃ์ด์ค ์๋ ์๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ํน์ ์ด๋ฏธ์ง์ ์บก์ ์ ์ฐ๊ฒฐํด ์ฃผ๋ ์๋ฏธ๊ฐ ์ ๋ฌ๋์ง ์๋๋ค. ๋ฐ๋ผ์ HTML5์ figure์ figcaption ํ๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด ํ๊ทธ๋ ์ด๋ฏธ์ง์ ์บก์ ์ ๋ค๋ ์ญํ ์ ์ํํ๋ค.
<figure>
<img src="assets/profile.jpg">
<figcaption>๋ด ํ๋กํ ์ฌ์ง</figcaption>
</figure>
์ด๋ figure ํ๊ทธ๋ด์ ์์๊ฐ ๊ผญ ์ด๋ฏธ์ง์ผ ํ์๋ ์๋ค. ๋์์์ด๋ ํ, ์ฝ๋ ๋ฑ์ด ์ฌ ์ ์๋ค.
๋ฌผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ ๋ CSS์ background-image ์์ฑ ๋ฑ์ ์ฌ์ฉํ ์๋ ์๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์๋ ์์ด๋ ์ด๋ฏธ์ง์ ์ด๋ค ์๋ฏธ๋ฅผ ํ์ด์ง ์์ฒด์์ ๋ถ์ฌํ ์๋ ์๋ค. ์ด๋ฐ ์๋งจํฑ์ ์ํด์ img ํ๊ทธ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ฃ๋ ๊ฒ์ด๋ค.
2. ๋น๋์ค์ ์ค๋์ค
๋น๋์ค์ ์ค๋์ค๋ HTML ํ๊ทธ๋ฅผ ํตํด์ ๋ฃ์ ์ ์๋ค.
2.1. ๋น๋์ค ํ๊ทธ
<video>
ํ๊ทธ๋ฅผ ์ฐ๋ฉด ๋์์์ ํ์ด์ง์ ์ฝ์
ํ ์ ์๋ค. ์ด ํ๊ทธ๋ src ์์ฑ์ ๊ฐ์ง๋๋ฐ ์ด๋ img ํ๊ทธ์์์ ๊ฐ์ด ๋ฃ์ ๋์์์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
controls ์์ฑ์ ์ง์ ํ์ฌ ์ฌ์ฉ์์๊ฒ ๋น๋์ค ๋๊ฐ๊ธฐ, ๋ณผ๋ฅจ ์กฐ์ , ํ์ ๋ฑ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ์ ์๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋์ค ํ๋ ์ด์ด์ ๋ชจ๋ ์ปจํธ๋กค ์์๊ฐ ํ์๋๋ค.
<video src="assets/video.mp4" controls></video>
controls ์์ฑ์ ์ฌ์ฉํ์ง ์๊ณ JS์ HTMLMediaElement API๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํธ๋กค ์์๋ฅผ ์ง์ ๋ง๋ค ์๋ ์๋ค.
video ํ๊ทธ ์์ p ํ๊ทธ ๋ฑ์ ๋ฃ์ด์ ๋น๋์ค๊ฐ ์ง์๋์ง ์๋ ๋ธ๋ผ์ฐ์ ์ ๋๋นํ ์๋ ์๋ค. ๋น๋์ค๊ฐ ํ์๋์ง ์์ ๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์ผ์ข ์ fallback content๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค. ๋น๋์ค๋ก ๊ฐ๋ ๋งํฌ๋ฅผ ๋ฃ๋๋ค๊ฑฐ๋ ํ๋ ๊ฒ์ด๋ค.
2.2. ์ฌ๋ฌ ์์ค ์ ๊ณตํ๊ธฐ
๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ์ ์ง์ํ๋ ๋น๋์ค ํฌ๋งท์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ source์ ๋น๋์ค๊ฐ ์ฌ์๋์ง ์์ ์ ์๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์ฌ๋ฌ ์์ค๋ฅผ ์ ๊ณตํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ๋ ํฌ๋งท์ ์ฐพ์ ์ฌ์ํ ์ ์๋๋ก ํ ์ ์๋ค. source ํ๊ทธ๋ฅผ ์ธ ์ ์๋ค.
<video controls>
<source src="assets/video.mp4" type="video/mp4">
<source src="assets/video.webm" type="video/webm">
<source src="assets/video.ogv" type="video/ogg">
</video>
์ง๊ธ๊น์ง๋ video ํ๊ทธ์ src ์์ฑ์ ๋น๋์ค ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ฃ์๋๋ฐ, ์ด์ ๋ source ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์ค๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ source ํ๊ทธ๋ฅผ ํ์ผ๋ฉด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ๋ ์ฝ๋ฑ์ ๊ฐ์ง ์ฒซ ๋น๋์ค๋ฅผ ์ฐพ์ ์ฌ์ํ๋ค.
์ด๋ ๊ฒ ์ฌ๋ฌ ์์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐ์ ์ธ ์ ์๋ source ํ๊ทธ๋ picture, audio, video ํ๊ทธ์ ๋ชจ๋ ์ธ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ source ํ๊ทธ์๋ type ์์ฑ์ ์ด์ฉํด์ ํ์ผ์ ๋ฏธ๋์ด ํ์ (MIME ํ์ )์ ๋ช ์ํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ์ง ์๋ ๋น๋์ค ์ฝ๋ฑ ํ์ ์ ๋ฐ๋ก ๋์ด๊ฐ๋๋ก ํ ์ ์๋ค.
๋ง์ฝ type ์์ฑ์ ์ง์ ํ์ง ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํ์ผ์ ๋ก๋ํ๊ณ ์ฝ๋ฑ์ ํ์ธํ ํ ์ฌ์ํ ์ ์๋์ง๋ฅผ ํ๋จํ๋ค. ์ด๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ type ์์ฑ์ ๋ช ์ํ๋ ๊ฒ ์ข๋ค.
2.3. video ๊ธฐํ ์์ฑ
๊ทธ ์ธ์๋ width, height ํ๊ทธ๋ ์๋ค. ์ด ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋น๋์ค์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์์ง๋ง aspect ratio๋ ์ ์ง๋๋ค. ๋ง์ฝ ratio๊ฐ ๋ค๋ฅธ ๋์ด/๋๋น๋ฅผ ์ง์ ํ๋ค๋ฉด ๋น๋์ค๋ ๊ฐ๋ก๋ก ๋์ด๋์ ํ๋ฉด์ ์ฑ์ธ ๊ฒ์ด๊ณ ์ ์ฑ์์ง ๋ถ๋ถ์ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์์ผ๋ก ์ฑ์์ง๋ค.
autoplay, loop, muted ์์ฑ๋ ์๋ค. autoplay๋ ๋น๋์ค๋ฅผ ์๋์ผ๋ก ์ฌ์ํ๊ณ , loop๋ ๋น๋์ค๋ฅผ ๋ฐ๋ณต ์ฌ์ํ๊ณ , muted๋ ์์๊ฑฐํ๋ค.
poster ์์ฑ์ ๋น๋์ค๊ฐ ๋ก๋๋๊ธฐ ์ ์ ๋ณด์ฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ง์ ํ๋ค. preload๋ ๋ฒํผ๋ง ๊ด๋ จ ์์ฑ์ด๋ค.
2.4. ์ค๋์ค ํ๊ทธ
์ค๋์ค ํ๋ ์ญ์ ๋น๋์ค ํ๊ทธ์ ๋น์ทํ๋ค. <audio>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋์ค ํ์ผ์ ํ์ด์ง์ ์ฝ์
ํ ์ ์๋ค.
<audio controls>
<source src="assets/audio.mp3" type="audio/mpeg">
<source src="assets/audio.ogg" type="audio/ogg">
<!-- ์ฌ๊ธฐ์ fallback content๊ฐ ๋ค์ด๊ฐ ์๋ ์๋ค. -->
</audio>
์ค๋์ค ํ๊ทธ๋ ๋ณด์ฌ์ค ์๊ฐ ์ปจํ ์ธ ๊ฐ ์์ผ๋ฏ๋ก width, height ์์ฑ์ ์ฌ์ฉํ ์ ์๋ค. ๊ฐ์ ์ด์ ๋ก poster ์์ฑ๋ ์ง์ํ์ง ์๋๋ค.
2.5. ๋น๋์ค์ ์๋ง ๋ฃ๊ธฐ
๊ท๊ฐ ์ ๋ค๋ฆฌ์ง ์๋ ์ฌ๋์ด๋ ์๋๋ฌ์ด ํ๊ฒฝ์ ์๋ ์ฌ๋, ์์์ ์ธ์ด๋ฅผ ๋ชจ๋ฅด๋ ์ฌ๋ ๊ฐ์ ๊ฒฝ์ฐ ์๋ง์ด ํ์ํ ์ ์๋ค.
์ด๋ฐ ์ฌ๋์๊ฒ ์๋ง์ ์ ๊ณตํ ์ ์๋ค. webVTTํ์ผ๊ณผ track ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
webVTT ํ์ผ์ ๊ฐ๋จํ ๋งํด์ ์๋ง ํ์ผ์ด๋ค. ์ฌ๋ฌ ์ค์ ์๋ง ๋ฌธ์์ด๊ณผ ํด๋น ์๋ง๋ง๋ค ์๋ง์ ํ์ํ ์์ ์๊ฐ๊ณผ ๋ ์๊ฐ์ ์ง์ ํ ์ ์๋ค. ์๋ง ์์น ๋ฑ์ ์ง์ ํ ์๋ ์๋ค.
<video controls>
<source src="assets/video.mp4" type="video/mp4">
<source src="assets/video.webm" type="video/webm">
<source src="assets/video.ogv" type="video/ogg">
<track src="assets/subtitles.vtt" kind="subtitles" srclang="en" label="English">
</video>
track ํ๊ทธ์ kind ์์ฑ์ ์ด์ฉํ์ฌ ์๋ง์ ์ข ๋ฅ๋ฅผ ์ง์ ํ ์ ์๋ค. subtitles, captions, descriptions, chapters, metadata ๋ฑ์ด ์๋ค.
์๋ง์ subtitles, ์๋ง์ captions, ์ค๋ช ์ descriptions, ๋จ์ ๊ตฌ๋ถ์ chapters, ๋ฉํ๋ฐ์ดํฐ๋ metadata ๋ฑ์ด๋ค.
์ด๋ .vtt ํ์ผ์ track ํ๊ทธ๋ฅผ ํตํด ์ง์ ํ๋๋ฐ ๋ชจ๋ source ํ๊ทธ๋ณด๋ค ๋ค์ ์์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ track ํ๊ทธ์ srclang ์์ฑ์ ์ด์ฉํ์ฌ ์๋ง์ ์ธ์ด๋ฅผ ์ง์ ํ ์ ์๊ณ label ์์ฑ์ ์ด์ฉํ์ฌ ์ฌ๋๋ค์ด ์๋ง์ ์ธ์ด๊ฐ ์ด๋ค ๊ฒ์ผ์ง ์ ์ ์๋๋ก ํ ์ ์๋ค.
3. ๊ธฐํ ์๋ฒ ๋ฉ ๊ธฐ์
audio, video ํ๊ทธ ์ธ์๋ iframe, embed, object ํ๊ทธ๋ฅผ ์ด์ฉํด์๋ ํ์ด์ง์ ๋ค๋ฅธ ์ฝํ ์ธ ๋ฅผ ๋ฃ์ ์ ์๋ค.
3.1. ๊ฐ๋ตํ ์ญ์ฌ
์์ ์๋ ์น์ฌ์ดํธ์ ์์ ๋ถ๋ถ์ frame์ด๋ผ ํ๊ณ , ๋ฉ์ธ์ด ๋๋ ๋ฌธ์์ธ frameset์ด๋ผ๋ ๋ฌธ์์ frame์ ๋ฃ์ด์ ๋ง๋ค์๋ค. ์ฆ ํ์ด์ง๋ฅผ frame๋ค์ ์งํฉ์ผ๋ก ๋ณด์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ 90๋ ๋ ํ๋ฐ Flash์ ๋ฑ์ฅ์ผ๋ก ์์, ์ ๋๋ฉ์ด์ ๊ฐ์ ์ฌ๋ฌ ์ฝํ ์ธ ๋ฅผ ์น์ ์ฝ์ ํ ์ ์๊ฒ ๋์๋ค. ์ก์ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด์ ๋์์์ ์ ์ดํ ์ ์๊ณ , ์ ๋๋ฉ์ด์ ์ ํจ์ฌ ๋ ์ ์ ์ฉ๋์ผ๋ก ๋ง๋ค ์ ์๊ฒ ํ ํ๋์๋ 2000๋ ๋๋ฅผ ํ๋ฏธํ๋ค. object, embed ์์ ๋ฑ์ ์ด์ฉํด์ ๊ฐ์ ์์ ์ ํ ์ ์์์ง๋ง ๋ณ๋ก ์ฐ์ด์ง ์์๋ค.
๊ทธ๋ฌ๋ค ํ๋์๊ฐ ์ฌ๋ฌ ๋ฌธ์ ๋ค๋ก ์ธํด ์ธ๊ธฐ๊ฐ ์ฌ๊ทธ๋ผ๋ค๊ณ HTML5๊ฐ ๋ฑ์ฅํ๋ฉด์ iframe, embed, object ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์น ํ์ด์ง์ ๋ค๋ฅธ ์ฝํ ์ธ ๋ฅผ ๋ฃ์ ์ ์๊ฒ ๋์๋ค.
3.2. iframe
iframe ํ๊ทธ๋ ๋ค๋ฅธ HTML ํ์ด์ง๋ฅผ ํ์ฌ ํ์ด์ง ์์ ์ฝ์ ํ ์ ์๊ฒ ํด์ค๋ค. iframe ํ๊ทธ์ src ์์ฑ์ ์ด์ฉํด์ ๋ค๋ฅธ ์น ํ์ด์ง๋ฅผ ์ง์ ํ ์ ์๋ค.
์ ํ๋ธ์์ ๊ณต์ -ํผ๊ฐ๊ธฐ๋ฅผ ์ ํํ๋ฉด ๊ทธ ๋์์์ ํด๋นํ๋ iframe ํ๊ทธ๋ฅผ ๋ณต์ฌํ ์ ์๋ค.
<iframe width="560" height="315" src="https://www.youtube.com/embed/b7Pt4hHGi2I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
์ด๋ ๊ฒ ์ฝ์ ๋ ๋ค๋ฅธ ํ์ด์ง๋ ๊ฐ์ ์์ ์ History๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ๋๋ ์ ๋ ํ์ฌ ํ์ด์ง๊ฐ ์๋๋ผ ์ฝ์ ๋ ํ์ด์ง์ ์ด์ ํ์ด์ง๋ก ์ด๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ๋ค๋ฅธ ๋ฌธ์๋ก ๊ด๋ฆฌ๋๋ฏ๋ก ํ์ด์ง์ iframe์ ์ถ๊ฐํ ๋๋ง๋ค ์์์ ๋ ์ฌ์ฉํ๊ฒ ๋๋ค.
iframe์๋ width, height, src, allowfullscreen์์ฑ์ด ์ฃผ๋ก ์ฐ์ธ๋ค. width, height, src์์ฑ์ ๋น์ฐํ ๊ฐ๊ฐ ํฌ๊ธฐ์ ์ฝ์ ํ ํ์ด์ง๋ฅผ ์ง์ ํ๋ค.
์ด๋ src ์์ฑ์ ๊ฒฝ์ฐ, ์๋ ํฅ์์ ์ํด์๋ ๋ฉ์ธ ํ์ด์ง ๋ก๋ฉ ์ดํ JS๋ฅผ ํตํด ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค. ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ ๋ ์ค์ฌ ์ค๋ค.
allowfullscreen์์ฑ์ Fullscreen API๋ฅผ ์ฌ์ฉํ์ฌ iframe์ ์ฝ์ ๋ ํ์ด์ง๊ฐ ์ ์ฒดํ๋ฉด์ผ๋ก ๋ณด์ด๊ฒ ํ ์ ์๋์ง๋ฅผ ์ง์ ํ๋ค.
๋ํ iframe ํ๊ทธ ์ฌ์ด์ ์ฝ์ ๋ ๋ด์ฉ์ iframe ํ๊ทธ๊ฐ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์์ fallback์ผ๋ก ๋ณด์ฌ์ง๋ค.
3.3. iframe ๋ณด์ ๋ฌธ์
๋ค์๊ณผ ๊ฐ์ด iframe ํ๊ทธ๋ก ๋ด ํ์ด์ง์ ๋ค์ด๋ฒ ํ์ด์ง๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํ๋ค.
<iframe
src="https://www.naver.com/"
width="100%"
height="500"
allowfullscreen
>
</iframe>
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ด๋ฒ ํ์ด์ง๊ฐ ์ ๋๋ก ๋ก๋ฉ๋์ง ์๋๋ค.
์ด๋ iframe์ด ํด์ปค๋ค์ ๊ณต๊ฒฉ ๋ฒกํฐ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํด์ปค๋ค์ iframe์ ์ด์ฉํ์ฌ ํน์ ํ์ด์ง๋ฅผ ์ ์์ ์ผ๋ก ์์ ํ๊ฑฐ๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ถํ๊ธฐ๋ฅผ ์๋ํ ์ ์๋ค.
HTML ์ธ์ ์ ์ค์์๋ iframe ์ธ์ ์ ์ด๋ผ๊ณ ํ๋ ๊ณต๊ฒฉ์ด ์๋ค. ํ์ด์ง ๋ด์ iframe ํ๊ทธ๋ฅผ ์ฝ์ ํ๊ณ ์ฌ์ด์ฆ๋ฅผ 0์ผ๋ก ์ค์ ํ์ฌ ์จ๊ธฐ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๋ iframe์ด ์ฝ์ ๋์๋ค๋ ๊ฒ์ ์๊ฐ์ ์ผ๋ก ์ ์ ์๊ณ ์๋์น ์๊ฒ ์ ์ฑ ํ์ด์ง๋ฅผ ๋ก๋ํ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ช ํ ํ์ด์ง์ ๊ฒฝ์ฐ ๋ง์ ์ฌ๋๋ค์ด ์๋ฒ ๋ํ๊ณ ์ถ์ดํ ๊ฒ์ด๋ฏ๋ก ์ด๋ฅผ ๋ชจ๋ ํ์ฉํ๋ฉด ์๋ฒ๋น๊ฐ ๋ ๋ง์ด ๋ค ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฝ์ ํ๊ณ , ์ ์๊ถ์ ์ฃผ์ํ์.
๊ทธ ์ธ์ ํด์ผ ํ ๊ฒ๋ค์ HTTPS ์ฌ์ฉํ๊ธฐ๊ฐ ์๊ณ ์ข๋ ์์ธํ ์ดํด๋ณผ ๋งํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
3.3.1. sandbox ํน์ฑ ์ฌ์ฉํ๊ธฐ
iframe์๋ sandbox ํน์ฑ์ด ์๋ค. ์ด๋ ์ฝ์ ๋ ์ฝํ ์ธ ์ ๋ํด ํ์ํ ์์ ๋ง ํ์ฉํ๋๋ก ํ ์ ์๋ค.
sandbox ํน์ฑ์ด ์๋ ์ฝํ ์ธ ๋ JS๋ฅผ ์คํํ๊ฑฐ๋ ์ ์ฐฝ์ ๋์ฐ๋ ๋ฑ์ ์์ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์์ ๊ณต๊ฒฉ ๊ฐ๋ฅ์ฑ์ด ๋์ด๋๋ค.
sandbox ํน์ฑ์ ๋ฌธ์์ด์ธ๋ฐ ์ด๋ ์ฝํ
์ธ ๊ฐ ํ์ฉํ๋ ์์
์ ์ง์ ํ๋ค. ๋ง์ฝ sandbox=""
๋ก ์ง์ ๋์ด ์๋ค๋ฉด ๋ชจ๋ ์์
์ด ํ์ฉ๋์ง ์๋๋ค.
์๋ฅผ ๋ค์ด์ allow-modals๋ฅผ sandbox ๋ฌธ์์ด์ ์ถ๊ฐํ๋ค๋ฉด iframe์ผ๋ก ์ฝ์ ํ ํ์ด์ง์์ ๋ชจ๋ฌ ์ฐฝ์ ๋์ธ ์ ์๊ฒ ๋๋ค. ์ด์ธ์๋ ๋์ด์ฐ๊ธฐ๋ฅผ ํตํด์ ์ฌ๋ฌ ์์ ์ iframe sandbox ์์ฑ์ ํตํด ํ์ฉํ ์ ์๋ค.
๋จ ์ฃผ์ํ ์ ์ allow-scripts์ allow-same-origin ์ต์ ์ sandbox์ ๋์์ ์ ์ฉํ ์ iframe ์ฝํ ์ธ ๋ same origin policy๋ฅผ ์ฐํํ์ฌ sandbox ํน์ฑ์ ํด์ ํ๋ JS๋ฅผ ์คํํ ์ ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ด ๋ ์ต์ ์ ๋์์ ์ ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
3.3.2. CSP ์ง์์ด ์ค์
CSP๋ XSS ๊ณต๊ฒฉ๊ณผ ๊ฐ์ ๋ณด์ ์ํ์ผ๋ก๋ถํฐ ํ์ด์ง๋ฅผ ๋ณดํธํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๋ณด์ ๊ณ์ธต์ด๋ค. ์ด๋ HTML ๋ฌธ์ ๋ณด์์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ณ ์๋ HTTP ํค๋๋ฅผ ์ ๊ณตํ๋ค.
iframe์ ๋ณด์ ๋ฌธ์ ํด๊ฒฐ์ ์ํด์๋ CSP ์ค์ ์ ํตํด X-Frame-Options ํค๋๋ฅผ ์ ์กํ๋๋ก ์ค์ ๊ฐ๋ฅํ๋ค. ์ด ํค๋๋ ํด๋น ํ์ด์ง๋ฅผ iframe์ผ๋ก ์ฝ์ ํ ์ ์๋์ง๋ฅผ ์ง์ ํ๋ค.
๋ง์ฝ deny๋ก ์ค์ ํ ์ ๊ฐ์ ์ฌ์ดํธ ๋ด์์์ frame ์ ๊ทผ๋ ๋ง๋๋ค. sameorigin์ผ๋ก ์ค์ ํ ์ ๊ฐ์ ์ฌ์ดํธ ๋ด์์๋ง frame ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฐ ์์ผ๋ก ์ ์ ํ X-Frame-Options ํค๋๋ฅผ ์ค์ ํ๋ฉด iframe ๋ณด์ ๋ฌธ์ ๋ฅผ ์ด๋ ์ ๋ ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/
์ด๋ฌํ CSP ์ค์ ์ meta ์์๋ฅผ ํตํด์๋ ํ ์ ์์ง๋ง ์น์๋ฒ๋ฅผ ๊ตฌ์ฑํ ๋ ํ๋ ๊ฒ์ด ์ข๋ค. ํนํ ์์์ ๋ค๋ฃฌ X-Frame-Options ํค๋์ ๊ฒฝ์ฐ meta ํ๊ทธ๋ฅผ ํตํด์ CSP ์ ์ฑ ์ ๊ตฌ์ฑํ ์ ์๋ค.
๋ง์ฝ nginx๋ผ๋ฉด http, server, location ์ค์ ์ ์๋ ์ค์ ์ ์ถ๊ฐํ๋ ์์ด๋ค.
add_header X-Frame-Options sameorigin;
3.4. embed, object
iframe์ ๋ค๋ฅธ HTMLํ์ด์ง๋ฅผ ํ์ด์ง ๋ด์ ์ฝ์ ํ๋ ๊ธฐ๋ฅ์ ํ๋ค. embed, object๋ PDF์ ๊ฐ์ ์ธ๋ถ ์ฝํ ์ธ ๋ฅผ ํ์ด์ง์ ํฌํจํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ํ๋ค. ๋จ ์ด ์์๋ค์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ ์๋ค. ํ๋ฌ๊ทธ์ธ ์ฝํ ์ธ ๋ฅผ ์ฝ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
<embed src="./dummy.pdf" type="application/pdf" width="100" height="200" />
<object data="./dummy.pdf" type="application/pdf" width="100" height="200">
<p>๋์ฒด ํ
์คํธ</p>
</object>
object ํ๊ทธ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ํ์ด์ง์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฝ์ ํ ๋ ๋ ๋ง์ด ์ฐ์ธ๋ค. ๋ํ embed๋ ๋์ฒด ์ฝํ ์ธ ๋ฅผ ๋ฃ์ ๋ฐฉ๋ฒ์ด ์์ง๋ง object๋ ํ๊ทธ ์ฌ์ด์ ๋์ฒด ์ฝํ ์ธ ๋ฅผ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ๋์ฒด ์ฝํ ์ธ ๋ ์ง์ํ๋ค.
๋จ embed ํ๊ทธ๋ง ์ง์๋๋ ๋ก์ ๋ธ๋ผ์ฐ์ ๋ ์์ผ๋ฏ๋ก ๋ง์ฝ ์ ๋ง ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ ๋์ํด์ผ ํ๋ค๋ฉด ๋ ํ๊ทธ๋ฅผ ๋ชจ๋ ์ฌ์ฉํด์ผ ํ๋ค.
<object type="application/pdf"
data="/media/examples/In-CC0.pdf"
>
<embed type="application/pdf"
src="/media/examples/In-CC0.pdf">
</object>
4. ๋ฒกํฐ ๊ทธ๋ํฝ
์น์์ ์ฐ์ด๋ 2๊ฐ์ง ์ด๋ฏธ์ง๋ ํฝ์ ๋ค์ ๊ฒฉ์ ๊ตฌ์กฐ๋ก ์ ์๋๋ ๋์คํฐ ์ด๋ฏธ์ง์, ์ด๋ฏธ์ง๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๊ณ ๋ ๋๋ง๋ ์ง๊ฐ ์ ์๋ ๋ชจ์๊ณผ ๊ฒฝ๋ก ์ ์๊ฐ ๋ค์ด ์๋ ๋ฒกํฐ ์ด๋ฏธ์ง๊ฐ ์๋ค.
๋ฒกํฐ ์ด๋ฏธ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐ๊ฐ ์ปค์ ธ๋ ๋๊ฐ์ด ๋ณด์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํฝ์ ๋ค์ ํ๋ํ๋ ์ ์ฅํ๋ ๋์ ์๊ณ ๋ฆฌ์ฆ๋ค๋ง ์ ์ฅํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ ์ฉ๋์ด ์๋ค.
4.1. SVG
SVG๋ Scalable Vector Graphics์ ์ฝ์๋ก 2์ฐจ์ ๋ฒกํฐ ๊ทธ๋ํฝ์ XML๋ก ์์ ํ๋ ์ธ์ด์ด๋ค.
ํ
์คํธ๋ฅผ HTML๋ก ๊ธฐ์ ํ๋ฏ์ด ๊ทธ๋ํฝ์ SVG๋ก ๊ธฐ์ ํ๋ ๊ฒ์ด๋ค. <circle>
ํ๊ทธ๋ฅผ ํตํด ์์ ๊ทธ๋ฆฌ๊ณ <rect>
ํ๊ทธ๋ฅผ ํตํด ์ฌ๊ฐํ์ ๊ทธ๋ฆฌ๋ ๋ฑ์ด๋ค. ์ฌ๊ธฐ์๋ ์ฌ๋ฌ ํ๊ทธ๋ค์ด ์๋๋ฐ ์ด๋ฅผ ์ด์ฉํ๋ฉด ๋ค์ํ ๊ทธ๋ํฝ์ ๊ทธ๋ฆด ์ ์๋ค. SVG์ ๊ดํ ๋ ๋ง์ ์ ๋ณด๋ ์ฌ๊ธฐ์ ์ป์.
<svg width="100%" height="100%">
<rect width="100%" height="100%" fill="black" />
<circle cx="150" cy="100" r="90" fill="red" />
</svg>
๊ฐ๋จํ SVG๋ ์์ ๊ฐ์ด ์ง์ ๋ง๋ค ์ ์์ง๋ง ๋ณต์กํ ๊ทธ๋ํฝ์ ๊ทธ๋ฆฌ๋ ค๋ฉด SVG๋ฅผ ์ง์ ๊ตฌ์ฑํ๋ ๊ฑด ๋งค์ฐ ์ด๋ ต๋ค. ๊ทธ๋ด ๋ Inkscape์ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์ด์ฉํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ SVG๋ ์ฝ๊ฒ ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์ ํ์ผ ํฌ๊ธฐ๊ฐ ์ปค์ง ์ ์๊ณ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ๋ ์๋ค. ์ฌ์ง๊ณผ ๊ฐ์ ๋ณต์กํ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ๋์คํฐ ์ด๋ฏธ์ง๋ฅผ ์ฐ๋ ๊ฒ ๋ซ๋ค.
4.2. SVG๋ฅผ ํ์ด์ง์ ๋ฃ๊ธฐ
SVG๋ฅผ ํ์ด์ง์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค.
4.2.1. img ํ๊ทธ ์ด์ฉ
img ํ๊ทธ์ src ์์ฑ์ svgํ์ผ์ ๋ฃ์์ผ๋ก์จ ํ์ด์ง์ SVG๋ฅผ ๋ฃ์ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ต์ํ ๋ฌธ๋ฒ์ด๋ผ ์ฝ๊ณ alt text ๋ฑ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฏธ์ง๋ฅผ ํ์ดํผ๋งํฌ๋ก ๋ง๋ค ์๋ ์๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฏธ์ง๋ฅผ ์บ์ฑํ์ฌ ๋น ๋ฅด๊ฒ ๋ก๋ฉํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ด๋ฏธ์ง๋ฅผ JS๋ก ์ ์ดํ ์ ์๊ณ CSS๋ฅผ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด SVG ์ฝ๋์ ์ธ๋ผ์ธ CSS๋ฅผ ํฌํจ์์ผ์ผ ํ๋ค. SVG ํ์ผ์ ์ธ๋ถ CSS ์คํ์ผ์ํธ๋ฅผ ๋ฃ์ผ๋ฉด ๋ฌด์๋๋ค. ๊ฐ์ ์ด์ ๋ก SVG์ ์์ฌ ํด๋์ค CSS(:hover ๋ฑ)๋ฅผ ์ ์ฉํ ์ ์๋ค.
๋ช๋ช ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ SVG๋ฅผ ์ง์ํ์ง ์๋๋ฐ ์ด ๊ฒฝ์ฐ srcset ์์ฑ์ ์ฌ์ฉํ ์ ์๋ค. ์ต์ ๋ธ๋ผ์ฐ์ ๋ง ์ง์ํ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ฐ๋ผ์ SVG๋ฅผ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ๋ srcset ์์ฑ์ SVG ํ์ผ์ ์ฌ์ฉํ๊ณ , ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ src ์์ฑ์ PNG ํ์ผ์ ์ฌ์ฉํ๋ค.
<img src="image.png" srcset="image.svg" alt="SVG image" />
css์ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ์๋ svg๋ฅผ ์ฝ์ ํ ์ ์๋๋ฐ, img ํ๊ทธ๋ฅผ ์ฌ์ฉํ ๋์ ๊ฐ์ด JS๋ก svg๋ฅผ ์ ์ดํ ์ ์๋ค๋ ๊ฐ์ ๋จ์ ์ด ์๋ค.
4.2.2. inline SVG
SVG๋ฅผ ํ์ด์ง์ ์ง์ ๋ฃ๋ ๋ฐฉ๋ฒ์ด๋ค. svg ํ์ผ์ ํ ์คํธ ์๋ํฐ๋ก ์ด์ด์ ์ฝ๋๋ฅผ ๋ณต์ฌํ ๋ค์ HTML ํ์ผ์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด HTTP ์์ฒญ์ ์ค์ผ ์ ์์ด์ ๋ก๋ฉ ์๊ฐ์ ์ค์ผ ์ ์๊ณ svg ์์์ class, id๋ฑ์ ํตํด ์คํ์ผ์ ์ ์ฉํ ์ ์๋ค. inline SVG๋ CSS ์ํธ์์ฉ๊ณผ CSS ์ ๋๋ฉ์ด์ ์ svg์ ์ ์ฉํ ์ ์๊ฒ ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฌ๋ HTML ํ์ผ ๋ด์ SVG ์ฝ๋๋ฅผ ์ง์ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ , ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ํ ๋ธ๋ผ์ฐ์ ๊ฐ svg ํ์ผ ์บ์ฑ์ ํ ์ ์๋ค.
4.2.3. iframe ํ๊ทธ ์ด์ฉ
iframe ํ๊ทธ์ src ์์ฑ์ svg ํ์ผ์ ๋ฃ์์ผ๋ก์จ ํ์ด์ง์ SVG๋ฅผ ๋ฃ์ ์ ์๋ค.
๊ทธ๋ฌ๋ SVG์ ์นํ์ด์ง๊ฐ ๊ฐ์ origin์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก SVG์ JS๋ฅผ ์ ์ฉํ ์ ์๊ณ iframe์ ์ฌ์ฉํ ์ ์๋ ๋ธ๋ผ์ฐ์ ์์๋ SVG ์ง์์ด ์์ด๋ ๋์ํ์ง ์๋๋ค๋ ๋จ์ ์ด ์๋ค. ์ผ๋ฐ์ ์ผ๋ก iframe ํ๊ทธ๋ฅผ ์จ์ svg๋ฅผ ๋ ๋๋งํ๋ ๊ฑด ์ข์ ์ ํ์ด ์๋๋ค.
5. ๋ฐ์ํ ์ด๋ฏธ์ง
๋ค์ํ ํฌ๊ธฐ์ ์คํฌ๋ฆฐ์ด ๋ฑ์ฅํจ์ ๋ฐ๋ผ์, ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ๋ค. ๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ์ ์ฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ํฝ์ ์๋ฅผ ์กฐ์ ํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ด ํ์ํด์ก๋ค.
srcset, sizes, pictureํ๊ทธ ๋ฑ์ ๋ค๋ฃฐ ํ ๋ฐ, ์ด๋ ๋ชจ๋ ์ต์ ๋ฐ์คํฌํฑ/๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ค.(IE์ ์ธ)
๋ฌผ๋ก CSS๋ฅผ ์ด์ฉํด์๋ ๋ฐ์ํ ๋์์ธ์ ํ ์ ์์ง๋ง ์ฌ๊ธฐ์๋ HTML๋ก ํ ์ ์๋ ๊ฑธ ๋ณด์.
5.1. ํด์๋ ์ ํ
ํ๋ฉด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ํด์๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ๊ฒ์ด๋ค. ๋ธ๋ผ์ฐ์ ๋ ํ๋ฉด์ ํฝ์ ์๋ฅผ ์ ์ ์๊ณ , ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ํํ๋ค.
<img
srcset="image-320w.jpg 320w, image-480w.jpg 480w, image-768w.jpg 768w"
sizes="(max-width:320px) 280px,
(max-width:480px) 440px,
800px"
src="image.jpg"
alt="๊ธฐ๋ณธ ์ด๋ฏธ์ง"
/>
srcset, sizes ์์ฑ์ ์ผํ๋ก ๊ฐ ๊ฐ์ ๊ตฌ๋ถํด ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ๋ ์ ์๋ค.
srcset์ ๊ฐ๋ค, image-320w.jpg 320w
์ ๊ฐ์ ๊ฐ์ ์ด๋ฏธ์ง ํ์ผ๋ช
๊ณผ ์ด๋ฏธ์ง์ ๊ณ ์ ํฝ์
๋๋น๋ก ์ด๋ฃจ์ด์ง๋ค. ์ด๋ฏธ์ง์ ์ค์ ์ฌ์ด์ฆ์ธ w๋จ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ด๋ฏธ์ง์ ๋๋น๊ฐ ์ด๋ ์ ๋๋ผ๊ณ ์๋ ค์ฃผ๋ ์ฉ๋์ด๋ค.
sizes์ ๊ฐ๋ค, (max-width:480px) 440px
์ ๋ฏธ๋์ด ์กฐ๊ฑด๋ฌธ๊ณผ, ์ด ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ธ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๊ฐ ์ฑ์ธ ์ต์ ์ ๋๋น๋ก ์ด๋ฃจ์ด์ง๋ค. ์์ ๊ฐ์ ์ต๋ 480px์ ํ๋ฉด์ผ ๋ ์ด๋ฏธ์ง๊ฐ 440px๋ฅผ ์ฑ์ฐ๋๋ก ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ sizes์ ๋ฃ์ ์ด๋ฏธ์ง ๋๋น๋ px, em์ผ๋ก ๋ ์ ๋๊ฐ์ด๋ ๋ทฐํฌํธ ์๋๊ฐ vw๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. %
๋ ์ฌ์ฉํ ์ ์๋ค.
์ด ์์ฑ๋ค์ด ์์ ๋ ๋ธ๋ผ์ฐ์ ๋, ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ๋ ๊ธฐ๊ธฐ ๋๋น๋ฅผ ํ์ธํ ํ ์ฐธ์ด ๋๋ ๋ฏธ๋์ด ์กฐ๊ฑด๋ฌธ์ ํ์ธํ๊ณ , ๊ทธ ์กฐ๊ฑด๋ฌธ์ ํด๋นํ๋ ์ด๋ฏธ์ง์ ๋๋น(size์ ์๋ ๊ฒ)๋ฅผ ํ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋๋น์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด๋ฏธ์ง๋ฅผ srcset์์ ์ฐพ์์ ๋ก๋ํ๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์๋ง ์ง์๋๋ค. ๋ก์ ๋ธ๋ผ์ฐ์ ๋ src์ ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒ์ด๋ค.
5.2. ์ํธ ๋๋ ์ ๋ฌธ์
์ํธ ๋๋ ์ ๋ฌธ์ ๋ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ์ด๋ฏธ์ง์ ํต์ฌ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ์ฌ์ง์ ๋ค๋ฅธ ํํ๋ก ๋ณด์ฌ์ค์ผ ํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด picture ํ๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. picture์์๊ฐ ์ฌ๋ฌ source๋ฅผ ๊ฐ์ธ๋๋ก ํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณ ๋ฅผ ์ ์๋ ์์ค๋ค์ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
<picture>
<source media="(max-width:768px)" srcset="img-480w.jpg">
<source media="(max-width:1080px)" srcset="img-720w.jpg">
<img src="img.jpg" alt="์๋ฒ ์ด๋ฏธ์ง">
</picture>
source ํ๊ทธ์๋ ๋ฏธ๋์ด ์กฐ๊ฑด๋ฌธ์ด ์์ด์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค ์ ์๋๋ก ์ค์ ๊ฐ๋ฅํ๋ค. source ํ๊ทธ์ media ์กฐ๊ฑด๋ฌธ์ ๋ง์กฑํ ์ ํด๋น source์ srcset ๊ฒฝ๋ก์ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ img ํ๊ทธ๊ฐ ์๋๋ฐ, ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ picture ํ๊ทธ๋ฅผ ์ง์ํ์ง ์์ ๋ ํน์ ์ฐธ์ ๋ฆฌํดํ๋ ๋ฏธ๋์ด ์กฐ๊ฑด๋ฌธ์ด ์์ ๋ ๋ณด์ฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค.
๋ํ source๋ type์์ฑ ๋ด์ MIME ํ์ ์ ๋ช ์ํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ธฐ ์ ์, ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ์ง ์๋ ์ด๋ฏธ์ง ์ ํ์ ๊ฒฝ์ฐ ๊ฑฐ๋ถํ ์ ์๋๋ก ํ๋ค.
5.2.1. ์ฅ์
๋ฌผ๋ก CSS๋ JS๋ฅผ ์ด์ฉํด์ ์ด๋ ๊ฒ ํ ์๋ ์๋ค. ํ์ง๋ง ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์์ํ ๋ ํ์๋ CSS, JS๋ฅผ ํด์ํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ HTML์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ค. ์ด๋ ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ ๋จ์ถ์์ผ์ฃผ๋ ๊ธฐ๋ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ CSS๋ JS๋ก ๋ฐ์ํ ์ด๋ฏธ์ง๋ฅผ ๊ตฌํํ๋ค๋ฉด, ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ์ฒ์๋ถํฐ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์ ์๋ค. ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ์์ ์ CSS, JS๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ๋ ๋ฏธ๋ฆฌ ๋ก๋ํ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , CSS, JS๊ฐ ๋ก๋๋๋ฉด ์ด๋ฏธ์ง๋ฅผ ๊ต์ฒดํ๊ฒ ๋๋ค. ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ์๊ฐ์ ๋๋ฆฌ๊ฒ ๋๋ค. ์ฆ HTML์ ์ด์ฉํด์ผ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋๋ก ํ ์ ์๋ค.
5.3. ์ ๋ฆฌ
๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ ค๋ฉด picture ํ๊ทธ๋ฅผ ์ฐ์.
ํ๋ฉด ํฌ๊ธฐ๊ฐ ์์ ๋ ๋ ์์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ฉ๋์ ์ ์ฝํ๊ณ ์ถ๋ค๋ฉด svg ์ด๋ฏธ์ง๋ฅผ ์ฐ๊ฑฐ๋ img ํ๊ทธ์ srcset+sizes ์์ฑ์ ์ฌ์ฉํด ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ ํํ ์ ์๋๋ก ํ์.
6. ๊ฐ๋จํ ํ์ด์ง ๋ง๋ค๊ธฐ ํ ์คํธ
MDN์์๋ ๊ฐ๋จํ ํ์ด์ง์ ๋ฏธ๋์ด๋ฅผ ์ฝ์ ํ๋ ์์ ๋ฅผ ์ ๊ณตํ๋ค. ํ๋ฒ ํด๋ณด์.
๋จผ์ github์์ ํ๊ฐ๋ฅผ ์ํ ํ์ผ์ ๋ฐ๋๋ค. index.html์ ๋ค์ด๋ฐ์ ํ pattern.png๋ฅผ ๊ฐ์ ํด๋์ ๋ฃ๋๋ค. originals ํด๋์ ์ด๋ฏธ์ง๋ ๋ค์ด๋ฐ๋๋ค.
index.html์ ์๋ CSS๋ ์ผ๋จ ์ ๊ฒฝ์ฐ์ง ๋ง์. ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ index.html์ body ํ๊ทธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
<body>
<header>
<h1>Mozilla</h1>
<!-- insert <img> element, link to the small
version of the Firefox logo -->
</header>
<main>
<article>
<!-- insert iframe from youtube -->
<h2>Rocking the free web</h2>
<p>
Mozilla are a global community of technologists, thinkers, and
builders, working together to keep the Internet alive and accessible,
so people worldwide can be informed contributors and creators of the
Web. We believe this act of human collaboration across an open
platform is essential to individual growth and our collective future.
</p>
<p>
Click on the images below to find more information about the cool
stuff Mozilla does.
<a href="https://www.flickr.com/photos/mathiasappel/21675551065/"
>Red panda picture</a
>
by Mathias Appel.
</p>
</article>
<div class="further-info">
<!-- insert images with srcsets and sizes -->
<a href="https://www.mozilla.org/en-US/firefox/new/">
<img />
</a>
<a href="https://www.mozilla.org/">
<img />
</a>
<a href="https://addons.mozilla.org/">
<img />
</a>
<a href="https://developer.mozilla.org/en-US/">
<img />
</a>
<div class="clearfix"></div>
</div>
<div class="red-panda">
<!-- insert picture element -->
</div>
</main>
</body>
์ด์ ์ฃผ์์ ์จ ์๋ ๋๋ก ํ๋ํ๋ ํด๋ณด์.
ํค๋์ ์์ ํ์ด์ดํญ์ค ๋ก๊ณ ์ด๋ฏธ์ง๋ฅผ ๋ฃ๋๋ค.
<header>
<h1>Mozilla</h1>
<!-- insert <img> element, link to the small
version of the Firefox logo -->
<img
src="./firefox_logo-only_RGB.png"
alt="small version of the Firefox logo"
/>
</header>
๊ทธ ๋ค์ main์ article์ ์ ํ๋ธ ์์์ iframe์ผ๋ก ์๋ฒ ๋ํ๋ค. ์์์ ๋ค์ด๊ฐ์ ๊ณต์ ๋ฒํผ์ ๋๋ฅธ ํ ํผ๊ฐ๊ธฐ๋ฅผ ์ ํํ์ฌ ๋์ค๋ iframe ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ฉด ๋๋ค.
๋ํ ์ ํ๋ธ ์์์ ๋๋น๊ฐ 400px์ฌ์ผ ํ๋ค๊ณ ์ํค๋ฏ๋ก iframe width๋ฅผ 400์ผ๋ก ์ค์ ํ๋ค.
<!-- insert iframe from youtube -->
<iframe
width="400"
height="315"
src="https://www.youtube.com/embed/ojcNcvb1olg"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
๊ทธ ๋ค์ ๋งํฌ์ ๋ค์ด๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐํ๋ค. img ํ๊ทธ๋ ์ด๋ฏธ ์ ์ธ๋์ด ์๊ณ ์ฌ๊ธฐ์ src, alt, srcset, sizes ์์ฑ์ ์ค์ ํด ์ค์ผ ํ๋ค.
ํ๋ฉด์ด 500px ์ดํ์ผ ๋๋ 120px ๋๋น์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ , ๊ทธ ์ด์์ผ ๋ 400px ๋๋น์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋งํฌ ์ด๋ฏธ์ง๋ค์ ์ธํ ํด ์ฃผ๋ฉด ๋๋ค. ์ด๋ ์ด๋ฏธ์ง์ ์ค์ ํฌ๊ธฐ์ srcset์ ํ๊ธฐ๋ ํฌ๊ธฐ๋ฅผ ๋ง์ถฐ ์ฃผ์ด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ง์ ํฌ๊ธฐ๋ฅผ ์ ๋๋ก ์ธ์ํ ์ ์๋๋ก ํ๋ค.
<img
srcset="./firefox_logo-only_RGB.png 1200w"
sizes="(max-width:500px) 120px, 400px"
src="./firefox_logo-only_RGB.png"
/>
์ด์ picture ํ๊ทธ๋ฅผ ์ฌ์ฉํด ๋ ๋ ํฌ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ด๋ณด์. ๋ทฐํฌํธ๊ฐ 600px ์ดํ์ด๋ฉด ์์ ํฌ๋ ์ด๋ฏธ์ง๋ฅผ, ๊ทธ ์ด์์ด๋ฉด ํฐ ํฌ๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ค. red-panda-small.jpg๋ ์ ์ ํ ๊ธฐ์กด ์ด๋ฏธ์ง๋ฅผ ์๋ผ์ ๋ง๋ ๋ค.
<div class="red-panda">
<!-- insert picture element -->
<picture>
<source media="(max-width:600px)" srcset="./red-panda-small.jpg" />
<img src="./red-panda.jpg" alt="Red panda" />
</picture>
</div>
์ด๋ ๊ฒ ํ๋ฉด ํ๋ฉด ๋๋น์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์ด๋ฏธ์ง๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ง๊ธ๊น์ง ํ ๋๋ก ํ๋ฉด MDN์ ํ๊ฐ ํญ๋ชฉ๋ค์ ์๋ฃํ ์ ์๋ค.
์ฐธ๊ณ
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track
https://kkamagistory.tistory.com/808
embed์ object https://stackoverflow.com/questions/1244788/embed-vs-object
SVG์ ๊ดํ ๋ ๋ง์ ์ ๋ณด https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Getting_Started