JS實(shí)現(xiàn)拖拽功能

拖拽功能是我們?nèi)粘m?xiàng)目中常用的效果,今天我們就來研究一下如何實(shí)現(xiàn)簡單的拖拽功能臂聋。
想實(shí)現(xiàn)拖拽功能其實(shí)很簡單光稼,主要需要三個(gè)事件:
1、mousedown:鼠標(biāo)按下
2孩等、mousemove:鼠標(biāo)移動(dòng)
3艾君、mouseup:鼠標(biāo)抬起

思路很簡單,鼠標(biāo)按下的時(shí)候肄方,記錄下鼠標(biāo)按下時(shí)的x,y冰垄,即e.clientX和e.clientY,還有記錄下當(dāng)前div的坐標(biāo)位置即div.offsetLeft及div.offsetTop权她。當(dāng)鼠標(biāo)移動(dòng)時(shí)虹茶,再次記錄下鼠標(biāo)當(dāng)前的x,y逝薪,
此時(shí)div坐標(biāo)分別為:
x=現(xiàn)在的鼠標(biāo)位置x-開始按下的鼠標(biāo)位置x+div的原始坐標(biāo)x
y=現(xiàn)在的鼠標(biāo)位置y-開始按下的鼠標(biāo)位置y+div的原始坐標(biāo)y
最后當(dāng)鼠標(biāo)抬起時(shí),解綁蝴罪。

下面上代碼:

  function drag(el){
            el.addEventListener('mousedown',function(e){  
                let start = {
                    x:e.clientX,
                    y:e.clientY
                }
                let startPos = {
                    x:css(el,'left'),
                    y:css(el,'top')
                }
                function move(e){
                    let dis = {
                        x:e.clientX-start.x,
                        y:e.clientY-start.y
                    }

                let x = dis.x+startPos.x;
                let y = dis.y+startPos.y;

                //邊界處理董济,取大小值
                x=  Math.max(0,x);
                x = Math.min(x,document.documentElement.clientWidth-box.clientWidth);
  
                y = Math.max(0,y);
                y = Math.min(y,document.documentElement.clientHeight-box.clientHeight);

              
                el.style.left = x+'px';
                el.style.top = y+'px';

                    
    
                 e.preventDefault();
                }
                document.addEventListener('mousemove',move);
                document.addEventListener('mouseup',function(){
                    document.removeEventListener('mousemove',move);
                      
            },{
                once:true
            });
        })
    
        }
        

是不是很簡單啊,下面擴(kuò)展一下碰撞檢測的方法:

function isContact(el1,el2){
            //獲取四條邊的位置
            let el1Pos = el1.getBoundingClientRect();
            let el2Pos = el2.getBoundingClientRect();
            if(//碰上
                el1Pos.right>el2Pos.left&&
                el1Pos.left<el2Pos.right&&
                el1Pos.bottom>el2Pos.top&&
                el1Pos.top<el2Pos.bottom
            ){
                return true;
            }else{
                return false;
            }
        }

這里很好理解洲炊,簡單解釋一下getBoundingClientRect():
該方法是返回元素的大小及其相對(duì)于視口的位置感局,包含四個(gè)只讀屬性:left、right暂衡、top询微、bottom。

詳細(xì)可以參考MDN上對(duì)該方法的介紹:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getBoundingClientRect

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狂巢,一起剝皮案震驚了整個(gè)濱河市撑毛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唧领,老刑警劉巖藻雌,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斩个,居然都是意外死亡胯杭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門受啥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來做个,“玉大人,你說我怎么就攤上這事滚局【优” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵藤肢,是天一觀的道長太闺。 經(jīng)常有香客問我,道長嘁圈,這世上最難降的妖魔是什么省骂? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮最住,結(jié)果婚禮上冀宴,老公的妹妹穿的比我還像新娘。我一直安慰自己温学,他們只是感情好略贮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般逃延。 火紅的嫁衣襯著肌膚如雪览妖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天揽祥,我揣著相機(jī)與錄音讽膏,去河邊找鬼。 笑死拄丰,一個(gè)胖子當(dāng)著我的面吹牛府树,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播料按,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奄侠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了载矿?” 一聲冷哼從身側(cè)響起垄潮,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闷盔,沒想到半個(gè)月后弯洗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逢勾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年牡整,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溺拱。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逃贝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盟迟,到底是詐尸還是另有隱情秋泳,我是刑警寧澤潦闲,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布攒菠,位于F島的核電站,受9級(jí)特大地震影響歉闰,放射性物質(zhì)發(fā)生泄漏辖众。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一和敬、第九天 我趴在偏房一處隱蔽的房頂上張望凹炸。 院中可真熱鬧,春花似錦昼弟、人聲如沸啤它。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽变骡。三九已至离赫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塌碌,已是汗流浹背渊胸。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留台妆,地道東北人翎猛。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像接剩,于是被迫代替她去往敵國和親切厘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 好的搂漠,這次來看看用純js如何實(shí)現(xiàn)拖拽運(yùn)動(dòng)迂卢。源碼已上傳到github,需要的可以下載 https://github...
    江海大初學(xué)者閱讀 5,580評(píng)論 1 4
  • 在前端技術(shù)日新月異,飛速發(fā)展的當(dāng)下桐汤,涌現(xiàn)出了很多優(yōu)秀的開源框架以及優(yōu)秀的開源組件而克,這些都是優(yōu)秀的前端開發(fā)者的技術(shù)成...
    小興nice閱讀 4,075評(píng)論 0 14
  • 前言 本文依據(jù)半年前本人的分享《淺談js拖拽》撰寫,算是一篇遲到的文章怔毛。 基本思路 雖然現(xiàn)在關(guān)于拖拽的組件庫到處都...
    lanberts閱讀 2,430評(píng)論 0 0
  • 拖拽功能主要是用在讓用戶做一些自定義的動(dòng)作员萍,比如拖動(dòng)排序,彈出框拖動(dòng)移動(dòng)等等拣度,效果還是蠻不錯(cuò)的碎绎。下面講解一下拖拽的...
    kismetajun閱讀 1,552評(píng)論 0 12
  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的筋帖。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評(píng)論 1 11