offset 補償與 transform: translate/scale
為了使用瀏覽器本身的 HW accel,我們改用 transform: translate/scale 控制圖片位置。同時也把圖片的 CSS position 固定在 absolute,讓圖片在平常的垂直水平置中過渡到 freeform 之間的動畫不會因為 reflow 而卡頓。
不過,同時帶來一個小問題:scale 過後的圖片是由本身的 origin 為中心平移,圖片本身座標空間不能直接對應到畫面上的顯示座標空間。也就是說,double tap 跟 pinch 事件取得的座標不能夠直接用來更新 transform。
為了解決這個問題我們使用了前端常用的空間映射轉換公式:
content = (screen − origin − prevTx) / prevScale
固定 content 的狀況下可得:
(screen − origin − prevTx) / prevScale = (screen − origin − newTx) / nextScale
搭配我們使用的 origin 是 50% 50%,也就是
originX = elementLeft + elementWidth / 2
originY = elementTop + elementHeight / 2
最終會得到下圖公式:
tx, ty 是縮放後的 offset,我們就可以代入 CSS trasnform。