好久没更了,近期开发遇到的需求,抽空梳理一下~

需求:实现一个复杂的拓扑图,图中元素的个数,以及各个参数内容是动态展示的。

于是让ui提供了对应的svg图片。

解决思路:使用iframe嵌入svg图片,运用D3.js修改其文本及样式。

html:

<iframe class="systemFrame" ref="systemFrame" :src="exportImg(topoSrc)" width="100%" height="100%" frameborder="0" ></iframe>

js:要从svg图里找到对应的元素id

onMounted(() => {
let frameObj = systemFrame.value;
if (frameObj.attachEvent) {
frameObj.attachEvent("onload", function () {});
} else {
frameObj.onload = function () {
onIframeLoaded()
loading.value = false
};
}
getTopo()
})
const onIframeLoaded = () => {
  const iframeWindow = systemFrame.value.contentWindow.document;
  const svg = iframeWindow.getElementsByTagName('svg')
  if(!svg.length) return
  svg[0].style.background = '#242424'
  // iframe加载完成后要进行的操作
  var iframeSvg = systemFrame.value.contentDocument; //!!!!这里获取svgDom,一定要先获取父元素,才会展示子元素!!否则找不到
  var svgObj = iframeSvg.getElementById("drawing"); //获取父元素下面id是drawing的子元素,接下来就可以对svgDom进行操作,绑定元素点击事件,改变元素的属性等等
 
  let d3svg = d3.select(svgObj);
 // 实现拓扑图缩放功能
  svgPanZoom(svgObj, {
    zoomEnabled: true,
    panEnabled: false,
    maxZoom: 2,
    minZoom: 0.5,
    preventMouseEventsDefault: false,
  })
   
  svgEdit(d3svg)
};

const svgEdit = (d3svg) => {
 // 改变样式 流动的虚线
 d3svg.select("#Right")
    .style("animation", "path-animation " + 18 + "s")
    .style("animation-timing-function", "linear")
    .style("animation-iteration-count", "infinite");
  // 循环各个元素  topoSrc是需要展示的元素个数
  for(let i=1; i<topoSrc.value*1 + 1; i++) {
    // 找到元素并移动位置
    d3svg.selectAll('#power-'+ i).attr('transform', 'translate(-15)')
    // 找到元素替换文本
    d3svg.selectAll('#power-'+ i + ' .cls-20:nth-child(1)').text(topoData.value.packs[i-1].power + 'kW')    
    // 找到元素替换颜色
    d3svg.select('#sys'+ i + ' .cls-24').style("fill", '#fff')
    d3svg.select('#cu'+ i).style("fill", '#fff')
    }
  }
 

