原生js实现页面滚动动画

yizhihongxing

为了实现“原生js实现页面滚动动画”,我们需要以下步骤:

1. 监听页面滚动事件

在监听“页面滚动事件”之前,需要先获得“滚动高度”和“窗口可视高度”两个常量,以便后续的计算。这里的计算方法如下:

const scrollTop = window.pageYOffset || document.documentElement.scrollTop;   // 获取滚动高度
const windowHeight = window.innerHeight || document.documentElement.clientHeight;  // 获取窗口可视高度

在获得这两个常量之后,我们可以使用addEventListener()方法监听“页面滚动事件”,其中scroll事件就是滚动事件。

document.addEventListener('scroll', () => {
  // 处理滚动事件
});

2. 实现滚动动画

在监听到“页面滚动事件”之后,就需要根据滚动高度来控制对应元素的样式(如transformopacity等)以显示滚动动画。

实现滚动动画的方法有很多种,这里介绍两种常见的实现方式。

方式一:逐帧动画

逐帧动画是一种比较简单的动画方式,在该方式下,每一步都明确指定下一步的状态,以达到动画效果。大概的步骤如下:

  1. 获取需要操作的元素
  2. 计算元素应该处于的状态
  3. 使用requestAnimationFrame()函数监听浏览器的刷新频率,并以此更新元素的状态

下面是一段逐帧动画的示例代码:

// 获取需要操作的元素
const element = document.getElementById('target');

document.addEventListener('scroll', () => {
  // 计算元素应该处于的状态
  const targetOffsetTop = element.offsetTop;
  const targetOffsetBottom = targetOffsetTop + element.offsetHeight;
  const scrollBottom = scrollTop + windowHeight;

  if (scrollBottom > targetOffsetTop && scrollTop < targetOffsetBottom) {
    // 当元素进入可视区域内时,开始逐帧动画
    const start = performance.now();   // 记录开始时间

    const animate = timestamp => {
      const runtime = timestamp - start;   // 计算运行时长

      // 计算元素应该处于的状态
      const translateY = (1 - runtime / 1000) * 100;

      // 更新元素的状态
      element.style.transform = `translateY(-${translateY}px)`;

      if (runtime < 1000) {
        // 动画未结束时,递归调用requestAnimationFrame()函数
        requestAnimationFrame(animate);
      }
    };

    requestAnimationFrame(animate);
  } else {
    // 当元素离开可视区域时,恢复元素的原始状态
    element.style.transform = '';
  }
});

在以上代码中,我们首先使用getElementById()方法获取需要操作的元素,然后在监听到“页面滚动事件”时,计算出元素在当前状态下应该处于的位置,并使用requestAnimationFrame()函数来逐帧更新元素的状态。

逐帧动画的优点是实现简单,而且能够精确控制每一帧的状态。但是,需要注意的是,该方法的运行效率较低,在复杂的动画场景下可能出现卡顿现象。

方式二:CSS3动画

CSS3动画是一种比较流行的动画方式,通过CSS3中的transitionanimation属性,可以轻松地实现各种复杂的动画效果,而且具有较高的运行效率。

下面是一段CSS3动画的示例代码:

// 获取需要操作的元素
const element = document.getElementById('target');

// 为元素添加动画属性
element.style.transition = 'transform 1s linear';

document.addEventListener('scroll', () => {
  // 计算元素应该处于的状态
  const targetOffsetTop = element.offsetTop;
  const targetOffsetBottom = targetOffsetTop + element.offsetHeight;
  const scrollBottom = scrollTop + windowHeight;

  if (scrollBottom > targetOffsetTop && scrollTop < targetOffsetBottom) {
    // 当元素进入可视区域内时,添加动画类名
    element.classList.add('animated');
  } else {
    // 当元素离开可视区域时,移除动画类名
    element.classList.remove('animated');
  }
});

在以上代码中,我们首先使用getElementById()方法获取需要操作的元素,然后为元素添加了一个CSS3动画属性,其中transition属性用于指定动画效果,其后的1s表示动画运行时长,linear表示动画运动的速度。

在监听到“页面滚动事件”时,计算出元素在当前状态下应该处于的位置,并根据结果给元素添加或移除相应的类名。

CSS3动画的优点是实现简单,而且具有较高的运行效率。缺点是相对于逐帧动画来说,有一定的限制,不太适用于一些较为复杂的动画场景。

示例

下面是两个基于上述方法实现的示例:

示例一:逐帧动画

该示例实现了一个“上滑显示”效果,即当页面滚动到某个元素时,该元素会从下方逐渐滑入屏幕。

<div class="box" id="target"></div>
.box {
  height: 100px;
  background-color: #f00;
  margin-top: 500px;
}
const element = document.getElementById('target');

document.addEventListener('scroll', () => {
  const targetOffsetTop = element.offsetTop;
  const targetOffsetBottom = targetOffsetTop + element.offsetHeight;
  const scrollBottom = scrollTop + windowHeight;

  if (scrollBottom > targetOffsetTop && scrollTop < targetOffsetBottom) {
    const start = performance.now();

    const animate = timestamp => {
      const runtime = timestamp - start;
      const translateY = (1 - runtime / 1000) * 100;

      element.style.transform = `translateY(-${translateY}px)`;

      if (runtime < 1000) {
        requestAnimationFrame(animate);
      }
    };

    requestAnimationFrame(animate);
  } else {
    element.style.transform = '';
  }
});

