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

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

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

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

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

代码语言:javascript
运行
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
运行
AI代码解释
复制
.top {
    fill: red;
    z-index: 100;
}

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

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

更新:

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

代码语言:javascript
运行
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
运行
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
运行
AI代码解释
复制
svg.append("g").attr("id", "links")
svg.append("g").attr("id", "nodes")

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

代码语言:javascript
运行
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
运行
AI代码解释
复制
this.parentNode.appendChild(this);

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

演示:查看此JSFiddle

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

https://stackoverflow.com/questions/13595175

复制
相关文章
由RGB到HSV的转换详解
在图像处理中,最常见的就是RGB色彩模型。在RGB模型中,每种颜色出现在红、绿、蓝的原色光谱分量中。该模型基于笛卡尔坐标系。如图1所示,RGB原色值位于3个角上;二次色青色,深红色和黄色位于另外三个角上,黑色位于原点处,白色位于里原点最远的角上。
FPGA开源工作室
2020/02/25
3.1K0
Unity中的Shader(HSV,RGB转换)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/02
1.9K0
颜色空间RGB与HSV(HSL)的转换
一般的3D编程仅仅须要使用RGB颜色空间就好了,但事实上美术人员很多其它的是使用HSV(HSL),由于能够方便的调整饱和度和亮度。
全栈程序员站长
2021/12/17
3.6K0
颜色空间RGB与HSV(HSL)的转换
由RGB到HSV颜色空间的理解
在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解。
种花家的奋斗兔
2020/11/13
1.5K0
由RGB到HSV颜色空间的理解
使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
最近,有位读者大人在后台反馈:在参加一场面试的时候,面试官要求他用 shader 实现图像格式 RGB 转 YUV ,他听了之后一脸懵,然后悻悻地对面试官说,他只用 shader 做过 YUV 转 RGB,不知道 RGB 转 YUV 是个什么思路。
字节流动
2021/05/27
7.7K0
使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
RGB转换HSV色彩空间(Python+MATLAB实现)
我们正式的来看一下这些代码原理的实现,这么多循迹的运用就是没有人写,真鸡儿过分。
云深无际
2021/06/25
2.4K0
RGB转换HSV色彩空间(Python+MATLAB实现)
从Ndom语浅谈语言中的进制
这题粗看复杂,其实不然。首先不难看出,abo、an并不是数字,所以不是加法就是乘法。因为abo出现的十分多,所以我们可以简单地假设abo是加法。接下来需要确定进制。我们知道1-10的乘方之间,出现了三个单独的词。不难得出,肯定1个是1,一个是基数的平方。除了这两个,只剩一个单独的词,那么这个词只可能是2^2=4。由此我们可以确定,Ndom语言的数字表达的基数肯定大于4且小于9。因为nif为很多长词的开头,所以nif应该是基数的平方。在题2的等式我们发现meregh乘上sas结尾的词,结果竟然还是以meregh尾!所以很明显sas就是1,于是thonith就是4。接着找,就找到了余下几个小于基数的词(于abo、an之后的较小):ithin、meregh、thef(可能是2、3、5)。剩下的mer、nif、tondor估计就是基数的倍数了,通过观察nif abo tondor abo mer abo thonith,发现nif>tondor>mer。按照推论,mer abo ithin应该是第三小的数字——9,那么mer应该就是基数了。ithin肯定不是1、4,所以排除5、8进制可能。那么就只剩下6、7进制两种可能了。分析得mer an thef abo thonith是第4小的,即16。mer*thef+4=16⇒mer*thef=12。所以只有一种可能:Ndom语言的数字是6进制。所以mer为6,thef为2,nif是mer的平方即36,ithin是9-6=3。排除法得,meregh是5。最后还有一个tondor,通过推断tondor abo mer abo sas≥6*2+6+1=19最近的平方数是25,可以判断tondor是18。至此,我们已经推断完成所有的词。剩下就是一些小小的规则,比如表示72,并不是nif an thef,而是直接nif thef。还有就是大的数字一定会在前。所以我们就能写出:58=36+18+4也就是nif abo tondor abo thonith,而87=36*2+6*2+3即nif thef abo mer an thef abo ithin。参考答案:
KAAAsS
2022/01/13
11.3K0
从Ndom语浅谈语言中的进制
基于C/C++的HSV转RGB程序
HSV是根据颜色的直观特性由 A. R. Smith 在 1978 年创建的一种颜色空间, 也称六角锥体模型。其中的H、S、V分别代表色调(H)、饱和度(S)和明度(V)。 H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°; 纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。 V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。 HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1 ,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=210度。要得到淡蓝色,V=1 S=0.4 H=210度。 一般说来,人眼最大能区分128种不同的色彩,130种色饱和度,23种明暗度。如果我们用16Bit表示HSV的话,可以用7位存放H,4位存放S,5位存放V,即745或者655就可以满足我们的需要了。 由于HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,如Photoshop(在Photoshop中叫HSB)等等,但这也决定了它不适合使用在光照模型中,许多光线混合运算、光强运算等都无法直接使用HSV来实现。
跋扈洋
2022/12/03
1.1K0
基于C/C++的HSV转RGB程序
为 CameraX ImageAnalysis 进行 YUV 到 RGB 的转换
CameraX 是一个旨在帮助开发者简化相机应用开发工作的 Jetpack 支持库。它支持多种诸如 ImageCapture、Preview 和 ImageAnalysis 这种可以和 ML Kit 或 TensorFlow Lite 无缝结合的使用场景。这为文本识别、图像标记等应用的开发提供了可能,甚至还可以支持使用开发者自己训练的 TensorFlow Lite 模型进行物体的识别和检测。然而,在 CameraX 和这些库之间进行图像格式转换的工作还是比较费时费力的。本文我们会介绍最近为 CameraX ImageAnalysis 带来的新功能,支持从 YUV 到 RGB 的转换,我们会介绍一些背景知识,为什么会引入该功能,并会以少量的示例代码来介绍如何使用它。
Android 开发者
2022/03/24
1.9K0
为 CameraX ImageAnalysis 进行 YUV 到 RGB 的转换
计算机图形|RGB与HSV模型的转化
RGB模型是目前常用的一种彩色信息表达方式,它使用红、绿、蓝三原色的亮度来定量表示颜色。
算法与编程之美
2020/06/24
1.1K0
从汇率转换通用解决方案到可复用设计思想
日本市场和欧洲市场的总交易是 1.2 亿,什么,单位是什么,如果不对单位做处理,那单位相当于是混合的,也就失去了意义。
BI佐罗
2022/12/18
1.5K0
从汇率转换通用解决方案到可复用设计思想
OpenGL 从入门到成魔-第0章- OpenGL 的介绍
注:参考自bilibili系列视频,OpenGL 从入门到成魔-第0章- OpenGL 的介绍https://www.bilibili.com/video/BV1b5411s7HT?from=sear
瑶瑶
2020/06/03
8730
颜色转换,利用HSV颜色空间检测
绘制出这些通道的灰度版本 以便观察各通道的强度,像素越亮 代表的红色、绿色或蓝色值就越高。我们可以看到 粉色气球的红色值很高 蓝色值也相对比较高,但值大小不一 特别是当气球位于阴影下的时候。
小飞侠xp
2018/08/28
1.3K0
OpenGL 从入门到成魔-第1章- OpenGL 环境的搭建
注:参考自bilibili系列视频,OpenGL 从入门到成魔-第1章- OpenGL 环境的搭建https://www.bilibili.com/video/BV1qa4y1e7zP
瑶瑶
2020/06/03
1.5K0
OpenGL 从入门到成魔-第2章-创建 OpenGL 窗口
注:参考自bilibili系列视频,OpenGL 从入门到成魔-第2章-创建 OpenGL 窗口https://www.bilibili.com/video/BV1Uz411v7mN
瑶瑶
2020/06/03
7570
面试官:请使用 OpenGL ES 将 RGB 图像转换为 YUV 格式。我 ……
最近,有位读者大人在后台反馈:在参加一场面试的时候,面试官要求他用 shader 实现图像格式 RGB 转 YUV ,他听了之后一脸懵,然后悻悻地对面试官说,他只用 shader 做过 YUV 转 RGB,不知道 RGB 转 YUV 是个什么思路。
字节流动
2021/06/09
5.3K1
面试官:请使用 OpenGL ES 将 RGB 图像转换为 YUV 格式。我 ……
IOS – OpenGL ES 调节图像RGB通道 GPUImageRGBFilter
GPUImageRGBFilter 属于 GPUImage 颜色处理相关,用来处理图片 RGB 通道,shader 源码如下:
猿说编程[Python和C]
2023/03/19
4310
OpenGL进行简单的通用计算实例
博主作为OpenGL新手,最近要用OpenGL进行并行的数据计算,突然发现这样的资料还是很少的,大部分资料和参考书都是讲用OpenGL进行渲染的。好不容易找到一本书《GPGPU编程技术,从OpenGL、CUDA到OpenCL》,里面对并行处理的发展进行了系统性的介绍,还是很不错的。小白博主很兴奋,看完书中第三章后恍然大悟了很多,就贴出书中代码3-3的例子,实现一番,并用一副图片数据做了实现。 实现环境:Window7 32bit, VS2013+OpenGL3.3+GLEW+GLFW。 OpenGL用来进行
一棹烟波
2018/01/12
2.1K0
OpenGL进行简单的通用计算实例
OpenGL坐标转换推导(十一)
之前我们已经提到在OpenGL中,所有物体都是在一个3D空间里的,但是屏幕都是2D像素数组,所以OpenGL会把3D坐标转变为适应屏幕的2D像素,最终投射到2D的屏幕上去。所以对于每一个顶点坐标都会依次进行model、view、projection三种变换。这三种变换实现代码如下:
PengJie
2021/01/10
2.6K0
点击加载更多

相似问题

OpenGL通用语言中从RGB到HSV的转换

22

HSV到RGB的转换

113

RGB到HSV的转换

11

HSV到RGB颜色转换

1011

OpenCV图像从RGB到HSV的转换

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档