๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ํ”„๋ก ํŠธ์—”๋“œ/JavaScript

[๊ณต์œ ] ํ‹ฐ์Šคํ† ๋ฆฌ ์ž๋™ ๋ชฉ์ฐจ ๋งŒ๋“ค๊ธฐ, ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ์ž๋™ ๋ชฉ์ฐจ ์ƒ์„ฑ ๋ฐฉ๋ฒ•, ๋ชฉ์ฐจ ๋„ค๋น„๊ฒŒ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ (์™„์ „ ์‰ฌ์›€ ์ดˆ๋ณด์ž ๊ฐ€๋Šฅ)

by OR15A 2023. 12. 9.

ํ‹ฐ์Šคํ† ๋ฆฌ ๋ชฉ์ฐจ ๋„ค๋น„๊ฒŒ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ(ver_1) by LabMate

  • ๋งค์šฐ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค
  • ๊ฐ ํ‹ฐ์Šคํ† ๋ฆฌ์˜ ํ…Œ๋งˆ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก css์— ์ฃผ์„์„ ๋‹ฌ์•„๋‘์—ˆ์Šต๋‹ˆ๋‹ค
  • ๋„ค๋น„๊ฒŒ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ์ค€
    • ๊ธ€ ์ž‘์„ฑ์—์„œ ์ œ๋ชฉ1(h1), ์ œ๋ชฉ2(h2), ์ œ๋ชฉ3(h3) ์ด๊ฑฐ๋‚˜
    • blockquote(๊ทธ ์ค‘์—์„œ data-ke-style="style2"์ธ ๊ฒƒ) ์ž…๋‹ˆ๋‹ค
    • ๋„ค๋น„๊ฒŒ์ดํ„ฐ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค
  • ๊ฐ ๋ชฉ์ฐจ๋ณ„ ๋ ˆ๋ฒจ์€ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋™์ผ ๋ ˆ๋ฒจ์ž…๋‹ˆ๋‹ค
  • ๊ถ๊ธˆํ•œ ์ ์€ ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์„ธ์š”

 


 

์ ์šฉ ๊ฒฐ๊ณผ (์šฐ์ธก ๋„ค๋น„๊ฒŒ์ดํ„ฐ)

์ž๋™๋ชฉ์ฐจ ์ƒ์„ฑ ๊ฒฐ๊ณผ
๋ธ”๋กœ๊ทธ ํ…Œ๋งˆ์— ๋งž๊ฒŒ ์ƒ‰์ƒ ์ง€์ •๋„ ๊ฐ€๋Šฅ

  • ๊ธ€์ž๋ฅผ ๋ˆ„๋ฅด๋ฉด ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
  • ์Šคํฌ๋กค์„ ๋‚ด๋ ค๋„ ๋”ฐ๋ผ๋‹ค๋‹™๋‹ˆ๋‹ค




 

์„ค์ • ์ „ ํ‹ฐ์Šคํ† ๋ฆฌ ์Šคํ‚จ ์ •๋ณด

  • Book club ์Šคํ‚จ์„ ์ ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

  • ๊ธ€ ํŽ˜์ด์ง€์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปฌ๋Ÿฌ๋‚˜ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค

 
 

์ ์šฉ ๋ฐฉ๋ฒ•

1. ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธ€ ๊ด€๋ฆฌ > ์Šคํ‚จํŽธ์ง‘ > htmlํŽธ์ง‘

 

 

2. /head ํƒœ๊ทธ๋ฅผ ์ฐพ๊ณ  ๊ทธ ์œ„์— ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค

<style>

    /*๋ณธ๋ฌธ๊ณผ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ๊ฐ์‹ธ๋Š” div*/
    .parent-flex-navigator {
        display: flex;
    }


    /*๋ชฉ์ฐจ ๋„ค๋น„๊ฒŒ์ดํ„ฐ css*/
    #tag-navigation {
        flex-basis: 20%;
        background-color: white;
        border: solid 3px #F5F5F5; /*F5๋Š” ํšŒ์ƒ‰, #bcdafa๋Š” ํ•˜๋Š˜์ƒ‰ ํŒŒ์Šคํ…”ํ†ค*/
        position: fixed;
        top: 50px; /*์ƒ๋‹จ ๊ณ ์ •๊ฐ’*/
        right: 0; /*์šฐ์ธก ๊ณ ์ • ๊ฐ’*/
        margin-right: 50px;
        margin-top: 50px;
        width: 180px; /*๋„ค๋น„๊ฒŒ์ดํ„ฐ ๋„ˆ๋น„ ๊ฐ’*/
        padding: 10px;
        font-size: 0.8rem; /*๊ธ€์ž ํฌ๊ธฐ*/
        z-index: 9999; /* ๋‹ค๋ฅธ ์š”์†Œ๋ณด๋‹ค ์œ„์— ์˜ฌ๋ฆผ */
    }

    /*li ํƒœ๊ทธ์˜ ๋™๊ทธ๋ผ๋ฏธ ์—†์• ๊ธฐcss*/
    #tag-navigation a li {
        list-style-type: none;
    }

