欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

js怎么實(shí)現(xiàn)拖動(dòng)緩動(dòng)效果-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)js怎么實(shí)現(xiàn)拖動(dòng)緩動(dòng)效果,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

為長(zhǎng)洲等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及長(zhǎng)洲網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、長(zhǎng)洲網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

js怎么實(shí)現(xiàn)拖動(dòng)緩動(dòng)效果

這個(gè)效果看似很簡(jiǎn)單,到也困惑了很長(zhǎng)時(shí)間,為什么別人寫出來(lái)的拖拽體驗(yàn)為什么這么好?
直到我自己實(shí)現(xiàn)了以后,才發(fā)現(xiàn),原來(lái)我想的實(shí)現(xiàn)方式不對(duì)。接下來(lái),我通過(guò)簡(jiǎn)短的幾句話,來(lái)提供這個(gè)功能的實(shí)現(xiàn)思路。

首先,我們要明白,我們鼠標(biāo)拖拽是在一個(gè)2d平面上拖拽
2d平面只有x軸和y軸,而且獲取的拖拽值也是基于平面的像素獲取的。所以,我們第一步,先通過(guò)鼠標(biāo)事件來(lái)獲取到當(dāng)前的拖拽的長(zhǎng)度像素。

首先,綁定鼠標(biāo)按下事件,來(lái)獲取到鼠標(biāo)基于瀏覽器窗口左上角的xy平面二維坐標(biāo)。

然后,綁定move事件,在move事件回調(diào)內(nèi)獲取到鼠標(biāo)拖拽的坐標(biāo),和按下坐標(biāo)相減,求出拖拽的距離。

然后,我們需要通過(guò)一定比例,將拖拽的像素轉(zhuǎn)換為旋轉(zhuǎn)角度
我這里設(shè)置的比例是,
鼠標(biāo)橫向拖拽10像素,那模型沿3d的Y軸坐標(biāo)就旋轉(zhuǎn)5度,
鼠標(biāo)縱向拖拽10像素,模型沿3d世界的X軸坐標(biāo)旋轉(zhuǎn)1度,并且還設(shè)置了范圍,即沿x軸旋轉(zhuǎn)再-45度到45度之間

function onDocumentMouseMove(event) {
    mouseX = event.clientX;
    mouseY = event.clientY;
    targetRotationX = targetRotationOnMouseDownX + (mouseX - mouseXOnMouseDownX) * 0.5;
    targetRotationY = Math.min(Math.max((targetRotationOnMouseDownY - (mouseY - mouseXOnMouseDownY) * 0.1), -45), 45); //拖拽后的目標(biāo)位置
  }

上面獲取到目標(biāo)角度,重點(diǎn)來(lái)了,如何實(shí)現(xiàn)惰性旋轉(zhuǎn)呢?

通過(guò)上面思路,我們知道了目標(biāo)角度,那么直接設(shè)置目標(biāo)角度,肯定就沒(méi)有這種想要的效果了,那么如何實(shí)現(xiàn)這種惰性效果呢?

接下來(lái),我們需要一個(gè)專門實(shí)現(xiàn)動(dòng)畫的requestAnimationFrame方法,這個(gè)方法是閑時(shí)運(yùn)行,大根據(jù)性能能夠達(dá)到60幀每秒,有好多小伙伴感覺(jué)一直遞歸運(yùn)行會(huì)不會(huì)卡頓,或者影響性能。那是你多慮了,這個(gè)方法會(huì)根據(jù)當(dāng)前頁(yè)面性能進(jìn)行減幀,保證頁(yè)面流暢運(yùn)行。

我們有了這個(gè)以后,然后做什么呢,就是用來(lái)實(shí)現(xiàn)緩動(dòng),在每一幀里面,獲取到目標(biāo)角度和當(dāng)前角度的角度差,然后每一次只選擇總進(jìn)度的百分之10 ,然后你會(huì)發(fā)現(xiàn)選擇離目標(biāo)角度越近,越慢,體驗(yàn)效果也是非常的棒。

而且在運(yùn)行中,角度也會(huì)無(wú)限制的接近目標(biāo)角度,當(dāng)前demo是通過(guò)css3d來(lái)實(shí)現(xiàn)的:

function animate() {
    requestAnimationFrame(animate);
    rotateY += (targetRotationX - rotateY) * 0.1;
    rotateX += (targetRotationY - rotateX) * 0.1;
    box.style.transform = 'rotateY(' + rotateY + 'deg)';
    item.style.transform = 'rotateX(' + rotateX + 'deg)';
  }

案例全部代碼

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <title>css3d翻轉(zhuǎn)</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    body {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      overflow: hidden;
      perspective: 1000px;
    }

    .item {
      width: 50vw;
      height: 50vh;
      transform: rotateX(-50deg);
      perspective: 5000px;
      transform-style: preserve-3d;
    }

    .box {
      background: #abb9c5;
      width: 100%;
      height: 100%;
      transform-style: preserve-3d;
      position: relative;
    }

    .font,
    .back {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      text-align: center;
      line-height: 50vh;

      background: #4cae4c;

      backface-visibility: hidden;
    }

    .back {
      background: #62ebff;
      transform: rotateY(180deg);
    }
  </style>
</head>

