缩放、拖动和旋转时的图像定位
Image positioning when scaling,dragging and rotating
我正在处理一些代码来操作图像。我有 90% 的工作,但遇到了一个让我拔头发的错误!所以我有两个滑块。左滑块用于旋转,右滑块用于缩放(缩放)。您也可以拖动图像来定位它。
这是一个特定的序列,在缩放图像时会导致图像跳跃。 顺序是:
旋转,缩放,旋转,缩放,拖动,缩放。
在最终比例尺上,您将能够看到图像跳出位置。这是,但我得到了。
我在下面添加了一些代码,我的完整代码可以在这里的jsfiddle中进行测试
拉:
// Drag Handler
$('#posUsrImgWrap').draggable({
drag:function(event, ui){
var il = ui.position.left;
var it = ui.position.top;
var iw = $(this).width();
var ih = $(this).height();
$('#posUserImg').css({'top':it+'px','left':il+'px'});
dragged = true;
zc = 0;
},
stop:function(){
ixz = $('#posUserImg').position().left;
iyz = $('#posUserImg').position().top;
if(rotated){
if(!zoomed){
rx=orx*zv;
ry=ory*zv;
}
ixz=ixz+rx;
iyz=iyz+ry;
}
rxz=ixz;
ryz=iyz;
zoomed=false;
rd=true;
}
});
旋转:
$( "#slider-vertical" ).show().slider({
orientation: "vertical",
min: -180,
max: 180,
value: sv,
slide: function( event, ui ) {
var rv = ui.value; // Rotate Value
$('#posUserImg, #posUsrImgWrap').rotate(rv);
$('#rVal').val(rv);
},
stop:function(){
rx=((rxz - $('#posUserImg').position().left));
ry=((ryz - $('#posUserImg').position().top));
orx=rx;
ory=ry;
rzv=zv;
rotated=true;
}
});
规模:
$( "#slider-vertical-zoom" ).show().slider({
orientation: "vertical",
min: -90,
max: 150,
step: 5,
value: szv,
start:function(){
czv = (1+ $(this).slider("value")/100);
},
slide: function( event, ui ) {
zv = (1+ ui.value/100); // Zoom Value
var nx = 0;
var ny = 0;
var ozv = (1+ parseInt($('#zVal').val())/100);
nzo = calculateAspectRatioFit(iwz, ihz, iwz*(ozv), ihz*(ozv));
if (dragged && zc == 0){
var wt = Math.abs(iwz - nzo.width);
var ht = Math.abs(ihz - nzo.height);
if (czv < 1){
ixz = ixz-(wt/2);
iyz = iyz-(ht/2);
} else {
ixz = ixz+(wt/2);
iyz = iyz+(ht/2);
}
}
nzo = calculateAspectRatioFit(iwz, ihz, iwz*(zv), ihz*(zv));
$('#posUserImg, #posUsrImgWrap').width(nzo.width).height(nzo.height);
var wd = Math.abs(iwz - nzo.width);
var hd = Math.abs(ihz - nzo.height);
if (zv < 1){
nx = (ixz+(wd/2));
ny = (iyz+(hd/2));
$('#posUserImg, #posUsrImgWrap').css({'left':nx+'px','top':ny+'px'});
} else {
nx = (ixz-(wd/2));
ny = (iyz-(hd/2));
$('#posUserImg, #posUsrImgWrap').css({'left':nx+'px','top':ny+'px'});
}
$('#wPos').val(nzo.width);
$('#hPos').val(nzo.height);
$('#xPos').val(($('#posUserImg').position().left+(orx*zv)));
$('#yPos').val(($('#posUserImg').position().top+(ory*zv)));
$('#zVal').val(ui.value);
zc++;
iz=1;
},
stop: function(){
zx = 0;
zoomed=true;
rx=orx*zv;
ry=ory*zv;
rxz=ixz+rx;
ryz=iyz+ry;
}
});
我认为问题出在旋转或缩放结束功能上。我有一种感觉,这可能与比例值有关,但我尝试了许多不同的组合来使其工作,但没有运气。
经过数小时的测试和调试,我发现了如何做到这一点。事实证明,这是一个非常简单的修复程序。问题是可拖动的 UI 事件向旋转事件返回不同的顶部和左侧值。不完全确定如何或为什么,但它似乎适用于可拖动停止函数中的修改代码。您可以在此处查看固定版本。
var il,it;
// Drag Handler
$('#posUsrImgWrap').draggable({
drag:function(event, ui){
il = ui.position.left;
it = ui.position.top;
var iw = $(this).width();
var ih = $(this).height();
$('#posUserImg').css({'top':it+'px','left':il+'px'});
dragged = true;
zc = 0;
},
stop:function(){
ixz=il;
iyz=it;
}
});
我通过注释您的一些代码对您的代码进行了一些更改。它似乎有效,错误消失了。请看一看。如果您注释您的代码,那么我可能会更好地解决您的问题。我评论了以下部分:
if (zv < 1){
nx = (ixz+(wd/2));
ny = (iyz+(hd/2));
$('#posUserImg, #posUsrImgWrap').css({'left':nx+'px','top':ny+'px'});
}
else{
nx = (ixz-(wd/2));
ny = (iyz-(hd/2));
$('#posUserImg, #posUsrImgWrap').css({'left':nx+'px','top':ny+'px'});
}
可能,问题主要是由于拖动=true&zc=0时设置ixz,iyz值两次的原因。
相关文章:
- 如何在容器中定位旋转的图像
- 在CSS中重叠相对定位的图像
- 上传图像,重新定位,保存图像
- 如何为 ajax 生成的图像设置绝对定位
- 图像(绝对定位)相对定位容器中的水平中心
- 根据其他调整大小的html元素定位背景图像
- 在包含的html文件上定位图像
- 如何在 jQuery 中将可点击的图像定位到浏览器顶部
- 如何将背景图像定位到 html 元素的左上角和右下角
- 缩放、拖动和旋转时的图像定位
- jQuery图像滑块封面图像定位问题
- Fabric JS:使用坐标(x,y)设置图像定位
- 将图像定位在随机位置
- 是否可以将图像定位在屏幕的中心而不是浏览器的中心
- 所见即所得图像定位解决方案
- 响应式地将图像定位在背景图像上的特定目标上
- MagicZoomPlus缩放图像定位
- 是否可以使用百分比相对定位将推杆图像定位在另一个图像上?
- 将图像定位在图像上
- HTML5 Javascript图像定位