gpt4 book ai didi

svg - 在 use 元素上更改 defs 中定义的属性

转载 作者:行者123 更新时间:2023-12-03 11:37:26 25 4
gpt4 key购买 nike

如何通过脚本实现更改 defs 中定义的“使用元素”的样式?我试图在 w3c 工作草案界面中移动,但我迷失在那个迷宫中

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="100"
height="100"
id="svg1">

<defs>
<g id="minchia" onclick="color(evt)">
<rect width="50" height="50" style="fill:#ffff6e;stroke:#ee1400;stroke-width:3" />
</g>
</defs>

<script type="text/javascript">
<![CDATA[
function color(evt)
{
node = evt.target.correspondingUseElement;

alert(node.getAttributeNS(null, "style")); /* empty! */
alert(node.getAttributeNS("http://www.w3.org/1999/xlink", "style")); /* empty! */

node.setAttributeNS("http://www.w3.org/1999/xlink", "fill", "blue"); /* nothing */
node.setAttributeNS(null, "fill", "blue"); /* nothing */
}
]]>
</script>

<use xlink:href="#minchia" id="frufru" x="10" y="10" />
</svg>

更新

还有一件事:如果引用的元素是一个包含 2 个其他元素(如矩形和文本)的“g”怎么办?如何为正确的 childNode 设置属性(通过 DOM 方法)?
在此示例中, setAttribute 为引用元素的第一个子元素设置样式。如果我必须为第二个设计样式怎么办?
<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="1000"
height="1000"
id="svg1">

<defs>
<g id="test" onclick="color(evt)" >
<rect
width="54"
height="58"
x="1.5"
y="1.5"
id="rect5" />
<text
x="-34"
y="47"
transform="matrix(0.66777386,-0.74436421,0.74436421,0.66777386,0,0)"
id="text2987"
style="font-size:30px;fill:#ffffff;stroke-width:0px">JC!</text>
</g>
</defs>

<script type="text/javascript">
<![CDATA[
function color(evt)
{
node = evt.target.correspondingUseElement;
node.setAttributeNS(null, "style", "fill:blue");
}
]]>
</script>

<use xlink:href="#test" id="frufru" x="10" y="10" style="fill:#000000" />

</svg>

最佳答案

正如您在 my test page 中看到的那样, 如果您在 <defs> 中定义元素的视觉样式您不能在 <use> 上覆盖该样式的文档部分实例,不是通过视觉属性,style属性,或应用于 <use> 的 CSS 类.

Snapshot of test results from linked SVG file, showing that only unstyled elements can be overridden

此外,您不能在 <use> 上使用视觉属性。将样式级联到源元素的元素;您必须为此使用 CSS 样式。

你必须:

  • 确保您定义的元素没有应用任何视觉样式,并且
  • 使用 CSS 或设置手动解析或创建的 style属性,例如

    node.setAttribute('style','fill:blue');

  • noted here您可以使用 setAttribute(...)setAttributeNS(null,...)对于 SVG 属性。

    更新 : 回答你的第二个问题:

    What if the referenced element is a "g" which contains 2 other elements, like a rect and a text?



    您不能使用 CSS 规则来选择 <use> 的伪子级。 ;他们根本就不存在。但是,您可以做的是在 <def> 中应用您想要保留的不变样式。然后应用 style你想上 <use> .

    例如:

    <defs>
    <g id="foo">
    <!-- Every rect instance should be filled with blue -->
    <rect width="54" height="58" x="1.5" y="1.5"
    fill="blue" />
    <!-- I want to be able to change text color per use
    so I must be sure not to specify the fill style -->
    <text x="-34" y="47" transform="matrix(0.668,-0.744,0.744,0.668,0,0)"
    style="font-size:30px;stroke-width:0px">JC!</text>
    </g>
    </defs>
    <use xlink:href="#foo" style="fill:orange" transform="translate(0,-100)" />
    <use xlink:href="#foo" style="fill:yellow" transform="translate(0, 100)" />

    这仅在您希望所有可更改项的属性设置相同时才有效。

    与 HTML 不同,SVG 中的标记是表示。我上面的建议是一个碰巧有效的黑客,但总的来说 <use>元素旨在实例化定义的完整外观。如果您需要每个实例的自定义外观,也许您应该考虑克隆元素、修改属性并将其添加到文档中,而不是破解 <use> .

    关于svg - 在 use 元素上更改 defs 中定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069006/

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