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 相关文章推荐
简单三步,搞掂内存泄漏
Mar 10 Javascript
js面向对象 多种创建对象方法小结
May 21 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
Aug 09 Javascript
JS小功能(列表页面隔行变色)简单实现
Nov 28 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
浅谈javascript语法和定时函数
May 03 Javascript
JavaScript省市区三级联动菜单效果
Sep 21 Javascript
Javascript 实现全屏滚动实例代码
Dec 31 Javascript
jquery学习笔记之无new构建详解
Dec 07 jQuery
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
vue模块拖拽实现示例代码
Mar 09 Javascript
vue 解决路由只变化参数页面组件不更新问题
Nov 05 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
PHP中一个控制字符串输出的函数
2006/10/09 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
webpack4 升级迁移的实现
2018/09/12 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
Angular value与ngValue区别详解
2019/11/27 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
跟老齐学Python之编写类之三子类
2014/10/11 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
计算机相关的自我评价
2014/01/15 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
python实现简单倒计时功能
2021/04/21 Python
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server