首页 > 其他分享 >记录--仿加入购物车飞入动画效果

记录--仿加入购物车飞入动画效果

时间:2023-10-27 18:55:25浏览次数:32  
标签:动画 ball -- sessionStorage 购物车 default balls 飞入 下载

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

近期对管理后台相关功能进行优化,其中导出功能涉及到查询数据过多导致查询很慢问题,决定采用点击后加入到下载中心方式,既解决了接口慢等待问题,也方便后期各种文件的重复下载,一举多得~

功能上很好实现,调接口就可以了,主要涉及到一个小球飞入效果,基础原理和商城的加入购物车很像,就是点击按钮之后,出现一个小球,按照一定路径飞入固定位置。先来看下基本的原理图:

最终效果就是,点击按钮,出现小球按照红色线路径飞入到下载中心位置。通过原理图,我们也可以看出。只要知道两个元素的位置差,然后通过一定属性控制动画路径就可以了,这里采用了css3的transfrom动画。

两个元素的位置差:

获取位置差x轴:下载中心.left - 按钮.clientX

获取位置差y轴:下载中心.top - 按钮.clientY

其中按钮的相关属性,可以在点击时通过$event去获取。

下载中心相关属性,通过ref?.value?.getBoundingClientRect()获取。同时这里需要注意,因为是在pc端浏览器,是可以随时放大缩小浏览器的,在浏览器大小变化的时候,下载中心的位置是会发生变化的。因此这里需要使用windowresize方式进行监听,随时获取下载中心的位置,并把相关的topleft值进行存储,方便后面调用。

css3相关动画属性

这个动画效果里,主要用到了下边几个属性,简单说一下:

transform:css动画,对应的值可以是二维动画(移动、平面旋转、放大缩小等)、三维动画(x/y/z三维空间动画)

translate3d:包含三个参数,分别为x轴移动距离、y轴移动距离、z轴移动距离。

transition-duration:过渡动画的过渡时间,也就是动画持续的时间。

transition-timing-function:设置过渡动画的动画类型,具体值可以看下图

示例中使用的是transform3d动画,相比普通的二维动画,主要是因为前者可以开启浏览器的gpu硬件加速,能够快速渲染动画。

示例代码

// 小球单独组件
<div class="ball-wrap" v-for="(item, k) of balls" :key="k"
  :style="{
    opacity: item.show,
    top: item.start.y + 'px',
    left: item.start.x + 'px',
    transitionDuration: (item.show ? (duration/1000) : 0)+'s',
    'transition-timing-function': xTimeFunction[!item.ani ? 0 : 1],
    transform: 'translate3d(' + item.offset.x + 'px, 0, 0)',
    zIndex
  }"
>
  <div class="ball" :class="{ball3d:is3dSheet}"
    :style="{
      marginLeft: -size/2 + 'px',
      marginTop: -size/2 + 'px',
      padding: size + 'px',
      backgroundImage: ballImage,
      backgroundColor: ballColor,
      transitionDuration: (item.show ? (duration/1000) : 0) + 's',
      transform: 'translate3d(0,' + item.offset.y + 'px,0)',
      'transition-timing-function': yTimeFunction[item.ani ? 0 : 1]
    }"
  ></div>
</div>

<script>
export default {
  props: {
    // 球的大小
    size: {
      type: Number,
      default: 8
    },
    //3D
    is3dSheet: {
      type: Boolean,
      default: true
    },
    //持续时间
    duration: {
      type: Number,
      default: 800
    },
    zIndex: {
      type: Number,
      default: 9999
    },
    ballImage: {
      type: String,
      default: ''
    },
    ballColor: {
      type: String,
      default: '#409eff'
    }
  },
  data() {
    return {
      balls: [],
      xTimeFunction: ['ease-in', 'ease-out'],  // x轴动画渐入渐出效果
      yTimeFunction: ['ease-in', 'ease-out'],  // y轴动画渐入渐出效果
      endPos: {
        x: sessionStorage.getItem('downIconLeft'),   // 因为浏览器可能会手动放大缩小,所以要监听window的resize时间,获取顶部元素位置
        y: sessionStorage.getItem('downIconTop')
      }
    };
  },
  mounted() {
    this.initBalls()
  },
  methods: {
    // 外部调用方法,传入点击时元素的xy位置数值
    drop(pos){
      this.endPos.x = sessionStorage.getItem('downIconLeft')
      this.endPos.y = sessionStorage.getItem('downIconTop')
      let ball 
      let duration=this.duration
      for (var i = 0; i < this.balls.length; i++) {
        if(this.balls[i].show){continue}
        ball = this.balls[i]
      }
      ball.start.x = pos.x
      ball.start.y = pos.y
      ball.offset.x = this.endPos.x - pos.x 
      ball.offset.y = this.endPos.y - pos.y 
      if(ball.offset.y > 0){
        ball.ani = 1
      }else{
        ball.ani = 0
      }
      ball.show = 1
        
      setTimeout(()=>{
        ball.show = 0
      }, duration)
      debounce(this.initBalls,  duration+200, this)()
    },
    
    initBalls(){
      const balls = [{
          show: 0,
          start: {
            x: 0,
            y: 0
          },
          offset: {
            x: 0,
            y: 0
          },
          ani: 0
      }]
      this.balls = balls
    }
  }
}
</script>
// 下载中心
<span class="export_center_icon" ref="downRef">下载中心</span>

