React-dnd: Chromeμ—μ„œ 잘λͺ»λœ dragPreview

에 λ§Œλ“  2017λ…„ 07μ›” 19일  Β·  20μ½”λ©˜νŠΈ  Β·  좜처: react-dnd/react-dnd

1) μ•„λž˜ μŠ€ν¬λ¦°μƒ·μ€ dragPreview와 κ΄€λ ¨λœ μ΄μƒν•œ 문제λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” λ“œλž˜κ·Έ κ°€λŠ₯ν•œ ν…Œμ΄λΈ” ν–‰ λ…Έλ“œκ°€ μ†ŒμŠ€μ™€ λŒ€μƒ λͺ¨λ‘μž…λ‹ˆλ‹€. μ–΄λ–€ 이유둜 λ“œλž˜κ·Έ λ―Έλ¦¬λ³΄κΈ°μ—λŠ” μ†ŒμŠ€ λ…Έλ“œ μŠ€ν¬λ¦°μƒ·λΏλ§Œ μ•„λ‹ˆλΌ μ•„λž˜μ˜ λͺ¨λ“  행도 ν¬ν•¨λ©λ‹ˆλ‹€! λ™μ‹œμ— λ“œλž˜κ·Έ μž‘μ—…μ€ 1개의 μ†ŒμŠ€μ— λŒ€ν•΄μ„œλ§Œ 호좜되고 λ“œλ‘­ ν•Έλ“€λŸ¬μ˜ μŠ€μ™‘μ€ 잘 μž‘λ™ν•©λ‹ˆλ‹€.

image

image

2) λ˜ν•œ 디버깅과 μ—°κ²°λœ μ΄μƒν•œ 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. dragSource λ…Έλ“œμ˜ λ Œλ”λ§ λ©”μ„œλ“œμ— 쀑단점을 놓고 앱을 계속 μ‹€ν–‰ν•˜λ©΄ λ“œλž˜κ·Έν•˜λŠ” λ™μ•ˆ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

μž‘νžˆμ§€ μ•Šμ€ 였λ₯˜: λ“œλ‘­ ν›„ ν˜Έλ²„λ₯Ό ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€.
λΆˆλ³€μ—μ„œ (browser.js?72b5:40)
DragDropManager.hoverμ—μ„œ (dragDrop.js?3115:111)
Object.evalμ—μ„œ [ν˜Έλ²„λ§μœΌλ‘œ] (DragDropManager.js?b07f:92)
HTML5Backend.handleTopDragEnterμ—μ„œ (HTML5Backend.js?5f50:495)

image

κ·ΈλŸ¬λ‚˜ μœ„μ—μ„œ μ„€λͺ…ν•œ dragPreview λ¬Έμ œκ°€ 사라지고 λ“œλž˜κ·Έ-λ“œλ‘­μ΄ μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€(ν•œ 번). 그런 λ‹€μŒ μ–΄λ”˜κ°€μ—μ„œ λ“œλ‘­ 이벀트 'λ“œλž˜κΉ…ν•˜λŠ” λ™μ•ˆ beginDragλ₯Ό 호좜 ν•  수 μ—†μŠ΅λ‹ˆλ‹€'였λ₯˜κ°€ λ°œμƒν•˜κ³  λ“œλž˜κ·Έκ°€ μ „ν˜€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μž‘νžˆμ§€ μ•ŠλŠ” 였λ₯˜: λ“œλž˜κ·Έν•˜λŠ” λ™μ•ˆ beginDragλ₯Ό ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€.
λΆˆλ³€μ—μ„œ (browser.js?72b5:40)
DragDropManager.beginDragμ—μ„œ (dragDrop.js?3115:50)
Object.evalμ—μ„œ [beginDrag둜] (DragDropManager.js?b07f:92)
HTML5Backend.handleTopDragStartμ—μ„œ (HTML5Backend.js?5f50:361)

image

