HTML / D3.js -如何从鼠标光标而不是左上角进行缩放

时间:2018-10-30 01:57:11

标签: javascript html d3.js

我有一张这样的图片(demo),并且可以通过鼠标滚轮上下缩放。但是它只能从左上角进行缩放...

我该如何尝试使其从鼠标光标点缩放(例如example)。 另外,我需要具有图片边界,而不是像这个例子那样无边。感谢您的任何回答或建议。

HTML,css

//Html
<div id="picture"></div>

//css
#picture {
  width: 340px;
  height: 150px;
  overflow: auto;
}

JavaScript

createSVG = function () {

  var svg = d3.select('#picture')
  .append('svg')
  .attr('width', rw)
  .attr('height', rh)
  .style('border', '1px solid #000');

  svg.append('svg:image')
    .attr('xlink:href', 'http://www.iconpng.com/png/beautiful_flat_color/computer.png')
    .attr('width', rw)
    .attr('height', rh);
}


//Init (Original size)
var Picture_w = 340;
var Picture_h = 150;
value = 96;                      //(scaling ratio)
rw = Picture_w * value / 100;
rh = Picture_h * value / 100;

createSVG();

// When change scaling ratio, RE createSVG();
changeSize = function () {
  d3.select('svg').remove();

  rw = Picture_w * value / 100;
  rh = Picture_h * value / 100;

  createSVG();
};


//mousewheel (Chrome or IE)
$('#picture').on('mousewheel DOMMouseScroll', function (e) {
  e.preventDefault();
  if (e.type == 'mousewheel') {
    if (e.originalEvent.wheelDelta > 0) {

      value += 2;
      if (value > 500) {
        value = 500;
      }
      changeSize();
      // console.log(e.originalEvent.wheelDelta);
    }
    else {

      value -= 2;
      if (value < 5) {
        value = 5;
      }
      changeSize();
      // console.log("w" + e.originalEvent.wheelDelta);
    }
  }

});

1 个答案:

答案 0 :(得分:0)

我不确定您在看什么,但是我用您的代码创建了一个D3 zoom,并使用Mike Bostock’s Block方法实现了缩放。

想法是创建缩放行为并将其应用于指定的选择/元素。

var parent = d3.select("#picture");

var zoom = d3.zoom()
    .scaleExtent([0.5, 8])
    .on("zoom", zoomed);

parent.call(zoom);

function zoomed() {
  parent.select("svg").attr("transform", d3.event.transform);
}

function reset() {
	parent.transition()
      .duration(750)
      .call(zoom.transform, d3.zoomIdentity);
}
#picture {
  width: 340px;
  height: 150px;
  overflow: auto;
}

.parent {
	border : 1px solid #000;
}
<script src="//d3js.org/d3.v5.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<div id="picture">
	<svg width="330" height="140" class="parent"><g class="image"><image xlink:href="http://www.iconpng.com/png/beautiful_flat_color/computer.png" width="330" height="140" class="pictureWrapper"></image></g></svg>
</div>
<button onclick="reset()">Reset</button>