(์ ์ด๋ฏธ์ง๊ฐ ๋ด๊ฐ ๋ฐ๋ผ ๋ง๋ค ์ค์ ๊ธฐ๋ฅ)
Image Zoom on Hover ๊ธฐ๋ฅ์ ์ผํ๋ชฐ ์์ธ ํ์ด์ง์์ ํํ ๋ณด์ด๋ ๊ธฐ๋ฅ์ด๋ค. ๋ง์ฐ์ค ์ปค์๋ฅผ ์ด๋ฏธ์ง ์์ญ ์์ ์ฌ๋ฆฌ๋ฉด ํ๋๋ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ทฐํฌํธ๊ฐ ์๊ฒจ์ ๋ณ๋์ ๋ชจ๋ฌ์ด๋ ์๋์ฐ ์์ด๋ ์ด๋ฏธ์ง๋ฅผ ์์ธํ ๋ณผ ์ ์๋ ์ธํฐ๋์ ์ค ํ๋์ด๋ค.
๊ณผ์ ๋ ์๋์์ง๋ง JS๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ธํฐ๋์ ์ ์ง์ ๋ง๋ค์ด๋ณด๋ ์ฐ์ต์ ํ๊ณ ์ถ๊ณ , ๊ฐ์ฒด์ ์ขํ๋ฅผ ํ์ฉํ ํจ๊ณผ๋ ์ด๋ป๊ฒ ๋ง๋ค ์ ์๋์ง ๊ณต๋ถํ๊ณ ์ถ์๋ค.
๋ฌธ์ ํด๊ฒฐ์ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ณ , ๋ด๊ฐ ์ํ๋ ๊ฒ์ ๋ช ํํ ํ๊ณ , ์ฐจ๊ทผ์ฐจ๊ทผ ํด๊ฒฐํด ๋๊ฐ๋ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์๋ ๋ค์ฏ ๊ฐ์ ๋ช ์ ๊ฐ ์ด๋ฏธ์ง ์ค ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ์๋๋๊ธฐ ์ํ ์กฐ๊ฑด์ด๋ค. ์๋ ๋ช ์ ๋ค์ ๊ฐ์ ํ๊ณ , ํ๋์ฉ ํ์ด๊ฐ๋ ๊ณผ์ ์ ์๊ฐํ๋ค.
- ์ด๋ฏธ์ง ์์ญ ์์ ๋ง์ฐ์ค ์ปค์๋ฅผ ์ฌ๋ฆฌ๋ฉด ์ด๋ ํ๋ ์๊ณผ ํ๋์ฐฝ์ด ๋ํ๋๋ค.
- ๋ง์ฐ์ค ์ปค์๊ฐ ์์ญ ๋ฐ์ผ๋ก ๋๊ฐ๋ฉด ์ด๋ ํ๋ ์๊ณผ ํ๋์ฐฝ์ ์ฌ๋ผ์ง๋ค.
- ์ด๋ ํ๋ ์์ ๋ง์ฐ์ค ์ปค์๋ฅผ ๋ฐ๋ผ ์์ง์ธ๋ค.
- ์ด๋ ํ๋ ์์ ์ด๋ฏธ์ง ์์ญ ๊ฒฝ๊ณ ์์์๋ง ์์ง์ธ๋ค.
- ํ๋ ์ด๋ฏธ์ง๋ ์ ํํ ์ด๋ ํ๋ ์ ์์ญ์ ์ด๋ฏธ์ง๊ฐ ๋ณด์ฌ์ผ ํ๋ฉฐ, ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ๋ ์์ง์์ ๋๊ธฐํ๋์ด์ผ ํ๋ค.
const zoomFrame = document.querySelector('.zoomFrame');
const zoomLens = document.querySelector('.zoomLens');
const zoomWindow = document.querySelector('.zoomWindow');
์ ์ ์ ์ด๋ค ๋์์ ์ด๋ฒคํธ๋ก์ ์ธ์ํ ๊ฒ์ธ์ง ์ ์ํ๋ฉด ๋ฌธ์ ํด๊ฒฐ์ด ์ฝ๋ค.
์ค ํ๋ ์ ์์ญ์ ์ปค์๊ฐ ์ง์ ํ๋ค + ๋ง์ฐ์ค๊ฐ ์์ง์ธ๋ค = โmousemoveโ
zoomFrame.addEventListener('mousemove', callbackFn);
mouseenter
์์ญ ์์ผ๋ก ์ง์
ํ๋์ง ์ฌ๋ถ๋ง ๋ฐ์ง๊ณ , mouseover
๋ ์ด๋ฒคํธ ์
๋ ฅ ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ๋์๋์์ด๋ผ ์ฌ์ฉํ์ง ์์๋ค. ๋ ๋์ FPS๋ก ๋ถ๋๋ฌ์ด ๋์์ด ๊ฐ๋ฅํ mousemove
๋ฅผ ์ฌ์ฉํ๋ค. ์๋ ๋น๊ต๋ฅผ ๋ณด๋ฉด ์ฐจ์ด๊ฐ ํ์ฐํ๋ค (์ผ์ชฝ์ด mousemove
)
์์ญ ๋ด์ ์์ง์์ ์ ์ดํ๋ ํจ์๋ ๋ณ๋์ ํจ์๋ก ์ ์ธํ๋ค.
function handleMouseMove(event) {
zoomLens.style.display = 'block';
zoomWindow.style.display = 'block';
}
์ค ํ๋ ์ ์์ญ ๋ฐ์ผ๋ก ์ปค์๊ฐ ๋๊ฐ๋ค = โmouseleaveโ
zoomFrame.addEventListener('mouseleave', () => {
zoomLens.style.display = 'none';
zoomWindow.style.display = 'none';
});
๋ง์ฐ์ค๊ฐ ๋์ ๋ฐ์ผ๋ก ๋๊ฐ๋ฉด ์ด๋ฒคํธ๋ก ์ธ์๋๋ mouseleave
๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฐ์ค๊ฐ ์ฐฝ์ ๋ ๋ ๋ ์์๋ฅผ ์จ๊ธฐ๋ ์ญํ ๋ฐ์ ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ธ์ ์์ ๊ทธ๋๋ก ์ ์ธํ๋ค.
์์๊ฐ ๋ง์ฐ์ค ์ปค์๋ฅผ ๋ฐ๋ผ๋ค๋๊ฒ ํ๋ ค๋ฉด ๋ง์ฐ์ค์ ์ขํ๋ฅผ ์์์ผ ํ๋ค. ๋ทฐํฌํธ์์ ์ขํ๋ฅผ ์ฐพ๋ ๊ฒ์ ์ฝ๋ค. ๋ด๊ฐ ์ํ๋ ๊ฒ์ ํ๋ ์์ ์์น์ ๊ด๊ณ๋ ์๋์ ๋ง์ฐ์ค ์ขํ๋ค. ์ด ๊ฐ์ ์ป๊ธฐ ์ํด์ ๋ด๊ฐ ์ฐพ์์ผ ํ ๊ฒ์ ์๋์ ๊ฐ๋ค.
- ๋ทฐํฌํธ ์ ๋ง์ฐ์ค ์ปค์์ ์๋ ์ขํ
- ๋ทฐํฌํธ ์ ํ๋ ์ ์์ญ์ ์๋์ ์์น
์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ์ฝ์๋ก ์ถ๋ ฅํ๋ฉด ์๋์ ๊ฐ์ด ๊ฐ์ฒด ํ๋กํผํฐ๊ฐ ํ์๋๋ค.
์ฌ๊ธฐ์ ๋์ฌ๊ฒจ๋ด์ผ ํ ํ๋กํผํฐ๋ clientX
, clientY
์ offsetX
, offsetY
๋ค.
clientX๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ) ๊ธฐ์ค์ ์ปค์ ์ขํ๊ฐ์ ๋ํ๋ธ๋ค. (X๋ ๊ฐ๋ก์ถ Y๋ ์ธ๋ก์ถ ๊ธฐ์ค) ๋ธ๋ผ์ฐ์ ํ์ด์ง์์ X์ ์ขํ ์์น๋ฅผ ๋ฐํํ๊ณ , ๋ทฐํฌํธ ์๋จ์ 0์ผ๋ก ์ธก์ ํ๋ค. (๋ฌธ์ ์ ์ฒด ๊ธฐ์ค์ pageX
)
offsetX๋ ์ด๋ฒคํธ๊ฐ ๊ฑธ๋ ค์๋ DOM ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ขํ๊ฐ์ ๋ํ๋ธ๋ค. ์ด๋ก ์ ์ผ๋ก๋ offsetX๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ทธ๋ด์ธํ์ง๋ง ์ด์งธ์์ธ์ง clientX์ offsetX์ ๊ฐ์ด ๋๊ฐ์๋ค.
์ด์ฐจํผ ๋ทฐํฌํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์ ์์ญ์ ์์น๋ฅผ ์ฐพ์๋ด์ด ๊ฐ์ ๋ณด์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ client ์ขํ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
getBoundingClientRect()๋ผ๋ ๋ฉ์๋๋ ํ๋ฉด์์ ๋ณด์ฌ์ง๋ ์์์ ์๋์ ์์น์ ํฌ๊ธฐ ์ ๋ณด๊ฐ ๋ด๊ธด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ด์ ํฌ์คํ ์์ ๋ค๋ฃฌ ์ ์ด ์๋ค.
3D ๋ชจ๋ธ๋ง๊ณผ ๊ด๋ จ๋ ํ๋ก๊ทธ๋จ์ ๋ค๋ค๋ณธ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ์ ๊ฒ์ด๋ค. ๋ชจ๋ ๊ฒ์ ์ ์ฝค๋ง ์์์ ์์๋๋ค๋ ๊ฒ์. ๋ค๋ฅธ ์ ์ด๋ผ๋ฉด y์ ํฌ์งํฐ๋ธ ๋ฐฉํฅ์ ๋ฐ์ ํด์ ์ฌ์ฉํ๋ค๋ ์ ์ด๋ค.
์ขํ์ ์์น ์ ๋ณด๋ฅผ ์ป์์ผ๋ ์ข์๋จ์ (0, 0)์ผ๋ก ๋ณด์ ํด์ผํ๋ค. ํ๋ ์์ ์ข์๋จ ๋ชจ์๋ฆฌ ๋์ ๋ง์ฐ์ค๊ฐ ์์ผ๋ฉด ๋ง์ฐ์ค์ (x, y)๊ฐ ํ๋ ์์ Rect ํ๋กํผํฐ์ (left, top) ๊ฐ๊ณผ ์ผ์นํ ๊ฒ์ด๋ค. (๋ ๋ค ํ๋ ์์ ๋๋นํ ์๋์ ๊ฐ์ด๊ธฐ ๋๋ฌธ)
๋ฐ๋ผ์ ์์ ์กฐ์ ๋ ๋ง์ฐ์ค ์ขํ๋ฅผ ์๋์ ๊ฐ์ด ๊ณ์ฐํ ์ ์๊ฒ ๋๋ค.
// DOMRect ๊ฐ์ฒด์์ left, top๊ฐ์ ๋ถํดํ์ฌ ํ ๋น
const {left, top} = zoomFrame.getBoundingClientRect();
// ๋ง์ฐ์ค์ client ์ขํ์์ ํ๋ ์์ ์์น ์ขํ๋ฅผ ์ ๊ฑฐํ์ฌ ์์ ๋ง์ถ๊ธฐ
const x = event.clientX - left;
const y = event.clientY - top;
์๋์ ๊ฐ์ด ๊ฐ์ด ์ ๋ค์ด์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์์ฆ์ ์ํ๋ ๊ฐ์ด ๋ค์ด์ค๋๊ฒ์ ๋ณด๋ ๊ฒ๋งํผ ์ง๋ฆฟํ๊ฒ ๋ ์๋ค.
์์์ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ผ๋ก ์ขํ๊ฐ์ ๋ณ์ x์ y์ ํ ๋นํ์๋ค. ์ด๋ ํ๋ ์์ left์ top ๊ฐ์ ์ขํ๋ฅผ ์ฐ๋ํด์ฃผ๋ฉด ์๋์ ๊ฐ์ด ํํ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ๊ฒ์ ๊ฐ์ด ์ฌ์ฉ๋ ๊ณณ์ด CSS์ด๊ธฐ ๋๋ฌธ์ ๋จ์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ถ์ฌ์ค์ผ ํ๋ค.
zoomLens.style.left = x + 'px';
zoomLens.style.top = y + 'px';
์์ ๊ฐ์ด ๋ง์ฐ์ค์ ์ขํ์ ์ด๋ ํ๋ ์ ์์น์ ์์ ์ด ์ฐ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ํ์ง๋ง ๋ง์ฐ์ค ์ปค์๋ ์ด๋ ํ๋ ์์ ์ค์์ ์์นํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ํ๋ ์์ ๋๋น์ ๋์ด์ ์ ๋ฐ์ ๋ณด์ ๊ฐ์ผ๋ก ๋ฃ์ด์ค๋ค.
zoomLens.style.left = x - 153 + 'px';
zoomLens.style.top = y - 117 + 'px';
๋งค์ฐ ์๋ฆ๋ต๋ค. ์ด์ ๊ฐ์ด ํท๊ฐ๋ฆฌ์ง ์๋๋ก ๊ฐ์ฒด ์์ ์ ๋ฆฌํ๋ฉด ๋๋ค. ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์ธ์ ๋ ์ง ๊ฐ์ด ํ์ํ ๋๋ง๋ค ์ ๊ทผํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
const coord = { x: x - 153 + 'px', y: y - 117 + 'px' }
๊ธฐ๋ฅ ๊ตฌํ ์ค ๊ฐ์ฅ ํท๊ฐ๋ฆฌ๊ณ ๊น๋ค๋ก์ด ๋ถ๋ถ์ด์๋ค. ์ด๋ ํ๋ ์์ด ์ธ๋ถ ํ๋ ์์ ๊ฒฝ๊ณ๋ก ์ธ์ํ๋ ๋ชจ์ต์ ์ด๋ป๊ฒ ๋ก์ง์ผ๋ก ํ์ด๋ผ ์ ์์๊น? Figma๋ก ํ๋ ํ๋ ๊ทธ๋ ค๊ฐ๋ฉฐ ์์ญ๋ณ ํฝ์ ๊ฐ์ ๊ตฌํด๋ดค๋ค.
์ปค์๊ฐ ํน์ ์์ญ์ ์ง์ ํ๋ฉด ์ด๋ ํ๋ ์์ ์์น ๊ฐ์ ํน์ ์ถ์ด ๊ณ ์ ๊ฐ(Static) ๋๋ ๋ณ๋ ๊ฐ(Dynamic)์ผ๋ก ๋ณํ๋๋์ง์ ์ฌ๋ถ์ ํํธ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค. ์์ญ๋ณ ์์ง์์ ๋ณํ๋ ์๋ ๋ค ๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์๋ค.
- X์ถ๊ณผ Y์ถ์ด ์ ์ ์ธ ์์ญ
- X์ถ์ด ๋์ , Y์ถ์ ์ ์ ์ธ ์์ญ
- X์ถ์ ์ ์ , Y์ถ์ ๋์ ์ธ ์์ญ
- X์ถ๊ณผ Y์ถ์ด ๋์ ์ธ ์์ญ (Center)
๊ฒฐ๋ก ์ ์ผ๋ก X์ถ๊ณผ Y์ถ์ด ๋์ ์ธ Center ์์ญ์ ๋ค ๋ชจ์๋ฆฌ ์ขํ๋ฅผ ๊ธฐ์ ์ผ๋ก ๊ฐ์ ์ฑ์ง์ด ํ๊ฐ๋ฆ๋๋ค. ๋ง์ฐ์ค ์ปค์์ ์ขํ๊ฐ ์ด๋ค ์์ญ์ ์ง์ ํ๋์ง ํ๋จํ๋ ค๋ฉด ์์ญ๋ณ ์กฐ๊ฑด๋ฌธ์ ์ ๋ฆฌํด์ผํ๋ค.
์ปค์์ ์ขํ ๊ฐ์ ์์ญ์ ์ขํ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ํฌ๊ณ ์์์ ๋ฐ์ง๋ฉด ์ปค์๊ฐ ์ด๋ ์นํฐ์ ์ง์ ํ๋์ง ์ ์ ์๊ณ , ํด๋น ์นํฐ์ ์ง์ ํ์๋ ์ด๋ ํ๋ ์์ ์ขํ๋ฅผ ๋์ ์ผ๋ก, ๋๋ ๊ณ ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
์ซ์๋ฅผ ๋จ๋ฐํ๊ฒ ๋๋ฉด ๋์ค์ ํ๋ ์์ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ก์๋ ์์ ํ๊ธฐ ๊ท์ฐฎ๊ณ , ๋๋ฝ ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์์ ๋ณ์๋ก ์นํํด์ฃผ๊ธฐ๋ก ํ๋ค. ์ฐธ์กฐํด์ผ ํ ๊ฒฝ๊ณ์ ์ ์ด ๋ค ๊ฐ, x์ ์ต์๊ฐ, ์ต๋๊ฐ๊ณผ y์ ์ต์๊ฐ ์ต๋๊ฐ์ด๋ค.
๊ฐ์ ๋ณ์๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ์ธ์ ๋ ์ง ์ ๋์ ์ผ๋ก ๊ฐ์ ๋ฐ๊ฟ ์ ์๊ณ , ๋น๊ต๋๋ ๊ฐ์ ์๋ฏธ๋ฅผ ๋ช ํํ ์ ์ ์๋ค. ์ด ๊ฐ๋ค์ ๊ฐ์ฒด์ ์ ์ฅํ์ฌ ํ๋กํผํฐ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์ง ํด ๋ณด์ธ๋ค. ์๋ฏธ์ ๋ชฉ์ ์ด ๋น์ทํ ๊ฒ๋ค์ ํ๋๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ฌ๋ฌ๋ชจ๋ก ๊น๋ํ๊ณ ๊ฐํธํ๋ค.
const boundary = { xMin: 153, xMax: 297, yMin: 117, yMax: 353 };
์ด์ ์ ๋์์ ์ฐธ๊ณ ํ์ฌ ์กฐ๊ฑด๋ฌธ์ ๋ง๋ค์ด ํด๋น ์์ญ์ ์ง์ ํ์์ ์ ๋๋ก ํํํ๋์ง ์ํํด๋ณธ๋ค.
if (x <= boundary.xMin && y <= boundary.yMin) {
console.log(5)
} else if (x > boundary.xMin && x < boundary.xMax && y <= boundary.yMin) {
console.log(1)
} else if (x >= boundary.xMax && y <= boundary.yMin) {
console.log(6)
} else if (x <= boundary.xMin && y > boundary.yMin && y < boundary.yMax) {
console.log(3)
} else if (x <= boundary.xMin && y >= boundary.yMax) {
console.log(7)
} else if (x > boundary.xMin && x < boundary.xMax && y >= boundary.yMax) {
console.log(2)
} else if (x >= boundary.xMax && y >= boundary.yMax) {
console.log(8)
} else if (x >= boundary.xMax && y > boundary.yMin && y < boundary.yMax) {
console.log(4)
} else {
console.log('center')
}
์์ ๊ฐ์ด ์ปค์๊ฐ ์์ญ์ ์ง์ ํ ๋๋ง๋ค ํด๋น ์์ญ์ ์ซ์๊ฐ ์ ์ถ๋ ฅ๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค. if..else ๋ฌธ์ ๋๋ฌด ๋ชป์๊ฒผ์ผ๋ switch๋ฌธ์ผ๋ก ๋ฐ๊พธ๊ณ , ์ฝ์ ๋์ ์ด๋ ํ๋ ์์ ์ขํ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์ถฐ ๋ฐ๊ฟ ๋ฃ์ผ๋ฉด ์๋์ ๊ฐ๋ค.
switch (true) {
case (x <= boundary.xMin && y <= boundary.yMin) :
zoomLens.style.left = '0';
zoomLens.style.top = '0';
break;
case (x > boundary.xMin && x < boundary.xMax && y <= boundary.yMin) :
zoomLens.style.left = coord.x;
zoomLens.style.top = '0';
break;
case (x >= boundary.xMax && y <= boundary.yMin) :
zoomLens.style.left = '145px';
zoomLens.style.top = '0';
break;
case (x <= boundary.xMin && y > boundary.yMin && y < boundary.yMax) :
zoomLens.style.left = '0';
zoomLens.style.top = coord.y;
break;
case (x <= boundary.xMin && y >= boundary.yMax) :
zoomLens.style.left = '0';
zoomLens.style.top = '236px';
break;
case (x > boundary.xMin && x < boundary.xMax && y >= boundary.yMax) :
zoomLens.style.left = coord.x;
zoomLens.style.top = '236px';
break;
case (x >= boundary.xMax && y >= boundary.yMax) :
zoomLens.style.left = '145px';
zoomLens.style.top = '236px';
break;
case (x >= boundary.xMax && y > boundary.yMin && y < boundary.yMax) :
zoomLens.style.left = '145px';
zoomLens.style.top = coord.y;
break;
default :
zoomLens.style.left = coord.x;
zoomLens.style.top = coord.y;
}
์ ์ ์ธ ๊ฐ์ ๊ณ ์ ๋ ํฝ์ ๊ฐ์ ๋ฃ๊ณ , ๋์ ์ธ ๊ฐ์ ์ขํ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด coord์ ํ๋กํผํฐ ๊ฐ์ ์ฐธ์กฐํ๋ค. ์ ์กฐ๊ฑด๋ฌธ์ ๋ฃ์ผ๋ฉด ์๋์ ๊ฐ์ด ์๋ํ ๋ฐ๊ฐ ์คํ๋๋ ์๋ฆ๋ค์ ๊ด๊ฒฝ์ ๋ชฉ๊ฒฉํ๊ฒ ๋๋ค.
ํท๊ฐ๋ฆฌ์ง๋ง ์์ผ๋ฉด ํด๊ฒฐํ ์ ์๋ค. ์ด๋ฏธ์ง ํ๋ ์๊ณผ ๊ด๊ณ๋ ์ด๋ ํ๋ ์์ ์๋์ ์์น์ ํ๋ ๋ทฐํฌํธ ๋ฐฑ๊ทธ๋ผ์ด๋ ํฌ์ง์ ์ ํผ์ผํ ์ด์ง๋ก ์ฐ๋ํ๋ฉด ๋๋ค.
์ด๋ ํ๋ ์์ ์์น๋ ์ด๋ป๊ฒ ๊ตฌํ ์ ์์๊น? ์ด ๊ฒ ๋ํ ๋ฐ๊นฅ ํ๋ ์์ ์ขํ ๊ฐ๊ณผ (DOMRect)์ ์ด๋ ํ๋ ์์ ์ขํ ๊ฐ์ ์ฐ์ ํ๋ฉด ๊ธ๋ฐฉ ํ๋ฆฐ๋ค.
์ธ๋ถ ํ๋ ์์ด getBoundingClientRect()
๋ฉ์๋๋ก ๊ฐ์ฒด ํฌ๊ธฐ, ์์น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์๋ ๊ฒ์ฒ๋ผ ์ด๋ ํ๋ ์๋ ๋๊ฐ์ด ์ขํ๋ฅผ ๊ฐ์ ธ์ ๋ถํด ํ ๋นํ๋ค.
const {left, top} = zoomFrame.getBoundingClientRect();
const {x:lensLeft, y:lensTop} = zoomLens.getBoundingClientRect();
๋ทฐํฌํธ ๋๋น ๋ฐ๊นฅ ํ๋ ์์ ์ขํ๋ฅผ ์ด๋ ํ๋ ์์ ์ขํ์์ ๋นผ์ค ๊ฐ์ผ๋ก, ์ด๋ ํ๋ ์์ ์ด๋ ๊ฐ๋ฅํ ์ต๋๊ฐ์ ๋๋์ด ๋ฐฑ๋ถ์จ์ ๊ตฌํ๋ฉด ๋๋ค.
์ด๋ ํ๋ ์์ x์ถ ์์น ๋ฐฑ๋ถ์จ = (lensLeft - left) x 100 / 145
์ด๋ ํ๋ ์์ y์ถ ์์น ๋ฐฑ๋ถ์จ = (lensTop - top) x 100 / 236
์ด ์์์ CSS ํฌ์ง์ ๊ฐ์ผ๋ก ์ ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ํํํ๋ฉด ๋๋ค.
zoomWindow.style.backgroundPosition =
`${(lensLeft - left) * 100 / 145}% ${(lensTop - top) * 100 / 236}%`
์๋์ ๊ฐ์ด ๋งค์ฐ ์ ์๋ํ๋ค.
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํธํ๊ฒ ๋ง๋ค ์ ์์ ๊ฒ์ ๋ฏธ๋ จํ๊ฒ ์ง์ ๋ง๋ค์ด๋ดค๋ค. ๋์ ์ธ ์น์ฌ์ดํธ ๊ธฐ๋ฅ์ ์๋ฆฌ๋ฅผ ๋ฐฐ์ธ ์ ์์๋ ์ข์ ๊ณ๊ธฐ์๋ค.
๋ด๊ฐ ์๊ฐํ ์ด๋ก ์ด ์ค์ ๋ก ๊ตฌํ๋๋ ๋ชจ์ต์ด ๋๋ฌด ์ฆ๊ฑฐ์์ ๋ณด๋์ด ์์๋ค.
์ด๋ฏธ์ง ์ค ๊ธฐ๋ฅ์ด ํ ๋ง์ด ์ ์ผ ๋ง์์ ๋
๋ฆฝ๋ ํฌ์คํธ๋ก ๋จ๊ธด๋ค.
๊ธ๊ณผ ๊ทธ๋ฆผ โ Wonkook Lee
์ฐธ๊ณ ํ ํด๋น ํํ์ด์ง์ ๋ฆฌ์์ค์ ์๋ฃ ์ฌ์ง์ ๋ชจ๋ ์ ์๊ถ์
์คํ๋ฒ
์ค ์ฝ๋ฆฌ์์๊ฒ ์์ผ๋ฉฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์ฆ์ ์กฐ์นํ๊ฒ ์ต๋๋ค.
๐๐ป ์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ์ง์ ํด์ฃผ์ธ์
ํฅ๋ฏธ๋ก์ด ๋ด์ฉ์ด๋ค์ ์๋ดค์ต๋๋ค :)