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实现图片帧动画与曲线运动

    下面是使用CSS实现图片帧动画与曲线运动的完整攻略。 实现图片帧动画 步骤一:准备图片 首先需要准备好连续的若干张图片,这些图片可以是同一场景或者是不同场景,关键是这些图片的色彩和大小必须相同。 步骤二:定义CSS样式 接下来,我们需要定义CSS样式,来控制这些图片的位置和显示方式。首先设置带有“animation”的类的元素的宽度和高度,并且将其中的img…

    css 2023年6月11日
    00
  • 详解盒模型大小取决于它的padding,margin,border数值

    盒模型是网页布局的基础,可以用于定义元素的位置、尺寸和边距等属性。盒模型由内容区域、内边距、边框和外边距组成。 当给一个元素添加 padding、margin 和 border 时,它的实际尺寸会发生变化。这是因为元素的大小取决于它的内容区域加上内边距、边框和外边距的总和,也就是说,元素的盒模型大小取决于它的 padding、margin 和 border …

    css 2023年6月9日
    00
  • 深入理解css中的margin属性(推荐)

    深入理解CSS中的margin属性 什么是 margin 属性? 在 CSS 中,margin 属性用于设置元素的外边距,即元素和其他元素之间的距离和元素和文档边缘之间的距离。margin 属性有四个方向可以设置值:上方(top)、下方(bottom)、左边(left)和右边(right)。 margin 的属性值 margin 属性可以设置不同类型的属性值…

    css 2023年6月9日
    00
  • CSS 实现网页图片的预加载

    下面是关于“CSS 实现网页图片的预加载”的攻略,包含以下几个部分: 什么是图片预加载 图片预加载是指在网页加载时,提前将图片加载到浏览器缓存中,以提高用户体验。如果没有图片预加载,当用户滚动页面时,图片才开始加载,可能会出现卡顿或者加载慢的情况,影响用户体验。 CSS 实现图片预加载的方法 使用CSS伪类 ::before 或 ::after 可以通过CS…

    css 2023年6月9日
    00
  • javascript 精确获取样式属性(下)

    JavaScript 精确获取样式属性(下) 在上一篇文章中,我们介绍了如何使用 getComputedStyle 方法获取元素的计算样式,但是这个方法有一些局限性,本篇文章会继续探讨如何在 JavaScript 中精确获取元素的样式属性。 获取 transform 中的具体属性 在 CSS3 中,transform 属性可以改变元素的形状、大小和位置等,它…

    css 2023年6月10日
    00
  • 如何制作浮动广告 JavaScript制作浮动广告代码

    下面是制作浮动广告的完整攻略及示例说明。 前置知识 在学习制作浮动广告之前,需要掌握以下知识点: HTML 基础:了解 HTML 标签的基本用法,掌握 HTML 页面基本布局。 CSS 基础:了解 CSS 样式语言的基本用法,掌握 CSS 布局、样式、动画等基本技能。 JavaScript 基础:了解 JavaScript 语言的基本语法和常见操作方法,掌握…

    css 2023年6月10日
    00
  • vue页面切换过渡transition效果

    下面将详细讲解怎样实现vue页面切换过渡transition效果。 简介: Vue提供了多种切换过渡效果,通过以下两种方式实现: 在<transition>包裹下的元素,添加过渡类名 设置命名的名称作为组件的立场 第一种方式: html代码: <transition name="fade"> <p v-if=…

    css 2023年6月10日
    00
  • css 边框添加四个角的实现代码

    对于如何添加 CSS 边框的四个角,以下是完整攻略: 1. 使用 border-radius 属性 CSS3 引入了 border-radius 属性,可以用于圆角效果的实现,而 border-radius 同时也可以用于添加边框的四个角。通过设置 border-radius 的值,我们可以使边框的角变为圆角。 /* 实现四个角都为圆角 */ .div { …

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