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 相关文章推荐
showModelDialog弹出文件下载窗口的使用示例
Nov 19 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
jQuery中parentsUntil()方法用法实例
Jan 07 Javascript
浅谈Javascript实现继承的方法
Jul 06 Javascript
常用的Javascript数据验证插件
Aug 04 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
Aug 02 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
Apr 19 Javascript
微信小程序表单验证错误提示效果
May 19 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
如何利用JS将手机号中间四位变成*号
Sep 29 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新手入门学习方法
2011/05/08 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
PHP时间和日期函数详解
2015/05/08 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
AI人工智能 Python实现人机对话
2017/11/13 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
成本会计岗位职责
2015/02/03 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
python3实现无权最短路径的方法
2021/05/12 Python
python 如何做一个识别率百分百的OCR
2021/05/29 Python
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis
SQL Server删除表中的重复数据
2022/05/25 SQL Server