vue使用svg文件补充-svg放大缩小操作(使用d3.js)


Posted in Javascript onSeptember 22, 2020

前言

项目需求是要引入svg文件,然后对里面的元素进行赋值,完了之后还要能够让svg放大缩小,点击查看全屏。针对上一篇文章,进行对svg文件里面的元素进行赋值和放大缩小的补充笔记

svg元素赋值

1. 先看看svg文件的代码

vue使用svg文件补充-svg放大缩小操作(使用d3.js)

思路:我的想法就是循环拿到里面的id,然后跟后台的数据匹配,然后赋值。因为后台返回的数据id是没有后面的_C和_V 的。所以需要我前端的处理。

2. 前端js代码:

onWinResize(item) { // item是后台返回的数据,我数据处理函数是单独写的,没有放在接口请求后面
      var svg = document.getElementById('svgcanvas'); // svg 的id
      var arrText = []; 
      var arrRect = []; //这两个是我们要赋值和要改变颜色的数组
      for (var i = 0; i < svg.childNodes.length; i++) {
        var child = svg.childNodes[i]; // 循环svg里面的元素
        if (child.tagName == 'g' && child.id != null && child.id.length > 0) { // 找到g元素,然后循环g里面的元素。(如果你的svg里面没有用g元素包裹你的text、line、rect等元素的话,那你直接跳过这一步,走下一步就好了)
          var childG = child.childNodes; 
          for (var k = 0; k < childG.length; k++) { // 循环g里面的元素
            if (childG[k].tagName == 'text' && childG[k].id != null && childG[k].id.length > 0) {
              arrText.push(childG[k].id); //拿到后台返回的text的id
            } else if (childG[k].tagName == 'rect' && childG[k].id != null && childG[k].id.length > 0) {
              arrRect.push(childG[k].id); //拿到后台返回的rect的id
            }
          }
        }
      }
      //循环后台返回的数据,与拿到的svg里面的元素id进行匹配
      for (let j = 0; j < item.length; j++) {
        var eltext = item[j].SvgPtID + '_V';
        var elrect = item[j].SvgPtID + '_C';
        arrText.forEach(i => {
          if (eltext == i) {
            var el = document.getElementById(eltext);
            el.innerHTML = item[j].YCValue; //赋值
            el.attributes.fill.value = '#000';
          }
        })
        arrRect.forEach(v => {
          if (elrect == v) {
            $('#' + elrect).css('fill', '#7ab900') // 改变颜色(记得要安装jQuery插件,引入jQuery)
          }
        })
      }
    },

3.附上效果图

vue使用svg文件补充-svg放大缩小操作(使用d3.js)

放大缩小

这个也是折腾了一波,才做出来的。主要svg文件的操作,貌似做的不多,基本都是svg简单的icon或者img的使用。也是百度看了好多才找到d3这个插件的。

D3.js堪称SVG中的jQuery,让SVG图操作起来更加灵活,更加方便调试。反正就是爱了,爱了。

简单的介绍一下d3.js

D3js 是一个可以基于数据来操作文档的 JavaScript 库。可以帮助你使用 HTML, CSS, SVG 以及 Canvas 来展示数据。D3 遵循现有的 Web 标准,可以不需要其他任何框架独立运行在现代浏览器中,它结合强大的可视化组件来驱动 DOM 操作。

D3 可以将数据绑定到 DOM 上,然后根据数据来计算对应 DOM 的属性值。例如你可以根据一组数据生成一个表格。或者也可以生成一个可以过渡和交互的 SVG 图形。

D3 不是一个框架,因此也没有操作上的限制。没有框架的限制带来的好处就是你可以完全按照自己的意愿来表达数据,而不是受限于条条框框,非常灵活。D3 的运行速度很快,支持大数据集和动态交互以及动画。

此处应附上官网地址:https://www.d3js.org.cn/

想要多了解和学习的可以去看看,很容易理解。

好了,回归正题。vue里面首先要安装d3这个插件

1. npm i d3 --save

2. import * as d3 from "d3"; //在vue文件里面引入d3

1、npm i d3 --save

2、import * as d3 from "d3"; //

3、然后就是界面上的使用了 我们项目的需求是鼠标滚动控制放大缩小,so: html:

vue使用svg文件补充-svg放大缩小操作(使用d3.js)

js:

zoomimg() {
      // 放大缩小
      var svg = d3.select("#svgcanvas");
      svg.call(
        d3.zoom().scaleExtent([0.5, 2]).on("zoom", zoom)
      );
 
      function zoom() {
        d3.select(this).selectAll("g").attr("transform", d3.event.transform);
      }
    }

就这么简单,解决了...

svg全屏

这个就相对简单一点,废话不说多,上代码

html:

<div class="full-screen">
 <!-- <el-tooltip effect="dark" :content="fullscreen ? ``:`全屏`" placement="bottom"></el-tooltip> -->
 <i class="iconfont iconFullScreen" style="font-size: 24px;" @click="handleFullScreen"></i>
 <span v-if="fullscreen">取消全屏</span>
 <span v-else>全屏</span>
</div>
// data里面fullscreen:false
 handleFullScreen() {
  let element = document.documentElement;
    if (this.fullscreen) {
      if (document.exitFullscreen) {
        document.exitFullscreen();
      } else if (document.webkitCancelFullScreen) {
        document.webkitCancelFullScreen();
      } else if (document.mozCancelFullScreen) {
        document.mozCancelFullScreen();
      } else if (document.msExitFullscreen) {
        document.msExitFullscreen();
      }
    } else {
      if (element.requestFullscreen) {
        element.requestFullscreen();
      } else if (element.webkitRequestFullScreen) {
        element.webkitRequestFullScreen();
      } else if (element.mozRequestFullScreen) {
        element.mozRequestFullScreen();
      } else if (element.msRequestFullscreen) {
        // IE11
        element.msRequestFullscreen();
      }
    }
    this.fullscreen = !this.fullscreen;
  }

这个只是F11全屏的效果,要是直接是单独整一个界面的话,建议还是用路由跳转吧!

以上这篇vue使用svg文件补充-svg放大缩小操作(使用d3.js)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript实现给出的盒子的序列是否可连为一矩型
Aug 30 Javascript
jQuery对象和DOM对象相互转化
Apr 24 Javascript
jQuery 对Select的操作备忘记录
Jul 04 Javascript
javascript中parentNode,childNodes,children的应用详解
Dec 17 Javascript
推荐6款基于jQuery实现图片效果插件
Dec 07 Javascript
JS简单去除数组中重复项的方法
Sep 13 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
Mar 23 Javascript
js表单序列化判断空值的实例
Sep 22 Javascript
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
浅谈Vue SSR中的Bundle的具有使用
Nov 21 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
Sep 21 Javascript
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
解决Can't find variable: SockJS vue项目的问题
Sep 22 #Javascript
解决vue-router 嵌套路由没反应的问题
Sep 22 #Javascript
Js跳出两级循环方法代码实例
Sep 22 #Javascript
vue 二维码长按保存和复制内容操作
Sep 22 #Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
Sep 22 #Javascript
解决vue2中使用elementUi打包报错的问题
Sep 22 #Javascript
element-ui中dialog弹窗关闭按钮失效的解决
Sep 22 #Javascript
You might like
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
Python中的yield浅析
2014/06/16 Python
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
公司股东出资证明书
2014/11/01 职场文书
给朋友的道歉短信
2015/05/12 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python