✔✔ 굳~~이 css variable을 사용하는 이유
❗❗ css variable이 .js로 업데이트 될 수 있음. 계속 수정하는 것을 줄이기 위해서 css variable을 이용해야 한다. ❗❗
이런 느낌으로 만들어주면 된다. (이거는 보스님이 만든 것이다.. 나는 이러한 형태로 만들되 내 스타일로 만들 것이다.)
나는 이런 느낌으로 제작하였다..
이런 느낌으로 짤 것이다. 또 flex-box를 이용해서 옆으로 나란히 놓아줄 것이다.
✔ label과 input
💙 for=""와 name="" 같으면 label과 input을 연결시킬 수 있다.
💙 코드 작성 순서
1. (중요) HTML & CSS 위주로 먼저 찾아보고, 도저히 없는 경우에 JS 이용하기. HTML & CSS를 이용하는 것이 성능적으로 더욱 좋기 때문이다.
그래서 "어떻게 해야 블러 처리가 되고 테두리가 넓어지고 색상이 변경되는지" 생각했다.
- 블러 처리 - filter:blur() 이용하기.
- 테두리 처리 - padding 이용하기.
- 색상 변경 - background-color 이용하기.
padding: var(--spacing); /* spacing를 의미한다. */ background: var(--baseColor); /* 선 색깔을 의미한다. */ filter: blur(var(--blur)); /* blur를 의미한다. */ /* value가 10px이였으니, 맞춰줘서 CSS-Variable을 제작하였다. */
위의 변수들은 css-variable을 이용해서 정의된 변수들이다.
2. HTML & CSS로 코드 작성하는 것이 끝났다면 JS로 코드를 작성해야한다. ❗ 정적인 부분과 이벤트를 연결시켜서 인터렉티브하게 만드는 것이 JS의 역할이다. ❗
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS Varible :: Javascript 30</title>
<link rel="stylesheet" href="style cssVariable.css" />
</head>
<body>
<h1>Update CSS Variable</h1>
<div class="control">
<div class="controller">
<label for="spacing">Spacing : </label>
<input
type="range"
name="spacing"
min="0"
max="5"
step="0.5"
value="0"
/>
</div>
<div class="controller">
<label for="blur">Blur : </label>
<input type="range" name="blur" min="0" max="5" step="0.5" value="0" />
</div>
<div class="controller">
<label for="baseColor">Base Color : </label>
<input type="color" name="baseColor" value="#AC92ED" />
<!-- input에 색상표도 있을 줄 몰랐었다. -->
</div>
</div>
<img src="flower.jpg" alt="flower" />
</body>
</html>
flex-box를 위주로 이용하고, 간격을 띄우고 싶은 경우에는 margin과 padding을 이용하자.
@import "reset.css";
@import url("https://fonts.googleapis.com/css2?family=Gaegu&display=swap");
body {
display: flex;
flex-direction: column;
align-items: center;
background-color: #f6b1b9;
font-family: "Gaegu", cursive;
}
h1 {
padding: 30px;
font-size: 60px;
font-weight: bold;
color: #f6f7fb;
}
.control {
display: flex;
flex-direction: row;
justify-content: center;
}
.controller {
font-size: 30px;
padding: 8px 20px;
font-weight: bold;
}
/* 이미지 부분을 변경할 것이기 때문에 여기서 지정해주기. */
img {
width: 800px;
height: 500px;
margin: 20px;
border: 5px solid #fffb33;
}
일단, 내가 알고있는 관점에서는 한꺼번에 수정이 가능하기 때문에 용이해서 사용을 많이 하는 것으로 알고 있다. 하지만 이 예제에서는 인터렉티브한 부분을 그 변수와 연결시켜서 그 변수가 조정될 수 있도록 이용하는 것 같았다. (계속 update 시켜주기.)
:root {
/* CSS Variable 이용하는 것이 중요하다. */
--background-color: #f6b1b9;
--header-color: #f6f7fb;
/* 밑에 3개가 인터렉티브한 부분을 만들어 주는 부분이다. */
--border-color: #fffb33;
--spacing: 10px;
--blur: 10px;
}
밑에 있는 코드도 모두 css variable을 이용해서 변경시켜주기.
body {
display: flex;
flex-direction: column;
align-items: center;
background-color: var(--background-color);
font-family: "Gaegu", cursive;
}
.h1 {
color: var(--border-color);
}
h2 {
padding: 30px;
font-size: 60px;
font-weight: bold;
color: var(--header-color);
}
.control {
display: flex;
flex-direction: row;
justify-content: center;
}
.controller {
font-size: 30px;
padding: 8px 20px;
font-weight: bold;
}
img {
width: 800px;
height: 500px;
margin: 20px;
padding: var(--spacing); /* spacing를 의미한다. */
background: var(--border-color); /* 선 색깔을 의미한다. */
filter: blur(var(--blur)); /* blur를 의미한다. */
/* value가 10px이였으니, 맞춰줘서 CSS-Variable을 제작하였다. */
}
💙 코드 작성 순서
const inputs = document.querySelectorAll(".controller input");
// inputs.forEach((input) => console.log(input));
inputs.forEach((input) => input.addEventListener("change", handleUpdate));
// input의 값이 변경되는 경우에 change를 이용한다.
// drag 되는 경우도 고려해야 하기 때문에, mousemove도 추가해주기.
inputs.forEach((input) => input.addEventListener("mousemove", handleUpdate));
함수를 정의해줘야 하는데, 일단 그 함수는 range의 data의 값에 의해서 "어느 정도로 변하는지" 지정이 된다. ➕ 색상에는 단위가 없고, spacing과 blur에는 단위가 존재하기 때문에 단위도 고려해야한다. (dataset에 sizing을 추가해서 단위를 고려하도록 만들어주기.)
그런데 data 값이 변할 때마다 변하는 정도가 달라지기 때문에, setProperty 메서드를 이용한다.
setProperty(변하는 것에 대한 이름, 데이터 + 단위)
이름은 모두 css-variable을 이용해서 처리했으니 그것을 가져다가 쓰면 된다.
function handleUpdate(event) {
// console.log(event);
// console.log(this);
// console.log(this.value);
// console.log(this.dataset.sizing); 없는 경우에는 undefined가 출력된다.
const unit = this.dataset.sizing || "";
document.documentElement.style.setProperty(
`--${this.name}`,
this.value + unit
);
}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS Varible :: Javascript 30</title>
<link rel="stylesheet" href="style cssVariable.css" />
</head>
<body>
<h2>Update CSS Variable with <span class="h1">JS</span></h2>
<!-- JS도 나중에 색깔 변경되어야 하기 때문에 이렇게 해야된다. -->
<div class="control">
<div class="controller">
<label for="spacing">Spacing : </label>
<input
id="spacingCtr"
type="range"
name="spacing"
min="10"
max="200"
value="10"
data-sizing="px"
/>
<!-- 단위 추가해주기. -->
</div>
<div class="controller">
<label for="blur">Blur : </label>
<input
id="blurCtr"
type="range"
name="blur"
min="0"
max="25"
value="10"
data-sizing="px"
/>
<!-- 단위 추가해주기. -->
</div>
<div class="controller">
<label for="baseColor">Base Color : </label>
<input
id="baseColorCtr"
type="color"
name="baseColor"
value="#fffb33"
/>
<!-- input에 색상표도 있을 줄 몰랐었다. -->
</div>
</div>
<img src="flower.jpg" alt="flower" />
<script src="app cssVariable.js" defer></script>
</body>
</html>
@import "reset.css";
@import url("https://fonts.googleapis.com/css2?family=Gaegu&display=swap");
:root {
/* CSS Variable 이용하는 것이 중요하다. */
--background-color: #f6b1b9;
--header-color: #f6f7fb;
/* 밑에 3개가 인터렉티브한 부분을 만들어 주는 부분이다. */
--baseColor: #fffb33; /* name */
--spacing: 10px; /* name */
--blur: 10px; /* name */
}
body {
display: flex;
flex-direction: column;
align-items: center;
background-color: var(--background-color);
font-family: "Gaegu", cursive;
}
.h1 {
color: var(--baseColor);
}
h2 {
padding: 30px;
font-size: 60px;
font-weight: bold;
color: var(--header-color);
}
.control {
display: flex;
flex-direction: row;
justify-content: center;
}
.controller {
font-size: 30px;
padding: 8px 20px;
font-weight: bold;
}
/* 이미지 부분을 변경할 것이기 때문에 여기서 지정해주기. */
img {
width: 800px;
height: 500px;
margin: 20px;
padding: var(--spacing); /* spacing를 의미한다. */
background: var(--baseColor); /* 선 색깔을 의미한다. */
filter: blur(var(--blur)); /* blur를 의미한다. */
/* value가 10px이였으니, 맞춰줘서 CSS-Variable을 제작하였다. */
}
/*
const spacingCtr = document.querySelector("#spacingCtr");
const blurCtr = document.querySelector("#blurCtr");
const baseColorCtr = document.querySelector("#baseColorCtr");
물론 이렇게 해도 되지만, querySelectorAll을 이용하는 것이 좋다.
*/
const inputs = document.querySelectorAll(".controller input");
// console.log(inputs);
// inputs.forEach((input) => console.log(input));
inputs.forEach((input) => input.addEventListener("change", handleUpdate));
// input의 값이 변경되는 경우에 change를 이용한다.
// drag 되는 경우도 고려해야 하기 때문에, mousemove도 추가해주기.
inputs.forEach((input) => input.addEventListener("mousemove", handleUpdate));
function handleUpdate(event) {
// console.log(event);
// console.log(this);
// console.log(this.value);
// console.log(this.dataset.sizing); 없는 경우에는 undefined가 출력된다.
const unit = this.dataset.sizing || "";
document.documentElement.style.setProperty(
`--${this.name}`,
this.value + unit
);
}
사실 css-variable을 꼭 써야하는 이유는 잘 모르겠다. 정리하면, 원리는 input에서 range에 데이터의 정도에 따라서 달라지기 때문에 그 부분이 변수가 되어야 한다. 근데 node listener 이기 때문에 array로 바꾸기 위하여 forEach를 이용해서 addEventListener로 연결해준다. 그리고 이벤트를 주고자 하는 함수를 제작하자. 그 함수의 목표는 "변하는 정도에 따라 스타일을 제공" 이다. 단위가 필요한 부분도 있고, 없는 부분도 있으니 단위를 변수로 만들어야하고, data 값도 가져와야 한다. 그리고 data 값에 따라 변하기 때문에 setProperty를 이용해서 처리해주자.