Panzoom: ํ•€์น˜ ์คŒ์€ ์ด๋ฏธ์ง€๋ฅผ ํ™”๋ฉด ์ค‘์•™์—์„œ ๋ฉ€์–ด์ง€๊ฒŒ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 09์›” 21์ผ  ยท  19์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: timmywil/panzoom

๋ฒ„๊ทธ ์„ค๋ช…

์–ด๋–ค ์ด์œ ๋กœ ๋ชจ๋ฐ”์ผ(๋ชจ๋“  ์žฅ์น˜)์—์„œ ๋‚ด Panzoom ์•ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•€์น˜ ์คŒ์„ ์‹œ๋„ํ•˜๋ฉด ํ™•๋Œ€ํ•  ๋•Œ ์ด๋ฏธ์ง€๊ฐ€ ์ œ์ž๋ฆฌ์—์„œ ํ™•๋Œ€๋˜๋Š” ๋Œ€์‹  ํ™•๋Œ€ํ•  ๋•Œ ์˜ค๋ฅธ์ชฝ ๋ชจ์„œ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ  ์ถ•์†Œํ•  ๋•Œ ์™ผ์ชฝ ์ƒ๋‹จ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋” ์•ฑ์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ด๋ฏธ์ง€๋ฅผ ์ด๋™ํ•˜๊ธฐ ์ „์— ์ถ•์†Œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ ๋‹ค์Œ ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋กค ํœ ๋กœ ํ™•๋Œ€ ๋ฐ ์ถ•์†Œํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ํ•€์น˜ ์คŒ๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ํ™˜๊ฒฝ

  • ์ตœ์‹  ๋ฒ„์ „(์˜ค๋Š˜ ์„ค์น˜๋จ)
  • ๋น„๋ฐœ๋”” ๋ธŒ๋ผ์šฐ์ €, ํ‚ค์œ„ ๋ธŒ๋ผ์šฐ์ €, ํฌ๋กฌ, ํŒŒ์ด์–ดํญ์Šค, ๋ชจ๋“  ์ตœ์‹  ๋ฒ„์ „.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

ํ™•๋Œ€/์ถ•์†Œ๋œ ์ด๋ฏธ์ง€๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ™•๋Œ€/์ถ•์†Œํ•˜๋Š” ์ค‘์•™์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™

ํ™•๋Œ€๋œ ์ด๋ฏธ์ง€๊ฐ€ ์ด๋™ํ•˜๋ฉฐ ํ™•๋Œ€ํ•˜๋ฉด ํ™”๋ฉด์˜ ์ด๋ฏธ์ง€ ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ ์ค‘์•™์—, ์ถ•์†Œํ•˜๋ฉด ์™ผ์ชฝ ์ƒ๋‹จ ์ค‘์•™์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

panzoom.ts:426์—์„œ ์ด๋™ ๊ธฐ๋Šฅ ๊ต์ฒด

ํ•จ์ˆ˜ ์ด๋™(์ด๋ฒคํŠธ: PointerEvent) {
๋งŒ์•ฝ (
!isํŒจ๋‹ ||
origX === ์ •์˜๋˜์ง€ ์•Š์Œ ||
์›๋ณธ === ์ •์˜๋˜์ง€ ์•Š์Œ ||
startClientX === ์ •์˜๋˜์ง€ ์•Š์Œ ||
startClientY === ์ •์˜๋˜์ง€ ์•Š์Œ
) {
๋ฐ˜ํ’ˆ
}
addPointer(ํฌ์ธํ„ฐ, ์ด๋ฒคํŠธ)
const ํ˜„์žฌ = getMiddle(ํฌ์ธํ„ฐ)
if (pointers.length > 1) {
// ์ฒ˜์Œ 2๊ฐœ์˜ ํฌ์ธํ„ฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
// ํ˜„์žฌ ์Šค์ผ€์ผ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด
// ๋ชจ๋ฐ”์ผ์—์„œ ํ™•๋Œ€/์ถ•์†Œ ๋ฌธ์ œ ๋ฐฉ์ง€
if (startDistance === 0) {
startDistance = getDistance(ํฌ์ธํ„ฐ);
}
const diff = getDistance(ํฌ์ธํ„ฐ) - ์‹œ์ž‘ ๊ฑฐ๋ฆฌ
const toScale = constrainScale((diff * options.step) / 80 + startScale).scale
ZoomToPoint(์ถ•์ฒ™, ํ˜„์žฌ)
} ๋˜ ๋‹ค๋ฅธ {
// ๋ชจ๋ฐ”์ผ ์คŒ ์ดˆ์  ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด else ์กฐ๊ฑด ์ถ”๊ฐ€
ํŒฌ(
origX + (current.clientX - startClientX) / ๊ทœ๋ชจ,
origY + (current.clientY - startClientY) / ๊ทœ๋ชจ,
{
์• ๋‹ˆ๋ฉ”์ด์…˜: ๊ฑฐ์ง“
}
);
}
}

