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

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

于是让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. CSS——阴影

    <!DOCTYPE html> <html> <head> <style> p.one { text-shadow: 3px 5px 5px #FF00 ...

  2. Flutter(八):Flutter路由管理(Router)

    目录 一.术语 路由(route): 导航(Navigator): 二.路由管理 1.Navigator示例代码 2.路由定义(命名路由) 在App中定义router: 3.Navigator方法介绍 ...

  3. ReplayKit2 采集音视频回调格式

    一.音频 ReplayKit2 RPSampleBufferTypeAudioApp sampleBuffer = CMSampleBuffer 0x100500c50 retainCount: 1 ...

  4. gin 使用 jwt

    作用 JWT 的主要作用是方便客戶端與伺服器之間的身份驗證. 使用JWT 可以在不需要每次登入的情況下,在客戶端與伺服器之間安全地傳遞封裝身份信息. 它還可以用於許多其他用途,例如串接多個服務,並將數 ...

  5. The remote name could not be resolved

    HTTP The remote name could not be resolved HTTP Status:NameResolutionFailure

  6. C# yyyyMMddHHmmss 格式的日期转换

    C# yyyyMMddHHmmss 格式的日期转换 DateTime dtTimeEnd = DateTime.Now; if (!string.IsNullOrWhiteSpace(rspA.fin ...

  7. Java中的Collection集合(单列集合)

    1.集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合与数组的区别: (1)数组的长度是固定的,集合的长度是可变的. (2)数组中存储的是同一类型的元素,可以存储基本数据类型 ...

  8. #Powerbi 1分钟学会,SUMMARIZE函数,分组汇总并新建表

    今天我们来学习一个新的表函数,SUMMARIZE函数是DAX中的一个函数,它可以根据一列或多列对数据进行分组,并且可以使用指定的表达式为汇总后的表添加新列,形成一张新表. 一:基础语法 SUMMARI ...

  9. 开发工具-eclipse/idea 在运行前执行一些动作

    毫无疑问,我们有的时候想在运行/编译程序前后执行一些动作.eclipse和idea都能支持. 日前正好遇到一个问题:有个依赖于pom的某个jar,内容虽然变了,但是版本不变,所以希望每次执行前先清除特 ...

  10. Java实现管线拓扑关系连通性分析

    管线拓扑关系的连通性分析通常涉及图论(Graph Theory)中的概念,特别是无向图(Undirected Graph)的遍历算法,如深度优先搜索(DFS, Depth-First Search)或 ...