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数据缓存系统实现代码
Oct 24 Javascript
Jquery上传插件 uploadify v3.1使用说明
Jun 18 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 Javascript
用innerhtml提高页面打开速度的方法
Aug 02 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
原生js结合html5制作小飞龙的简易跳球
Mar 30 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
jquery dataview数据视图插件使用方法
Dec 23 Javascript
bootstrap表格分页实例讲解
Dec 30 Javascript
ES6新特性四:变量的解构赋值实例
Apr 21 Javascript
ES6学习之变量的两种命名方法示例
Jul 18 Javascript
详解从Vue-router到html5的pushState
Jul 21 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
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
vue 解决异步数据更新问题
2019/10/29 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
python异步存储数据详解
2019/03/19 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
高中语文教学反思
2014/01/16 职场文书
施工材料员岗位职责
2014/02/12 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
个人先进事迹材料
2014/12/29 职场文书
保研导师推荐信
2015/03/25 职场文书
周一问候语大全
2015/11/10 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python