DOM- DropDown ์‹ค์Šต

Taehee Kimยท2022๋…„ 5์›” 16์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
9/17
post-thumbnail

๐Ÿ“Ž (๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ)์ „์ฒด ์ฝ”๋“œ

const contSelect = document.querySelector('.cont-select');
const btnSelect = document.querySelector('.btn-select');
const listMember = document.querySelector('.list-member');
const option = document.querySelectorAll('.opt-member');

// ํ† ๊ธ€๋ฒ„ํŠผ์ด ํด๋ฆญ --> ๋ฉ”๋‰ด ๋ณด์ธ๋‹ค 

btnSelect.addEventListener('click', function(){
    listMember.classList.toggle('show');
    btnSelect.classList.toggle('on');
})

btnSelect.addEventListener('blur', function(){
    listMember.classList.remove('show');
    btnSelect.classList.remove('on');
})

option.forEach(function(item){
    item.addEventListener('mousedown',function(e){
        const value = e.currentTarget.textContent;
        btnSelect.textContent = value;
        btnSelect.classList.add('selected-style')

    })
})

blur์™€ click์˜ ์ด์Šˆ

  • blur: focus๊ฐ€ ํ•ด์ œ๋˜๋Š” ์ˆœ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ์œ„ ์ฝ”๋“œ์—์„œ๋Š” btnSelect๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์— ํด๋ฆญ์œผ๋กœ ํฌ์ปค์Šค๊ฐ€ ์˜ฎ๊ฒจ์ง€๋Š” ์ˆœ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. ํฌ์ปค์Šค๋Š” document ์–ด๋””๋ฅผ ํด๋ฆญํ•˜๊ฒŒ ๋˜์–ด๋„ ํ•ด์ œ๋œ๋‹ค.
  • ์ฒ˜์Œ์—๋Š” mousedown ๋Œ€์‹  click ์ด๋ฒคํŠธ๋กœ ๋ฒ„ํŠผ์˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋„๋ก ์‹์„ ์„ธ์› ๋‹ค. ๊ทธ๋Ÿฌ์ž ๋“œ๋กญ๋‹ค์šด ๋ฐ–์˜ ๊ณต๊ฐ„์„ ํด๋ฆญํ•˜๋ฉด class show๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๋“œ๋กญ๋‹ค์šด๋„ ๋‹ซํžˆ์ง€ ์•Š๋Š”๋‹ค.
  • ์›์ธ์€ ๋ฐ”๋กœ ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์ˆœ์„œ๊ฐ€ blur > click์ด์–ด์„œ ํ™”๋ฉด์„ ํด๋ฆญํ•ด๋„ btnSelect์— ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

mousedown, mousdeup, click, blur์˜ ๊ด€๊ณ„

๋†€๋ž๊ฒŒ๋„ ์ด ๋„ค ๊ฐœ์˜ ์ด๋ฒคํŠธ์—๋Š” ๊ด€๊ณ„๊ฐ€ ์–ฝํ˜€์žˆ๋‹ค.
1) mousedown + mouseup = click๊ณผ ๊ฐ™๋‹ค.
2) ์‹คํ–‰ ์šฐ์„ ์ˆœ์œ„: mousedown > blur > mouseup > click

ํ•ด๊ฒฐ

  • click ์ด๋ฒคํŠธ๋ฅผ mousedown์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๐Ÿ“Ž ์žฌํ˜„๋‹˜์˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ

  1. ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ, e.target.textConten๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, textContent๋Š” ์ด๋ฒคํŠธ์˜ ํƒ€๊ฒŸ์˜ ์ž์‹์š”์†Œ์˜ ๋ชจ๋“  ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์ž„ํ•  ๋•Œ, ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, event.target.nodeName == 'BUTTON'์ฒ˜๋Ÿผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

  2. js๋กœ ์ง์ ‘ style ์ง€์ •ํ•˜์ง€ ๋ง๊ธฐ, ๋‚˜์ค‘์— css๋กœ ์Šคํƒ€์ผ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง
    css ์Šคํƒ€์ผ์„ JS๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๋„ฃ๋Š” ๊ฒฝ์šฐ์™€ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ์ด ์—†์„ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  style์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž. ์ฆ‰, class๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ง€์šฐ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค

  1. ์žฌํ˜„๋‹˜์ด creatElement๋กœ JS๋ฅผ ํ†ตํ•ด ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ด์œ ๋Š” ๋‚˜์ค‘์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ๋–„, ์ˆ˜์ •์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ HTML๋กœ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ณ ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€/๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜์ง€ ์•Š๋‹ค.
const btn = document.querySelector('.btn-select');
const list = document.querySelector(".list-member");

const arrLang = ['Python','Java','JavaScript','C#','C/C++'];

// ์ž์Šค๋กœ ์š”์†Œ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ 
//๋ฐฑ์—”๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ฉด(์ง€๊ธˆ์€ arrLang ๋ฐฐ์—ด) ๋ฐ์ด๋‚˜๋‚˜ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•  ๋–„๊ฐ€ ์ƒ๊ธธ ์ผ์ด ๋นˆ๋ฒˆํ•œ๋ฐ, html๋กœ ๋ฐ•์•„๋†“์œผ๋ฉด staticํ•ด์ ธ์„œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ ์š”์†Œ๋ฅผ JS๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž„.

arrLang.forEach((item)=> {
    const li = document.createElement('li');
    const btn = document.createElement('button');

    btn.setAttribute('type','button');
    //<button type = "button"></button>
    btn.textContent = item;
    // btn.classList.add('') = btn.setAttribute('class','');
    li.appendChild(btn);
    list.appendChild(li);
});

btn.addEventListener('click', () => {
    btn.classList.toggle('on');
});

list.addEventListener('click', (event) => {
    if (event.target.nodeName === 'BUTTON') {
        btn.textContent = event.target.textContent;
        btn.classList.remove('on');
    }
});

0๊ฐœ์˜ ๋Œ“๊ธ€