[javascript30] CSS Variables

하도야지·2021년 11월 12일
0

JavaScript30 따라하기

목록 보기
3/10


1. CSS Variables

  • spacing, blur, baseColor 의 값 변경에 따라 아래 화면에 css 변경 반영

2. 전체 코드

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Scoped CSS Variables and JS</title>
</head>
<body>
  <h2>Update CSS Variables with <span class='hl'>JS</span></h2>

  <div class="controls">
    <label for="spacing">Spacing:</label>
    <input id="spacing" type="range" name="spacing" min="10" max="200" value="10" data-sizing="px">

    <label for="blur">Blur:</label>
    <input id="blur" type="range" name="blur" min="0" max="25" value="10" data-sizing="px">

    <label for="base">Base Color</label>
    <input id="base" type="color" name="base" value="#ffc600">
  </div>

  <img src="https://source.unsplash.com/7bwQXzbF6KE/800x500">

  <style>
    :root {
      --base: #ffc600;
      --spacing: 10px;
      --blur: 10px;
    }
    /*
      misc styles, nothing to do with CSS variables
    */

    img{
      padding: var(--spacing);
      background: var(--base);
      filter: blur(var(--blur));
    }

    .h1{
      color: var(--base);
    }

    body {
      text-align: center;
      background: #193549;
      color: white;
      font-family: 'helvetica neue', sans-serif;
      font-weight: 100;
      font-size: 50px;
    }

    .controls {
      margin-bottom: 50px;
    }

    input {
      width: 100px;
    }
  </style>

  <script>
    const inputs = document.querySelectorAll('.controls input');

    function handleUpdate(){
      const suffix = this.dataset.sizing || '';
      document.documentElement.style.setProperty(`--${this.name}`, this.value+suffix)
    }

    inputs.forEach(input => input.addEventListener('change',handleUpdate))
    inputs.forEach(input => input.addEventListener('mousemove',handleUpdate))

  </script>

</body>
</html>

3. 동작 순서

  1. range bar 변경, 색상 선택을 통해 spacing, blur, color 에 대한 값을 변경한다.
  2. input.addEventListener 함수에서 change, mousemove 를 감지하고 handleUpdate 함수를 호출한다.
   inputs.forEach(input => input.addEventListener('change',handleUpdate))
   inputs.forEach(input => input.addEventListener('mousemove',handleUpdate))
  1. handleUpdate 함수에서 document전체에 property로 지정된 css속성을 변경처리한다.

4. HTML, CSS

:root

  • :root : 전역 CSS변수 선언 시 사용
  <style>
    :root {
      --base: #ffc600;
      --spacing: 10px;
      --blur: 10px;
    }
  • 전역으로 선언된 CSS변수를 읽어올때는 var(--x)의 형태로 동작한다.
    img{
      padding: var(--spacing);
      background: var(--base);
      filter: blur(var(--blur));
    }
    .h1{
      color: var(--base);
    }

dataset

  • HTML의 추가 커스텀 속성을 표시하는데 표준화된 방법을 제공하기 위한 기능
  • data- 어트리뷰트로 표기됨
<input id="spacing" value="10" data-sizing="px">
  • DOM 속성으로 변환 시 "data-"는 제외하고 '속성명'만 실제 속성 이름으로 사용됨
const suffix = this.dataset.sizing || '';

5. JAVASCRIPT

style.setProperty()

  • CSS 스타일 선언 객체의 속성에 대한 값을 설정
document.documentElement.style.setProperty(`--${this.name}`, this.value+suffix)

=> document.documentElement는 html문서 전체를 가리킨다.
=> 현재 :root를 이용하여 css를 전역적으로 선언했으므로,
document.documentElement.style에서 바로 setProperty로 --값을 찾고 수정한다.


profile
프로그래머를 꿈꾸는 코더

0개의 댓글