在React中实现好看的动画Framer Motion(案例:滚动进度条)

前言

介绍

Framer Motion 是一个适用于 React 网页开发的动画库,它可以让开发者轻松地在他们的项目中添加复杂和高性能的动画效果。该库提供了一整套针对 React 组件的动画、过渡和手势处理功能,使得通过声明式的 API 来创建动画变得简单直观。

接下来我将带你使用 Framer Motion 实现一个滚动进度条案例,用于实时显示滚动进度。

案例

2023-12-18_20-41-30.gif

基本环境

本案例基于 Vite + React + TypeScript + TailwindCSS 搭建。TailwindCSS 不是必须的,我主要是为了不写 CSS 样式,若想实现和本案例相同的效果,可以安装一下 TailwindCSS。

完整代码

import { motion, useScroll } from "framer-motion";

function App() {
  const { scrollYProgress } = useScroll();

  return (
    <>
      <motion.div
        className="fixed inset-x-0 top-0 z-50 h-2 origin-left bg-red-400"
        style={{
          scaleX: scrollYProgress,
        }}
      />
      <div className="mx-auto max-w-2xl py-4">
        {Array.from({ length: 10 }, (_, index) => (
          <div className="mb-4 h-40 rounded-md bg-gray-100">{index}</div>
        ))}
      </div>
    </>
  );
}

export default App;

useScroll 也可以传入一些参数,比如,我想监听某个容器的滚动而不是页面的滚动,我们就可以修改为以下代码。

import { useRef } from "react";
import { motion, useScroll } from "framer-motion";

function App() {
  const ref = useRef<HTMLDivElement>(null);
  const { scrollYProgress } = useScroll({
    container: ref,
  });

  return (
    <>
      <motion.div
        className="fixed inset-x-0 top-0 z-50 h-2 origin-left bg-red-400"
        style={{
          scaleX: scrollYProgress,
        }}
      />
      <div className="mx-auto max-w-2xl py-4">
        <div ref={ref} className="h-80 overflow-y-auto">
          {Array.from({ length: 10 }, (_, index) => (
            <div className="mb-4 h-40 rounded-md bg-gray-100">{index}</div>
          ))}
        </div>
      </div>
    </>
  );
}

export default App;

2023-12-18_23-35-10.gif

还有一些其他常用的参数,比如 targetoffset,感兴趣的小伙伴可以去官网了解一下如何使用。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值