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精华代码集
Jan 24 Javascript
一段利用WSH修改和查看IP配置的代码
May 11 Javascript
js DOM模型操作
Dec 28 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
Dec 17 Javascript
DOM基础教程之使用DOM控制表单
Jan 20 Javascript
JavaScript事件委托实例分析
May 26 Javascript
jQuery实现首页图片淡入淡出效果的方法
Jun 10 Javascript
基于jQuery实现放大镜特效
Oct 19 Javascript
vuex实现简易计数器
Oct 27 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
Sep 16 Javascript
vue项目创建步骤及路由router
Jan 14 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
非常不错的MySQL优化的8条经验
2008/03/24 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
xtree.js 代码
2007/03/13 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
大学新生军训个人的自我评价
2013/10/03 职场文书
2014政务公开实施方案
2014/02/19 职场文书
公司营业员的自我评价
2014/03/04 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
夏季药店促销方案
2014/08/22 职场文书
个人委托书怎么写
2014/09/17 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
创先争优承诺书
2015/01/20 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
五年级作文之学校的四季
2019/12/05 职场文书