为什么没有哈希的SVG片段标识符不起作用?

War*_*ama 2 svg

SVG片段标识符用于链接到SVG文档的特定视图。它们在SVG规范1.1的Secion 17.3.2中定义

通常,它们的格式为MyDrawing.svg#MyView,其中哈希后面的部分指定链接文档中元素的ID。但以我的理解MyDrawing.svg,也应该允许不带哈希的片段标识符。

规格说明如下:
“如果未提供SVG片段标识符(例如,指定的IRI不包含“#”字符,例如MyDrawing.svg),则使用该视图建立SVG文档的初始视图svg最外层元素上的规范属性(例如'viewBox'等)。”

测试用例

如果已通过链接到两个SVG文件的HTML文件对此进行了小型测试。第一个文件是使用片段标识符的链接img1.svg#id1,第二个文件是与标识符的链接,img2.svg 以下是这些文件:

index.html

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Fragment Identifier Test</title>
        </head>
        <body>
            <h2>With Hash</h2>
            <div>
                <svg style="width: 128px; height: 128px;">
                    <use xlink:href="img1.svg#id1"></use>
                </svg>
            </div>
            <h2>Without Hash</h2>
            <div>
                <svg style="width: 128px; height: 128px;">
                    <use xlink:href="img2.svg"></use>
                </svg>
            </div>
        </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

img1.svg(svg元素具有ID)

    <svg id="id1" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,512,512">
        <circle cx="256" cy="256" r="200" fill="green" />
    </svg>
Run Code Online (Sandbox Code Playgroud)

img2.svg(svg元素没有ID)

    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,512,512">
        <circle cx="256" cy="256" r="200" fill="red" />
    </svg>
Run Code Online (Sandbox Code Playgroud)

问题是什么

所有浏览器仅显示第一个SVG。

我有什么问题

我的第一个问题是:我是否正确理解,根据SVG规范应该可以使用没有哈希的片段标识符?

我的第二个问题:我在测试用例中做错什么了吗,或者浏览器是否不支持此操作?

我们为什么要这个?

在我看来,使用不带哈希的片段标识符链接SVG文档将是将单个SVG图像添加到HTML文档的圣杯。原因如下:-将SVG图像包含到HTML文档中的简单语法-不会使带有不必要ID的DOM混乱-能够使用CSS变量对SVG进行样式设置(如本文中Medium所示)。

简而言之,我们最终可以使用完全CSS样式的矢量图形,可以将其存储在单个外部文件中。没有注入,没有混乱的DOM ID。

Rob*_*son 5

片段标识符是哈希之后的所有内容。MyDrawing.svg根本不是片段标识符。

在SVG 1.1中,<use>元素不能指向完整文件,即MyDrawing.svg

与“图像”不同,“使用”元素不能引用整个文件。

SVG 2建议删除该限制,但是到目前为止,还没有浏览器实现了SVG 2的这一部分。除非至少有2个浏览器实施了更改,否则SVG 2规范将不得不恢复为SVG 1.1文本。

要在SVG 1.1中执行此操作,您需要使用<image>规范本身所建议的元素。或者,如果要使用<use>元素,请在根元素上放置一个id并将其指向该<use>元素。