JS实现类似QQ好友头像hover时显示资料卡的效果

一、应用场景

鼠标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>

这种方法实现起来比较简单,但需包裹一层父标签且有个弊端:两个元素不能有间距。

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>

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};
})();

 

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/5312195.html有问题欢迎与我讨论,共同进步。

时间: 2024-12-10 22:26:11

JS实现类似QQ好友头像hover时显示资料卡的效果的相关文章

基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)_javascript技巧

一.应用场景 鼠标hover弹出div,并且鼠标离开后不能马上隐藏,因为这个div上还有功能入口.比如: 鼠标经过好友列表中的好友头像时显示资料卡的效果如下所示: hover时显示二维码 二.实现 用如下这样一个简单的效果:鼠标hover到A上显示B来模拟 有2种实现方式,推荐第二种,第一种有弊端下面会说. 1.方法一 原理:把触发元素A和要显示元素B放于同一个父级元素内,鼠标经过父级元素时触发显示B.这样鼠标移动到B时仍然 处于该父级元素内,则div不会隐藏. 代码: <!DOCTYPE ht

JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果_javascript技巧

基于项目的需要,需要制作出如下的一种页面效果:当用户鼠标经过好友列表中好友头像时,显示该好友的基本资料,其实也就是类似QQ客户端的那种功能. 网上找了很多代码,基本都实现了鼠标悬浮之后弹出div,离开之后马上就消失了.还有些纯CSS的代码实现了这样的效果,但是对我没用,我需要的是JS的(因为我的数据还要通过Ajax取得),并且鼠标离开后不能马上隐藏,这个div上还有功能入口.这个页面效果折腾了我一天,由此可见我的JS和CSS技术有待提高... 搜索了好久,终于发现了可行的2个思路如下,这2个方法

JS+CSS实现类似QQ好友及黑名单效果的树型菜单_javascript技巧

本文实例讲述了JS+CSS实现类似QQ好友及黑名单效果的树型菜单.分享给大家供大家参考.具体如下: 今天介绍的这个菜单堪称极品啊,不过里面的有些图标丢失了,路径还留在那,真想使用的朋友自己制作两个折叠菜单的图标按路径传上去就行了,这个菜单是模仿QQ面板的菜单功能,很多朋友还是很喜欢这种功能的,没想到用这么少的JS代码也可实现 ,值得代签哦. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-css-qq-hy-hmd-style-menu-c

请问ios实现类似qq讨论组功能时是不是也要利用xmpp,有其他简单一点的方法吗

问题描述 请问ios实现类似qq讨论组功能时是不是也要利用xmpp,有其他简单一点的方法吗 我刚刚学习ios,如果我想在项目里加上一个讨论组功能,是不是要利用xmpp有没有其他简单一点的方法呢 解决方案 你可以使用环信试试,自己实现要推通知

如何用Java写出类似QQ好友列表那样的效果,求大神指教最好有代码

问题描述 如何用Java写出类似QQ好友列表那样的效果,求大神指教最好有代码 请问如何用Java写出类似QQ好友列表那样的效果,求大神指教最好有代码 解决方案 http://etwo.iteye.com/blog/1460375

用ExpandableListView实现类似QQ好友列表

  ExpandableListView是一个用来显示二级节点的listview. qq好友列表中子列表上下移动时,父节点在顶端会始终显示,这里我们可以自定义一个view来充当这个父节点.   主布局文件qq_listview如下,其中当我们拖动列表时,系统默认拖动过程中列表背景是黑的,我们可以通过android:cacheColorHint="#00000000"将其设置为透明,其中前两位是透明效果参数(00-99),后六位是颜色的设置.   Xml代码 <?xml versi

求问,C#如果实现QQ好友拖出到桌面为快捷方式的效果

问题描述 我知道的情况如下:C#控件有DragEnter和DragOver事件及DoDragDrop方法,这些都是针对内容拖入到控件中处理的时机.我要达到的效果如下:在我的窗体中有listview,我想实现QQ好友拖拽到桌的效果.即,我的listview节点拖拽到桌面时也能创建相应的快捷方式. 解决方案 解决方案二:大致的思路如下:1.QQ聊天窗口和主界面是两个应用程序2.在主界面中好友名单拖动事件中,获取被拖动名单的号码,然后创建一个目标指向聊天窗口应用程序的桌面快捷图标,参数就是QQ号码3.

javascript-js实现截图,类似QQ头像的实现

问题描述 js实现截图,类似QQ头像的实现 如题,怎么做,imgAreaSelect不知道为什么出错了,不能使用,页面出这个问题:TypeError: Cannot read property 'msie' of undefined,求大神解答 解决方案 JS实现类似qq的提示框如何用java实现类似于QQ的头像系统 解决方案二: 这个应该是代码回执问题.把代码测试下

IOS详解TableView:QQ好友列表的实现

上篇博客写了关于性能优化以及手工绘制自定义单元格内容,这篇我们利用TableView的Section的 Header来实现类似QQ好友列表的效果. TableView有一个代理方法 这个方法返回一个UIView对象,我们可以将一个Button对象设为这个Section的Header,在点击它的 时候展开列表内容. 简单地看下假的好友列表数据 一个array中包含多个 dictionary,字典中又包括组别的名字以及好友列表,好友也用一个字典来表示,分别有名称,是否在 线以及头像图片名字. 加载数