๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ชฉ๋ก์ „์ฒด ๊ธ€ (34)

UI Code Lab

๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ UI ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ – ์‹ค์ „ ์‚ฌ๋ก€ ์ค‘์‹ฌ

์›น UI์—์„œ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ธํ„ฐํŽ˜์ด์Šค(Drag and Drop UI) ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ์ฒจ๋ถ€, ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ, ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹ค๋ฌด ์‚ฌ๋ก€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(Vanilla JavaScript)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์‹ค์ „ ์‚ฌ๋ก€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ UI๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. โœ… Gmail ์Šคํƒ€์ผ์˜ ํŒŒ์ผ ์ฒจ๋ถ€ ๋“œ๋กญ์กดโœ… TODO ์•ฑ์—์„œ ํ•  ์ผ ์ˆœ์„œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅโœ… ๋Œ€์‹œ๋ณด๋“œ ์œ„์ ฏ ์œ„์น˜ ์ด๋™ UI ๐Ÿ“‚ 1. ํŒŒ์ผ ์ฒจ๋ถ€ ๋“œ๋กญ์กด UI – Gmail ์Šคํƒ€์ผ ๊ตฌํ˜„ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” UI๋Š” ์ด๋ฉ”์ผ, ๊ฒŒ์‹œํŒ, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ..

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‚ ์งœ ์„ ํƒ๊ธฐ(Date Picker) ์ง์ ‘ ๋งŒ๋“ค๊ธฐ – ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿงญ ์™œ ์ง์ ‘ ๋‚ ์งœ ์„ ํƒ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ• ๊นŒ? ๋Œ€๋ถ€๋ถ„์˜ ์›น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‚ ์งœ ์ž…๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  input [type="date"] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋””์ž์ธ์ด ๋‹ค๋ฅด๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ฃ . ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‚ ์งœ ์„ ํƒ๊ธฐ UI๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ› ๏ธ ๊ตฌํ˜„ ๋ชฉํ‘œ๋‹ฌ๋ ฅ UI๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ˜„์žฌ ์›” ๊ธฐ์ค€์œผ๋กœ ๋‚ ์งœ ํ‘œ์‹œ์ด์ „/๋‹ค์Œ ๋‹ฌ ์ด๋™ ๊ธฐ๋Šฅ๋‚ ์งœ ํด๋ฆญ ์‹œ ์„ ํƒ๋œ ๋‚ ์งœ ์ถœ๋ ฅ ๐Ÿงฑ HTML ๊ตฌ์กฐ โ—€ โ–ถ ์ผ์›”ํ™”์ˆ˜๋ชฉ๊ธˆํ†  ์„ ํƒํ•œ ๋‚ ์งœ: ์—†์Œ ๐ŸŽจ CSS ์Šคํƒ€์ผ (๊ฐ„๋‹จ ๋ฒ„์ „) .datepicker { width: 300px; border: 1..

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๋ฆผ(Toast) ์ปดํฌ๋„ŒํŠธ

๐Ÿ“Œ ๊ฐœ์š” Toast ์•Œ๋ฆผ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” UI ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด “์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค”์ฒ˜๋Ÿผ ํ™”๋ฉด ์ƒ๋‹จ์ด๋‚˜ ํ•˜๋‹จ์— ์งง๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ์•Œ๋ฆผ ๋ง์ด์ฃ . ์ด ๊ธ€์—์„œ๋Š” ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(Vanilla JS)๋งŒ์œผ๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ toast ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. โœ… ์ˆœ์ˆ˜ JS๋กœ ๊ฐ€๋ณ๊ฒŒ ๊ตฌํ˜„โœ… ์œ„์น˜, ์ง€์† ์‹œ๊ฐ„, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ค์ • ๊ฐ€๋Šฅโœ… ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๋„ ๊ณ ๋ คํ•œ ์ ‘๊ทผ์„ฑ ๐Ÿ’ก Toast UI๋ž€?Toast๋Š” ํ™”๋ฉด ํ•œ์ชฝ์— ๋ช‡ ์ดˆ๊ฐ„ ํ‘œ์‹œ๋˜๋Š” ์ผ์‹œ์ ์ธ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„์˜ ์กฐ์ž‘ ์—†์ด ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด UX ํ–ฅ์ƒ์— ํšจ๊ณผ์ ์ด์ฃ . ๐Ÿ“ˆ ์ž์ฃผ ์“ฐ์ด๋Š” ์ƒํ™ฉ ์˜ˆ์‹œํผ ์ œ์ถœ ํ›„ “์ œ์ถœ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค”๋ณต์‚ฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ “ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ๋จ”์ €์žฅ, ์‚ญ์ œ, ์˜ค๋ฅ˜ ์•ˆ๋‚ด ๋“ฑ ๐Ÿ› ๏ธ HTML..

์ ‘๊ทผ์„ฑ์„ ๊ณ ๋ คํ•œ ์‹ค์ „ ๋ชจ๋‹ฌ ๊ตฌํ˜„๊ธฐ (Modal)

๋ชจ๋‹ฌ์€ UI์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ์ปดํฌ๋„ŒํŠธ์ง€๋งŒ, ์ ‘๊ทผ์„ฑ๊นŒ์ง€ ์ฑ™๊ธด ๊ตฌํ˜„์€ ์ƒ๊ฐ๋ณด๋‹ค ๋“œ๋ญ…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋‹ฌ ๊ตฌํ˜„๋ฒ•๋ถ€ํ„ฐ, ์Šคํฌ๋ฆฐ๋ฆฌ๋”์™€ ํ‚ค๋ณด๋“œ ์‚ฌ์šฉ์ž๋„ ๊ณ ๋ คํ•œ ์ ‘๊ทผ์„ฑ ๊ฐœ์„  ํฌ์ธํŠธ๊นŒ์ง€ ๋‹ค๋ค„๋ด…๋‹ˆ๋‹ค. ์‹ค๋ฌด์— ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋‹ˆ, ๋ณต์žกํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ JS๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋ฉ‹์ง„ ์ ‘๊ทผ์„ฑ ๋ชจ๋‹ฌ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”! โœจ ๊ธฐ๋ณธ ๋ชจ๋‹ฌ ๊ตฌํ˜„๊ฐ„๋‹จํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ชจ๋‹ฌ์„ ๋„์šฐ๊ณ  ๋‹ซ๋Š” ๊ธฐ๋ณธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. โœ… HTML ๊ตฌ์กฐ ๋ชจ๋‹ฌ ์—ด๊ธฐ ๋ชจ๋‹ฌ ์ œ๋ชฉ ๋ชจ๋‹ฌ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๋‹ซ๊ธฐ โœ… JS ๊ธฐ๋ณธ ๋กœ์ง const openBtn = document.getElementById('openModal');const closeBtn = document.getElementB..

๋ฐ˜์‘ํ˜• ์›น์„ ์œ„ํ•œ table ๊ตฌ์กฐ ๊ฐœ์„  – ul, li๋กœ ๋ฐ”๊พธ๊ณ  ์ ‘๊ทผ์„ฑ๊นŒ์ง€ ์ฑ™๊ธฐ๊ธฐ

์›น์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ(table) ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฑด ํ”ํ•œ ์ผ์ด์ง€๋งŒ, ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋Š” ํ‘œ๊ฐ€ ์ž˜๋ ค ๋ณด์ด๊ฑฐ๋‚˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ table์„ ul, li ๊ตฌ์กฐ๋กœ ๋ฐ”๊ฟ” ๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์‹ค์ œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด table์„ ul/li๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ ‘๊ทผ์„ฑ(Accessibility)๊นŒ์ง€ ๊ณ ๋ คํ•œ ๋งˆํฌ์—… ์ „๋žต์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. โœ… ์™œ table ๋Œ€์‹  ul, li๋ฅผ ์‚ฌ์šฉํ• ๊นŒ? ํ•ญ๋ชฉtableul, li๋ฐ˜์‘ํ˜• ๊ตฌํ˜„์–ด๋ ค์›€์œ ์—ฐํ•จ์Šคํƒ€์ผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ œํ•œ์ ์ž์œ ๋กœ์›€์ ‘๊ทผ์„ฑ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ ์ œ๊ณต์ถ”๊ฐ€ ์†์„ฑ ํ•„์š”๋ชจ๋ฐ”์ผ ๊ฐ€๋…์„ฑ๋‚ฎ์Œ๋†’์Œtable์€ ์˜๋ฏธ๋ก ์ ์œผ๋กœ๋Š” ์ข‹์ง€๋งŒ, ์ž‘์€ ํ™”๋ฉด์—์„œ ์Šคํฌ๋กค ์—†์ด ๋ณด๊ธฐ ์–ด๋ ต๊ณ  ์Šคํƒ€์ผ๋ง๋„ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ul, li ๊ตฌ์กฐ๋Š” ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•  ..