๊ฐ ํจ๋์ ํด๋ฆญ์์ ํ๋ฉด์ด ๋์ด์ง๊ณ , ์จ๊ฒจ์ ธ์๋ ๊ธ์จ๋ค๋ ์์์ ๋ด๋ ค์ค๊ณ , ๋ฐ์์ ์ฌ๋ผ์จ๋ค.
๊ธ์จ ํฌ๊ธฐ๋ ์ข ๋ ์ปค์ง๋ค.
CSS: flex๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฐ์ต : https://flexboxfroggy.com/#ko
JS: element class๋ฅผ ์คฌ๋ค ๋บ๋ค ํด์ css๋ฅผ ์กฐ์ํ ์ ์๋ค.
addEventListener()
, classList.toggle()
์ด์ฉ
.panel {
background: #6b0f9c;
box-shadow: inset 0 0 0 5px rgba(255, 255, 255, 0.1);
color: white;
text-align: center;
align-items: center;
/* Safari transitionend event.propertyName === flex */
/* Chrome + FF transitionend event.propertyName === flex-grow */
transition: font-size 0.7s cubic-bezier(0.61, -0.19, 0.7, -0.11),
flex 0.7s cubic-bezier(0.61, -0.19, 0.7, -0.11), background 0.2s;
font-size: 20px;
background-size: cover;
background-position: center;
flex: 1; /* ๊ฐ panel๋ค์ด ์ฐจ์งํ ๋น์จ์ ์ผ์ ํ๊ฒ. 1*/
display: flex;
flex-direction: column; /* flex ์ ์ฉ๋ฐฉํฅ: ์ธ๋ก*/
justify-content: center; /* flex ์์ ์ค์์ ๋ ฌ*/
}
display:flex
:ํด๋น element๋ฅผ flexํ ํ๋ค.flex-direction
: flex item๋ค์ ์ ๋ ฌ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๋ค.justify-content
: flex์ ์ค์ฌ์ถ์ ์ ๋ ฌ๊ธฐ์ค์ ์ ํ๋ค.flex-direction
์ด row
๋ฉด ๊ฐ๋ก๋ฐฉํฅ, column
๋ฉด ์ธ๋ก๋ฐฉํฅflex-direction
: row
๊ธฐ์คalign-items
: flex์ ๊ต์ฐจ์ถ์ ์ ๋ ฌ๊ธฐ์ค์ ์ ํ๋ค.flex-direction
์ด row
๋ฉด ์ธ๋ก๋ฐฉํฅ, column
๋ฉด ๊ฐ๋ก๋ฐฉํฅflex-direction
: row
๊ธฐ์คflex : 1
: ๊ฐ flex item์ด ์ฐจ์งํ๋ ๊ณต๊ฐ์ ๋น์จ(1)์ ์ค์ ํด๋น element class์ ํด๋น๊ฐ์ด ์์ผ๋ฉด ์ถ๊ฐํ๊ณ , ์์ผ๋ฉด ์ญ์ ํด์ฃผ๋ ๋ฉ์๋.
CSS ์ ์ฐ๊ณํด์ ์์ฃผ ์ฌ์ฉํ๋ ๋ฏ ํ๋ค.
// panel ํผ์น๊ธฐ
// Element.classList.toggle('string')
// <element class="string"> ํด๋์ค ๊ฐ ์ถ๊ฐ
function toggleOpen() {
this.classList.toggle('open');
}
// ๊ธ์ ๋ณด์ด๊ธฐ
// class: open-active์ถ๊ฐ
function toggleActive(e) {
// transition๋ฅผ ์ ์ฉํ ์์๊ฐ 2๊ฐ(font-size, flex-grow)์ด๊ธฐ ๋๋ฌธ์ ํ๋๋ง event๋ฅผ ์ ์ฉํด์ผํ๋ค
// this.classList.toggle('open-active');
if (e.propertyName == 'font-size') {
this.classList.toggle('open-active');
}
}
const panels = document.querySelectorAll('.panel');
// panel ํด๋ฆญ ์ ํผ์น๊ธฐ
panels.forEach((panel) => panel.addEventListener('click', toggleOpen));
// ๋ณํ๊ฐ ๋๋๋ฉด(transitionend), ์ ์๋ ๊ธ์จ๋ ๋ณด์ฌ์ฃผ๊ธฐ.
panels.forEach((panel) =>
panel.addEventListener('transitionend', toggleActive)
/* ์ ์๋ ๋ฌธ์์ด ์ฌ๋ ค์ง ์ํ์์ ํจ๋์ด ์ด๋ฆฌ๋ฉด ๋ด๋ฆฌ๊ธฐ*/
.panel > *:first-child {
transform: translateY(-100%);
}
.panel.open-active > *:first-child {
transform: translateY(0);
}
.panel > *:last-child {
transform: translateY(100%);
}
.panel.open-active > *:last-child {
transform: translateY(0);
}
classList.toggle()์ css์ ์ฐ๊ณํ๋๋ฐ,
flex ์์ฃผ ๋งค๋ ฅ์ ์ด๋ค.
์ด ํ๋ก์ ํธ์์ ์ด ์คํฌ์ ํฌํธํด๋ฆฌ์ค ๋ง๋ค๋๋ ์ ์ฉํ ๋ฏ!