iframe嵌入svg图片动态更改文本样式并进行缩放等功能实现拓扑图的更多相关文章

  1. 使用JavaScript动态更改CSS样式

    在很多情况下,都需要对网页上元素的样式进行动态的修改.在JavaScript中提供几种方式动态的修改样式,下面将介绍方法的使用.效果.以及缺陷. 1.使用obj.className来修改样式表的类名. ...

  2. JavaScript--动态更改CSS样式

    JavaScript太强大了,虽然是弱语言,不过一点都不输于Java 可以自行设置随机数,来动态更改CSS样式,每一次都是不一样的感觉,这个小功能挺实用的 <!DOCTYPE html> ...

  3. 动态svg图片简单制作

    一.简介 #topics #no-box-shadow-img { box-shadow: none } 博主头像 svg图片格式不同于其它图片格式,svg图片本质上是一个xml文件,它内部是标记语言 ...

  4. 前端 引用svg图片,支持动态切换颜色

    当我们添加一张svg图片显示时,react提示找不到文件. 我们可以在全局文件global.d.ts内,添加图片类型的声明: 详见<TypeScript 引用资源文件后提示找不到的错误处理方案& ...

  5. 清除系统默认样式,文本样式,高级选择器(权重),边界圆角,a标签的四大伪类,背景图片

    清除系统默认样式 大多系统预定义标签,有默认样式,不满足实际开发需求,反倒影响布局通常清除系统样式,利于开发 body,h1-h6,p,table { margin:; } ul { margin:; ...

  6. 微信小程序动态更改样式

    获取列表长度(动态渲染),当长度>x时添加内联样式并绑定数据{{}},通过js动态更改{{}}

  7. 【Winform-自定义控件】ImageButton 支持鼠标正常、悬停、按下更改图片,支持文本

    原文地址:https://www.codeproject.com/Articles/29010/WinForm-ImageButton 自定义winfrom图片按钮:支持鼠标正常.悬停.按下更改图片, ...

  8. 使用icomoon把svg图片生成字体图标

    今天看了使用icomoon来将svg转换成图标字体,本来是不会使用别人给的svg,也不清楚具体的好处是什么,查了svg以后,越来越懵,svg挺好的为什么要转成图标字体呢. 一.SVG介绍 SVG 是一 ...

  9. HTML页面中嵌入SVG

    HTML页面中嵌入SVG的几种方式 你有N种理由使用SVG在页面中展示图像,如它的矢量特性.广泛的浏览器支持.比JPEG和PNG更小的体积.可用CSS设置外观.使用DOM API操作以及各种可用的SV ...

  10. 关于devexpress报表XtraReport,动态修改报表样式(.repx格式),动态添加数据并使用的理解

    一.基本概念: XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示(这种情况更常见). 因此,每个报表都作为带区的容器使用,而每个带区中都包含报表控 ...

随机推荐

  1. iOS 如何保持线程一直在运转

    1.简单的可以想到,写一个while循环 while (TRUE) { } 但是这种方式存在缺陷,将导致CPU占用100%,两个核. p.p1 { margin: 0; font: 12px &quo ...

  2. INFINI Labs 产品更新 | Easysearch 新增分词插件、Gateway 支持邮件发送等功能

    INFINI Labs 产品又更新啦~,本次更新概要如下:Easysearch 新增了分词插件.优化了生命周期管理功能等:Gateway 新增 smtp 过滤器来支持邮件的发送,支持自动跳过因为异常关 ...

  3. 『手写Mybatis』实现映射器的注册和使用

    前言 如何面对复杂系统的设计? 我们可以把 Spring.MyBatis.Dubbo 这样的大型框架或者一些公司内部的较核心的项目,都可以称为复杂的系统. 这样的工程也不在是初学编程手里的玩具项目,没 ...

  4. 《Node.js+Vue.js+MangoDB全栈开发实战》已出版

    <Node.js+Vue.js+MangoDB全栈开发实战> 图书购买地址: 京东:<Node.js+Vue.js+MangoDB全栈开发实战> 当当:<Node.js+ ...

  5. tampermonkey脚本 百度搜索屏蔽CSDN

    // ==UserScript==// @name         屏蔽CSDN// @namespace    http://tampermonkey.net/// @version      20 ...

  6. python logging日志没有写入到指定文件,写到其他项目的日志文件

    背景: 项目A为主框架项目,使用到了项目B的方法 项目A.B均有封装好的日志方法,且均在封装好的日志文件里面,增加了logger = MyLogger().info,其他文件要使用日志时,引入logg ...

  7. Abp vNext 模块化系统简单介绍

    怎么使用模块1. 建立模块直接的依赖关系,可以通过DependsOnAttribute特性来确定依赖关系2. 先配置模块,实现为模块填充数据和功能设置.3. 使用模块提供的功能接口 怎么定义模块1. ...

  8. Freertos学习:在Posix环境仿真FreeRTOS

    --- title: rtos-freertos-在Posix环境仿真FreeRTOS date: 2020-06-11 16:22:34 categories: tags: - freertos - ...

  9. 一文搞懂到底什么是 AQS

    前言 日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么呢?如何实现的同步功能呢?本文将详细讲解构建锁和同步器的基础框架--AQS,并根据源码分析其原理. 一.什么是 AQS ...

  10. python subprocess读取终端输出内容

    参考链接:https://www.cnblogs.com/songzhenhua/p/9312718.html https://www.cnblogs.com/darkchii/p/9013673.h ...