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 相关文章推荐
开源的javascript项目Kissy介绍
Nov 28 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
Aug 11 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
Aug 20 Javascript
Bootstrap基本布局实现方法详解
Nov 25 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
Apr 03 jQuery
深入理解Commonjs规范及Node模块实现
May 17 Javascript
vue 组件中slot插口的具体用法
Apr 03 Javascript
react router4+redux实现路由权限控制的方法
May 03 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
Sep 01 Javascript
一步一步实现Vue的响应式(对象观测)
Sep 02 Javascript
在vue中实现echarts随窗体变化
Jul 27 Javascript
vue+canvas实现拼图小游戏
Sep 18 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
dedecms模版制作使用方法
2007/04/03 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
微信小程序实现卡片层叠滑动效果
2019/06/21 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
Python3基础之函数用法
2014/08/13 Python
python实现flappy bird游戏
2018/12/24 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
python调用摄像头的示例代码
2020/09/28 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
巴基斯坦购物网站:Goto
2019/03/11 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
大学军训感言1000字
2014/02/25 职场文书
社会实践活动总结格式
2015/05/11 职场文书
2019个人工作总结
2019/06/21 职场文书
javascript的setTimeout()使用方法总结
2021/11/20 Javascript