精品熟人妻一区二区三区四区不卡-精品爽黄69天堂a-精品水蜜桃久久久久久久-精品丝袜国产自在线拍-精品丝袜国产自在线拍a-精品丝袜国产自在线拍免费看

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

JS拖動的原理

freeflydom
2025年4月3日 15:34 本文熱度 545

在 JavaScript 中實現(xiàn)元素的拖動效果,核心原理是通過監(jiān)聽鼠標事件(或觸摸事件)來計算元素的位置變化。以下是詳細的實現(xiàn)原理和步驟:


1. 核心事件

拖動需要處理三個關鍵事件:

  • mousedown(按下鼠標):標記拖動開始,記錄初始位置。
  • mousemove(移動鼠標):實時計算元素新位置并更新。
  • mouseup(松開鼠標):結束拖動,移除事件監(jiān)聽。

如果是移動端,對應的事件為 touchstart、touchmove 和 touchend。


2. 實現(xiàn)步驟

2.1 綁定 mousedown 事件

當用戶在目標元素上按下鼠標時,記錄:

  • 鼠標的初始位置clientXclientY)。
  • 元素的初始位置offsetLeftoffsetTop)。
  • 鼠標相對于元素左上角的偏移量(用于保持拖動時的相對位置)。
element.addEventListener('mousedown', function(e) {
  // 1. 記錄初始數(shù)據(jù)
  const startX = e.clientX;
  const startY = e.clientY;
  const elemLeft = element.offsetLeft;
  const elemTop = element.offsetTop;
  // 2. 計算鼠標在元素內(nèi)的偏移量
  const offsetX = startX - elemLeft;
  const offsetY = startY - elemTop;
  // 3. 綁定 mousemove 和 mouseup 事件
  document.addEventListener('mousemove', onMouseMove);
  document.addEventListener('mouseup', onMouseUp);
  function onMouseMove(e) {
    // 計算新位置
    const newX = e.clientX - offsetX;
    const newY = e.clientY - offsetY;
    
    // 更新元素位置
    element.style.left = newX + 'px';
    element.style.top = newY + 'px';
  }
  function onMouseUp() {
    // 移除事件監(jiān)聽
    document.removeEventListener('mousemove', onMouseMove);
    document.removeEventListener('mouseup', onMouseUp);
  }
});

2.2 關鍵細節(jié)

  • 事件委托到 document
    將 mousemove 和 mouseup 綁定到 document,而非元素本身。這樣即使鼠標快速移動超出元素區(qū)域,仍能正常觸發(fā)事件。

  • 性能優(yōu)化
    避免在 mousemove 中頻繁觸發(fā)重排(如讀取 offsetLeft),提前緩存初始值。

  • 邊界限制(可選)
    可添加邏輯限制元素在容器內(nèi)移動:

    const maxX = container.offsetWidth - element.offsetWidth;
    const maxY = container.offsetHeight - element.offsetHeight;
    newX = Math.max(0, Math.min(newX, maxX));
    newY = Math.max(0, Math.min(newY, maxY));
    

2.3 處理 CSS 定位

  • 元素必須設置為 position: absolute 或 position: fixed,才能通過 left 和 top 修改位置。
  • 使用 transform: translate() 實現(xiàn)位置變化(性能更優(yōu)):
    element.style.transform = `translate(${newX}px, ${newY}px)`;
    

3. 完整代碼示例

<div id="draggable" style="position: absolute; left: 0; top: 0;">拖動我</div>
<script>
  const element = document.getElementById('draggable');
  element.addEventListener('mousedown', startDrag);
  function startDrag(e) {
    e.preventDefault();
    
    const startX = e.clientX;
    const startY = e.clientY;
    const elemX = element.offsetLeft;
    const elemY = element.offsetTop;
    const offsetX = startX - elemX;
    const offsetY = startY - elemY;
    document.addEventListener('mousemove', onDrag);
    document.addEventListener('mouseup', stopDrag);
    function onDrag(e) {
      const newX = e.clientX - offsetX;
      const newY = e.clientY - offsetY;
      element.style.left = newX + 'px';
      element.style.top = newY + 'px';
    }
    function stopDrag() {
      document.removeEventListener('mousemove', onDrag);
      document.removeEventListener('mouseup', stopDrag);
    }
  }
</script>

4. 高級優(yōu)化

  • 防抖(Debounce):減少 mousemove 事件的觸發(fā)頻率。
  • 請求動畫幀(RAF):使用 requestAnimationFrame 優(yōu)化動畫流暢度。
  • 觸摸事件支持:通過 touchstart/touchmove 兼容移動端。
  • 拖拽反饋:添加半透明效果或占位符提升用戶體驗。

5. 原生拖拽 API 對比

HTML5 提供了原生拖放 API(draggable 屬性 + dragstart/dragover 事件),但:

  • 優(yōu)點:支持跨元素拖放、文件拖拽上傳。
  • 缺點:定制性較差,默認會顯示半透明圖像。

總結

通過監(jiān)聽鼠標事件、計算偏移量并更新元素位置,可以靈活實現(xiàn)自定義拖拽效果。相比原生 API,手動控制更適用于需要高度定制的場景(如游戲、復雜 UI 組件)。

轉自https://juejin.cn/post/7488524321788444723


該文章在 2025/4/3 15:35:05 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 中文字幕在线观 | 日本女优一区二区三区四区 | 91人妻中文字幕无码专区 | 午夜成人黄色电影 | 高潮喷水| 久草热在线观看 | 亚洲欧美一区二区三区国产 | 亚洲av自拍偷拍精品区 | 熟妇区毛片蜜桃 | 国产乱人伦精品一区二区 | 国产午夜无码精品免费看动漫 | 色婷婷五月 | 无码免费不卡av手机在线观看 | 性生交片免费无码看人 | 波多野结衣| 禁止18点击进入在线看片尤物 | 国产九色视 | 欧美日韩亚洲综合一区二区三区激 | 欧美日韩免费观看 | 精品免费无码一区二区三区 | 最新中文字慕 | 国家一级在线播放高潮 | 91久久99久91天天拍拍 | 国产精品一区二区久久精品 | 91传媒制片厂制作网 | 精品成在人线av无码免费看 | 成人老司机深夜福利久久 | 在线观看播放欧美国产 | 香蕉国产一区二区 | 精品亚洲成a人在线观看青青 | 欧美视频一区 | 国产免费趣味软件盘点:畅享高清 | 成人女人爽到高潮的a片羞羞动漫 | 亚洲美日韩av中文字幕无码 | 国产黄片三级视频 | 欧美日韩国产一区二区精品合集 | 中文字幕av无码一区二区三区电 | 精品伦精品一区二区三区视 | 99热国产这里只有精品无国产亚洲 | 国产精品天天看 | 国产乱子伦视频一区二区三区 |