</style>

 
 

3. html์†Œ์Šค์—์„œ ctrl+f๋ฅผ ๋ˆŒ๋Ÿฌ์„œ div class="content-wrap" ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค

 

  • ๊ทธ ํƒœ๊ทธ์˜ ๋ฐ”๋กœ ์œ„ divํƒœ๊ทธ์— class="parent-flex-navigator"๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค

 
 

4. ์Šคํฌ๋กค์„ ์ญ‰ ๋‚ด๋ ค์„œ ์•„๋ž˜์—์„œ /body ํƒœ๊ทธ๋ฅผ ์ฐพ๊ณ  ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค

<script>
    /*
    * ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ '๊ธ€' ํ˜•์‹์ผ ๋•Œ๋งŒ ๋„ค๋น„๊ฒŒ์ดํ„ฐ ํ‘œ์‹œํ•˜๊ธฐ
    * */

    // ํ˜„์žฌ ํŽ˜์ด์ง€์˜ URL
    let currentUrl = window.location.href;

    // ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธ€ ํŽ˜์ด์ง€ URL ํŒจํ„ด: ์ˆซ์ž๋งŒ ์žˆ๋Š” ํŒจํ„ด
    let postPagePattern = /^https:\/\/labmate-dev\.tistory\.com\/\d+$/;

    // ๊ธ€์ผ ๊ฒฝ์šฐ์—์—
    if (postPagePattern.test(currentUrl)) {
        //๋„ค๋น„๊ฒŒ์ดํ„ฐ div๋งŒ๋“ค๊ธฐ
        makeNaviDiv();

        //ํ•ด๋‹น div ์•ˆ์— ๋งํฌํƒœ๊ทธ ๋งŒ๋“ค๊ธฐ
        fillTagNavigationDiv();

        //๋„ค๋น„๊ฒŒ์ดํ„ฐ ๋‚ด์šฉ๋ฌผ์ด ์—†์„ ๊ฒฝ์šฐ ์ˆจ๊ธฐ๊ธฐ
        hideNaviDiv();

    } else {

        //์Šคํ‚จ ํŽธ์ง‘ํ•  ์ผ ์žˆ์„ ๋•Œ ์•„๋ž˜ ์ฃผ์„ ํ’€๊ณ  css ๋“ฑ์„ ๊ณ ์น˜์„ธ์š”!
    /*    //๋„ค๋น„๊ฒŒ์ดํ„ฐ div๋งŒ๋“ค๊ธฐ
        makeNaviDiv();
        //ํ•ด๋‹น div ์•ˆ์— ๋งํฌํƒœ๊ทธ ๋งŒ๋“ค๊ธฐ
        fillTagNavigationDiv();*/
    }



    /*
    * ๋„ค์ด๊ฒŒ์ดํ„ฐ div ๋งŒ๋“ค๊ธฐ
    * */
    function makeNaviDiv() {

        // <div class="content-wrap"> ํƒœ๊ทธ ๊ฐ€์ ธ์˜ค๊ธฐ
        let contentWrap = document.querySelector('.content-wrap');


        if (contentWrap) {
            // <div id="tag-navigation" class="tag-navigation"> ํƒœ๊ทธ ์ƒ์„ฑ
            let tagNavigationDiv = document.createElement('div');
            tagNavigationDiv.id = 'tag-navigation';
            tagNavigationDiv.className = 'tag-navigation';

            // <div class="content-wrap"> ํƒœ๊ทธ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€
            contentWrap.appendChild(tagNavigationDiv);
        }
    }



    /*
    * div ํƒœ๊ทธ ์ฑ„์šฐ๊ธฐ
    * ์กฐ๊ฑด : ๋ณธ๋ฌธ์—์„œ ์ œ๋ชฉ1(h1), ์ œ๋ชฉ2(h2), ์ œ๋ชฉ3(h3), ์ œ๋ชฉ1(h1), blockquote(๊ทธ ์ค‘์—์„œ data-ke-style="style2"์ธ ๊ฒƒ)
    * */
    function fillTagNavigationDiv() {
        // contents_style ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ div ์š”์†Œ ์„ ํƒ
        let contentsDiv = document.querySelector('.contents_style');


        // h1, h2, h3, blockquote ํƒœ๊ทธ๋“ค์„ ์„ ํƒ
        let headingsAndBlockquotes = contentsDiv.querySelectorAll('h1, h2, h3, blockquote');

        // ์ฐพ์€ ํƒœ๊ทธ๋“ค ์œ„์—์„œ๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋งํฌ ๋งŒ๋“ค๊ธฐ. <a><li></li></a> ํ˜•ํƒœ๋กœ ๋งŒ๋“ค ์˜ˆ์ •
        headingsAndBlockquotes.forEach(function (element, index) {

            //๋งํฌ๋“ค์ด ๋“ค์–ด๊ฐˆ div
            let naviDivElement = document.getElementById('tag-navigation');

            // ๊ฐ ์š”์†Œ์˜ ํ…์ŠคํŠธ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ
            let textContent = element.textContent.trim();

            // ์š”์†Œ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด ๋งํฌ ์•ˆ๋งŒ๋“ฆ
            if (textContent == "") {
                return;
            }

            // blockquote ํƒœ๊ทธ์ธ ๊ฒฝ์šฐ data-ke-style ๊ฐ’ ํ™•์ธ
            if (element.tagName == 'BLOCKQUOTE') {
                let dataKeyStyle = element.getAttribute('data-ke-style');
                if (dataKeyStyle !== 'style2') {
                    return; // data-ke-style์ด style2๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฑด๋„ˆ๋œ€
                }
            }

            // ๋ชฉ์ฐจ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๊ธฐ
            let listItem = document.createElement('li');  //<li></li>
            let link = document.createElement('a');   //<a></a>
            link.href = '#navipass-' + index;
            listItem.textContent = textContent;

            // ๋งํฌ ์•„๋ž˜ ์—ฌ๋ฐฑ ์ฃผ๊ธฐ (๋งˆ์ง€๋ง‰ ์š”์†Œ ๋นผ๊ณ )
            listItem.style.marginBottom = '10px';
            if (index == headingsAndBlockquotes.length - 1) {
                listItem.style.marginBottom = '0px';
            }

            link.appendChild(listItem);       //๊ฒฐ๊ณผ:      <a><li></li></a>
            naviDivElement.appendChild(link); //๊ฒฐ๊ณผ: <div><a><li></li></a></div>

            // ๊ฐ ์š”์†Œ์— ๊ณ ์œ ํ•œ ID ๋ถ€์—ฌ
            element.id = 'navipass-' + index;
        });
    }


    // ์š”์†Œ ์—†๋Š” div ์ˆจ๊ธฐ๊ธฐ
    function hideNaviDiv() {
        // #tag-navigation ๋‚ด๋ถ€์˜ <a> ํƒœ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธ
        let linkCount = $("#tag-navigation a").length;

        // ๋งŒ์•ฝ <a> ํƒœ๊ทธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด #tag-navigation๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค.
        if (linkCount === 0) {
            $("#tag-navigation").hide();
        }
    }


</script>

 
 

5. [์ ์šฉ] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

 
 

6. ๋””์ž์ธ์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

  • ์ŠคํŠธ๋ฆฝํŠธ์—์„œ ์•„๋ž˜ ๋ถ€๋ถ„ ์ฃผ์„์„ ํ’€๊ณ  ์™ผ์ชฝ ํ™”๋ฉด์˜ [์ƒˆ๋กœ๊ณ ์นจ]์„ ๋ˆ„๋ฅด๊ณ 

  • ์ƒ๋‹จ์˜ css๋ถ€๋ถ„์„ ๊ณ ์นฉ๋‹ˆ๋‹ค

  • ์ƒ์ž ์ƒ‰๊น” background-color
  • ํ…Œ๋‘๋ฆฌ border
  • ๊ทธ ์™ธ์—๋„ ๊ธ€์ž ์ƒ‰๊น”, ํ…Œ๋‘๋ฆฌ ๋‘ฅ๊ธ€๋ฆฌ๊ธฐ, ์œ„์น˜ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

 

๊ด€๋ จ ๊นƒ ๋งํฌ