【问题标题】:Animated Heart icon动画的心图标
【发布时间】:2017-10-26 03:41:41
【问题描述】:

所以我目前正在尝试为 SVG 图标制作动画。我有一颗心,周围有几行线。默认情况下,我希望心脏只有一个轮廓,然后在点击时更改背景颜色(我有这个工作)。

我正在努力的部分只是在点击时显示心脏周围的线条。我知道这很简单,但我似乎无法理解它。在我的 CSS 中,我默认设置了 .lines{display: none},我还创建了一个类 .lines-show{fill: red},我希望它们在点击心脏时显示出来。然后我将使用 setTimeout() 函数在 X 秒后隐藏行。如果这有帮助,这是我的 codepen 的链接https://codepen.io/Brushel/pen/xXvqgK?editors=1111 这是我到目前为止的代码:

const lines = document.querySelectorAll(".lines");
const heart = document.querySelector('.heart');

heart.addEventListener('click', function(){
  heart.classList.toggle("heart-fill-up");
});
svg {
  max-height: 100px;
}

.heart {
  fill: transparent;
  transition: all .5s;
}

.heart-fill-up {
  fill: red;
}

.lines {
  display: none;
}

.lines-show {
  fill: red;
}
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 298 281" style="enable-background:new 0 0 298 281;" xml:space="preserve">
<style type="text/css">
	.heart{
    stroke:#FF0606;
    stroke-miterlimit:10;
    stroke-width: 5px;
  }
</style>
<title>icon_wishlist</title>
<g id="icon_wishlist">
	<path class="heart" d="M66.3,69.4c-19.1,20-19.1,51.5,0,71.5l84.6,87.9l84.7-87.8c19.1-20,19.1-51.5,0-71.5
		c-18-19.1-48.1-19.9-67.2-1.8c-0.6,0.6-1.2,1.2-1.8,1.8L151,85.7l-15.6-16.2c-18-19.1-48.1-19.9-67.2-1.8
		C67.6,68.2,67,68.8,66.3,69.4L66.3,69.4z"/>
</g>
<path class="lines" d="M58.1,60.6L9.4,22.1c-1.5-1.2-1.8-3.4-0.6-4.9l0,0c1.2-1.5,3.4-1.8,4.9-0.6l48.6,38.5c1.5,1.2,1.8,3.4,0.6,4.9
	l0,0C61.8,61.5,59.6,61.8,58.1,60.6z"/>
<path class="lines" d="M265.4,237l-48.6-38.5c-1.5-1.2-1.8-3.4-0.6-4.9v0c1.2-1.5,3.4-1.8,4.9-0.6l48.6,38.5c1.5,1.2,1.8,3.4,0.6,4.9
	l0,0C269.1,237.9,266.9,238.2,265.4,237z"/>
<path class="lines" d="M40.1,230.6L88,191.3c1.5-1.2,3.7-1,4.9,0.5v0c1.2,1.5,1,3.7-0.5,4.9l-47.9,39.3c-1.5,1.2-3.7,1-4.9-0.5l0,0
	C38.4,234.1,38.6,231.9,40.1,230.6z"/>
<path class="lines" d="M236.7,54.8l46-41.6c1.4-1.3,3.7-1.2,4.9,0.2v0c1.3,1.4,1.2,3.7-0.2,4.9l-46,41.6c-1.4,1.3-3.7,1.2-4.9-0.2v0
	C235.2,58.3,235.3,56.1,236.7,54.8z"/>
<path class="lines" d="M16.9,139.2h34c1.9,0,3.5,1.6,3.5,3.5v0c0,1.9-1.6,3.5-3.5,3.5h-34c-1.9,0-3.5-1.6-3.5-3.5v0
	C13.4,140.7,15,139.2,16.9,139.2z"/>
<path class="lines" d="M249.8,139.2h34c1.9,0,3.5,1.6,3.5,3.5v0c0,1.9-1.6,3.5-3.5,3.5h-34c-1.9,0-3.5-1.6-3.5-3.5v0
	C246.3,140.7,247.8,139.2,249.8,139.2z"/>
<path class="lines" d="M154.5,237.3v34c0,1.9-1.6,3.5-3.5,3.5l0,0c-1.9,0-3.5-1.6-3.5-3.5v-34c0-1.9,1.6-3.5,3.5-3.5l0,0
	C152.9,233.8,154.5,235.4,154.5,237.3z"/>
<path class="lines" d="M154.5,20.3v34c0,1.9-1.6,3.5-3.5,3.5l0,0c-1.9,0-3.5-1.6-3.5-3.5v-34c0-1.9,1.6-3.5,3.5-3.5l0,0
	C152.9,16.8,154.5,18.4,154.5,20.3z"/>
</svg>

这是我在click 上想要的结果

【问题讨论】:

    标签: javascript html css animation svg


    【解决方案1】:

    由于您有多个元素“行”,因此无论何时您想要切换它们的类,都需要单独对它们中的每一个进行排序(我使用了 for 循环来执行此操作)。我还添加了一个 setTimeOut 以在 1000 毫秒后删除它们。

    http://jsfiddle.net/jnqzoq1g/

    const lines = document.querySelectorAll(".lines");
    const heart = document.querySelector('.heart');
    
    heart.addEventListener('click', function(){
        heart.classList.toggle("heart-fill-up");
        for (var x = 0; x < lines.length; x++){
          lines[x].classList.toggle("lines-show");
        }
        setTimeout(function(){ 
          for (var x = 0; x < lines.length; x++){
            lines[x].classList.toggle("lines-show");
          }  
        }, 1000);
    });
    
    .lines {
      fill: transparent;
      transition: all .5s;  
    }
    
    .lines-show {
      fill: red;
    

    【讨论】:

    • 非常感谢,我想我必须以某种方式创建一个循环来获得不同的路径。这很有帮助!
    • 你把这件事弄得太复杂了。您不需要单独切换心脏和所有线条。只需在&lt;svg&gt; 本身上切换一个类,并以此为基础设置所有子类的样式。 Like this
    【解决方案2】:

    编辑想要的结果:

    您可以通过使用document.getElementsByClassName("lines"); 获取所有行来遍历数组中的所有行,如果将其转换为数组,则可以这样做

    Array.from(document.getElementsByClassName("lines")).forEach( line => {
        line.style.display = "block";
    });
    

    您可以通过将切换包装在 setInterval 中来重复切换。

    let interval = setInterval( () => {
        heart.classList.toggle("heart-fill-up");
    }, 1000);
    

    如果不想用javascript的话,可以用一个css动画集来重复

    @keyframes heart {
      0% {
        fill: transparent; 
      }
      100% {
        fill: red;
      }
    }
    

    并将其应用到你的心脏

    animation: heart 1s infinite
    

    【讨论】:

    • 我刚刚编辑了我的帖子。你可以看到我想要的结果的图片。我不想让它脉搏,而是基本上在点击时显示心脏周围的线条
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2011-05-30
    相关资源
    最近更新 更多