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日

相关文章

  • 苹果iPhone safari浏览器样式重置修复submit按钮圆角bug

    问题描述:在苹果iPhone的Safari浏览器中,如果使用CSS对button或者input标签来设置圆角边框,那么当这些标签设置为type=”submit”时,会出现圆角边框不显示或者显示不正确的问题。这种情况下,我们需要进行样式重置来修复这个问题。 解决方案: 步骤1:为了避免Safari的默认样式,我们需要首先重置样式: button, input[…

    css 2023年6月10日
    00
  • 使用CSS3在触屏上为按钮实现激活效果

    下面我将针对如何使用CSS3在触屏上为按钮实现激活效果进行完整攻略: 1. CSS3 在触屏上实现激活效果简介 在移动端网页设计中,为按钮添加激活效果是非常重要的,因为它可以提高用户交互的体验,帮助用户更好地操作页面。另外,这也是一个比较常见的网页设计需求,因此我们要掌握如何用 CSS3 实现触屏按钮激活效果。 2. 实现按钮的激活效果 我们可以使用 :ac…

    css 2023年6月10日
    00
  • 固定宽度 高度的页面在不同分辨率的屏幕上垂直 水平居中

    固定宽度,高度的页面在不同分辨率的屏幕上垂直,水平居中,可以按照下面的方法实现: 在 CSS 样式表中设置 body 元素、html 元素的高度为100%: body, html { height: 100%; } 使用 flexbox 来实现垂直水平居中,首先在 body 元素中设置 display:flex,将页面变成 flex 容器,然后在子元素中设置…

    css 2023年6月10日
    00
  • CSS样式表高效使用技巧充分利用样式表的强大性

    CSS样式表是Web开发中非常重要的一部分,可以控制网站的外观和布局。以下是一些CSS样式表高效使用技巧,可以充分利用样式表的强大性: 1. 使用类选择器和ID选择器 类选择器和ID选择器是CSS样式表中最常用的选择器。使用类选择器和ID选择器可以减少CSS代码的重复,并提高代码的可读性。以下是一个简单的示例: <div class="con…

    css 2023年5月18日
    00
  • 一步步教你在Asp.net Mvc中使用UEditor编辑器

    一步步讲解在Asp.net Mvc中使用UEditor编辑器的完整攻略如下: 第一步:下载UEditor编辑器 首先需要到UEditor的官网下载编辑器的源码包,可以选择压缩包下载或者git clone到本地。 第二步:解压UEditor编辑器 将下载下来的源码进行解压,并将解压后的UEditor文件夹放到我们项目的根目录下。 第三步:在项目中引用UEdit…

    css 2023年6月9日
    00
  • 微信小程序实现指定显示行数多余文字去掉用省略号代替

    要实现微信小程序的指定显示行数多余文字去掉用省略号代替,可以使用以下步骤: 1. 在WXSS中使用line-clamp属性 首先,在WXSS中使用line-clamp属性来控制文本显示的行数。line-clamp需要指定一个整数值来表示显示行数。例如,要显示3行文本,可以设置line-clamp: 3;。 .text { display: -webkit-b…

    css 2023年6月10日
    00
  • jQuery之浮动窗口实现代码(两种方法)

    下面是对“jQuery之浮动窗口实现代码(两种方法)”这篇文章的详细讲解: jQuery之浮动窗口实现代码(两种方法) 前言 前端开发中,弹出框是一个非常常见的需求,而浮动窗口又是其中的一种。在这篇文章中,我将介绍两种实现浮动窗口的方法,并给出相应的代码示例。 方法一:CSS + jQuery实现 这种方法的思路是先利用CSS定义浮动窗口的样式,然后用jQu…

    css 2023年6月10日
    00
  • 解决vue打包之后静态资源图片失效的问题

    当我们使用Vue进行开发时,经常需要使用一些静态资源,比如图片、字体文件等。在开发过程中,这些资源能够正常地显示和使用,但是当我们进行打包时,很容易出现静态资源失效的问题。在本文中,我们将详细讲解如何解决Vue打包之后静态资源图片失效的问题。 问题原因分析 当我们使用Vue进行开发,在项目中引用了一些静态资源时,这些资源会被打包到项目中。在打包完成之后,这些…

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