我已经用jquery SVG加载了一个inkscape SVG文件,我正在尝试对其应用一堆CSS选择器,以确保特定层的项目都是统一的颜色,并允许在某些层上使用鼠标悬停效果。在SVG上遵守标准CSS规则似乎没有问题,但完全忽略了[attribute="value"]
选择器的任何内容,例如:
svg g path:hover {
fill: yellow !important;
stroke-width: 4px !important;
}
将在鼠标悬停时应用这些效果,正如预期的那样:
svg g[inkscape:label="footprint"] * {
fill: white !important;
pointer-events: none;
}
完全忽略这一点,导致:hover事件仍然适用于它们。我还设置了一个CSS样式,用于将规则应用于图例div和SVG,如下所示:
svg g[inkscape:label="social"] *,
div#legend div.legendEntry[name="social"] div.legendColor {
fill: orange !important;
background-color: orange;
}
这将在没有问题的情况下匹配div#legend div.legendEntry[name="social"] div.legendColor
,但是似乎不适用于svg g[inkscape:label="social"] *
选择器。
我假设这与jquery-svg或jquery在页面加载后更改DOM有关——尽管当我直接将svg数据加载到页面中时,没有jquery-sfg,这不是问题。我可以通过jquery svg直接应用样式,但是在加载svg文件后告诉它应用现有样式会更好。
SVG是一种基于XML的格式,因此,inkscape:label
不是名称中包含冒号的inkscape:label
属性,而是inkscape
XML命名空间中的label
属性。
最有可能的是,SVG是作为XML加载的,这意味着您需要在选择器中正确地声明和引用XML命名空间,而不是将冒号视为属性名称的文字部分。您可以在样式表顶部使用@namespace
语句:
@namespace inkscape 'http://www.inkscape.org/namespaces/inkscape';
使用[inkscape|label="..."]
而不是[inkscape:label="..."]
,使用管道而不是转义冒号来指示命名空间前缀:
svg g[inkscape|label="footprint"] * {
fill: white !important;
pointer-events: none;
}
svg g[inkscape|label="social"] *,
div#legend div.legendEntry[name="social"] div.legendColor {
fill: orange !important;
background-color: orange;
}