JavaScript 마우스 커서 · 라디오 이미지
이 폴더의 예제는 이전 산수 게임을 이벤트와 타이머로 확장합니다. 사용자가 직접 버튼을 누르는 흐름뿐 아니라 시간이 지나면 자동으로 채점되는 흐름, 키보드 입력 이벤트, 마우스 이동과 이미지 변경 이벤트를 함께 다룹니다.
window.onblur는 브라우저 창이 포커스를 잃을 때, window.onfocus는 다시 포커스를 얻을 때 실행됩니다. 원본은 배경색을 바꿔 상태를 보여줍니다.
onmousemove 예제는 절대 위치 div 안에 이미지를 넣고, 마우스 좌표에 맞춰 div의 left/top을 바꿉니다.
| 속성 | 의미 | 주의 |
|---|---|---|
| position:absolute | 좌표로 위치 지정 | left/top이 적용됩니다. |
| clientX | 뷰포트 기준 x 좌표 | px 단위를 붙여야 합니다. |
| clientY | 뷰포트 기준 y 좌표 | px 단위를 붙여야 합니다. |
| zIndex | 겹침 순서 | 높을수록 위에 보입니다. |
원본 함수는 매개변수로 e를 받지만 내부에서는 event.clientX를 사용합니다. 현대 코드에서는 전달받은 e를 쓰는 편이 명확합니다.
라디오 버튼 예제는 선택된 과일의 value를 이미지 파일 경로로 사용합니다. 클릭하면 printImage(this.value)가 실행되어 img 태그의 src가 바뀝니다.
| 요소 | 역할 | 예시 |
|---|---|---|
| radio | 하나의 선택지 | 바나나, 망고, 사과 |
| name | 같은 그룹 묶기 | friuts |
| value | 이미지 파일 경로 | media/apple.png |
| checked | 초기 선택 | 사과 선택 |
| img.src | 표시 이미지 변경 | 선택한 과일 이미지 |
printInitImage()는 페이지가 열릴 때 checked 상태인 라디오 버튼을 찾습니다. 찾은 버튼이 있으면 그 value로 이미지를 출력합니다.
원본은 name 값을 friuts로 적고 JavaScript에서도 같은 이름으로 찾습니다. 철자는 fruits가 맞지만, 코드에서는 HTML과 JS 이름이 일치하기 때문에 동작합니다.
| 실수 | 증상 | 해결 |
|---|---|---|
| px 단위 누락 | 커서 이미지가 움직이지 않습니다. | left/top에 "px"를 붙입니다. |
| position 누락 | left/top이 적용되지 않습니다. | absolute 또는 fixed를 지정합니다. |
| event 객체 혼동 | 브라우저별 오류가 날 수 있습니다. | 매개변수 e를 사용합니다. |
| name 불일치 | 초기 선택을 찾지 못합니다. | HTML name과 JS 문자열을 맞춥니다. |
| 이미지 경로 오류 | 이미지가 표시되지 않습니다. | value 경로와 실제 파일 위치를 확인합니다. |
| 체크 | 통과 기준 |
|---|---|
| onblur | 창이 포커스를 잃을 때 실행됨을 설명합니다. |
| onfocus | 창이 다시 포커스를 얻을 때 실행됨을 설명합니다. |
| onmousemove | 마우스 좌표로 요소 위치를 바꾸는 흐름을 압니다. |
| clientX/Y | 뷰포트 기준 좌표임을 압니다. |
| radio | checked와 value 사용 흐름을 이해합니다. |
| img.src | 이미지 표시 파일을 바꾸는 속성임을 압니다. |
| 확인 | 콘솔 예시 | 의미 |
|---|---|---|
| 좌표 | console.log(e.clientX, e.clientY) | 마우스 좌표가 들어오는지 확인합니다. |
| cursor 요소 | console.log(cursor) | div를 제대로 찾았는지 봅니다. |
| 라디오 목록 | console.log(fruits.length) | name으로 요소를 찾았는지 확인합니다. |
| checked | console.log(fruits[i].checked) | 선택 상태를 확인합니다. |
| 이미지 경로 | console.log(imgFile) | src에 들어갈 값이 맞는지 봅니다. |
| 케이스 | 준비 | 예상 결과 |
|---|---|---|
| 브라우저 밖 클릭 | 다른 창 클릭 | 배경 lightgray |
| 브라우저 안 클릭 | 예제 창 클릭 | 배경 white |
| 마우스 이동 | 화면 안에서 이동 | 이미지 커서가 따라옴 |
| 사과 초기 선택 | 페이지 로드 | 사과 이미지 출력 |
| 망고 클릭 | 망고 라디오 선택 | 망고 이미지로 변경 |
마우스 커서와 라디오 이미지 예제는 이벤트 결과가 즉시 화면에 보이므로, 이벤트 객체와 DOM 속성 변경을 연습하기 좋습니다.
| 개선 | 이유 | 확인 포인트 |
|---|---|---|
| e 객체 사용 | 브라우저 호환성을 높입니다. | event 대신 e.clientX 사용 |
| pointer-events none | 커서 이미지가 클릭을 막지 않게 합니다. | 아래 요소 클릭 가능 |
| 기본 이미지 지정 | 로드 직후 빈 이미지 방지 | checked 항목과 src 일치 |
| alt 변경 | 접근성을 개선합니다. | 선택 이미지 설명 갱신 |
| name 철자 정리 | 가독성을 높입니다. | fruits로 HTML/JS 모두 변경 |
이 예제들은 이벤트를 어디에 붙이느냐가 다릅니다. window, document, input에 붙은 이벤트가 각각 어느 범위를 담당하는지 구분해야 합니다.
| 대상 | 이벤트 | 범위 |
|---|---|---|
| window | onblur | 브라우저 창 포커스 상실 |
| window | onfocus | 브라우저 창 포커스 획득 |
| document | onmousemove | 문서 안 마우스 이동 |
| radio input | onclick | 개별 선택지 클릭 |
| body | onload | 페이지 로드 완료 후 초기화 |
마우스 좌표는 기준이 여러 가지입니다. 원본처럼 화면에 보이는 영역 기준으로 커서를 따라다니게 할 때는 clientX, clientY가 가장 이해하기 쉽습니다.
| 좌표 | 기준 | 사용 상황 |
|---|---|---|
| clientX | 브라우저 viewport 왼쪽 | 화면 안 마우스 위치 |
| clientY | 브라우저 viewport 위쪽 | 화면 안 마우스 위치 |
| pageX | 문서 전체 왼쪽 | 스크롤 포함 위치 |
| pageY | 문서 전체 위쪽 | 스크롤 포함 위치 |
| screenX | 모니터 화면 왼쪽 | 장치 화면 기준 위치 |
| screenY | 모니터 화면 위쪽 | 장치 화면 기준 위치 |
라디오 버튼 이미지는 value에 들어 있는 경로가 그대로 img.src로 들어갑니다. 이미지가 안 나오면 JavaScript보다 경로 문제를 먼저 확인하는 편이 빠릅니다.
| 확인 | 예시 | 해결 |
|---|---|---|
| 파일명 | banana.png | 실제 파일명과 대소문자를 맞춥니다. |
| 폴더명 | media/banana.png | HTML 기준 상대 경로를 확인합니다. |
| 초기 src | src="" | onload에서 checked 이미지를 넣습니다. |
| alt | 선택 이미지 | 선택에 맞게 설명을 바꿀 수 있습니다. |
| 크기 | width, height | 이미지 비율이 깨지지 않게 조정합니다. |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| JavaScript 계산기 · DOM 실습 완전 정리 (0) | 2026.07.06 |
|---|---|
| JavaScript 타이머 산수 · Enter 계산기 완전 정리 (0) | 2026.07.06 |
| JavaScript 산수 게임 완전 정리 (0) | 2026.07.06 |
| JavaScript 디지털시계 — setInterval·setTimeout 완전 정리 (0) | 2026.07.06 |
| JavaScript select + window.open 완전 정리 (0) | 2026.07.06 |
왕진 블로그

댓글