// 获取下载按钮位置
const getIconSite = ()=>{
  let downIconSite = downRef?.value?.getBoundingClientRect()
  sessionStorage.setItem('downIconLeft', downIconSite.left.toFixed(2))
  sessionStorage.setItem('downIconTop', downIconSite.top.toFixed(2))
}

// 监听屏幕变化按钮位置
window.addEventListener('resize', debounce(()=>{
  getIconSite()
}), 500)

onMounted(()=>{
  getIconSite()
})

onBeforeUnmount(()=>{
  window.removeEventListener('resize')
})
// 组件调用
import ball from '@/components/ball/index.vue' 

<ball ref="cartBtn"></ball> 

<button @click='download($event)'>下载</button> 

// 适当方法里调用 
download = ()=>{ 
  cartBtn.value.drop({ 
    x: e.clientX, 
    y: e.clientY 
  }) 
}
简单的小球飞入动画就完成了,类似的效果可以用到很多地方,不需要太多逻辑代码,朴实无华效果最靠谱

标签:动画,ball,--,sessionStorage,购物车,default,balls,飞入,下载
From: https://www.cnblogs.com/smileZAZ/p/17792994.html

相关文章

  • delphi 运行时动态设置控件(类)属性值
    运行时动态设置控件(类)属性值代码运行时根据控件名称设置Alignment属性值usesSystem.Rtti;procedureTForm1.Button1Click(Sender:TObject);varvComponent:TComponent;vRttiCtx:TRttiContext;vRType:TRttiType;vProp:TRttiProperty;v:TValue;begin......
  • 如何使用SHC对Shell脚本进行封装和源码隐藏
    在许多情况下,我们需要保护我们的shell脚本源码不被别人轻易查看。这时,使用shc工具将shell脚本编译成二进制文件是一个有效的方法。本文将详细介绍如何在线和离线条件下安装shc,并将其用于编译你的脚本。什么是SHC?shc是一个由C语言编写的Shell脚本加密程序,它可以将你的脚本编译成......
  • 浅谈UI自动化测试
    随着软件行业的不断发展,建立一个完善的自动化测试体系变得至关重要。目前,自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言,企业在UI自动化测试方面的覆盖率仍然相对较低。接口自动化测试可以模拟和执行应用程序接口的各种操作,以验证接口的功能、性能和稳......
  • php代码审计学习----骑士cms代码审计
    php代码审计学习----骑士cms代码审计源码下载https://github.com/Betsy0/CMSVulSource环境搭建删掉data里的install.lock然后把源码放在phpstudy的网站目录下访问http://xxx/74cms/install.php使用phpstorm调试使用seay进行辅助代码审计(主要phpstorm不知为什么总是无法......
  • 动态规划合集
    动态规划笔记目录八种常见动态规划题型序列dp树形dp背包dp区间dp期望dp状态压缩dp数位dp计数dp动态规划优化合集DP技巧与DP杂题数据结构优化dp矩阵快速幂优化dp决策单调性优化dp斜率优化dp......
  • 支持自动生成API文档 Apipost 真香
    在数字化时代,API已经成为了应用程序之间进行通信的关键桥梁。随着API的普及和复杂性的增加,API研发和管理也面临着越来越多的挑战。为了更好地应对这些挑战,Apipost提供了一整套API研发工具,包括API设计、API调试、API文档和API自动化测试等功能。本文将深入介绍Apipost的优势和特点,......
  • 第四章 文件权限
    一、基本权限UGO    权限的意义在于允许某一个用户或某个用户组以规定的方式去访问某个文件。例如,Apache服务进程默认由Apache用户访问,除了root用户以外,其他用户均不能访问相关进程,这样就能通过在文件上设置用户或用户组的访问方式达到限制目的。首先介绍U、G、O这三个字......
  • 42. 接雨水
    链接https://leetcode.cn/problems/trapping-rain-water/description/思路1.在线处理。既然是接雨水,那肯定是形成一个类似于碗的结构才能接。可以先找到一个最大值当兜底,然后不断的用当前border去夹逼。如果遇到比当前border高的,那应该更新border。2.单调栈。跟在线处理思路......
  • 408---CO三轮复习---中央处理器
    重难点总结1、CPU的结构,各种功能部件 ⭐⭐⭐⭐⭐2、指令执行过程、指令执行数据流 ⭐⭐⭐⭐⭐⭐⭐3、控制器的功能和工作原理(硬步线、微程序控制器) ⭐⭐⭐4、流水线 ⭐⭐⭐⭐5、高级流水线技术 ⭐⭐6、多处理器的基本概念 ⭐CPU的结构与功能1、CPU又叫中央处理......
  • Uniapp中弹窗
    Uniapp中弹窗直接上代码uni.showModal({title:'提示',content:'这是一个自定义按钮文字的模态对话框',confirmText:'自定义确定',//自定义确定按钮的文字cancelText:'自定义取消',//自定义取消按钮的文字success......