js 实现图片向上滚动的平滑动画效果

详细描述:

创建一个 600px 的固定容器,添加一些图片,实现图片向上滚动,滚动完成后,删除最上面的图片。(平滑效果、滚动速度)

示例代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>滚动动画</title>
  <style>
    .container {
      height: 600px;
    }

    img {
      display: block;
      height: 600px;
    }
  </style>
</head>

<body>

  <script>
    // 创建一个固定高度的图片滚动容器
    const container = document.createElement('div');
    container.classList.add('container');

    // 将容器添加到 DOM 树中
    document.body.appendChild(container);

    // 创建图片元素
    function createImgElement(src) {
      const img = document.createElement("img");
      img.src = src;
      return img;
    }

    // 生成图片元素并添加到容器中
    const imgs = [
      createImgElement("img1.jpg"),
      createImgElement("img2.jpg"),
      createImgElement("img3.jpg"),
    ];
    const fragment = document.createDocumentFragment()
    imgs.forEach((img) => {
      fragment.appendChild(img);
    });
    container.appendChild(fragment)

    // 生成图片滚动函数
    function scrollImgs(container, imgs, speed) {
      // 定义当前滚动位置
      let currentPosition = 0;
      // 定义滚动动画变量
      let animationFrameId = null;

      function updateAnimate() {
        // 更新滚动位置
        currentPosition -= speed;
        container.style.transform = `translateY(${currentPosition}px)`;

        // 判断滚动动画是否完成
        if (currentPosition <= -imgs[0].height * 3) {
          // 从容器和数组中删除最上面的元素
          container.removeChild(imgs[0]);
          imgs.shift();
          // 停止滚动动画
          cancelAnimationFrame(animationFrameId);
          console.log("滚动完成后图片数组的长度:", imgs.length)
        } else {
          // 请求下一次滚动动画帧
          animationFrameId = requestAnimationFrame(updateAnimate);
        }
      }

      // 初始启动滚动动画
      animationFrameId = requestAnimationFrame(updateAnimate);
    }

    // 控制滚动速度(单位:像素/毫秒)
    const scrollSpeed = 3;

    console.log("滚动开始时图片数组的长度:", imgs.length)

    // 启动图片滚动
    scrollImgs(container, imgs, scrollSpeed);
  </script>
</body>

</html>

注意点:

  • document.createDocumentFragment():使用这个方法先创建文档片段,然后遍历完之后再将它添加到 DOM 树中,减少了对 DOM 的操作,提高性能。

  • requestAnimationFrame():这个方法用于请求浏览器在下一帧渲染之前执行指定的回调函数,可以实现平滑的动画效果。

  • cancelAnimationFrame():使用这个方法停止动画,当滚动完成后,即使停止动画,可以节省资源、避免不必要的更新,以免报错。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript(简称JS)是一种广泛应用于Web开发的脚本语言,它可以为网页添加动态功能和交互性。它是一种解释型语言,可以直接嵌入到HTML中,并由浏览器解释执行。 requestAnimationFrame是JavaScript提供的一个用于优化动画效果的方法。它通过浏览器的刷新频率来调用指定的回调函数,从而实现平滑动画效果。相比于使用setTimeout或setInterval方法来实现动画,requestAnimationFrame能够更好地利用浏览器的资源,提供更流畅的动画效果。 下面是一个使用requestAnimationFrame实现平滑滚动的示例代码: ```javascript function smoothScroll(targetPosition, duration) { const startPosition = window.pageYOffset; const distance = targetPosition - startPosition; let startTime = null; function animation(currentTime) { if (startTime === null) { startTime = currentTime; } const elapsedTime = currentTime - startTime; const scrollY = ease(elapsedTime, startPosition, distance, duration); window.scrollTo(0, scrollY); if (elapsedTime < duration) { requestAnimationFrame(animation); } } function ease(t, b, c, d) { t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; } requestAnimationFrame(animation); } // 使用示例 const button = document.querySelector('.scroll-button'); button.addEventListener('click', () => { smoothScroll(0, 1000); // 滚动到页面顶部,持续时间为1秒 }); ``` 上述代码中,smoothScroll函数接受两个参数:目标位置targetPosition和滚动持续时间duration。它通过计算起始位置startPosition、滚动距离distance和动画开始时间startTime来实现平滑滚动效果。在animation函数中,使用ease函数来计算当前滚动位置scrollY,并通过window.scrollTo方法实现滚动效果。如果动画未结束,则通过requestAnimationFrame方法递归调用animation函数,实现连续的帧动画效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值