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


Posted in Javascript onJune 09, 2016

一、应用场景

鼠标hover弹出div,并且鼠标离开后不能马上隐藏,因为这个div上还有功能入口。比如:

鼠标经过好友列表中的好友头像时显示资料卡的效果如下所示:

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

hover时显示二维码

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

二、实现

用如下这样一个简单的效果:鼠标hover到A上显示B来模拟

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

有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>

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

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

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

以上所述是小编给大家介绍的基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)的全部内容,希望对大家有所帮助,如果大家有疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js为鼠标添加右击事件防止默认的右击菜单弹出
Jul 29 Javascript
javaScript对文字按照拼音排序实现代码
Dec 27 Javascript
node.js中的console.dir方法使用说明
Dec 10 Javascript
JS中对象与字符串的互相转换详解
May 20 Javascript
jquery实现垂直和水平菜单导航栏
Aug 27 Javascript
浅谈JS之tagNaem和nodeName
Sep 13 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
Vue 实用分页paging实例代码
Apr 12 Javascript
js图片上传的封装代码
Aug 01 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
JS正则表达式常见函数与用法小结
Apr 13 Javascript
微信小程序点击滚动到指定位置的实现
May 22 Javascript
JS实现星星评分功能实例代码(两种方法)
Jun 09 #Javascript
Node.js中npm常用命令大全
Jun 09 #Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
Jun 09 #Javascript
Active控件问题小结(附解决办法)
Jun 09 #Javascript
JS 通过系统时间限定动态添加 select option的实例代码
Jun 09 #Javascript
JavaScript的instanceof运算符学习教程
Jun 08 #Javascript
JavaScript中instanceof运算符的使用示例
Jun 08 #Javascript
You might like
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
Python多线程下载文件的方法
2015/07/10 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
迪拜航空官方网站:flydubai
2017/04/20 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
应届生人事助理求职信
2013/11/09 职场文书
自主招生自荐信
2013/12/08 职场文书
中学教师教育感言
2014/02/21 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
1000字打架检讨书
2014/11/03 职场文书
单身证明格式样本
2015/06/15 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL