gpt4 book ai didi

css - :focus/:hover for multiple instances of same icon 上的 clipPath 转换

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:37 25 4
gpt4 key购买 nike

我有一个 SVG 图标,其中包含一些蒙版形状:

  • book-1 : 被 clipPath 屏蔽 mask-1
  • book-2 : 被 clipPath 屏蔽 mask-2
  • book-3 : 未屏蔽,无需转换

关于 :focus/:hover我要mask-1 (但不是 book-1 )和 book-2 (但不是 mask-2 )进行转换。够直截了当……

<a href="whatevs" class="icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44">
<defs>
<style>
#book-1 {clip-path:url(#mask-1);}
#book-2 {clip-path:url(#mask-2);}
</style>

<clipPath id="mask-1">
<path class="nudge" fill="none" … />
</clipPath>
<clipPath id="mask-2">
<path fill="none" … />
</clipPath>
</defs>

<g id="book-1">
<path fill="#fff" … />
</g>
<g id="book-2">
<path fill="#fff" class="nudge" … />
</g>
<path fill="#fff" … /> <!-- book-3 -->
</svg>
</a>

/* CSS */

.icon .nudge {
transition: transform 0.2s ease-in;
}

.icon:focus .nudge,
.icon:hover .nudge {
transform: translate(-2px, 2px);
}

但是当一个页面中有多个相同图标的实例时,乐趣就开始了。


我在 CodePen 上有 3 支笔,每支都有 2 个链接图标实例,其中:

  1. > MRYwBq 失败:
    • 每次出现时都说明完整 SVG 的详细代码
    • book-1 的类名和 book-2
    • 每个掩码实例的唯一 ID 名称:mask-1mask-2
  2. > qwEZrG 适用于:
    • 每次出现时都说明完整 SVG 的详细代码
    • 书籍和面具的每个实例的唯一 ID 名称:book-1 , mask-1 , book-2mask-2
  3. > gybrvL 失败:
    • 一个<symbol>通过 <use> 迭代的图标实例在页面中

想法

  1. 这很奇怪。我想了解为什么它会以这种方式失败。
  2. 这很好,但我不希望在将 ID 发送到未区分的页面后使用 JavaScript 重复这些 ID。
  3. 这就是我想要的工作,但我不知道这是否可能。

最佳答案

clip-path需要 svg 的 ID def child ,只有其中一个<clipPath>如果一个页面上放置了多个图标,则将考虑定义。这就是转换 <clipPath> 的原因elements 是不行的,因为所有引用它的元素都会受到影响。因此,我们需要一个不会根据 :hover 移动或修改这些元素的解决方案。的 :focus .

幸运的是,可以使用以下技巧“不”移动元素本身而只移动分配给元素的剪切路径:

  1. 将剪辑路径分配给父级
  2. 沿剪辑路径应移动的方向移动父对象
  3. 让所有 child 朝相反的方向移动

可以在下面的代码片段中找到基于您提供的代码的此技巧的示例:

a .nudge, a .unnudge {
transition: transform 0.2s ease-in;
}

a:focus,
a:hover {
background-color: black;
}

a:focus .nudge,
a:hover .nudge {
transform: translate(-2px, 2px);
}

a:focus .unnudge,
a:hover .unnudge {
transform: translate(2px, -2px);
}


* {
box-sizing: border-box;
}

a {
display: block;
background-color: red;
padding: 0.5rem;
border-radius: 50%;
transition: background-color 0.2s ease-in;
width: 60px;
height: 60px;
}

body {
font-family: sans-serif;
line-height: 1.5;
max-width: 36em;
color: #333;
}

