3. CSS Variables
CSS 변수 활용
기본코드
<!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>
/* misc styles, nothing to do with CSS variables */
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>
</script>
</body>
</html>
목표
사진에서 두가지의 레인지 조절 기능과 colorpicker 넣기
과정
1. CSS 변수를 만든다(base색상, 기본 여백(spacing), 기본 흐림정도(`blur))
:root {
--base: #ffc600;
--spacing: 10px;
--blur: 10px
}
:root
- HTML 요소중 가장 상위 요소에 적용한다는 뜻--base
- base라는 CSS 변수를 생성
위와같이 :root에 변수를 선언하는 것은 전역변수를 생성한다는 뜻
2. CSS변수를 통한 이미지, 텍스트 효과 지정
img {
padding: var(--spacing);
background: var(--base);
filter: blur(var(--blur));
}
.h1 {
color: var(--base);
}
변수를 불러올 때 var(--spacing)과 같이 불러옴
3. 자바스크립트로 CSS 변수가 작동하도록 코드 작성
const inputs = document.querySelectorAll('.controls input');
const handleUpdate = () => {
const suffix = this.dataset.sizing || '';
document.documentElement.style.setProperty(--${this.name}, this.value + suffix);
}
inputs
변수에 controls 클래스 하위의 input 태그들을 담고handleUpdate()
함수에서 suffix에 input중 data-sizing 또는 공백을 담는다.
위의 HTML코드를 보면 range-bar로 이루어진 두개의 input태그는 data-sizing="px"
이고 colorpicker input태그는 data-sizing
속성이 존재하지 않기 때문에 둘을 or연산자로 엮어서 suffix에 담은 것
document.documentElement.style.setProperty(--${this.name}, this.value +suffix);
document의 최상위 태그 html에 style 요소를 부여하고 그 내용을 name: value로 채움
(글로 적으려니 정리가 안돼서 어려워 보이지만 직접 코드를 보면 이해가 쉬움)
inputs.forEach(input => input.addEventListener('change', handleUpdate));
inputs.forEach(input => input.addEventListener('mousemove', handleUpdate));
마지막 코드는 inputs 변수의 각각 내용(두개의 range-bar, colorpicker)에서 change 이벤트와 mousemove 이벤트가 일어날때 handleUpdate()를 실행하는 addEventListener
메소드를 넣음.
이때 mousemove
를 넣지 않으면 range-bar를 드래그 하면서 동시에 결과를 볼수 없고 마우스를 떼야만 결과가 출력되어 두가지를 같이 써주는게 보기가 훨씬 편함
찾아본 내용, 알게된 내용들
.dataset
- data-~~로 이루어진 내용들 데이터정보 호출
ex) data-sizing속성은 dataset.sizing
으로 호출
document.documentElement.style.setProperty
- document의 최상위 요소에 style 요소 적용 후 속성 적용
:root
- HTML 최상위 요소 선택자