jQuery实现百度图片移入移出内容提示框上下左右移动的效果


Posted in jQuery onJune 05, 2018

闲来无聊,看到百度图片hover的时候提示框的效果,遂想试一试自己能否实现。

百度图片hover的效果:

jQuery实现百度图片移入移出内容提示框上下左右移动的效果

需求:

1. 当鼠标从图片上部移入的时候,提示框从上部移到正常位置。从上部移出的时候,提示框从正常位置移到上部。

2. 当鼠标从图片左部移入的时候,提示框从左部移到正常位置。从左部移出的时候,提示框从正常位置移到左部

3. 当鼠标从图片右部移入的时候,提示框从右部移到正常位置。从右部移出的时候,提示框从正常位置移到右部

4. 当鼠标从图片下部移入的时候,提示框从下部移到正常位置。从下部移出的时候,提示框从正常位置移到下部

先上实现的效果图:

jQuery实现百度图片移入移出内容提示框上下左右移动的效果

实现原理:

1. 把图片看做一个矩形,把这个矩形,按对角线分成四份,每一份对应上下左右的部分。

2. 获取鼠标移入div之后的坐标,获取该div离浏览器顶部和左部的距离,就能知道在该div中,鼠标移入的坐标。

3. 以div左上角为原点,水平和竖直方向做坐标轴。

4. 算出移入的点与x轴的夹角 β 和 θ。再与 α 角做比较,最后判断是在哪个范围内的。

如图:

jQuery实现百度图片移入移出内容提示框上下左右移动的效果

 说明:

1) β,θ是移入的点与x轴的夹角,求这两个角与 α 的关系,才能知道到底是在哪个区域

2)已知条件:x,y,x0,y0。分别代表图片宽和高,移入的x,y坐标。

3)不管是鼠标从哪个区域移入或移出,只要求到移入的点与 x 轴的夹角的大小关系,就能正确判断。

夹角判断所在区域: 

 

当 0 < β  ≤  α,移入的点在 1 和 4 区域,

当 α < β  ≤ 90,移入的点在 2 和 3 区域,

当 0 < θ  ≤  α,移入的点在 1 和 2 区域,

当 α < θ  ≤ 90,移入的点在 3 和 4 区域,

那么,要判断在 1 区域里面的话,满足的条件就必须为:0 < β  ≤  α,0 < θ  ≤  α  以此类推。。。

原理搞清楚了,就可以上代码了。

1. html

<div class="box">
 <img src="upimg/comm.png"/>
 <div class="innerBox">
  <div class="inner"></div>
 </div>
</div>

说明:box是装图片的一个列表,innerBox是装提示框的盒子,inner是提示框的内容,inner也要设置绝对定位是因为只有这样才能设置top和left值。实际上就相当于给人错觉提示框innerBox在移动,实际上是提示框里的内容inner在移动。

2. css

*{
 padding:0;
 margin: 0;
}
.box{
 width: 300px;
 height: 300px;
 background: skyblue;
 float: left;
 position: relative;
 overflow: hidden;
 margin:10px 10px 0 0;
}
.innerBox{
 position: absolute;
 bottom: 0;
 left: 0;
 width: 100%;
 height: 40px;
}
img{
 width: 100%;
}
.inner{
 position: absolute;
 top:40px;
 left: 0;
 width: 100%;
 height: 40px;
 background: red;
}

3. js

