当前位置:首页 > PS视频 > 正文内容

前端动画库

编辑3个月前 (04-27)PS视频48

// 正确的做法:使用Framer Motion

import React from 'react';

import { motion } from 'framer-motion';


function FramerMotionExample() {

  return (

    <div>

      <h2>Framer Motion 示例</h2>

      

      {/* 基础动画 */}

      <motion.div

        initial={{ opacity: 0, y: 20 }}

        animate={{ opacity: 1, y: 0 }}

        transition={{ duration: 0.5 }}

        className="box"

      >

        淡入动画

      </motion.div>

      

      {/* 循环动画 */}

      <motion.div

        animate={{ rotate: 360 }}

        transition={{ duration: 2, repeat: Infinity, ease: "linear" }}

        className="circle"

      >

        旋转动画

      </motion.div>

      

      {/* 交互动画 */}

      <motion.button

        whileHover={{ scale: 1.05 }}

        whileTap={{ scale: 0.95 }}

        className="button"

      >

        悬停按钮

      </motion.button>

      

      {/* 序列动画 */}

      <motion.div className="container">

        {[1, 2, 3, 4, 5].map((item) => (

          <motion.div

            key={item}

            initial={{ opacity: 0, y: 20 }}

            animate={{ opacity: 1, y: 0 }}

            transition={{

              delay: item * 0.1,

              duration: 0.5

            }}

            className="item"

          >

            项目 {item}

          </motion.div>

        ))}

      </motion.div>

    </div>

  );

}


// 正确的做法:使用GSAP

import React, { useEffect, useRef } from 'react';

import gsap from 'gsap';


function GSAPExample() {

  const containerRef = useRef(null);

  const boxRef = useRef(null);

  

  useEffect(() => {

    // 基础动画

    gsap.to(boxRef.current, {

      x: 100,

      y: 50,

      rotate: 45,

      duration: 1,

      ease: "power2.out"

    });

    

    // 时间线动画

    const tl = gsap.timeline({

      repeat: -1,

      yoyo: true

    });

    

    tl.to(".item", {

      x: 100,

      duration: 0.5,

      stagger: 0.1

    })

    .to(".item", {

      y: 50,

      duration: 0.5

    })

    .to(".item", {

      opacity: 0.5,

      duration: 0.5

    });

    

  }, []);

  

  return (

    <div ref={containerRef}>

      <h2>GSAP 示例</h2>

      <div ref={boxRef} className="box">

        GSAP 动画

      </div>

      <div className="container">

        {[1, 2, 3, 4, 5].map((item) => (

          <div key={item} className="item">

            项目 {item}

          </div>

        ))}

      </div>

    </div>

  );

}


// 正确的做法:使用React Spring

import React from 'react';

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


function ReactSpringExample() {

  // 基础动画

  const fadeIn = useSpring({

    from: { opacity: 0, transform: 'translateY(20px)' },

    to: { opacity: 1, transform: 'translateY(0)' },

    config: { tension: 100, friction: 10 }

  });

  

  // 交互动画

  const [isHovered, setIsHovered] = React.useState(false);

  const buttonAnimation = useSpring({

    scale: isHovered ? 1.1 : 1,

    config: { tension: 300, friction: 10 }

  });

  

  return (

    <div>

      <h2>React Spring 示例</h2>

      

      <animated.div

        style={fadeIn}

        className="box"

      >

        淡入动画

      </animated.div>

      

      <animated.button

        style={buttonAnimation}

        onMouseEnter={() => setIsHovered(true)}

        onMouseLeave={() => setIsHovered(false)}

        className="button"

      >

        悬停按钮

      </animated.button>

      

      {/* 循环动画 */}

      <animated.div

        style={useSpring({

          rotate: 360,

          from: { rotate: 0 },

          config: { duration: 2000 },

          loop: true

        })}

        className="circle"

      >

        旋转动画

      </animated.div>

    </div>

  );

}


// 正确的做法:选择合适的动画库

