๊ฐœ๋ฐœ ๐Ÿพ/Playground

ํ•˜๋‚˜์”ฉ ๋‚˜ํƒ€๋‚˜๋Š” ํ€ต ๋ฉ”๋‰ด ๋งŒ๋“ค๊ธฐ (SCSS & CSS)

JOTOKKI 2021. 7. 12. 14:50
728x90

ํด๋ฆญํ–ˆ์„ ๋•Œ ํ•˜์œ„ ๋ฉ”๋‰ด๊ฐ€ ํ•˜๋‚˜์”ฉ ๋‚˜ํƒ€๋‚˜๋Š” ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

๊ฒฐ๊ณผ ํ™”๋ฉด
๊ตฌ์กฐ ์žก๊ธฐ

 

์ฒซ ๋ฒˆ์งธ๋Š” ๋ฉ”๋‰ด๋“ค์ด TOP์—์„œ 50ํ”ฝ์…€ ์ •๋„ ์œ„๋กœ ๊ฐ€์žˆ๊ณ  opacity๊ฐ€ 0์ด๋ผ ์˜์—ญ์€ ์žˆ์ง€๋งŒ ๋ณด์ด์ง€ ์•Š๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. 

๋งŒ์•ฝ display none์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ™œ์„ฑํ™”ํ•  ๋•Œ์—๋Š” display block ํ›„ top๊ณผ opacity์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋„๋ก ํ•ด์•ผ ๋ชจ์…˜์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. 

 

๋‘ ๋ฒˆ์งธ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฉ”๋‰ด์— ์„œ๋ธŒ ๋ฉ”๋‰ด๋“ค์ด ๊ฒน์ณ์žˆ๋Š”๋ฐ ํ•˜์œ„ ๋ฉ”๋‰ด๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ฉ”๋‰ด์˜ zIndex๊ฐ€ ๋‚ฎ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ๋’ค๋กœ ๊ฐ€๋ ค์ ธ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ™œ์„ฑํ™”๊ฐ€ ๋˜๋ฉด ๊ฐ ๋ฉ”๋‰ด๋ณ„๋กœ left๊ฐ’์„ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

๋จผ์ € ๋งˆํฌ์—…์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

<div class="wrap">
	<div class="menu">
		<button class="menuItem">Menu</button>
		<ul class="submenu">
			<li class="subItem"><a href="#">sub1</a></li>
			<li class="subItem"><a href="#">sub2</a></li>
			<li class="subItem"><a href="#">sub3</a></li>
			<li class="subItem"><a href="#">sub4</a></li>
		</ul>
	</div>
	
	<hr style="margin:20px 0; "/>

	<div class="menu2">
		<button class="menuItem">Menu2</button>
		<ul class="submenu2">
			<li class="submenu2Item"><a href="#">sub1</a></li>
			<li class="submenu2Item"><a href="#">sub2</a></li>
			<li class="submenu2Item"><a href="#">sub3</a></li>
			<li class="submenu2Item"><a href="#">sub4</a></li>
		</ul>
	</div>
</div>

์‚ฌ์‹ค ์ €๋ ‡๊ฒŒ ๊ตณ์ด submenu๋ฅผ ํ•œ ๋ฒˆ๋„ ๊ฐ์‹ธ์ฃผ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ, ์ˆ˜์ •๊ณผ ๋ณ€ํ™”๊ฐ€ ๋งŽ์€ ํ”„๋กœ์ ํŠธ๋“ค์„ ํ•˜๋‹ค ๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทธ๋ฃน์œผ๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์€ ๊ผญ ํ•œ ๋ฒˆ์”ฉ ๊ฐ์‹ธ์ฃผ๊ฒŒ ๋˜๋”๋ผ๊ณ ์š”.  

 

์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ€๋ชจ์—๊ฒŒ active ํด๋ž˜์Šค๋ฅผ toggle ์‹œ์ผœ์ฃผ๋Š” ๊ฑฐ๋ผ ์–ด๋ ต์ง„ ์•Š์Šต๋‹ˆ๋‹ค. 

let items = document.querySelectorAll('.menuItem');
items.forEach(function(item){
	item.addEventListener('click', function(){
		let parent = item.parentNode;
		if(parent.classList.contains('active')) {
			parent.classList.remove('active');
		} else {
			parent.classList.add('active');
		}
	})
})

