๋ธ๋ก๊ทธ ๋ชฉ๋ก ์๋ ์์ฑ ๋ฐฉ๋ฒ- jQuery TOC์ JS์ ์ฅ๋จ์ ๋น๊ต
-๋ธ๋ก๊ทธ ์๋ ๋ชฉ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ
-์๋ ๋ชฉ๋ก ์์ฑํ๋ TOC JS์ JavaScript ๋น๊ต
๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ ๋ ์๋์ผ๋ก ๊ธ ๋ชฉ๋ก์ ์์ฑํด์ฃผ๋ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด, ์ฝํ ์ธ ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ํนํ, ๊ธด ๊ธ์ ์์ฑํ ๋ ๋ฐฉ๋ฌธ์๋ค์ด ์ํ๋ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋๋ก ๋๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ด์ฃ . ์ด๋ฒ ๊ธ์์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ๋ jQuery TOC ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์๋ ๊ธ ๋ชฉ๋ก ์์ฑ ๋ฐฉ๋ฒ์ด๊ณ , ๋ ๋ฒ์งธ๋ ์๋์ผ๋ก JavaScript๋ฅผ ์์ฑํด ๊ธ ๋ชฉ๋ก์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ ๋ฐฉ๋ฒ์ ๋น๊ตํ๋ฉด์, ๊ฐ ๋ฐฉ๋ฒ์ ์ฅ์ ๊ณผ ์ค์ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ธ๋ก๊ทธ์์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๋ชฉ์ฐจ๋ฅผ ์์ฑํ ์ ์์ ๊ฒ์ ๋๋ค.
๋ธ๋ก๊ทธ ๋ชฉ๋ก ์๋ ์์ฑ ๋ฐฉ๋ฒ: jQuery TOC์ JS ํ์ฉ๋ฐฉ๋ฒ
์๋ ๋ชฉ๋ก ์์ฑ์ ๋ง์ด ์ฌ์ฉํ๋ TOC ์ ์ง์ ์์ฑํ JS์ ์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ 2๊ฐ์ง์ ์ฝ๋๋ฅผ ๋น๊ตํ๋ ์๊ฐ์ ๊ฐ์ ธ ๋ณด๊ฒ ์ต๋๋ค
jQuery TOC JS ๋ก ๊ธ๋ชฉ๋ก ์๋์์ฑ๋ฐฉ๋ฒ
๋จผ์ , ์ฝ๊ฒ ๊ธ ๋ชฉ๋ก์ ์์ฑํด์ฃผ๋ jQuery TOC ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ์ต๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํ ํ์ผ์ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค. ์๋ ๋งํฌ์์ Download ๋ฒํผ์ ํด๋ฆญํ์ฌ jquery.toc.min.js
ํ์ผ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
1. ๋ชฉ๋ก์ ์๋์ผ๋ก ํ์ฑ๋๊ฒ HTML ์ฝ๋ ์ค์ ํ๊ธฐ
๋ค์ด๋ก๋ํ ํ์ผ์ ์ฌ์ฉํ๊ธฐ ์ํด, ํฐ์คํ ๋ฆฌ์ ์คํจ์ ์์ ํด์ผ ํฉ๋๋ค. ๋ค์ ๋จ๊ณ์ ๋ฐ๋ผ HTML์ ์ค์ ํฉ๋๋ค.
- ํฐ์คํ ๋ฆฌ ๊ด๋ฆฌ ํ์ด์ง๋ก ์ด๋ํ์ฌ ๊พธ๋ฏธ๊ธฐ ์คํจ ํธ์ง์ ํด๋ฆญํฉ๋๋ค.
- HTML ํธ์ง ๋ฒํผ์ ํด๋ฆญํ ํ, ํ์ผ ์
๋ก๋ ๋ฉ๋ด์์ ๋ฐฉ๊ธ ๋ค์ด๋ก๋ํ
jquery.toc.min.js
ํ์ผ์ ์ถ๊ฐํฉ๋๋ค. - HTML ๋ฉ๋ด์์
</head>
ํ๊ทธ ๋ฐ๋ก ์์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค:
<script src="./images/jquery.toc.min.js"></script>
</body>
ํ๊ทธ ๋ฐ๋ก ์์ ๋ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ์ฌ ๋ชฉ์ฐจ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค:
<script>
$(document).ready(function() {
var $toc = $("#toc");
$toc.toc({
content: ".tt_article_useless_p_margin",
headings: "h2,h3,h4"
});
});
</script>
2. ์๋์ผ๋ก ํ์ฑ๋๋๋ชฉ๋ก ๋์์ธ์ ์ํด CSS ์ฝ๋ ์ถ๊ฐ
๋ชฉ์ฐจ์ ์คํ์ผ์ ์ค์ ํ๊ธฐ ์ํด CSS๋ฅผ ์ถ๊ฐํฉ๋๋ค. CSS ๋ฉ๋ด์์ ์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํ์ฌ ๊ธ ์ ๋ชฉ์ ์คํ์ผ์ ์ง์ ํฉ๋๋ค:
/* ๊ธ ์ ๋ชฉ1,2,3 ์คํ์ผ */
.index_toc p {
color: lightslategray;
}
.index_toc {
color: lightslategray;
font-weight: bold;
}
#toc {
padding-left: 25px;
}
#toc li > ul > li {
list-style: none;
}
#toc li > ul {
padding: 5px 0 20px 0;
}
3. ๋ชฉ๋ก์ด ์๋์ผ๋ก ํ์๋ ์์น์ ์ฝ๋๋ฅผ ์ถ๊ฐ
๋ชฉ๋ก์ ํ์ํ๊ธฐ ์ํ ์์์ ์ถ๊ฐํฉ๋๋ค. ํฐ์คํ ๋ฆฌ ์ค์ ์์ ์ฝํ ์ธ ์์ ๊ด๋ฆฌ๋ฅผ ํด๋ฆญํ ํ, ์์ ์ฐ๊ธฐ๋ฅผ ์ ํํ๊ณ HTML ๋ชจ๋๋ก ์ ํํฉ๋๋ค. ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ ์ฅํฉ๋๋ค:
<div class="index_toc">
<p data-ke-size="size16">๋ชฉ์ฐจ</p>
<ol id="toc" style="list-style-type: decimal;" data-ke-list-type="decimal"></ol>
</div>
4. ๋ชฉ๋ก ์์์ ํ์ฉํด์ ์๋ ๋ชฉ๋ก ์์ฑํ๊ธฐ
๊ธ์ฐ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์์์์ ๋ชฉ๋ก ์์์ ๋ถ๋ฌ์จ ํ, ์ ๋ชฉ์ ์์ฑํ๋ฉด ์๋์ผ๋ก ๋ชฉ์ฐจ๊ฐ ์์ฑ๋ฉ๋๋ค.
JavaScript๋ก ๋ชฉ๋ก ์๋ ์์ฑํ๊ธฐ
JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฉ๋ก์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํฉ๋๋ค.
1. ๋ชฉ๋ก์ ํ์ํ ์์น์ ์ฝ๋ ์ถ๊ฐํ๊ธฐ
๋จผ์ , ๋ชฉ์ฐจ๋ฅผ ํ์ํ ์์น์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด ์ฝ๋์์๋ ๋ชฉ์ฐจ๋ฅผ ๋ด์ div
์ ul
์์๋ฅผ ์์ฑํฉ๋๋ค.
<div id="toc">
<ul></ul>
</div>
2.๋ชฉ๋ก ๋์์ธ์ ์ํ CSS ์คํ์ผ ์ถ๊ฐ
๋ชฉ์ฐจ์ ๋์์ธ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์๋ CSS ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ์ํ๋ ์คํ์ผ์ ๋ง๊ฒ ์์ ํ์ฌ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
#toc {
background-color: #f9f9f9;
border: 1px solid #909090;
padding: 15px;
margin: 20px 0;
border-radius: 5px;
font-family: 'Noto Sans KR', sans-serif !important;!i;!;
}
#toc li {
border-radius: 4px;
transition: background-color 0.3s;
position: relative;
font-family: 'Noto Sans KR', sans-serif !important;
}
#toc li a {
text-decoration: none;
color: #333;
/* font-weight: bold; */
transition: color 0.3s;
border-bottom: none;
padding-left: 30px;
}
#toc li a.h1-link {
font-size: 24px;
padding-left: 40px;
}
#toc li a.h1-link::before {
content: "•";
position: absolute;
left: 30px;
top: 50%;
transform: translateY(-50%);
color: #555;
}
#toc li a.h2-link {
font-size: 1.3rem;
/* padding-left: 40px; */
}
#toc li a.h2-link::before {
/* content: "•"; */
position: absolute;
left: 0px;
top: 50%;
transform: translateY(-50%);
color: #555;
}
#toc li a.h3-link {
font-size: 1.1rem;
padding-left: 40px;
}
#toc li a.h3-link::before {
content: "•";
position: absolute;
left: 30px;
top: 50%;
transform: translateY(-50%);
color: #555;
}
#toc li a.h4-link {
font-size: 1rem;
padding-left: 60px;
}
#toc li a.h4-link::before {
content: "•";
position: absolute;
left: 50px;
top: 50%;
transform: translateY(-50%);
color: #555;
}
3. ๋ชฉ๋ก์ ๋์ ์ผ๋ก ์์ฑํ๊ธฐ ์ํด JavaScript ์ฝ๋ ์ถ๊ฐ
HTML ๋ฌธ์์ <head>
์น์
์ ๋ค์ JavaScript ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ชฉ์ฐจ๋ฅผ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค:
<script>
document.addEventListener("DOMContentLoaded", function() {
const toc = document.querySelector('#toc ul');
const toplist = document.querySelector('.toplist');
const headings = document.querySelectorAll('.tt_article_useless_p_margin.contents_style h2, .tt_article_useless_p_margin.contents_style h3, .tt_article_useless_p_margin.contents_style h4');
let hasSubheadings = false;
headings.forEach((heading, index) => {
if (!heading.id) {
heading.id = `heading-${index}`;
}
if (heading.tagName === 'H2' || heading.tagName === 'H3' || heading.tagName === 'H4') {
hasSubheadings = true;
}
const listItem = document.createElement('li');
const link = document.createElement('a');
link.href = `#${heading.id}`;
link.textContent = heading.textContent;
if (heading.tagName === 'H2') {
link.classList.add('h2-link');
} else if (heading.tagName === 'H3') {
link.classList.add('h3-link');
} else if (heading.tagName === 'H4') {
link.classList.add('h4-link');
}
listItem.appendChild(link);
toc.appendChild(listItem);
});
if (!hasSubheadings) {
toc.style.display = 'none';
toplist.style.display = 'none';
}
});
</script>
4. ์น ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํ ์๋์ผ๋ก ์์ฑ๋๋ ๋ชฉ๋ก์ ํ์ธ
์ด์ ์น ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด, ์ค์ ํ ์์น์ ๋ชฉ์ฐจ๊ฐ ์์ฑ๋๊ณ , ์ ๋ชฉ์ ๋ํ ๋งํฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค. ์ฌ์ฉ์๋ ์ด ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ์ํ๋ ์ ๋ชฉ์ผ๋ก ๋น ๋ฅด๊ฒ ์ด๋ํ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก Vanilla JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฉ์ฐจ๋ฅผ ์์ฑํ๋ฉด, ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด๋ ํจ์จ์ ์ด๊ณ ์ ์ฐํ๊ฒ ์ฝํ ์ธ ๋ฅผ ํ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ ์คํจ ๊พธ๋ฏธ๊ธฐ ๋ธ๋ก๊ทธ ์์ ์ ์ ์ฉํ ์ฝ๋์ ํ ์๋ฃ ๋ชจ์
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ ์คํจ ๊พธ๋ฏธ๊ธฐ์ SEO ์ต์ ํ ์๋ฃํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ๋ฅผ ๋ ํ์ฑํ๊ฒ ๊พธ๋ฏธ๋ ์ ์ฉํ ์ฝ๋๋คํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ๋ฅผ ์ด์ํ๋ฉด์ ๊ฐ์ฅ ์ค์ํ ์์ ์ค ํ๋๋ ๋ฐ๋ก ๋ธ๋ก๊ทธ์ ๊ฐ์ฑ๊ณผ ๋์์ธ
everydayhub.tistory.com
์๋ ๋ชฉ๋ก ์์ฑ TOC ํ๋ฌ๊ทธ์ธ ๊ณผ JavaScript ๋น๊ต
์ด์ TOC ํ๋ฌ๊ทธ์ธ๊ณผ JavaScript๋ฅผ ์ฌ์ฉํ ๋ชฉ์ฐจ ์์ฑ ๋ฐฉ๋ฒ์ ์ฅ๋จ์ ์ ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
์๋ ๊ธ ๋ชฉ๋ก ์์ฑ์ ์ํด TOC ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ ์
์ฅ์
- ์๋ํ: ์ ๋ชฉ์ด ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋ ๋ชฉ์ฐจ๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- ์ ์ฐ์ฑ: ๋ค์ํ ์ ๋ชฉ ๋ ๋ฒจ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ๋ฉฐ, ์ ๋ชฉ์ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
- ์คํ์ผ๋ง: ์ธ๋ถ CSS๋ฅผ ํตํด ๊ฐํธํ๊ฒ ์คํ์ผ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋จ์
- ์์กด์ฑ: jQuery์ ํ๋ฌ๊ทธ์ธ์ ์์กดํ๋ฏ๋ก, ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
- ์ฑ๋ฅ: ๋ง์ ์ ๋ชฉ์ด ์์ ๊ฒฝ์ฐ, ๋ ๋๋ง ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
์๋ ๊ธ ๋ชฉ๋ก ์์ฑ์ ์ํด JavaScript ์ฌ์ฉ์
์ฅ์
- ๊ฒฝ๋ํ: ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์์ JavaScript๋ก ์์ฑ๋์ด ๊ฐ๋ณ์ต๋๋ค.
- ์ ์ด์ฑ: ์ฝ๋์ ๋ชจ๋ ๋ถ๋ถ์ ์ง์ ๊ด๋ฆฌํ ์ ์์ด ํ์ํ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ: ๊ฐ๋จํ ๊ตฌ์กฐ์์๋ ์ฑ๋ฅ์ด ๋ ๋์ ์ ์์ต๋๋ค.
๋จ์
- ์ ์ง ๊ด๋ฆฌ: ์ ๋ชฉ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฝ๋ ์์ ์ ํ์๋ก ํ๋ฉฐ, ๋ ๋ง์ ์์์ ์ด ์๊ตฌ๋ฉ๋๋ค.
- ์ ํ์ ๊ธฐ๋ฅ: ๋ณต์กํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ์ฝ๋ ์์ฑ์ด ํ์ํฉ๋๋ค.
๊ฐ๋จํ ๋ธ๋ก๊ทธ: ์ ๋ชฉ์ด ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒฝ์ฐ๋ ๋จ์ํ ๋ธ๋ก๊ทธ๋ผ๋ฉด Vanilla JavaScript ๋ฐฉ๋ฒ์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
๋ณต์กํ ์ฝํ ์ธ : ์ ๋ชฉ์ด ์์ฃผ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ, jQuery TOC ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ ๋๋ค.