事件應(yīng)用

拖拽

拖拽原理

三大事件
+ onmousedown : 選擇元素
+ onmousemove : 移動(dòng)元素
+ onmouseup   : 釋放元素
<style>
div{
    height: 100px;
    width: 100px;
    background: yellowgreen;
    position: absolute;
}
</style>
<div id="div1"></div>
var oDiv = document.getElementById('div1');

oDiv.onmousedown = function(){
    oDiv.onmousemove = function(){//鼠標(biāo)移動(dòng)事件是在鼠標(biāo)按下事件之后

    }

    oDiv.onmouseup = function (){//鼠標(biāo)抬起之后要清除鼠標(biāo)按下事件
        oDiv.onmousemove= null;
        oDiv.onmouseup = null;
    }
}

- 鼠標(biāo)和Div的相對(duì)距離不變

var oDiv = document.getElementById('div1');

oDiv.onmousedown = function(ev){
    var ev = ev || window.event;

    //鼠標(biāo)和Div的相對(duì)距離 
    var disX = ev.clientX - oDiv.offsetLeft;
    var disY = ev.clientY - oDiv.offsetTop;

    oDiv.onmousemove = function(ev){
        var ev = ev || window.event;
        oDiv.style.left = ev.clientX - disX + 'px';
        oDiv.style.top = ev.clientY - disY + 'px';
    }

    oDiv.onmouseup = function (){
        oDiv.onmousemove= null;
        oDiv.onmouseup = null;
    }
}
把拖拽加到document上

如果拖得太快穿撮, 會(huì)移出div, 可以把onmousemove事件加在document上

注意:移出事件也是在doucment

var oDiv = document.getElementById('div1');

oDiv.onmousedown = function(ev){
    var ev = ev || window.event;
    var disX = ev.clientX - oDiv.offsetLeft;
    var disY = ev.clientY - oDiv.offsetTop;
    document.onmousemove = function(ev){
        var ev = ev || window.event;
        oDiv.style.left = ev.clientX - disX + 'px';
        oDiv.style.top = ev.clientY - disY + 'px';
    }

    oDiv.onmouseup = function (){
        document.onmousemove= null;
        oDiv.onmouseup = null;
    }
}
拖拽的問(wèn)題

如果拖拽文字或者圖片, 由于瀏覽器的默認(rèn)行為, 不能正常的拖拽

解決辦法: 阻止瀏覽器默認(rèn)行為

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<style>
img{;
    position: absolute;
}
</style>
</head>
<body>
    <img src="img/1.jpg" alt="">
<script>
var oImg = document.getElementsByTagName('img')[0];


oImg.style.position = 'absolute';
oImg.onmousedown = function(ev){
    var ev = ev || window.event;
    var disX = ev.clientX - oImg.offsetLeft;
    var disY = ev.clientY - oImg.offsetTop;
    document.onmousemove = function(ev){
        var ev = ev || window.event;
        oImg.style.left = ev.clientX - disX + 'px';
        oImg.style.top = ev.clientY - disY + 'px';
        return false;//阻止瀏覽器默認(rèn)行為

    }

    oImg.onmouseup = function (){
        document.onmousemove= null;
        oImg.onmouseup = null;
    }
    return false;//阻止瀏覽器默認(rèn)行為
}
</script>
</body>
</html>

拖拽的封裝

兩個(gè)步驟:

  1. 將拖拽代碼全部放進(jìn)drag函數(shù)中
  2. 把需要變化的變量改成參數(shù)
function drag(obj){
    obj.onmousedown = function(ev){
        var ev = ev || window.event;
        var disX = ev.clientX - obj.offsetLeft;
        var disY = ev.clientY - obj.offsetTop;
        document.onmousemove = function(ev){
            var ev = ev || window.event;
            obj.style.left = ev.clientX - disX + 'px';
            obj.style.top = ev.clientY - disY + 'px';
            return false;

        }

        obj.onmouseup = function (){
            document.onmousemove= null;
            obj.onmouseup = null;
        }
        return false;
    }

}
限制拖拽的范圍

在窗口內(nèi)拖動(dòng)

