基于JS如何實(shí)現(xiàn)類似QQ好友頭像hover時(shí)顯示資料卡的效果(推薦)
一、應(yīng)用場(chǎng)景
鼠標(biāo)hover彈出div,并且鼠標(biāo)離開(kāi)后不能馬上隱藏,因?yàn)檫@個(gè)div上還有功能入口。比如:
鼠標(biāo)經(jīng)過(guò)好友列表中的好友頭像時(shí)顯示資料卡的效果如下所示:

hover時(shí)顯示二維碼

二、實(shí)現(xiàn)
用如下這樣一個(gè)簡(jiǎn)單的效果:鼠標(biāo)hover到A上顯示B來(lái)模擬

有2種實(shí)現(xiàn)方式,推薦第二種,第一種有弊端下面會(huì)說(shuō)。
1、方法一
原理:把觸發(fā)元素A和要顯示元素B放于同一個(gè)父級(jí)元素內(nèi),鼠標(biāo)經(jīng)過(guò)父級(jí)元素時(shí)觸發(fā)顯示B。這樣鼠標(biāo)移動(dòng)到B時(shí)仍然 處于該父級(jí)元素內(nèi),則div不會(huì)隱藏。
代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>hover A show B</title>
<script src="http://code.jquery.com/jquery-1.12.2.min.js"></script>
<style type="text/css">
#hook { float: left; margin: 10px 0 10px 10px; width: 50px; height: 50px; background-color: #ccc; }
#msg-box { border: 1px solid black; width: 200px; height: 150px; display: none; float: left; padding: 10px }
</style>
</head>
<body>
<div id="hoverWrap">
<div id="hook">A</div>
<div id="msg-box">功能模塊B</div>
</div>
<script type="text/javascript">
$("#hoverWrap").hover(function(){
$("#msg-box").toggle();
});
</script>
</body>
</html>

