首页 > javascript相关 > jquery教程 > 正文

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

2018-11-17 16:46:45

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

百度图片hover的效果:

需求:

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

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

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

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

先上实现的效果图:

实现原理:

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

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

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

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

如图:

 说明:

  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教程
  • 本文发布HTML5中文学习网 ,转载请注明出处,感谢您!
  • 相关文章


  • 曝网友假装外国人写投诉信 ofo秒退押金并回函致歉
  • 苹果市值缩水逾2000亿美元 遭多家投行下调目标价
  • Asp.net Core与类库读取配置文件信息的方法_实用技巧
  • asp.net在Repeater嵌套的Repeater中使用复选框详解_实用技巧
  • 利用IIS调试ASP.NET网站程序的完整步骤_实用技巧
  • Asp.Net Core轻松学习系列之配置文件_实用技巧
  • ASP.NET 页生命周期概述(小结)_实用技巧
  • 详解ASP.NET Core WebApi 返回统一格式参数_实用技巧
  • 2018年网络流行语有哪些?2018年十大网络流行语盘点
  • 华为首席财务官孟晚舟被暂扣 深圳市政府要求加方立即放人!
  • 独孤九贱(4)_PHP视频教程

    江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。 PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

    独孤九贱(1)_HTML5视频教程

    《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 ...

    ThinkPHP5实战之[教学管理系统]

    本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    PHP入门视频教程之一周学会PHP

    所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

    作者信息

    kevin

    永远在学习的路上!

    相关教程

  • javascript初级视频教程 javascript初级视频教程
  • jquery 基础视频教程 jquery 基础视频教程
  • javascript三级联动视频教程 javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程 独孤九贱(6)_jQuery视频教程
  • 热门教程