
[ JavaScript30 | Wes Bos ]
Wes Bos가 만든 무료 자바스크립트 학습 코스 JavaScript 30(이하 JS30)을 시작했다. 코스는 미리 준비된 코드에 자바스크립트 코드를 더해가며 JS, CSS와 HTML를 배우는 30가지 문제로 구성되어 있다. 문제를 풀면서 새로 알게 된 지식을 더 잘 이해하기 위해서, 따로 작은 결과물을 만들기로 했다. 블로그 글 JavaScript 30 시리즈에는 각 문제에서 배우고 응용한 지식들을 정리한다.

[ Pick and Clear | 윤슬기 ]
JS 30 중 Day 3과 Day 5에서 배운 내용을 이용해 'Pick and Clear'를 만들었다. 판넬을 골라 클릭하고 바를 움직이면 흐릿한 이미지가 선명해진다. 위 링크에서 확인할 수 있다(데스크탑 전용).
[ HTMLElement.focus() | MDN ]
HTMLElement.focus() 메서드는 포커스할 수 있는 특정한 엘리먼트가 포커스되도록 설정한다.
[ EventTarget.removeEventListener() | MDN ]
EventTarget.removeEventListener() 메서드는 이전에EventTarget.addEventListener() 로 EventTarget 에 등록했던 이벤트 리스너를 제거한다. 이 이벤트 리스너는 이벤트 종류와 이벤트 리스너 함수 자체의 조합으로 식별되어 제거되며, 등록시 제공했던 다양한 옵션과 일치하는 이벤트 리스너만 제거할 수 있다.
[ tabindex | MDN ]
tabindex 전역 속성은 요소의 포커스 설정 여부와 만약 요소가 키보드 탐색 범위에 속해야 한다면 어느 지점에서 선택되어야 하는지 정수값을 사용해 지정할 수 있다.
가능한 값의 종류는 다음과 같다.
tabindex="-1"tabindex="0"tabindex="2"키보드로 순차 탐색을 할 시에, 0 값이나 부정확한 값 혹은 아무런 탭 인덱스 값도 가지고 있지 않은 요소는 탭 인덱스 값이 양의 정수인 요소 탐색이 완료된 후에 뒤따라 등장해야 한다.
[ :root | MDN ]
:root 는 CSS 가상 클래스로 문서의 최상위 엘리먼트를 나타낸다. HTML 문서에서는 <html> 엘리먼트이다. CSS 변수를 선언할 때 유용하다.
/* <html> 엘리먼트의 배경색이 하늘색으로 지정된다. */
:root {
background: skyblue;
}
[ 사용자 정의 CSS 속성 사용하기 (변수) | MDN ]
CSS 변수는 문서 전반적으로 재사용할 어떠한 특정 값을 포함하는, CSS 작성자가 정의한 엔티티이다. 이 변수는 사용자 정의 속성 표기법 (예 :--main-color: black;)을 사용하여 설정되며 var() 함수를 이용하여 엑세스할 수 있다. (예 : color: var(--main-color);).
CSS 변수의 값만 변경하면 그 값에 var() 로 접근하는 속성 모두가 한번에 변경되기 때문에, 어떤 같은 속성값을 여러 곳에서 사용하고 또 변경 가능성이 있다면 CSS 변수를 사용하면 편리하다.
/* 변수 base의 값을 변경하면, img의 background값과 .hl의 color가 모두 변경된다. */
:root {
--base: red;
--spacing: 0px;
--blur: 0px;
}
img {
background: var(--base);
padding: var(--spacing);
filter: blur(var(--blur));
}
.hl {
color: var(--base);
}
[ filter | MDN ]
filter CSS 속성은 흐림 효과나 색상 변형 등 그래픽 효과를 요소에 적용한다. 보통 필터는 이미지, 배경, 테두리 렌더링을 조정하는 데 쓰인다. MDN 페이지에서 다양한 속성들의 상세한 예시를 확인할 수 있다.
[ HTMLElement: change event | MDN ]
change 이벤트는 <input>, <select> 그리고 <textarea> 엘리먼트에서 사용자의 입력을 통해 value 가 바뀌었을 때 작동한다. input 이벤트는 엘리먼트의 value 가 바뀔 때마다 작동하지만, change 이벤트는 대부분 value 가 엔터키 입력이나 리스트에서 어떤 옵션을 선택하여 값이 commite 되었을 때 작동한다.
엘리먼트의 성질에 따라서 change 이벤트가 작동하는 순간이 다르다.
<input type="radio"> 혹은 <input type="checkbox"> 일 때, 클릭 혹은 키보드로 항목이 선택되어 value 가 바뀌었을 때.<select> 의 드롭다운 메뉴에서 옵션을, <input type="date"> 에서 날짜를, <input type="file"> 에서 파일을 선택했을 때.<textarea> 혹은 <input type="text"> 의 입력란에 사용자가 값을 입력하고 마우스 클릭 등으로 다른 부분으로 포커스를 이동시켜 해당 엘리먼트에서 포커스가 사라졌을 때.[ CSSStyleDeclaration.setProperty() | MDN ]
CSSStyleDeclaration.setProperty() 는 CSS 속성에 새로운 value를 설정한다.
Document.documentElement 는 읽기 전용 속성으로 document 의 루트 엘리먼트를 반환한다 (가령, HTML 문서의 <html> 요소). 아래 코드는 <html>엘리먼트의 인라인 style 에 접근하여 background 속성 값을 red로 설정한다.
document.documentElement.style.setProperty('background', 'red');
[ Element.classList | MDN ]
toggle( String [, force] ) 메서드는 엘리먼트의 클래스를 추가하기도 하고, 제거하기도 한다.
false를 반환하며, 존재하지 않으면 클래스를 추가하고 true를 반환한다.true로 평가되면 지정한 클래스 값을 추가하고 false로 평가되면 제거한다.아래 예시는 구역(panel)을 클릭하면 open 클래스가 해당 엘리먼트에 추가되어 flex-grow 값이 달라지면서 크기가 넓어지고, 다시 한 번 클릭하면 open클래스가 제거되어 창이 본래 크기로 돌아오는 코드다.
.panel {
flex: 1;
}
.panel.open {
flex: 5;
}
// 3. 만약 엘리먼트의 classList에 open이 존재한다면 지운다. 존재하지 않는다면 추가한다.
const toggleOpen = function() {
this.classList.toggle('open');
}
// 1. panel이라는 class값을 가진 엘리먼트를 모두 선택한다.
const panels = document.querySelectorAll('.panel');
// 2. 각 엘리먼트에 클릭 시 toggleOpen 함수를 실행하는 이벤트를 단다.
panels.forEach(node => node.addEventListener('click', toggleOpen));