這種方法實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,但需包裹一層父標(biāo)簽且有個(gè)弊端:兩個(gè)元素不能有間距。
2、方法二
原理:鼠標(biāo)經(jīng)過(guò)A時(shí)彈出B,鼠標(biāo)移出A,設(shè)置一個(gè)計(jì)時(shí)器延遲0.5s再關(guān)閉B,所以鼠標(biāo)移入A時(shí)需判斷,如果有計(jì)時(shí)器則先清除計(jì)時(shí)器再顯示B。
當(dāng)用戶離開(kāi)觸發(fā)事件的A后,資料卡div要延時(shí)0.5秒才后關(guān)閉,用戶擁有足夠的時(shí)間進(jìn)行相應(yīng)的操作,當(dāng)鼠標(biāo)移入資料卡B,將B中之前正在計(jì)時(shí)關(guān)閉B的計(jì)時(shí)器關(guān)閉。
完整代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>hover A show B</title>
<script src="http://code.jquery.com/jquery-1.12.2.min.js"></script>
<style type="text/css">
#hook { float: left; margin: 10px; width: 50px; height: 50px; background-color: #ccc; }
#msg-box { border: 1px solid black; width: 200px; height: 150px; display: none; float: left; padding: 10px }
</style>
</head>
<body>
<div id="hook">A</div>
<div id="msg-box">功能模塊B</div>
<script type="text/javascript">
var timer;
$("#hook,#msg-box").bind("mouseover",showMsgBox);
$("#hook").bind("mouseout",hideMsgBox);
$("#msg-box").bind("mouseout",function(){
if(timer){clearTimeout(timer);}
$("#msg-box").hide();
});
function showMsgBox(){
if(timer){clearTimeout(timer);}
$("#msg-box").show();
}
function hideMsgBox(){
timer=setTimeout(function(){
$("#msg-box").hide();
},500);
}
</script>
</body>
</html>
js部分:
<script type="text/javascript">
var timer;
$("#hook,#msg-box").bind("mouseover",showMsgBox);
$("#hook").bind("mouseout",hideMsgBox);
$("#msg-box").bind("mouseout",function(){
if(timer){clearTimeout(timer);}
$("#msg-box").hide();
});
function showMsgBox(){
if(timer){clearTimeout(timer);}
$("#msg-box").show();
}
function hideMsgBox(){
timer=setTimeout(function(){
$("#msg-box").hide();
},500);
}
</script>
注意事項(xiàng)
1、觸發(fā)事件用mouseover而非mousemove。
mouseover:鼠標(biāo)移入目標(biāo)元素上方時(shí)觸發(fā)。
mousemove:鼠標(biāo)在元素內(nèi)部移動(dòng)時(shí)不斷觸發(fā)。
所以用mouseover,mousemove耗資源。
更多信息可參考:http://www.cnblogs.com/starof/p/4106904.html
2、 調(diào)用timer前先聲明
若不聲明,則timer在第一次鼠標(biāo)移出時(shí)才會(huì)聲明,所以第一次鼠標(biāo)移入時(shí)會(huì)報(bào)錯(cuò)提示timer未聲明。
3、調(diào)用mouseover事件前必須先清除定時(shí)器
若不清除,計(jì)時(shí)0.5s后會(huì)自動(dòng)關(guān)閉B
三、封裝成一個(gè)通用功能
考慮到這個(gè)功能比較通用,所以封裝了一下。因?yàn)閖s需要處理一些兼容性問(wèn)題,所以用jquery來(lái)寫。
/**
* @Description 鼠標(biāo)hover到oHook上顯示oMsgBox。
* @Author liuxiaoyan
* @Date 2016-03-24 15:01:13
* @Last Modified by: liuxiaoyan
* @Last Modified time: 2016-03-24 15:01:13
*/
/**
* @param oHook:要hover上去的元素
* @param oMsgBox:hover上去要顯示的元素
* 調(diào)用示例:hoverShowMsg.init({hook:$(".viewPhone"),msgBox:$(".viewPhonescan")});
*/
var hoverShowMsg=(function(){
var oHook,
oMsgBox,
timer;
function init(o){
oHook=o.hook;
oMsgBox=o.msgBox;
bindEvent();
}
function bindEvent(){
oHook.bind({
mouseover:showMsgBox,
mouseout:hideMsgBox
});
oMsgBox.bind({
mouseover:showMsgBox,
mouseout:function(){
if(timer){clearTimeout(timer);}
oMsgBox.hide();
}
});
}
function hideMsgBox(){
timer=setTimeout(function(){
oMsgBox.hide();
},500);
}
function showMsgBox(){
if(timer){clearTimeout(timer);}
oMsgBox.show();
}
return{init:init};
})();
以上所述是小編給大家介紹的基于JS如何實(shí)現(xiàn)類似QQ好友頭像hover時(shí)顯示資料卡的效果(推薦)的全部?jī)?nèi)容,希望對(duì)大家有所幫助,如果大家有疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- JS組件Bootstrap dropdown組件擴(kuò)展hover事件
- JavaScript實(shí)現(xiàn)為input與textarea自定義hover,focus效果的方法
- javascript解決IE6下hover問(wèn)題的方法
- js模仿hover的具體實(shí)現(xiàn)代碼
- js hover 定時(shí)器(實(shí)例代碼)
- jQuery控制圖片的hover效果(smartRollover.js)
- js操作css屬性實(shí)現(xiàn)div層展開(kāi)關(guān)閉效果的方法
- 詳解Javascript動(dòng)態(tài)操作CSS
- JS操作CSS隨機(jī)改變網(wǎng)頁(yè)背景實(shí)現(xiàn)思路
- 使用js操作css實(shí)現(xiàn)js改變背景圖片示例
- JS實(shí)現(xiàn)css hover操作的方法示例
相關(guān)文章
JS非Alert實(shí)現(xiàn)網(wǎng)頁(yè)右下角“未讀信息”效果彈窗
這篇文章主要介紹了JS非Alert實(shí)現(xiàn)網(wǎng)頁(yè)右下角“未讀信息”效果彈窗的方法,涉及JavaScript動(dòng)態(tài)操作頁(yè)面元素實(shí)現(xiàn)彈窗效果的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
js操作二級(jí)聯(lián)動(dòng)實(shí)現(xiàn)代碼
網(wǎng)上二級(jí)(多級(jí))聯(lián)動(dòng)的例子也不少,有各種不同的操作方法。我所采用的方法網(wǎng)上也應(yīng)該有的,不過(guò)我還沒(méi)有看到過(guò)。2010-07-07
前臺(tái)js對(duì)象在后臺(tái)轉(zhuǎn)化java對(duì)象的問(wèn)題探討
在開(kāi)發(fā)項(xiàng)目中多次遇到前臺(tái)js對(duì)象在后臺(tái)轉(zhuǎn)化java對(duì)象的問(wèn)題,下面就為大家介紹下前臺(tái)js對(duì)象轉(zhuǎn)后臺(tái)java對(duì)象,感興趣的朋友可以了解下2013-12-12
JavaScript實(shí)現(xiàn)加密與解密詳解
這篇文章介紹了JavaScript實(shí)現(xiàn)加密與解密詳解的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
用js實(shí)現(xiàn)層隨著內(nèi)容大小動(dòng)態(tài)漸變改變 推薦
以前做谷歌的小工具時(shí),api里提供了一個(gè)很有用的函數(shù),那就是在程序運(yùn)行時(shí)可以使層動(dòng)態(tài)隨內(nèi)容大小而變化,而且是平滑變換,在一些jquery的lightbox里也普遍有這種效果,看起來(lái)很酷的樣子。2009-12-12

