[HTML/CSS] CSS ํ์ ์ ๋๋ฉ์ด์ ๋ง๋ค๊ธฐ
์์ ์จ๊น ๋ฐฉ์ ์ฐจ์ด์
๋ ๋ ํธ๋ฆฌ | ๋ฆฌํ๋ก์ฐ | ๋ฆฌํ์ธํธ | ์ด๋ฒคํธ ํธ๋ค๋ฌ | DOM ํธ๋ฆฌ | |
`display: none` | ์ ์ธ | ๋ฐ์ | ๋ฐ์ | ๋นํ์ฑ | ์ ์ง |
`visibility: hidden` | ์ ์ง | ๋ฐ์ ์ํจ | ๋ฐ์ | ๋นํ์ฑ | ์ ์ง |
`opacity: 0` | ์ ์ง | ๋ฐ์ ์ํจ | ๋ฐ์ | ํ์ฑ | ์ ์ง |
display: none
- ๋ ๋ ํธ๋ฆฌ : ์ ์ธ
- ๋ฆฌํ๋ก์ฐ : ๋ฐ์ (๋ ๋ํธ๋ฆฌ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ผ๋ฏ๋ก)
- ๋ฆฌํ์ธํธ : ๋ฐ์ (๋ฆฌํ๋ก์ฐ ๋ฐ์์ ๋ฆฌํ์ธํธ๋ ํจ๊ป ๋ฐ์)
- ์ด๋ฒคํธ ํธ๋ค๋ฌ : ๋นํ์ฑ
- DOM ํธ๋ฆฌ : ์ ์ง (์๋ฐ์คํฌ๋ฆฝํธ๋ก ์กฐ์ ๊ฐ๋ฅ)
visibility: hidden
- ๋ ๋ ํธ๋ฆฌ : ์ ์ง (ํ๋ฉด์์ ์๋ณด์ด์ง๋ง ๊ณต๊ฐ์ ์ฐจ์งํจ)
- ๋ฆฌํ๋ก์ฐ : ๋ฐ์ ์ํจ (๋ ์ด์์์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฏ๋ก)
- ๋ฆฌํ์ธํธ : ๋ฐ์ (์์๊ฐ ๋ณด์ด์ง ์๋๋ก ๋ณ๊ฒฝํ์ผ๋ฏ๋ก)
- ์ด๋ฒคํธ ํธ๋ค๋ฌ : ๋นํ์ฑ
- DOM ํธ๋ฆฌ : ์ ์ง (์๋ฐ์คํฌ๋ฆฝํธ๋ก ์กฐ์ ๊ฐ๋ฅ)
opacity: 0
- ๋ ๋ ํธ๋ฆฌ : ์ ์ง
- ๋ฆฌํ๋ก์ฐ : ๋ฐ์ ์ํจ (๋ ์ด์์์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฏ๋ก)
- ๋ฆฌํ์ธํธ : ๋ฐ์ (ํฌ๋ช ๋๊ฐ ๋ณ๊ฒฝ๋์ผ๋ฏ๋ก)
- ์ด๋ฒคํธ ํธ๋ค๋ฌ : ํ์ฑ
- DOM ํธ๋ฆฌ : ์ ์ง (์๋ฐ์คํฌ๋ฆฝํธ๋ก ์กฐ์ ๊ฐ๋ฅ)
ํ์ ์ ๋๋ฉ์ด์ ๊ตฌํ
HTML ๊ธฐ๋ณธ ๊ตฌ์กฐ
<button class="open-popup-btn">ํ์
์ฐฝ ์ด๊ธฐ</button>
<div class="popup">
<h2>ํ์
Window</h2>
<button>๋ฒํผ1</button>
<button>๋ฒํผ2</button>
<button>๋ฒํผ3</button>
</div>
๋ฐฉ๋ฒ 1 | display: none ์ฌ์ฉ
โถ `.popup` ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด์ด์ง ์๋๋ก ์ค์ . `display: none;` ์์ฑ์ ๋ฐ์ค๊ฐ ์์ฑ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ๋ ์ฐจ์งํ์ง ์๋๋ค.
.popup {
display: none;
}
โท ๋ฒํผ์ ํด๋ฆญํ๋ฉด `.visible` ํด๋์ค ์ถ๊ฐํ๋๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฑ
const openBtn = document.querySelector(".open-popup-btn");
const popup = document.querySelector(".popup");
openBtn.addEventListener("click", () => {
if (!popup.classList.contains("visible")) {
popup.classList.add("visible");
} else {
popup.classList.remove("visible");
}
});
โธ `.visible` ํด๋์ค ์คํ์ผ ์ค์
`transform: translatey(...)`๋ฅผ ์ค์ ํ๋ฉด ์ ๋ ฅํ ๊ฐ์ y์ถ๋ถํฐ ์๋ก ์ฌ๋ผ์ค๋ ํจ๊ณผ๋ฅผ ๋ธ๋ค. ํ์ ์ฐฝ์ด ์ ์ ์ปค์ง๋ ํจ๊ณผ๋ฅผ ๋ด๋ ค๋ฉด 0%(from)์ผ ๋ `height: 0%` ์์ฑ์ ์ฃผ๋ฉด ๋๋ค. opacity๋ ํฌ๋ช ๋ ์ค์ . 0์ ์์ ํฌ๋ช , 1์ ๋ถํฌ๋ช (ํฌ๋ช ๋ ์์)์ด๋ฏ๋ก ์์ ํฌ๋ช (from)ํ๋ค๊ฐ ์ ์ ๋ถํฌ๋ช (to)์ผ๋ก ๋ณํ๋ค.
@keyframes popup {
0% {
opacity: 0;
transform: translatey(50%);
}
100% {
opacity: 1;
transform: none;
}
}
.popup.visible {
background: #f8f1e7;
position: absolute;
bottom: 0;
width: 350px;
height: 350px;
border: 1px solid black;
border-radius: 20px 20px 0 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
animation: popup 0.5s ease-in-out;
}
โน ํ์ ์ฐฝ์ด ์ฌ๋ผ์ง ๋๋ ํจ๊ณผ๋ฅผ ์ฃผ๊ณ ์ถ๋ค๋ฉด JS๋ฅผ ์๋์ฒ๋ผ ์์ . ํ์ ์ฐฝ์ด ์ฌ๋ผ์จ ์ํ(`visible` ํด๋์ค ์ถ๊ฐ ์ํ)์์ ๋ฒํผ์ ๋๋ฅด๋ฉด `.disappear` ํด๋์ค๊ฐ ์ถ๊ฐ๋๊ณ 400ms ํ์ `.visible` ํด๋์ค๊ฐ ์ฌ๋ผ์ง๋ค. `display: none` ์ํ์ผ ๋ transition ์์ฑ์ด ์ ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ `.disappear` ํด๋์ค๋ฅผ ๋ฐ๋ก ์ถ๊ฐํด์ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ๋จผ์ ๋ณด์ฌ์ค ํ ์ผ์ ์๊ฐ ์ดํ `display: none` ์์ฑ์ด ์ ์ฉ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ.
const openBtn = document.querySelector(".open-popup-btn");
const popup = document.querySelector(".popup");
openBtn.addEventListener("click", () => {
if (!popup.classList.contains("visible")) {
popup.classList.remove("disappear");
popup.classList.add("visible");
} else {
popup.classList.add("disappear");
setTimeout(() => popup.classList.remove("visible"), 400);
}
});
`.popup.disappear`ํด๋์ค์ ๋ํ ์คํ์ผ๋ ์ค์ ํด์ผ ํ๋ค. animation ์์ฑ์ผ๋ก ์ค์ ํ ์๋ ์์ง๋ง, ์๋์ฒ๋ผ width ๊ฐ์ ํ์
์ฐฝ ํฌ๊ธฐ์ ๋์ผํ๊ฒ, height๋ 0, transition ๊ฐ์ ์ฃผ๋ฉด ์๋๋ก ์ค๋ฅด๋ฅต ์ฌ๋ผ์ง๋ ํจ๊ณผ๋ฅผ ๋ธ๋ค. width ๊ฐ๋ 0์ผ๋ก ์ฃผ๋ฉด ์์ ๋จํ์ฒ๋ผ ํ ๊ณณ์ผ๋ก ์ ๋ ค์ ์ฌ๋ผ์ง๋ค.
transition์ `all` ์์ฑ์ width, height ํฌ๊ธฐ ๋ณํ์ ๋ชจ๋ transition ํจ๊ณผ๋ฅผ ์ค๋ค. width ํน์ height๋ง ์
๋ ฅํด์ ํด๋น ํฌ๊ธฐ ๋ณํ์ ๋ํด์๋ง ํจ๊ณผ๋ฅผ ์ค ์๋ ์๋ค. `transition: all 0.5s ease-in-out` ์์ฑ์ hover ํจ๊ณผ๋ฅผ ์ ์ง์ ์ผ๋ก ํ์ํ๊ณ ์ถ์ ๋๋ ์ ์ฉํ๋ค.
.popup.disappear {
width: 350px;
height: 0;
transition: all 0.5s ease-in-out;
}
๋ฐฉ๋ฒ 2 | visibility: hidden ์ฌ์ฉ
๋ถ๋ชจ ์์ ํน์ ๋ทฐํฌํธ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋์ด๊ฐ ๋์ ์ด๋ผ๋ฉด height ๋์ max-height๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค
visibility: hidden
์์ฑ์ ์ฌ์ฉํด๋ ํ๋ฉด์์ ์ฌ๋ผ์ง์ง๋ง, display: none
๊ณผ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ค๋ ๊ฒ. ๋ฐ๋ผ์ ํ์
์ฐฝ์ด ์ฌ๋ผ์ค์ง ์์๋์ ๊ธฐ๋ณธ height๋ 0px๋ก ์ค์ ํด๋๋ค. visibility ์์ฑ์ ์ฌ์ฉํ๋ฉด animation์ ์ฐ์ง ์๊ณ transition๋ง ์ฌ์ฉํด๋ ๋น์ทํ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
.popup {
visibility: hidden;
background: #f8f1e7;
position: absolute;
bottom: 0;
width: 350px;
height: 0px; /* max-height: 0px */
border: 1px solid black;
border-radius: 20px 20px 0 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
transition: all 0.5s ease-in-out;
}
.popup.visible {
visibility: visible;
height: 350px; /* max-height: 350px */
}
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ visible ํด๋์ค๊ฐ ์ถ๊ฐ/์ญ์ ๋๋ toggle๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
const openBtn = document.querySelector(".open-popup-btn");
const popup = document.querySelector(".popup");
openBtn.addEventListener("click", () => {
popup.classList.toggle("visible");
});
ํจ๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ GIF
์ฝ๋ํ
See the Pen ํ์ ์ฐฝ ์ ๋๋ฉ์ด์ css by ColorFilter (@colorfilter) on CodePen.
์ฐธ๊ณ ๊ธ
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[React] ๋ฆฌ์กํธ์์ SVG ์ฌ์ฉ๋ฒ
[React] ๋ฆฌ์กํธ์์ SVG ์ฌ์ฉ๋ฒ
2024.04.25 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ์ค๋ณต ์์ ์ ๊ฑฐ ๋ฐฉ๋ฒ ๋ชจ์
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ์ค๋ณต ์์ ์ ๊ฑฐ ๋ฐฉ๋ฒ ๋ชจ์
2024.04.25 -
[HTML/CSS] ์์ดํฐ ์ฌํ๋ฆฌ์์ ์ ๋ ฅ์ฐฝ ์๋ํ๋ ๋ฐฉ์ง
[HTML/CSS] ์์ดํฐ ์ฌํ๋ฆฌ์์ ์ ๋ ฅ์ฐฝ ์๋ํ๋ ๋ฐฉ์ง
2024.04.25 -
[HTML/CSS] ์ค๋ฐ๊ฟ(๊ฐํ๋ฌธ์) ํ์ / ๋์น๋ ํ ์คํธ ์๋ต ๊ธฐํธ ํ์ ๋ฐฉ๋ฒ
[HTML/CSS] ์ค๋ฐ๊ฟ(๊ฐํ๋ฌธ์) ํ์ / ๋์น๋ ํ ์คํธ ์๋ต ๊ธฐํธ ํ์ ๋ฐฉ๋ฒ
2024.04.25