๋ชจ๋“  19 ๋Œ“๊ธ€

๋ฌธ์ œ๋ฅผ ์—ด์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. iOS ๋ฐ Android ์—์„œ ๋ฐ๋ชจ ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‚˜์—ดํ–ˆ์ง€๋งŒ ํ•€์น˜ ์คŒ์€ ์ฃผ๋กœ ๋ชจ๋ฐ”์ผ์šฉ์ž…๋‹ˆ๋‹ค(์ผ๋ถ€ ์žฅ์น˜์—๋Š” ๋งˆ์šฐ์Šค์™€ ํ„ฐ์น˜ ์Šคํฌ๋ฆฐ์ด ๋ชจ๋‘ ์žˆ์Œ). ํ…Œ์ŠคํŠธํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์‚ฌ์šฉ ์ค‘์ธ ์žฅ์น˜๋ฅผ ์•„๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด Panzoom์˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ฑฐ๋‚˜ ๋ฐ๋ชจ ์ด์™ธ์˜ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๊ฐ€ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์‹œ๋ฉด ํŒจ์น˜๋ฅผ ๊ณ ๋ คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์œŒ๋ฆฌ์Šจ ์”จ.

๋‹น์‹ ์˜ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ๊ณผ ๋ชจ๋ฐ”์ผ ๋ฒ„์ „์„ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋งํ–ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Redmi Note 8T์™€ Galaxy 8์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ๊ฐœ๋ฐœ ์ค‘์ธ ๋ฐ๋ชจ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ (์•„๋ฌด๊ฒƒ๋„ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ๋‹จ์ง€ ์–ด๋ฆฐ์ด์šฉ ๊ฒŒ์ž„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค)
"Exploraciรณ lliure" ๋ฒ„ํŠผ์—์„œ; Panzoomed๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.
์˜์ƒ. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋งˆ์šฐ์Šคํœ  ์คŒ์€ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ํ•€์น˜ ์คŒ(๋ฐ
์‹ค์ œ๋กœ panzoom.zoomIn() ๋ฐ panzoom.zoomOut() ๋ฒ„ํŠผ๋„ ์ด๋™)
์˜์ƒ.

http://bake250.isdevelping.com/objectiueexplora/solsticidelspirineus/

๋„์›€์„ ์ฃผ์…”์„œ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ ๋ถˆํŽธ์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์นœ์• ํ•˜๋Š”;

ํ˜ธ๋ฅดํ—ค ์‚ฐ์ฒด์Šค ๋ธ”๋ž‘์ฝ”

์—˜๋ฃฌ, 9์›” 21์ผ 2020 ๋…„ las 19:45, Timmy Willison (<
[email protected]>) ์„ค๋ช…:

๋ฌธ์ œ๋ฅผ ์—ด์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐ๋ชจ๋ฅผ ์‹œ๋„
iOS ๋ฐ Android์˜ https://timmywil.com/panzoom/demo ๋ฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
๋‚ณ๋‹ค. ๋ฐ์Šคํฌํ†ฑ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‚˜์—ดํ–ˆ์ง€๋งŒ ํ•€์น˜ ์คŒ์€ ์ฃผ๋กœ
๋ชจ๋ฐ”์ผ(์ผ๋ถ€ ์žฅ์น˜์—๋Š” ๋งˆ์šฐ์Šค์™€ ํ„ฐ์น˜ ์Šคํฌ๋ฆฐ์ด ๋ชจ๋‘ ์žˆ์Œ). ๊ทธ๊ฒƒ์€ ์ˆ˜๋„
๋‚ด๊ฐ€ ์–ด๋–ค ๊ธฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ์—
๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด Panzoom์˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š”
๋ฐ๋ชจ ์ด์™ธ์˜ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๊ฐ€ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•จ), ์ œ๋ฐœ
์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์‹œ๋ฉด ํŒจ์น˜๋ฅผ ๊ณ ๋ คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

