さて、理論は構築できたので、実際にその通りになるか試してみます。準備したのは基画像とそれを2倍にし、上図のD分だけ移動したサンプルです。これのそれぞれの座標がぴったり重なれば理論は正しかったことになります。
まず画像の準備。1200ⅹ800の画像を準備、それぞれの同じ箇所に仮想のクリック座標を記入。次に最初の倍率をscale:1で考え何倍にするか?
複数パターンの材料が欲しかったので4~5回変倍することに。
ということで次のような式を構築。
複数の画像にそれぞれ倍率を設定し、それらを配列へ格納、forEachで個別に構築した式を割り当てます。
これですべての画像の仮想クリック座標同じ座標になれば構築した式が正しいことになります。
const p={
_orgX: 1,
get orgX(){return this._orgX},
set orgX(v){this._orgX = v},
_orgY: 1,
get orgY(){return this._orgY},
set orgY(v){this._orgY = v},
_scale: 1,
get scale(){return this._scale},
set scale(v){this._scale = v},
_mousePoints: {x: 999, y: 598},
get mousePoints(){
return this._mousePoints;
},
set mousePoints(v){
if(v){
this._mousePoints= v;
}else{
this._mousePoints= {x: this._wW / 2, y: this._wH / 2};
}
},
};
const zoomImgs= document.querySelectorAll('#prvBlc img');
zoomImgs.forEach( (item, ) => {
const scale = Math.round( item.dataset.scale *100) / 100;
p.scale= scale;
p.orgX= p.mousePoints.x * (scale - 1) * -1;
p.orgY= p.mousePoints.y * (scale - 1) * -1;
item.style.transform= 'translate( '+p.orgX+'px, '+p.orgY+'px) scale('+scale+')';
});
HTMLの解説それぞれ、画像要素(imgタグ)を6点準備しています。画像はすべて同じです。
画像自体には仮想のマウス座標に相当する印、十字座標と同心円が記載されています。
画像要素(imgタグ)はすべてposition: absolute で重なるようにしています。
座標はすべて同じなので何も変更くわえなければピッタリと重なります。
それぞれの画像の座標などが分かるように透明度を入れています。
これに、data属性で倍率を設定します。
それぞれ
0.2、0.5、1、1.2、1.5、2倍になるように設定しています。
これをJSで処理すると拡大率に応じた移動距離を付与され、拡大・移動表示されます。
各画像の十字の印がピッタリ重なれば、検証OKということです。
<div id="prvBlc" class="draggable">
<img data-scale=0.2 src="/assets/labo/interactjs/simple/images/img1.jpg" alt="">
<img data-scale=0.5 src="/assets/labo/interactjs/simple/images/img1.jpg" alt="">
<img data-scale=1 src="/assets/labo/interactjs/simple/images/img1.jpg" alt="">
<img data-scale=1.2 src="/assets/labo/interactjs/simple/images/img1.jpg" alt="">
<img data-scale=1.5 src="/assets/labo/interactjs/simple/images/img1.jpg" alt="">
<img data-scale=2 src="/assets/labo/interactjs/simple/images/img1.jpg" alt="">
</div>
どうやら成功しました。ブラウザで表示してみてください。
きちんと座標が重なっているでしょう。式は正しかったことになります。
次は実際にwheelイベントで拡大機能と一緒にしてみます。
下層マウス座標を中心とした拡大縮小テスト:https://labo.studio-happyvalley.com/interactjs/simple/
使用している画像。右下に十時の印を入れてます。