TOAST UI - ํ„ฐ์น˜์™€ ํด๋ฆญ ์ด๋ฒคํŠธ ๊ธ€์—์„œ ์ƒ๊ธด ์˜๋ฌธ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

ํ„ฐ์น˜ & ํด๋ฆญ ?!

 

ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ๋‹ฌ์•˜๋Š”๋ฐ ์™œ ํด๋ฆญ ์ด๋ฒคํŠธ๊นŒ์ง€ ๋ฐœ์ƒํ•˜๋‚˜์š”?

  • ํ„ฐ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‚ด๊ฐ€ ๋ณ„๋„๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋‹ฌ์ง€ ์•Š์•˜์–ด๋„ click ์ด๋ฒคํŠธ๊ฐ€ ์ค‘๋ณต์œผ๋กœ ๋ฐœ์ƒํ•ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
    ์™œ ์ด๋Ÿฐ ๋™์ž‘์ด ์ผ์–ด๋‚˜๋Š” ๊ฑธ๊นŒ์š”?
  • ์›น์€ ์˜ค๋žซ๋™์•ˆ ๋งˆ์šฐ์Šค ํด๋ฆญ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜๊ณ  ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€๊ธˆ๊นŒ์ง€ ๋งŽ์€ ์‚ฌ์ดํŠธ๊ฐ€ ์˜ค์ง click ์ด๋ฒคํŠธ๋งŒ ๋“ฃ๊ณ  ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ˜ธํ™˜์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•ด ํ„ฐ์น˜ ์‹œ ์ž๋™์œผ๋กœ click ์ด๋ฒคํŠธ๋„ ํ•จ๊ป˜ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ์„ค๊ณ„๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํ„ฐ์น˜์Šคํฌ๋ฆฐ ํ™˜๊ฒฝ์—์„œ๋„ ๊ธฐ์กด ๋งˆ์šฐ์Šค ์ค‘์‹ฌ ์‚ฌ์ดํŠธ๋“ค์ด ๋ณ„๋„ ์ˆ˜์ • ์—†์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ„ฐ์น˜ ์ด๋ฒคํŠธ ํ›„ click ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒŒ ์™œ ํŽธ์˜์ผ๊นŒ์š”?

  • ์—ฌ๋Ÿฌ ์ž๋ฃŒ์—์„œ ์ด๊ฑธ ํŽธ์˜๋ผ๊ณ  ํ•˜๋˜๋ฐ ํ‘œํ˜„์ด ๋„ˆ๋ฌด ํฌ๊ด„์ ์œผ๋กœ ๋А๊ปด์ ธ์„œ ๊ทธ๋Ÿฐ์ง€ ์ฒ˜์Œ์—๋Š” ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ œ๊ฐ€ ์ฐพ์•„๋ณธ ํ›„ ์ดํ•ดํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค!
    • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์‚ฌ์ดํŠธ๊ฐ€ ํ„ฐ์น˜/ํด๋ฆญ ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋Š”์ง€, ์–ด๋–ค ์‹์œผ๋กœ ์˜๋„ํ–ˆ๋Š”์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋ž˜์„œ ์ผ๊ด„์ ์œผ๋กœ, ํ„ฐ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ click ์ด๋ฒคํŠธ๋„ ๊ฐ™์ด ๋ฐœ์ƒํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ €ํฌ๊ฐ€ ๋งŒ๋“  ์‚ฌ์ดํŠธ๋งŒ ๋„์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•„์ฃผ ๋งŽ์€ ์‚ฌ์ดํŠธ๋ฅผ ๋™์‹œ์— ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ๋„์ž… ์ดˆ๊ธฐ์—” ๋Œ€๋ถ€๋ถ„ ์˜ค์ง ํด๋ฆญ ์ด๋ฒคํŠธ๋งŒ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋งŒ ๋ฐœ์ƒ์‹œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์˜›๋‚  ์‚ฌ์ดํŠธ๋“ค์ด ๋ชจ๋ฐ”์ผ์—์„œ ๋จนํ†ต์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ„ฐ์น˜ ์‹œ ์ž๋™์œผ๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ๋„ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ์„ค๊ณ„๋˜์—ˆ๊ณ  ๊ธฐ์กด ํด๋ฆญ ๊ธฐ๋ฐ˜ ์‚ฌ์ดํŠธ์™€์˜ ํ˜ธํ™˜์„ฑ๋„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 

