Css SVG<;设置>;标签';s dur属性不设置动画

Css SVG<;设置>;标签';s dur属性不设置动画,css,svg,w3c,Css,Svg,W3c,我试图使用SVG标记来设置滚动动画,但即使我指定dur=“1s”,转换也是瞬时的(在Firefox、Safari、Opera和Chrome中) 我可以使用两个标记实现我想要的效果,但我希望能够将转换应用到多个元素,这些元素可能具有我想要保留的不同初始颜色(此方法要求我在第二个动画标记中指定初始颜色“红色”) 第一个代码段中的标记保留初始颜色,但过渡未设置动画。如果我对w3规范的理解是正确的,那么应该是-这看起来像是浏览器特有的bug,还是我误解了w3规范?有没有更好的方法来解决这个问题?

我试图使用SVG
标记来设置滚动动画,但即使我指定dur=“1s”,转换也是瞬时的(在Firefox、Safari、Opera和Chrome中)


我可以使用两个
标记实现我想要的效果,但我希望能够将转换应用到多个元素,这些元素可能具有我想要保留的不同初始颜色(此方法要求我在第二个动画标记中指定初始颜色“红色”)


第一个代码段中的
标记保留初始颜色,但过渡未设置动画。如果我对w3规范的理解是正确的,那么应该是-这看起来像是浏览器特有的bug,还是我误解了w3规范?有没有更好的方法来解决这个问题?

如中所述:

“set”元素提供了一种简单的方法,只需在指定的持续时间内设置属性的值 …
to=”“
指定“set”元素持续时间内属性的值

(我的重点。)

如您所见,
元素的
持续时间
不是过渡时间,而是应用效果的时间。如果删除
end
属性,您将看到颜色从红色变为绿色,持续1秒,变为原始值

有关更多详细信息,请阅读中的
元素


编辑:下面是一个使用自定义数据注释SVG元素的示例,以及一个使用该数据创建


悬停时更改颜色
圆{笔划:黑色;笔划宽度:2px}
圆圈:非([fill]){fill:purple}
var els=document.getElementsByTagName('*'),
y=‘yasashiku’;
对于(变量i=els.length;i--;){
var fillColor=els[i].getAttributeNS(y,'hoverAnimFillTo');
如果(填充颜色){
var dur=els[i].getAttributeNS(y,'hoverAnimDur')| |'0.1s';
createOn(els[i],“动画化”{
开始:'mouseover',
attributeType:'CSS',attributeName:'fill',
致:fillColor,
dur:dur,填充:“冻结”
});
createOn(els[i],“动画化”{
开始:'mouseout',
attributeType:'CSS',attributeName:'fill',
收件人:els[i].getAttribute('fill')| | computedStyle(els[i],'fill'),
dur:dur,填充:“冻结”
});
}
}
函数createOn(el、名称、属性){
var e=el.appendChild(document.createElements(el.namespaceURI,name));
for(attrs中的var name)e.setAttribute(name,attrs[name]);
返回e;
}
函数computedStyle(el,名称){
return document.defaultView.getComputedStyle(el,null)[name];
}
如中所述:

“set”元素提供了一种简单的方法,只需在指定的持续时间内设置属性的值 …
to=”“
指定“set”元素持续时间内属性的值

(我的重点。)

如您所见,
元素的
持续时间
不是过渡时间,而是应用效果的时间。如果删除
end
属性,您将看到颜色从红色变为绿色,持续1秒,变为原始值

有关更多详细信息,请阅读中的
元素


编辑:下面是一个使用自定义数据注释SVG元素的示例,以及一个使用该数据创建


