介绍
滚动是我们每天在屏幕上做的事情,但你有没有想过滚动如何影响用户体验?在当今世界,滚动也已成为为用户提供流畅且令人满意的体验的一种方式。借助 Framer Motion 等工具,开发人员可以将滚动变成一种引人入胜且具有视觉吸引力的体验。
今天,我们将探索动画滚动的不同方法。我们将了解滚动动画的类型以及它们的使用方法。我们将了解该模式,以便我们可以将滚动动画添加到我们的任何项目或网站。
我们将使用 Framer Motion 在 Next.js 中创建动画。如果您喜欢使用任何其他框架或库,您可以使用它。
那么,事不宜迟,让我们开始吧。
滚动动画的类型
滚动动画有两种类型:
滚动-链接动画:根据您滚动的距离移动或改变的动画,元素将在您滚动时不断更新。
滚动-触发动画:当元素进入或离开视口时触发普通动画。
通过 Framer 运动,您可以实现这两点。让我们一一了解一下。
滚动链接动画
滚动链接动画是动画的进度或移动直接链接到用户滚动的距离的动画。在这种类型的动画中,元素随着用户滚动而不断变化。
这意味着如果您位于第一点,那么动画将跟踪您,并且它也将位于第一点。而且,如果您滚动并转到第二点,动画将跟随您到达该点。
主要特点
- 动画与滚动进度同步。
- 当您滚动时,动画会根据您滚动的程度实时更新。
- 这些动画可以涉及移动、缩放、旋转或更改元素的外观,通常使用 Framer Motion 中的 useScroll 和 useTransform 钩子(我们将在前面了解这些)。
滚动触发的动画
当您滚动时元素进入或离开特定视口时,就会发生滚动触发的动画。这意味着动画仅在用户滚动到页面的特定部分时才开始。
所以,如果我在第一点,并且为第三点设置了滚动触发的动画,那么该动画将在第三点发生。这意味着只有当我到达该视口时才会触发动画(在本例中是第三点)
要了解这一点,你可以看这个视频?。在这里,您会看到橙色元素何时出现在视口中意味着它在屏幕上完全可见,然后显示导航栏。
主要特点
由滚动位置触发:一旦到达特定的滚动位置,动画就会被激活,而不是像滚动链接动画一样与滚动持续同步。这通常是使用 whileInView 或 onEnter 等条件来实现的。
离散动画:与滚动链接动画不同,滚动触发动画在特定时刻发生,例如当元素进入或退出时视口。这些可能包括淡入、滑入或当用户滚动经过某个点时发生的其他视觉效果。
一次性或可重复动画: 滚动触发动画可以设置为仅在元素首次进入视图时播放一次,或者可以在元素首次进入视图时重复播放。元素再次进入视口,具体取决于用例。
<motion.div initial="hidden" whileinview="visible" viewport="{{" once: true animation will occur only once></motion.div>
接下来是什么?
现在我们了解了这两种类型的滚动动画及其差异,让我们开始了解创建这些动画所使用的模式。这将允许您向任何项目添加滚动动画。
首先,我们将建立一个项目来实际理解这一点,然后我们将创建两种类型的动画。
项目设置
让我们首先设置具有所有必要依赖项的 Next.js 项目。我将在这个项目中使用 StalkBlitz,但您也可以使用 VSCode。虽然所有步骤我都会从 VSCode 角度告诉你,这样你就可以按照步骤操作。
-
使用 TypeScript 创建一个新的 Next.js 项目:
npx create-next-app@latest
安装时,您将看到以下提示:
What is your project named? my-app Would you like to use TypeScript? No / Yes Would you like to use ESLint? No / Yes Would you like to use Tailwind CSS? No / Yes Would you like to use `src/` directory? No / Yes Would you like to use App Router? (recommended) No / Yes Would you like to customize the default import alias (@/*)? No / Yes What import alias would you like configured? @/*
-
安装 Framer Motion
npm install framer-motion
-
清理默认文件。
删除 app/page.tsx 中的默认代码。我们将从头开始,专注于滚动动画。该文件应如下所示。
'use client'; export default function Home() { return ( <div> </div> ); }
-
启动开发服务器
<motion.div initial="hidden" whileinview="visible" viewport="{{" once: true animation will occur only once></motion.div>
创建滚动动画
现在我们的项目已经建立起来,我们可以一一创建这两种类型的滚动动画。您可以直接在 app/page.tsx 文件中开始编写代码,或者创建一个单独的组件并将所有组件导入 app/page.tsx 文件中。
创建滚动链接动画
有几个滚动链接动画的例子:
滚动进度条:当用户向下滚动页面时填充的圆形或线性进度条。
视差滚动:背景图像或元素相对于前景以不同的速度移动,在滚动时创建深度效果。
淡入元素:内容随着用户滚动而淡入视图。
缩放变换:元素根据滚动进度逐渐增大或减小尺寸。等等
让我们创建一些动画。在创建任何滚动链接动画时,您将经常使用来自成帧器运动的这些方法和挂钩。
-
滚动进度检测(useScroll):跟踪用户的滚动位置,通常返回 0 到 1 之间的值,表示页面向下的进度。
npx create-next-app@latest
-
转换滚动数据 (useTransform):将滚动位置映射到特定的动画属性,例如不透明度、比例或位置。使用它可以在滚动过程中触发淡入淡出、移动、旋转、缩放或颜色变化等动画。
What is your project named? my-app Would you like to use TypeScript? No / Yes Would you like to use ESLint? No / Yes Would you like to use Tailwind CSS? No / Yes Would you like to use `src/` directory? No / Yes Would you like to use App Router? (recommended) No / Yes Would you like to customize the default import alias (@/*)? No / Yes What import alias would you like configured? @/*
-
使用运动元素制作动画:使用motion.div(或任何运动组件)包裹目标元素,并将动画链接到滚动进度。
npm install framer-motion
-
过渡:应用平滑过渡,使动画感觉流畅自然。
'use client'; export default function Home() { return ( <div> </div> ); }
-
初始和最终状态:使用初始、动画或样式属性来定义元素最初的外观,并使用链接到scrollYProgress的useTransform或动画控制其最终状态。
npm run dev
滚动进度条
我们首先创建一个滚动进度条。为此,请打开文本编辑器,创建一个新组件,然后开始在其中编写代码。
const { scrollYProgress } = useScroll();
这里我们使用:
useScroll:提供滚动位置作为 0 到 1 之间的标准化值。
useTransform:将滚动进度映射到我们需要的特定值范围,无论是进度圈的笔画 dasharray 还是我们想要应用的任何其他转换。
运动组件:我们使用 Framer Motion 的 Motion.circle 基于滚动来实时设置笔划长度的动画。
动态缩放文本动画
在此示例中,我们将使用 Framer Motion 为文本元素创建滚动链接的动态缩放效果。
-
跟踪滚动进度:与进度条类似,我们使用 useScroll() 来获取页面当前的滚动进度。 scrollYProgress 值范围从顶部的 0 到完全滚动时的 1。
<motion.div initial="hidden" whileinview="visible" viewport="{{" once: true animation will occur only once></motion.div>
-
将滚动值转换为控制比例:我们使用 useTransform() 将滚动进度转换为随着用户滚动而动态变化的比例值。在这种情况下,我们将scrollYProgress从[0, 0.5, 1]映射到缩放值[1, 2, 1],这意味着文本将从原始大小增长,在滚动中间尺寸加倍,然后缩小当你到达底部时返回。
npx create-next-app@latest
-
对文本元素进行动画处理: 在motion.h1 组件中,我们将使用样式属性的scaleValue 来根据滚动位置平滑地对文本缩放效果进行动画处理。当用户滚动时,文本将“变大”和“收缩”。
What is your project named? my-app Would you like to use TypeScript? No / Yes Would you like to use ESLint? No / Yes Would you like to use Tailwind CSS? No / Yes Would you like to use `src/` directory? No / Yes Would you like to use App Router? (recommended) No / Yes Would you like to customize the default import alias (@/*)? No / Yes What import alias would you like configured? @/*
-
设置该部分的样式:文本位于全屏部分的中心,该部分具有背景渐变以增加视觉吸引力。背景创建了从紫色到靛蓝色的平滑渐变,使动态文本更加突出。
npm install framer-motion
使用的概念:
useScroll:我们再次使用这个钩子来跟踪页面的滚动进度,作为动画的触发器。
useTransform:在这里,我们将滚动进度映射到缩放值,使文本在滚动事件期间平滑地放大或缩小。
motion 组件:motion.h1 组件实时动画,随着滚动值的变化动态调整比例。
我们再次使用相同的概念。 useScroll、useTransform 和运动。所以,这是滚动链接的一部分。现在让我们创建一些滚动触发动画。
创建滚动触发的动画
滚动触发的动画在一些示例中并不适用。您可以将滚动动画链接到页面的特定组件。例如,我有一个包含两个元素和一个包含一些文本的 div 的登陆页面。目前,页面上没有动画,但我想添加在视口进入视图时激活的动画。
为此,我们将使用滚动触发的动画。正如我们之前了解到的,当特定视口进入视图时,就会发生滚动触发的动画。因此,让我们将 Framer Motion 元素添加到此代码中。
<motion.div initial="hidden" whileinview="visible" viewport="{{" once: true animation will occur only once></motion.div>
我们从framer-motion导入动作
整个组件被包裹在一个section元素中,它有一些基本的样式。
-
;这是第一个动作 div。它包含主要内容(标题和段落)。它使用initial和whileInView来创建滚动触发的动画: initial={{ opacity: 0, y: 50 }}:最初,该框是不可见的(opacity: 0)并向下放置 50 像素(y: 50)。
whileInView={{ opacity: 1, y: 0 }}:当用户将其滚动到视图中时,它变得完全可见(不透明度:1)并移动到正常位置(y:0)。
transition={{ period: 0.8, escape: 'easeOut' }}: 过渡需要 0.8 秒并平滑地缓出。里面的内容采用 Tailwind 类进行样式设计,为其提供填充、90% 不透明度的背景、阴影、圆角和最大宽度。
-
之后,我们有第二个动态 div(从上到下的动画文本)。这个
动画一些从屏幕顶部向下移动的文本: initial={{ y: -100, opacity: 0 }}:文本从正常位置上方 100 像素开始,并且不可见。
whileInView={{ y: 0, opacity: 1 }}:当它进入视图时,它会移动到正常位置并变得完全可见。
transition={{delay: 0.5,duration: 0.8 }}:动画开始前有0.5秒的延迟,产生交错效果。
最终输出将如下所示。
结论
这就是今天的博客。我们介绍了 2 种类型的动画以及创建这些动画时使用的一些方法,例如: useScroll useTransition whileInView 初始状态和最终状态以及类似的东西。
我在 StalkBliz 项目中添加了带有更多动画示例的所有代码。您可以在此处查看并使用代码查看更多示例滚动动画。如果您想探索更多滚动动画的道具、方法和示例,可以在此处查看 Framer Motion 的滚动文档。
感谢您阅读此博客。如果您从中学到了一些东西,请点赞并与您的朋友和社区分享。我撰写博客并分享有关 JavaScript、TypeScript、开源和其他 Web 开发相关主题的内容。欢迎在我的社交媒体上关注我。我们下一篇见。谢谢你:)
- 推特
- 领英
- GitHub
以上是使用 Framer Motion 创建精美的滚动动画的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

本文演示了如何使用jQuery和ajax自动每5秒自动刷新DIV的内容。 该示例从RSS提要中获取并显示了最新的博客文章以及最后的刷新时间戳。 加载图像是选择

Matter.js是一个用JavaScript编写的2D刚体物理引擎。此库可以帮助您轻松地在浏览器中模拟2D物理。它提供了许多功能,例如创建刚体并为其分配质量、面积或密度等物理属性的能力。您还可以模拟不同类型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流浏览器。此外,它也适用于移动设备,因为它可以检测触摸并具有响应能力。所有这些功能都使其值得您投入时间学习如何使用该引擎,因为这样您就可以轻松创建基于物理的2D游戏或模拟。在本教程中,我将介绍此库的基础知识,包括其安装和用法,并提供一


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

记事本++7.3.1
好用且免费的代码编辑器

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境