原生js實現(xiàn)[2] 延時提示框

27499891022_164d330d95_z.jpg

打開QQ忱叭,把鼠標(biāo)放在你的頭像上不動管挟,會彈出你一個框展示你的個人信息轿曙,這個框就是延時提示框,它不像:hover僻孝,鼠標(biāo)離開后立即消失导帝,而是在短暫的延遲后才消失,這個看似簡單的小效果穿铆,在實際中用的非常多您单,而且其中的一些小細(xì)節(jié)也是值得揣摩的。

實現(xiàn)效果

誰能教我去掉水印>_<

原理分析

  1. 用display屬性控制div的顯隱荞雏。
  2. 用setTimeout()來控制延遲虐秦。

代碼分析

<style>
    div{ float: left; margin-left: 20px; }
    #div1{ width: 50px; height: 50px; background: red; }
    #div2{ width: 250px; height: 180px; background: #CCC; }
</style>
<body>
    <div id="div1"></div>
    <div id="div2"></div>
</body>

最簡單的控制div顯隱。

window.onload = function (){
    var oDiv1 = document.getElementById('div1');
    var oDiv2 = document.getElementById('div2');

    oDiv1.onmouseover = function (){
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        oDiv2.style.display = "none";
    };
};

但是這樣有個問題凤优,鼠標(biāo)一移出div1悦陋,div2就消失了,鼠標(biāo)永遠(yuǎn)也到不了div2上别洪,為了解決這個問題叨恨,我們給鼠標(biāo)移出加上定時器。

    oDiv1.onmouseover = function (){
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };

現(xiàn)在因為有延遲的存在挖垛,鼠標(biāo)可以移到div2上了痒钝,但是延遲一過,div2還是得消失痢毒,所以我們得給div2加上鼠標(biāo)移入事件:鼠標(biāo)移入div2時送矩,display = "block"。

    oDiv2.onmouseover = function (){
        oDiv2.style.display = "block";
    };

打開瀏覽器試試哪替,發(fā)現(xiàn)還是不行栋荸,延遲一過,div2還是消失了凭舶,怎么回事晌块?因為setTimeout()就像一個定時炸彈一樣,時間一到帅霜,該消失還是得消失匆背,所以我們必須得在鼠標(biāo)移入時關(guān)閉定時器,通常我們會聲明一個timer用來存放定時器身冀。

window.onload = function (){
    var oDiv1 = document.getElementById("div1");
    var oDiv2 = document.getElementById("div2");

    var timer = null;

    oDiv1.onmouseover = function (){
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 500);
    };
    oDiv2.onmouseover = function(){
        clearTimeout(timer);
        oDiv2.style.display = "block";
    };
};

這下總行了吧钝尸?其實有經(jīng)驗的同學(xué)應(yīng)該能看出來括享,這樣鼠標(biāo)確實能移入div2了,但是從div2移出后div2并不會消失珍促,因為沒有移出事件铃辖,移出時應(yīng)該把div2的display改為none,并且也應(yīng)該加上定時器猪叙,同時娇斩,根據(jù)以往的經(jīng)驗,移出時加了定時器穴翩,在移入是應(yīng)該關(guān)閉定時器成洗,要不然鼠標(biāo)回到div1時div2又消失了,而實際的效果應(yīng)該是不論鼠標(biāo)在div1上還是在div2上藏否,div2都應(yīng)該顯示的,所以我們可以在每次鼠標(biāo)移入div1時都先關(guān)閉定時器充包。

    var timer=null;
    
    oDiv1.onmouseover = function (){
        clearTimeout(timer);
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };
    oDiv2.onmouseover = function (){
        oDiv2.style.display = "block";
        clearTimeout(timer);
    };
    oDiv2.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };

至此副签,我們的延時提示框已經(jīng)完成了,沒有bug基矮。但是淆储!我們仔細(xì)看看代碼,有沒有發(fā)現(xiàn)好像兩個div的移入事件一樣家浇,移出事件也一樣啊本砰。偉大的黨曾教導(dǎo)我們,代碼能簡化的要簡化钢悲,寫出的代碼要優(yōu)雅点额。so,我們簡化合并一下莺琳。

