Pointer Events πŸ‘†

두선아 DusunaΒ·2025λ…„ 3μ›” 22일

MDN pointer events: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events

Pointer Events πŸ‘†

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ©€ν‹° ν„°μΉ˜λ₯Ό κ΅¬ν˜„ν•˜λ €λ©΄ ν„°μΉ˜ 이벀트 ν˜Ήμ€ 포인터 이벀트λ₯Ό ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ›Ήμ—μ„œ ν„°μΉ˜ μž…λ ₯을 μ²˜λ¦¬ν•  λ•Œ 포인터 이벀트(Pointer Events) 와 ν„°μΉ˜ 이벀트(Touch Events) 쀑 ν•˜λ‚˜λ₯Ό 선택할 수 μžˆλŠ”λ°, 두 방식 λͺ¨λ‘ λ©€ν‹° ν„°μΉ˜μ™€ 제슀처 감지λ₯Ό μ§€μ›ν•˜μ§€λ§Œ 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

Touch eventsλŠ” ν„°μΉ˜ μŠ€ν¬λ¦°μ—μ„œ λ°œμƒν•˜λŠ” μ΄λ²€νŠΈμ΄λ―€λ‘œ λͺ¨λ°”μΌμ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” μ•±μ˜ κ²½μš°μ— μ μ ˆν•©λ‹ˆλ‹€. Pointer EventsλŠ” ν„°μΉ˜, 마우슀, μŠ€νƒ€μΌλŸ¬μŠ€(펜) μž…λ ₯을 ν•œ DOM μ΄λ²€νŠΈμ—μ„œ μ „λΆ€ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.

PointerEvent κ°μ²΄λŠ” MouseEvent의 λͺ¨λ“  속성을 상속받고, pressure, contact geometry, tilt와 같은 μΆ”κ°€ 속성을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ κ΄€λ ¨ κ°œλ…

digitizer

ν„°μΉ˜λ₯Ό 감지할 수 μžˆλŠ” κΈ°κΈ°

pointer

νŠΉμ • 기기에 μ’…μ†λ˜μ§€ μ•Šκ³ , 슀크린의 νŠΉμ • μ’Œν‘œ(ν˜Ήμ€ μ’Œν‘œλ“€)을 선택할 수 μžˆλŠ” μž…λ ₯

pointer capture

νŠΉμ • μš”μ†Œμ— pointer 이벀트λ₯Ό μž¬νƒ€κ²ŸνŒ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ pointer down μ‹œ DOM에 μš”μ†Œλ₯Ό appendν•˜κ³  κ³„μ†ν•΄μ„œ Pointer Eventλ₯Ό λ°›κ²Œν•˜κ³  μ‹Άλ‹€λ©΄, setPointerCapture와 pointer idλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” releasePointerCaptureλ₯Ό μ‚¬μš©ν•΄ ν•΄μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ PointerEvent μΈν„°νŽ˜μ΄μŠ€

altitudeAngle

μ• ν”Œ 펜슬과 같은 μŠ€νƒ€μΌλŸ¬μŠ€κ°€ 화면에 닿을 λ•Œ, μŠ€νƒ€μΌλŸ¬μŠ€μ˜ 좕이 ν™”λ©΄μ˜ X-Y 평면과 μ΄λ£¨λŠ” 각도 (포인터가 화면에 μ–Όλ§ˆλ‚˜ κΈ°μšΈμ–΄μ‘ŒλŠ”μ§€)

azimuthAngle

ν¬μΈν„°μ˜ 좕이 Y-Z 평면과 포인터 μΆ• 및 Y 좕을 ν¬ν•¨ν•˜λŠ” 평면 μ‚¬μ΄μ˜ 각도 (포인터가 μ–Όλ§ˆλ‚˜ νšŒμ „ν–ˆλŠ”μ§€)

PointerEvent.persistentDeviceId

포인터 이벀트λ₯Ό μƒμ„±ν•œ ν¬μΈνŒ… μž₯치의 고유 ID

pointerId

λ°œμƒ 포인터 이벀트의 고유 μ‹λ³„μž

width, height

포인터가 μ ‘μ΄‰ν•œ X, Y에 λŒ€ν•œ px λ‹¨μœ„ 크기

pressure

