๐ŸŒ“ย ๋‹คํฌ๋ชจ๋“œ ํ† ๊ธ€ ๋ฒ„ํŠผ ๊ตฌํ˜„ํ•˜๊ธฐ

๊น€๋ฏผ์•„ยท2022๋…„ 7์›” 21์ผ
0
post-thumbnail

์•„๊ณ ๋ผ์Šคํ…Œ์ด์ธ  ๋งŒ๋“ค์–ด ๋ณด์ž

๋ชฉํ‘œ

  • ๋‹คํฌ๋ชจ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ๋กœ ์ „ํ™˜์ด ๋œ๋‹ค.
  • CSS variable์„ ์‚ฌ์šฉํ•ด ๋ณธ๋‹ค.

์•„๊ณ ๋ผ์Šคํ…Œ์ด์ธ  ๋ฐ๋ชจ ๋ณด๊ธฐ

๐ŸŒ ๐ŸŒš ๋‹คํฌ๋ชจ๋“œ ๊ตฌํ˜„??

ํ•„์ˆ˜ ๊ณผ์ œ๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ๋ฐ‹๋ฐ‹ํ•œ ํ™”๋ฉด์„ ์ปค๋ฒ„ํ•ด์ค„ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.
CSS ๊ณต๋ถ€ํ•  ๋•Œ ๋ฐฐ์› ๋˜ CSS variable์„ ์จ๋ณด๊ณ  ์‹ถ์–ด์„œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๋„ํ•ด ๋ณด์•˜๋‹ค.

๋””๋ฐ”์ด์Šค์˜ ์‹œ์Šคํ…œ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค!
(::TODO:: ์ถ”ํ›„์— ๊ธฐํšŒ๊ฐ€ ์žˆ์œผ๋ฉด)


์ฒซ๋ฒˆ์งธ. CSS attribute ์„ ํƒ์ž๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

body ํƒœ๊ทธ์— attribute ์ถ”๊ฐ€

  • HTML์— button element๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.
  • body ํƒœ๊ทธ์— data-theme attribute๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (light-mode/dark-mode ํ† ๊ธ€๋กœ ์ œ์–ด)
<body data-theme="light-mode">
<!-- ์ดํ•˜ ์ค‘๋žต -->
	<div class="darkmode">
		<button class="darkmode__btn"></button>
	</div>
<!-- ์ดํ•˜ ์ƒ๋žต -->

CSS ์„ ํƒ์ž๋กœ ์ปฌ๋Ÿฌ ๋ฐ”๊ฟ”์ฃผ๊ธฐ

  • ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ๋ถ€๋ถ„๋“ค๋งŒ ๋”ฐ๋กœ ๋ชจ์•„ [data-theme=โ€dark-modeโ€] ์„ ํƒ์ž ์•„๋ž˜ ๋‘์—ˆ๋‹ค.
/* ๋‹คํฌ๋ชจ๋“œ์‹œ */
[data-theme="dark-mode"] {
    background-color: #111;
    color: #fff;
}

/* ๋‹คํฌ๋ชจ๋“œ์‹œ ๋ฒ„ํŠผ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ */
[data-theme="dark-mode"] .darkmode__btn {
    background: url(./img/light-toggle.png) 50% 50% / 30px auto no-repeat;
}

[data-theme="dark-mode"] .form__container {
    background-color: slateblue;
    border: 1px solid slateblue;
}
/* ์ดํ•˜ ์ƒ๋žต */

JS Event Handler

ํ˜„์žฌ body ํƒœ๊ทธ์˜ data-theme attribute๋ฅผ ํ™•์ธํ•˜๊ณ  ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ dataset์„ ์‚ฌ์šฉํ•œ๋‹ค.

const darkmodeBtn = document.querySelector('.darkmode__btn')

darkmodeBtn.addEventListener('click', () => {
  if (document.body.dataset.theme === 'light-mode') {
    document.body.dataset.theme = 'dark-mode'
  } else {
    document.body.dataset.theme = 'light-mode'
  }
})

// regExp์— ์‚ฌ์šฉํ–ˆ๋˜ match ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ ์šฉ์ด ๋˜๋Š”๊ตฌ๋‚˜..?  
darkmodeBtn.addEventListener('click', () => {
  let dataAttr = document.body.dataset
  dataAttr.theme.match('light-mode')?dataAttr.theme = 'dark-mode':dataAttr.theme = 'light-mode'  
})

๋‘๋ฒˆ์งธ. CSS variable ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ธฐ

์šฐ์„  Can I use | css-variables์—์„œ css var ํ˜ธํ™˜์„ฑ ์ฒดํฌ!!
96.51%๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค!

CSS var ์ ์šฉํ•˜๊ธฐ

body[data-theme] ์†์„ฑ์œผ๋กœ var๋ฅผ ์ •์˜ํ•ด ์ฃผ์—ˆ๋‹ค. ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
์ดํ•˜ ์†์„ฑ๊ฐ’์— var(โ€”text) ์ด๋ ‡๊ฒŒ ์ ์šฉํ•œ๋‹ค.

body[data-theme='light-mode'] {
  --text: #111;
  --line: #eee;
  --background: #fff;
  --container-background: palegreen;
  --container-border: yellowgreen;
  --form-button: blueviolet;
  --form-button-text: #fff;
  --list-background: #fff;
  --page-background:blueviolet;
  --page-text: #fff;
}

body[data-theme='dark-mode'] {
  --text: #fff;
  --line: #333;
  --background: #151515;
  --container-background: slateblue;
  --container-border: slateblue;
  --form-background: #fff;
  --form-button: yellow;
  --form-button-text: #111;
  --list-background: #202020;
  --page-background: yellow;
  --page-text: #333;
}
/* ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋ ‡๊ฒŒ */
.form__submit > input {
    width: 100%;
    background-color: var(--form-button);
    color: var(--form-button-text);
}

๋ณ€์ˆ˜๋ฅผ element ๊ธฐ์ค€์œผ๋กœ ์ •ํ•˜๋‹ค๋ณด๋‹ˆ, ์ฝ˜ํ…์ธ  ์–‘์— ๋น„ํ•ด์„œ ์„ ์–ธํ•  ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์•˜๋‹ค. ํ…์ŠคํŠธ, ๋ฐฐ๊ฒฝ, ๋ณด๋” ๋“ฑ. ํ•˜์ง€๋งŒ ์œ„ ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ชจ์•„๋†“์•„์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™๋‹ค.


์ถœ์ฒ˜

๋ฒจ๋กœ๊ทธ์— ๋‹คํฌ ๋ชจ๋“œ ์ ์šฉํ•˜๊ธฐ | velopert
can I use | css-variables

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