주제 설명
JS를 사용하여 CSS Variable 요소 spacing, blur, size, color 실시간으로 변경하기
결과물
See the Pen by hyunwk (@hyunwk) on CodePen.
HTML
<h2>Update <span class='hl'>CSS</span> 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="0" data-sizing="px">
<label for="size">Size</label>
<input id="size" type="range" name="size" min="0" max="2000" value="600" 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">
label 태그
<label>
태그사이에 위치한text
,checkbox
,radio
등은 클릭 가능 영역이 텍스트로 확장됩니다.<label for="">
와<태그 id="">
값은 서로 그룹을 형성합니다.<label>
태그는<input>
태그를 도와주는 역할입니다.<input>
태그가 디자인 하기 힘들 때<label>
태그로 연결해서 쉽게 디자인하거나 클릭 편의성을 높일 수 있습니다.
HTML Dataset 데이터 속성 (data attributes)
이미 지정된 속성 외에 추가로 사용해야 될 속성이 있을 경우 사용한다.
어느 element에나 사용할 수 있음.
예시) data-sizing
html
<input id="size" type="text" **data-sizing**="px">
css
--blur: 0px;
—blur
변수를 수정하려면 숫자와 함께 'px'
가 필요하다.
따라서 'px'
를 가져올 수 있게 element에 data-sizing
이라는 커스텀 속성으로 지정한다.
javascript 에서는 dataset
을 이용하여 값을 불러올 수 있다.
function handleUpdate() {
const suffix = this.dataset.sizing || '';
}
const inputs = document.querySelectorAll('.controls input');
inputs.forEach(input => input.addEventListener('change', handleUpdate)
|| ''
으로 가져오는 이유는 data-sizing이 없는 color라는 변수가 있기 때문이다.
||
없을 경우 suffix 에는 undefined라는 값이 들어간다. 하지만 ||
을 쓸 경우에는 null이 들어가게 된다.
CSS
<style>
:root {
--base: #ffc600;
--spacing: 10px;
--blur: 0px;
--size: 600px;
}
img {
padding: var(--spacing);
background: var(--base);
filter: blur(var(--blur));
width: var(--size);
height: var(--size);
}
.hl {
color: var(--base);
}
/*
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>
root
:root
는 최상위 엘리먼트를 의미한다.
HTML에서 최상위 엘리먼트란 html 태그
를 의미한다. 하지만 html 태그
를 선택자 사용하는 대신 :root
라는 가상선택자를 이용한다.
이유는 :root
가상 선택자는 class
로 간주되어 html 태그보다 우선순위가 높기 때문이다.
:root {
--base: #ffc600;
--spacing: 10px;
--blur: 0px;
--size: 600px;
}
css cascade, scope
HTML의 element는 하나 이상의 style에 영향을 받을 수 있다.
따라서 어떤 style을 적용할지 우선순위가 있어야 한다.
CSS가 Cascading Style Sheets의 약자인만큼 cascade는 중요하다.
:root
은 html 선택자보다 명시도가 더 낮다는 점을 제외하면와 똑같다.
:root
는 document 전체에 영향을 미친다.
명시도를 기준으로 우선순위 나누어보겠다.
- style > id > class > 태그
JS
<script>
const inputs = document.querySelectorAll('.controls input');
function handleUpdate() {
const suffix = this.dataset.sizing || '';
document.documentElement.style.setProperty(`--${this.name}`, this.value + suffix);
console.log(this.name);
}
inputs.forEach(input => input.addEventListener('change', handleUpdate));
inputs.forEach(input => input.addEventListener('mousemove', handleUpdate));
</script>
this
this는 누가 this를 불렀냐, 즉 호출자에 따라 다라진다.
eventHandler 안에서 사용한 경우에는 event를 받는 HTML 요소를 가리킨다.
예시
inputs.forEach(input => input.addEventListener('change', handleUpdate));
handleUpdate안에서 this를 호출한 경우에는 input을 가리킨다.
출처 :
- this : https://nykim.work/71
- css cascade : https://thrillfighter.tistory.com/487
- :root : https://blog.thereis.xyz/136
- label : https://dasima.xyz/html-label/