ํด๋ฆญํ์ ๋ ํ์ ๋ฉ๋ด๊ฐ ํ๋์ฉ ๋ํ๋๋ ์ฌ์ด๋ ๋ฉ๋ด๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ๋ฉ๋ด๋ค์ด 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๋ฅผ ๊ณต๋ถํ๊ณ ์ด๋ฆฌ์ ๋ฆฌ ์ ์ฉํด๋ณด๊ณ ์๋ ๋จ๊ณ๋ผ์, ํจ์จ์ ์ด๊ฒ ์ฌ์ฉํ ๊ฒ ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ทธ๋๋ ๋ถ๋ช ํ ๊ฒ์ ํ์คํ ์คํ์ผ๋ ๋ชจ๋ํ ํ๋ฉด์ ์ ์ ํ๋ก์ ํธ๊ฐ ์ปค์ง๊ณ ์์ ๊ณผ ์ถ๊ฐ๊ฐ ๋์ด๋ ์๋ก ์ฅ์ ์ด ๋ช ํํด์ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
'๊ฐ๋ฐ ๐พ > Playground' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํคํจ๋๋ก ๋น๋ฐ๋ฒํธ ์ ๋ ฅํ๊ธฐ (HTML+SASS+JavaScript) (2) | 2021.07.08 |
---|---|
javascript ์คํฌ๋กค ์ํ๋ฐ ๋ง๋ค๊ธฐ (window / div) (2) | 2021.07.01 |
[html, css, javascript] ์ฌ์ฌํด์ ๋ง๋ค์ด๋ณธ ๋ฉ์ธ ํ๋ฉด ํจ๊ณผ (0) | 2021.02.06 |