javascript 내에서 padding이나 blur의 px값을 동적으로 제어할 수 있도록 만들어 보았다. CSS에서 변수로 설정한 값을 자바스크립트에서 동적으로 제어하는 방식으로 구현했다.
(참고로 사진은 직접 사서 맞춘 키키 퍼즐 입니다.😁😁😁)
<h2>Picture of <span class="hl">KiKi</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="img/puzzle.jpg" />
<style>
:root {
--base: yellow;
--spacing: 10px;
--blur: 10px;
}
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;
}
img {
width: 1000px;
height: 500px;
padding: var(--spacing);
background-color: var(--base);
filter: blur(var(--blur));
}
.hl {
color: var(--base);
}
</style>
<script>
const inputs = document.querySelectorAll(".controls input");
function handleUpdate() {
//this에 <input id="base" type="color" name="base" value="#ffc600" /> 가 전달됨
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>
<label>
tag는 사용자 인터페이스 항목의 대한 설명을 나타낸다.<label>
은 보통 <input>
tag와 같이 사용됨. 이 때 <label>
tag에 for 속성을 달아서 어떤 <input>
에 대한 <label>
인지 알려주어야 한다.https://developer.mozilla.org/ko/docs/Web/HTML/Element/input
eventhandler를 적용할 때 change는 값이 변한 이후에만 적용되므로 실시간으로 적용하려면 mousemove event도 같이 추가해 주어야 한다!!
this.dataset.sizing || ""
코드는 data-sizing attribute가 없으면 null이 아닌 빈 문자열("")을 return 하게 하기 위함이다.
css에서 :root를 사용해서 변수를 정의하는 방식 되게 괜찮은것 같다... SCSS나 PostCSS도 얼른 공부해 보고싶다!