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

JavaScript實(shí)現(xiàn)div的鼠標(biāo)拖拽效果

 更新時(shí)間:2021年11月07日 12:26:42   作者:雪旭  
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)div的鼠標(biāo)拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了JavaScript實(shí)現(xiàn)div鼠標(biāo)拖拽效果的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)原理鼠標(biāo)按下時(shí)根據(jù)onmousemove事件來(lái)動(dòng)態(tài)獲取鼠標(biāo)坐標(biāo)位置以此來(lái)更新div的位置,實(shí)現(xiàn)的前提時(shí)div要有一個(gè)定位效果,不然的話是移動(dòng)不了它的。

HTML

<div class="box"></div>

CSS樣式

.box {
    position: absolute;
    width: 200px;
    height: 200px;
    background: red;    
    }

首先先分析一下需求,這個(gè)需求就是點(diǎn)擊時(shí)鼠標(biāo)按下你才能移動(dòng)并改變div在頁(yè)面中的位置。鼠標(biāo)松開(kāi)你就不能在移動(dòng)了。所以這里鼠標(biāo)的狀態(tài)有三個(gè),分別是點(diǎn)擊時(shí)鼠標(biāo)按下(mousedown事件)、移動(dòng)時(shí)(mousemove事件)、松開(kāi)時(shí)(mouseup事件)

所以js部分有三個(gè)事件。

JS部分

var box = document.getElementsByClassName("box")[0];//獲取元素
var x, y;//存儲(chǔ)div的坐標(biāo)
var isDrop = false;//移動(dòng)狀態(tài)的判斷鼠標(biāo)按下才能移動(dòng)

鼠標(biāo)按下時(shí)

box.onmousedown = function(e) {
                var e = e || window.event;//要用event這個(gè)對(duì)象來(lái)獲取鼠標(biāo)的位置
                x = e.clientX - box.offsetLeft;
                y = e.clientY - box.offsetTop;
                isDrop = true;//設(shè)為true表示可以移動(dòng)
            }

e.clientX鼠標(biāo)x軸的位置,e.clientY鼠標(biāo)Y軸的位置,box.offsetLeft獲取div距離左邊的距離,box.offsetTop獲取div距離上邊的距離。

如下圖所示 e.clientX - box.offsetLeft我們可以得到坐標(biāo)點(diǎn)x與 box.offsetLeft之間的偏差值,我們要再用坐標(biāo)點(diǎn)x減去這個(gè)偏差值才是div真實(shí)相對(duì)于左邊移動(dòng)的距離,e.clientY - box.offsetTop同理得到的是距離上邊偏移的距離。

鼠標(biāo)移動(dòng)時(shí)

為了防止鼠標(biāo)移動(dòng)過(guò)快事件無(wú)法正確處理所以事件綁定到document上

document.onmousemove = function(e) {
         //是否為可移動(dòng)狀態(tài)
         if(isDrop) {
                    var e = e || window.event;
              
                      var moveX = e.clientX - x;//得到距離左邊移動(dòng)距離
                      var moveY = e.clientY - y;//得到距離上邊移動(dòng)距離
                  
                      box.style.left = moveX + "px";
                      box.style.top = moveY + "px";
          }else{
                       return ;
          }

            }

e.clientX - x 鼠標(biāo)點(diǎn)坐標(biāo)減去偏差得到div距離左邊的距離,e.clientY - y 鼠標(biāo)點(diǎn)坐標(biāo)減去偏差得到div距離上邊的距離。給div的left,top重新賦值

鼠標(biāo)松開(kāi)時(shí)

為了放置鼠標(biāo)移動(dòng)過(guò)快時(shí)間無(wú)法正確處理所以事件綁定到document上

document.onmouseup = function() {
                isDrop = false;//設(shè)置為false不可移動(dòng)
            }

現(xiàn)在div已經(jīng)可以拖拽了,目前還需要添加一個(gè)范圍限定,不然div會(huì)拖到頁(yè)面外面去,這樣不行的所以得添加范圍限定。div最大移動(dòng)寬度為頁(yè)面寬減去div的寬,最小為零,最大高為頁(yè)面高減去div的高,最小為零。所以范圍限定要這樣寫(xiě)

