SVG – :hover 和链接不能与 clip-path 和 Firefox 结合使用
SVG – :hover and links are not working in combination with clip-path and Firefox
出于某种原因,:hover
和链接在 Firefox 中无法与 clip-path
结合使用。 Chrome 没问题。我需要 clip-path
才能工作。我知道它在没有属性的情况下也能工作。但是,我无法删除此属性。
知道为什么吗?
简化示例:
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<style>
path {
fill: blue;
}
path:hover {
fill: red;
}
</style>
<a target="_parent" href="/test">
<path id="triangle" clip-path="url('#triangle-clip')" d="M150 0 L75 200 L225 200 Z">
<title>Triangle</title>
</path>
</a>
<clipPath id="triangle-clip">
<use href="#triangle" />
</clipPath>
</svg>
在你的情况下 clip-path
什么都不做,所以我只是删除了它。并且添加 @namespace
.
很重要
@namespace svg url(http://www.w3.org/2000/svg);
svg|a path {
fill: blue;
}
svg|a:hover path {
fill: red;
}
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<a href="/test">
<path id="triangle" d="M150 0 L75 200 L225 200 Z">
<title>Triangle</title>
</path>
</a>
</svg>
我注意到,如果您在 Firefox 中打开开发者工具,您会看到 shadow-root (closed)
而在 Chrome 中则没有。这可能就是为什么你的 :hover
Pseudo-class 没有执行的原因。
https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/mode
我们需要在此处打破使整个事情无效的递归。 IE。在问题的版本中,剪辑路径指向一个 <use>
元素,该元素指向一个 <path>
,该元素具有一个指向 <use>
的剪辑路径,该 <use>
指向一个 [=12] =]...
这是一种方法,即当它是 <a>
元素的后代时,仅将剪辑路径应用于路径。 <use>
元素会忽略它,因为选择器跨越阴影 DOM 边界。
另一种方法是用 <path>
指向的副本替换 <use>
元素,并从该路径副本中删除剪辑路径,然后再次修复无限递归问题。
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<style>
path {
fill: blue;
}
path:hover {
fill: red;
}
a > path {
clip-path: url('#triangle-clip');
}
</style>
<a target="_parent" href="/test">
<path id="triangle" d="M150 0 L75 200 L225 200 Z">
<title>Triangle</title>
</path>
</a>
<clipPath id="triangle-clip">
<use href="#triangle" />
</clipPath>
</svg>
正如@Robert Longson 指出的那样,您的初始代码存在递归问题。
本质上,你是在自己剪裁一个 svg 路径(三角形)(......仍然需要自己定义) - 导致与 'unclipped' 版本完全相同的形状。
但是,由于您已经使用了 <use>
元素,重新排序您的路径和剪切路径定义 - 避免不必要的递归 - 可能仍会简化您的应用代码。
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<clipPath id="triangle-clip">
<path id="triangle-path" d="M150 0 L75 200 L225 200 Z" />
</clipPath>
<style>
.link-content {
fill: blue;
clip-path: url('#triangle-clip');
}
a:hover .link-content{
fill: red;
}
</style>
<a class="link" target="_parent" href="/test">
<title>Triangle</title>
<use class="link-content" href="#triangle-path" />
</a>
</svg>
出于某种原因,:hover
和链接在 Firefox 中无法与 clip-path
结合使用。 Chrome 没问题。我需要 clip-path
才能工作。我知道它在没有属性的情况下也能工作。但是,我无法删除此属性。
知道为什么吗?
简化示例:
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<style>
path {
fill: blue;
}
path:hover {
fill: red;
}
</style>
<a target="_parent" href="/test">
<path id="triangle" clip-path="url('#triangle-clip')" d="M150 0 L75 200 L225 200 Z">
<title>Triangle</title>
</path>
</a>
<clipPath id="triangle-clip">
<use href="#triangle" />
</clipPath>
</svg>
在你的情况下 clip-path
什么都不做,所以我只是删除了它。并且添加 @namespace
.
@namespace svg url(http://www.w3.org/2000/svg);
svg|a path {
fill: blue;
}
svg|a:hover path {
fill: red;
}
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<a href="/test">
<path id="triangle" d="M150 0 L75 200 L225 200 Z">
<title>Triangle</title>
</path>
</a>
</svg>
我注意到,如果您在 Firefox 中打开开发者工具,您会看到 shadow-root (closed)
而在 Chrome 中则没有。这可能就是为什么你的 :hover
Pseudo-class 没有执行的原因。
https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/mode
我们需要在此处打破使整个事情无效的递归。 IE。在问题的版本中,剪辑路径指向一个 <use>
元素,该元素指向一个 <path>
,该元素具有一个指向 <use>
的剪辑路径,该 <use>
指向一个 [=12] =]...
这是一种方法,即当它是 <a>
元素的后代时,仅将剪辑路径应用于路径。 <use>
元素会忽略它,因为选择器跨越阴影 DOM 边界。
另一种方法是用 <path>
指向的副本替换 <use>
元素,并从该路径副本中删除剪辑路径,然后再次修复无限递归问题。
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<style>
path {
fill: blue;
}
path:hover {
fill: red;
}
a > path {
clip-path: url('#triangle-clip');
}
</style>
<a target="_parent" href="/test">
<path id="triangle" d="M150 0 L75 200 L225 200 Z">
<title>Triangle</title>
</path>
</a>
<clipPath id="triangle-clip">
<use href="#triangle" />
</clipPath>
</svg>
正如@Robert Longson 指出的那样,您的初始代码存在递归问题。
本质上,你是在自己剪裁一个 svg 路径(三角形)(......仍然需要自己定义) - 导致与 'unclipped' 版本完全相同的形状。
但是,由于您已经使用了 <use>
元素,重新排序您的路径和剪切路径定义 - 避免不必要的递归 - 可能仍会简化您的应用代码。
<svg xmlns="http://www.w3.org/2000/svg" height="210" width="400">
<clipPath id="triangle-clip">
<path id="triangle-path" d="M150 0 L75 200 L225 200 Z" />
</clipPath>
<style>
.link-content {
fill: blue;
clip-path: url('#triangle-clip');
}
a:hover .link-content{
fill: red;
}
</style>
<a class="link" target="_parent" href="/test">
<title>Triangle</title>
<use class="link-content" href="#triangle-path" />
</a>
</svg>