JS實現類似QQ好友頭像hover時顯示資料卡的效果

来源:http://www.cnblogs.com/starof/archive/2016/03/25/5312195.html
-Advertisement-
Play Games

一、應用場景 滑鼠hover彈出div,並且滑鼠離開後不能馬上隱藏,因為這個div上還有功能入口。比如: 滑鼠經過好友列表中的好友頭像時顯示資料卡的效果 hover時顯示二維碼 二、實現 用如下這樣一個簡單的效果:滑鼠hover到A上顯示B來模擬 有2種實現方式,推薦第二種,第一種有弊端下麵會說。 ...


一、應用場景

滑鼠hover彈出div,並且滑鼠離開後不能馬上隱藏,因為這個div上還有功能入口。比如:

  • 滑鼠經過好友列表中的好友頭像時顯示資料卡的效果

  • hover時顯示二維碼

二、實現

用如下這樣一個簡單的效果:滑鼠hover到A上顯示B來模擬

有2種實現方式,推薦第二種,第一種有弊端下麵會說。

1、方法一

原理:把觸發元素A和要顯示元素B放於同一個父級元素內,滑鼠經過父級元素時觸發顯示B。這樣滑鼠移動到B時仍然 處於該父級元素內,則div不會隱藏。

代碼:

<!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>
View Code

這種方法實現起來比較簡單,但需包裹一層父標簽且有個弊端:兩個元素不能有間距。

2、方法二

原理:滑鼠經過A時彈出B,滑鼠移出A,設置一個計時器延遲0.5s再關閉B,所以滑鼠移入A時需判斷,如果有計時器則先清除計時器再顯示B。

當用戶離開觸發事件的A後,資料卡div要延時0.5秒才後關閉,用戶擁有足夠的時間進行相應的操作,當滑鼠移入資料卡B,將B中之前正在計時關閉B的計時器關閉。

完整代碼如下:

<!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>
View Code

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>

註意事項

1、觸發事件用mouseover而非mousemove。

mouseover:滑鼠移入目標元素上方時觸發。

mousemove:滑鼠在元素內部移動時不斷觸發。

所以用mouseover,mousemove耗資源。

更多信息可參考:http://www.cnblogs.com/starof/p/4106904.html

2、 調用timer前先聲明

若不聲明,則timer在第一次滑鼠移出時才會聲明,所以第一次滑鼠移入時會報錯提示timer未聲明。

3、調用mouseover事件前必須先清除定時器

若不清除,計時0.5s後會自動關閉B

三、封裝成一個通用功能

考慮到這個功能比較通用,所以封裝了一下。因為js需要處理一些相容性問題,所以用jquery來寫。

/**
* @Description 滑鼠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上去要顯示的元素
* 調用示例: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};
})();
View Code

 

本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.cnblogs.com/starof/p/5312195.html有問題歡迎與我討論,共同進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.在Html中引入相關的文件:引入風格文件(js/css/jq) 2.創建myFocus標準的Html的結構並填充內容 <div id="picBox"> <div class="pic"> <ul> <li></li> <li></li> </ul> </div> </div> 3.調用 myF ...
  • 在JS中有全局作用域和函數作用域,而在Nodejs中也自己的作用域,分為全局作用域(global)和模塊作用域。 js作用域: 以前學js的時候我們的全局對象是window,如: 我們定義的全局變數預設是給window添加一個屬性或者方法。 報錯,因為num是在函數中定義的,在函數外部是訪問不了函數 ...
  • 第二十二章 1、 安全的檢測是使用:Object.prototype.toString.call(value); eg: PS:JSON的: 2、 作用安全域的構造函數:(不然this會指向window) PS:使用作用安全域的構造函數,就會鎖定調用構造函數的環境,如果使用構造函數竊取模式的繼承而且 ...
  • 1 事件的三要素 事件源:有監聽的HTML標簽,能響應時間的HTML標簽,就是事件源。 事件名:用戶的特定行為,比如onclick(單擊) 事件的響應:就是一個個function 事件的響應,就是function,那麼編程就是編寫事件的響應。響應中,最重要的就是想清楚被操作的對象。 下麵給大家看一個 ...
  • JavaScript的 DOM操作,主要是對DOM這三個字母中D、O、M的操作。D代表的是document(文檔),即我們可以使用javascript對文檔進行操作,O代表的是object(對象),對象包括用戶自定義對象,內建對象和宿主對象,這裡不再贅述,M代表的是model(模型),今天我們主要講 ...
  • 1 <!doctype html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <title>Baymax</title> 7 8 <style> 9 body { 10 background: #595959; 11 } 12 13 #baymax ...
  • 引言 web應用中有很多地方會用到打點,用來檢測用戶行為,今天就做了個打點相關的需求,為了統計一個廣告給用戶的展示次數,每次用戶請求完成並且渲染完成之後就算一次成功的展示,其實有時候這個廣告還沒有在用戶的可視範圍之內,用戶需要滑動滾動條才能看見,但已經算了一次成功展示了,顯然這裡不太合理,這裡做了個 ...
  • 備註 html 效果圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...