function AnimationLibraryComparison() {

  return (

    <div>

      <h1>前端动画库比较</h1>

      

      <div className="comparison">

        <div className="library">

          <h3>CSS Animations</h3>

          <p>优点:简单、性能好、无需依赖</p>

          <p>缺点:复杂动画难以实现、交互性差</p>

          <p>适用场景:简单的过渡效果、加载动画</p>

        </div>

        

        <div className="library">

          <h3>Framer Motion</h3>

          <p>优点:API友好、交互性强、React集成好</p>

          <p>缺点:包体积较大</p>

          <p>适用场景:React应用、复杂交互动画</p>

        </div>

        

        <div className="library">

          <h3>GSAP</h3>

          <p>优点:功能强大、性能优异、支持复杂动画</p>

          <p>缺点:学习曲线较陡</p>

          <p>适用场景:复杂动画、时间线动画、SVG动画</p>

        </div>

        

        <div className="library">

          <h3>React Spring</h3>

          <p>优点:基于物理的动画、性能好、API简洁</p>

          <p>缺点:功能相对较少</p>

          <p>适用场景:流畅的物理动画、交互反馈</p>

        </div>

      </div>

    </div>

  );

}

每种动画库都有其优缺点,你需要根据项目需求和复杂度选择合适的工具。Framer Motion适合React应用,GSAP适合复杂动画,React Spring适合物理动画,CSS适合简单过渡。


所以,别再固守一种动画方式了,灵活选择合适的工具,让你的网站动起来!


总结

CSS Animations:适合简单的过渡效果和加载动画

Framer Motion:适合React应用和复杂交互动画

GSAP:适合复杂动画、时间线动画和SVG动画

React Spring:适合基于物理的流畅动画

性能优化:使用transform和opacity属性,避免重排

动画策略:合理使用动画,避免过度动画

可访问性:考虑动画对用户的影响,提供减少动画的选项

响应式:确保动画在不同设备上都能正常工作

————————————————

版权声明:本文为CSDN博主「大山哥AGI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/cannonmonster01/article/details/159729432


扫描二维码推送至手机访问。

版权声明:本文由手机数据加工厂发布,如需转载请注明出处。

本文链接:https://cryp6.com/?id=127

“前端动画库” 的相关文章

苹果iPhone+Mac如何开启WiFi+蓝牙

下面直接给你「一步到位」的极简版,照着点就行(为了隔空投送,**Wi‑Fi 和蓝牙都要开,不需要连同一个 Wi‑Fi 也能投送**)。 --- iPhone 打开 Wi‑Fi + 蓝牙(两种方法) 方法1:控制中心(最快) - 全面屏 iPhone(带刘海):**右上角往下滑**...

有哪些软件可以实现手机和电脑之间的高效数据管理?

有哪些软件可以实现手机和电脑之间的高效数据管理?

下面按「苹果生态 / 安卓+Windows / 全平台通用」三类,给你整理**真正能落地、高效不乱的手机↔电脑数据管理软件**,每款讲清楚:**能干啥、适合谁、优缺点**。 --- ## 一、iPhone + Mac(苹果生态最优) ### 1. 系统自带:隔空投送 + 访达(免费,首...

 iPhone如何快速整理你的相册 iPhone怎么备份照片比较方便

iPhone如何快速整理你的相册 iPhone怎么备份照片比较方便

一、iPhone如何快速整理你的相册当手机中的照片或视频太多,管理变得越来越麻烦时,我们可以利用相册中自带的功能对照片进行分类,下面看看iPhone如何快速整理相册。1、打开手机中的【照片】,点击底部导航栏中的【相簿】按钮。在页面左上方点击【+】号图标,在弹出的列表中选择【新建相簿】,如下图所示。图...

手机和电脑的运存和储存容量是否可以扩展?

手机 vs 电脑:运存、储存 能否扩展?【极简大白话】先记住两个关键:运存(RAM)= 管流畅、后台储存(ROM / 硬盘)= 存照片、文件、软件一、手机端(iPhone + 安卓统一结论)1. 手机运存:❌完全不能扩展出厂焊死在主板上,无法更换、无法加装所谓「内存融合 / 虚拟运存」:只是拿储存空...

什么是科技数据?

科技数据,本质上是通过电子设备(手机、电脑、服务器等)采集、存储、传输和处理的各类信息的集合,以二进制代码的形式存在,是数字科技的基础。与我们传统认知中的“文件”不同,科技数据的范畴更广泛,既包括我们主动创建的照片、文档、视频(主动数据),也包括设备运行时自动生成的缓存、日志、定位信息(被动数据);...

云空间不够用?解决办法

一、清理无用数据(最快见效)删除重复照片、模糊截图、过期视频、无用录屏,这类文件占用空间最大。清理软件缓存、垃圾文件、过期安装包、压缩包。删掉不再需要的聊天记录、旧文件、离线缓存内容。二、本地备份,释放云端空间用电脑有线连接手机,把照片、视频、大文件批量保存到电脑硬盘。重要资料存电脑本地,不用全部上...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。