λ²„κ·ΈλŠ” Chrome(57 및 59)μ—μ„œλ§Œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μ–΄λ–€ 아이디어?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚΄ 포함 μš”μ†Œμ— transform: translate3d(0, 0, 0)을 μΆ”κ°€ν•˜μ—¬ ν¬λ‘¬μ—μ„œ 이 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  20 λŒ“κΈ€

@tTwistTt μ •ν™•νžˆ 이 λ¬Έμ œμ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μˆ˜μ • 사항을 μ•Œμ•„λƒˆμŠ΅λ‹ˆκΉŒ?

@kaiomagalhaes 제 κ²½μš°μ—λŠ” ν–‰ 높이(μ…€ λ‚΄μš©)의 μžμ‹ μš”μ†Œ 쀑 ν•˜λ‚˜κ°€ μ‹€μ œλ‘œ ν–‰ 높이보닀 λ†’μ§€λ§Œ κ°€μ‹œμ„±μ— μ˜ν•΄ 숨겨져 CSS에 숨겨져 있기 λ•Œλ¬Έμ— 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ dragSourceμ—λŠ” ν–‰μ˜ λ„ˆλΉ„μ™€ μˆ¨κ²¨μ§„ 컨트둀의 높이가 μžˆμŠ΅λ‹ˆλ‹€. 도움이 λ˜μ…¨κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

@tTwistTt λ‚˜λŠ” overflow:hiddenμ—μ„œλ„ 같은 일이 μΌμ–΄λ‚œλ‹€λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 잘λͺ»λœ 미리보기 없이 이와 같은 μš”μ†Œλ₯Ό λ“œλž˜κ·Έν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

이 λ¬Έμ œλŠ” λ‹«ν˜”λŠ”λ° μ—¬μ „νžˆ 문제인 것 같은데 λ‹€μ‹œ μ—΄μ–΄μ•Ό ν•˜λŠ” 것 μ•„λ‹Œκ°€μš”?

λ˜ν•œ λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ“œλž˜κ·Έλ₯Ό μ‹œμž‘ν•  λ•Œ 미리보기가 λ„ˆλ¬΄ μ»€μ„œ μ˜€λ²„ν”Œλ‘œμ— μ˜ν•΄ μˆ¨κ²¨μ Έμ•Ό ν•˜λŠ” 뢀뢄을 μ‘΄μ€‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μ—¬κΈ°μ—μ„œ μš”μ†Œλ₯Ό λ“œλž˜κ·Έν•˜λŠ” 방법을 λ³Ό 수 μžˆμ§€λ§Œ κ·Έ μ˜†μ— μžˆλŠ” "ν…Œλ‘λ¦¬"도 미리보기의 μΌλΆ€μž…λ‹ˆλ‹€.

image

νŽΈμ§‘: μš”μ†Œμ— μƒλŒ€μ  μœ„μΉ˜ 이미지λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λŒ€μ‹  λ°°κ²½ 이미지가 μžˆλŠ” divλ₯Ό μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ λΆ€λͺ¨μ—κ²Œ λ„λ‹¬ν•˜λŠ” λ‚΄λΆ€ img μš”μ†Œκ°€ 문제λ₯Ό μΌμœΌν‚¨ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ ‘νžŒ div λž˜ν•‘λœ 재료 ui ν™•μž₯ νŒ¨λ„μ„ λ“œλž˜κ·Έν•  λ•Œ λΉ„μŠ·ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. κ²°κ΅­ νŒ¨λ„μ˜ 높이가 ν™•μž₯된 미리보기가 ν‘œμ‹œλ˜μ§€λ§Œ νŒ¨λ„ μ£Όλ³€μ˜ νŽ˜μ΄μ§€ μš”μ†Œκ°€ ν¬ν•¨λœ 미리보기가 ν‘œμ‹œλ©λ‹ˆλ‹€. νŒ¨λ„μ˜ 크기가 미리보기보닀 μž‘μŠ΅λ‹ˆλ‹€.

λ‚΄ 포함 μš”μ†Œμ— transform: translate3d(0, 0, 0)을 μΆ”κ°€ν•˜μ—¬ ν¬λ‘¬μ—μ„œ 이 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