function drag(obj){
    obj.onmousedown = function(ev){
        var ev = ev || window.event;


        var disX = ev.clientX - obj.offsetLeft;
        var disY = ev.clientY - obj.offsetTop;
        document.onmousemove = function(ev){
            var ev = ev || window.event;


            var left  = ev.clientX - disX;
            var top = ev.clientY - disY;
            if(left<0){
                left=0;
            }
            else if(left>document.documentElement.clientWidth-obj.offsetWidth){
                left = document.documentElement.clientWidth-obj.offsetWidth;
            }
            if(top<0){
                top=0;
            }
            else if(top>document.documentElement.clientHeight-obj.offsetHeight){
                top = document.documentElement.clientHeight-obj.offsetHeight;
            }

            obj.style.left =  left + 'px';
            obj.style.top = top + 'px';
            return false;

        }

        obj.onmouseup = function (){
            document.onmousemove= null;
            obj.onmouseup = null;
        }
        return false;
    }

}
磁性吸附效果

比如說(shuō)以前的一些音樂(lè)播放器, 播放列表和歌詞是兩個(gè)分開(kāi)的面板, 可以分開(kāi)可以合并
合并的時(shí)候不需要精確的拖拽,而是拖拽到兩個(gè)面板距離很近時(shí)自動(dòng)合并

function drag(obj){
    obj.onmousedown = function(ev){
        var ev = ev || window.event;


        var disX = ev.clientX - obj.offsetLeft;
        var disY = ev.clientY - obj.offsetTop;
        document.onmousemove = function(ev){
            var ev = ev || window.event;


            var left  = ev.clientX - disX;
            var top = ev.clientY - disY;
            if(left<100){//距離可視區(qū)域范圍的四邊小于50px变勇,則元素將直接吸附對(duì)應(yīng)的邊上
                left=0;
            }
            else if(left>document.documentElement.clientWidth-obj.offsetWidth){
                left = document.documentElement.clientWidth-obj.offsetWidth;
            }
            if(top<0){
                top=0;
            }
            else if(top>document.documentElement.clientHeight-obj.offsetHeight){
                top = document.documentElement.clientHeight-obj.offsetHeight;
            }

            obj.style.left =  left + 'px';
            obj.style.top = top + 'px';
            return false;

        }

        obj.onmouseup = function (){
            document.onmousemove= null;
            obj.onmouseup = null;
        }
        return false;
    }

}

碰撞檢測(cè)

js中我們使用的是判斷兩個(gè)物體位置是否重合來(lái)判斷兩個(gè)物體是否發(fā)生了碰撞

常用的方法是使用九宮格法

拖動(dòng)div, 如果檢測(cè)到碰撞, 則改變圖片

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<style>
div{
    height: 100px;
    width: 100px;
    background: yellowgreen;
    position: absolute;

}

img{
    position: absolute;
    top: 300px;
    left: 500px;
}


</style>
</head>
<body>
    <div id="div1"></div>
    <img src="img/1.jpg" alt="">
<script>
function preventDefault(e) {
    if (e.preventDefault)
        e.preventDefault();
    else
        e.returnValue = false;
}

function addEvent(node, type, handler) {
    if (!node) return false;
    if (node.addEventListener) {
        node.addEventListener(type, handler, false);
        return true;
    }
    else if (node.attachEvent) {
        node['e' + type + handler] = handler;
        node[type + handler] = function() {
            node['e' + type + handler](window.event);
        };
        node.attachEvent('on' + type, node[type + handler]);
        return true;
    }
    return false;
}


function removeEvent(node, type, handler) {
    if (!node) return false;
    if (node.removeEventListener) {
        node.removeEventListener(type, handler, false);
        return true;
    }
    else if (node.detachEvent) {
        node.detachEvent('on' + type, node[type + handler]);
        node[type + handler] = null;
    }
    return false;
}

function drag(obj){



    addEvent(obj, 'mousedown', function(ev){
        function onMousemove(ev){
            var ev = ev || window.event;
            obj.style.left = ev.clientX - disX + 'px';
            obj.style.top = ev.clientY - disY + 'px';
            preventDefault(ev);
            
        }

        function onMouseup(ev){
            removeEvent(document, 'mousemove', onMousemove);
            removeEvent(document, 'mouseup', onMouseup);
        }


        var ev = ev || window.event;
        var disX = ev.clientX - obj.offsetLeft;
        var disY = ev.clientY - obj.offsetTop;
        addEvent(document, 'mousemove', onMousemove);
        addEvent(document, 'mouseup', onMouseup);

        preventDefault(ev);

        
    })

}



