gpt4 book ai didi

css - 多个图层上的 SVG 悬停状态,不仅是顶层

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:44 25 4
gpt4 key购买 nike

我想将决策树显示为具有一定交互性的 SVG。不同的路径都在那里,悬停时它们的不透明度增加了。但是悬停状态似乎只适用于顶部元素。

#flow polyline {
stroke: #0071bc;
stroke-opacity: 0;
stroke-width: 8px;

mix-blend-mode: color;
}
#flow polyline:hover {
stroke-opacity: 1;
}

https://jsfiddle.net/yv82f3ud/

如何将悬停事件应用于所有悬停的 svg 多段线,而不仅仅是顶层?


后续问题:有没有一种方法可以让应用悬停状态的路径更宽,这样我就不必完全越界?

最佳答案

How can I apply the hover event on all hovered svg polylines, not only the top layer?

没有简单的方法。您需要检测您已经完成的部分,确定应突出显示哪些部分,然后您自己手动突出显示它们。

Is there a way to have a wider path are on which the hover state is applied so I don't have to be exactly over the line?

是的,使用单独的透明粗线

.line {
stroke: grey;
stroke-width: 2;
}

.line-wider {
stroke: transparent;
stroke-width: 40;
}

g:hover .line {
stroke: blue;
}
<svg>
<g>
<path d="M0,50 L 300,50" class="line"/>
</g>
<g>
<path d="M0,100 L 300,100" class="line"/>
<path d="M0,100 L 300,100" class="line-wider"/>
</g>
</svg>

您可以在粗透明线部分上使用鼠标悬停事件来确定您位于哪个部分,并根据该部分进行突出显示。

类似下面的内容:

// Add event listener to each "line-wider" path, that highlights the sections
var sections = document.querySelectorAll(".line-wider");
sections.forEach(function(elem) {
elem.addEventListener("mouseover", doHover);
elem.addEventListener("mouseout", clearHover);
});


var highlightedSections = {
's1': '.s1, .s11, .s12, .s111, .s112, .s121, .s122',
's11': '.s1, .s11, .s111, .s112',
's12': '.s1, .s12, .s121, .s122',
's111': '.s1, .s11, .s111',
's112': '.s1, .s11, .s112',
's121': '.s1, .s12, .s121',
's122': '.s1, .s12, .s122'
};

function doHover(evt) {
// Which section are we hovering over?
var id = evt.target.id;
// highlightedSections[id] is a CSS selector which selects all the sections which should be highlighted for this hover section
document.querySelectorAll(highlightedSections[id]).forEach( function(elem) {
// Add the "highlight" class to all the matching sections
elem.classList.add("highlight");
});
}


// Remove the "highlight" class from all elements which currently have it set
function clearHover(evt) {
document.querySelectorAll(".highlight").forEach( function(elem) {
elem.classList.remove("highlight");
});
}
.line {
fill: none;
stroke: grey;
stroke-width: 2;
}

.line-wider {
fill: none;
stroke: transparent;
stroke-width: 40;
}

.highlight {
stroke: blue;
}
<svg width="400" height="500">
<!-- top section -->
<path d="M 200,0 L 200,100" class="line s1"/>
<path d="M 200,0 L 200,100" class="line-wider" id="s1"/>

<!-- left branch -->
<path d="M 200,100 L 100,200, 100,300" class="line s11"/>
<path d="M 200,100 L 100,200, 100,300" class="line-wider" id="s11"/>

<!-- left branch -->
<path d="M 100,300 L 50,350, 50,450" class="line s111"/>
<path d="M 100,300 L 50,350, 50,450" class="line-wider" id="s111"/>
<!-- right branch -->
<path d="M 100,300 L 150,350, 150,450" class="line s112"/>
<path d="M 100,300 L 150,350, 150,450" class="line-wider" id="s112"/>

<!-- right branch -->
<path d="M 200,100 L 300,200, 300,300" class="line s12"/>
<path d="M 200,100 L 300,200, 300,300" class="line-wider" id="s12"/>

<!-- left branch -->
<path d="M 300,300 L 250,350, 250,450" class="line s121"/>
<path d="M 300,300 L 250,350, 250,450" class="line-wider" id="s121"/>
<!-- right branch -->
<path d="M 300,300 L 350,350, 350,450" class="line s122"/>
<path d="M 300,300 L 350,350, 350,450" class="line-wider" id="s122"/>

</svg>

关于css - 多个图层上的 SVG 悬停状态,不仅是顶层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52559876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com