悬停时的 SVG 不进行过渡

Posted

技术标签:

【中文标题】悬停时的 SVG 不进行过渡【英文标题】:SVG on hover not taking Transition 【发布时间】:2021-04-22 10:25:54 【问题描述】:

我正在尝试为需要更改 svg 路径的 SVG 设置动画。当我在那个时候悬停 svg 时,路径发生了变化,但是悬停时的转换不起作用。我需要在悬停时进行平滑过渡。

.btn 
  width: 200px;
  height: 48px;
  text-align: center;
  background-color: red;
  display: block;
  padding: 40px 20px;
  transition: all 0.5s


svg path 
  transition: d 0.8s;
  transition: all 0.5s


.btn:hover svg #ab 
  d: path("M11.5 1C11.5 0.723858 11.2761 0.5 11 0.5C10.7239 0.5 10.5 0.723858 10.5 1V10.5H1C0.723858 10.5 0.5 10.7239 0.5 11C0.5 11.2761 0.723858 11.5 1 11.5H10.5V21C10.5 21.2761 10.7239 21.5 11 21.5C11.2761 21.5 11.5 21.2761 11.5 21V11.5H21C21.2761 11.5 21.5 11.2761 21.5 11C21.5 10.7239 21.2761 10.5 21 10.5H11.5V1Z");
  d: "M11.5 1C11.5 0.723858 11.2761 0.5 11 0.5C10.7239 0.5 10.5 0.723858 10.5 1V10.5H1C0.723858 10.5 0.5 10.7239 0.5 11C0.5 11.2761 0.723858 11.5 1 11.5H10.5V21C10.5 21.2761 10.7239 21.5 11 21.5C11.2761 21.5 11.5 21.2761 11.5 21V11.5H21C21.2761 11.5 21.5 11.2761 21.5 11C21.5 10.7239 21.2761 10.5 21 10.5H11.5V1Z";
<a href="#" class="btn">
    <svg xmlns="http://www.w3.org/2000/svg"   viewBox="0 0 22 22" fill="none" id="svg-ax">
        <g class="main-arrow">
            <path class="arrow-changes" id="ab" fill-rule="evenodd" clip-rule="evenodd"
                d="M11.3536 0.646447C11.1583 0.451184 10.8417 0.451184 10.6464 0.646447C10.4512 0.841709 10.4512 1.15829 10.6464 1.35355L19.7929 10.5H1C0.723858 10.5 0.5 10.7239 0.5 11C0.5 11.2761 0.723858 11.5 1 11.5H19.7929L10.6464 20.6464C10.4512  20.8417 10.4512 21.1583 10.6464 21.3536C10.8417 21.5488 11.1583 21.5488 11.3536 21.3536L21.3536 11.3536L21.7071 11L21.3536 10.6464L11.3536 0.646447Z"
                fill="black" />
        </g>
    </svg>
</a>

我正在提供我编写代码的 codepen 链接。 https://codepen.io/bhavik1996/pen/oNzmBjR

【问题讨论】:

您通常无法向 SVG 添加过渡。很多人说他们用 CSS 关键帧成功了,但我没有亲自尝试过。 【参考方案1】:

我用@keyframs 找到这个动画答案

<style>
    .btn 
        width: 200px;
        height: 48px;
        text-align: center;
        background-color: red;
        display: block;
        padding: 40px 20px;
        transition: all 0.5s
    

    .btn:hover .arrow 
        animation: fram 0.2s ease alternate;
    

    @keyframes fram 
        0% 
            d: path("M11 1L21 11L11 21");
        

        25% 
            d: path("M11 1L19 11L11 21");
        

        50% 
            d: path("M11 1L16.5 11L11 21");
        

        75% 
            d: path("M11 1L14 11L11 21");
        

        100% 
            d: path("M11 1V11V21");
        
    
</style>

 <a href="#" class="btn">
    <svg xmlns="http://www.w3.org/2000/svg"   viewBox="0 0 22 22" fill="none" id="svg-ax">
        <path class="hori" d="M1 11H21" stroke="black" stroke-linecap="round" />
        <path class="arrow" d="M11 1L21 11L11 21" stroke="black" stroke-linecap="round" />
    </svg>
</a>

【讨论】:

【参考方案2】:

动画的问题在于 SVG 在 CSS 上的点数与在 html 中的点数不同。

<path class="arrow-changes" id="ab" fill-rule="evenodd" clip-rule="evenodd"
                    d="M31.181,8.504l28.56,22.677l-28.56,22.677"
                    stroke="black" />

和css:

        .btn:hover svg path  
            d: path("M31.181,8.504l0.72,22.677l-0.72,22.677");

我在codepen上做了一个非常简单的例子:

https://codepen.io/jaffa80/pen/poEGRBx

例如,要画直线,通常只需要两个点,但要将直线动画化,变成箭头,直线也必须有 3 个点。

简单地说,计算两条路径中的逗号。每个中的数字应该相同。

希望这是有道理的。

【讨论】:

感谢您的评论,这对我很有帮助

以上是关于悬停时的 SVG 不进行过渡的主要内容,如果未能解决你的问题,请参考以下文章

Safari 9.1.2 (11601.7.7) 中悬停时的 SVG 过渡失败

悬停时的 SVG 圆形动画不起作用

浏览器调整大小时的CSS转换“触发器”

使用 Tailwind 悬停时的 SVG 颜色填充

使用 CSS3 悬停时的背景图像不透明度过渡

鼠标悬停时的SVG工具提示?