๐Ÿ’ป๐Ÿ’€/๊ฐœ๋ฐœ

[JS] JavaScript์—์„œ CSS ๋ณ€์ˆ˜ ๊ฐ’ ์‚ฌ์šฉํ•˜๊ธฐ

db2 2021. 10. 24. 23:14

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๊ฐ€ ๋™์ ์œผ๋กœ HTML ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ๋งŒ๋‚ฌ๋‹ค. ๋‚˜๋Š” styled-component์™€ ๊ฐ™์€ CSS-in-JS ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ณตํ†ต ์Šคํƒ€์ผ ๊ฐ’๋“ค์„ CSS์˜ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋˜ ํ•œ ๋ฒˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•ด ์ค‘๋ณตํ•ด์„œ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฑด์ง€ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹คํ–‰ํžˆ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” CSS์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” API๊ฐ€ ์กด์žฌํ–ˆ๋‹ค!

getComputedStyle() ๊ณผ getPropertyValue()

  • getComputedStyle(): ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ HTML ์š”์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“  CSS ์†์„ฑ๊ฐ’์„ ๋‹ด์€ ์Šคํƒ€์ผ ๊ฐ์ฒด ๋ฐ˜ํ™˜
  • getPropertyValue(): ์Šคํƒ€์ผ ๊ฐ์ฒด ์ค‘ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ํŠน์ • ์†์„ฑ์— ๋Œ€ํ•œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜

์˜ˆ์ œ

CHANGE ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋žœ๋ค์œผ๋กœ ๋ฐฐ๊ฒฝ์ƒ‰์ด ๋ฐ”๋€Œ๋Š” ๋ฐ•์Šค๋ฅผ ์˜ˆ์‹œ๋กœ API๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์ž. (๐Ÿ‘‰์ „์ฒด ์ฝ”๋“œ๐Ÿ‘ˆ)

HTML

<div id="app">
  <button class="button">CHANGE</button>
  <div class="box">HELLO !</div>
</div>

CSS

๋ณ€์ˆ˜๋Š” HTML ๋ฃจํŠธ์— ์„ ์–ธํ–ˆ๋‹ค.

:root {
  --color-primary: #007bff;
  --color-secondary: #6c757d;
  --color-success: #28a745;
  --color-info: #17a2b8;
  --color-warning: #ffc107;
  --color-danger: #dc3545;
}

JS

์ด์ œ ์•ž์„œ ์„ค๋ช…ํ•œ ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด :root์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋‹ค.

๋จผ์ € ๋žœ๋ค์œผ๋กœ ์ปฌ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

const props = [
    "--color-primary",
    "--color-secondary",
    "--color-success",
    "--color-info",
    "--color-warning",
    "--color-danger"
  ];
const randomProp = props[Math.floor(Math.random() * props.length)];

๊ทธ๋ฆฌ๊ณ  html ์š”์†Œ๋ฅผ getComputedStyle() ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด :root์— ๋Œ€ํ•œ ์Šคํƒ€์ผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค(1๏ธโƒฃ). ๊ทธ ์ค‘ ํŠน์ • ํ”„๋กœํผํ‹ฐ(์—ฌ๊ธฐ์„œ๋Š” randomProp)๋ฅผ getPropertyValue()์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ CSS์— ์„ ์–ธํ–ˆ๋˜ ๊ฐ’์„ ์–ป๋Š”๋‹ค(2๏ธโƒฃ).

const root = document.documentElement;
const rootStyle = getComputedStyle(root); // 1๏ธโƒฃ
const randomColor = rootStyle.getPropertyValue(randomProp); // 2๏ธโƒฃ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ ์ปฌ๋Ÿฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

function getRandomColorFromCSS() {
  const props = [
    "--color-primary",
    "--color-secondary",
    "--color-success",
    "--color-info",
    "--color-warning",
    "--color-danger"
  ];
  const randomProp = props[Math.floor(Math.random() * props.length)];

  const root = document.documentElement;
  const rootStyle = getComputedStyle(root);
  const randomColor = rootStyle.getPropertyValue(randomProp);

  return randomColor;
}

function changeBoxColor() {
  const box = document.querySelector(".box");
  box.style.backgroundColor = getRandomColorFromCSS();
}

const button = document.querySelector(".button");
button.addEventListener("click", changeBoxColor);