SVG线交叉动画的图标

时间:2018-07-07 00:37:52

标签: css animation svg

我有两个icons,一个处于原始状态,一个处于交叉状态。 我想设置交叉线的动画,但是更改dash-offset并没有用,因为它们是两个不同的svg。

我正在查看these动画图标,但仍然无法弄清魔术部分。我想问:

  • 过渡工作流程应该是什么?
  • 我更喜欢使用纯CSS,这可能吗?

一个工作示例将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用CSS的方法。

您只需显示/隐藏要悬停的图标即可。要为线条设置动画,请使用stroke-dasharraystroke-dashoffset的CSS动画。代码注释。

/* for demo */
svg {
  width: 100px;
  height: 100px;
  border: 1px solid black;
} 

/* hide the off icon */
svg .off {
  opacity: 0;
}

/* when user hovers SVG, the on icon is hidden... */
svg:hover .on {
  opacity: 0;
}

/* ... and the off icon is shown */
svg:hover .off {
  opacity: 1;
}

/* initial values for the stroke
   -- these can be obtained with JS, 
   -- or you can work them out manually for CSS
*/

svg .line {
  stroke-dashoffset: 40px;
  stroke-dasharray: 40px;
}

/* when user hovers SVG, animate the line */
svg:hover .line {
  animation: addLine 800ms forwards;
}

/* values for line animation */
@keyframes addLine {
  from {
    stroke-dashoffset: 40px;
  }
  to {
    stroke-dashoffset: 0;
  }
}
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 
    <g class="on">
      <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
      <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
      <line x1="12" y1="19" x2="12" y2="23"></line>
      <line x1="8" y1="23" x2="16" y2="23"></line>
    </g>
    <g class="off">
      <line class="line" x1="1" y1="1" x2="23" y2="23"></line>
      <path d="M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6"></path>
      <path d="M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23"></path>
      <line x1="12" y1="19" x2="12" y2="23"></line>
      <line x1="8" y1="23" x2="16" y2="23"></line>
    </g>
</svg>

答案 1 :(得分:1)

该页面上的动画图标非常复杂(更多的是它们必须是IMO)。但是基本上,他们正在做的是从右向左滑动一个矩形遮罩,该遮罩覆盖了第一个图标,并露出了第二个图标。

这是使用纯CSS的简化版本,希望可以使其更加清晰。

svg {
  width: 100px;
  height: 100px;
}

/* slides the two masks to the left on hover */
svg:hover #bottom-rect,
svg:hover #top-rect
{
  transition: transform 500ms;
  transform: translate(-24px, 0px);
}

/* slides the two masks back to the right when not hovered */
svg #bottom-rect,
svg #top-rect {
  transition: transform 500ms;
  transform: translate(0px, 0px);
}
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
    <defs>
        <mask id="bottom">
          <rect id="bottom-rect" width="24" height="24" fill="white" stroke="none"/>
        </mask>
        <mask id="top">
          <rect id="top-rect" x="24" width="24" height="24" fill="white" stroke="none"/>
        </mask>
    </defs>    
   
    <g mask="url(#bottom)">
      <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
      <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
      <line x1="12" y1="19" x2="12" y2="23"></line>
      <line x1="8" y1="23" x2="16" y2="23"></line>
    </g>
    <g mask="url(#top)">
      <line x1="1" y1="1" x2="23" y2="23"></line>
      <path d="M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6"></path>
      <path d="M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23"></path>
      <line x1="12" y1="19" x2="12" y2="23"></line>
      <line x1="8" y1="23" x2="16" y2="23"></line>
    </g>
</svg>