在公司中有用SVG技术编写一个绘制多环+多标题的小插件,本来使用一直正常,最近出现标题错乱的问题,查找 BUG的过程中,学习到两个新API,在这里总结一下。
BUG查找
发现绘制标题API返回的SVG对象的节点对象的clientHeight
属性竟然返回0,导致标题全部绘制在一处地方。具体如下:
svgObj[0].clientHeight;// always 0
解决办法
普通的DOMElenment中的方法不适用与SVG。下面介绍两个API。
getBBox()
这个方法不仅SVGElement对象有,对于普通 DOMElenment对象同样适用。
返回一个 包含 x、y、 width、 height 的 SVGRect 对象,表明 SVG 元素在 viewport 内部的宽高和左上角坐标,不受到 SVG Transform 和 SMIL 动画影响。
getBoundingClientRect()
返回一个包含 left、 top、 right、 bottom、 width、 height 的ClientRect 对象,,表明元素在浏览器的可见窗口区的尺寸和坐标, 注意该方法定义于 Element 类之上, HTML 元素也有该方法, 另外它获得的坐标和尺寸为最终计算值, 受到 transform, transition, animation 影响。
getBBox() 获得的为元素在当前SVG坐标中的数据,而 getBoundingClientRect 则是获取了了浏览器坐标中的数据(因为SVG标签中的ViewBox属性影响,实际渲染在浏览器中的大小及位置是经过偏移和缩放的)。