๊ทธ๋ฆฌ๊ณ  ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

SCSS๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•˜์˜€๊ณ , SASSํ™˜๊ฒฝ์ด ์•„๋‹ ์ˆ˜ ๋„ ์žˆ์–ด์„œ CSS๋„ ๊ฐ™์ด ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. 

 

$size: 50px;
@function submenuWidth(){
    @return $size + 10px;
};
@function getLeft($index){
    @return ($index - 1) * ($size + 10);
};
@function getDelay($index) {
    @return ($index / 10) + s;
};
/* ์—ฌ๊ธฐ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์•„์š” start */
*,
body { margin: 0; padding: 0; font-size: 13px; color: #333; font-family: "๋‚˜๋ˆ”๊ณ ๋”•", NanumGothic;}
a { display: block; text-decoration: none; color: #333; width: inherit; height: inherit;}
ul { list-style-type: none;}
button { border: 0 none; cursor: pointer;  }
.wrap { width: calc(100% - 100px); margin: 50px;}
/* ์—ฌ๊ธฐ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์•„์š” end */
.menuCommon {
    position: relative; 
    width: 100%; 
}
.menuItemCommon {
    width: $size; 
    height: $size;
    background: pink; 
    display: inline-block; 
    text-align: center;
}
.submenuCommon {
    position: absolute; 
    z-index: 1; 
}
.subItemCommon {
    position: absolute; 
    z-index: 1; 
    width: $size; 
    height: $size; 
    background: rgb(163, 163, 163);
    text-align: center; 
}
.menu { 
    @extend .menuCommon;
    .menuItem {
        @extend .menuItemCommon;
    }
    .submenu  {
        @extend .submenuCommon;
        top: 0; 
        left: submenuWidth(); 
        .subItem {
            @extend .subItemCommon;
            top: -50px; 
            opacity: 0; 
            transition: 0.4s ease-in;
            @for $i from 1 through 4 {
                &:nth-child(#{$i}) {
                    left: getLeft($i);
                }
            }
        }
    }
    &.active {
        .subItem {
           top: 0;
           opacity: 1; 
            @for $i from 1 through 4 {
                &:nth-child(#{$i}) {
                    transition-delay: getDelay($i);
                }
            }
        }
    }
}

.menu2 { 
    @extend .menuCommon;
    .menuItem {
        @extend .menuItemCommon;
    }
    .submenu2  {
        @extend .submenuCommon;
        top: 0; 
        left: 0; 
        z-index: -1;
        .submenu2Item {
            @extend .subItemCommon;
            top: 0; 
            left: 0;
            transition: 0.1s;
        }
    }
    &.active {
        .submenu2 {
            left: submenuWidth(); 
            z-index: 1;
            .submenu2Item {
                @for $i from 1 through 4 {
                     &:nth-child(#{$i}) {
                         left: getLeft($i);
                         z-index: $i;
                     }
                 }
             }
        }
    }
}

๋ถ€๋ชจ์— active๊ฐ€ ๋ถ™์—ˆ์„ ๋•Œ์— ๋‚˜๋จธ์ง€ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

์ฒซ ๋ฒˆ์งธ subItem์—๋Š” top์˜ ๊ฐ’์ด ๋ชจ๋‘ 0์ด ๋˜์ง€๋งŒ transition-delay๋ฅผ ํ†ตํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ๋”œ๋ ˆ์ด๋ฅผ ์ค๋‹ˆ๋‹ค. 

transition๊ฐ’์„ 0.1~0.4๋กœ ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 10/index๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋’ค์— ๊ผญ s(Second)๋ฅผ ๋ถ™์—ฌ์ฃผ์„ธ์š”!

 

๋‘ ๋ฒˆ์งธ subITem์—๋Š” ํ™œ์„ฑํ™” ์‹œ ๊ฐ๊ฐ์˜ ๋ฉ”๋‰ด์— left ๊ฐ’์„ ์ ์šฉํ•˜๋Š”๋ฐ, 1~4๋ฒˆ์งธ index๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ 

($width + ๊ฐ„๊ฒฉ) * (index -1) ๋งŒํผ ๋ฆฌํ„ดํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ SCSS์™€ Javascript์˜ ๋‹ค๋ฅธ ์  ์ค‘ ํ•˜๋‚˜๋Š” index๊ฐ€ 0๋ฒˆ์ด ์•„๋‹ˆ๋ผ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

๊ฐ„ํ˜น ํ—ท๊ฐˆ๋ฆฌ๋„ค์š”.. ๐Ÿ˜ฃ

@charset "UTF-8";
/* ์—ฌ๊ธฐ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์•„์š” start */
*,
body {
  margin: 0;
  padding: 0;
  font-size: 13px;
  color: #333;
  font-family: "๋‚˜๋ˆ”๊ณ ๋”•", NanumGothic;
}

a {
  display: block;
  text-decoration: none;
  color: #333;
  width: inherit;
  height: inherit;
}

ul {
  list-style-type: none;
}

button {
  border: 0 none;
  cursor: pointer;
}

.wrap {
  width: calc(100% - 100px);
  margin: 50px;
}

/* ์—ฌ๊ธฐ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์•„์š” end */
.menuCommon, .menu, .menu2 {
  position: relative;
  width: 100%;
}

.menuItemCommon, .menu .menuItem, .menu2 .menuItem {
  width: 50px;
  height: 50px;
  background: pink;
  display: inline-block;
  text-align: center;
}

.submenuCommon, .menu .submenu, .menu2 .submenu2 {
  position: absolute;
  z-index: 1;
}

.subItemCommon, .menu .submenu .subItem, .menu2 .submenu2 .submenu2Item {
  position: absolute;
  z-index: 1;
  width: 50px;
  height: 50px;
  background: #a3a3a3;
  text-align: center;
}

.menu .submenu {
  top: 0;
  left: 60px;
}

.menu .submenu .subItem {
  top: -50px;
  opacity: 0;
  transition: 0.4s ease-in;
}

.menu .submenu .subItem:nth-child(1) {
  left: 0px;
}

.menu .submenu .subItem:nth-child(2) {
  left: 60px;
}

.menu .submenu .subItem:nth-child(3) {
  left: 120px;
}

.menu .submenu .subItem:nth-child(4) {
  left: 180px;
}

.menu.active .subItem {
  top: 0;
  opacity: 1;
}

.menu.active .subItem:nth-child(1) {
  transition-delay: 0.1s;
}

.menu.active .subItem:nth-child(2) {
  transition-delay: 0.2s;
}

.menu.active .subItem:nth-child(3) {
  transition-delay: 0.3s;
}

.menu.active .subItem:nth-child(4) {
  transition-delay: 0.4s;
}

.menu2 .submenu2 {
  top: 0;
  left: 0;
  z-index: -1;
}

.menu2 .submenu2 .submenu2Item {
  top: 0;
  left: 0;
  transition: 0.1s;
}

.menu2.active .submenu2 {
  left: 60px;
  z-index: 1;
}

.menu2.active .submenu2 .submenu2Item:nth-child(1) {
  left: 0px;
  z-index: 1;
}

.menu2.active .submenu2 .submenu2Item:nth-child(2) {
  left: 60px;
  z-index: 2;
}

.menu2.active .submenu2 .submenu2Item:nth-child(3) {
  left: 120px;
  z-index: 3;
}

.menu2.active .submenu2 .submenu2Item:nth-child(4) {
  left: 180px;
  z-index: 4;
}

 

์•„์ง์€ ์ €๋„ SASS๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์ด๋ฆฌ์ €๋ฆฌ ์ ์šฉํ•ด๋ณด๊ณ  ์žˆ๋Š” ๋‹จ๊ณ„๋ผ์„œ, ํšจ์œจ์ ์ด๊ฒŒ ์‚ฌ์šฉํ•œ ๊ฒƒ ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ž˜๋„ ๋ถ„๋ช…ํ•œ ๊ฒƒ์€ ํ™•์‹คํžˆ ์Šคํƒ€์ผ๋„ ๋ชจ๋“ˆํ™” ํ•˜๋ฉด์„œ ์ ์  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ์ˆ˜์ •๊ณผ ์ถ”๊ฐ€๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์žฅ์ ์ด ๋ช…ํ™•ํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

 

 

๋ฐ˜์‘ํ˜•