scrollspy.md 7.87 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
2
3
4
5
---
layout: page
title: Srollspy
---

Mark Otto's avatar
Mark Otto committed
6
7
8
9
10
## Contents

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

Mark Otto's avatar
Mark Otto committed
11
12
13
14
## Example in navbar

The ScrollSpy plugin is for automatically updating nav targets based on scroll position. Scroll the area below the navbar and watch the active class change. The dropdown sub items will be highlighted as well.

15
<div class="bd-example">
Mark Otto's avatar
Mark Otto committed
16
17
18
  <nav id="navbar-example2" class="navbar navbar-default navbar-static" role="navigation">
    <div class="container-fluid">
      <div class="navbar-header">
19
        <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bd-example-js-navbar-scrollspy">
Mark Otto's avatar
Mark Otto committed
20
21
22
23
24
25
26
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
        <a class="navbar-brand" href="#">Project Name</a>
      </div>
27
      <div class="collapse navbar-collapse bd-example-js-navbar-scrollspy">
Mark Otto's avatar
Mark Otto committed
28
29
30
31
        <ul class="nav navbar-nav">
          <li><a href="#fat">@fat</a></li>
          <li><a href="#mdo">@mdo</a></li>
          <li class="dropdown">
Mark Otto's avatar
Mark Otto committed
32
33
34
35
36
37
38
39
            <a href="#" id="navbarDrop1" class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              Dropdown
            </a>
            <ul class="dropdown-menu" aria-labelledby="navbarDrop1">
              <li><a href="#one">one</a></li>
              <li><a href="#two">two</a></li>
              <li role="separator" class="divider"></li>
              <li><a href="#three">three</a></li>
Mark Otto's avatar
Mark Otto committed
40
41
42
            </ul>
          </li>
        </ul>
Mark Otto's avatar
Mark Otto committed
43
44
      </div>
    </div>
Mark Otto's avatar
Mark Otto committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  </nav>
  <div data-spy="scroll" data-target="#navbar-example2" data-offset="0" class="scrollspy-example">
    <h4 id="fat">@fat</h4>
    <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
    <h4 id="mdo">@mdo</h4>
    <p>Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.</p>
    <h4 id="one">one</h4>
    <p>Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.</p>
    <h4 id="two">two</h4>
    <p>In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.</p>
    <h4 id="three">three</h4>
    <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>
    <p>Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats.
    </p>
  </div>
</div>


## Usage
Mark Otto's avatar
Mark Otto committed
64

Mark Otto's avatar
Mark Otto committed
65
66
67
68
### Requires Bootstrap nav

Scrollspy currently requires the use of a [Bootstrap nav component](/components/nav/) for proper highlighting of active links.

Mark Otto's avatar
Mark Otto committed
69
### Requires relative positioning
Mark Otto's avatar
Mark Otto committed
70

Mark Otto's avatar
Mark Otto committed
71
No matter the implementation method, scrollspy requires the use of `position: relative;` on the element you're spying on. In most cases this is the `<body>`. When scrollspying on elements other than the `<body>`, be sure to have a `height` set and `overflow-y: scroll;` applied.
Mark Otto's avatar
Mark Otto committed
72

Mark Otto's avatar
Mark Otto committed
73
74
75
### Via data attributes

To easily add scrollspy behavior to your topbar navigation, add `data-spy="scroll"` to the element you want to spy on (most typically this would be the `<body>`). Then add the `data-target` attribute with the ID or class of the parent element of any Bootstrap `.nav` component.
Mark Otto's avatar
Mark Otto committed
76
77
78
79
80
81

{% highlight css %}
body {
  position: relative;
}
{% endhighlight %}
Mark Otto's avatar
Mark Otto committed
82

Mark Otto's avatar
Mark Otto committed
83
{% highlight html %}
Mark Otto's avatar
Mark Otto committed
84
<body data-spy="scroll" data-target="#navbar-example">
Mark Otto's avatar
Mark Otto committed
85
  ...
Mark Otto's avatar
Mark Otto committed
86
  <div id="navbar-example">
87
    <ul class="nav nav-tabs" role="tablist">
Mark Otto's avatar
Mark Otto committed
88
89
90
91
92
93
94
      ...
    </ul>
  </div>
  ...
</body>
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
95
96
97
98
### Via JavaScript

After adding `position: relative;` in your CSS, call the scrollspy via JavaScript:

Mark Otto's avatar
Mark Otto committed
99
{% highlight js %}
Mark Otto's avatar
Mark Otto committed
100
$('body').scrollspy({ target: '#navbar-example' })
Mark Otto's avatar
Mark Otto committed
101
102
{% endhighlight %}

103
104
{% callout danger %}
#### Resolvable ID targets required
Mark Otto's avatar
Mark Otto committed
105

106
107
108
109
110
111
112
113
Navbar links must have resolvable id targets. For example, a `<a href="#home">home</a>` must correspond to something in the DOM like `<div id="home"></div>`.
{% endcallout %}

{% callout info %}
#### Non-`:visible` target elements ignored

Target elements that are not [`:visible` according to jQuery](http://api.jquery.com/visible-selector/) will be ignored and their corresponding nav items will never be highlighted.
{% endcallout %}
Mark Otto's avatar
Mark Otto committed
114
115
116
117
118
119

### Methods

#### .scrollspy('refresh')

When using scrollspy in conjunction with adding or removing of elements from the DOM, you'll need to call the refresh method like so:
Mark Otto's avatar
Mark Otto committed
120
121
122
123
124
125
126
127

{% highlight js %}
$('[data-spy="scroll"]').each(function () {
  var $spy = $(this).scrollspy('refresh')
})
{% endhighlight %}


Mark Otto's avatar
Mark Otto committed
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
### Options

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

<div class="table-responsive">
  <table class="table table-bordered table-striped">
    <thead>
     <tr>
       <th style="width: 100px;">Name</th>
       <th style="width: 100px;">type</th>
       <th style="width: 50px;">default</th>
       <th>description</th>
     </tr>
    </thead>
    <tbody>
     <tr>
       <td>offset</td>
       <td>number</td>
       <td>10</td>
       <td>Pixels to offset from top when calculating position of scroll.</td>
     </tr>
    </tbody>
  </table>
</div>

### Events

<div class="table-responsive">
  <table class="table table-bordered table-striped">
    <thead>
     <tr>
       <th style="width: 150px;">Event Type</th>
       <th>Description</th>
     </tr>
    </thead>
    <tbody>
     <tr>
       <td>activate.bs.scrollspy</td>
       <td>This event fires whenever a new item becomes activated by the scrollspy.</td>
    </tr>
    </tbody>
  </table>
</div>
Mark Otto's avatar
Mark Otto committed
171
172
173
174
175
{% highlight js %}
$('#myScrollspy').on('activate.bs.scrollspy', function () {
  // do something…
})
{% endhighlight %}