LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

超酷HTML5的網頁拖拽功能

freeflydom
2025年8月7日 17:6 本文熱度 416

作為一名前端萌新,今天終于搞懂了HTML5的拖拽功能!原來那些像iPad一樣絲滑的拖拽交互,背后是這么實現的。我們先看看具體效果

 下面是我的學習筆記,保證通俗易懂,一起看看吧~

一、HTML5拖拽為啥這么牛?

看看你手機里的APP就知道:拖拽排序、拖拽上傳、拖拽分享...這些操作完全符合人類直覺!HTML5把這種體驗帶到了網頁里,核心就靠draggable屬性和幾個神奇的事件:

<!-- 關鍵代碼:讓元素可拖拽 -->
<div class="fill" draggable="true"></div>

這個簡單的屬性就能激活瀏覽器的原生拖拽引擎,比用鼠標事件模擬流暢多了!難怪連Google都在用拖拽上傳文件呢。

二、拖拽的完整生命周期

想象一下拖拽的物理過程:

  1. 抓起物體 → dragstart
  2. 懸停在目標上方 → dragenter + dragover
  3. 移出目標區域 → dragleave
  4. 松手放下 → drop
  5. 全程結束 → dragend

三、手把手實現圖片拖拽

直接上代碼!這里實現的是把圖片拖到空白容器中:

?? HTML結構

<body>
  <!-- 圖片容器 -->
  <div class="empty">
    <div class="fill" draggable="true"></div>
  </div>
  
  <!-- 四個空白容器 -->
  <div class="empty"></div>
  <div class="empty"></div>
  <div class="empty"></div>
  <div class="empty"></div>
</body>

?? CSS樣式(核心技巧)

 * {
            box-sizing: border-box;
        }
        body {
            background-color: steelblue;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;
            overflow: hidden;
            margin: 0;
        }
        .empty {
            background: white;
            height: 150px;
            width: 150px;
            margin: 10px;
            border: 3px solid #000;
        }
        .fill {
            background-image: url('https://img1.baidu.com/it/u=400864332,910444934&fm=253&fmt=auto&app=138&f=JPEG?w=514&h=500');
            width: 145px;
            height: 145px;
            cursor: pointer;
            background-size: cover;
        }
        .hovered {
            background-color: #333;
            border-color: white;
            border-style: dashed;
        }
        .hold {
            border: 5px solid #ccc;
        }
        .invisible {
            opacity: 0.4;
        }

? JavaScript事件處理

 const fill = document.querySelector('.fill');
        const empties = document.querySelectorAll('.empty');
        const body = document.body;
        // 冒泡機制
        // 拖拽事件
        body.addEventListener('dragstart', dragStart);
        // 拖拽結束
        body.addEventListener('dragend', dragEnd);
        for (let empty of empties) {
            empty.addEventListener('dragover', dragOver);
            empty.addEventListener('dragenter', dragEnter);
            empty.addEventListener('dragleave', dragLeave);
            empty.addEventListener('drop', drag);
        }
        // 拖拽進入
        function dragStart(e) {
            if (!e.target.classList.contains('fill')) {
                e.preventDefault(); // 阻止默認行為
                return;
            }
            fill.classList.add('hold');
            setTimeout(() => {
                fill.className = 'invisible';
            }, 0);
        }
        function dragEnd(e) {
            fill.className = 'fill';
        }
        // 拖拽經過
        function dragOver(e) {
            e.preventDefault();
        }
        // 拖拽進入
        function dragEnter(e) {
            e.preventDefault();
            e.target.classList.add('hovered');
        }
        // 拖拽離開
        function dragLeave(e) {
            e.preventDefault();
            e.target.classList.remove('hovered');
        }
        // 拖拽放下
        function drag(e) {
            this.className = 'empty';
            this.appendChild(fill);
        }

四、必知的三個關鍵細節

  1. 阻止默認行為是必須的!

     function dragStart(e) {
            if (!e.target.classList.contains('fill')) {
                e.preventDefault(); // 阻止默認行為
                return;
            }
            fill.classList.add('hold');
            setTimeout(() => {
                fill.className = 'invisible';
            }, 0);
        }
    

    瀏覽器默認不允許元素被"扔"到其他元素上。!e.target.classList.contains('fill')這一點很重要, 否則其他默認可拖拽的元素也會被拖拽,比如圖片

  2. 透明化的技巧

    setTimeout(() => {
      fill.className = 'invisible';
    }, 0);
    

    這個setTimeout妙在讓瀏覽器先渲染.hold樣式,再變透明,避免閃爍

  3. classList的精準控制
    classList.add/remove代替直接操作className,避免覆蓋其他樣式

五、移動端適配黑科技:媒體查詢

同一個網頁在手機和電腦上顯示不同?全靠這個神器:

@media (max-width: 800px) {
  body {
    flex-direction: column; /* 手機屏幕小就豎著排 */
  }
}

這就是響應式設計的核心!理解這個就能搞定多設備適配:

  • max-width: 800px → 小于800px寬度的設備生效(通常是手機)
  • 媒體查詢就像CSS的if語句如果屏幕滿足條件,應用這些樣式

可以看到具體效果,當右上角的寬度小于800px就會改變彈性布局的方式 

六、總結:今日重點收獲

技術點核心知識代碼示例
拖拽初始化draggable="true"屬性<div draggable="true">
拖拽事件流dragstart → dragover → drop → dragend6個關鍵事件
視覺反饋.hold/.hovered樣式類邊框變化+背景色變化
阻止默認行為e.preventDefault()dragover和dragenter中必須調用
響應式布局@media媒體查詢根據屏幕寬度調整布局

經驗之談:調試拖拽功能時,一定要在Chrome開發者工具中打開移動設備模式,測試手機上的觸屏操作是否正常!

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


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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲欧美国产爱 | 在线精品国产制服丝袜 | 亚洲人成在线观看 | 亚洲另类欧美综合久久图片区 | 亚洲视频区一区二区三 | 免费国产午夜精华视频 |