| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ์น๊ฐ๋ฐ
- ui์ปดํฌ๋ํธ
- ์ผ์ดํ๋ฐ๋ชฌํํฐ์ค
- kpopdemonhunters
- ๋ฐ๋๋ผ์คํฌ๋ฆฝํธ
- ์ ๊ทผ์ฑ
- ๋น๋ณด๋์ฐจํธ
- ๋ฐ๋ง์ผํ
- UX๋์์ธ
- ๊ณจ๋
- ๋ทํ๋ฆญ์คost
- ์น์ ๊ทผ์ฑ
- ์ฌ์๋ณด์ด์ฆ
- Golden
- ๋คํฌ๋ชจ๋
- ๋คํฌ๋ชจ๋ํ ๊ธ
- ์น๋์์ธ
- ์คํฌ๋กค์ ๋๋ฉ์ด์
- ์นUI
- ์๋ฐ์คํฌ๋ฆฝํธ
- JavaScript
- ํ๋ก ํธ์๋
- ์ผ๋ฐํ
- UIUX
- js์คํฌ๋กค์ด๋ฒคํธ
- ํํธ๋ฆญ์ค
- ๋ทํ๋ฆญ์ค์ ๋๋ฉ์ด์
- ๊ฐ์์์ด๋
- ์๋ฐ์คํฌ๋ฆฝํธui
- ๋ฐ๋๋ผjs
- Today
- Total
UI Code Lab
ํญ ์ ํ ์คํฌ๋ฆฝํธ ๋ชจ๋ํ ์ค์ ์์ ๋ณธ๋ฌธ
ํญ ์ ํ ์คํฌ๋ฆฝํธ ๋ชจ๋ํ ์ค์ ์์
๐ฏ๊ฟ์์ด๐ 2026. 1. 15. 10:47
์น ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ํญ ์ ํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ผ์ด ์์ฃผ ์๊น๋๋ค.
์ฒ์์๋ ๋จ์ํ fetch๋ก HTML์ ๋ถ๋ฌ์์ innerHTML์ ๋ฃ๊ณ ,
ํญ ํด๋ฆญ ์ ๋ณด์ฌ์ฃผ๊ธฐ/์จ๊ธฐ๊ธฐ๋ง ํ๋ฉด ์ถฉ๋ถํด ๋ณด์ด์ฃ .
ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ์ฝ๋๊ฐ ์ค๋ณต๋๊ณ ,
์ ์ญ ๋ณ์ ์ถฉ๋์ด๋ ํ์ด์ง๋ณ ๊ด๋ฆฌ์ ๋ถํธํจ ๊ฐ์
๋ฌธ์ ๊ฐ ํ๋๋์ฉ ๋๋ฌ๋ฉ๋๋ค.
์ด๋ฐ ์ํฉ์์ ํ์ํ ๊ฑด
๊ณตํต ๋ก์ง์ ๋ชจ๋ํํ๊ณ ,
๊ฐ ํ์ด์ง์์๋ ์ต์ํ์ ์ค์ ๋ง ๋จ๊ธฐ๋
๊ตฌ์กฐํ์ ๋๋ค.
1. ๋ฌธ์ ์ํฉ
- ํญ ์ ํ ๋ก์ง์ ํ์ด์ง๋ง๋ค ์ค๋ณต ์์ฑ → ์ ์ง๋ณด์ ์ด๋ ค์
- ์ ์ญ ๋ณ์(cache, loaded)๊ฐ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ
- ํ์ด์ง๋ง๋ค ๋ค๋ฅธ ํ์ผ๋งต์ ๊ด๋ฆฌํด์ผ ํ๋๋ฐ, ๊ณตํต ๋ก์ง๊ณผ ์์ฌ ์์ด์ ๋ถํธ
2. ํด๊ฒฐ ์ ๋ต
- ๊ณตํต ๋ก์ง์ ํ๋์ ๋ชจ๋๋ก ๋ถ๋ฆฌ
- ํ์ด์ง๋ณ๋ก๋ fileMap๋ง ๋จ๊ฒจ์ ๊ด๋ฆฌ
- ๋ชจ๋์ init()๊ณผ setFileMap() ๋ฉ์๋๋ง ์ธ๋ถ์ ๋ ธ์ถ → ๊น๋ํ ๋ค์์คํ์ด์ค ์ ์ง

3. ์ฝ๋ ์์
๊ณตํต ์คํฌ๋ฆฝํธ (tabs.js)
const MyTabs = (function() {
let fileMap = {};
const loaded = {};
function setFileMap(map) {
fileMap = map;
}
async function init() {
const links = document.querySelectorAll(".menu-link");
let firstLink = Array.from(links).find(l => l.dataset.disabled !== "true");
if (!firstLink) return;
const key = firstLink.dataset.target;
const targetEl = document.getElementById(`content-${key}`);
const response = await fetch(fileMap[key]);
const html = await response.text();
targetEl.innerHTML = html;
loaded[key] = true;
showContent(key);
firstLink.setAttribute("aria-current", "page");
links.forEach(link => {
link.addEventListener("click", async (e) => {
e.preventDefault();
if (link.dataset.disabled === "true") return;
links.forEach(l => l.removeAttribute("aria-current"));
link.setAttribute("aria-current", "page");
const key = link.dataset.target;
const targetEl = document.getElementById(`content-${key}`);
if (!loaded[key]) {
const response = await fetch(fileMap[key]);
const html = await response.text();
targetEl.innerHTML = html;
loaded[key] = true;
}
showContent(key);
});
});
}
function showContent(key) {
document.querySelectorAll(".container > div").forEach(div => {
div.style.display = "none";
});
document.getElementById(`content-${key}`).style.display = "block";
}
return { init, setFileMap };
})();
ํ์ด์ง๋ณ ์คํฌ๋ฆฝํธ
<script src="tabs.js"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
MyTabs.setFileMap({
a: "content-a.html",
b: "content-b.html"
});
MyTabs.init();
});
</script>

๋ง๋ฌด๋ฆฌํ๋ฉฐ
ํญ ์ ํ ๊ธฐ๋ฅ์ ๋จ์ํด ๋ณด์ด์ง๋ง,
ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ๋์ด๋๊ณ
์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋๋ค.
๊ณตํต ๋ก์ง์ ๋ชจ๋ํํ๊ณ
ํ์ด์ง๋ณ๋ก fileMap๋ง ์ ์ํ๋ ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ๋ฉด
์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ
์ถฉ๋์ ์๋ฐฉํ ์ ์์ต๋๋ค.
๋ฌด์๋ณด๋ค ์ ์ง๋ณด์๊ฐ ํจ์ฌ ์ฌ์์ง๊ณ ,
๋ค๋ฅธ UI ์ปดํฌ๋ํธ์๋
๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ฅํ ์ ์๋ค๋ ์ ์์
ํฐ ์ฅ์ ์ด ์์ต๋๋ค.
