当前位置:首页 > 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

如何下载react

下载 React 的方法 通过 npm 或 yarn 安装 React 可以通过包管理器 npm 或 yarn 安装。确保已安装 Node.js(包含 npm),然后在项目目录中运行以下命令:…

react如何验证

react如何验证

表单验证方法 在React中验证表单数据通常使用以下几种方式: 内置HTML5验证 利用HTML5原生表单验证属性如required、pattern等,结合form.noValidate属性禁用浏览…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react如何清理

react如何清理

清理 React 项目的方法 清理未使用的依赖项 运行 npm prune 或 yarn install --production 可以移除 node_modules 中未在 package.json…

react路由如何配置

react路由如何配置

React 路由配置方法 安装 React Router 使用 npm 或 yarn 安装 React Router 的 DOM 版本: npm install react-router-dom #…

react 如何获取dom

react 如何获取dom

获取 DOM 的方法 在 React 中,可以通过 useRef 或 createRef 来获取 DOM 节点。useRef 是函数组件中常用的方法,而 createRef 通常用于类组件。 使用…