포인터가 화면에 μ§μ ‘μ μœΌλ‘œ λˆ„λ₯΄λŠ” νž˜μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. (0μ—μ„œ 1 사이, 0은 μ΅œμ†Œ μ••λ ₯, 1은 μ΅œλŒ€ μ••λ ₯)

tangentialPressure

포인터가 화면에 μˆ˜ν‰μœΌλ‘œ κ°€ν•˜λŠ” μ••λ ₯, 즉 μΈ‘λ©΄ μ••λ ₯을 μΈ‘μ •ν•©λ‹ˆλ‹€. μ΄λŠ” ν¬μΈν„°μ˜ 좕을 μ€‘μ‹¬μœΌλ‘œ μ˜†μœΌλ‘œ λˆŒλ¦¬λŠ” νž˜μ„ μ˜λ―Έν•©λ‹ˆλ‹€. (-1μ—μ„œ 1, 0은 쀑립)

tiltX, tiltY

  • tiltX: Y-Z 평면과 포인터 μΆ• 및 Y 좕을 ν¬ν•¨ν•˜λŠ” 평면 μ‚¬μ΄μ˜ 각도
  • tiltY: X-Z 평면과 포인터 μΆ• 및 X 좕을 ν¬ν•¨ν•˜λŠ” 평면 μ‚¬μ΄μ˜ 각도

twist

ν¬μΈν„°μ˜ μ£Όμš” 좕을 μ€‘μ‹¬μœΌλ‘œ μ‹œκ³„ λ°©ν–₯으둜 νšŒμ „ν•œ 정도(0μ—μ„œ 359도).

pointerType

이벀트λ₯Ό λ°œμƒμ‹œν‚¨ μž₯치의 μœ ν˜•
"mouse", "touch", "pen"(stylus), ""(λΈŒλΌμš°μ €μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠμŒ)

isPrimary

λ©€ν‹° 포인트 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ, ν˜„μž¬ 포인터가 ν•΄λ‹Ή 포인터 μœ ν˜•μ˜ κΈ°λ³Έ 포인터인지 μ—¬λΆ€

예λ₯Ό λ“€μ–΄, λ§ˆμš°μŠ€μ™€ ν„°μΉ˜μŠ€ν¬λ¦°μ„ ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ£Όμš” ν¬μΈν„°λ§Œ μ§€μ›ν•˜κ³ , μ£Όμš” 포인터가 μ•„λ‹Œ λͺ¨λ“  포인터 이벀트λ₯Ό λ¬΄μ‹œν•˜λ„λ‘ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€

  • λ§ˆμš°μŠ€λŠ” ν•˜λ‚˜μ˜ ν¬μΈν„°λ§Œ 있기 λ•Œλ¬Έμ— 항상 μ£Όμš” ν¬μΈν„°λ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.
  • ν„°μΉ˜ μž…λ ₯의 경우, μ‚¬μš©μžκ°€ 화면을 ν„°μΉ˜ν–ˆμ„ λ•Œ, λ‹€λ₯Έ ν„°μΉ˜κ°€ ν™œμ„±ν™”λ˜μ§€ μ•Šμ•˜λ‹€λ©΄, ν¬μΈν„°λŠ” μ£Όμš” ν¬μΈν„°μž…λ‹ˆλ‹€.
  • 펜/μŠ€νƒ€μΌλŸ¬μŠ€ μž…λ ₯의 경우, μ‚¬μš©μžκ°€ 화면에 νŽœμ„ 처음 μ ‘μ΄‰ν–ˆμ„ λ•Œ λ‹€λ₯Έ 펜이 화면에 μ ‘μ΄‰λ˜μ–΄ μžˆμ§€ μ•Šμ•˜λ‹€λ©΄, ν¬μΈν„°λŠ” μ£Όμš” ν¬μΈν„°μž…λ‹ˆλ‹€.

πŸ“Œ Event와 μ „μ—­ μ΄λ²€νŠΈν•Έλ“€λŸ¬

Pointer EventλŠ” 총 10개의 μ΄λ²€νŠΈμ™€ 1개의 μ‹€ν—˜μ  이벀트λ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 쀑 7κ°œλŠ” 마우슀 μ΄λ²€νŠΈμ— λŒ€μ‘ν•©λ‹ˆλ‹€. (down, up, move, over, out, enter, leave)

