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实现分页功能(含ajax请求、后台数据、附完整demo)
Apr 03 jQuery
jquery版轮播图效果和extend扩展
Jul 18 jQuery
jQuery Position方法使用和兼容性
Aug 23 jQuery
基于jQuery解决ios10以上版本缩放问题
Nov 03 jQuery
基于jquery实现五星好评
Nov 18 jQuery
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
jQuery中内容过滤器简单用法示例
Mar 31 jQuery
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 jQuery
jquery分页优化操作实例分析
Aug 23 jQuery
jQuery实现颜色打字机的完整代码
Mar 19 jQuery
jQuery实现的移动端图片缩放功能组件示例
May 01 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
php结合飞信 免费天气预报短信
2009/05/07 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
jquery对表单操作2
2011/04/06 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
浅析Python多线程下的变量问题
2015/04/28 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
仓库主管的岗位职责
2013/12/04 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
2014年司机工作总结
2014/11/21 职场文书
单位实习鉴定评语
2015/01/04 职场文书
预备党员党支部意见
2015/06/02 职场文书
家长意见和建议怎么写
2015/06/04 职场文书