국기 콤보 ISO 데이터 기준으로 만들어 보자.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>전체 ISO 국기 콤보박스</title>
<style>
body{
margin:0;
padding:40px;
background:#edf2f7;
font-family:Arial, sans-serif;
}
.flag-combo{
position:relative;
width:360px;
user-select:none;
}
.flag-selected{
display:flex;
align-items:center;
justify-content:space-between;
background:white;
border:1px solid #ccc;
border-radius:14px;
padding:12px 14px;
cursor:pointer;
box-shadow:0 4px 10px rgba(0,0,0,0.08);
}
.flag-left{
display:flex;
align-items:center;
gap:12px;
}
.flag-left img,
.flag-option img{
width:42px;
height:28px;
object-fit:cover;
border-radius:4px;
border:1px solid #ddd;
}
.flag-arrow{
transition:0.2s;
}
.flag-combo.open .flag-arrow{
transform:rotate(180deg);
}
.flag-options{
position:absolute;
width:100%;
background:white;
margin-top:8px;
border-radius:14px;
overflow:hidden;
box-shadow:0 10px 25px rgba(0,0,0,0.15);
display:none;
z-index:100;
max-height:420px;
overflow-y:auto;
}
.flag-option{
display:flex;
align-items:center;
gap:12px;
padding:12px 14px;
cursor:pointer;
transition:0.15s;
}
.flag-option:hover{
background:#f3f7fd;
}
.result{
margin-top:30px;
width:360px;
background:white;
border-radius:18px;
padding:20px;
box-shadow:0 4px 10px rgba(0,0,0,0.08);
}
.result img{
width:240px;
margin-top:10px;
border-radius:10px;
border:1px solid #ddd;
}
.result h2{
margin:0;
}
.result p{
color:#666;
font-size:18px;
}
</style>
</head>
<body>
<div id="countryCombo"></div>
<div class="result">
<h2 id="resultName"></h2>
<img id="resultImg">
<p id="resultISO"></p>
</div>
<script>
/* =========================================
ISO 국가 전체 데이터
========================================= */
const isoCountryList = [
["AF","아프가니스탄"],
["AL","알바니아"],
["DZ","알제리"],
["AD","안도라"],
["AO","앙골라"],
["AR","아르헨티나"],
["AM","아르메니아"],
["AU","호주"],
["AT","오스트리아"],
["AZ","아제르바이잔"],
["BH","바레인"],
["BD","방글라데시"],
["BY","벨라루스"],
["BE","벨기에"],
["BZ","벨리즈"],
["BJ","베냉"],
["BT","부탄"],
["BO","볼리비아"],
["BA","보스니아 헤르체고비나"],
["BW","보츠와나"],
["BR","브라질"],
["BN","브루나이"],
["BG","불가리아"],
["BF","부르키나파소"],
["BI","부룬디"],
["KH","캄보디아"],
["CM","카메룬"],
["CA","캐나다"],
["CL","칠레"],
["CN","중국"],
["CO","콜롬비아"],
["CR","코스타리카"],
["HR","크로아티아"],
["CU","쿠바"],
["CY","키프로스"],
["CZ","체코"],
["DK","덴마크"],
["DO","도미니카공화국"],
["EC","에콰도르"],
["EG","이집트"],
["SV","엘살바도르"],
["EE","에스토니아"],
["ET","에티오피아"],
["FI","핀란드"],
["FR","프랑스"],
["GE","조지아"],
["DE","독일"],
["GH","가나"],
["GR","그리스"],
["GT","과테말라"],
["HT","아이티"],
["HN","온두라스"],
["HK","홍콩"],
["HU","헝가리"],
["IS","아이슬란드"],
["IN","인도"],
["ID","인도네시아"],
["IR","이란"],
["IQ","이라크"],
["IE","아일랜드"],
["IL","이스라엘"],
["IT","이탈리아"],
["JM","자메이카"],
["JP","일본"],
["JO","요르단"],
["KZ","카자흐스탄"],
["KE","케냐"],
["KW","쿠웨이트"],
["KG","키르기스스탄"],
["LA","라오스"],
["LV","라트비아"],
["LB","레바논"],
["LY","리비아"],
["LT","리투아니아"],
["LU","룩셈부르크"],
["MO","마카오"],
["MG","마다가스카르"],
["MY","말레이시아"],
["MV","몰디브"],
["MX","멕시코"],
["MD","몰도바"],
["MC","모나코"],
["MN","몽골"],
["ME","몬테네그로"],
["MA","모로코"],
["MM","미얀마"],
["NP","네팔"],
["NL","네덜란드"],
["NZ","뉴질랜드"],
["NG","나이지리아"],
["KP","북한"],
["MK","북마케도니아"],
["NO","노르웨이"],
["OM","오만"],
["PK","파키스탄"],
["PA","파나마"],
["PY","파라과이"],
["PE","페루"],
["PH","필리핀"],
["PL","폴란드"],
["PT","포르투갈"],
["QA","카타르"],
["RO","루마니아"],
["RU","러시아"],
["SA","사우디아라비아"],
["RS","세르비아"],
["SG","싱가포르"],
["SK","슬로바키아"],
["SI","슬로베니아"],
["ZA","남아프리카공화국"],
["KR","대한민국"],
["ES","스페인"],
["LK","스리랑카"],
["SE","스웨덴"],
["CH","스위스"],
["SY","시리아"],
["TW","대만"],
["TH","태국"],
["TR","튀르키예"],
["UA","우크라이나"],
["AE","아랍에미리트"],
["GB","영국"],
["US","미국"],
["UY","우루과이"],
["UZ","우즈베키스탄"],
["VE","베네수엘라"],
["VN","베트남"],
["YE","예멘"],
["ZM","잠비아"],
["ZW","짐바브웨"]
];
/* =========================================
객체 데이터 생성
========================================= */
const countryData = isoCountryList.map(item => {
return {
iso : item[0],
name : item[1],
img :
`https://flagcdn.com/w320/${item[0].toLowerCase()}.png`
};
});
/* =========================================
국기 콤보 생성 함수
========================================= */
function createFlagCombo({
targetId,
data,
defaultISO = "KR",
onChange = null
}){
const target = document.getElementById(targetId);
const combo = document.createElement("div");
combo.className = "flag-combo";
combo.innerHTML = `
<div class="flag-selected">
<div class="flag-left"></div>
<div class="flag-arrow">▼</div>
</div>
<div class="flag-options"></div>
`;
target.appendChild(combo);
const selected = combo.querySelector(".flag-selected");
const left = combo.querySelector(".flag-left");
const options = combo.querySelector(".flag-options");
/* 선택 */
function selectItem(item){
left.innerHTML = `
<img src="${item.img}">
<span>${item.name}</span>
`;
combo.dataset.iso = item.iso;
if(onChange){
onChange(item);
}
}
/* 옵션 */
data.forEach(item => {
const option = document.createElement("div");
option.className = "flag-option";
option.innerHTML = `
<img src="${item.img}">
<span>${item.name} (${item.iso})</span>
`;
option.addEventListener("click", () => {
selectItem(item);
options.style.display = "none";
combo.classList.remove("open");
});
options.appendChild(option);
});
/* 열기 닫기 */
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(".flag-combo")){
options.style.display = "none";
combo.classList.remove("open");
}
});
/* 기본값 */
const defaultItem =
data.find(x => x.iso === defaultISO)
|| data[0];
selectItem(defaultItem);
/* API */
return {
getValue(){
return combo.dataset.iso;
},
setValue(iso){
const item =
data.find(x => x.iso === iso);
if(item){
selectItem(item);
}
}
};
}
/* =========================================
실행
========================================= */
const combo = createFlagCombo({
targetId : "countryCombo",
data : countryData,
defaultISO : "KR",
onChange : (item) => {
document.getElementById("resultName")
.textContent = item.name;
document.getElementById("resultImg")
.src = item.img;
document.getElementById("resultISO")
.textContent =
`ISO CODE : ${item.iso}`;
console.log(item);
}
});
</script>
</body>
</html>'Software > JavaScript' 카테고리의 다른 글
| Javascript 시작하기 - 원소주기표 (0) | 2026.11.02 |
|---|---|
| Javascript 시작하기 - 오셀로 (0) | 2026.10.28 |
| Javascript 시작하기 - 벽돌깨기 (0) | 2026.10.27 |
| Javascript 시작하기 - 1024 게임 (0) | 2026.10.26 |
| Javascript 시작하기 - 지뢰찾기 (0) | 2026.10.24 |
