tooltips.md 13.5 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
---
Mark Otto's avatar
Mark Otto committed
2
layout: docs
Mark Otto's avatar
Mark Otto committed
3
title: Tooltips
Mark Otto's avatar
Mark Otto committed
4
description: Documentation and examples for adding custom Bootstrap tooltips with CSS and JavaScript.
5
group: components
Mark Otto's avatar
Mark Otto committed
6
7
---

Mark Otto's avatar
Mark Otto committed
8
Inspired by the excellent Tipsy jQuery plugin written by Jason Frame. Tooltips are an updated version, which don't rely on images, use CSS3 for animations, and data-attributes for local title storage.
Mark Otto's avatar
Mark Otto committed
9

Mark Otto's avatar
Mark Otto committed
10
11
12
13
14
## Contents

* Will be replaced with the ToC, excluding the "Contents" header
{:toc}

15
16
## Overview

Jacob Thornton's avatar
Jacob Thornton committed
17
Things to know when using the tooltip plugin:
18

19
- Tooltips rely on the 3rd party library [Tether](http://tether.io/) for positioning. You must include [tether.min.js](https://github.com/HubSpot/tether/blob/master/dist/js/tether.min.js) before bootstrap.js in order for tooltips to work!
20
21
22
23
24
25
26
- Tooltips are opt-in for performance reasons, so **you must initialize them yourself**.
- Tooltips with zero-length titles are never displayed.
- Specify `container: 'body'` to avoid rendering problems in more complex components (like our input groups, button groups, etc).
- Triggering tooltips on hidden elements will not work.
- Tooltips for `.disabled` or `disabled` elements must be triggered on a wrapper element.
- When triggered from hyperlinks that span multiple lines, tooltips will be centered. Use `white-space: nowrap;` on your `<a>`s to avoid this behavior.

Mark Otto's avatar
Mark Otto committed
27
28
Got all that? Great, let's see how they work with some examples.

Jacob Thornton's avatar
Jacob Thornton committed
29
## Example: Enable tooltips everywhere
30
31
32
33
34
35
36
37
38
39

One way to initialize all tooltips on a page would be to select them by their `data-toggle` attribute:

{% highlight js %}
$(function () {
  $('[data-toggle="tooltip"]').tooltip()
})
{% endhighlight %}

## Examples
Mark Otto's avatar
Mark Otto committed
40

Mark Otto's avatar
Mark Otto committed
41
Hover over the links below to see tooltips:
Mark Otto's avatar
Mark Otto committed
42

43
<div class="bd-example tooltip-demo">
Mark Otto's avatar
Mark Otto committed
44
45
46
  <p class="muted">Tight pants next level keffiyeh <a href="#" data-toggle="tooltip" title="Default tooltip">you probably</a> haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel <a href="#" data-toggle="tooltip" title="Another tooltip">have a</a> terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan <a href="#" data-toggle="tooltip" title="Another one here too">whatever keytar</a>, scenester farm-to-table banksy Austin <a href="#" data-toggle="tooltip" title="The last tip!">twitter handle</a> freegan cred raw denim single-origin coffee viral.
  </p>
</div>
Mark Otto's avatar
Mark Otto committed
47

Mark Otto's avatar
Mark Otto committed
48
### Static demo
Mark Otto's avatar
Mark Otto committed
49

Mark Otto's avatar
Mark Otto committed
50
51
Four options are available: top, right, bottom, and left aligned.

52
<div class="bd-example bd-example-tooltip-static">
53
  <div class="tooltip tooltip-top" role="tooltip">
Mark Otto's avatar
Mark Otto committed
54
55
    <div class="tooltip-arrow"></div>
    <div class="tooltip-inner">
Mark Otto's avatar
Mark Otto committed
56
      Tooltip on the top
Mark Otto's avatar
Mark Otto committed
57
58
    </div>
  </div>
59
  <div class="tooltip tooltip-right" role="tooltip">
Mark Otto's avatar
Mark Otto committed
60
61
    <div class="tooltip-arrow"></div>
    <div class="tooltip-inner">
Mark Otto's avatar
Mark Otto committed
62
      Tooltip on the right
Mark Otto's avatar
Mark Otto committed
63
64
    </div>
  </div>
65
  <div class="tooltip tooltip-bottom" role="tooltip">
Mark Otto's avatar
Mark Otto committed
66
67
68
69
70
    <div class="tooltip-arrow"></div>
    <div class="tooltip-inner">
      Tooltip on the bottom
    </div>
  </div>
71
  <div class="tooltip tooltip-left" role="tooltip">
Mark Otto's avatar
Mark Otto committed
72
73
    <div class="tooltip-arrow"></div>
    <div class="tooltip-inner">
Mark Otto's avatar
Mark Otto committed
74
      Tooltip on the left
Mark Otto's avatar
Mark Otto committed
75
76
77
78
79
80
81
    </div>
  </div>
</div>

### Interactive demo

Hover over the buttons below to see their tooltips.
Mark Otto's avatar
Mark Otto committed
82

83
84
<div class="bd-example tooltip-demo">
  <div class="bd-example-tooltips">
Mark Otto's avatar
Mark Otto committed
85
86
    <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="top" title="Tooltip on top">Tooltip on top</button>
    <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="right" title="Tooltip on right">Tooltip on right</button>
Mark Otto's avatar
Mark Otto committed
87
88
    <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="bottom" title="Tooltip on bottom">Tooltip on bottom</button>
    <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="left" title="Tooltip on left">Tooltip on left</button>
89
    <button type="button" class="btn btn-secondary" data-toggle="tooltip" data-html="true" title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">Tooltip with HTML</button>
Mark Otto's avatar
Mark Otto committed
90
  </div>
Mark Otto's avatar
Mark Otto committed
91
92
93
94
95
96
</div>

{% highlight html %}
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="top" title="Tooltip on top">
  Tooltip on top
</button>
Mark Otto's avatar
Mark Otto committed
97
98
99
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="right" title="Tooltip on right">
  Tooltip on right
</button>
Mark Otto's avatar
Mark Otto committed
100
101
102
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="bottom" title="Tooltip on bottom">
  Tooltip on bottom
</button>
Mark Otto's avatar
Mark Otto committed
103
104
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="left" title="Tooltip on left">
  Tooltip on left
Mark Otto's avatar
Mark Otto committed
105
</button>
106
107
108
109
110
{% endhighlight %}

And with custom HTML added:

{% highlight html %}
111
112
113
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-html="true" title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">
  Tooltip with HTML
</button>
Mark Otto's avatar
Mark Otto committed
114
115
116
117
118
119
120
{% endhighlight %}

## Usage

The tooltip plugin generates content and markup on demand, and by default places tooltips after their trigger element.

Trigger the tooltip via JavaScript:
Mark Otto's avatar
Mark Otto committed
121
122
123
124
125

{% highlight js %}
$('#example').tooltip(options)
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
126
127
128
129
### Markup

The required markup for a tooltip is only a `data` attribute and `title` on the HTML element you wish to have a tooltip. The generated markup of a tooltip is rather simple, though it does require a position (by default, set to `top` by the plugin).

130
131
132
133
134
135
{% callout warning %}
#### Making tooltips work for keyboard and assistive technology users

You should only add tooltips to HTML elements that are traditionally keyboard-focusable and interactive (such as links or form controls). Although arbitrary HTML elements (such as `<span>`s) can be made focusable by adding the `tabindex="0"` attribute, this will add potentially annoying and confusing tab stops on non-interactive elements for keyboard users. In addition, most assistive technologies currently do not announce the tooltip in this situation.
{% endcallout %}

Chris Rebert's avatar
Chris Rebert committed
136
{% highlight html %}
Mark Otto's avatar
Mark Otto committed
137
138
139
140
<!-- HTML to write -->
<a href="#" data-toggle="tooltip" title="Some tooltip text!">Hover over me</a>

<!-- Generated markup by the plugin -->
141
<div class="tooltip tooltip-top" role="tooltip">
142
  <div class="tooltip-arrow"></div>
Mark Otto's avatar
Mark Otto committed
143
144
145
146
147
148
  <div class="tooltip-inner">
    Some tooltip text!
  </div>
</div>
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
149
150
151
152
153
154
155
### Options

Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-`, as in `data-animation=""`.

<div class="table-responsive">
  <table class="table table-bordered table-striped">
    <thead>
Mark Otto's avatar
Mark Otto committed
156
157
158
159
160
161
      <tr>
        <th style="width: 100px;">Name</th>
        <th style="width: 100px;">Type</th>
        <th style="width: 50px;">Default</th>
        <th>Description</th>
      </tr>
Mark Otto's avatar
Mark Otto committed
162
163
    </thead>
    <tbody>
Mark Otto's avatar
Mark Otto committed
164
165
166
167
168
169
170
171
172
173
174
175
      <tr>
        <td>animation</td>
        <td>boolean</td>
        <td>true</td>
        <td>Apply a CSS fade transition to the tooltip</td>
      </tr>
      <tr>
        <td>container</td>
        <td>string | false</td>
        <td>false</td>
        <td>
          <p>Appends the tooltip to a specific element. Example: <code>container: 'body'</code>. This option is particularly useful in that it allows you to position the tooltip in the flow of the document near the triggering element - which will prevent the tooltip from floating away from the triggering element during a window resize.</p>
Mark Otto's avatar
Mark Otto committed
176
       </td>
Mark Otto's avatar
Mark Otto committed
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
      </tr>
      <tr>
        <td>delay</td>
        <td>number | object</td>
        <td>0</td>
        <td>
         <p>Delay showing and hiding the tooltip (ms) - does not apply to manual trigger type</p>
         <p>If a number is supplied, delay is applied to both hide/show</p>
         <p>Object structure is: <code>delay: { "show": 500, "hide": 100 }</code></p>
        </td>
      </tr>
      <tr>
        <td>html</td>
        <td>boolean</td>
        <td>false</td>
192
193
194
195
196
        <td>
          <p>Allow HTML in the tooltip.</p>
          <p>If true, HTML tags in the tooltip's <code>title</code> will be rendered in the tooltip. If false, jQuery's <code>text</code> method will be used to insert content into the DOM.</p>
          <p>Use text if you're worried about XSS attacks.</p>
        </td>
Mark Otto's avatar
Mark Otto committed
197
198
199
200
201
202
      </tr>
      <tr>
        <td>placement</td>
        <td>string | function</td>
        <td>'top'</td>
        <td>
203
          <p>How to position the tooltip - top | bottom | left | right.</p>
Mark Otto's avatar
Mark Otto committed
204
205
206
207
208
209
210
          <p>When a function is used to determine the placement, it is called with the tooltip DOM node as its first argument and the triggering element DOM node as its second. The <code>this</code> context is set to the tooltip instance.</p>
        </td>
      </tr>
      <tr>
        <td>selector</td>
        <td>string</td>
        <td>false</td>
211
        <td>If a selector is provided, popover objects will be delegated to the specified targets. In practice, this is used to enable dynamic HTML content to have popovers added. See <a href="https://github.com/twbs/bootstrap/issues/4215">this</a> and <a href="https://jsbin.com/zopod/1/edit">an informative example</a>.</td>
Mark Otto's avatar
Mark Otto committed
212
213
214
215
216
217
218
219
220
221
222
223
224
225
      </tr>
      <tr>
        <td>template</td>
        <td>string</td>
        <td><code>'&lt;div class="tooltip" role="tooltip"&gt;&lt;div class="tooltip-arrow"&gt;&lt;/div&gt;&lt;div class="tooltip-inner"&gt;&lt;/div&gt;&lt;/div&gt;'</code></td>
        <td>
          <p>Base HTML to use when creating the tooltip.</p>
          <p>The tooltip's <code>title</code> will be injected into the <code>.tooltip-inner</code>.</p>
          <p><code>.tooltip-arrow</code> will become the tooltip's arrow.</p>
          <p>The outermost wrapper element should have the <code>.tooltip</code> class.</p>
        </td>
      </tr>
      <tr>
        <td>title</td>
226
        <td>string | element | function</td>
Mark Otto's avatar
Mark Otto committed
227
228
229
230
231
232
233
234
235
236
        <td>''</td>
        <td>
          <p>Default title value if <code>title</code> attribute isn't present.</p>
          <p>If a function is given, it will be called with its <code>this</code> reference set to the element that the tooltip is attached to.</p>
        </td>
      </tr>
      <tr>
        <td>trigger</td>
        <td>string</td>
        <td>'hover focus'</td>
Mark Otto's avatar
Mark Otto committed
237
        <td>How tooltip is triggered - click | hover | focus | manual. You may pass multiple triggers; separate them with a space. `manual` cannot be combined with any other trigger.</td>
Mark Otto's avatar
Mark Otto committed
238
239
      </tr>
      <tr>
Jacob Thornton's avatar
Jacob Thornton committed
240
241
        <td>constraints</td>
        <td>Array</td>
242
        <td>[]</td>
243
        <td>An array of constraints - passed through to Tether. For more information refer to Tether's <a href="http://tether.io/#constraints">constraint docs</a>.</td>
Jacob Thornton's avatar
Jacob Thornton committed
244
245
      </tr>
      <tr>
246
        <td>offset</td>
Jacob Thornton's avatar
Jacob Thornton committed
247
248
        <td>string</td>
        <td>'0 0'</td>
249
        <td>Offset of the popover relative to its target. For more information refer to Tether's <a href="http://tether.io/#constraints">offset docs</a>.</td>
Mark Otto's avatar
Mark Otto committed
250
      </tr>
Mark Otto's avatar
Mark Otto committed
251
252
253
254
    </tbody>
  </table>
</div>

255
256
257
258
259
{% callout info %}
#### Data attributes for individual tooltips

Options for individual tooltips can alternatively be specified through the use of data attributes, as explained above.
{% endcallout %}
Mark Otto's avatar
Mark Otto committed
260
261
262

### Methods

263
#### `$().tooltip(options)`
Mark Otto's avatar
Mark Otto committed
264
265
266

Attaches a tooltip handler to an element collection.

267
#### `.tooltip('show')`
Mark Otto's avatar
Mark Otto committed
268

Mark Otto's avatar
Mark Otto committed
269
Reveals an element's tooltip. **Returns to the caller before the tooltip has actually been shown** (i.e. before the `shown.bs.tooltip` event occurs). This is considered a "manual" triggering of the tooltip. Tooltips with zero-length titles are never displayed.
Mark Otto's avatar
Mark Otto committed
270
271
272

{% highlight js %}$('#element').tooltip('show'){% endhighlight %}

273
#### `.tooltip('hide')`
Mark Otto's avatar
Mark Otto committed
274

Mark Otto's avatar
Mark Otto committed
275
Hides an element's tooltip. **Returns to the caller before the tooltip has actually been hidden** (i.e. before the `hidden.bs.tooltip` event occurs). This is considered a "manual" triggering of the tooltip.
Mark Otto's avatar
Mark Otto committed
276
277
278

{% highlight js %}$('#element').tooltip('hide'){% endhighlight %}

279
#### `.tooltip('toggle')`
Mark Otto's avatar
Mark Otto committed
280

Mark Otto's avatar
Mark Otto committed
281
Toggles an element's tooltip. **Returns to the caller before the tooltip has actually been shown or hidden** (i.e. before the `shown.bs.tooltip` or `hidden.bs.tooltip` event occurs). This is considered a "manual" triggering of the tooltip.
Mark Otto's avatar
Mark Otto committed
282
283
284

{% highlight js %}$('#element').tooltip('toggle'){% endhighlight %}

285
#### `.tooltip('dispose')`
Mark Otto's avatar
Mark Otto committed
286

287
Hides and destroys an element's tooltip. Tooltips that use delegation (which are created using [the `selector` option](#options)) cannot be individually destroyed on descendant trigger elements.
Mark Otto's avatar
Mark Otto committed
288

289
{% highlight js %}$('#element').tooltip('dispose'){% endhighlight %}
Mark Otto's avatar
Mark Otto committed
290
291
292
293
294
295

### Events

<div class="table-responsive">
  <table class="table table-bordered table-striped">
    <thead>
Mark Otto's avatar
Mark Otto committed
296
297
298
299
      <tr>
        <th style="width: 150px;">Event Type</th>
        <th>Description</th>
      </tr>
Mark Otto's avatar
Mark Otto committed
300
301
    </thead>
    <tbody>
Mark Otto's avatar
Mark Otto committed
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
      <tr>
        <td>show.bs.tooltip</td>
        <td>This event fires immediately when the <code>show</code> instance method is called.</td>
      </tr>
      <tr>
        <td>shown.bs.tooltip</td>
        <td>This event is fired when the tooltip has been made visible to the user (will wait for CSS transitions to complete).</td>
      </tr>
      <tr>
        <td>hide.bs.tooltip</td>
        <td>This event is fired immediately when the <code>hide</code> instance method has been called.</td>
      </tr>
      <tr>
        <td>hidden.bs.tooltip</td>
        <td>This event is fired when the tooltip has finished being hidden from the user (will wait for CSS transitions to complete).</td>
      </tr>
Mark Otto's avatar
Mark Otto committed
318
319
320
    </tbody>
  </table>
</div>
Mark Otto's avatar
Mark Otto committed
321
322
323
324
325
326

{% highlight js %}
$('#myTooltip').on('hidden.bs.tooltip', function () {
  // do something…
})
{% endhighlight %}