๋ฐ˜์‘ํ˜•

ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์˜ <select> ๋“œ๋กญ๋‹ค์šด ์•„์ด์ฝ˜
์‚ฌํŒŒ๋ฆฌ ๋ธŒ๋ผ์šฐ์ €์˜ <select> ๋“œ๋กญ๋‹ค์šด ์•„์ด์ฝ˜

<select> ์š”์†Œ๋Š” <option>๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์˜ต์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋“œ๋กญ๋‹ค์šด์„ ํ‘œ์‹œํ•œ๋‹ค. <select> ์šฐ์ธก์— ์žˆ๋Š” ๋“œ๋กญ๋‹ค์šด ํ™”์‚ดํ‘œ ์•„์ด์ฝ˜์€ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์Šคํƒ€์ผ์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ค. ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €์—์„œ๋“  ๋˜‘๊ฐ™์€ ์•„์ด์ฝ˜์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด background ์Šคํƒ€์ผ ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

<!-- ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉํ•  HTML ๋งˆํฌ์—… -->
<label for="select-device">Select your device</label>
<select id="select-device">
  <option value="apple">Apple</option>
  <option value="oppo">Oppo</option>
  <option value="xiaomi">Xiaomi</option>
</select>

 

appearance ์†์„ฑ ์ˆ˜์ •


appearance CSS ์†์„ฑ์€ ์šด์˜์ฒด์ œ์˜ ํ…Œ๋งˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” UI ์ปจํŠธ๋กค์˜ ๊ธฐ๋ณธ ์™ธํ˜•(appearance)์„ ์ œ์–ดํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. appearance: none ์†์„ฑ์„ ์ ์šฉํ•˜๋ฉด input progress ๋“ฑ์˜ ์š”์†Œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๋Š” ์Šคํƒ€์ผ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค. select ์š”์†Œ์— ์‚ฌ์šฉํ•˜๋ฉด ์šฐ์ธก ํ™”์‚ดํ‘œ ์•„์ด์ฝ˜์ด ์‚ฌ๋ผ์ง„๋‹ค.

select[id="select-device"] {
  height: 2.5rem;
  width: 10rem;
  padding: 0 0.5rem;
  color: black;
  border: 1px solid lightgray;

  -moz-appearance: none; /* Firefox */
  -webkit-appearance: none; /* Safari and Chrome */
  appearance: none;
}

 

<select> ์š”์†Œ์— appearance: none ์†์„ฑ์„ ์ ์šฉํ•œ ํ™”๋ฉด. ์šฐ์ธก ํ™”์‚ดํ‘œ๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค.

 

background ์†์„ฑ ์ˆ˜์ •


background-image ์†์„ฑ์„ ์ด์šฉํ•ด <select> ํƒœ๊ทธ์˜ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ํ™”์‚ดํ‘œ ์•„์ด์ฝ˜์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

select[id="select-device"] {
  background-image: url("https://img.icons8.com/ios-filled/50/sort-down.png");
  background-repeat: no-repeat;
  background-position: 96% center;
  background-size: 1rem;
}

 

<select> ์š”์†Œ ๋ฐฐ๊ฒฝ์— ํ™”์‚ดํ‘œ ์ด๋ฏธ์ง€๋ฅผ ์ ์šฉํ•œ ํ™”๋ฉด

background-image : ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ์ง€์ •

background-image: none | url | initial | inherit

 

  • none : ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ — ๊ธฐ๋ณธ๊ฐ’
  • url : ์ด๋ฏธ์ง€ url ์ž…๋ ฅ
  • initial : ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
  • inherit : ๋ถ€๋ชจ ์š”์†Œ์˜ ์†์„ฑ๊ฐ’ ์ƒ์†

 

