判斷鼠標(biāo)從哪個(gè)方向進(jìn)入元素

實(shí)現(xiàn)的效果動(dòng)圖如下

效果圖

理清需求

拿到效果圖的第一步,理清下需求~

  • 首先症汹,元素有左右上下四個(gè)方向。這邊的問題在我如何在一個(gè)元素上劃分上下左右四個(gè)區(qū)域贷腕?

  • 然后背镇,鼠標(biāo)進(jìn)入元素和離開元素會(huì)有觸發(fā)一個(gè)事件,這個(gè)簡(jiǎn)單js就自帶了監(jiān)聽事件泽裳。

  • 最后瞒斩,最難的是如何判斷鼠標(biāo)進(jìn)入的時(shí)候會(huì)落在我們劃分好的上下左右四個(gè)區(qū)域?

思路

  • 首先我們先來(lái)劃分下四個(gè)區(qū)域涮总,一般劃分的都如下圖


    區(qū)域劃分圖

    圖里面有四個(gè)三角形胸囱,每個(gè)三角形代表的是一個(gè)方向,所以問題簡(jiǎn)化為如何在一個(gè)矩形里瀑梗,根據(jù)對(duì)角線劃分區(qū)域烹笔。由于元素存在坐標(biāo)系,也就是X抛丽、Y軸谤职,所以問題再次抽象成,如何得到兩條對(duì)角線的線性函數(shù)亿鲜。(初高中數(shù)學(xué)問題允蜈。)

  • 最后的問題我們就要來(lái)搞定判斷鼠標(biāo)落點(diǎn)的問題,首先我們知道我們可以在元素的鼠標(biāo)事件中通過event得到鼠標(biāo)的pageX和pageY蒿柳,再配合元素的offsetLeft和offsetTop就可以得到鼠標(biāo)在元素中的坐標(biāo)饶套。綜合一下就變成了,我有一個(gè)坐標(biāo)其馏,且我知道對(duì)角線的函數(shù)表達(dá)式凤跑,請(qǐng)問我如何知道我這個(gè)坐標(biāo)是在函數(shù)的下面還是上面?

  • 當(dāng)然也許描述的比較抽象叛复,我們可以類比一個(gè)例子仔引,我現(xiàn)在有一個(gè)坐標(biāo)(2,1)扔仓,有一個(gè)函數(shù)y=x,值域大于0(既y>0)咖耘,定義域大于0(既x>0)翘簇,求該坐標(biāo)在y=x的函數(shù)下面還是上面?(是不是感覺到了線性規(guī)劃得到最優(yōu)解的味道儿倒,對(duì)版保,少年,沒有錯(cuò)夫否,就是這樣彻犁。)這里我們只要把坐標(biāo)中的x值代入函數(shù),然后判斷代入的結(jié)果是否大于坐標(biāo)的y值凰慈,如果大于則在函數(shù)下面汞幢,小于則在函數(shù)上面,什么微谓?你問等于怎么辦森篷?當(dāng)然是在函數(shù)上面,該坐標(biāo)即在上面又在下面豺型,所謂薛定諤的坐標(biāo)是也(當(dāng)然是在函數(shù)上了)仲智。

  • 然后我們是不是可以擴(kuò)展下,如果存在多個(gè)函數(shù)姻氨,再加上邏輯判斷經(jīng)常用的交集钓辆,并集是不是又有新的思維出現(xiàn)了呢?好了肴焊,這邊就不再擴(kuò)展了岩馍,下面直接上實(shí)現(xiàn)代碼吧。

實(shí)現(xiàn)代碼

注意:該demo只是簡(jiǎn)單的demo抖韩,其中有很多可以優(yōu)化的地方,比如組件化疫铜,變量?jī)?yōu)化茂浮,利用發(fā)布訂閱模式,實(shí)現(xiàn)事件聯(lián)動(dòng)

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css" >
        .ct{
            height: 100px;
            width: 100px;
            border:1px red solid;
        }
    </style>
