当前位置: 首页 > news >正文

vue封装gsap自定义动画指令

1、指令文件封装

import { gsap } from 'gsap';// 动画类型配置
const ANIMATION_TYPES = {// 缩放scale: {from: { scale: 0.5, opacity: 0 },to: { scale: 1, opacity: 1 },hide: { scale: 0.5, opacity: 0 },},// 透明度fade: {from: { opacity: 0 },to: { opacity: 1, ease: 'sine.out' },hide: { opacity: 0, ease: 'sine.in' },},// 向上滑出slideUp: {from: { y: 50, opacity: 0 },to: { y: 0, opacity: 1, ease: 'power2.out' },hide: { y: 50, opacity: 0, ease: 'power2.in' },},// 向下滑出slideDown: {from: { y: -50, opacity: 0 },to: { y: 0, opacity: 1, ease: 'power2.out' },hide: { y: -50, opacity: 0, ease: 'power2.in' },},// 向左滑出slideLeft: {from: { x: 50, opacity: 0 },to: { x: 0, opacity: 1, ease: 'power2.out' },hide: { x: 50, opacity: 0, ease: 'power2.in' },},// 向右滑出slideRight: {from: { x: -50, opacity: 0 },to: { x: 0, opacity: 1, ease: 'power2.out' },hide: { x: -50, opacity: 0, ease: 'power2.in' },},// 弹窗bounce: {from: { y: -100, opacity: 0 },to: {y: 0,opacity: 1,ease: 'bounce.out',duration: 1.5,},hide: {y: 100,opacity: 0,ease: 'power2.in',duration: 0.5,},},// 翻转折叠flip: {from: { rotationY: 90, opacity: 0 },to: { rotationY: 0, opacity: 1, ease: 'power2.out' },hide: { rotationY: -90, opacity: 0, ease: 'power2.in' },},
};// 默认配置
const DEFAULT_CONFIG = {type: 'scale',duration: 0.3,delay: 0,origin: 'center',onComplete: null,onStart: null,
};export const vGsapAnimation = {mounted(el, binding) {// 合并默认配置和绑定值const config = {...DEFAULT_CONFIG,...(typeof binding.value === 'object' ? binding.value : { value: binding.value }),};// 获取动画配置const animationConfig = ANIMATION_TYPES[config.type] || ANIMATION_TYPES.scale;// 设置变换原点el.style.transformOrigin = config.origin;el.style.willChange = 'transform, opacity';// 保存配置到元素el._gsapConfig = config;// 初始化动画时间轴el._gsapTimeline = gsap.timeline({paused: true,onComplete: config.onComplete,onStart: config.onStart,});// 创建显示动画el._gsapTimeline.fromTo(el, animationConfig.from, {...animationConfig.to,duration: config.duration,delay: config.delay,});// 初始状态if (config.value !== false) {el.style.visibility = 'visible';el._gsapTimeline.play();} else {el.style.visibility = 'hidden';gsap.set(el, animationConfig.from);}},updated(el, binding) {const oldConfig = el._gsapConfig;const newConfig = {...DEFAULT_CONFIG,...(typeof binding.value === 'object' ? binding.value : { value: binding.value }),};// 如果配置有变化if (JSON.stringify(oldConfig) !== JSON.stringify(newConfig)) {// 更新配置el._gsapConfig = newConfig;// 获取动画配置const animationConfig = ANIMATION_TYPES[newConfig.type] || ANIMATION_TYPES.scale;// 更新时间轴回调el._gsapTimeline.eventCallback('onComplete', newConfig.onComplete);el._gsapTimeline.eventCallback('onStart', newConfig.onStart);if (newConfig.value !== oldConfig?.value) {if (newConfig.value === false) {// 隐藏动画gsap.to(el, {...animationConfig.hide,duration: newConfig.duration,delay: newConfig.delay,onComplete: () => {el.style.visibility = 'hidden';},});} else {// 显示动画el.style.visibility = 'visible';el._gsapTimeline.restart();}}}},unmounted(el) {// 清理动画if (el._gsapTimeline) {el._gsapTimeline.kill();}},
};

2、main.ts注册

// 引入文件
import { vGsapAnimation } from 'xxx'// 注册指令
app.directive('gsap', vGsapAnimation)

3、使用

  • 基本使用
<div v-gsap="isVisible">内容</div>
  • 指定动画类型
<div v-gsap="{ type: 'fade', value: isVisible }">内容</div>
  • 完整配
<div v-gsap="{type: 'bounce',value: isVisible,duration: 1,delay: 0.2,origin: 'top left',onComplete: handleComplete
}">内容</div>

 

        

相关文章:

  • 第三篇:MCP协议深度实践——从理论到生产级AI智能体系统
  • QRSuperResolutionNet:一种结构感知与识别增强的二维码图像超分辨率网络(附代码解析)
  • Markdown基础(1.2w字)
  • 实时通信RTC与传统直播的异同
  • 《波段操盘实战技法》速读笔记
  • 【QT】-信号传输数组跨线程段错误处理
  • VSCode主题设计大赛解析与实践指南
  • 数据结构与算法学习笔记(Acwing 提高课)----动态规划·树形DP
  • CSS 选择器全解析:分组选择器/嵌套选择器,从基础到高级
  • 【免费】酒店布草洗涤厂自动统计管理系统(1)——智能编程——仙盟创梦IDE
  • .NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
  • 数据预处理的几种形式(转载)
  • 如何借助Hyper - V在Windows 10中构建安全软件测试环境
  • 高速PCB设计中圆弧布线是否必要
  • 还原Windows防火墙
  • Android studio初体验
  • 6个月Python学习计划 Day 14 - 异常处理基础( 补充学习)
  • 在 Android Studio 中使用 GitLab 添加图片到 README.md
  • Vue 3 弹出式计算器组件(源码 + 教程)
  • DrissionPage调试工具:网页自动化与数据采集的革新利器