悬停时更改颜色
圆{笔划:黑色;笔划宽度:2px}
圆圈:非([fill]){fill:purple}
var els=document.getElementsByTagName('*'),
y=‘yasashiku’;
对于(变量i=els.length;i--;){
var fillColor=els[i].getAttributeNS(y,'hoverAnimFillTo');
如果(填充颜色){
var dur=els[i].getAttributeNS(y,'hoverAnimDur')| |'0.1s';
createOn(els[i],“动画化”{
开始:'mouseover',
attributeType:'CSS',attributeName:'fill',
致:fillColor,
dur:dur,填充:“冻结”
});
createOn(els[i],“动画化”{
开始:'mouseout',
attributeType:'CSS',attributeName:'fill',
收件人:els[i].getAttribute('fill')| | computedStyle(els[i],'fill'),
dur:dur,填充:“冻结”
});
}
}
函数createOn(el、名称、属性){
var e=el.appendChild(document.createElements(el.namespaceURI,name));
for(attrs中的var name)e.setAttribute(name,attrs[name]);
返回e;
}
函数computedStyle(el,名称){
return document.defaultView.getComputedStyle(el,null)[name];
}
是否使用“值”和“关键时间”属性


是否使用“值”和“关键时间”属性



Repro cases:(在Safari和Firefox上都是如此)感谢您验证它在Safari中也不起作用;我刚刚在Opera和Chrome上进行了测试,我在那里也得到了同样的行为;我刚刚在Opera和Chrome上进行了测试,我在那里也得到了同样的表现;有没有想过如何在不事先知道初始颜色的情况下恢复?yasashiku个人认为,我只是想控制颜色或(更简单)根据属性动态创建
元素。如果这是你的一个选择(如果JS可用)并且你需要帮助,我可以用细节修改我的答案……不管怎样,我已经创建了一个示例并编辑了这个问题。有希望地
<html>
<body>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red">
        <set attributeType="CSS" attributeName="fill" to="green" begin="mouseover" end="mouseout" dur="1s" />
    </circle>
</svg> 

</body>
</html>
<html>
<body>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red">
        <animate attributeType="CSS" attributeName="fill" to="green" begin="mouseover" dur="1s" fill="freeze" />
        <animate attributeType="CSS" attributeName="fill" to="red" begin="mouseout" dur="1s" fill="freeze"/>
    </circle>
</svg> 

</body>
</html>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:y="yasashiku" viewBox="0 0 240 150">
  <title>Change Color on Hover</title>
  <style>
    circle { stroke:black; stroke-width:2px }
    circle:not([fill]) { fill:purple }
  </style>
  <circle cx="50"  cy="50"  r="40" fill="red"    y:hoverAnimFillTo="blue"  y:hoverAnimDur="0.3s" />
  <circle cx="100" cy="100" r="40" fill="red"    y:hoverAnimFillTo="green" y:hoverAnimDur="1s" />
  <circle cx="150" cy="42"  r="40" fill="orange" y:hoverAnimFillTo="yellow" />
  <circle cx="200" cy="100" r="40"               y:hoverAnimFillTo="steelblue" />
  <script>
    var els = document.getElementsByTagName('*'),
        y   = 'yasashiku';
    for (var i=els.length;i--;){
      var fillColor = els[i].getAttributeNS(y,'hoverAnimFillTo');
      if (fillColor){
        var dur = els[i].getAttributeNS(y,'hoverAnimDur') || '0.1s';
        createOn(els[i],'animate',{
          begin:'mouseover',
          attributeType:'CSS', attributeName:'fill',
          to:fillColor,
          dur:dur, fill:'freeze'
        });
        createOn(els[i],'animate',{
          begin:'mouseout',
          attributeType:'CSS', attributeName:'fill',
          to:els[i].getAttribute('fill') || computedStyle(els[i],'fill'),
          dur:dur, fill:'freeze'
        });
      }
    }
    function createOn(el,name,attrs){
      var e = el.appendChild(document.createElementNS(el.namespaceURI,name));
      for (var name in attrs) e.setAttribute(name,attrs[name]);
      return e;
    }
    function computedStyle(el,name){
      return document.defaultView.getComputedStyle(el,null)[name];
    }
  </script>
</svg>