[英]How can I change svg color on click text tag
我在 SVG 中有以下标签:
<g>
<use x="10" y="14" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:actuate="onRequest" id="PL-1-02" xlink:show="replace" xlink:href="#sfseat" />
</g>
<rect x="43" y="18" width="25" style="fill:rgb(192,192,192); stroke:none;" rx="2" ry="2" height="30" />
<text x="18" y="35" style="stroke:rgb(0,0,0); stroke-width:0.5;">
02
</text>
当我单击文本标签时,我必须更改 svg 的颜色。 请建议我如何在javascript中的点击文本标签上获取g元素。
有趣的是,这可以在没有任何 Javascript 的情况下解决。 SMIL 动画具有由事件触发的能力。 您可以使用简单的<set fill="freeze">
标记作为矩形的子项来永久更改属性或 CSS 属性的值。 要点击的元素需要有一个id
属性,然后你可以在<set>
添加一个begin="myId.click"
:
<svg viewBox="0 15 100 50"> <rect x="43" y="18" width="25" rx="2" ry="2" height="30" style="fill:rgb(192,192,192); stroke:none;"> <set attributeName="fill" to="rgb(192,0,0)" begin="trigger02.click" fill="freeze" /> </rect> <text id="trigger02" x="18" y="35" style="stroke:rgb(0,0,0); stroke-width:0.5;cursor:pointer"> 02 </text> </svg>
正如Radical Edward 的回答中所建议的,您可以编辑 SVG(或者,可能更好的是rect
)元素的 fill 属性——尽管通过分离样式,您可能会获得更清晰的结果和更好的可移植性。
添加样式元素并单独定义样式:
<svg>
<style>
rect {
stroke: none;
fill: rgb(192,192,192);
}
rect.active {
fill: rgb(255, 20, 20);
}
</style>
<!-- The rest of your SVG -->
<!-- The rect element with the inline style removed -->
<rect
x="43"
y="18" width="25"
rx="2"
ry="2"
height="30"
/>
</svg>
为了识别文本元素和矩形,我们将给它们一个唯一的 ID:
<rect
id="rect1"
x="43"
y="18"
width="25"
rx="2"
ry="2"
height="30"
/>
<text
id="text1"
x="18"
y="35"
style="stroke:rgb(0,0,0); stroke-width:0.5;"
>
然后我们将在文本元素上添加一个事件侦听器:
var textElement = document.querySelector('#text1');
var rect = document.querySelector('#rect1');
textElement.addEventListener('click', function() {
rect.classList.add('active');
});
以上将适用于 IE11,如果您仅针对现代浏览器或使用像 Babel 这样的转译器,您可以使用更现代的 ES6+ 语法和const
和箭头函数; 对于较旧的浏览器(IE10 及以下),您需要 polyfill 或使用其他解决方法,请参阅MDN 上的“旧版 Internet Explorer 和 attachEvent”一章。
fill
属性的值除了使用 style 元素,您还可以硬编码 rect 的 fill 属性,然后修改它:
<rect fill="rgb(195,195,195)" ... />
textElement.addEventListener('click', function() {
rect.setAttribute('fill', 'rgb(255,20,100)');
});
如果您无权访问 svg和多个 SVG 的内容,您至少应该将其包装在一个可识别的容器中(即使用 ID 或唯一的类名)以确保您正在处理正确的容器——如果可能的话
<div class="clickable-svg-container">
<svg .../>
</div>
然后,您必须首先选择您的容器(或页面上的所有 svg),然后在其中搜索,以找到您想要观看和/或修改的元素:
var containers = document.querySelectorAll('.clickable-svg-container');
// Alternative: Pick all the SVG elements from the current document
// var svgs = document.querySelectorAll('svg');
// Now loop over your selected elements:
containers.forEach(function(container, index) {
var rect = container.querySelector('rect');
var text = container.querySelector('text');
var group = container.querySelector('g');
// now you can set up your event listener as seen above
text.addEventListener(...);
});
现在您可以使用上述指南的其余部分来对点击事件做出反应。 请注意,您仍然可以 (a) 全局声明活动类的样式(例如,在 HTML 的<head />
并使用类名来设置修改后的元素的样式或 (b) 直接在每个元素上修改fill
属性。
在 MDN Web Docs 上阅读更多内容:
let totalUseTags=svg.getElementsByTagName('use');
for(let i=0;i<totalUseTags.length;i++){
let useParentElement=totalUseTags[i];
let textElement=this.getSiblingTextElementOfUseTag(totalUseTags[i].parentElement.nextElementSibling);
useParentElement.parentElement.appendChild(textElement)
}
getSiblingTextElementOfUseTag(g){
let i=1;
while (g) {
if(g.nodeName=='text'){
return g;
}
g = g.nextElementSibling;
i++;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.