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 06 Javascript
用jquery实现自定义风格的滑动条实现代码
Apr 26 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 Javascript
javascript实现避免页面按钮重复提交
Jan 08 Javascript
js面向对象的写法
Feb 19 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
Aug 05 Javascript
JS高级运动实例分析
Dec 20 Javascript
关于前后端json数据的发送与接收详解
Jul 30 Javascript
详解Vue之父子组件传值
Apr 01 Javascript
微信小程序 生成携带参数的二维码
Oct 23 Javascript
浅谈webpack构建工具配置和常用插件总结
May 11 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实现维护文件代码
2007/06/14 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
Web开发之JavaScript
2012/03/29 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
详解python3中socket套接字的编码问题解决
2017/07/01 Python
浅谈python数据类型及类型转换
2017/12/18 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
会计系毕业个人自荐信格式
2013/09/23 职场文书
医院门卫岗位职责
2013/12/30 职场文书
中学生爱国演讲稿
2013/12/31 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript