Skip to content

Commit

Permalink
add tests and support markup
Browse files Browse the repository at this point in the history
  • Loading branch information
GeoSot committed Jul 26, 2022
1 parent ce5cd0c commit b462723
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 7 deletions.
14 changes: 8 additions & 6 deletions js/src/scrollspy.js
Expand Up @@ -112,6 +112,13 @@ class ScrollSpy extends BaseComponent {
// TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
config.target = getElement(config.target) || document.body

// TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin

if (typeof config.threshold === 'string') {
config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))
}

return config
}

Expand Down Expand Up @@ -144,7 +151,7 @@ class ScrollSpy extends BaseComponent {
const options = {
root: this._rootElement,
threshold: this._config.threshold,
rootMargin: this._getRootMargin()
rootMargin: this._config.rootMargin
}

return new IntersectionObserver(entries => this._observerCallback(entries), options)
Expand Down Expand Up @@ -189,11 +196,6 @@ class ScrollSpy extends BaseComponent {
}
}

// TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
_getRootMargin() {
return this._config.offset ? `${this._config.offset}px 0px -30%` : this._config.rootMargin
}

_initializeTargetsAndObservables() {
this._targetLinks = new Map()
this._observableSections = new Map()
Expand Down
27 changes: 26 additions & 1 deletion js/tests/unit/scrollspy.spec.js
Expand Up @@ -132,7 +132,7 @@ describe('ScrollSpy', () => {
' <a class="nav-link active" id="one-link" href="#">One</a>' +
'</ul>',
'<div id="content">',
' <div id="one-link" style="height: 300px;">test</div>',
' <div id="one-link">test</div>',
'</div>'
].join('')

Expand All @@ -144,6 +144,31 @@ describe('ScrollSpy', () => {
expect(scrollSpy._observer.thresholds).toEqual([1])
})

it('should respect threshold option mark-up', () => {
fixtureEl.innerHTML = [
'<ul id="navigation" class="navbar">',
' <a class="nav-link active" id="one-link" href="#">One</a>' +
'</ul>',
'<div id="content" data-bs-threshold="0,0.2,1">',
' <div id="one-link">test</div>',
'</div>'
].join('')

const scrollSpy = new ScrollSpy('#content', {
target: '#navigation'
})

const expectToBeCloseToArray = (actual, expected) => {
expect(actual.length).toBe(expected.length)
for (const x of actual) {
const i = actual.indexOf(x)
expect(x).withContext(`[${i}]`).toBeCloseTo(expected[i])
}
}

expectToBeCloseToArray(scrollSpy._observer.thresholds, [0, 0.2, 1])
})

it('should not take count to not visible sections', () => {
fixtureEl.innerHTML = [
'<nav id="navigation" class="navbar">',
Expand Down
2 changes: 2 additions & 0 deletions site/content/docs/5.2/components/scrollspy.md
Expand Up @@ -380,6 +380,8 @@ const scrollSpy = new bootstrap.ScrollSpy(document.body, {
| `rootMargin` | string | `0px 0px -40%` | Intersection Observer [rootMargin](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/rootMargin) valid units, when calculating scroll position. |
| `smoothScroll` | boolean | `false` | Enables smooth scrolling when a user clicks on a link that refers to ScrollSpy observables. |
| `target` | string \| jQuery object \| DOM element | | Specifies element to apply Scrollspy plugin. |
| `threshold` | array | `[0.1, 0.5, 1]` | Intersection Observer [threshold](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#threshold) valid input, when calculating scroll position.|

{{< /bs-table >}}

{{< callout warning >}}
Expand Down

0 comments on commit b462723

Please sign in to comment.