TIL

๐Ÿช— ์•„์ฝ”๋””์–ธ ๋ฉ”๋‰ด ๋งŒ๋“ค๊ธฐ

grasinnong 2022. 10. 5. 02:57

 

 

 

 

์š”์•ฝ 

- .gnb-sub-wrap์— css๋ฅผ ์ค€๋‹ค. 

  max-height : 0;  overflow : hidden;  ์†์„ฑ์œผ๋กœ ์ปจํ…์ธ ๊ฐ€ ์•ˆ๋ณด์ด๋„๋ก

  transition : ๋ณด์—ฌ์งˆ ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ 

 

- gnb > li ๋ฅผ ํด๋ฆญํ•˜๋ฉด

  max-height ๊ฐ’ true  ? max-height : 0 : max-height : ์ปจํ…์ธ ์˜ ๋†’์ด

  

 

 

1. semantic html tag ์ž‘์„ฑ 

<nav> 
    <ul id="gnb">
        <li>๋ฉ”๋‰ด์†Œ๊ฐœ
            <ul class="gnb-sub-wrap">
                <li><a href="#">์ƒŒ๋“œ์œ„์น˜</a></li>
                <li><a href="#">์žฌ๋ฃŒ</a></li>
            </ul>
        </li>
        <li><a href="#">์ฃผ๋ฌธ์—ฐ์Šต</a></li>
        <li>๋žญํ‚น/๊ฒŒ์‹œํŒ
            <ul class="gnb-sub-wrap">
                <li><a href="#">๋žญํ‚น</a></li>
                <li><a href="#">๊ฒŒ์‹œํŒ</a></li>
   			</ul>
    	</li>
    	<li><a href="#">์ด๋ฒคํŠธ/๋‰ด์Šค</a></li>
    </ul>
</nav>

 

 

2. CSS ์ž‘์„ฑ 

#gnb > li:hover{
  cursor : pointer;
  background-color : skyblue;
}

#gnb .gnb-sub-wrap{
  max-height : 0;
  overflow : hidden;
  transition : max-height .3s ease-in-out;
}

 

1. max-height + overflow

-  max-height ์†์„ฑ์€ element์˜ ์ตœ๋Œ€ ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.

-  .gnb-sub-wrap ์ด ๋ณด์—ฌ์งˆ ๋•Œ, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด display ๋ณด๋‹ค max-height ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

-   overflow : hidden ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ height์„ ๋„˜๋Š” ๋‚ด์šฉ์€ ๋ณด์ด์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. 

 

2. transition : .gnb-sub-wrap์ด ๋ณด์—ฌ์งˆ ๋•Œ max-height์˜ ๋ณ€ํ™”์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค€๋‹ค. 

 

 

 

3. JS ์ž‘์„ฑ 

const $nav = document.querySelectorAll("#gnb > li");

$nav.forEach((list) => {
  list.addEventListener("click", function(){
    this.classList.toggle("open");
    const panel = this.children[0];
    if(panel.classList.contains("gnb-sub-wrap")){
      panel.style.maxHeight ? panel.style.maxHeight = null : panel.style.maxHeight = panel.scrollHeight + "px";
    }
  });
});

 

1. $nav ๋ณ€์ˆ˜์— #gnb > li ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ๊ฐ€์ ธ์™€ ๋‹ด์•„์ค€๋‹ค. 

 

2. li ๋“ค์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์ค€๋‹ค. 

   - ํด๋ฆญ ์‹œ classList.toggle("open")

   - #gnb > li ์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹์„ panel์— ๋‹ด๊ธฐ(a ํƒœ๊ทธ or .gnb-sub-wrap)

   - panel์ด gnb-sub-wrap ์ด๋ฉด maxHeight์„ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ(scrollHeight์€ ์š”์†Œ ์ปจํ…์ธ ์˜ ๋†’์ด = ํ˜„์žฌ ๋ณด์ด์ง€ ์•Š๋Š” ์ปจํ…์ธ ์˜ ์‹ค์ œ ๋†’์ด)