围绕svg中的对象进行倒角
Bevel around object in svg
我需要在svg中的一个元素周围绘制一个rect
。我尝试使用getBBox
方法,但如果我增加元素的stroke-width
,它就会变得比rect大。如何使rect包含完整对象?
这里有一个例子:
var line = $("line").get(0);
var rect = $("rect").get(0);
var bb = line.getBBox();
rect.setAttribute("x", bb.x);
rect.setAttribute("y", bb.x);
rect.setAttribute("width", bb.width);
rect.setAttribute("height", bb.height);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg width="500" height="200">
<line x1="50" y1="50" x2="450" y2="150" stroke="#000000" stroke-width="40" />
<rect stroke="#2795EE" stroke-dasharray="10, 5" fill="none"/>
</svg>
SVG规范(http://www.w3.org/TR/SVG/types.html#__svg__SVGLocatable__getBBox)声明getBBox()函数"在当前用户空间中(即,在对所有包含的图形元素的几何体应用‘transform'属性(如果有的话)之后)返回紧密边界框,不包括笔划、剪裁、遮罩和过滤效果"。基本上,该方法返回路径点的边界框,该边界框为填充形状提供了良好的边界框但为描边形状提供了不好的边界框。可以为每条边添加半个笔划宽度,以便为笔划形状获得更好(但不是完美)的边界框。在你的例子中,你可以使用类似。。。
var line = $("line").get(0);
var rect = $("rect").get(0);
var bb = line.getBBox();
var strokeWidth = parseFloat(line.getAttribute("stroke-width"));
rect.setAttribute("x", bb.x - strokeWidth / 2);
rect.setAttribute("y", bb.y - strokeWidth / 2);
rect.setAttribute("width", bb.width + strokeWidth);
rect.setAttribute("height", bb.height + strokeWidth);
请注意,这种方法并不完美。扩展后的盒子在某些方面可能太大。
还要注意,这种方法可能很难修改以处理更复杂或更一般的情况。
显然,getBBox在每个浏览器中的工作方式不同。在我看来,你最好的选择是使用Raphaël JShttp://raphaeljs.com/
相关文章:
- 如何使用javascript从主svg对象动态创建svg视图框
- 保存嵌入对象中的svg
- 在SVG中创建带有外来对象的文本区域的Javascript不起作用
- 是否可以在不创建svg对象的情况下创建捕捉元素?[snap.svg]
- 捕捉.svg — 单击其中一个元素时删除对象
- 在 <对象> 标记中加载 SVG 时,将侦听器添加到 SVG 卸载事件
- SVG 对象部分上的 JQuery click() 不一致
- SVG DOM对象间距/重叠
- 在呈现 D3 SVG 对象之前更改引导按钮文本
- 对象中的SVG与JS中的点击事件有关
- 使用<对象>用于SVG和HTML中的内联css以编辑填充
- 改变<svg>对象's路径
- 缩放SVG图像以适应父对象,并在不同的实例中更改仪表颜色
- 编写嵌入为对象的SVG脚本
- Svg与Canvas以及圆形对象的渲染时间
- 以文本形式检索对象元素中的SVG Dom
- 在Internet Explorer中使用JS访问对象内部的SVG
- AngularJS:如何将ng-click绑定到使用嵌入或对象元素插入的SVG图像
- 如何获取上传的SVG文件对象的内容
- 选择选项并更改适当的对象svg