JS随拖拽速度设置倾斜角度的实现代码

 更新时间:2023年09月26日 08:53:02   作者:阿文最开心  
这篇文章主要给大家介绍了JS如何随拖拽速度设置倾斜角度,文中有详细的代码讲解,对大家的学习或工作有一定的帮助,感兴趣的小伙伴可以自己动手尝试一下

拖拽速度设置倾斜角度

实现

求拖拽速度设置倾斜角度,就是求速度与角度之间的关系。

∵ ( 角度 / 最大角度 ) = ( 速度 / 最大速度 ) * 固定系数

∴ 角度 = ( 速度 / 最大速度 ) / 最大角度 * 固定系数

这里的固定系数其实是旋转系数,用于调整旋转幅度。它是一个乘法因子,允许你根据需要增加或减小旋转的幅度。 好处就是自定义旋转幅度,可以在不改变速度和最大旋转角度的情况下,根据具体场景的需要自定义旋转幅度。

上面的公式非常清楚了,接下来就是编写 Code 求出速度就行。因为最大速度、最大角度、固定系数都是固定的。

而计算速度的方式就很简单了,路程除以时间。

而在拖拽过程中,路程就是两次触发拖拽的时候的差值,时间就直接 performance.now() 。所以计算速度的方法如下:

// eslint-disable-next-line prefer-const
let lastX = x.value
// eslint-disable-next-line prefer-const
let startTime = performance.now()
function calVelocity(lastX: number, currentX: number, lastTime: number, currentTime = performance.now()) {
  const distanceX = currentX - lastX
  const deltaTime = currentTime - lastTime
  return {
    velocity: distanceX / deltaTime,
    newTime: currentTime,
    newX: currentX,
  }
}

当拖拽的时候,触发 calVelocity() , 然后将最新的 newTime 和 newX 赋值给 startTime 和 lastX 就行了。

以上就是核心代码逻辑,下面有首图的 ts 代码,不过使用了 Vue 框架和 VueUse 、VueUse/motion工具类。如果想要跑通,需要配置一下。

// 1. 具有两个动画,一个是上下浮动,一个是拖拽的时候会有小幅度旋转
// 2. 拖拽的时候,根据速度计算旋转幅度,这个时候上下浮动消失
// 3. 拖拽结束后(速度小于一个阈值或者鼠标抬起或者鼠标移动到了外面),旋转幅度取消,上下浮动重新开始
/** ************************设置拖拽和旋转***************************** */
const props = defineProps({
  initialPosition: {
    default: () => ({
      x: Math.random() * (window.innerWidth - 400),
      y: Math.random() * (window.innerHeight - 160),
    }),
  },
})
const target = ref<HTMLElement>()
const { apply: waveApply } = useMotion(target, {
  initial: { rotate: 0 },
  enter: { rotate: 0 },
})
async function setRotate(rotate: number) {
  await waveApply({
    rotate,
  })
}
const { x, style, isDragging } = useDraggable(target, { initialValue: props.initialPosition })
let rotationDelta = 0
watch(isDragging, async () => {
  if (isDragging.value) {
    // 拖拽的时候,取消上下浮动
  }
  else {
    // 拖拽结束后,设置旋转角度为 0 , 恢复上下浮动
    setRotate(0)
    rotationDelta = 0
  }
})
/** **************************************************************** */
/** ************************通过速度计算旋转幅度***************************** */
let lastX = x.value
let startTime = performance.now()
// 当前角度 / 当前速度 = 最大角度 / 最大速度
// 得出:当前角度 = ( 最大角度 / 最大速度 ) * 当前速度
// 然后再乘以一个系数,用于调整旋转幅度,角度跟速度的比例
const cfg = {
  maxVelocity: 10, // 最大速度
  maxRotation: 60, // 最大旋转角度
  rotationFactor: 0.8, // 旋转系数,用于调整旋转幅度
}
watch(x, () => {
  const { velocity, newX, newTime } = calVelocity(lastX, x.value, startTime)
  const { maxVelocity, maxRotation, rotationFactor } = cfg
  // 速度除以最大速度,将速度归一化为一个介于 0 和 1 之间的小数值,表示速度相对于最大速度的比例。
  // 将这个比例值乘以最大旋转角度 maxRotation,这样就得到了基于速度的旋转角度
  // 但这得出的仍是一个相对值,最后,再将这个相对的旋转角度乘以旋转系数 rotationFactor,以调整最终的旋转幅度。
  rotationDelta = -(velocity / maxVelocity * maxRotation * rotationFactor)
  setRotate(rotationDelta)
  lastX = newX
  startTime = newTime
})
function calVelocity(lastX: number, currentX: number, lastTime: number, currentTime = performance.now()) {
  const distanceX = currentX - lastX
  const deltaTime = currentTime - lastTime
  return {
    velocity: distanceX / deltaTime,
    newTime: currentTime,
    newX: currentX,
  }
}
/** **************************************************************** */

以上就是JS随拖拽速度设置倾斜角度的实现代码的详细内容,更多关于JS设置倾斜角度的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript实现简单获取本地图片主色调

    JavaScript实现简单获取本地图片主色调

    想象一个场景,就是如何根据一张图片大概提取出它的主色调呢?获取主色调后,可能会用来设置某些背景颜色,这里,利用 JS 简单获取本地图片主色调,希望对大家有所帮助
    2023-03-03
  • 基于JavaScript打造一款桌面级便签系统

    基于JavaScript打造一款桌面级便签系统

    本文将用html,css和JavaScript实现一个简单的便签系统。除非手动清空便签,否则便签会一直保留,非常方便。感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • js格式化时间的方法

    js格式化时间的方法

    这篇文章主要介绍了js格式化时间的方法,对javascript时间格式化的方法进行了总结,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 如何在JavaScript中使用localStorage详情

    如何在JavaScript中使用localStorage详情

    这篇文章主要介绍了如何在JavaScript中使用localStorage,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 微信小程序使用第三方库Immutable.js实例详解

    微信小程序使用第三方库Immutable.js实例详解

    Immutable 是 Facebook 开发的不可变数据集合。不可变数据一旦创建就不能被修改,是的应用开发更简单,允许使用函数式编程技术,比如惰性评估。微信小程序无法直接使用Immutable.js,下面就来说说微信小程序如何使用第三方库Immutable.js。
    2016-09-09
  • Javascript this关键字使用分析

    Javascript this关键字使用分析

    这是来自http://www.quirksmode.org/js/this.html这篇文章里对this的定义,直接看定义似乎什么也不知道,下面通过实例来说明各种情况下this所指代的对象以及原理。
    2008-10-10
  • Document.body.scrollTop的值总为零的快速解决办法

    Document.body.scrollTop的值总为零的快速解决办法

    这篇文章主要介绍了Document.body.scrollTop的值总为零的解决方法的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • javascript同页面多次调用弹出层具体实例代码

    javascript同页面多次调用弹出层具体实例代码

    一个在同一个页面可多次调用的javascript弹出层效果,有需要的同学可以参考一下
    2013-08-08
  • html的DOM中document对象images集合用法实例

    html的DOM中document对象images集合用法实例

    这篇文章主要介绍了html的DOM中document对象images集合用法,实例分析了images集合的语法与使用技巧,需要的朋友可以参考下
    2015-01-01
  • JS实现加载时锁定HTML页面元素的方法

    JS实现加载时锁定HTML页面元素的方法

    这篇文章主要介绍了JS实现加载时锁定HTML页面元素的方法,涉及javascript针对页面元素的遍历与属性操作相关实现技巧,需要的朋友可以参考下
    2017-06-06

最新评论