4

我正在使用此处答案中发布的代码使用 mousedown 平移大图像,该图像位于另一个透明图像下方的 div 中。无需缩放。代码对我来说很好,除了平移从大图像的左上角开始,我希望它从中心点开始,然后向各个方向平移。我对执行此操作所涉及的计算知之甚少,因此非常感谢一些有关如何解决此问题的指示,或者我需要做什么来指定起点。

jQuery是:

var clicking = false;
var previousX;
var previousY;

$("#scroll").mousedown(function(e) {
    e.preventDefault();
    previousX = e.clientX;
    previousY = e.clientY;
    clicking = true;
});

$(document).mouseup(function() {

    clicking = false;
});

$("#scroll").mousemove(function(e) {

    if (clicking) {
        e.preventDefault();
        var directionX = (previousX - e.clientX) > 0 ? 1 : -1;
        var directionY = (previousY - e.clientY) > 0 ? 1 : -1;
        $("#scroll").scrollLeft($("#scroll").scrollLeft() + (previousX - e.clientX));
        $("#scroll").scrollTop($("#scroll").scrollTop() + (previousY - e.clientY));
        previousX = e.clientX;
        previousY = e.clientY;
    }
});

$("#scroll").mouseleave(function(e) {
    clicking = false;
});

html是:

<div id="scroll">
  <img src="sampleimg.jpg" class="background" />
</div>
<img src="sampleoverlay.png" class="overlay" />

CSS是:

#scroll {
  width: 580px;
  height: 620px;
  overflow: hidden;
}

.background {
  width: 100%;
  height: 100%;
}

.overlay {
  width: 100%; 
  height: 100%;
  position: absolute;
  pointer-events: none;
}

抱歉,如果这真的很明显 - 我找不到任何可以回答我的问题的东西,但可能没有在寻找正确的东西。

4

2 回答 2

4

由于您引用的答案使用 div 滚动overflow:hidden,因此您只需将 div 滚动到正确的起始位置。您可以通过从 div 的宽度中减去图像的宽度来计算此值。这为您提供了 div 两侧的边距空间因此我们需要将其除以 2。

计算

对高度执行相同操作以找到上边距,然后只需使用 jQueryscrollTop()和. 将您的 div 滚动到该位置scrollLeft()

jsFiddle

于 2013-10-16T14:32:27.927 回答
1

我相信您可以通过使用触摸事件使这项工作适用于移动设备。我不确定是否需要 touchend 和相当于 mouseleave 的东西,但它会是这样的:

$(document).ready(function(){
var $container = $("#scroll");
var $img = $("#scroll img");
var cHeight = $container.height();
var cWidth = $container.width();
var iHeight = $img.height();
var iWidth = $img.width();

var top = (iHeight - cHeight) / 2;
var left = (iWidth - cWidth) / 2;

$container.scrollLeft(left);
$container.scrollTop(top);
});

var clicking = false;
var previousX;
var previousY;

$("#scroll").bind('touchstart', function(e) {
  e.preventDefault();
  previousX = e.touches[0].clientX;
  previousY = e.touches[0].clientY;
  clicking = true;
});

/* $(document).bind('touchend', function() {

    clicking = false;
}); */

$("#scroll").bind('touchmove', function(e) {
  if (clicking) {
    e.preventDefault();
    var directionX = (previousX - e.touches[0].clientX) > 0 ? 1 : -1;
    var directionY = (previousY - e.touches[0].clientY) > 0 ? 1 : -1;

    container.scrollLeft(container.scrollLeft() + (previousX - e.touches[0].clientX));
    container.scrollTop(container.scrollTop() + (previousY - e.touches[0].clientY));

    previousX = e.touches[0].clientX;
    previousY = e.touches[0].clientY;
  }
});

jsFiddle (除非您能以某种方式使其模仿移动设备,否则小提琴不起作用 - 我不确定如何)

于 2018-01-02T21:17:35.463 回答