BootStrap Tooltip插件源码解析

BootStrap Tooltip插件源码解析

Bootstrap Tooltip插件是一个简单易用,且对用户友好的Web开发工具,其基于jQuery javascript library实现,可以加快你的Web开发速度。

Tooltip插件的基本用法

在需要使用Tooltip的HTML代码元素上添加"data-toggle"和 "data-placement"属性,其中 "data-toggle"属性的值为 "tooltip", "data-placement"属性设置Tooltip显示位置,例如 "top", "bottom", "left" 或 "right"。

<button type="button" class="btn" data-toggle="tooltip" data-placement="top" title="This is the tooltip text">Top</button>

当用户把鼠标移动到按钮上时,会弹出一个Tooltip提示框,内容为 "This is the tooltip text"。

Tooltip选项设置

除了基本的用法,Bootstrap Tooltip插件还支持一些可配置的选项,包括:animation(动画)、delay(延迟)、html(HTML内容)、selector(选择器)、template(模板)、title(标题)和 trigger(触发方式)。

以下是一个例子,演示组合样式的设置:

<button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="top" title="This is the tooltip text" data-animation="true" data-delay="500" data-html="true" data-selector=".btn" data-template="<div class='tooltip' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner'></div></div>" data-trigger="focus">Hover over me</button>

源码解析

Bootstrap Tooltip插件的源码基于jQuery的事件绑定实现,插件实现的主要工作包括,绑定事件监听、创建与隐藏提示框元素、采用CSS布局及计算提示框位置等。

具体实现过程如下:

  1. 绑定事件监听:插件通过jQuery的事件绑定接口,订阅目标Element的需要监听的事件,例如"mouseenter","mousemove"或"click"等。

this._$element
.on('mouseenter' + eventType + " " + 'focus' + eventType, $.proxy(this.enter, this))
.on('mouseleave' + eventType + " " + 'blur' + eventType, $.proxy(this.leave, this));

  1. 创建与隐藏提示框元素:

插件采用了下面方法创建Tooltip HTML元素及内容,并把元素添加到body中。插件隐藏Tooltip元素的方法是设置其可见性属性为"hidden",而非使用CSS类名样式控制元素的可见/隐藏。

```
Tooltip.prototype.show = function () {
// 创建Tooltip元素
var $tip = this.tip(),
// 获取内容
title = this.getTitle();

   $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title);
   $tip.removeClass('fade in');

   // 获取显示位置
   var placement = typeof this.options.placement == 'function' ?
       this.options.placement.call(this, $tip[0], this.$element[0]) :
       this.options.placement,

       // 计算元素位置
       pos = this.getPosition(),

       // 获取元素宽度和高度
       actualWidth = $tip[0].offsetWidth,
       actualHeight = $tip[0].offsetHeight,

       // 获取箭头元素
       tp = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight);

   // 设置箭头位置及可见性
   this.applyPlacement(tp, placement);
   this.$element.trigger('shown.bs.' + this.type);

};

Tooltip.prototype.hide = function() {
// 隐藏Tooltip元素
var that = this,
$tip = this.tip(),
e = $.Event('hide.bs.' + this.type);

   function complete() {
       if(that.hoverState != 'in') $tip.detach();
   }

   this.$element.removeAttr('aria-describedby');
   this.$element.trigger(e);

   if(e.isDefaultPrevented()) return;

   $tip.removeClass('in');

   $.support.transition && $tip.hasClass('fade') ?
       $tip
       .one('bsTransitionEnd', complete)
       .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
       complete();

   this.hoverState = null;
   return this;

};
```

注意到,为了稍后准确计算Tooltip位置及大小,先显示show()该元素,然后再利用$tip.offsetWidth和$tip.offsetHeight来得到元素的实际大小。(ToolTip.TRANSITION_DURATION 为 150ms)

  1. 采用CSS布局及计算位置:

Tooltip插件基于CSS布局来横向与纵向定位Tooltip元素的坐标位置,其算法使用了CSS3的位移函数,代码如下:

```
Tooltip.prototype.applyPlacement = function(offset, placement) {
var $tip = this.tip(),
width = $tip[0].offsetWidth,
height = $tip[0].offsetHeight;

   // manually read margins because getBoundingClientRect includes difference
   var marginTop = parseInt($tip.css('margin-top'), 10),
       marginLeft = parseInt($tip.css('margin-left'), 10);

   // we must check for NaN for ie 8/9
   if (isNaN(marginTop))  marginTop  = 0;
   if (isNaN(marginLeft)) marginLeft = 0;

   offset.top  += marginTop;
   offset.left += marginLeft;

   $.offset.setOffset($tip[0], $.extend({
       using: function(props) {
           $tip.css({
               top: Math.round(props.top),
               left: Math.round(props.left)
           });
       }
   }, offset), 0);

   $tip.addClass('in');

   // check to see if placing tip in new offset caused the tip to resize itself
   var actualWidth  = $tip[0].offsetWidth,
       actualHeight = $tip[0].offsetHeight;

   if (placement == 'top' && actualHeight != height) {
       offset.top = offset.top + height - actualHeight;
   }

   var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight);

   if (delta.left) offset.left += delta.left;
   else offset.top += delta.top;

   var isVertical        = /top|bottom/.test(placement),
       arrowDelta        = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight,
       arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight';

   $tip.offset(offset);

   this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical);

};
```