$('.box').hover(function(e){
 getIn($(this),e)
},function(e){
 getOut($(this),e)
})
//获取在第几区域
function getdirection(obj,e){
 var bleft=obj.offset().left;//距离左部的大小
 var btop=obj.offset().top;//距离顶部的大小
 var li_w=obj.width();//每个图片的宽度
 var li_h=obj.height();//每个图片的高度
 var evt=e||window.event;
 var x=evt.pageX-bleft;//鼠标在该图片中的x坐标
 var y=evt.pageY-btop;//鼠标在该图片中的y坐标
 x=Math.abs(x);//这里是防止移出的时候,x的值为负(bleft的值大于pageX)
 y=Math.abs(y);//与上同理
 if(x>li_w){
  x=li_w-(x-li_w);//这里是防止在第四部分移出的时候,pageX的值大于图片的长度,所以需要用到长度减去多余的部分就是在第四区域的对称位置
 }
 var Alltan=Math.atan(li_h/li_w);//这是α
 var leftTan=Math.atan(y/x);//这是β
 var rightTan=Math.atan(y/(li_w-x));//这是θ
 if(0<=leftTan&&leftTan<=Alltan&&0<=rightTan&&rightTan<=Alltan){
  console.log("在第一部分")
  return 1;
 }else if(Alltan<=leftTan&&leftTan<=Math.asin(1)&&0<=rightTan&&rightTan<=Alltan){
  console.log("在第二部分");
  return 2;
 }else if(Alltan<=leftTan&&leftTan<=Math.asin(1)&&Alltan<=rightTan&&rightTan<=Math.asin(1)){
  console.log("在第三部分");
  return 3;
 }else if(0<=leftTan&&leftTan<=Alltan&&Alltan<=rightTan&&rightTan<=Math.asin(1)){
  console.log("在第四部分");
  return 4;
 }
}
//移入
function getIn(obj,e){
 var statu=getdirection(obj,e);
 var li_w=obj.width();
 var that=obj.find('.inner');
 var child_h=that.height();
 if(statu===1){
  that.css({
   "left":0,
   "top":-child_h
  }).stop().animate({
   "top":0
  },200)
 }else if(statu===2){
  that.css({
   "left":-li_w,
   "top":0
  }).stop().animate({
   "left":0
  },200)
 }else if(statu===3){
  that.stop().animate({
   "top":0
  },200)
 }else if(statu===4){
  that.css({
   "left":li_w,
   "top":0
  }).stop().animate({
   "left":0
  },200)
 }
}
//移出
function getOut(obj,e){
 var statu=getdirection(obj,e);
 var li_w=obj.width();
 var that=obj.find('.inner');
 var child_h=that.height();
 if(statu===1){
  that.stop().animate({
   "top":-child_h
  },200,function(){
   $(this).css({
    "left":0,
    "top":child_h
   })
  })
 }else if(statu===2){
  that.stop().animate({
   "left":-li_w
  },200,function(){
   $(this).css({
    "left":0,
    "top":child_h
   })
  })
 }else if(statu===3){
  that.stop().animate({
   "top":child_h
  },200)
 }else if(statu===4){
  that.stop().animate({
   "left":li_w
  },200,function(){
   $(this).css({
    "left":0,
    "top":child_h
   })
  })
 }
}

说明:Math.asin(1) 表示 90度的反正弦值,由于tan90不存在,所以换成sin90了。

总结:对比自己做的和百度的图片效果,发现百度的动画给人明显的要舒服点,估计是因为移出的时候,我直接设置css,导致动画不连贯原因,还有个就是stop()导致动画直接结束,所以还有可以修改的地方。这里只介绍一个思路

以上所述是小编给大家介绍的jQuery实现百度图片移入移出内容提示框上下左右移动的效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

jQuery 相关文章推荐
jQuery插件之validation插件
Mar 29 jQuery
jQuery实现动态添加、删除按钮及input输入框的方法
Apr 27 jQuery
jQuery实现的文字逐行向上间歇滚动效果示例
Sep 06 jQuery
详解jquery插件jquery.viewport.js学习使用方法
Sep 08 jQuery
jQuery实现的鼠标滚轮控制图片缩放功能实例
Oct 14 jQuery
用jquery获取select标签中选中的option值及文本的示例
Jan 25 jQuery
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
jQuery ajax仿Google自动提示SearchSuggess功能示例
Mar 28 jQuery
jquery实现选项卡切换代码实例
May 14 jQuery
jQuery实现的记住帐号密码功能完整示例
Aug 03 jQuery
JQuery 实现文件下载的常用方法分析
Oct 29 jQuery
JQuery Ajax如何实现注册检测用户名
Sep 25 jQuery
jQuery实现的简单对话框拖动功能示例
Jun 05 #jQuery
jQuery实现的滑块滑动导航效果示例
Jun 04 #jQuery
jQuery实现常见的隐藏与展示列表效果示例
Jun 04 #jQuery
jQuery实现的简单获取索引功能示例
Jun 04 #jQuery
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 #jQuery
jQuery基于Ajax实现读取XML数据功能示例
May 31 #jQuery
jQuery实现动态加载select下拉列表项功能示例
May 31 #jQuery
You might like
基于MySQL分区性能的详细介绍
2013/05/02 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
2010/07/06 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
Dojo 学习要点
2010/09/03 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
浅谈Python __init__.py的作用
2020/10/28 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
《故都的秋》教学反思
2014/04/15 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
个人整改措施书面材料
2014/10/24 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
经济纠纷起诉状
2015/05/20 职场文书
法律讲堂观后感
2015/06/11 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书