</head>
<body>
    <div class="ct" onmouseover="fun1(event);" onmouseout="fun2(event);">
        
    </div>
    <script type="text/javascript">
        //當(dāng)然這樣綁定事件函數(shù)是不對(duì)的
    var div=document.getElementsByTagName("div")[0];
        function fun1(event){
            var x=event.pageX-div.offsetLeft;//(得到鼠標(biāo)在框中的坐標(biāo))
            var y=event.pageY-div.offsetTop;//(得到鼠標(biāo)在框中的坐標(biāo))
            var H=div.clientHeight;
            var W=div.clientWidth;
            var k=Math.floor(H/W);//為了防止不能整除
            //得到2個(gè)斜邊函數(shù)
            //設(shè)y=ax+c
            //(0,0) (width,height)其中一個(gè)斜邊過這兩點(diǎn)
            //a=height/width,c=0
            //y=(height/width)*x;
            //(0,height) (width,0)另外一個(gè)斜邊過這兩點(diǎn)
            //a=-height/width,c=height
            //y=-(height/width)*x+height
            if((k*x)>=y && (H-k*x)>=y){//這是判斷從上方進(jìn)入,這邊簡(jiǎn)化處理不對(duì)等于情況做特別處理
                console.log("從上方進(jìn)入");
                //todo
            }

            if((k*x)<y && (H-k*x)<y){
                console.log("從下方進(jìn)入");
                //todo
            }

            if((k*x)<y && (H-k*x)>y){
                console.log("從左邊進(jìn)入");
                //todo
            }

            if((k*x)>y && (H-k*x)<y){
                console.log("從右邊進(jìn)入");
                //todo
            }
            
        }
        function fun2(event){
            var x=event.pageX-div.offsetLeft;//(得到鼠標(biāo)在框中的坐標(biāo))
            var y=event.pageY-div.offsetTop;//(得到鼠標(biāo)在框中的坐標(biāo))
            var H=div.clientHeight;
            var W=div.clientWidth;
            var k=Math.floor(H/W);//為了防止不能整除
            //得到2個(gè)斜邊函數(shù)
            //設(shè)y=ax+c
            //(0,0) (width,height)其中一個(gè)斜邊過這兩點(diǎn)
            //a=height/width,c=0
            //y=(height/width)*x;
            //(0,height) (width,0)另外一個(gè)斜邊過這兩點(diǎn)
            //a=-height/width,c=height
            //y=-(height/width)*x+height
            if((k*x)>=y && (H-k*x)>=y){//這是判斷從上方進(jìn)入,這邊簡(jiǎn)化處理不對(duì)等于情況做特別處理
                console.log("從上方離開");
                //todo
            }

            if((k*x)<y && (H-k*x)<y){
                console.log("從下方離開");
                //todo
            }

            if((k*x)<y && (H-k*x)>y){
                console.log("從左邊離開");
                //todo
            }

            if((k*x)>y && (H-k*x)<y){
                console.log("從右邊離開");
                //todo
            }
            
        }
    </script>   
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壳咕,一起剝皮案震驚了整個(gè)濱河市席揽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓厘,老刑警劉巖幌羞,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竟稳,居然都是意外死亡属桦,警方通過查閱死者的電腦和手機(jī)熊痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)聂宾,“玉大人果善,你說我怎么就攤上這事∠敌常” “怎么了巾陕?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)纪他。 經(jīng)常有香客問我鄙煤,道長(zhǎng),這世上最難降的妖魔是什么茶袒? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任梯刚,我火速辦了婚禮,結(jié)果婚禮上弹谁,老公的妹妹穿的比我還像新娘乾巧。我一直安慰自己,他們只是感情好预愤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布沟于。 她就那樣靜靜地躺著,像睡著了一般植康。 火紅的嫁衣襯著肌膚如雪旷太。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天销睁,我揣著相機(jī)與錄音供璧,去河邊找鬼。 笑死冻记,一個(gè)胖子當(dāng)著我的面吹牛睡毒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冗栗,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼演顾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了隅居?” 一聲冷哼從身側(cè)響起钠至,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胎源,沒想到半個(gè)月后棉钧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涕蚤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年宪卿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了的诵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愧捕,死狀恐怖奢驯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情次绘,我是刑警寧澤瘪阁,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站邮偎,受9級(jí)特大地震影響管跺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禾进,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一豁跑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泻云,春花似錦艇拍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至婆瓜,卻和暖如春快集,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廉白。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工个初, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猴蹂。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓院溺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親磅轻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子覆获,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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