javascript - 如何在 d3 中选择特定的 SVG 并更改其属性?
问题描述
我在 html 文件中列出了四个 svg。根据各自的颜色,每个都有不同的类别。每个 SVG 都包含一个矩形和一个圆形。
<body>
<svg class="green">
<g class="blue">
<rect width="500", height= "500", fill="blue"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
<svg class="green">
<g class="green">
<rect width="500", height= "500", fill="green"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
<svg class="green">
<g class="red">
<rect width="500", height= "500", fill="red"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
<svg class="green">
<g class="yellow">
<rect width="500", height= "500", fill="yellow"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
<script src="app.js"></script>
</body>
<script src="app.js"></script>
app.js 文件包含一个代码,每当鼠标触摸矩形时,所有的 SVG 都会消失。一旦结束,矩形就会再次出现。
//app.js
const svg = d3.selectAll("svg")
const rectangles = d3.selectAll("rect")
rectangles
.on("mouseover", function(){
svg.attr("opacity", 0)
svg.select(".green").attr("opacity", 1)
})
.on("mouseout", function(){
svg.attr("opacity", 1)
})
但我想要做的是只有一个矩形消失,鼠标触摸的矩形。我正在尝试使用多个 if 语句和 switch-case,但有更好的方法吗?也许使用 d3.select 但我不能提供一些东西
解决方案
根据您的 HTML 结构,我想这就是您想要实现的目标:
const svg = d3.selectAll("svg");
const rectangles = d3.selectAll("rect");
rectangles
.on("mouseover", function(){
// "this" is the rectangle element
// "this.parentNode.parentNode" is the svg that holding it.
let parentSvg = this.parentNode.parentNode;
svg.attr("opacity", function () {
return parentSvg == this ? 1 : 0;
});
})
.on("mouseout", function(){
svg.attr("opacity", 1)
});
<script src="https://cdn.jsdelivr.net/npm/d3@5.16.0/dist/d3.min.js"></script>
<svg class="green">
<g class="blue">
<rect width="500", height= "500", fill="blue"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
<svg class="green">
<g class="green">
<rect width="500", height= "500", fill="green"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
<svg class="green">
<g class="red">
<rect width="500", height= "500", fill="red"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
<svg class="green">
<g class="yellow">
<rect width="500", height= "500", fill="yellow"></rect>
<circle cx="100", cy="100", r ="50"></circle>
</g>
</svg>
推荐阅读
- codenameone - 使用 CodenameOne 进行单元测试时出错
- linux - 如何在 linux redhat 中列出池?
- angular2-nativescript - 任何人都可以帮助我提供一些指导以使用 Nativescript 在滚动视图中实现固定标题/粘性标题
- django - 创建发送邮件的基本联系表单
- javascript - 为什么当 Js 处于活动状态时我的表单只能在 chrome 中工作?
- php - 在 AJAX 中的 POST 请求后,此请求没有可用的响应数据
- matlab - 维纳滤波器通过相同大小的卷积对模糊图像失败
- python - 完整的 IPv4 地址空间输出
- c# - C# Async Await 和一般异步问题
- javascript - 如何正确使用 .click 在 Javascript 中的 html 编码中选择此类型?