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

如何实现Flickr首页式背景图片切换效果?

实现Flickr首页轮播效果的修正方案

要实现的轮播效果要求:

  • 首图以0.3秒时长向下滑入
  • 页面加载后每4秒自动切换图片,背景图过渡时长1秒
  • 按下左/右箭头键时,切换到上一张/下一张图片并触发下滑入动画
  • 手动操作后,图片需停留4秒,不受页面初始自动切换的间隔干扰

以下是修正后的完整代码:

HTML 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flickr 首页克隆</title>
    <link rel="stylesheet" href="test.css">
    <script src="test.js" defer></script>
</head>
<body>
    <div id="background"></div>
    <div id='grid'>
        <header>header</header>
        <main>main</main>
        <footer>footer</footer>
    </div>
</body>
</html>

CSS 代码

* {
  margin: 0;
  padding: 0;
}

body {
  background-color: rgb(50, 50, 50);
  display: grid;
}

#background {
  height: 100vh;
  width: 100%;
  background-image: url(./test_images/meditation.jpg);
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  background-attachment: fixed;
  /* 首图动画保留 */
  animation: slideIn 0.3s ease-out 1 forwards;
  /* 背景图过渡时长保留 */
  transition: background-image 1s ease;
  z-index: 0;
}

@keyframes slideIn {
  0% {
    transform: translateY(-100%);
  }
  100% {
    transform: translateY(0%);
  }
}

#grid {
  display: grid;
  grid-template-rows: 65px 1fr minmax(65px, auto);
  height: 100vh;
  width: 100%;
  z-index: 1;
}

header {
  background-color: rgba(0, 0, 0, .5);
  color: white;
}

main {
  color: white;
}

footer {
  color: white;
  background-color: black;
}

#grid, #background {
  grid-area: 1 / 1;
}

JavaScript 代码

let currentIndex = 0;
const backgroundImages = ['meditation.jpg', 'fish.jpg', 'fern.jpg', 'stars.jpg', 'northernLights.jpg', 'forest.jpg', 'mountains.jpg', 'horse.jpg', 'lion.jpg', 'engineer.jpg', 'computers.jpg'];
let slideTimer = null;

// 切换图片并触发动画
function switchImage(index) {
  const bgElement = document.getElementById('background');
  // 更新背景图
  bgElement.style.backgroundImage = `url(./test_images/${backgroundImages[index]})`;
  // 触发下滑入动画
  bgElement.animate([
    { transform: "translateY(-100%)" },
    { transform: "translateY(0%)" }
  ], {
    duration: 300,
    iterations: 1,
    easing: 'ease-out'
  });
}

// 自动切换逻辑
function autoSlide() {
  currentIndex = (currentIndex + 1) % backgroundImages.length;
  switchImage(currentIndex);
  // 重置定时器
  slideTimer = setTimeout(autoSlide, 4000);
}

// 初始化自动轮播
window.addEventListener('load', () => {
  slideTimer = setTimeout(autoSlide, 4000);
});

// 键盘事件处理
document.addEventListener('keydown', (event) => {
  // 仅处理左右箭头键
  if (!['ArrowLeft', 'ArrowRight'].includes(event.key)) return;

  // 清除当前定时器,避免干扰手动操作后的停留
  clearTimeout(slideTimer);

  // 更新索引
  if (event.key === 'ArrowLeft') {
    currentIndex = currentIndex === 0 ? backgroundImages.length - 1 : currentIndex - 1;
  } else if (event.key === 'ArrowRight') {
    currentIndex = (currentIndex + 1) % backgroundImages.length;
  }

  // 切换图片并触发动画
  switchImage(currentIndex);

  // 手动操作后重新启动自动轮播
  slideTimer = setTimeout(autoSlide, 4000);
});

关键修改说明

  1. 定时器管理:使用setTimeout替代setInterval,并保存定时器IDslideTimer,手动操作时清除旧定时器,避免多个定时器同时运行导致切换混乱。
  2. 统一切换逻辑:封装switchImage函数,负责更新背景图和触发动画,避免代码重复。
  3. 索引计算优化:使用取模运算简化索引循环逻辑,减少条件判断。
  4. 事件过滤:仅处理左右箭头键,避免其他按键触发不必要的操作。
  5. 动画一致性:确保手动切换和自动切换的动画参数一致,保持视觉效果统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:55:33