【问题标题】:javaScript is there a better way to make this animation?javaScript有没有更好的方法来制作这个动画?
【发布时间】:2023-03-21 06:22:01
【问题描述】:

我想做什么:
- 一个 JavaScript 动画(总共 114 帧),可以快速连续地将一张图像换成下一张。
-onmouseover 一个门的图像打开。 (播放 72 帧并停留在第 72 帧)
-onmouseout 门关闭。 (播放 42 帧并停留在最后一帧)
-如果在动画完成之前鼠标离开元素,它将完成72帧,然后播放42帧。
- 如果鼠标在 42 帧完成之前移回元素上,它将播放完 42 帧,然后播放 72 帧。

问题:
-我是 javaScript 的菜鸟,还没有完全理解它。
- 尽管它有点工作,但它非常有问题,你不能将鼠标从元素上移开而不弄乱动画。
-另外,我不知道如何让它完成上面列出的所有事情。

这是我现在拥有的代码:

HTML:  
<div onmouseover="openDoor()" onmouseout="closeDoor()" id="door2"></div>
<div id="door">
<img src="images/Animation_Door/0001.png">
<img src="images/Animation_Door/0002.png">
<img src="images/Animation_Door/0003.png">
...etc... (114 frames)
</div>

CSS:
#door {
background-color:transparent;
...etc...
}

.door img{
    display: none;
}

.door img:first-child {
display: block;
}


javaScript:
function openDoor() { 
var ti, frame = 0;
var frames = document.getElementById("door").children;
var frameCount = frames.length;

for (i=0; i<72; i++) {
ti = setTimeout(function(){
frames[i % frameCount].style.display = "none";
frames[++i % frameCount].style.display = "block";
}, 50*i);
}
}

function closeDoor() { 
var ti, frame = 0;
var frames = document.getElementById("door_close").children;
var frameCount = frames.length;

for (i=0; i<42; i++) {
setTimeout(function(){
frames[i % frameCount].style.display = "none";
frames[++i % frameCount].style.display = "block";
}, 50*i);
}
}

【问题讨论】:

  • 1.如果您将这 72 帧作为精灵放在一个物理图像文件中,而不是请求 72 个单独的图像文件,您的动画可能会更快、更流畅。
  • 2.为什么不只是一个 GIF 文件?
  • 我尝试做一个精灵,但由于我一般缺乏关于 javaScript 的知识而没有取得多大成功。它似乎作为单独的图像运行良好,但如果我能用一个精灵也能做到这一点也很棒。
  • 你能发一个小提琴吗?jsfiddle.net——这样我就可以看看它并推荐修复方法。甚至可以只用一个平面门图像和 css 转换来做到这一点。 :-)
  • 在这里,现在动画设置为 onClick。另外,我还没有完成最终结果的最终图像的渲染,所以现在 doorOpen() 和 doorClose() 都只有 41 帧,但最终它们将是我最初发布的内容。那里的很多代码都是我网站的其余部分,所以我为混乱的混乱道歉。 jsfiddle.net/reveries/a8Y9J

标签: javascript html css animation settimeout


【解决方案1】:

这应该会给你一些提示。

注意事项:

  • 仅使用 1 张图片 - 一扇平门(仅使用来自谷歌图片搜索的一些图片作为门 - 替换为您自己的)
  • 完全使用 CSS 转换处理动画

演示: http://jsfiddle.net/LA6VW/3/

HTML

<div class="doorframe">
    <div class="door"></div>
</div>

CSS

.doorframe {
    border: 1px solid black;
    display: inline-block;
}
.door {
    width: 60px;
    height: 140px;
    background-color: #ccc;
    border: 1px solid #444;
    -webkit-transform-origin: left;
    background-image: url("http://www.doorasia.in/images/gallery/moulded_door01.jpg");
    background-position: -49px -7px;
    background-size: 158px 155px;
}​

JS:

var animating = false;

$('.doorframe').mouseenter(function() {
    if(animating) return;
    var door = $('.door');
    animating = true;
    openDoor(door, 5);
});
$('.doorframe').mouseleave(function() {
    if(animating) return;
    var door = $('.door');
    animating = true;
    closeDoor(door, 90);
});

function openDoor(door, angle) {
    if(angle >= 90) {
        animating = false;
        return;        
    }
    door.css('-webkit-transform', 'perspective(200px) rotateY( '+angle+'deg )');
    setTimeout(function() {
        openDoor(door, angle+=5);
    }, 50);
}

function closeDoor(door, angle) {
    if(angle < 0) {
        animating = false;
        return;        
    }
    door.css('-webkit-transform', 'perspective(200px) rotateY( '+angle+'deg )');
    setTimeout(function() {
        closeDoor(door, angle-=5);
    }, 50);
}

​

【讨论】:

  • 大声笑,对不起,这根本不是我要找的。我不知道您是否在我的 jsfiddle 上看到了该图像,但这无法用一张图像复制。这是一个 3D 渲染,旨在通过焦散和照明以及所有内容看起来逼真。我要么需要使用精灵,要么一个接一个地加载单个图像。 (或我打算使用的所有 114 帧动画的其他方式)。这扇门也是一个 alpha 透明 png,这样我就可以让它看起来像是通向另一个世界的门。
  • 另外,你的门动画与我原来的帖子有很多相同的错误。
  • 啊……好吧。 :0) 现在 that 不能用 CSS 转换来完成。我刚刚在你的小提琴上看到了图像。我只能说,如果图像具有如此高的清晰度和尺寸,那么通过 JS/CSS 制作动画可能不是你最好的选择。
  • 您认为哪种语言更好用? (显然,除了 flash/action 脚本)我只知道 html、css、(一点)javaScript 和一些 php。但是,如果这能让我获得更好的结果,我愿意花时间学习另一种语言。
  • 动画现在运行良好,对我来说看起来足够流畅/不会冻结或其他任何东西。我的大问题只是编写一些代码告诉它始终完成当前正在运行的动画(即使鼠标离开元素/再次回来/等等......)然后如果它被触发则开始下一个动画。
【解决方案2】:

2 个选项:

2 个 GIF 动画

  • 1 个打开的动画 gif + 1 个关闭的动画 gif
  • 比精灵更快更小

缺点 - 可能会降低图像质量

css 精灵

  • 更复杂但保持图像质量
  • 比目前的情况更快

要更好地了解两者的优缺点,请参阅: Animated .GIF vs Spritesheet + JS/CSS

但我已经编写了一个图像差异器,它将获取 2 个图像之间的差异并使其余图像保持透明

http://www.murga-linux.com/puppy/viewtopic.php?t=81387

您可以在 css sprite 中使用并覆盖每个 sprite 以获得 gif 的好处和 png 的图像质量

这是一个非常通用的精灵生成器,我用 C 语言组合在一起

http://www.murga-linux.com/puppy/viewtopic.php?t=82009

【讨论】:

  • 我想我刚刚找到了实现我想要的最简单的方法...spritely.net
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2022-12-07
相关资源
最近更新 更多