以上就是Bootstrap Tooltip插件的基本用法和使用方法,以及其实现过程的源码解析,具体使用时应根据需求选用其标准配置或自定义配置,最大程度发挥该插件的好处。

示例说明

样例1:

显示一个带动画效果的提示框, 当鼠标光标放在按钮上时触发。

<button type="button" class="btn btn-lg btn-danger" data-toggle="tooltip" data-animation="true" data-placement="top" data-delay='{"show":1000, "hide":100}' title="Hello, World!">Danger button</button>

样例2:

鼠标移动到按钮上时触发一个带HTML内容的提示框。

<button type="button" class="btn btn-default" data-toggle="tooltip" data-html="true" data-placement="right" title="<em>This</em> <u>is</u> <b>a</b> <i>tooltip</i>">Hover over me</button>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:BootStrap Tooltip插件源码解析 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 详细了解CSS中的class与id区别及用法

    在 CSS 中,class 和 id 是两个常用的选择器,用于选择 HTML 元素并为其应用样式。下面是一个完整攻略,包含了如何了解 CSS 中的 class 和 id 的区别及用法的过程和两个示例说明。 class 和 id 的区别 class class 是一种用于标识 HTML 元素的选择器。它可以被多个元素使用,并且一个元素可以拥有多个 class。…

    css 2023年5月18日
    00
  • css布局教程之如何实现垂直居中

    在 CSS 布局中,实现垂直居中是一个常见的需求。本文将提供一些关于如何实现垂直居中的方法,包括使用 flexbox 和 transform 属性的示例说明。 使用 Flexbox Flexbox 是一种 CSS 布局模式,可以帮助开发者轻松地实现垂直居中。具体步骤如下: 将父元素的 display 属性设置为 flex。 将父元素的 justify-con…

    css 2023年5月18日
    00
  • Web移动端Fixed布局的解决方案

    Web移动端Fixed布局在移动端中非常常见,其优点在于可以保证在滚动页面时,元素可以固定在页面上的某个位置,提高页面交互性和体验感。但是,Fixed布局也存在一些问题,比如滑动时容易出现卡顿、页面滚动不顺畅等问题。因此,本文将介绍一些在Fixed布局中解决常见问题的方法,以提高页面的流畅性和用户体验。 解决方案一:使用CSS3属性,开启GPU加速 CSS3…

    css 2023年6月11日
    00
  • 浅析CSS在DevTools 中架构演变

    CSS在DevTools中架构演变的背景及介绍:随着 Web 技术的不断发展,CSS 作为前端开发者日常必备的技能之一,也在不断的逐步演变。在此过程中,我们可以发现 CSS 结构与设计变得更加复杂,这也迫使开发者不得不进一步了解和掌握一些新的技术以应对不断变化的需求。在这样的背景下,CSS在DevTools中的架构演变愈发重要,而开发工具在开发者所扮演的角色…

    css 2023年6月9日
    00
  • 20行JS代码实现网页刮刮乐效果

    来详细讲解一下! 1. 网页刮刮乐效果简介 网页刮刮乐效果是一种常用的交互设计,通过刮开图片表面的遮盖层来揭示下面的内容,增加用户参与感和趣味性。使用JS实现刮刮乐效果的方法较为简单且易操作,下面就是具体的攻略。 2. 刮刮乐效果实现步骤 步骤一: HTML结构 <div class="scratch"> <canvas…

    css 2023年6月10日
    00
  • bootstrap网格系统使用方法解析

    那么首先我来简单介绍一下Bootstrap网格系统的概念。 Bootstrap是一种流行的响应式网页开发框架,其网格系统是其最为重要的特性之一,它使得开发者能够轻松创建自适应布局,将页面分割成多列,并确保这些列在各种设备上的显示方式都是一致的。 在Bootstrap网格系统中,页面被划分成12个等宽的列(column),并且可以通过CSS类来控制任何一列在不…

    css 2023年6月10日
    00
  • 详解css栅格系统在项目中的灵活运用

    详解css栅格系统在项目中的灵活运用 什么是CSS栅格系统? CSS栅格系统是一种基于网格的布局系统,它将页面的整个宽度分为若干个等宽的列,开发者可以选择在其中的某些列来放置内容。CSS栅格系统使页面开发更加简单并且可以适应不同大小的屏幕。 如何使用CSS栅格系统? 在使用CSS栅格系统时,最好使用一些已经成熟的框架,如Bootstrap、Foundatio…

    css 2023年6月11日
    00
  • js和jquery如何获取图片真实的宽度和高度

    获取图片真实宽度和高度是前端开发中一个常见的需求,在JavaScript和jQuery中有多种方法可以实现。 使用原生JavaScript获取图片真实宽度和高度 使用Image对象的naturalWidth和naturalHeight属性 使用Image对象的naturalWidth和naturalHeight属性可以获取图片的原始宽度和高度,如下所示: v…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部