svg 外部样式表不起作用

The*_*tut 2 html svg external stylesheet

我是新的 svg 学习者,并尝试使用外部样式表为 svg 文件设置动画,但未能为我的对象“立方体”设置样式。

[index.html 文件]

      <head>
        <link rel="stylesheet" type="text/css" href="cube.css">
      </head>
      <body>
        <img src="cube-motion.svg" height="350px" />
        <div class="logo">
          <h1>SVG Cube Animation</h>
        </div>
Run Code Online (Sandbox Code Playgroud)

[cube-motion.svg 文件]

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="cube.css" ?>

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 200 200" style="enable-background:new 0 0 200 200;" xml:space="preserve">

<g>
    <polygon id="l1" class="st0" points="105.3,92.7 86.3,103.3 67.3,92.9 67.1,71.9 86,61.2 105.1,71.6   "/>
    <polyline id="l2" class="st1" points="67.1,71.9 86.2,82.5 86.3,103.3 67.1,93.1 66.9,71.9    "/>

    <animateTransform
        attributeName="transform"
        type="translate"
        from="0 0"
        to="0 75"
        begin="0s"
        dur="3s"
        repeatCount="indefinite"
        />
</g>

</svg>
Run Code Online (Sandbox Code Playgroud)

[外部样式表文件cube.css]

 .st0 {
        fill:#FF00FF;
        stroke:#000000;
        stroke-miterlimit:10;
    }

.st1 {
        fill:#23D83C;
        stroke:#000000;
        stroke-miterlimit:10;
    }

.logo {
    position: absolute;
    left: 400;
    top: 150;
  }
Run Code Online (Sandbox Code Playgroud)

Rog*_*ker 6

通过在 SVG 中包含外部样式表,您走在正确的轨道上:

<?xml-stylesheet type="text/css" href="cube.css" ?>
Run Code Online (Sandbox Code Playgroud)

它不起作用的原因是因为 SVG 被加载到 HTML 中,<img>这 - 理所当然 - 不允许处理额外的外部资产。

如果您坚持使用外部文件中的 CSS,您有两个选择,要么将 SVG 嵌入到 html 中,要么使用<object data=file.svg type=image/xml+svg></object>.

根据您的用例,您基本上可以通过三种方式使用 CSS 进行样式设置:

<img src="my.svg">

图像不是交互式的,并且不允许在其内部加载任何其他资产。仅引用图像文件的简单表示。它确实允许使用 CSS,但只能从<style>SVG 内的 -element 使用。

<object data="my.svg" type="image/svg+xml"></object>

对象可以做的不仅仅是图像,例如加载额外的资产,甚至包括独立的(在加载的 SVG 内)交互(例如 CSS :hover-pseudoclass)加载外部 CSS 文件是在示例代码中完成的, -<?xml-stylesheet...?>指令是在<svg>-tag之前

<svg...>...</svg>

完全嵌入在 HTML 文档中,这允许在页面内完全集成(这可能在交互方面有好处,在 CSS 方面有缺点,因为您必须考虑样式隔离),但也是最少的可重复使用,因为您基本上必须重复整个 SVG,如果在页面上使用一次,这无关紧要。请注意,为了将 SVG 嵌入 HTML 文档中,您不能将任何 SVG doctype 和/或 xml 声明放在 HTML(<?xml...?>,<!DOCTYPE svg...><?xml-stylesheet...?>)中。使用嵌入式 SVG,您可以使用通常的 HTML<link><style>节点简单地导入(或内联)样式,其中<style>元素也可能仍位于<svg>-element 内。

这是之间差异快速示例<img><object>