CSS 속성값을 변수로 지정한 후 JavaScript로 그 값들을 변경하여 보여주는 과제다. 사용자가 사진의 패딩값, 블러 정도, 베이스 컬러를 직접 설정할 수 있도록 한다. 위 GIF 참고.
<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;
}
img {
padding: var(--spacing);
background: var(--base);
filter: blur(var(--blur));
}
.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>
<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>
선언은 이렇게 한다.
:root {
--base: #ffc600;
--spacing: 10px;
--blur: 10px;
}
:root
는 전역 CSS 변수 선언에 유용하게 사용할 수 있다. HTML 선택자와 거의 똑같다고 볼 수 있다.
선언한 변수는 var()
함수를 사용해 접근할 수 있다. 이렇게!
img {
padding: var(--spacing);
background: var(--base);
filter: blur(var(--blur));
}
this
와 e.target
나는 이제까지 이벤트 핸들러는 파라미터에 변수 e
를 지정하고서 e.target
으로 이벤트의 타겟 요소에 접근했다. 그런데 Wes는 this
를 자주 쓰는 것 같아서 this
와 e.target
을 각각 콘솔창에 찍어보니 동일하다. 아무래도 this
를 쓰면 더 직관적이기도 하고 파라미터에 변수를 지정하지 않아도 되니 조금이라도 코드를 간결하게 쓸 수 있을 것 같다.
function handleUpdate(e) {
console.log("e.target", e.target);
console.log("this", this);
}
지금까지 this
를 능동적으로 사용해본 적이 없었는데 앞으로는 자주 써볼 수 있겠다. 적어도 이벤트 핸들러 안에서는.
난 이제까지 이벤트 핸들러 함수에서 파라미터로 쓰는 e나 event가 이벤트를 가리키는 특별한 애들인 줄 알았는데 다른 이름으로 바꿔서 해봐도 결과는 동일하게 나왔다.
이벤트 핸들러 함수도 그 본질은 일반 함수와 다를 바 없는 함수였던 것. 하지만 addEventLister가 두 번째 아규먼트로 받았을 때 비로소 이벤트 핸들러의 역할을 하는 특별한(?) 친구가 되었던 것이다. (내가 그의 이름을 불러 주었을 때 그는 나에게로 와서 꽃이 되었다 🌸..✨가 생각나는.. 코딩 중에도 낭만을 잃지 말자 ㅋㅋ)
function handleUpdate() {
const suffix = this.dataset.sizing || "";
document.documentElement.style.setProperty(
`--${this.name}`, this.value + suffix
);
}
style.setProperty()
메소드는 CSS 속성을 재할당할 때 쓰인다. 아규먼트로는 ( "스타일 속성 이름", 재할당하고자 하는 속성값 )
을 넣어주면 된다. 위의 코드는 이벤트가 타겟하고 있는 CSS 변수를 이벤트가 타겟하고 있는 값으로 재할당하는 코드인 것이다.
여기서 documentElement
는 문서의 루트 요소를 리턴한다. html 태그를 선택한 셈이다. :root
선택자에서 루트 내용에 대해 선언한 내용을 변경하고자 하니까. 전체 문서의 스타일에 대해 setProperty
를 설정해서 html 요소의 스타일을 새로 설정해주는 것이다. 실제로 개발자 도구에서 확인해보아도 html 태그 내의 style 속성값에 변화를 준다.
type
의 종류HTML의 input 태그가 가지는 type 중 color
과 range
는 처음 활용해보았다. 더 찾아보니 type이 가질 수 있는 속성값들이 정말 많다. 나중에 하나씩 써봐야겠다. 흥미롭다.
filter
속성filter: blur(10px));
CSS에서
filter
속성은 흐림 효과나 색상 변형 등 그래픽 효과를 요소에 적용합니다. 보통 필터는 이미지, 배경, 테두리 렌더링을 조정하는 데 쓰입니다.
- MDN docs
blur()
CSS 함수는 주어진 이미지에 가우시안 블러를 적용합니다.
- MDN docs
filter
속성에 blur()
함수를 사용하여 이미지에 블러 처리를 해줬다. filter
에 줄 수 있는 값이 여러가지니 나중에 여러가지로 활용해볼 수 있겠다.