μ΄λ²€νŠΈμ„€λͺ…상황
pointerdown포인터가 λ²„νŠΌ ν™œμ„± μƒνƒœλ‘œ λ³€ν•  λ•Œ λ°œμƒν΄λ¦­/ν„°μΉ˜ μ‹œμž‘
pointerup포인터가 더 이상 ν™œμ„± μƒνƒœκ°€ 아닐 λ•Œ λ°œμƒν΄λ¦­/ν„°μΉ˜ 끝
pointermoveν¬μΈν„°μ˜ μ’Œν‘œ λ³€κ²½ μ‹œ λ°œμƒλ§ˆμš°μŠ€/ν„°μΉ˜ 이동
pointerover포인터가 μš”μ†Œμ˜ hit test 경계에 λ“€μ–΄μ˜¬ λ•Œ λ°œμƒλ§ˆμš°μŠ€/손가락이 μš”μ†Œλ‘œ λ“€μ–΄μ˜¬ λ•Œ
pointerout포인터가 μš”μ†Œμ˜ hit test κ²½κ³„μ—μ„œ λ‚˜κ°ˆ λ•Œ λ°œμƒλ§ˆμš°μŠ€/손가락이 μš”μ†Œλ₯Ό λ²—μ–΄λ‚  λ•Œ
pointerenter포인터가 μš”μ†Œ λ˜λŠ” μžμ‹ μš”μ†Œμ˜ hit test 경계에 λ“€μ–΄μ˜¬ λ•Œ λ°œμƒλ§ˆμš°μŠ€/손가락이 μš”μ†Œμ— 닿을 λ•Œ
pointerleave포인터가 μš”μ†Œμ˜ hit test κ²½κ³„μ—μ„œ λ‚˜κ°ˆ λ•Œ λ°œμƒλ§ˆμš°μŠ€/손가락이 μš”μ†Œμ—μ„œ λ²—μ–΄λ‚  λ•Œ
pointercancelλΈŒλΌμš°μ €κ°€ 포인터가 더 이상 이벀트λ₯Ό λ°œμƒμ‹œν‚¬ 수 μ—†λ‹€κ³  νŒλ‹¨ν•  λ•Œ λ°œμƒμž₯치 λΉ„ν™œμ„±ν™”
gotpointercaptureμš”μ†Œκ°€ pointer captureλ₯Ό λ°›μ•˜μ„ λ•Œ λ°œμƒpointer capture μ‹œμž‘
lostpointercapturepointer captureκ°€ ν•΄μ œλ  λ•Œ λ°œμƒpointer capture ν•΄μ œ
pointerrawupdate포인터가 pointerdown/up μ™Έ μ†μ„±μ—μ„œ λ³€κ²½ μ‹œ λ°œμƒ (μ‹€ν—˜μ )펜의 μ••λ ₯/기울기 λ³€ν™” μ‹œ

πŸ“Œ Elementλ₯Ό ν™•μž₯ν•œ 3κ°€μ§€ 속성

λ©”μ„œλ“œμ„€λͺ…
setPointerCapture()νŠΉμ • μš”μ†Œλ₯Ό 미래의 포인터 μ΄λ²€νŠΈμ— λŒ€ν•œ pointer capture λŒ€μƒμœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
releasePointerCapture()νŠΉμ • 포인터 μ΄λ²€νŠΈμ— λŒ€ν•΄ 이전에 μ„€μ •λœ pointer captureλ₯Ό ν•΄μ œν•©λ‹ˆλ‹€.
hasPointerCapture()μ£Όμ–΄μ§„ pointer id에 λŒ€ν•΄ pointer captureκ°€ μ„€μ •λœ μš”μ†ŒμΈμ§€ ν™•μΈν•©λ‹ˆλ‹€.

πŸ“Œ Navigator

Navigator.maxTouchPointsλŠ” μž₯μΉ˜κ°€ λ™μ‹œμ— 지원할 수 μžˆλŠ” μ΅œλŒ€ ν„°μΉ˜ 포인트 수λ₯Ό ν™•μΈν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ†μ„±μž…λ‹ˆλ‹€. 이 속성은 ν„°μΉ˜μŠ€ν¬λ¦° μž₯μΉ˜μ—μ„œ μ—¬λŸ¬ 손가락을 λ™μ‹œμ— 인식할 수 μžˆλŠ” μ΅œλŒ€ 수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

