基于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实现的日期操作类DateTime函数代码
Mar 16 Javascript
jquery select动态加载选择(兼容各种浏览器)
Feb 01 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
Feb 06 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
Mar 04 Javascript
浅谈javascript中基本包装类型
Jun 03 Javascript
详解AngularJS中的filter过滤器用法
Jan 04 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
Oct 29 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
Nov 25 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
关于预加载InstantClick的问题解决方法
Sep 12 Javascript
layui插件表单验证提交触发提交的例子
Sep 09 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
Sep 11 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
Zend引擎的发展 [15]
2006/10/09 PHP
如何用php获取程序执行的时间
2013/06/09 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
简单解决Python文件中文编码问题
2015/11/22 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
深入浅析python的第三方库pandas
2020/02/13 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
大学生护理专业自荐信
2013/10/03 职场文书
职工运动会感言
2014/02/07 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
秦兵马俑导游词
2015/02/02 职场文书
学生逃课检讨书
2015/02/17 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
Golang实现可重入锁的示例代码
2022/05/25 Golang