最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS隨拖拽速度設(shè)置傾斜角度的實(shí)現(xiàn)代碼

 更新時(shí)間:2023年09月26日 08:53:02   作者:阿文最開心  
這篇文章主要給大家介紹了JS如何隨拖拽速度設(shè)置傾斜角度,文中有詳細(xì)的代碼講解,對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以自己動(dòng)手嘗試一下

拖拽速度設(shè)置傾斜角度

實(shí)現(xiàn)

求拖拽速度設(shè)置傾斜角度,就是求速度與角度之間的關(guān)系。

∵ ( 角度 / 最大角度 ) = ( 速度 / 最大速度 ) * 固定系數(shù)

∴ 角度 = ( 速度 / 最大速度 ) / 最大角度 * 固定系數(shù)

這里的固定系數(shù)其實(shí)是旋轉(zhuǎn)系數(shù),用于調(diào)整旋轉(zhuǎn)幅度。它是一個(gè)乘法因子,允許你根據(jù)需要增加或減小旋轉(zhuǎn)的幅度。 好處就是自定義旋轉(zhuǎn)幅度,可以在不改變速度和最大旋轉(zhuǎn)角度的情況下,根據(jù)具體場景的需要自定義旋轉(zhuǎn)幅度。

上面的公式非常清楚了,接下來就是編寫 Code 求出速度就行。因?yàn)樽畲笏俣?、最大角度、固定系?shù)都是固定的。

而計(jì)算速度的方式就很簡單了,路程除以時(shí)間。

而在拖拽過程中,路程就是兩次觸發(fā)拖拽的時(shí)候的差值,時(shí)間就直接 performance.now() 。所以計(jì)算速度的方法如下:

// 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,
  }
}

當(dāng)拖拽的時(shí)候,觸發(fā) calVelocity() , 然后將最新的 newTime 和 newX 賦值給 startTime 和 lastX 就行了。

以上就是核心代碼邏輯,下面有首圖的 ts 代碼,不過使用了 Vue 框架和 VueUse 、VueUse/motion工具類。如果想要跑通,需要配置一下。

