最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • SVG图打点

    正文概述 掘金(yangxy)   2021-06-15   528

    这是我参与更文挑战的第4天,活动详情查看: 更文挑战

    在平时的工作中 ,我们可能会遇到需要在SVG图上或是某个DOM上打点的需求,下面实现了在SVG图上打点的功能,如果需要在其他DOM上打点也可以参照此方法。

    说一下思路:
    一、如何在SVG图片里再插入图片

    1. 要想在SVG图上打点,首先想着怎么在SVG图片里插入图片,创建一个SVG的image标签
    const svgImgDom = document.createElementNS(
        'http://www.w3.org/2000/svg',
        'image',
      );
    
    1. 然后引入图片,设置图片的宽高,并添加class,这都可以用setAttributeNS() 来实现
    2. 之后可以通过appendChild()将带有图片信息的svgImgDom插入到SVG图片中

    二、插入图片的位置

    1. 获取svg图片针对整个窗口的页面偏移量
     const svgDom = this.$refs.svgBox;
      const svgOffset = {
        x: svgDom.getBoundingClientRect().left,
        y: svgDom.getBoundingClientRect().top,
      };
    
    1. svg页面缩放系数
     const pageScale = {
        x: 752.333 / svgDom.offsetWidth, // svg标签内viewBox的值
        y: 430 / svgDom.offsetHeight,
      };
    

    3.鼠标偏移量 (缩放页面后正确的鼠标位置)

    // 这里 svgDom.offsetWidth/21 和 svgDom.offsetHeight/2.77  宽高相除的比例可以根据实际点位灵调整,
    // 有了整个缩放比例,当窗口size更改时也可以自动适用点位的偏移
    const mouseOffset = {
        x: ((e.pageX + svgDom.offsetWidth/21) - svgOffset.x) * pageScale.x, 
        y: ((e.pageY + svgDom.offsetHeight/2.77) -  svgOffset.y) * pageScale.y,
      };
    

    下面是完整的代码
    HTML

    <div @click="clickPoint" class="svgBox" id="svgBox" ref="svgBox">
      <svg id='SVGDom' class='SVGDom' version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
       y="0px" viewBox="78 205.89 752.333 430" style="enable-background:new 78 205.89 752.333 430;" xml:space="preserve">
      </svg>
    </div>
    

    JS部分

    clickPoint(e) {
      const svgDom = this.$refs.svgBox;
      const svgOffset = {
        x: svgDom.getBoundingClientRect().left,
        y: svgDom.getBoundingClientRect().top,
      };
      const pageScale = {
        x: 752.333 / svgDom.offsetWidth, // svg标签内viewBox的值
        y: 430 / svgDom.offsetHeight,
      };
      const mouseOffset = {
        x: ((e.pageX + svgDom.offsetWidth/21) - svgOffset.x) * pageScale.x, 
        y: ((e.pageY + svgDom.offsetHeight/2.77) -  svgOffset.y) * pageScale.y,
      };
      const svgImgDom = document.createElementNS(
        'http://www.w3.org/2000/svg',
        'image',
      );
      svgImgDom.setAttributeNS(null, 'height', '50');
      svgImgDom.setAttributeNS(null, 'width', '50');
      svgImgDom.setAttributeNS(
        'http://www.w3.org/1999/xlink',
        'href',
        require('../../assets/greenPoint.jpeg'),
      );
      svgImgDom.setAttributeNS(null, 'x', mouseOffset.x);
      svgImgDom.setAttributeNS(null, 'y', mouseOffset.y);
      svgImgDom.setAttributeNS(null, 'class', 'addPointImgs');
      document.getElementById('SVGDom').appendChild(svgImgDom);
    
    // 删除图标
      const className = e.target.classList[0];
      if (className === 'addPointImgs') {
        this.deletePointFun(e);
      }
    },
    // 删除点位
    deletePointFun(e) {
      const el = e.target;
      this.$confirm('确定删除该点位信息吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      }).then(() => {
        this.$message({
          type: 'success',
          message: '删除成功!',
        });
        el.remove();
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除',
        });
      });
    },
    

    起源地下载网 » SVG图打点

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元