示例二:CSS3动画

该示例实现了一个“闪烁显示”效果,即当页面滚动到某个元素时,该元素会闪烁几下并再次消失。

<div class="box" id="target"></div>
.box {
  height: 100px;
  background-color: #f00;
  margin-top: 500px;
}

.box.animated {
  animation: blink 1s linear;
}

@keyframes blink {
  0% { opacity: 1; }
  50% { opacity: 0; }
  100% { opacity: 1; }
}
const element = document.getElementById('target');

document.addEventListener('scroll', () => {
  const targetOffsetTop = element.offsetTop;
  const targetOffsetBottom = targetOffsetTop + element.offsetHeight;
  const scrollBottom = scrollTop + windowHeight;

  if (scrollBottom > targetOffsetTop && scrollTop < targetOffsetBottom) {
    element.classList.add('animated');
    setTimeout(() => element.classList.remove('animated'), 1000);
  } else {
    element.classList.remove('animated');
  }
});

以上就是基于原生js实现页面滚动动画的完整攻略,其中涵盖了逐帧动画和CSS3动画两种实现方式,可以根据具体情况选择相应的方法以实现所需效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js实现页面滚动动画 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS实现判断有效的数独算法示例

    判断有效的数独是一道常见的编程面试题,本文将介绍如何使用JavaScript实现一个有效的数独判断算法。 如何表示数独? 数独可表示为一个9×9的二维数组,其中空白单元格表示为0,已填充数字的单元格则为1至9之间的数字。 示例: const board = [ [5, 3, 0, 0, 7, 0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0…

    JavaScript 2023年5月28日
    00
  • javascript动态获取登录时间和在线时长

    1. 获取登录时间 在Javascript中获取登录时间需要使用Date对象。可以在用户登录时记录服务器端的时间戳,然后将时间戳传递给前端,使用Date对象将时间戳转换成具体的日期时间,最后将日期时间显示在页面上。 例如,假设用户登录时服务器端返回的时间戳为 1574825471373,那么我们可以使用以下代码将时间戳转换成日期时间: const login…

    JavaScript 2023年5月27日
    00
  • JavaScript实现斗地主游戏的思路

    JavaScript实现斗地主游戏的思路可以分为以下几个步骤: 1. 准备扑克牌 在JavaScript中,我们可以用一个数组来表示一副扑克牌。每张牌的信息可以包含花色和点数,我们可以使用对象来表示: const cards = [ { suit: ‘spades’, rank: ‘A’ }, { suit: ‘spades’, rank: ‘2’ }, {…

    JavaScript 2023年6月11日
    00
  • spring boot ajax跨域的两种方式

    当使用Spring Boot框架开发Web应用程序时,可以使用Ajax来进行异步请求和响应。但是在跨域请求时,会涉及到浏览器的一些限制,比如同源政策。本文内容将详细介绍使用Spring Boot如何解决Ajax跨域问题。 1. 什么是Ajax跨域问题 Ajax跨域问题指的是浏览器所遵循的同源策略,导致无法利用Ajax去向不同源的服务器发送请求。跨域请求会被浏…

    JavaScript 2023年6月11日
    00
  • js获取指定时间的前几秒

    获取指定时间的前几秒,可以使用JavaScript中的Date对象,以下是获取前5秒的代码示例: var date = new Date(‘2022-01-01 12:00:00’); var beforeDate = new Date(date.getTime() – 5 * 1000); // getTime()方法获取时间戳,单位为毫秒 console…

    JavaScript 2023年5月27日
    00
  • JavaScript 数组- Array的方法总结(推荐)

    JavaScript 数组- Array的方法总结(推荐) JavaScript的Array是一种非常常用的数据类型,它提供了非常多实用的方法来对数组进行操作和处理。本篇文章将会对JavaScript Array中最重要的一些方法进行详细的介绍。 创建一个数组 在JavaScript中,我们可以通过两种方式来创建一个数组,分别是通过Array构造器以及通过数…

    JavaScript 2023年5月27日
    00
  • JavaScript中常用的正则表达式日常整理(全)

    JavaScript中常用的正则表达式日常整理(全) 正则表达式是处理文本的重要工具,在JavaScript中也经常使用正则表达式来匹配和处理字符串。这里整理了JavaScript中常用的正则表达式,供参考和学习使用。 匹配特定字符 匹配任意字符:. .(点号)表示匹配任意字符,但是除了换行符。比如: let str = "Hello World!…

    JavaScript 2023年5月19日
    00
  • JS使用正则表达式实现常用的表单验证功能分析

    这里我提供一份完整的攻略来实现用正则表达式实现常用的表单验证功能。步骤如下: 步骤一:准备HTML代码 首先,我们需要编写一个表单来进行验证。HTML代码如下: <form method="post" action="" id="myForm"> <label for="…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部