SVG drag
来源:互联网 发布:发布报名互动网站源码 编辑:程序博客网 时间:2024/05/22 02:26
svg图形拖动的例子/解决方法
http://www.souzz.net 2007-06-07 文章出处:网络收集 <script type="text/javascript"><!--google_ad_client = "pub-4234177103003112";//336x280, 创建于 07-11-8google_ad_slot = "9803889511";google_ad_width = 336;google_ad_height = 280;//--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4234177103003112&dt=1197823390828&lmt=1194663767&prev_slotnames=2590732127&output=html&slotname=9803889511&correlator=1197823390828&url=http%3A%2F%2Fwww.souzz.net%2Fhtml%2Fsvg%2F2%2F34243.html&ref=http%3A%2F%2Fwww.souzz.net%2Fhtml%2Fsvg%2F&cc=532&ga_vid=667327540.1197823383&ga_sid=1197823383&ga_hid=155565171&flash=9&u_h=1024&u_w=1280&u_ah=990&u_aw=1280&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"></iframe>怎样实现对svg的拖动的操作?
svg图形拖动的例子~
在鼠标事件里处理,在onmousedown开始处理,在onmousemove中改变目标坐标,在onmouseup结束处理
<?xml version='1.0' standalone='no'?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd">
<svg width='100%' height='100%' xmlns='http://www.w3.org/2000/svg'
onload='Init(evt)' onmousedown='Grab(evt)' onmousemove='Drag(evt)'
onmouseup='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 SVGDocument = null;
var SVGRoot = null;
var TrueCoords = null;
var GrabPoint = null;
var BackDrop = null;
var DragTarget = null;
function Init(evt)
{
SVGDocument = evt.target.ownerDocument;
SVGRoot = SVGDocument.documentElement;
// these svg points hold x and y values...
// very handy, but they do not display on the screen (just so you know)
TrueCoords = SVGRoot.createSVGPoint();
GrabPoint = SVGRoot.createSVGPoint();
// this will serve as the canvas over which items are dragged.
// having the drag events occur on the mousemove over a backdrop
// (instead of the dragged element) prevents the dragged element
// from being inadvertantly dropped when the mouse is moved rapidly
BackDrop = SVGDocument.getElementById('BackDrop');
}
function Grab(evt)
{
// find out which element we moused down on
var targetElement = evt.target;
// you cannot drag the background itself, so ignore any attempts to mouse down on it
if ( BackDrop != targetElement )
{
//set the item moused down on as the element to be dragged
DragTarget = targetElement;
// move this element to the "top" of the display, so it is (almost)
// always over other elements (exception: in this case, elements that are
// "in the folder" (children of the folder group) with only maintain
// hierarchy within that group
DragTarget.parentNode.appendChild( DragTarget );
// turn off all pointer events to the dragged element, this does 2 things:
// 1) allows us to drag text elements without selecting the text
// 2) allows us to find out where the dragged element is dropped (see Drop)
DragTarget.setAttributeNS(null, 'pointer-events', 'none');
// we need to find the current position and translation of the grabbed element,
// so that we only apply the differential between the current location
// and the new location
var transMatrix = DragTarget.getCTM();
GrabPoint.x = TrueCoords.x - Number(transMatrix.e);
GrabPoint.y = TrueCoords.y - Number(transMatrix.f);
}
};
function Drag(evt)
{
// account for zooming and panning
GetTrueCoords(evt);
// if we don't currently have an element in tow, don't do anything
if (DragTarget)
{
// account for the offset between the element's origin and the
// exact place we grabbed it... this way, the drag will look more natural
var newX = TrueCoords.x - GrabPoint.x;
var newY = TrueCoords.y - GrabPoint.y;
// apply a new tranform translation to the dragged element, to display
// it in its new location
DragTarget.setAttributeNS(null, 'transform', 'translate(' + newX + ',' + newY + ')');
}
};
function Drop(evt)
{
// if we aren't currently dragging an element, don't do anything
if ( DragTarget )
{
// since the element currently being dragged has its pointer-events turned off,
// we are afforded the opportunity to find out the element it's being dropped on
var targetElement = evt.target;
// turn the pointer-events back on, so we can grab this item later
DragTarget.setAttributeNS(null, 'pointer-events', 'all');
if ( 'Folder' == targetElement.parentNode.id )
{
// if the dragged element is dropped on an element that is a child
// of the folder group, it is inserted as a child of that group
targetElement.parentNode.appendChild( DragTarget );
alert(DragTarget.id + ' has been dropped into a folder, and has been inserted as a child of the containing group.');
}
else
{
// for this example, you cannot drag an item out of the folder once it's in there;
// however, you could just as easily do so here
alert(DragTarget.id + ' has been dropped on top of ' + targetElement.id);
}
// set the global variable to null, so nothing will be dragged until we
// grab the next element
DragTarget = null;
}
};
function GetTrueCoords(evt)
{
// find the current zoom level and pan setting, and adjust the reported
// mouse position accordingly
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' />
<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>
</svg>
- SVG drag
- SVGPan: a Javascript SVG (Viewer) Pan/Zoom/Drag library
- drag
- svg
- SVG
- SVG
- SVG
- SVG
- SVG
- svg
- svg
- SVG
- SVG
- SVG
- SVG
- SVG
- svg
- svg
- 学习了虚函数和多态
- C之行(2):C primer plus的第八题
- Ajax学习--网址链接大全
- [p2p]UDP用打洞技术穿透NAT的原理与实现
- 菜鸟也封装之迷你工厂,帮你解耦合(J2EE).
- SVG drag
- 53个CSS-不可或缺的技巧
- using switch case block not just under the integral type
- 想学CSS到这里来看一看
- 菜鸟也封装之分页轻松做.
- FileStream类/StreamWriter类/StreamReader的使用
- 2007年12月16日 - FE再战成都普什
- 计算机类期刊投稿心得
- ubuntu 命令行方式配置网络