【问题标题】:Target animation-play-state on sibling hover兄弟悬停时的目标动画播放状态
【发布时间】:2018-05-10 08:01:26
【问题描述】:

当我将鼠标悬停在某个元素上时,我正在尝试为该元素周围的 SVG 路径设置动画。

我用这样的 CSS 编写动画:

 #circle-1 {
    fill-opacity: 0;
    fill: transparent;
    stroke: #000;
    stroke-width: 1;
    stroke-dasharray: 163px;
    stroke-dashoffset: 163px;
    animation-name: circle;
    animation-duration: 4000ms;
    animation-iteration-count: 1;
    animation-play-state: paused;
}

@keyframes circle {
    to {
        stroke-dashoffset: 0;
    }
}

效果很好。当我尝试像这样在兄弟元素悬停时触发动画时,它会停止工作:

HTML

<h1 id="link-1">#1</h1>
<svg width="57px" height="46px" viewBox="0 0 57 46" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g id="circle-1">
        <path d="M1252.39102,182.674299 C1222.56333,182.674299 1186.23852,210.300373 1230.21581,223.998154 C1278.92632,239.170208 1268.93364,185.408886 1243.06946,182.674299" id="Path-3"></path>
    </g>
</svg>

CSS

#circle-1 {
    fill-opacity: 0;
    fill: transparent;
    stroke: #000;
    stroke-width: 1;
    stroke-dasharray: 163px;
    stroke-dashoffset: 163px;
    animation-name: circle;
    animation-duration: 4000ms;
    animation-iteration-count: 1;
    animation-play-state: paused;
}

#circle-1.active {
    animation-play-state: running;
}

@keyframes circle {
    to {
        stroke-dashoffset: 0;
    }
}

JS

window.onload = function() {
    var circle1 = document.getElementById("circle-1");
    var link1 = document.getElementById("link-1");
    for (var i = 0; i < circle1.length; i++) {
         link1[i].addEventListener('mouseover', function() {
             circle1.classList.add('active');
             return false;
         });
    }
};

在此处查看代码: https://codepen.io/louden/pen/YLeBXB

我不想使用 jQuery。

【问题讨论】:

  • 点击不是悬停,对吧?
  • 为什么还要为 getElementById 使用 for 循环?
  • @TemaniAfif mouseover 而不是 click,我会修复它。我不是很擅长 JS 这就是为什么哈哈
  • 你的 SVG 有问题,路径中使用的值很大并且超出了视图框......形状是什么?
  • 我添加了原始代码,现在应该可以使用了

标签: javascript html css svg


【解决方案1】:

几个问题:

var circle1 = document.getElementById("circle-1");

返回一个路径元素。那么for (var i = 0; i &lt; circle1.length; i++) { 是什么意思? 应该在那里做?使用getElementsByTagName 等作为列表...

你的路径 d 属性扩展了 svg,所以要扩展 svg,首先清除所有过时的 widht/height 属性。使用viewBox 属性和preserveAspectRatio="none"。这样你就可以控制纵横比。使用 css 作为宽度和高度。

一个工作小提琴:

https://jsfiddle.net/ibowankenobi/40p2fqgc/1/

无限动画:https://jsfiddle.net/ibowankenobi/40p2fqgc/2/

<h1 id="link-1">#1</h1>
<svg viewBox="0 0 2000 2000" preserveAspectRatio="none" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <path id="circle-1" d="M1252,182 C1222,182 1186,210 1230,223 C1278,239 1268,185 1243,182"/>
</svg>

这是针对您拥有的点击处理程序的:

https://jsfiddle.net/ibowankenobi/40p2fqgc/10/

附带说明,getElementsByTagName 已上线,因此您无需再次调用它。

这是一个鼠标悬停的取消动画:

https://jsfiddle.net/ibowankenobi/40p2fqgc/15/

【讨论】:

  • 好吧,我想你已经很接近了。我摆脱了 for 循环并添加了一些你的 JS。问题是动画没有在鼠标悬停时结束。看看:codepen.io/louden/pen/zjRbgv
  • 是的,那是因为您没有指定希望它在鼠标移出时消失。这是那个:jsfiddle.net/ibowankenobi/40p2fqgc/15
  • 我删除了鼠标移出的类。但它仍然不起作用。您发送的小提琴也没有。
  • 这不是真的。刚刚在chrome和firefox上测试过。如果单击#1,它将开始绘制。如果您从 #1 鼠标移出,它将消失。你想让动画暂停还是回到开头??
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 2015-08-17
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2015-08-28
相关资源
最近更新 更多