首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用D3更新矢量图形元素Z索引

用D3更新矢量图形元素Z索引
EN

Stack Overflow用户
提问于 2012-11-27 23:34:39
回答 10查看 90.3K关注 0票数 89

使用D3库将SVG元素置于z顺序的顶端的有效方法是什么?

我的特定场景是一个饼图,当鼠标悬停在给定的块上时,它会突出显示(通过向path添加一个stroke )。生成我的图表的代码块如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
svg.selectAll("path")
    .data(d)
  .enter().append("path")
    .attr("d", arc)
    .attr("class", "arc")
    .attr("fill", function(d) { return color(d.name); })
    .attr("stroke", "#fff")
    .attr("stroke-width", 0)
    .on("mouseover", function(d) {
        d3.select(this)
            .attr("stroke-width", 2)
            .classed("top", true);
            //.style("z-index", 1);
    })
    .on("mouseout", function(d) {
        d3.select(this)
            .attr("stroke-width", 0)
            .classed("top", false);
            //.style("z-index", -1);
    });

我试过几种方法,但到目前为止还没有成功。使用style("z-index")和调用classed都不起作用。

在我的CSS中,"top“类的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.top {
    fill: red;
    z-index: 100;
}

fill语句在那里是为了确保我知道它是正确打开/关闭的。它是。

我听说使用sort是一种选择,但我不清楚如何实现它才能将“选定”元素置于首位。

更新:

我用下面的代码修复了我的特殊情况,它在mouseover事件上向SVG添加了一个新的弧线,以显示高亮显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
svg.selectAll("path")
    .data(d)
  .enter().append("path")
    .attr("d", arc)
    .attr("class", "arc")
    .style("fill", function(d) { return color(d.name); })
    .style("stroke", "#fff")
    .style("stroke-width", 0)
    .on("mouseover", function(d) {
        svg.append("path")
          .attr("d", d3.select(this).attr("d"))
          .attr("id", "arcSelection")
          .style("fill", "none")
          .style("stroke", "#fff")
          .style("stroke-width", 2);
    })
    .on("mouseout", function(d) {
        d3.select("#arcSelection").remove();
    });
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-12-10 02:02:14

开发人员提出的解决方案之一是:“使用D3的排序操作符对元素进行重新排序。”(参见https://github.com/mbostock/d3/issues/252)

在这种情况下,可以通过比较元素的数据来对元素进行排序,如果元素是无数据元素,则可以比较位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.on("mouseover", function(d) {
    svg.selectAll("path").sort(function (a, b) { // select the parent and sort the path's
      if (a.id != d.id) return -1;               // a is not the hovered element, send "a" to the back
      else return 1;                             // a is the hovered element, bring "a" to the front
  });
})
票数 56
EN

Stack Overflow用户

发布于 2013-06-16 12:14:49

正如在其他答案中所解释的,SVG没有z索引的概念。相反,文档中元素的顺序决定了绘图中的顺序。

除了手动重新排序元素之外,对于某些情况,还有另一种方法:

在使用D3时,您通常有某些类型的元素,这些元素应该始终绘制在其他类型的元素之上。

例如,在布局图形时,链接应始终放置在节点下方。更普遍的是,一些背景元素通常需要放在所有其他元素的下方,而一些高亮和叠加元素则应该放在上面。

如果您遇到这种情况,我发现为这些元素组创建父组元素是最好的方法。在SVG中,可以使用g元素来实现这一点。例如,如果您具有应始终放置在节点下方的链接,请执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
svg.append("g").attr("id", "links")
svg.append("g").attr("id", "nodes")

现在,当您绘制链接和节点时,选择如下所示(以#开头的选择器引用元素id):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
svg.select("#links").selectAll(".link")
// add data, attach elements and so on

svg.select("#nodes").selectAll(".node")
// add data, attach elements and so on

现在,所有链接在结构上总是附加在所有节点元素之前。因此,SVG将在所有节点下显示所有链接,无论您添加或删除元素的频率和顺序如何。当然,相同类型的所有元素(即在相同的容器中)仍将遵循添加它们的顺序。

票数 93
EN

Stack Overflow用户

发布于 2013-06-29 23:22:12

由于SVG没有Z-index,但使用了DOM元素的顺序,您可以通过以下方式将其放在前面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.parentNode.appendChild(this);

然后你可以利用insertBefore把它放回mouseout上。然而,这要求您能够将您的元素插入之前的同级节点作为目标。

演示:查看此JSFiddle

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13595175

复制
相关文章
删除或关闭Word中的超链接
最近使用的word老是会把一些文字内容或者标题转换成乱七八糟的格式,看的莫名其妙的,找了好久也不知道什么问题,后来一查才知道是因为这些文字包含超链接,word自动转换了。。。你说是不是莫名其妙。
marsggbo
2019/05/26
2.6K0
Android开发,在Fragment中,隐藏或关闭软键盘(虚拟键盘)的方法
网上可以搜到各种方法,实际测试中,我的开发用机中,仅仅下面这个方法有效,记录一下。
张云飞Vir
2020/03/16
4.3K0
Linux 开启或关闭 SELinux
安全增强型Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。本文介绍如何开启或关闭SELinux,并且避免系统无法启动的问题。
HoneyMoose
2023/03/31
9.2K0
Linux 开启或关闭 SELinux
JavaScript页面后退或关闭
后退方法history.go(-1)如果无法后退时,会返回一个undefined,利用这一点来判断是否可以后退,不能后退时执行window.close();
全栈程序员站长
2022/09/15
2.3K0
在matplotlib中关闭绘图轴的方法
# Keep making random walks, as long as the program is active
用户7718188
2021/10/08
2.2K0
在bios设置中关闭软驱的方法
bios设置是电脑最基本的设置之一,它是计算机内主板上的一个ROM芯片上的程序,主要功能是为计算机提供最直接的硬件设置和控制。很多人对于BIOS设置并不是很了解,更不要说去怎么设置了,接下来想要介绍的就是关于在bios设置中如何关闭软驱,下面就来看看操作方法吧!
用户8002245
2020/12/25
4.5K0
Kibana关闭停止失败解决办法
ElasticSearch服务异常停止了,这时Kibana提示无法连接到ElasticSearch
程裕强
2022/05/06
8170
怎么在java中关闭一个thread
我们经常需要在java中用到thread,我们知道thread有一个start()方法可以开启一个线程。那么怎么关闭这个线程呢?
程序那些事
2020/07/08
7970
springboot项目在docker容器中如何优雅关闭
是否所有项目都需要优雅关闭?那也不一定,毕竟所谓的优雅关闭,另一面就意味这关闭得慢,因此项目的优雅关闭得看项目的核心程度,换言之就是看该项目处理的数据是不是核心数据,其实项目的最终本质,是对数据的处理。
lyb-geek
2021/01/15
3K0
springboot项目在docker容器中如何优雅关闭
不想装系统,有没有办法在线体验 Linux?
另外,这次分享还有承上启下的作用。承上是前几天挺受大家欢迎的《Android 手机如何改造成 Linux 服务器?》,启下是想预告:从明天开始,我会在每次发文的次条加入“轻松掌握Linux命令”系列,希望从基础的命令开始,提升 Linux 技术水平,敬请期待!
Python猫
2019/11/12
4.8K0
springboot项目在docker容器中如何优雅关闭
是否所有项目都需要优雅关闭?那也不一定,毕竟所谓的优雅关闭,另一面就意味这关闭得慢,因此项目的优雅关闭得看项目的核心程度,换言之就是看该项目处理的数据是不是核心数据,其实项目的最终本质,是对数据的处理。
lyb-geek
2022/01/06
3K1
springboot项目在docker容器中如何优雅关闭
怎么在windows10中关闭Windows Defender?
1 通过修改注册表,永久禁用Windows Defender1,打开注册表编辑器。#f#
用户3519280
2023/07/06
3130
Selenium Python使用技巧(二)
您可能需要在多种情况下针对不同的浏览器(例如Firefox,Chrome,Internet Explorer,Edge)测试代码。跨不同浏览器测试网站的做法称为自动浏览器测试。要使用Selenium自动化测试执行自动浏览器测试,您应该在单元测试代码或pytest代码中合并对这些浏览器的选择性处理。下面显示了一个代码片段(利用pytest)来处理多个浏览器:
FunTester
2020/02/17
6.4K0
问答 | 有没有什么办法让GPU显存不会溢出?
社长为你推荐来自 AI 研习社问答社区的精华问答。如有你也有问题,欢迎进社区提问。 话不多说,直接上题 问:有没有什么办法让GPU显存不会溢出? 来自社友的回答 ▼▼▼ @巴特莱•芬克: 通过谷歌大部分找到的就是 GPU 显存溢出。然后 加上 CUDA_VISIBLE_DEVICES=1 Environment Variable Syntax Results CUDA_VISIBLE_DEVICES=1 Onl
AI研习社
2018/09/25
1.2K0
在Pyppeteer中正确隐藏window.navigator.webdriver
(文末福利)在我以前的一篇文章:一日一技:如何正确移除Selenium中window.navigator.webdriver的值,我讲到了如何在Selenium启动的Chrome中,通过设置启动参数隐藏 window.navigator.webdriver,驳斥了网上垃圾文章中流传的使用JavaScript注入的弊端。
青南
2019/08/20
3.9K0
在Pyppeteer中正确隐藏window.navigator.webdriver
ubuntu在双系统下开机卡死或关机卡死的解决办法
很多双显卡的笔记本在安装linux发行版的时候可能会出现问题, 笔者的电脑如果不在bios设置中设置屏蔽核显就会开机卡主,所以装系统时必须得屏蔽核显,全局独显,不然进系统就卡死,关机也关不掉, 刚开始也就这么用着,但是慢慢发现一点问题,,就是耗电特别快,
earthchen
2020/09/24
5.8K0
在SAP系统中,如何设置生产订单自动关闭
SAP系统中,若生产订单已经完成,那么是用技术性完成(Technical complete)的方式对订单进行操作,目的是让生产订单对组件的预留进行清除。一般来说,大家普遍采用的是人工去进行生产订单技术关闭的方式,且一般由一个企业的订单计划员负责。
matinal
2020/10/30
2.1K0
在SAP系统中,如何设置生产订单自动关闭
enable命令启动或关闭 shell 内建指令
enable命令可以用于启动或关闭 shell 的内建指令。 如要执行的文件名称与shell内建指令相同,可用enable -n来关闭shell内建指令。若不加-n参数,enable可重新启动关闭的指令。
用户1685462
2021/09/08
4050
chrome webdriver下载_webdriver.chrome()
1、 webdriver文件位置 可以自定义位置,如:d:\selenium环境变量,的文件夹下 也可以放在C:\Program Files (x86)\Google\Chrome\Application的文件夹下 2、系统环境变量PATH 按照图的指示,1->2->3->4->5->6,最后一步直接粘贴你的文件存放路径
全栈程序员站长
2022/11/04
2.3K0
chrome webdriver下载_webdriver.chrome()
点击加载更多

相似问题

有没有办法在量角器中更新范围变量?

10

有没有办法在Silverlight中关闭PopUpWindow?

10

有没有办法在kubelet中关闭逐出?

12

在Internet上通过在webdriver/量角器中传递参数来关闭自动更正?

10

有没有办法使用Selenium WebDriver获取选项卡条中所有选项卡的名称?

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文