我想通过将 svg 作为单独的文件包含在 css 中来使用 CSS 伪类 ( :hover
, )。:active
我做了这样的,
svg文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/css" href="./journey-svg.css"?>
<svg
version="1.1"
baseProfile="full"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ev="http://www.w3.org/2001/xml-events"
width="800"
height="800"
viewBox="0 0 800 800"
>
<defs>
<style>
#journey {
fill: var(--journey, black);
}
</style>
</defs>
<path id="journey" alignment-baseline="" d="M227.699 1.199H25.301c-13.234 0-24 10.766-24 24v197.602c0 13.23 10.766 24 24 24h202.398c13.235 0 24-10.77 24-24V25.199c0-13.234-10.765-24-24-24zm0 24l.008 104.98-40.543-38.078c-2.836-2.66-6.468-4.125-10.226-4.125-4.571 0-8.848 2.145-11.739 5.883l-47.73 61.805c-1.547 2.004-4.027 3.199-6.637 3.199-1.781 0-3.461-.539-4.863-1.566l-31.016-22.653c-3.09-2.254-7.093-3.5-11.269-3.5-4.758 0-9.203 1.551-12.52 4.367l-25.863 21.934V25.199h202.398zm0 0M93.301 96.398c13.676 0 24.801-11.125 24.801-24.801 0-13.671-11.125-24.796-24.801-24.796-13.676 0-24.801 11.125-24.801 24.796 0 13.676 11.125 24.801 24.801 24.801zm0 0" />
</svg>
但是我无法使用 CSS 到达那里,它看不到 CSS 变量,例如:
<style>
:root {
--journey: red;
}
</style>
<object type="image/svg+xml" data="./images/journey-svg/journey-svg.svg" width="400" height="400"> </object>
但是,如果我只是将 svg 直接插入到文件中,那么一切都会正常工作:
:root {
--journey: red;
}
#journey-svg {
--size: 100px;
width: var(--size);
height: var(--size);
}
#journey-svg:hover {
--journey: green;
}
#journey-svg:active {
--journey: orange;
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/css" href="./journey-svg.css"?>
<svg
version="1.1"
baseProfile="full"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ev="http://www.w3.org/2001/xml-events"
width="800"
height="800"
viewBox="0 0 250 250"
id="journey-svg"
>
<defs>
<style>
#journey {
fill: var(--journey, black);
transition: fill 0.2s ease-in-out;
}
</style>
</defs>
<path id="journey" alignment-baseline="" d="M227.699 1.199H25.301c-13.234 0-24 10.766-24 24v197.602c0 13.23 10.766 24 24 24h202.398c13.235 0 24-10.77 24-24V25.199c0-13.234-10.765-24-24-24zm0 24l.008 104.98-40.543-38.078c-2.836-2.66-6.468-4.125-10.226-4.125-4.571 0-8.848 2.145-11.739 5.883l-47.73 61.805c-1.547 2.004-4.027 3.199-6.637 3.199-1.781 0-3.461-.539-4.863-1.566l-31.016-22.653c-3.09-2.254-7.093-3.5-11.269-3.5-4.758 0-9.203 1.551-12.52 4.367l-25.863 21.934V25.199h202.398zm0 0M93.301 96.398c13.676 0 24.801-11.125 24.801-24.801 0-13.671-11.125-24.796-24.801-24.796-13.676 0-24.801 11.125-24.801 24.796 0 13.676 11.125 24.801 24.801 24.801zm0 0" />
</svg>
如果您不想将 SVG 内联添加到 HTML,那么您可以添加一个 SVG 文件,
<object>
但在这种情况下,样式不会直接到达 svg,因为它是一个孤立的对象。因此,我们提前将样式放在svg文件中,然后上传到服务器
这是一个单独的 SVG 文件,路径为 :hover 样式
现在我们从服务器调用 svg
带有精灵的变体(符号)
为了能够从外部 css 更改样式,您需要删除所有 svg 演示样式(填充、描边、不透明度)
<symbol>
添加到它的换行路径id="journey"
将 svg 文件上传到 HTML
然后调用任意多次
<use>
<use xlink:href="#journey" />
SO上有一个完整的svg-sprite部分,您可以看到各种细微差别,解决方案
使用 Sprite 添加 SVG 图标
如果图标很少,那么
<symbol>
您可以在不使用 webpack 和其他类似程序的情况下手动制作精灵。一个额外的好处是,一旦你手动编写了一个 sprite,你将永远知道如何设置 webpack 以获得相同的结果。从 SVG 图标形成一个精灵
将图标代码复制到您计划用作精灵的 svg 文件中,并用一个标签将其包装起来,
<symbol>
并为其提供 ID。对所有图标重复此操作,分配唯一 ID
完成的文件必须以 *.svg 扩展名保存并放置在服务器上。
下面是一个带有两个图标的精灵:
id="headphones"
和id="phone" viewBox="0 0 48 48"
viewBox
添加以使图标大小相同。没有显示任何内容,因为它
<symbol>
隐藏了内容,直到使用 ID 调用图标<use>
在此之前,您需要将精灵添加到 HTML
<object>
下一步:
使用 ID 调用图标
<use>
下面是调用和设置图标样式的完整代码:
我们得到结果:耳机图标在 时变色
:hover
,而听筒没有响应。这是因为耳机图标没有表现属性,但听筒图标有 -
fill="#009688"
并且 SVG 表现风格比外部 CSS 风格更重要。每次从 SVG 中删除表示样式是非常昂贵的。但有一条出路 - 应用
Computed
具有最高优先级的样式。使用变量进行样式设置
在我们的例子中,将使用外部 CSS 中的变量。
也就是说,我们看到您可以同时更改多种颜色。
这使得风格化多色图标成为可能。
在 SVG 内部:
可以
svg
直接粘贴到html
. 然后浏览器将允许从外部样式访问它。