Our npm namespace has changed. Developers should update their projects to continue accessing our components.

Back to Top

Use a Back to Top button to help users quickly navigate to the top of a long page.

  • Content:
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/1-variables/global.variables' as globalVariables;
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/1-variables/spacing.variables' as spacing;
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/1-variables/colours.variables' as colours;
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/1-variables/breakpoints.variables' as breakpoints;
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/1-variables/typography.variables' as typography;
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/2-tools/functions/global.functions' as globalFunctions;
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/1-variables/font-sizes.variables' as fontSizes;
    @use '@ongov/ontario-design-system-global-styles/dist/styles/scss/1-variables/font-weights.variables' as fontWeights;
    
    $ontario-focus-transition: box-shadow 0.1s ease-in-out;
    
    // Colour variables
    $ontario-colour-back-to-top--default-background: #e6e6e6;
    $ontario-colour-back-to-top--active-background: #b2b2b2;
    
    $default-padding-top: globalFunctions.px-to-rem(8);
    $default-padding-right: globalFunctions.px-to-rem(16);
    $default-padding-bottom: globalFunctions.px-to-rem(8);
    $default-padding-left: globalFunctions.px-to-rem(12);
    
    $default-icon-margin-top: globalFunctions.px-to-rem(1);
    $default-icon-margin-right: globalFunctions.px-to-rem(8);
    $default-icon-margin-bottom: globalFunctions.px-to-rem(1);
    $default-icon-margin-left: spacing.$spacing-0;
    
    $tablet-padding-top: globalFunctions.px-to-rem(6);
    $tablet-padding-right: globalFunctions.px-to-rem(12);
    $tablet-padding-bottom: globalFunctions.px-to-rem(9);
    $tablet-padding-left: globalFunctions.px-to-rem(12);
    
    $tablet-icon-margin-top: globalFunctions.px-to-rem(1);
    $tablet-icon-margin-right: spacing.$spacing-0;
    $tablet-icon-margin-bottom: globalFunctions.px-to-rem(4);
    $tablet-icon-margin-left: spacing.$spacing-0;
    
    $mobile-padding: globalFunctions.px-to-rem(8);
    $mobile-icon-margin: spacing.$spacing-0;
    
    .ontario-back-to-top--default {
    	position: fixed;
    	bottom: 5%;
    	right: 2%;
    	visibility: hidden;
    	opacity: 0;
    	transition: 0.1s ease-in-out;
    	display: flex;
    	justify-content: center;
    	align-items: center;
    	height: globalFunctions.px-to-rem(48);
    	padding: $default-padding-top $default-padding-right $default-padding-bottom $default-padding-left;
    	background: $ontario-colour-back-to-top--default-background;
    	border: globalFunctions.px-to-rem(2) solid colours.$ontario-colour-white;
    	border-radius: globalVariables.$global-radius;
    	box-sizing: border-box;
    	box-shadow: 0 globalFunctions.px-to-rem(2) globalFunctions.px-to-rem(4) rgba(colours.$ontario-colour-black, 0.6);
    	color: colours.$ontario-colour-black;
    	line-height: globalFunctions.px-to-rem(20);
    	font-size: fontSizes.$ontario-font-size-standard-body-text;
    	font-family: typography.$ontario-font-open-sans;
    	font-weight: fontWeights.$ontario-font-weights-semi-bold;
    	z-index: 10000;
    	cursor: pointer;
    
    	svg.ontario-icon {
    		margin: 0.125rem spacing.$spacing-2 spacing.$spacing-0 spacing.$spacing-0;
    		width: globalFunctions.px-to-rem(32);
    		height: globalFunctions.px-to-rem(32);
    	}
    
    	&:hover {
    		background-color: colours.$ontario-greyscale-20;
    	}
    
    	&:focus {
    		background-color: $ontario-colour-back-to-top--default-background;
    		box-shadow: 0 0 0 globalFunctions.px-to-rem(4) colours.$ontario-colour-focus,
    			0 globalFunctions.px-to-rem(3) globalFunctions.px-to-rem(5) globalFunctions.px-to-rem(3) rgba(0, 0, 0, 0.6);
    		outline: globalFunctions.px-to-rem(4) solid transparent;
    		transition: 0.1s ease-in-out;
    	}
    
    	&:active {
    		background-color: $ontario-colour-back-to-top--active-background;
    		box-shadow: 0 0 0 globalFunctions.px-to-rem(4) colours.$ontario-colour-focus,
    			0 globalFunctions.px-to-rem(5) globalFunctions.px-to-rem(7) globalFunctions.px-to-rem(3) rgba(0, 0, 0, 0.6);
    		outline: globalFunctions.px-to-rem(4) solid transparent;
    		transition: background-color 0s, $ontario-focus-transition;
    	}
    
    	&:visited {
    		color: colours.$ontario-colour-white;
    	}
    
    	@media screen and (max-width: breakpoints.$medium-breakpoint) {
    		flex-direction: column;
    		height: globalFunctions.px-to-rem(76);
    		padding: $tablet-padding-top $tablet-padding-right $tablet-padding-bottom $tablet-padding-left;
    		svg.ontario-icon {
    			margin: $tablet-icon-margin-top $tablet-icon-margin-right $tablet-icon-margin-bottom $tablet-icon-margin-left;
    			width: globalFunctions.px-to-rem(32);
    			height: globalFunctions.px-to-rem(32);
    		}
    	}
    
    	@media screen and (max-width: breakpoints.$small-breakpoint) {
    		display: block;
    		padding: $mobile-padding;
    		font-size: 0;
    		width: globalFunctions.px-to-rem(48);
    		height: globalFunctions.px-to-rem(48);
    		svg.ontario-icon {
    			margin: $mobile-icon-margin;
    			@-moz-document url-prefix() {
    				padding: 0 spacing.$spacing-1 spacing.$spacing-1 spacing.$spacing-0;
    			}
    		}
    	}
    }
    
    .active {
    	visibility: visible;
    	opacity: 1;
    }
    
  • URL: /components/raw/back-to-top/back-to-top.scss
  • Filesystem Path: fractal/components/components/navigation/back-to-top/back-to-top.scss
  • Size: 5 KB
  • Content:
    .ontario-back-to-top--default{position:fixed;bottom:5%;right:2%;visibility:hidden;opacity:0;transition:.1s ease-in-out;display:flex;justify-content:center;align-items:center;height:3rem;padding:.5rem 1rem .5rem .75rem;background:#e6e6e6;border:.125rem solid #fff;border-radius:4px;box-sizing:border-box;box-shadow:0 .125rem .25rem rgba(26,26,26,.6);color:#1a1a1a;line-height:1.25rem;font-size:1rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:600;z-index:10000;cursor:pointer}.ontario-back-to-top--default svg.ontario-icon{margin:.125rem .5rem 0 0;width:2rem;height:2rem}.ontario-back-to-top--default:hover{background-color:#ccc}.ontario-back-to-top--default:focus{background-color:#e6e6e6;box-shadow:0 0 0 .25rem #009adb,0 .1875rem .3125rem .1875rem rgba(0,0,0,.6);outline:.25rem solid transparent;transition:.1s ease-in-out}.ontario-back-to-top--default:active{background-color:#b2b2b2;box-shadow:0 0 0 .25rem #009adb,0 .3125rem .4375rem .1875rem rgba(0,0,0,.6);outline:.25rem solid transparent;transition:background-color 0s,box-shadow .1s ease-in-out}.ontario-back-to-top--default:visited{color:#fff}@media screen and (max-width: 73em){.ontario-back-to-top--default{flex-direction:column;height:4.75rem;padding:.375rem .75rem .5625rem .75rem}.ontario-back-to-top--default svg.ontario-icon{margin:.0625rem 0 .25rem 0;width:2rem;height:2rem}}@media screen and (max-width: 40em){.ontario-back-to-top--default{display:block;padding:.5rem;font-size:0;width:3rem;height:3rem}.ontario-back-to-top--default svg.ontario-icon{margin:0}@-moz-document url-prefix(){.ontario-back-to-top--default svg.ontario-icon{padding:0 .25rem .25rem 0}}}.active{visibility:visible;opacity:1}
  • URL: /components/raw/back-to-top/back-to-top.css
  • Filesystem Path: fractal/components/components/navigation/back-to-top/back-to-top.css
  • Size: 1.7 KB

Guiding principle: Be consistent.

When to use this component

The Back to Top button is a shortcut that allows users to quickly navigate to the top of a long page.

Back-to-top buttons are used when there is a need to get back to the top of the page to:

  • see the navigation menu and choose a new destination
  • access filtering and sorting features
  • enter or edit a query in the search box

Our code specifies that the Back to Top button appears once the user has scrolled 200 pixels down the page.


Do:

  • use only one Back to Top button per page
  • place the Back to Top button in the lower-right corner of the page and ensure it is sticky
  • place the Back to Top button above other sticky buttons (for example, chat or exit buttons)
  • include microcopy, such as “Top”, to be more descriptive on desktop view
  • consider using a transition effect for the movement to the top of the page to help users orient themselves

Don’t:

  • use multiple back-to-top links in every section of the page
  • allow the button to move, as movement will distract the user

Technical specifications

Colour Width
Default background: #E6E6E6
Font: #1A1A1A
Hover background: #CCCCCC
Active background: #B2B2B2
Active border: #009ADB
Focus background: #E6E6E6
Focus border: #009ADB
Desktop: 97px
Tablet: 56px
Mobile: 48px

JavaScript

Example JavaScript code for the functionality:

window.addEventListener('scroll', function () {
    let scroll = document.getElementById('btt-button');
    scroll.classList.toggle('active', window.scrollY > 200);
});

function scrollToTop() {
    window.scrollTo({ top: 0, left: 0, behavior: 'smooth' });
}

Note that a polyfill is required for this to work in Safari. We have used this smooth scroll behaviour polyfill.

If you have any questions or feedback, please get in touch.