How to Add a Free Scroll to Top Button Plugin to Squarespace Templates (5-Minute Tutorial)

Add a professional, accessible scroll to top button to your Squarespace website templates in under 5 minutes. This free plugin requires no third-party apps, works perfectly with Squarespace 7.1, and includes smooth animations, keyboard navigation, and mobile responsiveness. Copy and paste the ready-to-use code below.

    • Why Add a Scroll to Top Button to Your Squarespace Site?

    • What You'll Need

    • Step 1: Add the HTML Code

    • Step 2: Add the CSS Styling

    • Step 3: Add the JavaScript Functionality

    • Customizing Your Scroll Button

    • Accessibility and Performance Best Practices

    • Troubleshooting Common Issues

    • FAQ

    • Download the Complete Code

Why Add a Scroll to Top Button to Your Squarespace Site?

Squarespace templates are known for their beautiful design, but they lack built-in scroll to top functionality. Adding this simple feature improves user experience dramatically, especially on long-form content pages, product catalogs, and blogs.

Benefits of a scroll to top button:

  • Improved navigation: Visitors can quickly return to your menu without endless scrolling

  • Better mobile experience: Essential for smartphone users viewing long pages

  • Professional appearance: Shows attention to detail and modern web standards

  • Increased engagement: Reduces bounce rates by making navigation effortless

  • SEO-friendly: Better user metrics signal quality to search engines

Unlike expensive Squarespace plugins, this solution is completely free and gives you full control over design and functionality.


What You'll Need

Before we begin, make sure you have:

  • A Squarespace 7.1 website (works with all Squarespace templates)

  • Administrator access to your site

  • Basic familiarity with the Squarespace editor (no coding experience required)

This tutorial works with all Squarespace website templates 7.1


Step 1: Add the HTML Code

The first step is adding the button markup to your Squarespace site. You have two options:

Option A: Using a Code Block (Recommended)

  1. Navigate to Pages in your Squarespace dashboard

  2. Open any page where you want the button to appear

  3. Click the + (plus icon) to add a new block

  4. Search for and select Code

  5. Paste the complete code (HTML + CSS + JavaScript combined)

  6. Click Apply

Pro tip: Since the button uses fixed positioning, it will appear site-wide even when placed on a single page. For true site-wide implementation, use Option B.

Option B: Using Code Injection (Site-Wide)

  1. Go to SettingsAdvancedCode Injection

  2. Scroll to the Footer section

  3. Paste the complete code between <script> tags

  4. Click Save

Here's a preview of what you'll be pasting (full code available):

How can I add a "Scroll to top" button?

FOOTER

How can I add a "Scroll to top" button?

CODE BLOCK

How can I add a "Scroll to top" button?

CODE

<!-- ==============================================
     SCROLL TO TOP BUTTON - SQUARESPACE 7.1
     SINGLE FILE - PASTE THIS ENTIRE CODE INTO:
     Pages > Add Block > Code Block
     OR Settings > Advanced > Code Injection > Footer
     ============================================== -->

<style>
  /* Scoped button container to avoid conflicts */
  .sqs-scroll-to-top {
    position: fixed;
    bottom: 30px;
    right: 30px;
    z-index: 9998; /* High but not interfering with modals (usually 9999+) */
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;
    transform: translateY(10px);
  }
  
  /* Show button when visible class is added */
  .sqs-scroll-to-top.is-visible {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
  }
  
  /* Button styling - rounded with arrow */
  .sqs-scroll-to-top__button {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    background-color: #000;
    color: #fff;
    border: none;
    cursor: pointer;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
    transition: background-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
    font-size: 0; /* Hide text for screen readers only */
  }
  
  /* Hover state */
  .sqs-scroll-to-top__button:hover {
    background-color: #333;
    transform: translateY(-2px);
    box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
  }
  
  /* Focus state for keyboard navigation */
  .sqs-scroll-to-top__button:focus {
    outline: 3px solid #4a90e2;
    outline-offset: 3px;
  }
  
  /* Active/pressed state */
  .sqs-scroll-to-top__button:active {
    transform: translateY(0);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  }
  
  /* Arrow icon using CSS */
  .sqs-scroll-to-top__arrow {
    width: 0;
    height: 0;
    border-left: 8px solid transparent;
    border-right: 8px solid transparent;
    border-bottom: 12px solid currentColor;
  }
  
  /* Responsive adjustments for smaller screens */
  @media (max-width: 768px) {
    .sqs-scroll-to-top {
      bottom: 20px;
      right: 20px;
    }
    
    .sqs-scroll-to-top__button {
      width: 45px;
      height: 45px;
    }
  }
  
  /* Respect user's motion preferences */
  @media (prefers-reduced-motion: reduce) {
    .sqs-scroll-to-top {
      transition: opacity 0.1s linear, visibility 0.1s linear;
      transform: none;
    }
    
    .sqs-scroll-to-top.is-visible {
      transform: none;
    }
    
    .sqs-scroll-to-top__button {
      transition: background-color 0.1s linear;
    }
    
    .sqs-scroll-to-top__button:hover {
      transform: none;
    }
    
    .sqs-scroll-to-top__button:active {
      transform: none;
    }
  }
  
  /* CSS-only fallback: button always visible if JS fails */
  .no-js .sqs-scroll-to-top {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
  }
