闲来无聊,看到百度图片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 < β  ≤  α,移入的点在 14 区域,

   当 α < β  ≤ 90,移入的点在 23 区域,

   当 0 < θ  ≤  α,移入的点在 12 区域,

   当 α < θ  ≤ 90,移入的点在 34 区域,

那么,要判断在 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()导致动画直接结束,所以还有可以修改的地方。这里只介绍一个思路

转载于:https://www.cnblogs.com/zjjDaily/p/9138820.html

jq实现百度图片移入移出内容提示框上下左右移动的效果相关推荐

  1. 模拟百度的自动下拉提示框

    最近开始接触AJAX,最初以为是一种很新很时髦的技术,等学习了一段时间后, 发现不过是一些老技术的结合.最重要的就是XMLHttpRequest对象(JS) 正所谓学以致用,今天突发灵感,觉得百度的自 ...

  2. Unity3D中角色撞击物体弹出提示框或显示对象效果

    角色撞击物体弹出提示框或显示对象效果 刚开始使用的是调用SetActive方法 例: 在Start()函数中设置对象的SetActive属性为false,在函数 void start() {gameo ...

  3. 原生js、css分别实现提示框渐渐消失的效果

    效果展示: 方法一:(js) 思路:通过js修改dom的visibility.opacity的属性来实现效果. <div id="remind">{{ changeSt ...

  4. 如何使用CSS创建巧妙的动画提示框

    原文:https://webdesign.tutsplus.co... 原作:Jase Smith 翻译:Stypstive 当你的用户需要漂亮的图标给出额外的文字信息时,亦或是当他们在点击了按钮之后 ...

  5. APP提示框设计模板|UI设计师灵感好帮手

    提示框的作用 在细分提示框的种类之前,我想先说一下它的作用,提示框作为一个界面中的一个必不可少的组件,肯定是有它存在的独特的意义,独一无二,无法取代. 提示信息图片APP设计模板 提示框主要的作用有三 ...

  6. 帆软报表(finereport)使用Event 事件对象 (target)修改提示框样式

    target 事件属性 Event 对象 定义和用法 target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. 语法 event.target 定义结束事件Jav ...

  7. Echarts 问题解决 —— 设置图例、提示框上下角标;坐标轴文字过多显示不全、文字竖直一列显示、让坐标轴类目隔一个换一行;

    目录 1.设置图例.提示框上下角标 1.1 修改弹框内容的方法 1.2 修改图例文字的方法 1.3 在 rich 中单独设置角标 1.4 实战 2.坐标轴文字过多显示不全 2.1 方法一:将 坐标轴上 ...

  8. echarts多线图表 提示框自定义

    需求:在提示框中加上单位 效果: 解决方案: 第一步.图表子组件中将tooltip赋值 tooltip: tooltip, setOptions({ seriesData, xAxisData, to ...

  9. 个人练习-jq 鼠标移上移出查看图片(放大)提示

    只做了个简单的效果,以后可以加上动画等效果,实际效果如下: html 代码: <div class="wrap"><ul class="img_list ...

  10. jq鼠标移入移出显示和隐藏_jQuery实现鼠标移入移出事件切换功能示例

    这篇文章主要介绍了jQuery实现鼠标移入移出事件切换功能,结合实例形式分析了jQuery不同版本处理鼠标事件响应与触发相关操作技巧,需要的朋友可以参考下. jQuery实现鼠标移入移出事件切换功能 ...

最新文章

  1. CodeIgniter URL
  2. Processing 编程学习指南 (丹尼尔·希夫曼 著)
  3. 华为内部面试题库---(19)
  4. 用wget循环获取指定url下的文件
  5. 【CV实战】年轻人的第一个深度学习图像分割项目应该是什么样的(Pytorch框架)?...
  6. 算术表达式字符串求值
  7. bat文件运行java的jar包不弹出dos窗口,开机自启jar包
  8. C++顺序表(模板总结)
  9. 从王者荣耀看设计模式(四.简单工厂模式)
  10. MindManager中读图工具的使用
  11. oracle中控制字段不为null
  12. 四川的软考成绩终于出来了
  13. java 读取资源文件最详细解读
  14. 她很忙怎么关心_老公工作忙怎么关心 抓好三个时间点
  15. Matlab学习第一部分:基础知识
  16. iOS分享到WhatsApp
  17. R语言使用pROC包绘制ROC曲线并在ROC曲线上显示特异度和敏感度的置信区间(通过阴影区域以及线条显示)
  18. 广州药业vs加多宝 王老吉
  19. uniapp的项目,scss和js实现跑马灯
  20. 【数据结构】AVL树(高度平衡的二叉搜索树)

热门文章

  1. 运动目标跟踪(二)--搜索算法预测模型之粒子滤波
  2. W Zong / A Robust Open-source Algorithm to Detect Onset and Duration of QRS Complexes
  3. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
  4. 【C++入门】C++ deque类
  5. hive数据去重测试
  6. Win32汇编学习笔记(罗云彬)(二)
  7. Cmake构建_选择debug与release的库
  8. Windows核心编程_Edit操作
  9. JavaScript 中的异步:Event Loop 及其他
  10. scala 基础入门