document.onmousemove = function(e) {
      var e = e || window.event;
                if(is) {
                    var moveX = e.clientX - x;
                    var moveY = e.clientY - y;
                    var maxX = document.documentElement.clientWidth - box.offsetWidth;//X軸可移動(dòng)最大距離
                    var maxY = document.documentElement.clientHeight - box.offsetHeight;//Y軸可移動(dòng)最大距離
                    

                    //范圍限定  最小時(shí)取最大  最大時(shí)取最小
                    if(moveX < 0) {
                        moveX=0
                     }else if(moveX>maxX){
                        moveX=maxX;
                    }
                    
                    if(moveY < 0) {
                        moveY=0;
                    }else if(moveY>maxY){
                        moveY=maxY; 
                    }

                    box.style.left = moveX + "px";
                    box.style.top = moveY + "px";

                } else {
                    return;
                }

            }

這樣效果就完美實(shí)現(xiàn)了,但是范圍限定我們還可以這樣做。

可以這樣表示范圍限定

//范圍限定  最小取最大  最大取最小
     if(moveX < 0) {
           moveX= Math.max(0,moveX)//0
     }else if(moveX>maxX){
           moveX=Math.min(moveX,maxX);//maxX
     }
                    
      if(moveY < 0) {
          moveY= Math.max(0,moveY) //0
      }else if(moveY>maxY){
           moveY=Math.min(moveY,maxY); //maxY
      }

所以我們可以這樣寫(xiě)

moveX=Math.min(maxX, Math.max(0,moveX));
moveY=Math.min(maxY, Math.max(0,moveY));

然后完整代碼

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .box {
                position: absolute;
                width: 200px;
                height: 200px;
                background: red;
            }
        </style>
    </head>

    <body>
        <div class="box"></div>
        <script>
            var box = document.getElementsByClassName("box")[0]; //獲取元素
            var x, y; //鼠標(biāo)相對(duì)與div左邊,上邊的偏移
            var isDrop = false; //移動(dòng)狀態(tài)的判斷鼠標(biāo)按下才能移動(dòng)
            box.onmousedown = function(e) {
                var e = e || window.event; //要用event這個(gè)對(duì)象來(lái)獲取鼠標(biāo)的位置
                x = e.clientX - box.offsetLeft;
                y = e.clientY - box.offsetTop;
                isDrop = true; //設(shè)為true表示可以移動(dòng)
            }

            document.onmousemove = function(e) {
                //是否為可移動(dòng)狀態(tài)                                   
                if(isDrop) {    
                    var e = e || window.event;                      
                    var moveX = e.clientX - x; //得到距離左邊移動(dòng)距離                      
                    var moveY = e.clientY - y; //得到距離上邊移動(dòng)距離
                    //可移動(dòng)最大距離
                    var maxX = document.documentElement.clientWidth - box.offsetWidth;
                    var maxY = document.documentElement.clientHeight - box.offsetHeight;

                    //范圍限定  當(dāng)移動(dòng)的距離最小時(shí)取最大  移動(dòng)的距離最大時(shí)取最小
                    //范圍限定方法一
                    /*if(moveX < 0) {
                        moveX = 0
                    } else if(moveX > maxX) {
                        moveX = maxX;
                    }

                    if(moveY < 0) {
                        moveY = 0;
                    } else if(moveY > maxY) {
                        moveY = maxY;
                    } */
                    //范圍限定方法二 
                    moveX=Math.min(maxX, Math.max(0,moveX));
                    
                    moveY=Math.min(maxY, Math.max(0,moveY));
                    box.style.left = moveX + "px";  
                    box.style.top = moveY + "px";          
                } else {
                    return;          
                }

            }

            document.onmouseup = function() {
                isDrop = false; //設(shè)置為false不可移動(dòng)
            }
        </script>
    </body>