</style>

<!-- Scroll to Top Button HTML -->
<div class="sqs-scroll-to-top" id="scrollToTop" role="region" aria-label="Scroll to top">
  <button class="sqs-scroll-to-top__button" aria-label="Scroll to top of page">
    <span class="sqs-scroll-to-top__arrow" aria-hidden="true"></span>
  </button>
</div>

<script>
  (function() {
    'use strict';
    
    // Wait for DOM to be fully loaded
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', initScrollToTop);
    } else {
      initScrollToTop();
    }
    
    function initScrollToTop() {
      // Get button element - use more specific selector to avoid conflicts
      var scrollButton = document.getElementById('scrollToTop');
      
      // Exit if button doesn't exist (progressive enhancement)
      if (!scrollButton) {
        return;
      }
      
      // Configuration
      var scrollThreshold = 200; // Show button after scrolling 200px
      var isVisible = false;
      var ticking = false; // For scroll performance optimization
      
      // Check if user prefers reduced motion
      var prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
      
      /**
       * Toggle button visibility based on scroll position
       */
      function toggleButtonVisibility() {
        var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
        
        if (scrollTop > scrollThreshold && !isVisible) {
          scrollButton.classList.add('is-visible');
          isVisible = true;
        } else if (scrollTop <= scrollThreshold && isVisible) {
          scrollButton.classList.remove('is-visible');
          isVisible = false;
        }
        
        ticking = false;
      }
      
      /**
       * Request animation frame for scroll performance
       */
      function requestTick() {
        if (!ticking) {
          window.requestAnimationFrame(toggleButtonVisibility);
          ticking = true;
        }
      }
      
      /**
       * Scroll to top with smooth animation
       * Uses native smooth scroll with cubic easing fallback
       */
      function scrollToTop(event) {
        event.preventDefault();
        
        // Try native smooth scroll first (modern browsers)
        if ('scrollBehavior' in document.documentElement.style && !prefersReducedMotion) {
          window.scrollTo({
            top: 0,
            behavior: 'smooth'
          });
        } else {
          // Fallback: Custom smooth scroll with easing
          var startPosition = window.pageYOffset;
          var startTime = null;
          var duration = prefersReducedMotion ? 0 : 800; // Instant if reduced motion
          
          /**
           * Easing function: easeInOutCubic
           * Provides smooth acceleration and deceleration
           */
          function easeInOutCubic(t) {
            return t < 0.5
              ? 4 * t * t * t
              : 1 - Math.pow(-2 * t + 2, 3) / 2;
          }
          
          /**
           * Animation step function
           */
          function animateScroll(currentTime) {
            if (startTime === null) startTime = currentTime;
            
            var timeElapsed = currentTime - startTime;
            var progress = Math.min(timeElapsed / duration, 1);
            var easedProgress = easeInOutCubic(progress);
            
            window.scrollTo(0, startPosition * (1 - easedProgress));
            
            if (timeElapsed < duration) {
              requestAnimationFrame(animateScroll);
            }
          }
          
          requestAnimationFrame(animateScroll);
        }
      }
      
      /**
       * Keyboard accessibility handler
       */
      function handleKeyPress(event) {
        // Trigger on Enter (13) or Space (32)
        if (event.keyCode === 13 || event.keyCode === 32) {
          event.preventDefault();
          scrollToTop(event);
        }
      }
      
      // Event listeners
      window.addEventListener('scroll', requestTick, { passive: true });
      
      var button = scrollButton.querySelector('.sqs-scroll-to-top__button');
      if (button) {
        button.addEventListener('click', scrollToTop);
        button.addEventListener('keydown', handleKeyPress);
      }
      
      // Initial check in case page loads scrolled down
      toggleButtonVisibility();
      
      // Cleanup function for single-page apps (optional)
      window.addEventListener('beforeunload', function() {
        window.removeEventListener('scroll', requestTick);
        if (button) {
          button.removeEventListener('click', scrollToTop);
          button.removeEventListener('keydown', handleKeyPress);
        }
      });
    }
  })();
