我需要能够多次缩放 div 并可以更改原点。
请看一下: http: //jsfiddle.net/croydufixe/vdXM7/(见下面的完整代码)
运行此小提琴时,将显示一个灰色正方形,并用红线网格将正方形划分为 4 x 4 。
红色标记位于下一个变换的“原点”。
在框架的顶部,您可以看到两个按钮“+”和“-”以增加(或减少)0.5 倍的比例缩放灰色方块
现在,请使用以下步骤:
- 单击 + 按钮:使用红色标记作为原点,灰色方块按 1+0.5 缩放
- 通过单击灰色方块的 25% 25% 重新定位红色标记
- 再次点击+按钮:灰色方块被缩放(1+0.5+0.5),但这个比例的原点是灰色方块的左上角而不是红色标记
- 再次单击“+”:使用红色标记作为原点,对灰色正方形进行缩放 (1+0.5+0.5+0.5)
我不明白第 3 步使用的原点(顶部/左侧,而不是 25%/25%)
感谢您的帮助。
完整代码:
<head>
<title></title>
<script>
var lastScale=1;
var originModified = false;
function drawCanvas()
{
var canevas=document.getElementById("canvas");
var ctx = canevas.getContext("2d");
var e=document.getElementById("canvas");
var largeur = e.offsetWidth;
var hauteur = e.offsetHeight;
for( var x=0; x<largeur; x+=largeur/4 )
{
ctx.moveTo( x, 0 );
ctx.lineTo( x, hauteur );
}
for( var y=0; y<hauteur; y+=hauteur/4 )
{
ctx.moveTo( 0, y );
ctx.lineTo( largeur, y );
}
ctx.strokeStyle = '#ff0000';
ctx.stroke();
}
function init( )
{
lastScale=1;
originModified=false;
var e = document.getElementById( "origin" );
}
function incrementalScale( increment )
{
var e=document.getElementById("a");
var eOrigin = document.getElementById("origin");
//
var targetOriginX = eOrigin.offsetLeft;
var targetOriginY = eOrigin.offsetTop;
e.style.transformOrigin = targetOriginX + "px " + targetOriginY + "px 0px";
lastScale += increment;
var transform = "scale(" + lastScale + ")";
e.style.transform = transform;
originModified = false;
}
function setOrigin(event)
{
if( originModified )
{
alert( 'origin already modified : please do a scale');
return;
}
var eOrigin=document.getElementById("origin");
var ee = document.getElementById("a");
var deltaX = eOrigin.offsetLeft - ( event.clientX - ee.offsetLeft );
eOrigin.style.left = ( eOrigin.offsetLeft - deltaX / lastScale ) + "px";
var deltaY = eOrigin.offsetTop - ( event.clientY - ee.offsetTop );
eOrigin.style.top = ( eOrigin.offsetTop - deltaY / lastScale ) + "px";
originModified = true;
}
</script>
</head>
<body onload="drawCanvas();init();">
<div>
scale <input type="button" onclick="incrementalScale(+0.5)" value="+">
<input type="button" onclick="incrementalScale(-0.5)" value="-">
</div>
<div id="a" style="position:relative;top:400px;left:400px;border:1 px solid red;background-color:#DDD;width:200px;height:200px"
onmousedown="setOrigin(event);">
<canvas id="canvas" width="200px" height="200px"></canvas>
<div id="origin" style="position:absolute;top:100px;left:100px;width:5px;height:5px;background-color:red">
</div>
</div>
</body>