gpt4 book ai didi

Javascript 动画不按预期方式运行

转载 作者:行者123 更新时间:2023-11-29 21:51:59 25 4
gpt4 key购买 nike

我想创建一个简单的动画,其中矩形的长度在“鼠标悬停”事件发生时平滑地变为其值的一半,并在“鼠标移出”事件发生时再次加倍。如果鼠标移动缓慢,则以下代码有效,但如果鼠标快速移动,则无效。如果鼠标快速移动,矩形就会卡住。请建议如何克服这个问题。

<body>
<svg id="svg" width="600" height="100">
<rect id="myrect" width="600" height="100" fill="green">
</svg>
<script>
svg = document.getElementById("svg");
var w = 600;
var step = 10;

svg.addEventListener("mouseover", function(){
function anim () {
w -= step;
if( w >= 300) {
myrect = document.getElementById("myrect");
myrect.setAttribute("width", w);
requestAnimationFrame(anim);
}
}
anim();
});

svg.addEventListener("mouseout", function(){
function anim () {
w += step;
if( w <= 600) {
myrect = document.getElementById("myrect");
myrect.setAttribute("width", w);
requestAnimationFrame(anim);
}
}
anim();
});
</script>
</body>

最佳答案

今天,请不要为这种动画使用 JavaScript。CSS Transitions 就是为此而生的——它们表现出更好的性能,因为大多数浏览器可以在图形卡而不是 CPU 上更快地计算它们。

有关详细信息,请参阅 W3C School on CSS Transitions

因此,您的示例的改进版和短版看起来像

#myrect {
transition: transform 0.5s ease;
}
#myrect:hover {
transform: scale(0.5, 1.0);
}
<svg id="svg" width="600" height="100">
<rect id="myrect" width="600" height="100" fill="green" />
</svg>

注意:您似乎无法像以前那样通过简单的 CSS 为 SVG 的“宽度”属性设置动画。为了便于处理,您可以使用 translate-property 并将其缩放为宽度的 50%。

(好的,根据 SVG Standard - Section Attributes ‘width’ 可以使用更复杂的 SVG 动画逻辑进行动画处理,但 CSS 看起来更简单,并且这些知识也可以应用于 HTML 元素:-))

关于Javascript 动画不按预期方式运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28660868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com