โ€”
์Šค๋ ˆ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/timmywil/panzoom/issues/512#issuecomment-696267620 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AOF4EAOK6YQVAHINOAQ3JZTSG6GMRANCNFSM4RUT4P7A
.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ์ ์ด ์ œ๋Œ€๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ  ๋งจ ์•„๋ž˜์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@jsblanco ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค . Panzoom์€ transform-origin: 50% 50% ์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์ด๋ฏธ์ง€ ์ค‘์•™์ด ์•„๋‹Œ ๋ทฐํฌํŠธ ์ค‘์•™(์ด ๊ฒฝ์šฐ ๋” ๋‚ฎ์Œ)์— ๋งž์ถฐ์ง‘๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ๋„ˆ๋ฌด ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด contain: outside ์„ค์ • ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€๋ฅผ ์›€์ง์ž…๋‹ˆ๋‹ค. zoomToPoint ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ focal ์˜ต์…˜๊ณผ ํ•จ๊ป˜ zoom ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๊ณ  ๋ทฐํฌํŠธ์—์„œ ์‹ค์ œ๋กœ ์ด๋ฏธ์ง€์˜ ์ค‘์‹ฌ์ธ ์ ์„ ์ฐพ์•„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ง์ด ๋ผ?

contain: outside ๊ฐ€ ์„ค์ •๋˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rmatec contain: outside ๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ํฌํ•จ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์ดˆ์ ์ด ํ•˜๋‹จ ์ค‘์•™์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•€์น˜ ์ธ ๋˜๋Š” ์•„์›ƒ์€ ํ•ด๋‹น ์ง€์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

@rmatec ๋ฐ๋ชจ์—์„œ ์ด ๋™์ž‘์„ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์ƒ ์ค‘์ธ ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Panzoom์„ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

const panzoomConfig = { minScale: 1, maxScale: 2, step: 0.5, duration: 200 };

๋ฐ์Šคํฌํ†ฑ์—์„œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://jsbin.com ๋˜๋Š” https://codepen.io ์—์„œ ์žฌ์ƒ์‚ฐํ•˜๊ณ  ์ƒˆ ํ‹ฐ์ผ“์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ์€ ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. https://jsbin.com/dibofogini/1/edit?html ,js,output.

ํ•  ๊ฒƒ์ด๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์–ด๋–ค ์ด์œ ๋กœ focal ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ์ด๋ฏธ์ง€๊ฐ€ ๊ทผ์ฒ˜์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ์— ์žˆ์œผ๋ฉฐ ๋” ์ด์ƒ ํ™•๋Œ€/์ถ•์†Œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฑด ์•„๋‹๊นŒ? ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋‚˜์š”?
์ดˆ์ ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด panzoom.zoomIn() ๋ฐ .zoomOut() ๋˜๋Š” ๊ทธ๋ƒฅ
panzoom ์ดˆ๊ธฐ ์„ ์–ธ์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ์ ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€๋ฆฌํ‚ค๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์›์‹œ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

clientX: window.innerWidth /2,
clientY: window.innerHeight/2

clientX: document.documentElement.clientWidth/2,
clientY: document.documentElement.clientHeight/2

ํฌํ•จ: ์™ธ๋ถ€๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ฉด ๊ฒ€์€์ƒ‰ ์ด๋ฏธ์ง€๋งŒ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

์—˜ 3์›” 22์ผ 2020๋…„ 15:59์ดˆ, Timmy Willison(<
[email protected]>) ์„ค๋ช…:

@jsblanco https://github.com/jsblanco ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. Panzoom์€ ๋ณ€ํ™˜ ์›๋ณธ์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
50% 50%, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ทฐํฌํŠธ ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๋Š” ๋Œ€์‹ 
์ด ๊ฒฝ์šฐ ๋” ๋‚ฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ
๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํฌํ•จ: ์™ธ๋ถ€ ์„ค์ •์œผ๋กœ ์ธํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋‚ด๋ ค๊ฐ€๋Š” ์ด๋ฏธ์ง€. ์ „ํ™”ํ•˜๋ฉด ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™์•„์š”
zoomToPoint ๋˜๋Š” ๋Œ€์‹  ์ดˆ์  ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ํ™•๋Œ€/์ถ•์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
์‹ค์ œ๋กœ ์ด๋ฏธ์ง€์˜ ์ค‘์‹ฌ์ธ ๋ทฐํฌํŠธ์˜ ์ ์ž…๋‹ˆ๋‹ค. ํ•˜๋‹ค
๋ง ๋˜๋„ค?

๋‚˜๋Š” ์•„๋งˆ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ค์ •๋ฉ๋‹ˆ๋‹ค.

@rmatec https://github.com/rmatec ๋‹น์‹ ์€ ๋˜ํ•œ ํฌํ•จ: ์™ธ๋ถ€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/timmywil/panzoom/issues/512#issuecomment-696740708 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AOF4EANBQXE5TDJOZNTBN6LSHCUVXANCNFSM4RUT4P7A
.

@jsblanco ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ณด๋‹ค ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€์˜ ์ค‘์‹ฌ์„ ์ฐพ์•„ ํŒฌ์คŒ ์ƒ์œ„ ๋ทฐํฌํŠธ์˜ ํ•ด๋‹น ์ง€์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฅผ ์ดˆ์  ์˜ต์…˜์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ  ํ™•๋Œ€/์ถ•์†Œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์ž. zoomIn / zoomOut ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ•€์น˜ ์คŒ ๋™์ž‘์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‹€๋ฆผ์—†์ด, ํŠน์ • ์ง€์ ์„ ํ™•๋Œ€/์ถ•์†Œํ•˜๋ฉด contain: outside ์™€ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ์˜ณ์€ ์ผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ทฐํฌํŠธ์— ์ œ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ™•๋Œ€/์ถ•์†Œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์™ธ์—๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://jsbin.com ๋˜๋Š” https://codepen.io ์—์„œ ์žฌ์ƒ์‚ฐํ•˜๊ณ  ์ƒˆ ํ‹ฐ์ผ“์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ์€ ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. https://jsbin.com/dibofogini/1/edit?html ,js,output.

๋‚ด ํŠน์ • ์‚ฌ๋ก€์— ๋Œ€ํ•ด https://github.com/timmywil/panzoom/issues/513 ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” JSBin์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

"animate: true"๋ฅผ ์ผœ๋‘๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” "animate: false"์—์„œ๋Š” ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด @timmywil ํ…œํ”Œ๋ฆฟ์„ ๋ณต์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

https://jsbin.com/pemoveyeri/1/edit?

(์ง์ ‘ ํ™•๋Œ€/์ถ•์†Œํ•˜๋Š” ํœ  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๊ฒŒ ์Šคํฌ๋กคํ•˜๋ฉด ์œ„์น˜ ์ด๋™์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.)

์ข‹์•„, ๋ฌธ์ œ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๊ตฌ์„ฑ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ๋ฌธ์ œ๋ฅผ #515๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•;

