基于Vue實(shí)現(xiàn)元素拖拽效果

在實(shí)現(xiàn)拖拽效果時(shí)需要先理解clientY pageY screenY layerY offsetY的區(qū)別

  • clientY 指的是距離可視頁(yè)面左上角的距離
  • pageY 指的是距離可視頁(yè)面左上角的距離(不受頁(yè)面滾動(dòng)影響)
  • screenY 指的是距離屏幕左上角的距離
  • layerY 指的是找到它或它父級(jí)元素中最近具有定位的左上角距離
  • offsetY 指的是距離它自己左上角的距離

思路

  • onmousedown:鼠標(biāo)按下事件
  • onmousemove:鼠標(biāo)移動(dòng)事件
  • onmouseup:鼠標(biāo)抬起事件
拖拽的基本原理就是根據(jù)鼠標(biāo)的移動(dòng)來(lái)移動(dòng)被拖拽的元素德玫。鼠標(biāo)的移動(dòng)也就是x、y坐標(biāo)的變化;元素的移動(dòng)就是style.position的 top和left的改變椎麦。當(dāng)然宰僧,并不是任何時(shí)候移動(dòng)鼠標(biāo)都要造成元素的移動(dòng),而應(yīng)該判斷鼠標(biāo)左鍵的狀態(tài)是否為按下?tīng)顟B(tài)观挎,是否是在可拖拽的元素上按下
    拖拽狀態(tài) = 鼠標(biāo)在元素上按下的時(shí)候{      
        記錄下鼠標(biāo)的x和y坐標(biāo)      
        記錄下元素的x和y坐標(biāo)      
       }   
    鼠標(biāo)在元素上移動(dòng)的時(shí)候{      
        元素y = 現(xiàn)在鼠標(biāo)y - 原來(lái)鼠標(biāo)y + 原來(lái)元素y      
        元素x = 現(xiàn)在鼠標(biāo)x - 原來(lái)鼠標(biāo)x + 原來(lái)元素x      
        }      
    鼠標(biāo)在任何時(shí)候放開(kāi)的時(shí)候{      
       鼠標(biāo)彈起來(lái)的時(shí)候不再移動(dòng)      
    } 

直接上代碼撒桨,代碼中有注釋

    <template>
        <div class="drag">
            <div class="drag_box" v-drag></div>
        </div>
    </template>

    <script>
    export default {
        name: "drag",
        data() {
            return {};
        },
        //注冊(cè)局部組件指令
        directives: {
            drag: function(el) {
                let dragBox = el; //獲取當(dāng)前元素
                dragBox.onmousedown = e => {
                    //算出鼠標(biāo)相對(duì)元素的位置
                    let disX = e.clientX - dragBox.offsetLeft;
                    let disY = e.clientY - dragBox.offsetTop;
                    document.onmousemove = e => {
                        //用鼠標(biāo)的位置減去鼠標(biāo)相對(duì)元素的位置,得到元素的位置
                        let left = e.clientX - disX;
                        let top = e.clientY - disY;
                        //移動(dòng)當(dāng)前元素
                        dragBox.style.left = left + "px";
                        dragBox.style.top = top + "px";
                    };
                    document.onmouseup = e => {
                          //鼠標(biāo)彈起來(lái)的時(shí)候不再移動(dòng)
                          document.onmousemove = null;
                         //預(yù)防鼠標(biāo)彈起來(lái)后還會(huì)循環(huán)(即預(yù)防鼠標(biāo)放上去的時(shí)候還會(huì)移動(dòng))  
                        document.onmouseup = null;
                    };
                };
            }
        }
    };
    </script>
    <style scoped>
    .drag {
        width: 100%;
        height: 500px;
        background-color: #fff;
    }
    .drag_box {
        width: 150px;
        height: 90px;
        border: 1px solid #666;
        background-color: #ccc;
        /* 使用定位键兜,脫離文檔流 */
        position: relative;
        top: 100px;
        left: 100px;
        /* 鼠標(biāo)移入變成拖拽手勢(shì) */
        cursor: move;
        z-index: 3000;
    }
    </style>
實(shí)現(xiàn)效果截圖

這里卿洋
愿喜??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凤类,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子普气,更是在濱河造成了極大的恐慌谜疤,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件现诀,死亡現(xiàn)場(chǎng)離奇詭異夷磕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)仔沿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)坐桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人封锉,你說(shuō)我怎么就攤上這事绵跷”烀” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵碾局,是天一觀的道長(zhǎng)荆残。 經(jīng)常有香客問(wèn)我,道長(zhǎng)净当,這世上最難降的妖魔是什么内斯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮像啼,結(jié)果婚禮上俘闯,老公的妹妹穿的比我還像新娘。我一直安慰自己忽冻,他們只是感情好备徐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著甚颂,像睡著了一般蜜猾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上振诬,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天蹭睡,我揣著相機(jī)與錄音,去河邊找鬼赶么。 笑死肩豁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辫呻。 我是一名探鬼主播清钥,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼放闺!你這毒婦竟也來(lái)了祟昭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怖侦,失蹤者是張志新(化名)和其女友劉穎篡悟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匾寝,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搬葬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艳悔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片急凰。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猜年,靈堂內(nèi)的尸體忽然破棺而出抡锈,到底是詐尸還是另有隱情疾忍,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布企孩,位于F島的核電站,受9級(jí)特大地震影響袁稽,放射性物質(zhì)發(fā)生泄漏勿璃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一推汽、第九天 我趴在偏房一處隱蔽的房頂上張望补疑。 院中可真熱鬧,春花似錦歹撒、人聲如沸莲组。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锹杈。三九已至,卻和暖如春迈着,著一層夾襖步出監(jiān)牢的瞬間竭望,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工裕菠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咬清,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓奴潘,卻偏偏與公主長(zhǎng)得像旧烧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子画髓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344