假设我有一个绘制一些路径的SVG,那么我应该使用哪些工具来找到一个视口(viewbox),以完美地适配这些路径,使得所有多余的空间都被裁剪掉?
您可以简单地将svg的viewBox设置为其边界框。
function setViewbox(svg) {
var bB = svg.getBBox();
svg.setAttribute('viewBox', bB.x + ',' + bB.y + ',' + bB.width + ',' + bB.height);
}
document.querySelector('button').addEventListener('click', function() {
setViewbox(document.querySelector('svg'));
});
svg { border: 1px solid }
<svg version="1.1" id="svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 500 300" enable-background="new 0 0 500 300" xml:space="preserve" width="250" height="150">
<path fill="none" stroke="#B2E230" d="M413.7,276.5c0,0,67-37,116,0c-24.1-33,16.4-53,0-34s-100-2-75-38" transform="translate(-75,-75)" />
</svg>
<button>setViewbox</button>
x
位置是负数。因此,一个快速的解决方法是在从 vB.w 中减去 vB.x(我的代码片段的第24行)时添加一些检查if(vB.x>0)vB.w-=vB.x if(vB.y>0)vB.h-=vB.y
http://jsfiddle.net/vbrnuoj2/ 但我会重新编写整个代码,因为我现在觉得它相当丑陋... - Kaiido.ready
触发时,似乎字体尚未加载。然后 BBox 为0 0 0 0
。但是在重新加载后,字体被缓存并且一切都在 ready 函数中加载。请改用load()
事件处理程序。 - Kaiido