@parsonic/back-to-top
Version:
Scroll back to top of page web component
202 lines (151 loc) • 4.67 kB
Markdown
# Back To Top
A web component for scrolling back to the top of the page.
## Install
```shell
npm install --save @parsonic/back-to-top
```
## Usage
Use copy to clipboard with your favourite bundler or directly from a CDN. A
minified build is provided as `min.js` with a source map.
### Quick start
Add a script tag with the minified build and use the element in your page.
```html
<script
defer
src="https://cdn.jsdelivr.net/npm/@parsonic/back-to-top/min.js"></script>
<back-to-top data-scroll-behavior="smooth"></back-to-top>
```
### Bundler
Import the `BackToTop` component at the root of your application and register
it.
```js
import BackToTop from '@parsonic/back-to-top/BackToTop.js'
BackToTop.register()
// Use <back-to-top></back-to-top> in your page or components
```
### CDN
Import the `BackToTop` component from the CDN and register it before using.
```html
<script type="module">
import BackToTop from 'https://cdn.jsdelivr.net/npm/@parsonic/back-to-top/BackToTop.js'
BackToTop.register()
</script>
<back-to-top></back-to-top>
```
If you prefer to give the element an alternative tag name you can pass this to
the register method.
```js
// To use as <my-back-to-top></my-back-to-top>
BackToTop.register('my-back-to-top')
```
## Scroll behavior
The [scroll behavior]() when the button is clicked can be set by specifying the
`data-scroll-behavior` attribute.
```html
<back-to-top data-scroll-behavior="smooth"></back-to-top>
```
Alternatively, the setting for `scroll-behavior` can be set via CSS for the
document or container being scrolled.
```css
html {
scroll-behavior: smooth;
}
```
## Appearance
The button will appear once the container has scrolled past a threshold and the
user starts to scroll back up the page or container. The default threshold is
`500px` and this can be overridden using the `data-threshold` attribute.
```html
<back-to-top data-threshold="0"></back-to-top>
```
## Scrolling inside a container element
The back to top button may also be used when scrolling within an element by
providing the element id in the `data-scroll-container` attribute. If the button
needs to be aligned to the element then update the default positioning with CSS.
```html
<style>
.page {
height: 800px;
position: relative;
}
#container {
height: 100%;
overflow: auto;
}
back-to-top {
position: absolute;
}
</style>
<div class="page">
<div id="container">
<!--- long form content --->
</div>
<back-to-top data-scroll-container="container"></back-to-top>
</div>
```
## Focusing an element
To apply focus to a focusable element when the scroll button is clicked, add an
id to the element and pass this id as the `data-focus-target` attribute.
```html
<div class="page">
<div id="container">
<h2><a id="section-title" href="#section-title">Section name</a></h2>
<!--- long form content --->
</div>
<back-to-top
data-scroll-container="container"
data-focus-target="section-title"></back-to-top>
</div>
```
<!-- prettier-ignore -->
> [!NOTE]
> `focus-visible` styles will not be applied to the target when focused
> and applying this via the `focus` method is not currently supported. See
> [options.focusVisible](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#focusvisible)
## Customising the button
The default button comprises of a button element with an SVG icon. A default
ARIA label of `Back to top` is applied to the button and can be overridden using
the `data-button-label` attribute.
```html
<back-to-top data-button-label="Back to top"></back-to-top>
```
The button can be replaced entirely using the default slot or styled via the
`button` css part.
```html
<style>
back-to-top::part(button) {
background-color: rgb(0 0 0 / 40%);
}
</style>
<back-to-top>
<button>Back 👆</button>
</back-to-top>
```
To style the icon inside the button use the `icon` css part to target the SVG
elements.
```css
back-to-top::part(icon) {
stroke: black;
}
```
To replace the icon use the `icon` slot.
```html
<back-to-top>
<span slot="icon">👆</span>
</back-to-top>
```
The button may also be styled using the CSS custom properties listed below and
via. the `data-state` attribute which will have one of two states, `active` or
`inactive` depending on whether the button should be visible or not.
```css
:root {
--btt-button-background: rgb(0 0 0 / 60%);
--btt-button-background-hover: rgb(0 0 0 / 80%);
--btt-button-border: none;
--btt-button-color: white;
--btt-button-inset: auto 2rem 2rem auto;
--btt-button-padding: 0.5rem;
--btt-button-radius: 999px;
--btt-button-size: 1.5rem;
}
```