@RahulRameshNarayan 이것도 μ €μ—κ²Œ
이것이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 이유λ₯Ό μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ?

@jsyvino ν¬λ‘¬μ—μ„œ λ‹€μ‹œ 그리기 λ¬Έμ œμž…λ‹ˆλ‹€. translate3dλŠ” ν•΄λ‹Ή μš”μ†Œμ—μ„œ 더 λ‚˜μ€ ν•˜λ“œμ›¨μ–΄ 가속을 κ°•μ œν•©λ‹ˆλ‹€. 이것은 λ˜ν•œ μ‚¬λžŒλ“€μ΄ 고해상도 ν™”λ©΄μ—μ„œ 슀크둀 μš”μ†Œμ˜ κΉœλ°•μž„μ„ ν•΄κ²°ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” ν•΄ν‚Ήμž…λ‹ˆλ‹€. λ‹€μŒ κΈ°μ‚¬μ—μ„œ 이 μ£Όμ œμ— λŒ€ν•΄ μžμ„Ένžˆ 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜λ“œμ›¨μ–΄ 가속 CSSλ₯Ό μ‚¬μš©ν•΄ λ΄…μ‹œλ‹€.
https://www.smashingmagazine.com/2012/06/play-with-hardware-accelerated-css/

Chrome의 가속 λ Œλ”λ§
https://www.html5rocks.com/en/tutorials/speed/layers/

페인트 λ³΅μž‘μ„± λ‹¨μˆœν™” 및 페인트 μ˜μ—­ κ°μ†Œ
https://developers.google.com/web/fundamentals/performance/rendering/simplify-paint-complexity-and-reduce-paint-areas

transform3d(0,0,0)은 전체 νŽ˜μ΄μ§€ μŠ€ν¬λ¦°μƒ· 문제λ₯Ό μˆ˜μ •ν•˜μ§€λ§Œ μš”μ†Œμ˜ μœ„μΉ˜κ°€ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
DragIssue

이 λ¬Έμ œλŠ” 크둬 기반 λΈŒλΌμš°μ €μ—μ„œλ§Œ λ°œμƒν•©λ‹ˆλ‹€.
λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆλŠ” μ‚¬λžŒμ΄ μžˆμ—ˆκ³  μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆμŠ΅λ‹ˆκΉŒ?

Material-UI ListItem을 λ“œλž˜κ·Έ κ°€λŠ₯ν•œ λ…Έλ“œλ‘œ μ‚¬μš©ν•  λ•Œ Chrome 75μ—μ„œλ„ 이 λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. overflow: hidden 에 ν¬ν•¨λœ Ripple μš”μ†Œκ°€ 크기 뢈일치의 원인이라고 μƒκ°ν•©λ‹ˆλ‹€.

@makr11이 μ–ΈκΈ‰ ν–ˆλ“―μ΄ @RahulRameshNarayan 의 μˆ˜μ •μ€ 이 문제λ₯Ό μ–΄λ–»κ²Œλ“  ν•΄κ²°ν•˜μ§€λ§Œ(λ“œλž˜κ·Έ λ―Έλ¦¬λ³΄κΈ°μ—μ„œ μ£Όλ³€ μš”μ†Œλ₯Ό μˆ¨κΉ€μœΌλ‘œμ¨), μ—¬μ „νžˆ ν•΄λ‹Ή μš”μ†Œκ°€ λ³΄μ΄λŠ” κ²ƒμ²˜λŸΌ μœ„μΉ˜ μ˜€ν”„μ…‹μ΄ μžˆμœΌλ―€λ‘œ μ—¬μ „νžˆ 'κΉ¨μ Έ μžˆμŠ΅λ‹ˆλ‹€. ' 제 μƒκ°μ—λŠ”.