if (navigator.maxTouchPoints > 1) {
  console.log('이 μž₯μΉ˜λŠ” λ©€ν‹° ν„°μΉ˜λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€');
} else {
  console.log('이 μž₯μΉ˜λŠ” λ©€ν‹° ν„°μΉ˜λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ == ν„°μΉ˜ 기반 μž…λ ₯을 μ§€μ›ν•˜μ§€ μ•ŠμŒ');
}

πŸ“Œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‚¬μš©μ˜ˆ

μ΄λ²€νŠΈν•Έλ“€λŸ¬ ꡬ독

DOM에 κ·Έλ €μ§„ target μš”μ†Œμ— 이벀트 ν•Έλ“€λŸ¬λ₯Ό κ΅¬λ…ν•©λ‹ˆλ‹€.

<div id="target">Touch me…</div>
function over_handler(event) {}
function enter_handler(event) {}
function down_handler(event) {}
function move_handler(event) {}
function up_handler(event) {}
function cancel_handler(event) {}
function out_handler(event) {}
function leave_handler(event) {}
function rawUpdate_handler(event) {}
function gotCapture_handler(event) {}
function lostCapture_handler(event) {}

function init() {
  const el = document.getElementById("target");
  // Register pointer event handlers
  el.onpointerover = over_handler;
  el.onpointerenter = enter_handler;
  el.onpointerdown = down_handler;
  el.onpointermove = move_handler;
  el.onpointerup = up_handler;
  el.onpointercancel = cancel_handler;
  el.onpointerout = out_handler;
  el.onpointerleave = leave_handler;
  el.onpointerrawupdate = rawUpdate_handler;
  el.ongotpointercapture = gotCapture_handler;
  el.onlostpointercapture = lostCapture_handler;
}

document.addEventListener("DOMContentLoaded", init);

이벀트 ν•Έλ“€λŸ¬ μ˜ˆμ‹œ

function down_handler(ev) {
  // 포인트 이벀트의 면적 계산
  const area = ev.width * ev.height;

  // ν˜„μž¬ 이벀트의 idκ°€ μΊμ‹œλ˜μ–΄ μžˆλŠ” μ§€ 확인
  if (id === ev.identifier) process_id(ev);

  // pointerType에 λ”°λ₯Έ ν•Έλ“€λŸ¬ 호좜
  switch (ev.pointerType) {
    case "mouse":
      process_mouse(ev);
      break;
    case "pen":
      process_pen(ev);
      break;
    case "touch":
      process_touch(ev);
      break;
    default:
      console.log(`pointerType ${ev.pointerType} is not supported`);
  }

  // tilt ν•Έλ“€λŸ¬ 호좜
  if (ev.tiltX !== 0 && ev.tiltY !== 0) process_tilt(ev.tiltX, ev.tiltY);

  // pressure ν•Έλ“€λŸ¬ 호좜
  process_pressure(ev.pressure);

  // λ©€ν‹° ν¬μΈν„°μ˜ 경우, primary ν•Έλ“€λŸ¬κ°€ μ•„λ‹Œ 경우의 ν•Έλ“€λŸ¬ 호좜
  if (!ev.isPrimary) process_non_primary(ev);
}

function init() {
  const el = document.getElementById("target");
  // DOM μš”μ†Œμ— 이벀트 ꡬ독
  el.onpointerdown = down_handler;
}

document.addEventListener("DOMContentLoaded", init);

πŸ“Œ Button State

