국기 콤보 만들어보자.

 

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>국기 이미지 콤보박스</title>

<style>
    body{
        margin:0;
        height:100vh;
        display:flex;
        justify-content:center;
        align-items:center;
        background:#eef3f8;
        font-family:Arial, sans-serif;
    }

    .card{
        width:360px;
        background:white;
        padding:25px;
        border-radius:20px;
        box-shadow:0 10px 25px rgba(0,0,0,0.15);
    }

    h2{
        margin-top:0;
        text-align:center;
    }

    .combo{
        position:relative;
        user-select:none;
    }

    .selected{
        display:flex;
        align-items:center;
        justify-content:space-between;
        padding:12px;
        border:1px solid #ccc;
        border-radius:12px;
        cursor:pointer;
        background:white;
        transition:0.2s;
    }

    .selected:hover{
        border-color:#4a90ff;
    }

    .selected-left{
        display:flex;
        align-items:center;
        gap:12px;
    }

    .selected img,
    .option img{
        width:40px;
        height:28px;
        object-fit:cover;
        border-radius:4px;
        border:1px solid #ddd;
    }

    .arrow{
        font-size:18px;
        transition:0.2s;
    }

    .combo.open .arrow{
        transform:rotate(180deg);
    }

    .options{
        position:absolute;
        width:100%;
        margin-top:8px;
        background:white;
        border-radius:12px;
        overflow:hidden;
        box-shadow:0 8px 20px rgba(0,0,0,0.15);
        display:none;
        z-index:100;
    }

    .option{
        display:flex;
        align-items:center;
        gap:12px;
        padding:12px;
        cursor:pointer;
        transition:0.15s;
    }

    .option:hover{
        background:#f1f5fb;
    }

    .preview{
        margin-top:25px;
        text-align:center;
    }

    .preview img{
        width:220px;
        border-radius:12px;
        border:2px solid #ddd;
        box-shadow:0 6px 15px rgba(0,0,0,0.15);
        transition:0.2s;
    }

    .country{
        margin-top:15px;
        font-size:28px;
        font-weight:bold;
    }
</style>
</head>
<body>

<div class="card">

    <h2>🌍 국기 선택</h2>

    <div class="combo" id="combo">

        <div class="selected" id="selected">

            <div class="selected-left" id="selectedLeft"></div>

            <div class="arrow">▼</div>

        </div>

        <div class="options" id="options"></div>

    </div>

    <div class="preview">
        <img id="previewImg">
        <div class="country" id="countryName"></div>
    </div>

</div>

<script>
/* =========================
   국기 데이터 배열
========================= */
const flagList = [

    {
        code : "kr",
        name : "대한민국",
        img  : "https://flagcdn.com/w320/kr.png"
    },

    {
        code : "us",
        name : "미국",
        img  : "https://flagcdn.com/w320/us.png"
    },

    {
        code : "jp",
        name : "일본",
        img  : "https://flagcdn.com/w320/jp.png"
    },

    {
        code : "cn",
        name : "중국",
        img  : "https://flagcdn.com/w320/cn.png"
    },

    {
        code : "fr",
        name : "프랑스",
        img  : "https://flagcdn.com/w320/fr.png"
    },

    {
        code : "gb",
        name : "영국",
        img  : "https://flagcdn.com/w320/gb.png"
    }

];

/* =========================
   요소
========================= */
const combo        = document.getElementById("combo");
const selected     = document.getElementById("selected");
const selectedLeft = document.getElementById("selectedLeft");
const options      = document.getElementById("options");

const previewImg   = document.getElementById("previewImg");
const countryName  = document.getElementById("countryName");

/* =========================
   선택 표시 함수
========================= */
function setSelected(item){

    selectedLeft.innerHTML = `
        <img src="${item.img}">
        <span>${item.name}</span>
    `;

    previewImg.src = item.img;
    countryName.textContent = item.name;

    previewImg.style.transform = "scale(1.05)";

    setTimeout(() => {
        previewImg.style.transform = "scale(1)";
    }, 150);
}

/* =========================
   옵션 생성
========================= */
flagList.forEach(item => {

    const div = document.createElement("div");

    div.className = "option";

    div.innerHTML = `
        <img src="${item.img}">
        <span>${item.name}</span>
    `;

    div.addEventListener("click", () => {

        setSelected(item);

        options.style.display = "none";

        combo.classList.remove("open");
    });

    options.appendChild(div);

});

/* =========================
   콤보 열기/닫기
========================= */
selected.addEventListener("click", () => {

    const isOpen = options.style.display === "block";

    options.style.display = isOpen ? "none" : "block";

    combo.classList.toggle("open");

});

/* =========================
   외부 클릭시 닫기
========================= */
document.addEventListener("click", (e) => {

    if(!e.target.closest(".combo")){

        options.style.display = "none";

        combo.classList.remove("open");
    }

});

/* =========================
   기본 선택
========================= */
setSelected(flagList[0]);

</script>

</body>
</html>

+ Recent posts