5. Flex Panels ๐ช
์ด๊ธฐํ๋ฉด
๊ฐ ํจ๋ ํด๋ฆญ์
๊ฐ ํจ๋์ ํด๋ฆญ์์ ํ๋ฉด์ด ๋์ด์ง๊ณ , ์จ๊ฒจ์ ธ์๋ ๊ธ์จ๋ค๋ ์์์ ๋ด๋ ค์ค๊ณ , ๋ฐ์์ ์ฌ๋ผ์จ๋ค.
๊ธ์จ ํฌ๊ธฐ๋ ์ข ๋ ์ปค์ง๋ค.
1. ๋ชฉํ
CSS: flex๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฐ์ต : https://flexboxfroggy.com/#ko
JS: element class๋ฅผ ์คฌ๋ค ๋บ๋ค ํด์ css๋ฅผ ์กฐ์ํ ์ ์๋ค.
addEventListener()
, classList.toggle()
์ด์ฉ
2.์ ๋ฆฌ
1. flex
.panel: ๊ฐ๊ฐ์ panel์ ๋ํ style
.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๋ค์ ์ ๋ ฌ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๋ค.- row, column
justify-content
: flex์ ์ค์ฌ์ถ์ ์ ๋ ฌ๊ธฐ์ค์ ์ ํ๋ค.flex-direction
์ดrow
๋ฉด ๊ฐ๋ก๋ฐฉํฅ,column
๋ฉด ์ธ๋ก๋ฐฉํฅ- ์ ๊ทธ๋ฆผ์
flex-direction
:row
๊ธฐ์ค - center, flex-start, flex-end, stretch ...
align-items
: flex์ ๊ต์ฐจ์ถ์ ์ ๋ ฌ๊ธฐ์ค์ ์ ํ๋ค.flex-direction
์ดrow
๋ฉด ์ธ๋ก๋ฐฉํฅ,column
๋ฉด ๊ฐ๋ก๋ฐฉํฅ- ์ ๊ทธ๋ฆผ์
flex-direction
:row
๊ธฐ์ค - center, flex-start, flex-end, stretch ...
flex : 1
: ๊ฐ flex item์ด ์ฐจ์งํ๋ ๊ณต๊ฐ์ ๋น์จ(1)์ ์ค์
2. Element.classList.toggle(โํด๋น๊ฐโ)
ํด๋น element class์ ํด๋น๊ฐ์ด ์์ผ๋ฉด ์ถ๊ฐํ๊ณ , ์์ผ๋ฉด ์ญ์ ํด์ฃผ๋ ๋ฉ์๋.
CSS ์ ์ฐ๊ณํด์ ์์ฃผ ์ฌ์ฉํ๋ ๋ฏ ํ๋ค.
Javascript
// 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)
css
/* ์ ์๋ ๋ฌธ์์ด ์ฌ๋ ค์ง ์ํ์์ ํจ๋์ด ์ด๋ฆฌ๋ฉด ๋ด๋ฆฌ๊ธฐ*/
.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์ ์ฐ๊ณํ๋๋ฐ,
- addEventListener๋ก ํด๋ฆญ ์ toggle์ ํธ์ถํด์ ํด๋์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ์์ ์ฃผ๋ ๋์์ ์ถ๊ฐํ๋ค.
- ์ css ์ฝ๋๋ฅผ ๋ณด๋ฉด, open-active๊ฐ toggleํ ํด๋์ค๊ฐ์ผ๋ก ์ฐ์ด๊ณ ์๋ค.
- open-active๊ฐ ์์ผ๋ฉด ๊ธ์๋ฅผ ์จ๊ธฐ๊ณ , ์์ผ๋ฉด ๊ธ์๋ฅผ ๋ณด์ด๊ฒ ํ๋ค.
3. ๊ฒฐ๋ก
flex ์์ฃผ ๋งค๋ ฅ์ ์ด๋ค.
์ด ํ๋ก์ ํธ์์ ์ด ์คํฌ์ ํฌํธํด๋ฆฌ์ค ๋ง๋ค๋๋ ์ ์ฉํ ๋ฏ!
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(5. Flex Panels ๐ช), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@yogjin/5.-Flex-Panels์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค