<!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>
- range bar 변경, 색상 선택을 통해 spacing, blur, color 에 대한 값을 변경한다.
- input.addEventListener 함수에서 change, mousemove 를 감지하고 handleUpdate 함수를 호출한다.
inputs.forEach(input => input.addEventListener('change',handleUpdate)) inputs.forEach(input => input.addEventListener('mousemove',handleUpdate))
- handleUpdate 함수에서 document전체에 property로 지정된 css속성을 변경처리한다.
: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); }
- HTML의 추가 커스텀 속성을 표시하는데 표준화된 방법을 제공하기 위한 기능
data-
어트리뷰트로 표기됨<input id="spacing" value="10" data-sizing="px">
- DOM 속성으로 변환 시 "data-"는 제외하고 '속성명'만 실제 속성 이름으로 사용됨
const suffix = this.dataset.sizing || '';
- CSS 스타일 선언 객체의 속성에 대한 값을 설정
document.documentElement.style.setProperty(`--${this.name}`, this.value+suffix)
=> document.documentElement는 html문서 전체를 가리킨다.
=> 현재:root
를 이용하여 css를 전역적으로 선언했으므로,
document.documentElement.style에서 바로 setProperty로 --값을 찾고 수정한다.