如何使用淡入淡出改变图像
Posted
技术标签:
【中文标题】如何使用淡入淡出改变图像【英文标题】:How to change image with fading 【发布时间】:2020-02-18 19:13:13 【问题描述】:我对 js 和 jquery 还很陌生,我正在尝试用我的 Rails 应用程序做一些非常简单的事情:我想每 3 秒在 2 张图像之间切换,并带有淡入淡出的效果。当然,这个问题已经在 *** 上提出过,但很遗憾,我无法让它为我工作。
我的徒劳尝试是基于这两个问题:
Change image in html page every few seconds(不褪色自动变化)
fade changing image every n seconds(自动淡入淡出)
我设法让它通过自动更改工作,但没有任何淡入淡出效果。这是我的代码:
HTML 代码(位于视图页面中,比如 index.html.erb)
<div class="container p-5">
<div class="row">
<div class="col">
<h2 class="display-5 mb-4">Title here</h2>
<p class="lead">Lead</p>
</div>
<div class="col">
<img id="img" src="http://localhost:3000/images/pdf_template.png" />
</div>
</div>
</div>
jquery 代码(位于我的 application.html.erb 文件的头部)
<script type = "text/javascript">
function displayNextImage()
x = (x === images.length - 1) ? 0 : x + 1;
document.getElementById("img").src = images[x];
function startTimer()
setInterval(displayNextImage, 3000);
var images = [], x = -1;
images[0] = "http://localhost:3000/images/pdf_template.png";
images[1] = "http://localhost:3000/images/watermark_template.png";
</script>
为了让它工作,我将 body 标签从 <body>
更改为 <body onload = "startTimer()">
使用前面的代码,我有一个每 3 秒自动更改一次的图像。
然后我尝试使用我提供的第二个链接来实现淡入淡出效果,但没有成功。
HTML 代码当然是一样的。
jquery 代码
<script type = "text/javascript">
var images = [];
images[0] = "http://localhost:3000/images/pdf_template.png";
images[1] = "http://localhost:3000/images/watermark_template.png";
var x = 0;
setInterval(displayNextImage, 3000);
function displayNextImage()
x = x < images.length - 1 ? x : 0;
$("#img").fadeOut(300, function()
$(this).attr('src', images[x]).fadeIn(300);
)
x++;
</script>
这真的很奇怪,因为我在提供的第二个链接中使用了 jsfiddle 来测试我的 jquery 代码,它在那里完美运行。我怀疑我的 Rails 应用程序可能有问题,也许我没有将脚本放在正确的位置?目前,它在 head 标签中,但可能是错误的。
我正在使用 Rails 5.2.3、jquery-rails 4.3.5、jquery 3.2.1
任何帮助将不胜感激,谢谢。
【问题讨论】:
你的$(document).ready
声明在哪里(或者$(document).on "turbolinks:load"
如果你使用turbolinks
)?查看Working with Javascript in Rails 上的指南可能会有所帮助。
嗯,我什么都没做(老实说,直到你评论它我才知道它是什么)。我只是在 google 上查找它,如果我理解正确,它表明该页面已准备好执行 javascript,并且此声明中的代码只会运行一次。我不明白它对我有什么帮助。你能启发我吗?感谢@jvillian 的回答。
@jvillian 经过一些研究,问题确实来自缺少$(document).ready
块。现在一切正常(我为此打开了另一个问题)。感谢您的帮助!
【参考方案1】:
我最终使用了 JQuery .animate 函数,我想它也可能对你有用。
以下是我在更改图像控件的 src 属性时如何设法完成动画和淡入淡出效果的示例:
//Refresh the thumbnail
$(".photo-container").animate(
opacity: 0.10,
, 200, function ()
$(".photo-info").attr("src", photo);
ReloadGallery(currentContext); // Just showing extra logic can be use here...
).animate( opacity: 1 , 200);
它遵循三个步骤:
-
通过将不透明度降低到 0.10 淡出照片容器 div。
在执行第一步的不透明度更改操作的 200 毫秒后执行回调函数。此函数负责更改图像的 src 属性并刷新图库或您需要做的任何其他事情。
通过将容器的不透明度恢复为 1 来再次启动动画。
希望这能让你对如何让你的逻辑工作有一个可能的想法。
问候,
【讨论】:
非常感谢,它现在正在处理您的答案。在我的情况下,我没有使用ReloadGallery(currentContext);
。如果有人需要代码,请问我,我会在这里发布答案。
正确,在您的情况下不需要重新加载库,这只是我的示例的一部分,以显示额外的逻辑可以去那里。太好了!
我第一次运行它没有任何问题,但现在即使我没有进行任何更改,它也不再工作了。我检查了 Web 控制台并看到了这个错误:TypeError: $("#img").animate is not a function.
我调查了一下,发现实际上这是我的问题的根源,我上面发布的代码给了我同样的错误。我为此开了一个新问题,如果你有 5 分钟的时间,你可以检查一下 :) 谢谢***.com/questions/58510588/…
我分享的代码的想法是将动画动作应用于包含图像控件的容器。这样你就可以将容器隐藏一点,然后改变 src 属性值,将容器的不透明度恢复正常。以上是关于如何使用淡入淡出改变图像的主要内容,如果未能解决你的问题,请参考以下文章