λ§ˆμš°μŠ€μ™€ 펜 λ“±μ˜ κΈ°κΈ°λŠ” μ—¬λŸ¬κ°œμ˜ λ²„νŠΌμ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. buttonκ³Ό buttons 속성을 ν†΅ν•΄μ„œ μ–΄λ–€ λ²„νŠΌμ΄ λˆŒλ ΈλŠ” μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μƒνƒœbuttonbuttons
λ²„νŠΌμ΄λ‚˜ ν„°μΉ˜/펜 접촉이 λ§ˆμ§€λ§‰ 이벀트 이후 λ³€κ²½λ˜μ§€ μ•ŠμŒ-1β€”
λ²„νŠΌμ΄ λˆŒλ¦¬μ§€ μ•Šμ€ μƒνƒœμ—μ„œ λ§ˆμš°μŠ€κ°€ μ›€μ§μ΄κ±°λ‚˜, λ²„νŠΌμ΄ λˆŒλ¦¬μ§€ μ•Šμ€ μƒνƒœμ—μ„œ 펜이 ν˜Έλ²„ 쀑일 λ•Œβ€”0
μ™Όμͺ½ 마우슀, ν„°μΉ˜ 접촉, 펜 접촉01
κ°€μš΄λ° 마우슀14
였λ₯Έμͺ½ 마우슀, 펜 배럴 λ²„νŠΌ22
X1 (λ’€λ‘œ) 마우슀38
X2 (μ•žμœΌλ‘œ) 마우슀416
펜 μ§€μš°κ°œ λ²„νŠΌ532

πŸ“Œ Pointer Capture

포인터 μΊ‘μ²˜λŠ” νŠΉμ • 포인터 μ΄λ²€νŠΈκ°€ ν¬μΈν„°μ˜ μœ„μΉ˜μ—μ„œ κΈ°μ‘΄ hit test λŒ€μ‹ μ— νŠΉμ • μš”μ†Œλ‘œ μž¬νƒ€κ²ŸνŒ…λ˜λ„λ‘ ν•©λ‹ˆλ‹€. λ§Œμ•½ 포인터 μž₯치의 접촉이 μš”μ†Œλ₯Ό λ²—μ–΄λ‚˜λ”λΌλ„(μŠ€ν¬λ‘€μ΄λ‚˜ 팬으둜 이동) ν•΄λ‹Ή μš”μ†Œκ°€ κ³„μ†ν•΄μ„œ 포인터 이벀트λ₯Ό 받을 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

포인터 μΊ‘μ²˜λŠ” νƒ€κ²Ÿ μš”μ†Œκ°€ μ΄ν›„μ˜ 포인터 이벀트λ₯Ό 마치 κ·Έ μš”μ†Œμ—μ„œ μΌμ–΄λ‚œ κ²ƒμ²˜λŸΌ μΊ‘μ²˜ν•  수 있게 ν•˜κΈ° λ•Œλ¬Έμ—, μΊ‘μ²˜κ°€ μ„€μ •λ˜λ©΄ pointerover, pointerenter, pointerleave, pointerout μ΄λ²€νŠΈκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν„°μΉ˜μŠ€ν¬λ¦° λΈŒλΌμš°μ €μ—μ„œλŠ” pointerdown μ΄λ²€νŠΈκ°€ 트리거될 λ•Œ ν•΄λ‹Ή μš”μ†Œμ— μ•”μ‹œμ μœΌλ‘œ 포인터 μΊ‘μ²˜κ°€ μ„€μ •λ©λ‹ˆλ‹€. μΊ‘μ²˜λŠ” pointerup λ˜λŠ” pointercancel 이벀트 ν›„ μžλ™μœΌλ‘œ ν•΄μ œλ˜κ³ , element.releasePointerCaptureλ₯Ό ν˜ΈμΆœν•˜μ—¬ μˆ˜λ™μœΌλ‘œ ν•΄μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ touch-action CSS 속성

button {
  touch-action: none; // ν„°μΉ˜ λ™μž‘μ„ μ μš©ν•˜μ§€ μ•ŠμŒ
}

#target {
  touch-action: pan-x; // pan-xλ₯Ό μ œμ™Έν•œ ν„°μΉ˜ λ™μž‘ μ œν•œ
}

touch-action CSS 속성은 λΈŒλΌμš°μ €κ°€ νŠΉμ • μ˜μ—­μ— λŒ€ν•΄ λ„€μ΄ν‹°λΈŒ ν„°μΉ˜ λ™μž‘(예: ν™•λŒ€/μΆ•μ†Œ λ˜λŠ” 슀크둀)을 μ μš©ν• μ§€ μ—¬λΆ€λ₯Ό μ§€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

  • auto(κΈ°λ³Έκ°’): λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ ν„°μΉ˜ λ™μž‘ ν—ˆμš©
  • none: λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ ν„°μΉ˜ λ™μž‘ λΉ„ν™œμ„±ν™”
  • pan-x: μˆ˜ν‰ 슀크둀만 κ°€λŠ₯
  • pan-y: 수직 슀크둀만 κ°€λŠ₯
  • manipulation: 슀크둀 및 ν™•λŒ€/μΆ•μ†Œ λ™μž‘λ§Œ κ°€λŠ₯

