jQuery探测位置的提示弹窗(toolTip box)详细解析


Posted in Javascript onNovember 14, 2013

这里我用jQuery做了个提示弹窗的js,并做了个小demo,简单总结下:

方位

根据当前鼠标所处的位置不同,箭头所指向的方向也不同:

左上方(left-top)(缺省)、左下方(left-bottom)、右上方(right-top)、右下方(right-bottom)、上左方(top-left)、上右方(top-right)、下左方(bottom-left)、下右方(bottom-right)

优先级

以上各种情况优先级依次降低

探测思路

探测基本思路是:

首先,也是前提条件,判断容器的高或宽是否是弹窗对应的高或宽的两倍,之所以是两倍,因为临界点是目标容器的各个边的中点

/*
* 先判断目标容器的高度或者宽度是否是容器对应高度或宽度与箭头尺寸之和的两倍,否则,报错。之所以是2倍,因为临界点是目标容器的各个边的中点。
*/

接下来,可以依据优先级去逐个判断:

/*
* 思路是,先检测左侧,再检测右侧,左右都放不下,则检测顶部,都排除,再考虑底部。检测左右侧时,先考虑顶部能否放下;检测上下时,先考虑据左右侧那边的距离大。

* 1.检测左侧时,判断上下距离能否放下箭头偏移量,有一个不能放下(例如top),则为['top', 'left'],右侧一样

* 2.检测上下时,判断左右距离能否放下箭头偏移量(缺省为上,即top),有一侧不能放下,即为鼠标偏向的一侧(若left<right,则left),则为['top', 'left'],此时箭头偏移量为0,随鼠标移动,鼠标left增大,则增大,最大至偏移量。

* 缺省是左侧,顶部。
*/

具体情况判断:

•根据优先级,先判断鼠标右侧能否放下弹窗:

◦能放下,则去判断能否再放进个箭头

■若能放下

■则判断顶部是否能放下个箭头,包括箭头的偏移量,若能

■判断顶部能放下箭头包括偏移量并且不会超过目标容器高度,则为left-top

■否则如果顶部大于弹窗高度,并底部可放下箭头包括其偏移量,则为left-bottom

■否则,判断底部能放下箭头和弹窗,则为top-left

■否则,基于我们的前提条件,是bottom-left

■若不能放下,判断底部能不能放下弹窗和箭头

■能,则为top-left

■否则,为bottom-left

◦不能放下,则left考虑完,换right,同样的思路

八种情况弹窗的情况和位置

举例top-left

 case 'top-left' :
    // top 加上 箭头尺寸
    this.conObj.css('top', top + tarTop);
    // 判断left距离
    if ( left < arrOffset ) {
        // 紧贴左边
        this.conObj.css('left', tarLeft);
    } else if (right < (conWidth - arrOffset)) {             // 如果right,撑不下自身在右边的距离(conWidth - arrOffset),则left值减小,箭头跟随鼠标,使自己右边与容器对齐
        // 正常显示的left, 减去右侧还需要的宽度((conWidth - arrOffset) - right ), left - arrOffset - ((conWidth - arrOffset) - right ),得出tarWidth - conWidth
        // 换种思路,紧贴右边,即左边距离为,目标容器宽度减去自身宽度
        this.conObj.css('left', tarWidth - conWidth + tarLeft);
    } else {                // 正常显示的left
        this.conObj.css('left', left - arrOffset + tarLeft);
    }
    break;

八种情况下箭头的情况和位置

同样以top-left为例

 case 'top-left' :
    this.arrowObj.prependTo(this.conObj);
    // 如果con紧贴右边,此时,箭头随鼠标移动
    if (conLeft === 0 && (conWidth > (right + arrOffset))) {
        this.arrowObj.css('left', conWidth - right - arrowPos);
    } else {
        this.arrowObj.css('left', arrowPos);
    }
    break;

最后说下在写代码时候的些许感悟:

写的代码,在重构了N遍,写完N行注释后,忽然想到,其实不论是写代码,还是生活,我们都是有个既定的或者约定俗成的前提或者说规范的。而一旦这个规范被打破,往往前功尽弃,即使不是,往往也很受伤。实例小至代码、大至社会,无一例外

Javascript 相关文章推荐
Using the TextRange Object
Oct 14 Javascript
javascript下string.format函数补充
Aug 24 Javascript
javaScript面向对象继承方法经典实现
Aug 20 Javascript
了不起的node.js读书笔记之例程分析
Dec 22 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
Jun 19 Javascript
jquery输入数字随机抽奖特效的简单实现代码
Jun 10 Javascript
angularjs 源码解析之injector
Aug 22 Javascript
JS去除字符串中空格的方法
Feb 14 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
May 26 Javascript
jQuery实现下拉菜单的实例代码
Jun 19 jQuery
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 Javascript
Angular8 实现table表格表头固定效果
Jan 03 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
Nov 14 #Javascript
浅析用prototype定义自己的方法
Nov 14 #Javascript
Js nodeType 属性全面解析
Nov 14 #Javascript
open 动态修改img的onclick事件示例代码
Nov 13 #Javascript
解决jquery1.9不支持browser对象的问题
Nov 13 #Javascript
js获取IFRAME当前的URL的方法
Nov 13 #Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
Nov 13 #Javascript
You might like
JS 网站性能优化笔记
2011/05/24 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
Vue仿百度搜索功能
2020/12/28 Vue.js
Python代理抓取并验证使用多线程实现
2013/05/03 Python
Python实现远程调用MetaSploit的方法
2014/08/22 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
python处理大日志文件
2019/07/23 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
Java基础知识面试要点
2016/07/29 面试题
幼儿园元旦亲子活动方案
2014/02/17 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
团员个人年度总结
2015/02/26 职场文书
2015年科室工作总结
2015/04/10 职场文书
尊师重教主题班会
2015/08/14 职场文书
创业计划书之家教中心
2019/09/25 职场文书
win10+anaconda安装yolov5的方法及问题解决方案
2021/04/29 Python