</script>

<!-- ==============================================
     INSTALLATION INSTRUCTIONS:
     
     1. Copy this ENTIRE code (from top to bottom)
     
     2. In Squarespace, go to:
        Pages > Click any page > Add Block > Code
        OR
        Settings > Advanced > Code Injection > Footer
     
     3. Paste the code and save
     
     4. Test by scrolling down 200px on your page
     
     CUSTOMIZATION:
     - Change button color: Edit background-color: #000;
     - Change position: Edit bottom: 30px; right: 30px;
     - Change scroll threshold: Edit scrollThreshold = 200
     - Change button size: Edit width: 50px; height: 50px;
     ============================================== -->

Why we use .sqs- prefix: This naming convention prevents conflicts with existing Squarespace template styles.

Step 2: Understanding the CSS Styling

If you're using the combined code from Step 1, your CSS is already included. However, if you prefer to add CSS separately through the Custom CSS editor:

  1. Go to DesignCustom CSS

  2. Paste the CSS portion of the code

  3. Click Save

Key CSS Features

Fixed positioning: The button stays visible while scrolling using position: fixed

Z-index management: Set to 9998 to appear above content but below Squarespace modals (typically 9999+)

Responsive design: Automatically adjusts size and position on mobile devices using media queries

Smooth transitions: Fade-in effect using CSS transitions for professional appearance

Accessibility: Proper focus states for keyboard navigation with visible outline

Reduced motion support: Respects user preferences with prefers-reduced-motion media query

Customization Quick Tips

Want to match your brand? Here's what to change:

/* Button color - Change #000 to your brand color */
background-color: #000;

/* Button size - Make it larger or smaller */
width: 50px;
height: 50px;

/* Position - Move closer to corner or edge */
bottom: 30px;
right: 30px;

Step 3: Adding JavaScript Functionality

The JavaScript powers the scroll detection and smooth animation. If using the combined code, this is already included.

Key JavaScript Features

Performance optimized: Uses requestAnimationFrame for smooth, efficient scrolling without janking

Progressive enhancement: Site works fine even if JavaScript fails to load

Scroll threshold: Button appears after scrolling 200 pixels down the page

Smooth scrolling: Uses native window.scrollTo with smooth behavior, plus a cubic easing fallback

Keyboard accessible: Full support for Tab, Enter, and Space key navigation

Reduced motion: Instantly scrolls without animation for users who prefer reduced motion

Where to Place JavaScript

Footer injection (recommended): Better for page load performance script executes after content loads

Header injection: Use this if you need the button immediately available, but wrap code in DOMContentLoaded:

document.addEventListener('DOMContentLoaded', function() {
  // Your scroll button code here
});

Customizing Your Scroll Button

Changing the Button Color

Locate this line in the CSS:

background-color: #000; /* Black */

Replace with your brand color:

  • White: #ffffff

  • Blue: #4a90e2

  • Custom: Use any hex color code

Adjusting Position

Modify these values:

bottom: 30px;  /* Distance from bottom */
right: 30px;   /* Distance from right */

For left-aligned button:

left: 30px;
right: auto;

Changing Scroll Threshold

Find this in JavaScript:

var scrollThreshold = 200; // Show after 200px

Change to appear sooner (100) or later (400).

Button Size

Adjust these CSS values:

width: 50px;   /* Make larger: 60px */
height: 50px;  /* Make larger: 60px */

Accessibility and Performance Best Practices

Accessibility Features Included

ARIA labels: Screen readers announce "Scroll to top of page" for visually impaired users

Keyboard navigation: Full tab-through support with visible focus indicators

Focus states: High-contrast blue outline appears when button receives keyboard focus

Semantic HTML: Proper button element instead of clickable div

Reduced motion: Respects user accessibility preferences automatically

Performance Optimization

This scroll to top plugin is lightweight and optimized:

File size: Less than 3KB combined (HTML + CSS + JS)

No dependencies: No external libraries required pure vanilla JavaScript

Passive event listeners: Prevents scroll blocking for smooth performance

RequestAnimationFrame: GPU-accelerated animation for 60fps smoothness

Minimal repaints: Only toggles visibility class, doesn't manipulate DOM repeatedly