</html>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何創(chuàng)建?JavaScript?自定義事件

    如何創(chuàng)建?JavaScript?自定義事件

    這篇文章主要介紹了如何創(chuàng)建?JavaScript?自定義事件,我們將通過(guò)文章學(xué)習(xí)到有關(guān)創(chuàng)建自定義事件,偵聽(tīng)自定義事件以及創(chuàng)建雙擊自定義事件所要了解的內(nèi)容,需要的朋友可以參考一下
    2022-05-05
  • javascript 作用于作用域鏈的詳解

    javascript 作用于作用域鏈的詳解

    這篇文章主要介紹了javascript 作用于作用域鏈的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • JavaScript中神奇的call()方法

    JavaScript中神奇的call()方法

    這篇文章主要介紹了JavaScript中神奇的call()方法,本文用淺顯的語(yǔ)言幫助你加深理解call()方法,需要的朋友可以參考下
    2015-03-03
  • Bootstrap實(shí)現(xiàn)下拉菜單效果

    Bootstrap實(shí)現(xiàn)下拉菜單效果

    這篇文章主要為大家詳細(xì)介紹了Bootstrap實(shí)現(xiàn)下拉菜單效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Javascript實(shí)現(xiàn)倒計(jì)時(shí)(防頁(yè)面刷新)實(shí)例

    Javascript實(shí)現(xiàn)倒計(jì)時(shí)(防頁(yè)面刷新)實(shí)例

    本文分享了Javascript實(shí)現(xiàn)倒計(jì)時(shí)并且頁(yè)面不刷新的實(shí)例,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • swiper.js插件實(shí)現(xiàn)pc端文本上下滑動(dòng)功能示例

    swiper.js插件實(shí)現(xiàn)pc端文本上下滑動(dòng)功能示例

    這篇文章主要介紹了swiper.js插件實(shí)現(xiàn)pc端文本上下滑動(dòng)功能,結(jié)合實(shí)例形式分析了swiper.js插件的具體引用與相關(guān)使用技巧,需要的朋友可以參考下
    2018-12-12
  • JavaScript“盡快失敗”的原則實(shí)例詳解

    JavaScript“盡快失敗”的原則實(shí)例詳解

    我第一次聽(tīng)說(shuō)編碼原則中有“盡快失敗”這一條時(shí),覺(jué)得很奇怪,為什么代碼要失敗?應(yīng)該成功才對(duì)呀。下面小編通過(guò)實(shí)例代碼給大家介紹js 盡快失敗的原則,一起看看吧
    2016-10-10
  • 原生js實(shí)現(xiàn)模擬滾動(dòng)條

    原生js實(shí)現(xiàn)模擬滾動(dòng)條

    本文給大家分享的是使用原生javascript實(shí)現(xiàn)模擬滾動(dòng)條的方法及代碼,效果非常棒,有需要的小伙伴可以參考下。
    2015-06-06
  • JS中的new Map()方法介紹

    JS中的new Map()方法介紹

    Map 是 JavaScript 中非常強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),它提供了比傳統(tǒng)對(duì)象更多的靈活性和功能,本文給大家介紹JS中的new Map()方法,感興趣的朋友一起看看吧
    2025-04-04
  • JS獲取URL中的參數(shù)數(shù)據(jù)

    JS獲取URL中的參數(shù)數(shù)據(jù)

    這篇文章主要介紹了JS獲取URL中的參數(shù)數(shù)據(jù),有需要的朋友可以參考一下
    2013-12-12

最新評(píng)論

获嘉县| 潍坊市| 商丘市| 正阳县| 封丘县| 舞阳县| 夏津县| 伊吾县| 大庆市| 穆棱市| 杭锦旗| 大名县| 娱乐| 双辽市| 泸定县| 丘北县| 汾西县| 新宾| 台前县| 乌拉特后旗| 葵青区| 稷山县| 同仁县| 中江县| 蓬莱市| 淮安市| 扎兰屯市| 牙克石市| 青海省| 酒泉市| 米林县| 龙里县| 资源县| 隆回县| 新闻| 高清| 新乡市| 长武县| 郓城县| 晋中市| 象山县|