var oDiv = document.getElementById('div1');
var oImg = document.getElementsByTagName('img')[0];

drag(oDiv);

addEvent(oDiv, 'mousemove', function(ev){
    var ev = ev || window.event;
    
    var oDrag = this;
    var oDragL = oDrag.offsetLeft;
    var oDragT = oDrag.offsetTop;
    var oDragW = oDrag.offsetWidth;
    var oDragH = oDrag.offsetHeight;

    var oTarget = oImg;
    var oTargetL = oTarget.offsetLeft;
    var oTargetT = oTarget.offsetTop;
    var oTargetW = oTarget.offsetWidth;
    var oTargetH = oTarget.offsetHeight;



    if( oDragL > oTargetL - oDragW  && 
        oDragL < oTargetL+ oTargetW &&
        oDragT > oTargetT - oDragH  &&
        oDragT < oTargetT + oTargetH
    ){//碰撞
        oTarget.src = 'img/2.jpg';

    }
    else{
        oTarget.src = 'img/1.jpg';
    }
})

</script>
</body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末和蚪,一起剝皮案震驚了整個(gè)濱河市尽爆,隨后出現(xiàn)的幾起案子浇借,更是在濱河造成了極大的恐慌,老刑警劉巖彤断,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異易迹,居然都是意外死亡宰衙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)睹欲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)供炼,“玉大人,你說(shuō)我怎么就攤上這事窘疮〈撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵闸衫,是天一觀的道長(zhǎng)涛贯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蔚出,這世上最難降的妖魔是什么弟翘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任虫腋,我火速辦了婚禮,結(jié)果婚禮上稀余,老公的妹妹穿的比我還像新娘悦冀。我一直安慰自己,他們只是感情好睛琳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盒蟆。 她就那樣靜靜地躺著,像睡著了一般师骗。 火紅的嫁衣襯著肌膚如雪历等。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天丧凤,我揣著相機(jī)與錄音募闲,去河邊找鬼。 笑死愿待,一個(gè)胖子當(dāng)著我的面吹牛浩螺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仍侥,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼要出,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了农渊?” 一聲冷哼從身側(cè)響起患蹂,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砸紊,沒(méi)想到半個(gè)月后传于,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醉顽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年沼溜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片游添。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡系草,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唆涝,到底是詐尸還是另有隱情找都,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布廊酣,位于F島的核電站能耻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嚎京,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一嗡贺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞍帝,春花似錦诫睬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蚓曼,卻和暖如春亲澡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纫版。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工床绪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人其弊。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓癞己,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親梭伐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痹雅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 事件應(yīng)用 拖拽 拖拽原理 三大事件 -鼠標(biāo)和Div的相對(duì)距離不變 把拖拽加到document上 如果拖得太快,會(huì)移...
    卓小生閱讀 345評(píng)論 0 1
  • 拖拽 拖拽原理 三大事件 -鼠標(biāo)和Div的相對(duì)距離不變 把拖拽加到document上 如果拖得太快糊识,會(huì)移出div,...
    帕西呢么閱讀 301評(píng)論 0 0
  • 阻止默認(rèn)行為 標(biāo)準(zhǔn)下: event.preventDefault();//默認(rèn)菜單ie下: event.retur...
    overisover閱讀 584評(píng)論 0 0
  • DOM0 事件和DOM2級(jí)在事件監(jiān)聽(tīng)使用方式上有什么區(qū)別绩社? DOM0事件 通過(guò)JavaScript指定事件處理程序...
    ezrealor閱讀 184評(píng)論 0 1
  • 實(shí)現(xiàn)Tab切換的功能 實(shí)現(xiàn)下圖的模態(tài)框功能,點(diǎn)擊模態(tài)框不隱藏赂苗,點(diǎn)擊關(guān)閉以及模態(tài)框以外的區(qū)域模態(tài)框隱藏
    RookieD閱讀 376評(píng)論 0 0