# svg图片转svg标签
项目需求是这样的:将网页上面的外联的svg图像,变成内嵌的svg图像。从而我们可以写一些css样式控制这个svg图像。
在网上经过一翻的搜索,答案差不多就是使用object、embed、iframe等,但是并不能实现我的需求。
经过不懈努力,找到一个插件svg-injector (opens new window)。 这个插件就是我们想要达到的效果。看了哈文档和源码,是通过发起一个AJAX,来载入SVG。
由于项目是一个可视化的项目:用户在更改svg 地址后,需要在对该外链的svg的图片颜色、大小等进行配置。于是:封装如下的一段代码,监听svg的url发生改变,则重新调用封装好的方法,实现外联的svg图片转成svg标签。
/**
* 将svg的img图片转成svg标签
* @param element
*/
function toInlineSvg(element) {
let imgID = element.getAttribute('id')
let imgClass = element.getAttribute('class')
let imgURL = element.getAttribute('src')
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var svg = xhr.responseXML.getElementsByTagName('svg')[0]
if (imgID != null) {
svg.setAttribute('id', imgID)
}
if (imgClass != null) {
svg.setAttribute('class', imgClass + ' replaced-svg')
}
svg.removeAttribute('xmlns:a')
if (!svg.hasAttribute('viewBox') && svg.hasAttribute('height') && svg.hasAttribute('width')) {
svg.setAttribute('viewBox', '0 0 ' + svg.getAttribute('height') + ' ' + svg.getAttribute('width'))
}
if (element.parentElement) {
element.parentElement.replaceChild(svg, element)
}
}
}
xhr.open('GET', imgURL, true)
xhr.send(null)
}
本文完~
← scroll-anchor 图片裁剪组件 →