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实现的手风琴侧边菜单效果
Mar 29 jQuery
jQuery Plupload上传插件的使用
Apr 19 jQuery
jQuery实现滚动效果
Nov 17 jQuery
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
jQuery实现简单的Ajax调用功能示例
Feb 15 jQuery
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
Oct 16 jQuery
jQuery与原生JavaScript选择HTML元素集合用法对比分析
Nov 26 jQuery
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 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下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
电气自动化大学生求职信
2013/10/16 职场文书
实习单位接收函
2014/01/11 职场文书
小学国庆节活动方案
2014/02/11 职场文书
文明之星事迹材料
2014/05/09 职场文书
先进教师事迹材料
2014/12/16 职场文书
亲属关系公证书样本
2015/01/23 职场文书
2015年宣传工作总结
2015/04/08 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
MySQL创建管理LIST分区
2022/04/13 MySQL