在 svg 中捕获重叠 g 元素中的指针事件
capturing pointer events in overlapping g-elements in a svg
我正在向同一个 SVG 添加 2 个 g 元素,例如
var charts = svg1.append("g")
.attr("class","charts")
.attr("id","charts")
.style("opacity",0);
var bubbles = svg1.append("g")
.attr("id","bubble");
var bubbleId = document.getElementById( 'bubble' );
var backId = document.getElementById( 'back' );
var chartId = document.getElementById( 'charts' );
bubbleId.addEventListener( 'click', chartSVG );
backId.addEventListener( 'click', bubbleSVG );
function bubbleSVG(){
bubbleId.style.opacity = 1;
chartId.style.opacity = 0;
bubbleId.style.z_index = 100;
chartId.style.z_index = 10;
}
function chartSVG(){
bubbleId.style.opacity = 0;
chartId.style.opacity = 1;
bubbleId.style.z_index = 10;
chartId.style.z_index = 100;
}
我将它们放置在彼此重叠的位置,并使用另一个 div 元素 (backId)
在它们的不透明度 (bubbleId,chartId) 之间切换
气泡和图表 svg 分别有气泡和圆形布局。
我现在有以下问题..
如果我在 chartId 上执行鼠标悬停事件捕获,对于与气泡重叠的圆圈,事件不会在具有更高 z-index 的页面上捕获,而是始终在 bubbleId 上捕获事件。 ...
任何指针。
z-index 在 svg 中不起作用。
一个选项是使用 pointer-events
none 禁用组读取上的鼠标事件 here
function bubbleSVG(){
bubbleId.style.opacity = 1;
chartId.style.opacity = 0;
d3.select(bubbleId).style("pointer-events", "auto");
d3.select(chartId).style("pointer-events", "none");
}
function chartSVG(){
bubbleId.style.opacity = 0;
chartId.style.opacity = 1;
d3.select(bubbleId).style("pointer-events", "none");
d3.select(chartId).style("pointer-events", "auto");
;
}
点击对象(圆形和矩形)试试这个
var width = 400, height = 300;
function bubbleSVG(){
bubbleId.style.display = 'unset';
chartId.style.display = 'none';
}
function chartSVG(){
chartId.style.display = 'unset';
bubbleId.style.display = 'none';
}
function toggleSVG(){
if(bubbleId.style.display == 'none'){
bubbleSVG()
}else{chartSVG()}
}
var svg1 = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var back = svg1.append("g")
.attr("id","back")
.append("rect")
.attr("x","0")
.attr("y","0")
.attr("width",width)
.attr("height",height)
.attr("fill","yellow");
var charts = svg1.append("g")
.attr("class","charts")
.attr("id","charts")
.style("opacity",1)
.append("rect")
.attr("x","50")
.attr("y","50")
.attr("width","50")
.attr("height","10")
.attr("stroke","black")
.attr("stroke-width","3")
.attr("fill","blue");
var bubbles = svg1.append("g")
.attr("id","bubble")
.append("circle")
.attr("cx","50")
.attr("cy","50")
.attr("r","40")
.attr("stroke","black")
.attr("stroke-width","3")
.attr("fill","red");
var bubbleId = document.getElementById( 'bubble' );
var backId = document.getElementById( 'back' );
var chartId = document.getElementById( 'charts' );
bubbleId.addEventListener( 'click', chartSVG );
chartId.addEventListener( 'click', bubbleSVG );
backId.addEventListener( 'click', toggleSVG );
bubbleSVG();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
我正在向同一个 SVG 添加 2 个 g 元素,例如
var charts = svg1.append("g")
.attr("class","charts")
.attr("id","charts")
.style("opacity",0);
var bubbles = svg1.append("g")
.attr("id","bubble");
var bubbleId = document.getElementById( 'bubble' );
var backId = document.getElementById( 'back' );
var chartId = document.getElementById( 'charts' );
bubbleId.addEventListener( 'click', chartSVG );
backId.addEventListener( 'click', bubbleSVG );
function bubbleSVG(){
bubbleId.style.opacity = 1;
chartId.style.opacity = 0;
bubbleId.style.z_index = 100;
chartId.style.z_index = 10;
}
function chartSVG(){
bubbleId.style.opacity = 0;
chartId.style.opacity = 1;
bubbleId.style.z_index = 10;
chartId.style.z_index = 100;
}
我将它们放置在彼此重叠的位置,并使用另一个 div 元素 (backId)
在它们的不透明度 (bubbleId,chartId) 之间切换气泡和图表 svg 分别有气泡和圆形布局。
我现在有以下问题..
如果我在 chartId 上执行鼠标悬停事件捕获,对于与气泡重叠的圆圈,事件不会在具有更高 z-index 的页面上捕获,而是始终在 bubbleId 上捕获事件。 ...
任何指针。
z-index 在 svg 中不起作用。
一个选项是使用 pointer-events
none 禁用组读取上的鼠标事件 here
function bubbleSVG(){
bubbleId.style.opacity = 1;
chartId.style.opacity = 0;
d3.select(bubbleId).style("pointer-events", "auto");
d3.select(chartId).style("pointer-events", "none");
}
function chartSVG(){
bubbleId.style.opacity = 0;
chartId.style.opacity = 1;
d3.select(bubbleId).style("pointer-events", "none");
d3.select(chartId).style("pointer-events", "auto");
;
}
点击对象(圆形和矩形)试试这个
var width = 400, height = 300;
function bubbleSVG(){
bubbleId.style.display = 'unset';
chartId.style.display = 'none';
}
function chartSVG(){
chartId.style.display = 'unset';
bubbleId.style.display = 'none';
}
function toggleSVG(){
if(bubbleId.style.display == 'none'){
bubbleSVG()
}else{chartSVG()}
}
var svg1 = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var back = svg1.append("g")
.attr("id","back")
.append("rect")
.attr("x","0")
.attr("y","0")
.attr("width",width)
.attr("height",height)
.attr("fill","yellow");
var charts = svg1.append("g")
.attr("class","charts")
.attr("id","charts")
.style("opacity",1)
.append("rect")
.attr("x","50")
.attr("y","50")
.attr("width","50")
.attr("height","10")
.attr("stroke","black")
.attr("stroke-width","3")
.attr("fill","blue");
var bubbles = svg1.append("g")
.attr("id","bubble")
.append("circle")
.attr("cx","50")
.attr("cy","50")
.attr("r","40")
.attr("stroke","black")
.attr("stroke-width","3")
.attr("fill","red");
var bubbleId = document.getElementById( 'bubble' );
var backId = document.getElementById( 'back' );
var chartId = document.getElementById( 'charts' );
bubbleId.addEventListener( 'click', chartSVG );
chartId.addEventListener( 'click', bubbleSVG );
backId.addEventListener( 'click', toggleSVG );
bubbleSVG();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>