πŸ“Œ 사둀

마우슀 μ΄λ²€νŠΈμ™€μ˜ ν˜Έν™˜μ„± 문제 μ˜ˆμ‹œ

포인터 이벀트 μΈν„°νŽ˜μ΄μŠ€λŠ” 포인터가 κ°€λŠ₯ν•œ μž₯μΉ˜μ—μ„œ ν–₯μƒλœ μ‚¬μš©μž κ²½ν—˜μ„ λ§Œλ“€ 수 있게 ν•΄μ£Όμ§€λ§Œ, μ›Ή μ½˜ν…μΈ μ˜ λŒ€λΆ€λΆ„μ€ 마우슀 μž…λ ₯에 맞좰 μ„€κ³„λœ κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

μ΄μƒμ μœΌλ‘œλŠ” Ponter Eventsκ°€ κ°€λŠ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 마우슀 μž…λ ₯을 λͺ…μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. pointerdown 이벀트λ₯Ό μ·¨μ†Œν•¨μœΌλ‘œμ¨ νŠΉμ • 마우슀 이벀트의 생성을 λ°©μ§€ν•  수 μžˆμ§€λ§Œ, μ•„λž˜μ™€ 같은 λͺ‡ κ°€μ§€ 문제점이 생길 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 마우슀 μ΄λ²€νŠΈλŠ” 포인터가 눌린 μƒνƒœμΌ λ•Œλ§Œ λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ²„νŠΌμ΄ λˆŒλ¦¬μ§€ μ•Šμ€ μƒνƒœμ˜ 마우슀(예: 마우슀만 ν˜Έλ²„λ§ 쀑인 경우)λŠ” 마우슀 이벀트λ₯Ό λ°©μ§€ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • mouseover, mouseout, mouseenter, mouseleave μ΄λ²€νŠΈλŠ” 포인터가 눌린 μƒνƒœμ—¬λ„ μ ˆλŒ€ λ°©μ§€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이벀트 ν•Έλ“€λŸ¬μ—μ„œ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ€ μ΅œμ†Œν™”

이벀트 ν•Έλ“€λŸ¬ λ‚΄μ—μ„œ λ„ˆλ¬΄ λ§Žμ€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°€λŠ₯ν•œ ν•œ 이벀트 ν•Έλ“€λŸ¬ λ‚΄μ˜ μž‘μ—…μ„ κ°„κ²°ν•˜κ²Œ μœ μ§€ν•˜μ„Έμš”.

이벀트 ν•Έλ“€λŸ¬λ₯Ό νŠΉμ • λŒ€μƒ μš”μ†Œμ— 직접 μΆ”κ°€

이벀트 ν•Έλ“€λŸ¬λ₯Ό λ¬Έμ„œ μ „μ²΄λ‚˜ μƒμœ„ λ…Έλ“œμ— μΆ”κ°€ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ”, νŠΉμ • λŒ€μƒ μš”μ†Œμ— μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 이벀트 처리의 νš¨μœ¨μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ€μƒ μš”μ†Œκ°€ μΆ©λΆ„νžˆ 컀야 함

λŒ€μƒ μš”μ†Œ(λ…Έλ“œ)의 ν¬κΈ°λŠ” κ°€μž₯ 큰 접촉 ν‘œλ©΄ μ˜μ—­μ„ μˆ˜μš©ν•  수 μžˆμ„ 만큼 μΆ©λΆ„νžˆ 컀야 ν•©λ‹ˆλ‹€ (손가락 ν„°μΉ˜κ°€ κ°€λŠ₯해야함).

λ§Œμ•½ λŒ€μƒ μ˜μ—­μ΄ λ„ˆλ¬΄ μž‘μœΌλ©΄, ν•΄λ‹Ή μš”μ†Œλ₯Ό ν„°μΉ˜ν–ˆμ„ λ•Œ μΈμ ‘ν•œ λ‹€λ₯Έ μš”μ†Œμ˜ μ΄λ²€νŠΈκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

profile
μ•ˆλ…•ν•˜μ„Έμš”.

0개의 λŒ“κΈ€