React ๋“ฑ์—์„œ๋„ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ์š”?

  • ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” React ๊ธฐ์ค€์œผ๋กœ ์—ฌ๊ธฐ์„œ๋„ ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฒคํŠธ ์œ„์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•ด์š”.
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ„ฐ์น˜ ์ด๋ฒคํŠธ ํ›„ ์ž๋™์œผ๋กœ ๋งˆ์šฐ์Šค์™€ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฑด React ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • React๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์‹ธ๋Š” SyntheticEvent๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋™์ž‘์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ ์œ„์ž„์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๊ฑด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด์ง€ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋™์ž‘์„ ๋ฐ”๊พธ๋Š”๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ด€๋ จ ํ† ๋ก ์ธ GitHub ์ด์Šˆ #9809๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด,
    • preventDefault() ๋ฌดํšจํ™”: React์˜ ํ•ฉ์„ฑ ์ด๋ฒคํŠธ์—์„œ e.prevnetDefault()๊ฐ€ ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐฉ์ง€์— ์‹คํŒจ
    • ๋„ค์ดํ‹ฐ๋ธŒ DOM API๋Š” ์ž‘๋™: addEventListener๋กœ ์ง์ ‘ ๋“ฑ๋กํ•˜๋ฉด preventDefault()๊ฐ€ ์ •์ƒ ๋™์ž‘
    • ๋ธŒ๋ผ์šฐ์ €๋ณ„ ์ฐจ์ด: Chrome, Firefox, Safari์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ (์ถ”๊ฐ€ ํ™•์ธ์ด ํ•„์š”)
  • ์œ„์˜ ๋‚ด์šฉ์€ ๊ด€๋ จ ์ด์Šˆ๋ฅผ ์ง์ ‘ ๋ณด๊ณ  ์ƒ์„ธ ๋‚ด์šฉ๊ณผ ์ด์œ ๋ฅผ ํ™•์ธํ•ด ๋ณด๋Š”๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
  • ์ด์Šˆ์—์„œ ์ œ์‹œ๋œ ํ•ด๊ฒฐ์ฑ…๋“ค๋„ ์งง๊ฒŒ๋ผ๋„ ์ •๋ฆฌํ•ด ๋ณด๊ฒŸ์Šต๋‹ˆ๋‹ค.
// ๋ฐฉ๋ฒ• 1: ๋„ค์ดํ‹ฐ๋ธŒ DOM API ์‚ฌ์šฉ
componentDidMount() {
  this.elem.addEventListener('touchstart', e => {
    e.preventDefault(); // ์ด๊ฑด ์ž‘๋™ํ•จ
  });
}

// ๋ฐฉ๋ฒ• 2: ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ
handleTouchStart(event) {
  this.hasBeenTouchedRecently = true;
  setTimeout(() => { 
    this.hasBeenTouchedRecently = false; 
  }, 500);
}

handleMouseDown(event) {
  if(this.hasBeenTouchedRecently) {
    return; // ํ„ฐ์น˜ ํ›„ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๋ฌด์‹œ
  }
}

 

 

 

๋ทฐํฌํŠธ ๋ฉ”ํƒ€ ํƒœ๊ทธ์™€ ๋ฐ์Šคํฌํƒ‘/๋ชจ๋ฐ”์ผ ๋™์‹œ ์ง€์›์˜ ๋ฌธ์ œ๋Š” ์—†์„๊นŒ์š”?

 <meta name="viewport" content="width=device-width">
  •  ์œ„ ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด ๋ชจ๋ฐ”์ผ์—์„œ ํ„ฐ์น˜ ๋”œ๋ ˆ์ด๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ์ด ํƒœ๊ทธ๋Š” ๋ชจ๋ฐ”์ผ๋งŒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์Šคํฌํƒ‘์— ํฌํ•จํ•ด๋„ ๋ฌด๋ฐฉํ•ด์š”.

 

ํ„ฐ์น˜/ํด๋ฆญ ๋”œ๋ ˆ์ด๋Š” 2025๋…„์—๋„ ๋˜‘๊ฐ™์ด ๋ฐœ์ƒํ• ๊นŒ์š”?

  • ๊ณผ๊ฑฐ์—” 300ms์˜ ํ„ฐ์น˜→ํด๋ฆญ ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ํ˜„์žฌ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๋ทฐํฌํŠธ ๋ฉ”ํƒ€ ํƒœ๊ทธ๋‚˜ CSS ์„ธํŒ…๋งŒ ์ž˜ ํ•˜๋ฉด ๋”œ๋ ˆ์ด ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“ƒ ์ฐธ๊ณ  ๋ฌธํ—Œ  
Chrome ๊ฐœ๋ฐœ์ž ๋ธ”๋กœ๊ทธ - A More Compatible, Smoother Touch
quirksmode

 

+ Recent posts