<body>
  <!--item 可以觸發(fā)翻轉(zhuǎn)的區(qū)域-->
  <div class="item">
    <!--box 可以翻轉(zhuǎn)的容器-->
    <div class="box">
      <!--font 默認(rèn)顯示的正面-->
      <div class="font">正面</div>
      <!--back 背面-->
      <div class="back">背面</div>
    </div>
  </div>
</body>
<script>
  var targetRotationX = 0;
  var targetRotationY = 0;
  var targetRotationOnMouseDownX = 0;
  var targetRotationOnMouseDownY = 0;
  var mouseX = 0;
  var mouseY = 0;
  var mouseXOnMouseDownX = 0;
  var mouseXOnMouseDownY = 0;
  var box = document.querySelector('.box');
  var item = document.querySelector('.item');

  var rotateY = 0;
  var rotateX = 0;

  init();
  animate();

  function init() {
    // EVENTS
    document.addEventListener('mousedown', onDocumentMouseDown, false);
    document.addEventListener('touchstart', onDocumentTouchStart, false);
    document.addEventListener('touchmove', onDocumentTouchMove, false);
  }

  function onDocumentMouseDown(event) {
    event.preventDefault();
    document.addEventListener('mousemove', onDocumentMouseMove, false);
    document.addEventListener('mouseup', onDocumentMouseUp, false);
    mouseXOnMouseDownX = event.clientX;
    mouseXOnMouseDownY = event.clientY;
    targetRotationOnMouseDownX = targetRotationX;
    targetRotationOnMouseDownY = targetRotationY;
  }

  function onDocumentMouseMove(event) {
    mouseX = event.clientX;
    mouseY = event.clientY;
    targetRotationX = targetRotationOnMouseDownX + (mouseX - mouseXOnMouseDownX) * 0.5;
    targetRotationY = Math.min(Math.max((targetRotationOnMouseDownY - (mouseY - mouseXOnMouseDownY) * 0.1), -45), 45); //拖拽后的目標(biāo)位置
  }

  function onDocumentMouseUp() {
    document.removeEventListener('mousemove', onDocumentMouseMove, false);
    document.removeEventListener('mouseup', onDocumentMouseUp, false);
  }

  function onDocumentTouchStart(event) {
    event.preventDefault();
    if (event.touches.length === 1) {
      mouseXOnMouseDownX = event.touches[0].pageX;
      mouseXOnMouseDownY = event.touches[0].pageY;
      targetRotationOnMouseDownX = targetRotationX;
      targetRotationOnMouseDownY = targetRotationY;
    }
  }

  function onDocumentTouchMove(event) {
    event.preventDefault();
    if (event.touches.length === 1) {
      mouseX = event.touches[0].pageX;
      mouseY = event.touches[0].pageY;
      targetRotationX = targetRotationOnMouseDownX + (mouseX - mouseXOnMouseDownX) * 0.5;
      targetRotationY = Math.min(Math.max((targetRotationOnMouseDownY - (mouseY - mouseXOnMouseDownY) * 0.1), -45), 45); //拖拽后的目標(biāo)位置
    }
  }

  function animate() {
    requestAnimationFrame(animate);
    rotateY += (targetRotationX - rotateY) * 0.1;
    rotateX += (targetRotationY - rotateX) * 0.1;
    box.style.transform = 'rotateY(' + rotateY + 'deg)';
    item.style.transform = 'rotateX(' + rotateX + 'deg)';
  }
</script>

</html>

關(guān)于“js怎么實(shí)現(xiàn)拖動(dòng)緩動(dòng)效果”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

網(wǎng)站題目:js怎么實(shí)現(xiàn)拖動(dòng)緩動(dòng)效果-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://aaarwkj.com/article32/pgcpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航、網(wǎng)站策劃、品牌網(wǎng)站制作、電子商務(wù)建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
国产精品毛片一区二区三区| 夫妻在线观看高清视频| 亚洲成人自拍在线视频| 丰满人妻侵犯中文字幕| 99亚洲伊人久久精品影院| 亚洲精品一区二区午夜| 性生活自制视频网站麻豆| 国产精品一区二区熟女| 少妇肥臀一区二区三区| 国产精品一区二区三区四区久久| 精品少妇高潮蜜臀av| 亚洲另类综合日韩一区| 久久一区二区三区播放| 高清区一区二区在线播放 | 国产精品久久一级黄片| 国产探花猛操性感美女| 亚洲av男人天堂一区| 欧美日韩综合精品无人区| 欧美久久久久综合一区| 国语精品对白交换日韩| 99久久这里只有精品视频| 97资源视频在线播放| 日本中文一区在线观看| 女同亚洲一区二区三区| 日韩在线欧美在线一区二区| 亚洲欧美中文字幕乱码| 久久成人免费在线电影| 人妻鲁丝一区二区三区| 午夜性生活免费观看视频| 免费成人激情在线电影| 亚洲国产日韩在线精品| 99久久精品费精品国产风间由美| 日本一区二区中文字幕在线| 国产黄色大片在线关看| 亚洲ve中文字幕久久一区二区| 亚洲一区免费在线视频| 国产一区二区麻豆视频| 日韩欧美另类精品在线| 国产三级三级三级三级三级| 久久久久久狠狠亚洲综合| 亚洲黄色av在线免费观看|