首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SMIL动画不会以Mouseout结尾

SMIL动画不会以Mouseout结尾
EN

Stack Overflow用户
提问于 2018-05-03 22:31:41
回答 1查看 296关注 0票数 2

我试图制作一个SVG图标,使用SMIL动画(嗯,我不在乎它是SMIL还是CSS,我只是不想使用JS),我已经走了很远,但我遇到了一个问题,我没有找到答案,甚至在网上提到。动画从鼠标悬停(鼠标悬停)开始,但在鼠标操作时,动画元素之一(第二圈)保持动画,我完全不知道为什么。

你也可以在https://codepen.io/anon/pen/LmjpVQ上看到它

谢谢你能提前提供的任何帮助。

代码语言:javascript
复制
svg { width: 100px; color: red; }
代码语言:javascript
复制
<svg id="location" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60">
<defs>
    <clipPath id="circleClip">
        <path d="M49,19c0,7-12,26-18.97,26C23,45,12,26,12,19H49z M72-12h-84v84h84V-12z" />
    </clipPath>
</defs>
<g clip-path="url(#circleClip)">
    <g transform="matrix(1, 0, 0, 0.43999, 0, 25.2)">
        <circle transform="rotate(-90, 30, 47)" fill="none" stroke="currentColor" stroke-width="2" cx="30" cy="47" r="14">
          <animate attributeType="XML" attributeName="r" from="0" to="20" begin="location.mouseover" end="location.mouseout" dur="3s" repeatCount="indefinite" />
          <animate attributeType="CSS" attributeName="opacity" from="1" to="0" begin="location.mouseover" end="location.mouseout" dur="3s" repeatCount="indefinite" />
      </circle>
        <circle transform="rotate(-90, 30, 47)" fill="none" stroke="currentColor" stroke-width="2" cx="30" cy="47" r="0">
          <animate ttributeType="XML" attributeName="r" from="0" to="20" begin="location.mouseover+2s" end="location.mouseout" dur="3s" repeatCount="indefinite" />
          <animate attributeType="CSS" attributeName="opacity" from="1" to="0" begin="location.mouseover+2" end="location.mouseout" dur="3s" repeatCount="indefinite" />
      </circle>
    </g>
</g>

    <path fill="currentColor" stroke="currentColor" stroke-width="0" d="M30,7c7.18,0,13,5.82,13,13S30,45,30,45S17,27.18,17,20S22.82,7,30,7z" />
    <path fill="#fff" stroke-width="0" d="M30,15c2.76,0,5,2.24,5,5s-2.24,5-5,5c-2.76,0-5-2.24-5-5S27.24,15,30,15" />

</svg>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-03 22:55:43

您遇到的陷阱是,与HTML元素不同,只有当指针位于绘制的区域(笔画或填充)上时,鼠标事件才会作为默认事件引发。但是,无论opacity设置为什么。您甚至可以微调pointer-events以包括或排除visibility: hiddenfill: none的事件。

每次动画通过指针下的传播圈时,都会引发mouseover事件,使用pointer-events:all可以防止鼠标在内部结束时的mousout,但只在动画重复重置半径之前。这让事情变得很混乱。

最简单的解决方案是在整个图标的顶部放置一个不可见的opacity="0",以便为“内部”和“外部”定义明确的边界。要了解更多细节,请定义一个形状,该形状涵盖要捕获鼠标移动的区域。

代码语言:javascript
复制
svg { width: 100px; color: red; }
代码语言:javascript
复制
<svg id="loc" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60">
<defs>
    <clipPath id="c">
        <path d="M49,19c0,7-12,26-18.97,26C23,45,12,26,12,19H49z M72-12h-84v84h84V-12z" />
    </clipPath>
</defs>
<g clip-path="url(#c)">
    <g transform="matrix(1, 0, 0, 0.43999, 0, 25.2)">
        <circle transform="rotate(-90, 30, 47)" fill="none" stroke="currentColor" stroke-width="2" cx="30" cy="47" r="14">
          <animate attributeType="XML" attributeName="r" from="0" to="20" begin="loc.mouseover" end="loc.mouseout" dur="3s" repeatCount="indefinite" />
          <animate attributeType="CSS" attributeName="opacity" from="1" to="0" begin="loc.mouseover" end="loc.mouseout" dur="3s" repeatCount="indefinite" />
      </circle>
        <circle transform="rotate(-90, 30, 47)" fill="none" stroke="currentColor" stroke-width="2" cx="30" cy="47" r="0">
          <animate ttributeType="XML" attributeName="r" from="0" to="20" begin="loc.mouseover+2s" end="loc.mouseout" dur="3s" repeatCount="indefinite" />
          <animate attributeType="CSS" attributeName="opacity" from="1" to="0" begin="loc.mouseover+2" end="loc.mouseout" dur="3s" repeatCount="indefinite" />
      </circle>
    </g>
</g>

    <path fill="currentColor" stroke="currentColor" d="M30,7c7.18,0,13,5.82,13,13S30,45,30,45S17,27.18,17,20S22.82,7,30,7z" />
    <path fill="#fff" d="M30,15c2.76,0,5,2.24,5,5s-2.24,5-5,5c-2.76,0-5-2.24-5-5S27.24,15,30,15" />
    <rect opacity="0" width="100%" height="100%" />
</svg>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50164678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档