url() ํ•จ์ˆ˜์— ์ž…๋ ฅํ•œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. url() ํ•จ์ˆ˜์—” ์ƒ๋Œ€๊ฒฝ๋กœ, ์ ˆ๋Œ€๊ฒฝ๋กœ, blob URL, data URL์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ๋Œ€๊ฒฝ๋กœ๋Š” ํ˜„์žฌ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœํ•˜๋ฉฐ, ๊ฒฝ๋กœ ๊ฐ€์žฅ ์•ž์— ์Šฌ๋ž˜์‹œ / ๋ฅผ ๋ถ™์ด๋ฉด ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ง€์ •๋œ๋‹ค.

  • ์ƒ๋Œ€๊ฒฝ๋กœ : background-image: url('../assets/icons/arrow-down.svg')
  • ์ ˆ๋Œ€๊ฒฝ๋กœ : background-image: url('/src/assets/icons/arrow-down.svg')
  • ์ผ๋ฐ˜ URL : background-image: url('https://...')
  • dataURL : background-image: url('data:image/png;base64,iVBORw...')

 

background-repeat : ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ๋ฐ˜๋ณต ์—ฌ๋ถ€์™€ ๋ฐ˜๋ณต ๋ฐฉํ–ฅ ์ง€์ •

background-repeat: repeat | repeat-x | repeat-y | no-repeat | inherit

 

  • repeat : ๊ฐ€๋กœ ๋ฐฉํ–ฅ, ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ˜๋ณต — ๊ธฐ๋ณธ๊ฐ’
  • repeat-x : ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ˜๋ณต
  • repeat-y : ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ˜๋ณต
  • no-repeat : ๋ฐ˜๋ณต ์•ˆํ•จ
  • initial : ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
  • inherit : ๋ถ€๋ชจ ์š”์†Œ์˜ ์†์„ฑ๊ฐ’ ์ƒ์†

 

๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ผ์ชฝ ์œ„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๊ฐ€๋กœ, ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์š”์†Œ๋ฅผ ์ฑ„์šธ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ๋‚˜์˜จ๋‹ค. ๋ฐ˜๋ณต ์—†์ด ์ด๋ฏธ์ง€๊ฐ€ 1๋ฒˆ๋งŒ ๋‚˜์˜ค๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด no-repeat ์†์„ฑ๊ฐ’์„ ์ฃผ๋ฉด ๋œ๋‹ค. 

 

background-position : ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์˜ ์ƒ๋Œ€ ์œ„์น˜ ์ง€์ •

background-position: x-position y-position | initial | inherit

 

  • x-position y-position : ๊ฐ€๋กœ ์œ„์น˜์™€ ์„ธ๋กœ ์œ„์น˜ ์ง€์ • — ๊ธฐ๋ณธ๊ฐ’ 0% 0%
  • initial : ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
  • inherit : ๋ถ€๋ชจ ์š”์†Œ์˜ ์†์„ฑ๊ฐ’ ์ƒ์†

 