// 1. 具有兩個(gè)動(dòng)畫,一個(gè)是上下浮動(dòng),一個(gè)是拖拽的時(shí)候會(huì)有小幅度旋轉(zhuǎn)
// 2. 拖拽的時(shí)候,根據(jù)速度計(jì)算旋轉(zhuǎn)幅度,這個(gè)時(shí)候上下浮動(dòng)消失
// 3. 拖拽結(jié)束后(速度小于一個(gè)閾值或者鼠標(biāo)抬起或者鼠標(biāo)移動(dòng)到了外面),旋轉(zhuǎn)幅度取消,上下浮動(dòng)重新開始
/** ************************設(shè)置拖拽和旋轉(zhuǎn)***************************** */
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) {
    // 拖拽的時(shí)候,取消上下浮動(dòng)
  }
  else {
    // 拖拽結(jié)束后,設(shè)置旋轉(zhuǎn)角度為 0 , 恢復(fù)上下浮動(dòng)
    setRotate(0)
    rotationDelta = 0
  }
})
/** **************************************************************** */
/** ************************通過速度計(jì)算旋轉(zhuǎn)幅度***************************** */
let lastX = x.value
let startTime = performance.now()
// 當(dāng)前角度 / 當(dāng)前速度 = 最大角度 / 最大速度
// 得出:當(dāng)前角度 = ( 最大角度 / 最大速度 ) * 當(dāng)前速度
// 然后再乘以一個(gè)系數(shù),用于調(diào)整旋轉(zhuǎn)幅度,角度跟速度的比例
const cfg = {
  maxVelocity: 10, // 最大速度
  maxRotation: 60, // 最大旋轉(zhuǎn)角度
  rotationFactor: 0.8, // 旋轉(zhuǎn)系數(shù),用于調(diào)整旋轉(zhuǎn)幅度
}
watch(x, () => {
  const { velocity, newX, newTime } = calVelocity(lastX, x.value, startTime)
  const { maxVelocity, maxRotation, rotationFactor } = cfg
  // 速度除以最大速度,將速度歸一化為一個(gè)介于 0 和 1 之間的小數(shù)值,表示速度相對于最大速度的比例。
  // 將這個(gè)比例值乘以最大旋轉(zhuǎn)角度 maxRotation,這樣就得到了基于速度的旋轉(zhuǎn)角度
  // 但這得出的仍是一個(gè)相對值,最后,再將這個(gè)相對的旋轉(zhuǎn)角度乘以旋轉(zhuǎn)系數(shù) rotationFactor,以調(diào)整最終的旋轉(zhuǎn)幅度。
  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隨拖拽速度設(shè)置傾斜角度的實(shí)現(xiàn)代碼的詳細(xì)內(nèi)容,更多關(guān)于JS設(shè)置傾斜角度的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript實(shí)現(xiàn)簡單獲取本地圖片主色調(diào)

    JavaScript實(shí)現(xiàn)簡單獲取本地圖片主色調(diào)

    想象一個(gè)場景,就是如何根據(jù)一張圖片大概提取出它的主色調(diào)呢?獲取主色調(diào)后,可能會(huì)用來設(shè)置某些背景顏色,這里,利用?JS?簡單獲取本地圖片主色調(diào),希望對大家有所幫助
    2023-03-03
  • 基于JavaScript打造一款桌面級便簽系統(tǒng)

    基于JavaScript打造一款桌面級便簽系統(tǒng)

    本文將用html,css和JavaScript實(shí)現(xiàn)一個(gè)簡單的便簽系統(tǒng)。除非手動(dòng)清空便簽,否則便簽會(huì)一直保留,非常方便。感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-02-02
  • js格式化時(shí)間的方法

    js格式化時(shí)間的方法

    這篇文章主要介紹了js格式化時(shí)間的方法,對javascript時(shí)間格式化的方法進(jìn)行了總結(jié),感興趣的小伙伴們可以參考一下
    2015-12-12
  • 如何在JavaScript中使用localStorage詳情

    如何在JavaScript中使用localStorage詳情

    這篇文章主要介紹了如何在JavaScript中使用localStorage,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 微信小程序使用第三方庫Immutable.js實(shí)例詳解

    微信小程序使用第三方庫Immutable.js實(shí)例詳解

    Immutable 是 Facebook 開發(fā)的不可變數(shù)據(jù)集合。不可變數(shù)據(jù)一旦創(chuàng)建就不能被修改,是的應(yīng)用開發(fā)更簡單,允許使用函數(shù)式編程技術(shù),比如惰性評估。微信小程序無法直接使用Immutable.js,下面就來說說微信小程序如何使用第三方庫Immutable.js。
    2016-09-09
  • Javascript this關(guān)鍵字使用分析

    Javascript this關(guān)鍵字使用分析

    這是來自http://www.quirksmode.org/js/this.html這篇文章里對this的定義,直接看定義似乎什么也不知道,下面通過實(shí)例來說明各種情況下this所指代的對象以及原理。
    2008-10-10
  • Document.body.scrollTop的值總為零的快速解決辦法

    Document.body.scrollTop的值總為零的快速解決辦法

    這篇文章主要介紹了Document.body.scrollTop的值總為零的解決方法的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • javascript同頁面多次調(diào)用彈出層具體實(shí)例代碼

    javascript同頁面多次調(diào)用彈出層具體實(shí)例代碼

    一個(gè)在同一個(gè)頁面可多次調(diào)用的javascript彈出層效果,有需要的同學(xué)可以參考一下
    2013-08-08
  • html的DOM中document對象images集合用法實(shí)例

    html的DOM中document對象images集合用法實(shí)例

    這篇文章主要介紹了html的DOM中document對象images集合用法,實(shí)例分析了images集合的語法與使用技巧,需要的朋友可以參考下
    2015-01-01
  • JS實(shí)現(xiàn)加載時(shí)鎖定HTML頁面元素的方法

    JS實(shí)現(xiàn)加載時(shí)鎖定HTML頁面元素的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)加載時(shí)鎖定HTML頁面元素的方法,涉及javascript針對頁面元素的遍歷與屬性操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06

最新評論

象山县| 繁峙县| 北辰区| 固始县| 凯里市| 云林县| 山西省| 德安县| 苏州市| 高淳县| 永寿县| 蕉岭县| 上林县| 博罗县| 西吉县| 吴旗县| 水城县| 资阳市| 文昌市| 原阳县| 大兴区| 攀枝花市| 汕尾市| 苍梧县| 诏安县| 乐山市| 微山县| 教育| 惠东县| 大安市| 富宁县| 内黄县| 汉阴县| 吉安县| 报价| 东乌| 洮南市| 盐边县| 新源县| 永新县| 安乡县|