如何使用Javascript在SVG中绘制不可缩放的圆圈
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用Javascript在SVG中绘制不可缩放的圆圈,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3092字,纯文字阅读大概需要5分钟。
内容图文
![如何使用Javascript在SVG中绘制不可缩放的圆圈](/upload/InfoBanner/zyjiaocheng/705/2ff457ed03cf464e851da572a8866e4c.jpg)
我正在开发一个地图,在Javascript中使用SVG绘制线条.
我想添加一个可以搜索道路的功能,如果找到了道路,地图上会出现一个圆圈.
我知道我可以在SVG中绘制一个圆,但我的问题是,圆的大小不应该根据缩放级别而改变.换句话说,圆圈必须始终具有相同的尺寸.
我地图上的道路都有这个功能,我所要做的就是添加
vector-effect="non-scaling-stroke"
到行属性..
一条线看起来像这样.
<line vector-effect="non-scaling-stroke" stroke-width="3" id = 'line1' x1 = '0' y1 = '0' x2 = '0' y2 = '0' style = 'stroke:rgb(255,215,0);'/>
圆圈看起来像这样.
<circle id = "pointCircle" cx="0" cy="0" r="10" stroke="red" stroke-width="1" fill = "red"/>
有可能以某种方式将圆圈定义为“非缩放”吗?
解决方法:
我花了一段时间,但我终于得到了干净的数学.此解决方案需要三件事:
>在您的页面中包含this script(以及SVGPan.js脚本),例如
< script xlink:href =“SVGPanUnscale.js”>< / script>
>识别您不想缩放的项目(例如,将它们放在具有特殊类或ID的组中,或者在每个元素上放置特定的类),然后告诉脚本如何查找这些项目,例如:
unscaleEach(“g.non-scaling> *,circle.non-scaling”);
>使用transform =“translate(…,…)”将每个元素放在图表上,而不是cx =“…”cy =“…”.
仅使用这些步骤,使用SVGPan进行缩放和平移不会影响标记元素的缩放(或旋转或倾斜).
演示:http://phrogz.net/svg/scale-independent-elements.svg
图书馆
// Copyright 2012 ? Gavin Kistner, !@phrogz.net
// License: http://phrogz.net/JS/_ReuseLicense.txt
// Undo the scaling to selected elements inside an SVGPan viewport
function unscaleEach(selector){
if (!selector) selector = "g.non-scaling > *";
window.addEventListener('mousewheel', unzoom, false);
window.addEventListener('DOMMouseScroll', unzoom, false);
function unzoom(evt){
// getRoot is a global function exposed by SVGPan
var r = getRoot(evt.target.ownerDocument);
[].forEach.call(r.querySelectorAll(selector), unscale);
}
}
// Counteract all transforms applied above an element.
// Apply a translation to the element to have it remain at a local position
function unscale(el){
var svg = el.ownerSVGElement;
var xf = el.scaleIndependentXForm;
if (!xf){
// Keep a single transform matrix in the stack for fighting transformations
// Be sure to apply this transform after existing transforms (translate)
xf = el.scaleIndependentXForm = svg.createSVGTransform();
el.transform.baseVal.appendItem(xf);
}
var m = svg.getTransformToElement(el.parentNode);
m.e = m.f = 0; // Ignore (preserve) any translations done up to this point
xf.setMatrix(m);
}
演示代码
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Scale-Independent Elements</title>
<style>
polyline { fill:none; stroke:#000; vector-effect:non-scaling-stroke; }
circle, polygon { fill:#ff9; stroke:#f00; opacity:0.5 }
</style>
<g id="viewport" transform="translate(500,300)">
<polyline points="-100,-50 50,75 100,50" />
<g class="non-scaling">
<circle transform="translate(-100,-50)" r="10" />
<polygon transform="translate(100,50)" points="0,-10 10,0 0,10 -10,0" />
</g>
<circle class="non-scaling" transform="translate(50,75)" r="10" />
</g>
<script xlink:href="SVGPan.js"></script>
<script xlink:href="SVGPanUnscale.js"></script>
<script>
unscaleEach("g.non-scaling > *, circle.non-scaling");
</script>
</svg>
内容总结
以上是互联网集市为您收集整理的如何使用Javascript在SVG中绘制不可缩放的圆圈全部内容,希望文章能够帮你解决如何使用Javascript在SVG中绘制不可缩放的圆圈所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。