code {
background: #e5e5e5;
font-size: 1.125em;
border-radius: 2px;
}
<p>Instance 1: 
<a href="#">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44" width="44" height="44">
<defs>
<style>
.book-1{clip-path:url(#mask-1-1);}
.book-2{clip-path:url(#mask-2-1);}
</style>
<clipPath id="mask-1-1">
<path fill="none" d="M13.823,33.1V18.293a4.738,4.738,0,0,1,1.4-3.371S24.6,5.531,25.085,5.048L20.019-.019H8.143V33.1Z"/>
</clipPath>
<clipPath id="mask-2-1">
<path fill="none" d="M31.814,10.117,21.12,20.822a4.733,4.733,0,0,0-1.4,3.371V39H12V7H28.7Z"/>
</clipPath>
</defs>
<g class="nudge book-1" >
<path fill="#fff" class="unnudge" d="M22.736,5.72a1.193,1.193,0,0,0-1.686,0l-7.516,7.516a1.191,1.191,0,0,1-1.685-1.685l7.516-7.516a1.192,1.192,0,0,0-1.686-1.686L10.163,9.865h0a3.565,3.565,0,0,0-1.047,2.529h0V26.625h0a3.576,3.576,0,0,0,6.1,2.528h0l7.516-7.516a1.188,1.188,0,0,0,.349-.843V6.563A1.188,1.188,0,0,0,22.736,5.72Z"/>
</g>
<g class="book-2">
<path fill="#fff" class="nudge" d="M21.723,22.193a4.733,4.733,0,0,1,1.4-3.371l5.865-5.871v-.488a1.192,1.192,0,0,0-2.035-.843l-7.516,7.516a1.192,1.192,0,0,1-1.686-1.686l7.516-7.516a1.191,1.191,0,1,0-1.685-1.685l-7.516,7.516a3.561,3.561,0,0,0-1.048,2.528h0V32.524h0a3.577,3.577,0,0,0,6.105,2.529h0l.6-.6Z"/>
</g>
<path fill="#fff" d="M34.535,17.52a1.19,1.19,0,0,0-1.685,0l-7.516,7.516a1.192,1.192,0,0,1-1.686-1.686l7.516-7.516a1.192,1.192,0,1,0-1.686-1.685l-7.516,7.516h0a3.564,3.564,0,0,0-1.047,2.528h0V38.424h0a3.576,3.576,0,0,0,6.1,2.529h0l7.516-7.516a1.188,1.188,0,0,0,.349-.843V18.363A1.188,1.188,0,0,0,34.535,17.52Z"/>
</svg>
</a>
</p>
<p>Instance 2, exact copy of instance 1:
<a href="#">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44" width="44" height="44">
<defs>
<style>
.book-1{clip-path:url(#mask-1-1);}
.book-2{clip-path:url(#mask-2-1);}
</style>
<clipPath id="mask-1-1">
<path fill="none" d="M13.823,33.1V18.293a4.738,4.738,0,0,1,1.4-3.371S24.6,5.531,25.085,5.048L20.019-.019H8.143V33.1Z"/>
</clipPath>
<clipPath id="mask-2-1">
<path fill="none" d="M31.814,10.117,21.12,20.822a4.733,4.733,0,0,0-1.4,3.371V39H12V7H28.7Z"/>
</clipPath>
</defs>
<g class="nudge book-1" >
<path fill="#fff" class="unnudge" d="M22.736,5.72a1.193,1.193,0,0,0-1.686,0l-7.516,7.516a1.191,1.191,0,0,1-1.685-1.685l7.516-7.516a1.192,1.192,0,0,0-1.686-1.686L10.163,9.865h0a3.565,3.565,0,0,0-1.047,2.529h0V26.625h0a3.576,3.576,0,0,0,6.1,2.528h0l7.516-7.516a1.188,1.188,0,0,0,.349-.843V6.563A1.188,1.188,0,0,0,22.736,5.72Z"/>
</g>
<g class="book-2">
<path fill="#fff" class="nudge" d="M21.723,22.193a4.733,4.733,0,0,1,1.4-3.371l5.865-5.871v-.488a1.192,1.192,0,0,0-2.035-.843l-7.516,7.516a1.192,1.192,0,0,1-1.686-1.686l7.516-7.516a1.191,1.191,0,1,0-1.685-1.685l-7.516,7.516a3.561,3.561,0,0,0-1.048,2.528h0V32.524h0a3.577,3.577,0,0,0,6.105,2.529h0l.6-.6Z"/>
</g>
<path fill="#fff" d="M34.535,17.52a1.19,1.19,0,0,0-1.685,0l-7.516,7.516a1.192,1.192,0,0,1-1.686-1.686l7.516-7.516a1.192,1.192,0,1,0-1.686-1.685l-7.516,7.516h0a3.564,3.564,0,0,0-1.047,2.528h0V38.424h0a3.576,3.576,0,0,0,6.1,2.529h0l7.516-7.516a1.188,1.188,0,0,0,.349-.843V18.363A1.188,1.188,0,0,0,34.535,17.52Z"/>
</svg>
</a>
</p>

请注意,这个解决方案并不完美,具有两个相反运动的技巧应该总结为没有运动,可能会导致 .book-1 有点抖动。在某些浏览器(例如 Firefox)上。

关于css - :focus/:hover for multiple instances of same icon 上的 clipPath 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55457330/

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