当前位置:首页 > React

react如何衰减

2026-03-30 15:22:18React

在 React 中实现动画衰减效果

动画衰减(Decay Animation)是一种常见的交互效果,模拟物理世界中的摩擦力逐渐减速运动。在 React 中可以通过以下方式实现:

使用 react-spring 库

react-spring 是一个流行的动画库,内置支持衰减动画:

react如何衰减

import { useSpring, animated } from 'react-spring'

function DecayDemo() {
  const [props, set] = useSpring(() => ({
    x: 0,
    deceleration: 0.998,
    onRest: () => console.log('animation stopped')
  }))

  return (
    <animated.div
      style={{
        transform: props.x.to(x => `translateX(${x}px)`),
        width: 100,
        height: 100,
        background: 'blue'
      }}
      onMouseDown={e => {
        set({ x: e.clientX, immediate: true })
      }}
      onMouseMove={e => {
        if (e.buttons) {
          set({ x: e.clientX })
        }
      }}
    />
  )
}

使用 framer-motion 库

framer-motion 也提供衰减动画支持:

react如何衰减

import { motion } from 'framer-motion'

function DecayBox() {
  return (
    <motion.div
      drag
      dragConstraints={{ left: 0, right: 0 }}
      dragElastic={0.5}
      dragMomentum={true}
      style={{
        width: 100,
        height: 100,
        background: 'red'
      }}
    />
  )
}

手动实现衰减动画

对于自定义需求,可以手动实现衰减算法:

import { useState, useEffect, useRef } from 'react'

function ManualDecay() {
  const [position, setPosition] = useState(0)
  const velocityRef = useRef(0)
  const animationRef = useRef(null)

  const startDecay = (initialVelocity) => {
    velocityRef.current = initialVelocity
    const deceleration = 0.95

    const animate = () => {
      if (Math.abs(velocityRef.current) < 0.1) {
        cancelAnimationFrame(animationRef.current)
        return
      }

      setPosition(prev => prev + velocityRef.current)
      velocityRef.current *= deceleration
      animationRef.current = requestAnimationFrame(animate)
    }

    animationRef.current = requestAnimationFrame(animate)
  }

  return (
    <div
      style={{
        transform: `translateX(${position}px)`,
        width: 100,
        height: 100,
        background: 'green'
      }}
      onClick={() => startDecay(30)}
    />
  )
}

性能优化注意事项

使用 will-change 属性提示浏览器优化动画性能:

<div style={{ willChange: 'transform' }} />

避免在动画期间触发重排操作,尽量只修改 transform 和 opacity 属性。对于复杂场景,考虑使用 React 的 useMemo 和 useCallback 减少不必要的渲染。

标签: react
分享给朋友:

相关文章

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impor…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

react 如何跳转

react 如何跳转

使用 React Router 进行页面跳转 React 应用中通常使用 react-router-dom 库实现页面跳转。以下是几种常见的跳转方式: 安装依赖 npm install react…

react如何刷新

react如何刷新

刷新React组件的方法 使用状态更新触发重新渲染 通过更新组件的状态可以触发重新渲染。React会在状态变化时自动重新渲染组件。 const [count, setCount] = useStat…

react项目如何

react项目如何

创建React项目 使用create-react-app工具快速初始化项目。确保已安装Node.js(建议版本≥12.0.0),运行以下命令生成新项目: npx create-react-app m…