Page Speed Tips

To maintain fast Squarespace load times:

  1. Inline critical CSS: Keep button styles inline (already done in our code)

  2. Defer JavaScript: Place script in footer or use defer attribute

  3. Optimize images: Compress hero and screenshot images to under 200KB

  4. Enable lazy loading: Use Squarespace's built-in lazy load for images

  5. Minify code: Remove comments and whitespace for production (reduces 20-30% file size)

Recommended keyword density: Maintain 1.0-1.5% for "Squarespace" naturally throughout your content without keyword stuffing.


Troubleshooting Common Issues

Button Doesn't Appear

Problem: You've added the code but see no button.

Solutions:

  • Scroll down more than 200 pixels to trigger visibility

  • Check that you pasted the complete code including HTML, CSS, and JavaScript

  • Clear browser cache (Ctrl/Cmd + Shift + R)

  • Verify code is in a Code Block or Code Injection, not a Text Block

Button Appears But Doesn't Scroll

Problem: Button visible but clicking does nothing.

Solutions:

  • Ensure JavaScript is included and not blocked by browser

  • Check browser console (F12) for errors

  • Verify you're not in Squarespace edit mode (preview or live site)

  • Disable browser extensions that might block scripts

Button Conflicts with Squarespace Templates

Problem: Button overlaps header, announcement bar, or other elements.

Solutions:

  • Adjust z-index (decrease from 9998 to 9900)

  • Change position values (move further from edges)

  • Check for CSS conflicts—our .sqs- prefix should prevent most issues

Button Looks Wrong on Mobile

Problem: Button too large or mispositioned on smartphones.

Solutions:

  • CSS includes responsive breakpoint at 768px—verify this code is present

  • Test on actual device, not just browser resize (rendering differs)

  • Adjust mobile-specific values in @media (max-width: 768px) section

Code Injection Not Working

Problem: Code Injection page shows error or doesn't save.

Solutions:

  • Ensure you're on a paid Squarespace plan (Code Injection requires Business plan or higher)

  • Wrap code properly in <style> and <script> tags

  • Remove any Smart Quotes (") and use straight quotes (")

  • Check for syntax errors using browser console

Clearing Squarespace Cache

Squarespace caches CSS and JavaScript. After making changes:

  1. Save your changes

  2. Open an incognito/private browser window

  3. View your live site (not editor view)

  4. Hard refresh: Ctrl+Shift+R (Windows) or Cmd+Shift+R (Mac)


Conclusion

Adding a scroll to top button to your Squarespace templates takes just 5 minutes and dramatically improves user experience. Unlike expensive Squarespace plugins, this free solution gives you complete control over design, functionality, and performance.

Key takeaways:

  • Works with all Squarespace 7.1 and 7.0 templates

  • Fully accessible and mobile responsive

  • Performance-optimized with smooth animations

  • No plugins or third-party apps needed

  • Easy to customize for your brand

Have questions about implementing scroll functionality on your Squarespace website? Drop a comment below, and I'll help you troubleshoot.

Ready to enhance your Squarespace site? Download the free code and install it today. Then explore our other free Squarespace plugins and premium Squarespace templates to take your site to the next level.


Frequently Asked Questions

  • Yes, this code is compatible with all Squarespace 7.1 templates and most 7.0 templates. The .sqs- CSS prefix ensures compatibility with Bedford, Pacific, Brine, Avenue, and all other Squarespace website templates.

  • No plugins required. This is a pure code solution that integrates directly into Squarespace. Unlike paid plugins, you have complete control and zero ongoing costs.

  • Minimal impact. The combined code is under 3KB and uses performance-optimized JavaScript with requestAnimationFrame. Most Squarespace sites won't notice any speed difference.

  • Yes, but Code Injection location differs slightly. Navigate to Settings → Advanced → Code Injection. The code itself works identically on both 7.0 and 7.1.

  • Absolutely. The CSS includes responsive breakpoints that automatically adjust button size and position on tablets and smartphones. Touch targets meet accessibility guidelines.

  • Customize the background-color, width, height, bottom, and right values in the CSS section. Full customization guide provided in the customizing section above.

  • Yes. The button is fully keyboard accessible with Tab navigation, Enter/Space activation, and visible focus states. It also respects prefers-reduced-motion settings.

  • Yes. The code is licensed under MIT, allowing unlimited use on personal and commercial projects.

Next
Next

The Complete Guide to Pairing Squarespace Templates with Essential Plugins for 2025: Match Your Design with Functionality