window.onload = function (){
    var oDiv1 = document.getElementById("div1");
    var oDiv2 = document.getElementById("div2");

    var timer = null;
    
    oDiv2.onmouseover = oDiv1.onmouseover = function (){
        clearTimeout(timer);
        oDiv2.style.display = "block";
    };
    oDiv2.onmouseout = oDiv1.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };
};

分析總結(jié)

  1. js中是可以用連等的还棱,能用就用,代碼將簡化不少惭等。

  2. 一開始總會想當(dāng)然地把程序想簡單珍手,可是一測試才知道少這少那,這是大家年輕時候的通病辞做。也許是經(jīng)歷的多了琳要,那些老師們、大神們無論面對看起來多么簡單的問題都會嚴(yán)謹(jǐn)?shù)姆治龀用唤z不茍稚补,這種態(tài)度,讓我慚愧的同時嫂伞,也讓我感受到了一點作為程序員的情懷孔厉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拯钻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撰豺,更是在濱河造成了極大的恐慌粪般,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件污桦,死亡現(xiàn)場離奇詭異亩歹,居然都是意外死亡,警方通過查閱死者的電腦和手機凡橱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門小作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稼钩,你說我怎么就攤上這事顾稀。” “怎么了坝撑?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵静秆,是天一觀的道長。 經(jīng)常有香客問我巡李,道長抚笔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任侨拦,我火速辦了婚禮殊橙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狱从。我一直安慰自己膨蛮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布季研。 她就那樣靜靜地躺著鸽疾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪训貌。 梳的紋絲不亂的頭發(fā)上制肮,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音递沪,去河邊找鬼豺鼻。 笑死,一個胖子當(dāng)著我的面吹牛款慨,可吹牛的內(nèi)容都是我干的儒飒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼檩奠,長吁一口氣:“原來是場噩夢啊……” “哼桩了!你這毒婦竟也來了附帽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤井誉,失蹤者是張志新(化名)和其女友劉穎蕉扮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颗圣,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喳钟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了在岂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奔则。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔽午,靈堂內(nèi)的尸體忽然破棺而出易茬,到底是詐尸還是另有隱情,我是刑警寧澤及老,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布疾呻,位于F島的核電站,受9級特大地震影響写半,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尉咕,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一叠蝇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧年缎,春花似錦悔捶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洲鸠,卻和暖如春堂淡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扒腕。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工绢淀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘾腰。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓皆的,卻偏偏與公主長得像箕昭,于是被迫代替她去往敵國和親囚巴。 傳聞我的和親對象是個殘疾皇子漆魔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,595評論 2 350

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

  • jQuery基礎(chǔ) 什么是JQ部宿?一個優(yōu)秀的JS庫,大型開發(fā)必備JQ的好處楞抡?一簡化JS的復(fù)雜操作二不再需要關(guān)心兼容性三...
    幺七閱讀 941評論 0 2
  • 一)jQuery九類選擇器【參見jQueryAPI.chm手冊】 目的:通過九類選擇器伟众,能定位web頁面(HTML...
    奮斗的老王閱讀 1,035評論 0 51
  • 焦點事件焦點事件會在頁面元素獲得或失去焦點時觸發(fā)赂鲤。確定瀏覽器是否支持該類事件! var isSu...
    Miss____Du閱讀 6,522評論 1 10
  • 本文以div元素布局為例柱恤。教程開始:首先要知道数初,div是塊級元素(div與span),在頁面中獨占一行梗顺,自上而下排...
    TW妖妖閱讀 386評論 0 1
  • 春天呵泡孩! 你的來臨, 喚醒沉睡的大地寺谤, 點綴新生的綠草仑鸥, 招展舞動的花蕾。 燕的使者变屁, 請告訴我眼俊, 等你離去, 我...
    堯嘉閱讀 204評論 0 0