全面解析Bootstrap中tooltip、popover的使用方法


Posted in Javascript onJune 13, 2016

一、tooltip(提示框)
 源码文件:
 Tooltip.js
Tooltip.scss

实现原理: 
1、获取当前要显示tooltip的元素的定位信息(top、left、bottom、right、width、height等)
2、计算tooltip的位置,是top、left、bottom、right其中一个
3、然后根据计算的位置值,运算出坐标值
4、给tooltip应用坐标值 

源码分析: 
1、ownerDocument:文档;包含两个对象:<DocType>、documentElement(根节点)
2、$.contains(domA, domB):判断domA是否包含domB元素
3、应用了offset.setOffset方法,传入了using参数,因为offset设置值的时候,不能四舍五入
4、$viewport:显示tooltipr的容器元素
5、getPosition:此函数获取元素定位坐标相关的信息,如:top、left、bottom、right、width、height、scroll等
  5.1、共用到了getBoundingClientRect方法,但此方法在IE8-会插件width、height
  5.2、如果是body,width、height会被重置为window的
  5.3、源码如下: 

$element = $element || this.$element //如果没有传入参数,则以$element(触发tooltip事件的元素)为准

 var el = $element[0]
 var isBody = el.tagName == 'BODY'

 var elRect = el.getBoundingClientRect()
 if (elRect.width == null) {
 // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
 }
 var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
 var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
 var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null

return $.extend({}, elRect, scroll, outerDims, elOffset)

6、getCalculatedOffset:计算tooltip的坐标值,利用的是width、height折半原理实现
  6.1、bottom时
    6.1.1、top为定位元素(pos)的top+ 定位元素(pos)的高度
    6.1.2、left为定位元素(pos)的Left ? 定位元素(pos)的宽度/2 ? tooltip元素宽度/2
  6.2、top时
    6.2.1、top为定位元素(pos) 的top-tooltip元素的高度
    6.2.2、left为定位元素(pos)的left ? 定位元素(pos)的宽度/2 ? tooltip元素宽度/2
  6.3、left时
    6.3.1、top为定位元素(pos)的top ? 定位元素(pos)的高度/2 ? tooltip元素高度/2
    6.3.2、left为定位元素(pos)的left ? tooltip元素的宽度
  6.4、right时
    6.4.1、top为定位元素(pos)的top ? 定位元素(pos)高度/2 ? tooltip元素高度/2
    6.4.2、left为定位元素(pos)的left + 定位元素(pos)宽度

 全面解析Bootstrap中tooltip、popover的使用方法

 6.5、小三角的位置,一般情况下元素的50%的位置,但如果出现tooltip被left、top、right、bottom隐藏的时候,就需要重新计算和调整位置了。方法名为:getViewportAdjustedDelta
     6.5.1、首先计算出被overflow的宽度、或者高度
     6.5.2、然后计算出arrowDelta的值,隐藏值 * 2 ?tooltip宽度 + tooltip宽度
     6.5.3、设置三角的top或left百分比的值 

二、Popover(弹出框)
 源码文件: 
Popover.js
Popover.scss

实现原理: 
1、继承tooltip实现的
2、多了一个标题,还可以自定义content(里面可以插入input、button等交互控件)

如果大家还想深入学习,可以点击这里进行学习,再为大家附3个精彩的专题:

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
通过正则表达式实现表单验证是否为中文
Feb 18 Javascript
jquery datepicker参数介绍和示例
Apr 15 Javascript
JQuery select(下拉框)操作方法汇总
Apr 15 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
Oct 13 Javascript
JQuery validate插件验证用户注册信息
May 11 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
Oct 11 Javascript
js滚轮事件兼容性问题需要注意哪些
Nov 15 Javascript
使用Vue制作图片轮播组件思路详解
Mar 21 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
May 08 Javascript
Ant design vue中的联动选择取消操作
Oct 31 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 #Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 #Javascript
JavaScript解八皇后问题的方法总结
Jun 12 #Javascript
jQuery遍历json的方法(推荐)
Jun 12 #Javascript
jQuery移动端图片上传组件
Jun 12 #Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
Jun 12 #Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
Jun 12 #Javascript
You might like
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
python中的for循环
2018/09/28 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
python ChainMap的使用和说明详解
2019/06/11 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
Python函数参数分类原理详解
2020/05/28 Python
keras实现多种分类网络的方式
2020/06/11 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
个人思想理论学习的自我鉴定
2013/11/30 职场文书
辩论赛主持词
2014/03/18 职场文书
责任书格式
2019/04/18 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