๊ธฐ์กด์ ํฌ์คํ ๋์๋ ๊ธ ์ค select ํ๊ทธ ์ปค์คํ ํ๊ธฐ, ํน์ ์ง์ ๋ง๋ค๊ธฐ (feat. javascript)
์์ ์ ์ ์ธํ ๋ค๋ฅธ ๋ถ๋ถ์ ํด๋ฆญํ ๋ ๋ซํ๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์ง ์ง๋ฌธ์ ์ฃผ์ ์ ๋ฐ๋ก ๋ค๋ฃจ๋ฉด ์ข์ ๊ฒ ๊ฐ์ ์๋ก ํฌ์คํ ์ ํด๋ด ๋๋ค.
๊ผญ SelectBox์๋ง ์ฌ์ฉ๋๋๊ฒ ์๋๋ ์์๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๐ ์ฐธ๊ณ ๋ก ์ฌ๊ธฐ์ ์ง์นญํ๋ selectbox๋ html ํ๊ทธ๊ฐ ์๋๋ผ div๋ก ์ปค์คํฐ๋ง์ด์ง ๋ selectbox๋ฅผ ์๋ฏธํฉ๋๋ค.
๐ ๊ธฐ์กด ์์ค๋ฅผ ๋ณด์๋ฉด ์ดํดํ๊ธฐ ๋ ํธํ์ค ๊บผ์์.๐
์๋ฆฌ๋ window ์์ฒด์ addeventListener๋ฅผ ๋ฑ๋กํ๊ณ ํด๋ฆญ๋ event ๊ฐ์ ๋ฐ์์ ๋น๊ต๋ฅผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋ฆญ๋ event.target์ด Select ์์ ์ธ์ง ์๋์ง ๋น๊ตํ ๋ค ๋ณธ์ธ์ด ์๋๋ฉด Select๋ฅผ ๋ซ์์ฃผ๋ฉด ๋ฉ๋๋ค.
1. window ์ addeventListener ๊ฑธ๊ธฐ
window.addEventListener('click', e => ๋น๊ตํด์๋ซ์ํจ์(e))
2. ๋น๊ตํด์ Select๋ฅผ ๋ซ์์ฃผ๋ ํจ์ ๋ง๋ค๊ธฐ
e.target ์์ class๊ฐ์ ๊ฐ์ ธ์ label์ด๋ optionItem ์ ํด๋ฆญํ๋๊ฒฝ์ฐ๋ ๋ซํ๋ฉด ์๋๋๊น ์ด ๋๊ฐ์ง๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๋ฌด์กฐ๊ฑด Select๋ฅผ ๋ซ์์ฃผ๋ฉด ๋ฉ๋๋ค.
const handleClose = e => {
// select ๊ฐ ์๋๊ฒฝ์ฐ ๋ซ๊ธฐ
if(!e.target.classList.contains('label') && !e.target.classList.contains('optionItem')) {
label.forEach(function(lb){
lb.parentNode.classList.remove('active')
})
}
}
PLUS. ๋ฉํฐ selectbox์์ ๋ ์์ ์ด ์๋ ๊ฒฝ์ฐ์ ๋ซ๊ธฐ
์ถ๊ฐ์ ์ผ๋ก selectbox๊ฐ ์ฌ๋ฌ๊ฐ์ธ๊ฒฝ์ฐ์ ์์ค ์ฝ๋๋ ์ถ๊ฐ๋ฌ์๋๋ฐ,
์ด๋ selecbox๋ฅผ ์ด์ด๋์ ์ํ๋ก ๋ค๋ฅธ selectbox๋ฅผ ํด๋ฆญํ์๋ ๋ค๋ฅธ ์ด๋ ค ์๋ selectbox๋ฅผ ๋ซ์์ฃผ๋ ์ฝ๋๋ฅผ ๋ ์ถ๊ฐํด๋ณด์์ต๋๋ค. label์ forEach๋ก ๋๋ ค ํด๋ฆญ๋ label์ด ์๋๋ฉด ๋ถ๋ชจ๋ฅผ ์ฐพ์ active ํด๋์ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
const clickLabel = (lb, optionItems) => {
// ****************** ์ถ๊ฐ๋ ๋ถ๋ถ START
// ๋ด๊ฐ ์๋ ๋ค๋ฅธ select ๋ซ๊ธฐ
label.forEach(function(itemLb){
if(lb !== itemLb) {
itemLb.parentNode.classList.remove('active')
}
})
// ****************** ์ถ๊ฐ๋ ๋ถ๋ถ END
if(lb.parentNode.classList.contains('active')) {
lb.parentNode.classList.remove('active');
optionItems.forEach((opt) => {
opt.removeEventListener('click', () => {
handleSelect(lb, opt)
})
})
} else {
lb.parentNode.classList.add('active');
optionItems.forEach((opt) => {
opt.addEventListener('click', () => {
handleSelect(lb, opt)
})
})
}
}
์ต์ข ์ฝ๋
'๊ฐ๋ฐ ๐พ > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TODOLIST ๋ง๋ค๊ธฐ step by step - Vanilla JavaScript (0) | 2022.03.11 |
---|---|
๋ฆฌ์คํธ์ ์ ๋๋ฉ์ด์ ํจ๊ณผ์ฃผ๊ธฐ (0) | 2019.11.21 |
๋๋ค์ซ์๋ง๋ค๊ธฐ๊ฒ์ (0) | 2019.11.20 |
์๋์ผ๋ก ์์๋๋ก ์ซ์๊ฐ ๋ฃ์ด์ฃผ๊ธฐ - CSS counter (0) | 2019.11.12 |