You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为JS的changePicture函数添加fadeIn、fadeOut淡入淡出动画效果

实现方案

核心思路

  • 先预加载所有轮播图片,避免切换时因图片加载延迟出现灰色渐变底色
  • 通过CSS过渡实现淡入淡出效果,调整JS逻辑匹配动画时序,保证动画流畅执行

所需CSS代码

在你的样式文件中添加以下规则,和原有banner样式共存即可:

#banner {
    /* 0.5s是淡入淡出时长,可自行调整 */
    transition: opacity 0.5s ease;
}
#banner.fade-out {
    opacity: 0;
}

修改后的JS代码

let i = 0;
const images = [];
const slideTime = 3000; // 单张图片展示时长
const fadeTime = 500; // 和CSS中设置的过渡时长保持一致
const banner = document.getElementById('banner');

images[0] = 'images/banner-bg.jpg'
images[1] = 'images/banner-bg2.jpg'
images[2] = 'images/banner-bg3.jpg'
images[3] = 'images/banner-bg4.jpg'
images[4] = 'images/banner-bg5.jpg'

// 图片预加载逻辑,页面加载时就把所有轮播图存入缓存
const preloadImages = () => {
    images.forEach(imgUrl => {
        const img = new Image();
        img.src = imgUrl;
    })
}

function changePicture(){
    // 触发淡出动画
    banner.classList.add('fade-out');
    
    // 等待淡出动画完成后更换图片
    setTimeout(() => {
        // 替换背景图,已预加载无延迟
        banner.style.backgroundImage = `linear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)),url(${images[i]})`;
        // 触发淡入动画
        banner.classList.remove('fade-out');

        // 切换索引
        i = i < images.length - 1 ? i + 1 : 0;

        // 等待当前图片展示完成后执行下一轮切换
        setTimeout(changePicture, slideTime);
    }, fadeTime)
}

window.onload = () => {
    preloadImages();
    changePicture();
};

补充说明

  • 原有代码切换时出现灰色底色,是因为新图片还在加载中,浏览器只会先显示你设置的渐变层,预加载逻辑可以彻底解决这个问题
  • 如果你不想让opacity影响banner内部的文字内容,可以改成用两个重叠的banner层实现:下层放置即将显示的图片,上层放置当前显示的图片,只过渡上层的opacity即可

内容的提问来源于stack exchange,提问作者user15675489

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:54:09