javascript - 我想随机化并添加平滑过渡到图像列表
问题描述
我目前正在循环一个图像列表。以下是我到目前为止所拥有的。我无法正确随机化列表。
另外,我该如何过渡到下一张图片。我希望我的图像平滑地淡入下一张图像,而不是快速将图像更改为下一张。
HTML
<div class="TestRotator">
<img height="170" id="rotator" class="img-fluid, image-hover" alt="Responsive image"/>
</div>
<script src="js_src/art-imagechanger.js"></script>
JS
(function () {
var rotator = document.getElementById("rotator");
var imageDir = ['https://vignette.wikia.nocookie.net/birds/images/0/09/Birds-01.jpg','https://nas-national-prod.s3.amazonaws.com/styles/hero_mobile/s3/h_a1_7443_5_painted-bunting_julie_torkomian_adult-male.jpg','https://www.allaboutbirds.org/news/wp-content/uploads/2020/07/STanager-Shapiro-ML.jpg',];
var i = 0;
function loop() {
if(i > (imageDir.length - 1)){
i = 0;
}
var r = rotator.src = imageDir[i];
Math.floor(Math.random() * r)
i++;
loopTimer = setTimeout(loop ,3000);
}
loop();
})();
解决方案
对于随机化,请查看此问题中 js 数组的 shuffle 函数。
至于淡入,这需要对您的 html 进行一些调整。您需要有 2 张图片 - 旧的和新的。
<img height="170" id="rotator-old" class="img-fluid, image-hover" />
<img height="170" id="rotator-new" class="img-fluid, image-hover" />
然后在你的js中,你需要改变每个类,并应用see来淡化不透明度。在你的 js 中:
var rotatorOld = document.getElementById("rotator-old");
var rotatorNew = document.getElementById("rotator-new");
var imageDir = [<image urls>];
var shuffledImages = shuffle(imageDir)
var i = 0;
function loop() {
// remove visibility from image being transitioned to
rotatorNew.classList.remove('visible')
if(i > (imageDir.length - 1)){
i = 0;
}
if (i > 0) { // starting from rest with the first image
// set image in the background to previous image
rotatorOld.src = shuffledImages[i-1]
}
// set image in the foreground to new image
rotatorNew.src = shuffledImages[i]
// add visibility class with css transition
rotatorNew.classList.add('visible')
i++;
loopTimer = setTimeout(loop ,3000);
}
loop();
在您的 css 中,在 2.5 秒延迟后以 0.5 秒转换转换不透明度:
#rotator-new {
opacity: 0;
}
#rotator-new.visible {
opacity: 1;
transition: opacity 500ms 2500ms // or whatever
}
您还需要使用一些 CSS 来确保新旧图像正确叠加。这可以通过将父级设置为拥有 aposition: relative;
并且每个子级设置img
为拥有来完成position: absolute; top: 0, bottom: 0; left: 0, right: 0;
。
我没有机会测试此代码,因此可能需要进行一些调整才能正常运行。但是,如果您使用一些示例图像制作代码沙盒或代码笔,我相信我们可以让它工作。如果不需要自己编写代码,我还建议寻找第 3 方库来为您处理此问题。这被称为轮播,而Boostrap是一个不错的选择,您可以使用它。
推荐阅读
- cpu-usage - 使用在线预测扩展 Google Cloud ML Engine。如何衡量节点利用率?
- java - SQLServerException: "[...] The index 1 is out of range [...]" when using NamedParameterJdbcTemplate
- c# - XamarinForms(Android)- InvalidOperationException:此操作仅对泛型类型有效。在 System.RuntimeType.GetGenericTypeDefinition()
- javascript - 如何在这样的嵌套数据中查找重复值
- unity3d - 如何知道旋转方向
- google-cloud-platform - 使用 CA 证书对设备公钥进行数字签名
- continuous-integration - 根据提交消息跳过 travis 中的脚本
- mysql - 用于汇总员工每周工作时间的 SQL 查询
- javascript - 在 javascript 中仅向数组的一个对象添加属性可以吗?
- android - 为什么我的 UI 在第一次运行后没有更新?(安卓)