使用变换使 SVG 可缩放

问题描述 投票:0回答:1

我正在尝试使用鼠标使 SVG 的一部分可拖动和缩放,但失败了。拖动有效,但缩放不起作用。我基本上从这里偷了大部分代码

var makeDraggable = (function() { function makeDraggable(svg, element) { var selected = false; var transform, offset; var container = svg.parentElement; // Make sure the first transform on the element is a translate transform var transforms = element.transform.baseVal; if (transforms.length === 0 || transforms.getItem(0).type !== SVGTransform.SVG_TRANSFORM_TRANSLATE) { // Create a transform that translates by (0, 0) var translate = svg.createSVGTransform(); translate.setTranslate(0, 0); element.transform.baseVal.insertItemBefore(translate, 0); } svg.addEventListener('mousedown', startDrag); svg.addEventListener('mousemove', drag); svg.addEventListener('mouseup', endDrag); svg.addEventListener('wheel', zoom); // Attach zoom function to mouse scroll event function getMousePosition(evt) { var CTM = svg.getScreenCTM(); if (evt.touches) { evt = evt.touches[0]; } return { x: (evt.clientX - CTM.e) / CTM.a, y: (evt.clientY - CTM.f) / CTM.d }; } function startDrag(evt) { selected = element; transform = transforms.getItem(0); // Get initial translation offset = getMousePosition(evt); offset.x -= transform.matrix.e; offset.y -= transform.matrix.f; } function drag(evt) { if (selected) { evt.preventDefault(); var coord = getMousePosition(evt); transform.setTranslate(coord.x - offset.x, coord.y - offset.y); } } function endDrag(evt) { selected = false; } function zoom(evt) { evt.preventDefault(); // Get the current scale var transform = transforms.getItem(0); var scale = transform.matrix.a; // Calculate the new scale based on mouse wheel direction var scaleStep = evt.deltaY > 0 ? 0.8 : 1.25; var newScale = scale * scaleStep; // Limit the scale to a minimum of 0.1 and a maximum of 10 newScale = Math.max(0.1, Math.min(newScale, 10)); // Apply the new scale to the element transform.setScale(newScale, newScale); // Adjust the translation to keep the same point under the mouse var mousePosition = getMousePosition(evt); var scaleFactor = newScale / scale; var deltaX = mousePosition.x * (1 - scaleFactor); var deltaY = mousePosition.y * (1 - scaleFactor); // Update the translation transform.setTranslate(transform.matrix.e + deltaX, transform.matrix.f + deltaY); } } return makeDraggable; })();

jsfiddle

javascript svg
1个回答
0
投票
我很高兴地告诉您,缩放 SVG 是可行的......但有一个问题!

onwheel事件只能添加到document.bodywindow,但不能直接添加到SVG。

<!DOCTYPE html><head></head><body> <script> var Z=1; window.onwheel=function(e){if(e.deltaY>0){Z-=0.1;} else if(e.deltaY<0){Z+=0.1;} svg1.style.zoom=Z;}; </script> <br> <svg xmlns="http://www.w3.org/2000/svg" id="svg1" style="width:100px; height:100px;"><path d="M1 7.5h30V1.9H1v5.6zm0 22.6h30v-5.6H1v5.6zm0-11.3h30v-5.6H1v5.6z"/></svg> <br>This text and the image below should remain the same size...<br><br> <img id="svg2" src="file:///C:/Users/HP_Desktop/Desktop/svgtest.svg" height="100" width="100" border="0"> </body></html>
备注:

在 Chromium 中测试正常。

当您将其 ID 设置为缩放时,该测试适用于内联和图像标签 SVG。

© www.soinside.com 2019 - 2024. All rights reserved.