.svg图片转<svg>标签

前言:

项目需求是这样的:将网页上面的外联的svg图像,变成内嵌的svg图像。从而我们可以写一些css样式控制这个svg图像。

在网上经过一翻的搜索,答案差不多就是使用object、embed、iframe等,但是并不能实现我的需求。

经过不懈努力,找到一个插件svg-injector

QQ图片20190303161058.jpg

这个插件就是我们想要达到的效果。看了哈文档和源码,是通过发起一个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)
}

本文完~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层、表示层、行为层分别是:HTML、CSS、Ja...
    程序猿人王小贱阅读 5,857评论 1 11
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 9,652评论 0 0
  • 彩铅集合贴 戳 简书首发 这张效率颇高,差不多算下来耗时一天,感觉到了就会完成的很顺畅。原型是同学的女儿,很有绘画...
    ipromiseido阅读 5,739评论 33 57
  • 真正的想法总是被掩盖的很深。 把向外的眼光收回来,转而向内。 你可以足够勇敢地剥离掉那些伪装,走进自己的心吗?今天...
    PersonalityAnne阅读 4,699评论 0 0
  • 今天,我在朋友圈晒我自己动手升级笔记本的照片,有许多人点赞,也有好多人留言夸我厉害。对此,我想说:“你们真棒!” ...
    乔克儿阅读 3,523评论 10 11