DOM λ˜λŠ” λ„€μ΄ν‹°λΈŒ/HTML5 λ“œλž˜κ·Έ 미리보기 생성 μˆ˜μ€€μ—μ„œ λ³΄μ΄λŠ” 근본적인 λ¬Έμ œκ°€ 무엇인지 μ΄ν•΄ν•˜λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ? 이 문제λ₯Ό μ˜¬λ°”λ₯΄κ²Œ ν•΄κ²°ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ Chrome 75μ—μ„œ 이 λ¬Έμ œκ°€ λ°œμƒν•˜κ³  Firefoxμ—μ„œλŠ” μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€... λ‹€μ‹œ μ—΄μ–΄μ•Ό ν•©λ‹ˆλ‹€!

λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” κ΅¬μ²΄μ μ΄μ§€λ§Œ λˆ„κ΅°κ°€μ—κ²Œ 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” react-dndλ₯Ό μ‚¬μš©ν•˜λŠ” velocity-dashboardλ₯Ό μ‚¬μš©ν•˜κ³  λ‚΄λΆ€ μœ„μ ―(λ“œλž˜κ·Έ κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œ)은 react-chart-js둜 λ Œλ”λ§λ©λ‹ˆλ‹€. 차트-jsκ°€ μœ„μ ― λ‚΄λΆ€μ—μ„œ λ Œλ”λ§λ  λ•Œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μœ„μ ―μ΄ λ“œλž˜κ·Έ κ°€λŠ₯ν•˜λ©΄ κΈ°λ³Έ divκ°€ chart-js ꡬ성 μš”μ†Œκ°€ μ•„λ‹Œ μœ„μ ― 내뢀에 λ Œλ”λ§λ˜λ„λ‘ μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ, 그것은 κ½€ ꡬ체적이고 λ‚˜λŠ” κ·Έ μ£Όμ œμ— λŒ€ν•œ μ „λ¬Έκ°€λŠ” μ•„λ‹ˆμ§€λ§Œ μ•„λ§ˆλ„ 이것이 λˆ„κ΅°κ°€λ₯Ό λ„μšΈ κ²ƒμž…λ‹ˆλ‹€.

λ¬Έμ œλŠ” μ—¬μ „νžˆ μž¬ν˜„λ˜μ§€λ§Œ(Chrome 75.0.3770.100) μš”μ†Œλ₯Ό ν¬ν•¨ν•˜κΈ° μœ„ν•΄ transform: translate3d(0) 을 μΆ”κ°€ν•˜μ—¬ ν•΄κ²°λ©λ‹ˆλ‹€. @RahulRameshNarayan κ°μ‚¬ν•©λ‹ˆλ‹€

저도 같은 고민을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. transform: translate3d(0, 0, 0) λ₯Ό μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν•˜λ €κ³  ν–ˆμ§€λ§Œ @makr11 κ³Ό λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. https://github.com/react-dnd/react-dnd/issues/832#issuecomment -501292272

λ¬Έμ œλŠ” μ—¬μ „νžˆ 쑴재:
μ‚¬νŒŒλ¦¬ 13.0.1
크둬 80

transform: translate3d(0, 0, 0) 도움이 λ˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€μ˜ λ‹€λ₯Έ μŠ€νƒ€μΌ/μš”μ†Œμ— 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

@mismith μ •ν™•νžˆ 이 문제(MUI ListItem μ‚¬μš©)둜 어렀움을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€.

@dotbear μŠ¬ν”„κ²Œλ„, λ‚˜λŠ” 단지 그것과 ν•¨κ»˜ μ‚΄κ³  μžˆμŠ΅λ‹ˆλ‹€ :(

λ‚˜λŠ” 이 λ¬Έμ œκ°€ κ±°λŒ€ν•œ μ˜€ν”„μ…‹ 문제λ₯Ό ν”Όν•˜λŠ” 곡식적인 ν•΄κ²° 방법 없이 μ’…λ£Œλ˜μ–΄μ„œλŠ” μ•ˆ λœλ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€.

이 λ¬Έμ œμ™€ κ΄€λ ¨λœ λ‰΄μŠ€κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
3 / 5 - 1 λ“±κΈ‰