์ด๋ค ์ด์ ๋ก ๋ชจ๋ฐ์ผ(๋ชจ๋ ์ฅ์น)์์ ๋ด Panzoom ์ฑ์ ์ฌ์ฉํ ๋ ํ์น ์ค์ ์๋ํ๋ฉด ํ๋ํ ๋ ์ด๋ฏธ์ง๊ฐ ์ ์๋ฆฌ์์ ํ๋๋๋ ๋์ ํ๋ํ ๋ ์ค๋ฅธ์ชฝ ๋ชจ์๋ฆฌ๋ก ์ด๋ํ๊ณ ์ถ์ํ ๋ ์ผ์ชฝ ์๋จ์ผ๋ก ์ด๋ํฉ๋๋ค. ๊ฐ๋ ์ฑ์ ์์ํ์ ๋ ์ด๋ฏธ์ง๋ฅผ ์ด๋ํ๊ธฐ ์ ์ ์ถ์๊ฐ ์ ๋๋ก ์๋ํ ๋ค์ ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์คํฌ๋กค ํ ๋ก ํ๋ ๋ฐ ์ถ์ํ๋ฉด ์ ์์ ์ผ๋ก ์๋ํ์ง๋ง ํ์น ์ค๋ง ์๋ํ์ง ์์ต๋๋ค.
ํ๋/์ถ์๋ ์ด๋ฏธ์ง๋ ์ฌ์ฉ์๊ฐ ํ๋/์ถ์ํ๋ ์ค์์ ์์ด์ผ ํฉ๋๋ค.
ํ๋๋ ์ด๋ฏธ์ง๊ฐ ์ด๋ํ๋ฉฐ ํ๋ํ๋ฉด ํ๋ฉด์ ์ด๋ฏธ์ง ์ค๋ฅธ์ชฝ ํ๋จ ์ค์์, ์ถ์ํ๋ฉด ์ผ์ชฝ ์๋จ ์ค์์ ํ์๋ฉ๋๋ค.
๋ฌธ์ ๋ฅผ ์ด์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. 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) / ๊ท๋ชจ,
{
์ ๋๋ฉ์ด์
: ๊ฑฐ์ง
}
);
}
}
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
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) / ๊ท๋ชจ,
{
์ ๋๋ฉ์ด์ : ๊ฑฐ์ง
}
);
}
}