freddy
느낌으로 남지않기
freddy
전체 방문자
오늘
어제
  • 분류 전체보기 (28)
    • HTML (2)
    • CSS (1)
    • JavaScript (8)
    • WebGL (0)
    • 개념정리 (0)
    • React (2)
    • ReactNative (4)
    • ERROR.LOG (3)
    • 설치 (2)
    • 챌린지 (0)
    • 책 (0)
    • 세미나 (2)
    • 일기장 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • javascript30
  • BOM 이란?
  • React-Native
  • react 기초
  • JavaScript
  • bitnami ubuntu
  • React Native
  • 브라우저 동작 원리
  • javascript 최신문법
  • 최신JS문법
  • em과rem차이
  • Nullish coalescing operator
  • Shorthand property names
  • Github Actions
  • 리액트의 필요성
  • css variables
  • es11
  • react 특징
  • 프론트엔드
  • JS
  • javascript 이벤트 위임
  • react
  • Spread syntax
  • evnet 위임
  • 값식문
  • Destructuring assignment
  • javscript 기초
  • react 사용하는 이유
  • 앱이 계속 중지됨
  • Optional chainning

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
freddy

느낌으로 남지않기

JavaScript

CSS Variables

2020. 12. 22. 09:19
반응형

요구사항

css에서 변수를 사용하여 값을 설정 해보고 javascript로 css를 동적으로 컨트롤 해보자.

기본 소스코드

<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>
    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>

처리과정 & 코드분석

  1. css에서 :root 가상클래스에 변수를 추가해 주었다.

    (:root 에 추가해주는 것이 모든 요소에 변수를 정의하는 데에 도움이 된다.)

  2. 커스텀 속성 정의 부분 (--* 패밀리)

:root {
  --base: #ffc600;
  --spacing: 10px;
  --blur: 10px;
}
  1. img태그에 선언한 변수들을 이용해서 값을 설정함

    캐스케이딩 변수 사용 부분 (var()함수)

img {
  padding: var(--spacing);
  background: var(--base);
  filter: blur(var(--blur));
}
  1. input 요소들을 감싸고있는 controls 클래스, input 요소들을 다 선택하기 위해 querySelectorAll로 잡아서 inputs에 할당 함

    전부 타겟으로 잡는 이유는 ? 다음 작업에서 각 input요소에 addEventListener를 해주기 위해서임

const inputs = document.querySelectorAll('.controls input');
  1. inputs은 querySelectorAll로 잡았기 때문에 배열이 아닌 NodeList로 반환이 된다. NodeList에 forEach메서드가 있기 때문에 다른 설정없이 forEach를 사용해서 각 input 요소에 addEventListener를 추가했다.

    range 설정을 실시간으로 변하는것을 확인하기 위해 mousemove와 change를 addEventListener로 주었다.

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

inputs.forEach(input => input.addEventListener('mousemove', handleUpdate));
  1. handleUpdate 함수 작성
function handleUpdate() {
  const suffix = this.dataset.sizing || '';
  document.documentElement.style.setProperty(
    `--${this.name}`,
    this.value + suffix
  );
}

6-1. this.dataset은 html에 input 태그에 작성된 data-* 들을 가리킨다. 그 중에 sizing을 선택해서 this.dataset.sizing

6-2. suffix를 생성한 이유는 값을 설정할 때 --spacing, --blur가 px단위 때문에 input태그에서 설정한 data-sizing='px' 이기 때문에 suffix로 할당함

6-3. document.documentElement.style.setProperty(`--${this.name}`, this.value + suffix);

document.documentElement는 읽기 전용 속성으로 document 의 루트 요소인 Element를 반환한다.

style.setProperty()는 CSS 스타일 선언 객체의 속성에 대한 새 값을 설정한다.

.setProperty ( propertyName , value, priority ) 의 구문이다.

6-4. (`--${this.name}`, this.value + suffix) propertyName은 --변수네임, value는 값+suffix 로 set 해주었다.

결과

<style>
      :root {
        --base: #ffc600;
        --spacing: 10px;
        --blur: 10px;
      }

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

      .hl {
        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>

결과
결과

찾아본 내용

css filter 속성

filter CSS 속성은 흐림 효과나 색상 변형 등 그래픽 효과를 요소에 적용합니다. 보통 필터는 이미지 렌더링, 배경, 테두리 등의 조정에 쓰입니다.

:root 의사 클래스

:root 의사 클래스는 문서의 루트요소를 나타낸다 HTML에서는 보통 html 요소를 지칭한다 CSS 커스텀 속성 정의 부분은 대시(-) 두개로 시작하며 그 뒤의 이름은 대소문자를  구분한다.

Document.documentElement

읽기 전용 속성으로 document 의 루트 요소인 Element를 반환한다 (가령, HTML 문서의 <html> 요소).

setProperty

.setProperty() 방법 인터페이스는 CSS 스타일 선언 객체의 속성에 대한 새 값을 설정합니다
.setProperty ( propertyName , value, priority );

참고자료

css filter

:root

Document.documentElement

setProperty

반응형

'JavaScript' 카테고리의 다른 글

꼭! 알아야하는 JavaScript 최신문법 (ES6, ES11) 사용법 정리 (1)  (0) 2020.12.22
JavaScript 30 Drum Kit 정리  (0) 2020.12.22
CSS + JS Clock 정리  (0) 2020.12.22
JavaScript 값, 식, 문,Primitive Type & Reference Type  (0) 2020.12.22
Array의 여러가지(filter, map, reduce, sort, ...) 메소드를 활용해보자.  (0) 2020.12.21
    'JavaScript' 카테고리의 다른 글
    • 꼭! 알아야하는 JavaScript 최신문법 (ES6, ES11) 사용법 정리 (1)
    • JavaScript 30 Drum Kit 정리
    • CSS + JS Clock 정리
    • JavaScript 값, 식, 문,Primitive Type & Reference Type
    freddy
    freddy

    티스토리툴바