์œ„์น˜ ๊ฐ’์œผ๋กœ ์ƒ์ˆ˜(left, right ๋“ฑ), ๋ฐฑ๋ถ„์œจ(%), ๊ธธ์ด(px, rem, em ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ€๋กœ ์œ„์น˜ ๊ฐ’ : left, right, center, %, length
  • ์„ธ๋กœ ์œ„์น˜ ๊ฐ’ : top, bottom, center, %, length

 

background-size : ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์˜ ๊ฐ€๋กœ, ์„ธ๋กœ ํฌ๊ธฐ ์ง€์ •

background-size: auto | length | cover | contain | initial | inherit

 

  • auto : ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์œ ์ง€ — ๊ธฐ๋ณธ๊ฐ’
  • length : ๊ฐ’์„ 2๊ฐœ ๋„ฃ์œผ๋ฉด 1๋ฒˆ์งธ๋Š” ๊ฐ€๋กœ, 2๋ฒˆ์งธ๋Š” ์„ธ๋กœ ํฌ๊ธฐ๋กœ ์ง€์ •๋จ. ๊ฐ’์„ 1๊ฐœ๋งŒ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ๊ฐ’์€ ๊ฐ€๋กœ ํฌ๊ธฐ๋กœ ์ง€์ •๋˜๊ณ , ์„ธ๋กœ ํฌ๊ธฐ๋Š” ๋น„์œจ์— ๋งž๊ฒŒ ์ž๋™ ์กฐ์ •๋จ. ๋ฐฑ๋ถ„์œจ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • cover : ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์š”์†Œ๋ฅผ ์ฑ„์šธ๋•Œ๊นŒ์ง€ ํ™•๋Œ€ / ์ถ•์†Œ
  • contain : ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์š”์†Œ๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๋กœ ํ™•๋Œ€ / ์ถ•์†Œ. ์ด๋ฏธ์ง€์™€ ์š”์†Œ์˜ ๋น„์œจ์ด ๋งž์ง€ ์•Š๋‹ค๋ฉด ๋นˆ ๊ณต๊ฐ„์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ. 
  • initial : ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
  • inherit : ๋ถ€๋ชจ ์š”์†Œ์˜ ์†์„ฑ๊ฐ’ ์ƒ์†

 

๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ๊ด€๋ จ ์†์„ฑ์€ background ์†์„ฑ์— ์ถ•์•ฝํ˜•์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. position๊ณผ size๋Š” ๊ฐ™์€ ๋‹จ์œ„๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ์Šฌ๋ž˜์‹œ / ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. size๋งŒ ์‚ฌ์šฉํ•  ๋•Œ๋„ position ๊ฐ’์„ ํ•„์ˆ˜์ ์œผ๋กœ ๋ช…์‹œํ•ด์•ผ ๋œ๋‹ค.

background: [image] [repeat] [position] [size]

select[id="select-device"] {
  background: url("...") no-repeat 96% center / 1rem;
}

 

์š”์†Œ ํด๋ฆญ์‹œ ํ™”์‚ดํ‘œ ํšŒ์ „


<select> ์š”์†Œ ํด๋ฆญ ์‹œ 180๋„ ํšŒ์ „๋œ ํ™”์‚ดํ‘œ ์•„์ด์ฝ˜์ด ํ‘œ์‹œ๋˜๊ณ  ์žˆ๋‹ค

๐Ÿ’ก :focus ์˜์‚ฌ ํด๋ž˜์Šค๋Š” ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜๋Š” ์š”์†Œ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) โ‘ input ์š”์†Œ ํด๋ฆญ, โ‘ก๋ฒ„ํŠผ/์•ต์ปค ํด๋ฆญ, โ‘ขํ‚ค๋ณด๋“œ ํƒญ(Tab)ํ‚ค์— ์˜ํ•ด ์š”์†Œ ์ดˆ์ ์„ ๋งž์ท„์„ ๋•Œ

 

:focus ์˜์‚ฌ ํด๋ž˜์Šค(Pseudo Class)๋Š” ํฌ์ปค์Šค๋ฅผ ๋ฐ›์€ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์š”์†Œ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํƒญ ํ‚ค๋กœ ์„ ํƒํ–ˆ์„ ๋•Œ ํ™œ์„ฑํ™”(ํฌ์ปค์Šค)๋œ๋‹ค. :focus ์˜์‚ฌ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ํŠน์ • ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ 180๋„ ํšŒ์ „ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

select[id="select-device"]:focus {
  transform: rotate(180deg);
}

 

ํ•˜์ง€๋งŒ select ์š”์†Œ์˜ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ์ž์ฒด๋ฅผ ํ™”์‚ดํ‘œ ์•„์ด์ฝ˜์œผ๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์—” ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜๋ฉด select ์š”์†Œ ์ „์ฒด๊ฐ€ 180๋„ ํšŒ์ „ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

<select> ์š”์†Œ ์ „์ฒด๊ฐ€ 180๋„ ํšŒ์ „๋œ ํ™”๋ฉด

์œ„ ๋ฐฉ๋ฒ• ๋Œ€์‹  ํฌ์ปค์Šค๋ฅผ ๋ฐ›์•˜์„ ๋•Œ 180๋„ ํšŒ์ „ํ•œ ํ™”์‚ดํ‘œ ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ๊ต์ฒดํ•˜๋ฉด ๋œ๋‹ค. ํฌ์ปค์Šค๋ฅผ ๋ฐ›๊ธฐ ์ „์—” ...sort-down.png ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํฌ์ปค์Šค๋ฅผ ๋ฐ›์€ ํ›„์—” ...sort-up.png ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹.

select[id="select-device"]:focus {
  background: url("https://img.icons8.com/ios-filled/50/sort-up.png") no-repeat
    96% 50% / 1rem;
}

 

์ฝ”๋“œํŽœ ์˜ˆ์‹œ


See the Pen change select arrow style by ColorFilter (@colorfilter) on CodePen.

 

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•