const title = document.querySelector("div.hello:first-child h1");
function clickHappens(){
const currentColor = h1.style.color;
let newColor = ; //이때 newColor라는 setter 변수는 정의하지 않는다. 정의하지 않음으로서 대입을 할 수 있음
if (currentColor === "blue"){
newColor === "red";
} else {
newColor === "blue";
}
h1.style.color = newColor;
/*
순서가 h1.style.color = newColor인 이유는,
우리는 newColor라는 변수에 h1의 색을 넣는게 아니라, 변경될 h1의 색이 변수 newColor에 할당되길 원하기 때문이다.
프로그래밍에서 "=" 사용 시, 왼쪽의 항목이 오른쪽의 항목으로 대입됨을 의미한다.
*/
}
title.addEventListener("click", clickHappens);
h1{
color: blue;
}
.active{
color: red;
}
//css에 h1의 기본값을 파란색으로 주고, .active라는 클래스가 실행될때 실행되는 대상의 색은 붉은색이라고 정의한다.
(이때 h1에 클래스명은 넣어두지 않았다.)
//active가 적용된 대상은 h1이든, div든, span이든, 색이 붉게 변하는 효과를 갖게된다.
const title = document.querySelector("div.hello:first-child h1");
function clickHappens(){
if (h1.className === "active"){
h1.className = "";
} else {
h1.className = "active"
}
title.addEventListener("click", clickHappens);
h1의 클래스명이 "active"일 경우, 클래스명을 빼서 h1의 기본상태 (color: blue)로 상태를 돌린다.
만약 클래스 명이 active가 아니라면, (클래스명이 주어지지 않은 디폴트 상태인 경우) h1에게 active라는 클래스명을 부여한다.
해당 함수는 클릭이 발생할때 실행이 됨으로, 클릭할때마다 색이 파란색에서 붉은색으로 왔다갔다 변한다.
이렇게 작성된 JS코드는 변수를 새로 정의하는 방식으로 작성한 코드보다 간결하며, css를 통해 간접적으로 디자인이 변경되기 때문에 더 다양하게 디자인 요소를 변경할 수 있다.
h1{
color: blue;
transition: color 0.5s ease-in-out;
}
.active{
color: red;
}
```
JS코드를 추가할 필요 없이 디자인 설정이 추가되어 동일한 JS코드가 실행되어도 transition 애니메이션이 추가되는 것을 확인할 수 있다.
const title = document.querySelector("div.hello:first-child h1");
function clickHappens(){
const clickedClass = "clicked"
if (h1.classList contains(clickedClass){
// contains를 사용해서 h1의 클래스명에 clicked가 포함되어있는지 확인한다.
h1.classList.remove(clickedClass);
//만약 h1의 클래스명에 clicked라는 문자가 포함되면, 해당 클래스명(clicked)을 제거한다.
} else {
// 만약 애초에 "clicked"가 클래스명에 없다면 clickedClass라는 변수를 이용해 "clicked"를 h1의 클래스명에 추가한다.
h1.classList.add(clickedClass);
}
title.addEventListener("click", clickHappens);
classList.contains()
를 사용해서 특정 클래스명의 유무를 확인하고 add/remove를 통해 클래스명을 통제했다.const title = document.querySelector("div.hello:first-child h1");
function clickHappens() {
h1.classList.toggle("clicked");
}
기능을 구현하고자 할 때 가장 효율적인 방식을 생각해야한다.
이게 설계를 잘 해야한다는 뜻일까? 구조적 사고를 잘 하면 되는걸까?
css 선택자를 잘 사용하는법부터 시작하면 프로그래밍 언어의 "구조적 사고"를 더 배울 수 있다고 생각한다.
JS의 특성도 잘 공부해야지!
출처: 노마드 코더 바닐라 JS