javascript - SVG defs 多个元素 CSS 变一
问题描述
我在 HTML 页面中有一个 SVG 元素。元素通过 Javascript 更改类,例如,我可以通过编程将交通灯图形从绿色更改为红色。这适用于简单的元素,但是当 SVG 模板(在一个defs
部分中,用 实例化use
)包含多个图形类型(rect
等ellipse
)时,我正在苦苦挣扎,其中类更改应该只影响一些但不是所有图形。
SVG:
<defs>
<g id="pointUL">
<rect x="0" y="4" width="8" height="4" ---element1--- />
<polygon points="2,0 6,0 8,4 8,8" ---element2--- />
</g>
</defs>
<use id="ICX_P647YA" xlink:href="#pointUL" x="184" y="128" />
Javascript:
function updateItem(item) {
var element = document.getElementById(item.title);
if (element != null) {
element.className.baseVal = item.cssClass;
CSS:
.trackPointOccOOC {
fill: red;
}
因此,当我使用 item.cssClass = trackPointOOC 调用 updateItem 时,上面的片段适用于我希望矩形和多边形都变红的地方。
但我需要的效果是矩形和多边形处于三种状态:即显示矩形,或显示多边形,或两者都显示(或它们获得不同的颜色,或其他)。同样,我可以显示/隐藏 pointUL 的所有元素,但我需要每个元素单独获得自己的特性。虽然我使用了一个矩形和一个多边形,但可能有 5 个矩形和一个椭圆,或者一个矩形+椭圆+多边形,或者其他。
如果可能的话,我猜 CSS 和 SVG 需要通过 ---element1--- 和 ---element2--- 链接在一起,所以 CSS 会有小节:
.trackPointOccOOC {
---element1---
fill: red;
---element2---
fill: black;
}
也许这是不可能的,我必须考虑另一种方式。或者这可能是显而易见的:) 我不擅长 CSS。谢谢。
[编辑] ccprog 的链接确实为我指明了正确的方向(谢谢),但我认为它值得一个完整的答案(如下)。
解决方案
CSS 包含许多控制元素的变量:
.trackPointOccOOC {
--colourN: red;
--visibleN: block;
--colourR: red;
--visibleR: block;
animation: redFlash 1s infinite;
}
.trackPointLockN {
--colourN: white;
--visibleN: block;
--colourR: grey;
--visibleR: none;
animation: none;
}
.trackPointLockR {
--colourN: grey;
--visibleN: none;
--colourR: white;
--visibleR: block;
animation: none;
}
(有 9 个状态,如上所示 3 个)
然后SVG定义:
<g id="pointUL">
<rect x="0" y="4" width="8" height="4" style="fill: var(--colourN); display: var(--visibleN);" />
<polygon points="2,0 6,0 8,4 8,8" style="fill: var(--colourR); display: var(--visibleR);" />
</g>
最后 SVG 没有改变:
<use id="ICX_P647YA" xlink:href="#pointUL" x="184" y="128" />
Javascript也没有改变。
推荐阅读
- java - 是否有一种标准方法来验证数组中多个项目之间的约束?
- powershell - 在“域控制器”上找不到对象“用户”
- arrays - Excel 中的 CountIF 与标准的可变范围
- django - Django通过谷歌地图的位置实现搜索
- angular - else 条件没有被测试覆盖覆盖
- javascript - Mapbox Map 缩放时消失
- r-markdown - 批量渲染 Rmarkdown 文件以与 Hugo 一起使用的正确方法
- mongodb - Mongo:如何在一个集合中找到所有具有相同值的项目对
- python - 使用 selenium 获取随着时间的推移添加的最后一个数据
- javascript - AWS cognito 注册和登录 - 如何存储池和应用程序 ID