在SVG View下整图平移

      今天在网上查询在SVGView下对SVG图形进行平移操作的JS代码时发现了有不少对SVG图形中某些图元进行移动的文档,而没有整图平移的代码。

      参考这些代码,自己写了整图平移的代码。

      代码如下(记得将下面代码保存成UTF-8编码格式的svg文件):

<?xml version='1.0' standalone='no'?>

<svg width='100%' height='100%' xmlns='http://www.w3.org/2000/svg'

οnlοad='Init(evt)' οnmοusedοwn='Grab(evt)' οnmοusemοve='Drag(evt)'

οnmοuseup='Drop(evt)'>

<title>Drag And Drop</title>

<desc>

A nice little demo of drag-and-drop functionality in SVG,

written by Doug Schepers on February 16, 2004. Use or misuse

this code however you wish.

</desc>

<script type="text/javascript"><![CDATA[

var svgdoc = null; // SVG文档对象

var svgroot = null; // SVG文档的根节点

var check = false; // 图像拖动标志

var TrueCoords = null; // 

var GrabPoint = null;

var BackDrop = null; // 背景对象

var WholeMap = null; // 整图对象

/**

 * @功能: 初始化函数

 **/

function Init(evt) {

svgdoc = evt.target.ownerDocument;

svgroot = svgdoc.documentElement;

 

TrueCoords = svgroot.createSVGPoint();

GrabPoint = svgroot.createSVGPoint();

BackDrop = svgdoc.getElementById('BackDrop');

WholeMap = svgdoc.getElementById('whole');

}

 

/**

 * @功能:处理鼠标落下的事件

 * @param evt:事件句柄

 **/

function Grab(evt) {

if (evt.button != 0) {

// 非左键不响应

return;

}

var transMatrix = WholeMap.getCTM();

GrabPoint.x = TrueCoords.x - Number(transMatrix.e);

GrabPoint.y = TrueCoords.y - Number(transMatrix.f);

check = true;

// alert(GrabPoint.x+":"+GrabPoint.y);

}

 

/**

 * @功能:处理鼠标移动事件

 * @param evt:事件句柄

 **/

function Drag(evt) {

GetTrueCoords(evt);

 

if (check == true) {

var newX = TrueCoords.x - GrabPoint.x;

var newY = TrueCoords.y - GrabPoint.y;

 

WholeMap.setAttributeNS(null, 'transform', 'translate(' + newX + ','

+ newY + ')');

}

}

 

/**

 * @功能:处理鼠标松开事件

 * @param evt:事件句柄

 **/

function Drop(evt) {

check = false;

}

 

/**

 * @功能:获取鼠标移动位置

 * @param evt:事件句柄

 **/

function GetTrueCoords(evt) {

var newScale = svgroot.currentScale;

var translation = svgroot.currentTranslate;

TrueCoords.x = (evt.clientX - translation.x) / newScale;

TrueCoords.y = (evt.clientY - translation.y) / newScale;

};

   ]]></script>

 

<rect id='BackDrop' x='-10%' y='-10%' width='110%' height='110%'

fill='none' pointer-events='all' />

 

<g id="whole">

<circle id='BlueCircle' cx='25' cy='25' r='20' style='fill:blue; ' />

<circle id='RedCircle' cx='125' cy='25' r='20' style='fill:red; ' />

<circle id='OrangeCircle' cx='225' cy='25' r='20'

style='fill:orange; ' />

<text id='DraggableText' x='20' y='200'

style='fill:red; font-size:18px; font-weight:bold;'>

Draggable Text

</text>

 

<rect id='GreenRectangle' x='50' y='70' width='100' height='100'

style='fill:green; ' />

 

<g id='Folder'>

<rect id='FolderRectangle' x='300' y='100' width='200'

height='150' style='fill:tan; stroke:brown; stroke-width:3;' />

</g>

</g>

</svg>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用JavaScript监听SVG平移操作,你可以使用以下步骤: 1. 获取SVG元素:首先,使用JavaScript的`querySelector`或`getElementById`等方法获取到你想要监听平移操作的SVG元素。例如,可以使用`document.querySelector('#svgId')`来获取具有特定ID的SVG元素。 2. 添加事件监听器:使用`addEventListener`方法为SVG元素添加事件监听器。在这种情况下,你可以监听鼠标按下、移动和释放事件来实现平移操作。例如,可以使用以下代码为SVG元素添加平移操作的事件监听器: ```javascript const svgElement = document.querySelector('#svgId'); let isDragging = false; let startCoords = { x: 0, y: 0 }; svgElement.addEventListener('mousedown', function(event) { isDragging = true; startCoords = { x: event.clientX, y: event.clientY }; }); svgElement.addEventListener('mousemove', function(event) { if (isDragging) { const dx = event.clientX - startCoords.x; const dy = event.clientY - startCoords.y; svgElement.setAttribute('transform', `translate(${dx}, ${dy})`); } }); svgElement.addEventListener('mouseup', function(event) { isDragging = false; }); ``` 3. 在事件处理函数中执行平移操作:在平移操作的事件处理函数中,根据鼠标移动的距离,计算出需要平移的距离,并使用SVG的`transform`属性来设置平移变换。在上述代码中,我们使用鼠标按下时的坐标和当前鼠标位置的差值来计算平移距离,并将其应用到SVG元素的`transform`属性中。 请注意,上述代码仅为一个基本示例,具体的平移逻辑和操作可以根据你的需求进行调整。同时,还可以根据需要添加其他功能,如限制平移范围、平滑动画等。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值