๋‹ต๋ณ€์ด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํฌํ•จ = "์™ธ๋ถ€"์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ œ๊ฑฐํ–ˆ๋Š”๋ฐ ๊ฐ•๋ ฌํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋™์ž‘์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ panzoom div์™€ ์ด๋ฏธ์ง€๋Š” ๊ฑฐ๋ฆฌ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์„ค์ •๋œ ํฌ๊ธฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@jsblanco ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ํœ  ์คŒ์ด ์ค‘์‹ฌ์—์„œ ๋ฉ€์–ด์ง€๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ด ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ถฉ๋ถ„ํžˆ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‚ด ๋ฐœ๊ฒฌ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํŠธ๋ž™ํŒจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” MacBook์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ์  ํ™•๋Œ€/์ถ•์†Œ ๋ฐ๋ชจ ์˜ ๊ฒฝ์šฐ Safari, Firefox์—์„œ ํ™•๋Œ€/์ถ•์†Œํ•  ๋•Œ ์ค‘์‹ฌ์ด ์™ผ์ชฝ ์ƒ๋‹จ์œผ๋กœ ๋–  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Chrome์—์„œ๋„ ๋™์ผํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ์›น ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์—ด๋ ค ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๋‚ด ์˜์‹ฌ์€ ๋งˆ์šฐ์Šค ํœ  ์ด๋ฒคํŠธ๊ฐ€ ๋„ˆ๋ฌด ์ž์ฃผ ํŠธ๋ฆฌ๊ฑฐ๋˜๊ณ  Panzoom์˜ ๋น„๋™๊ธฐ ํŠน์„ฑ ์œผ๋กœ ์ธํ•ด ์ƒํ™ฉ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•๋Œ€/์ถ•์†Œ ๋นˆ๋„๋ฅผ ์กฐ์ ˆํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๊ณ  "์ž‘๋™"ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://jsbin.com/joliduwulo/1/edit?html ,js,output.

์ฃผ์˜ ์‚ฌํ•ญ์€ ํ™•๋Œ€/์ถ•์†Œ๊ฐ€ ๋œ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” 20ms๋งˆ๋‹ค ์ตœ๋Œ€ 1๊ฐœ์˜ ํ™•๋Œ€/์ถ•์†Œ๋กœ ์ œํ•œํ•˜๊ณ  ์žˆ์ง€๋งŒ ํŠนํžˆ Firefox์—์„œ ๋Œ€ํ˜• SVG๋กœ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ดˆ์ ์„ ์žƒ์ง€ ์•Š๋„๋ก ์•ฝ 50ms๋กœ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@timmywil ์–ด์จŒ๋“  ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด๋ ค๋ฉด ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์ด ํƒ์ƒ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๊ธฐ์—ฌํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ทฐํฌํŠธ๊ฐ€ ์•„๋‹Œ ํŒฌ์คŒ ์š”์†Œ์˜ ์ค‘์•™์— +1

panzoom.ts:426์—์„œ ์ด๋™ ๊ธฐ๋Šฅ ๊ต์ฒด

ํ•จ์ˆ˜ ์ด๋™(์ด๋ฒคํŠธ: PointerEvent) {
๋งŒ์•ฝ (
!isํŒจ๋‹ ||
origX === ์ •์˜๋˜์ง€ ์•Š์Œ ||
์›๋ณธ === ์ •์˜๋˜์ง€ ์•Š์Œ ||
startClientX === ์ •์˜๋˜์ง€ ์•Š์Œ ||
startClientY === ์ •์˜๋˜์ง€ ์•Š์Œ
) {
๋ฐ˜ํ’ˆ
}
addPointer(ํฌ์ธํ„ฐ, ์ด๋ฒคํŠธ)
const ํ˜„์žฌ = getMiddle(ํฌ์ธํ„ฐ)
if (pointers.length > 1) {
// ์ฒ˜์Œ 2๊ฐœ์˜ ํฌ์ธํ„ฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
// ํ˜„์žฌ ์Šค์ผ€์ผ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด
// ๋ชจ๋ฐ”์ผ์—์„œ ํ™•๋Œ€/์ถ•์†Œ ๋ฌธ์ œ ๋ฐฉ์ง€
if (startDistance === 0) {
startDistance = getDistance(ํฌ์ธํ„ฐ);
}
const diff = getDistance(ํฌ์ธํ„ฐ) - ์‹œ์ž‘ ๊ฑฐ๋ฆฌ
const toScale = constrainScale((diff * options.step) / 80 + startScale).scale
ZoomToPoint(์ถ•์ฒ™, ํ˜„์žฌ)
} ๋˜ ๋‹ค๋ฅธ {
// ๋ชจ๋ฐ”์ผ ์คŒ ์ดˆ์  ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด else ์กฐ๊ฑด ์ถ”๊ฐ€
ํŒฌ(
origX + (current.clientX - startClientX) / ๊ทœ๋ชจ,
origY + (current.clientY - startClientY) / ๊ทœ๋ชจ,
{
์• ๋‹ˆ๋ฉ”์ด์…˜: ๊ฑฐ์ง“
}
);
}
}

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