fullPage.js
Connect fullPage.js, a snap-scrolling JavaScript library, with Webflow to build full-screen section-based sites with dot navigation, horizontal slides, and keyboard navigation.

Out of the box, Webflow lacks a true full-screen snap-scroll feature. You can approximate vertical section snapping with CSS scroll-snap properties, but built-in support for dot navigation, horizontal slides within sections, section-based URL anchors, and cinematic transition effects does not exist. Building these from scratch in Webflow requires significant custom development.
fullPage.js fills that gap. Connecting fullPage.js with Webflow gives you full-screen section snapping, horizontal slide carousels, lazy-loaded media, keyboard and touch navigation, and configurable transition effects — all initialized through a few lines of code pasted into Webflow's custom code fields. fullPage.js officially documents Webflow usage, and its creator maintains official cloneable templates in the Made-in-Webflow gallery.
This integration is most relevant to creative agencies building portfolio sites, freelance designers showcasing project work, marketing teams producing product landing pages, and developers creating storytelling microsites. If you need to control the narrative pacing of a page by revealing one full-screen section at a time, fullPage.js on Webflow is a standard approach.
How to integrate fullPage.js with Webflow
What is fullPage.js? fullPage.js is a JavaScript library by Álvaro Trigo that creates full-screen, snap-scrolling websites. It runs as vanilla JavaScript with no required dependencies, though jQuery is optional, and supports vertical section snapping, horizontal slides, dot navigation, anchor-based URL history, lazy loading, and responsive breakpoints. The current version is 4.0.41, with optional paid extensions for parallax, fading effects, and cinematic transitions.

Teams use fullPage.js with Webflow when a standard scrolling page does not match the design intent. Portfolio sites, product launch pages, and brand storytelling microsites all benefit from the controlled, section-by-section viewing experience that fullPage.js provides. The library handles scroll hijacking, touch gestures, and keyboard navigation while Webflow handles layout, styling, and content management.
The fullPage.js-Webflow integration supports 3 approaches:
- Cloneable templates let you start with a pre-built Webflow project that already includes fullPage.js code, so you only need to replace content.
- Custom code injection gives you full control over fullPage.js configuration by loading the library through Webflow's page-level custom code in head and body tags.
- The Webflow Data API enables dynamic section generation from Webflow CMS content, but requires server-side development.
Most implementations use custom code injection. Cloneable templates work well for quick starts, and the API path suits CMS-heavy sites where each collection item maps to a fullPage.js section.
Clone a pre-built fullPage.js template
The fastest way to get fullPage.js running on Webflow is to clone a template from the Made-in-Webflow gallery. These projects ship with the library's CSS, JavaScript, and initialization code already embedded. You replace the placeholder content with your own and publish with no code editing required beyond updating your license key.
Several community templates and official examples are available, each demonstrating different fullPage.js features. The library creator has submitted official cloneable projects directly to the gallery, and community builders have created templates with features like Webflow animation compatibility and Client-First structural organization.
[image placeholder]
To start with a cloneable template:
- Browse the Made-in-Webflow fullPage.js gallery and select a template that matches your layout needs.
- Click Clone Project to copy the template into your Webflow workspace.
- Open the cloned project, then go to the Pages panel, hover over the page using fullPage.js, click the gear icon, and scroll to the Custom Code section.
- Replace
YOUR_KEY_HEREin the initialization script with your fullPage.js commercial license key. - Replace the template's placeholder content with your own text, images, and media.
- Publish the site and test on the live URL — custom code does not run in the Webflow preview.
Notable cloneable templates include:
- Simple Snap Scroll with FullPage.js by Dominik Fojcik — over 9,700 clones, built on Client-First naming conventions
- fullPage.js basic example by Álvaro Trigo — the library creator's official starter template with 1,300 clones
- fullpage-js-interactions by John Marsh — demonstrates
scrollBar: truefor Webflow animation compatibility
Cloneable templates are the right starting point when you want a working fullPage.js setup immediately. For custom configurations, anchor definitions, or extension support, move to the custom code injection method below.
Add fullPage.js with custom code
Custom code injection gives you direct control over every fullPage.js option. You load the library's CSS and JavaScript through Webflow's page-level custom code fields, build the required HTML structure using Div Blocks in Webflow, and initialize the library with your chosen configuration. This method works on any paid Webflow site plan and supports the full range of fullPage.js features including extensions.
Before starting, confirm three prerequisites. You need a paid Webflow site plan — custom code does not render on free plans. You need a fullPage.js commercial license for any client or non-open-source project. And you should not add a separate jQuery script tag — Webflow already ships jQuery v3.5.1, and loading a second version causes conflicts.
[image placeholder]
Load the fullPage.js library
The library requires two files: a CSS stylesheet and a JavaScript file. Add both through page-level custom code to keep fullPage.js scoped to the pages that use it.
To load the library files:
- Open Webflow, click the Pages panel in the left sidebar, hover over your target page, and click the gear icon.
- Scroll to the Custom Code section.
- In the Inside
<head>tag field, paste the CSS link:
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/fullPage.js/4.0.20/fullpage.min.css"/>
- In the Before
</body>tag field, paste the JavaScript and initialization code:
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fullPage.js/4.0.20/fullpage.min.js"></script>
<script>
$(document).ready(function() {
if (!document.documentElement.classList.contains('wf-design-mode')) {
$('#fullpage').fullpage({
licenseKey: 'YOUR_KEY_HERE',
autoScrolling: true,
navigation: true,
responsiveWidth: 768,
scrollBar: true
});
}
});
</script>
Because fullPage.js is dependency-free, you can also initialize it with vanilla JavaScript instead of the jQuery plugin syntax:
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fullPage.js/4.0.20/fullpage.min.js"></script>
<script>
if (!document.documentElement.classList.contains('wf-design-mode')) {
new fullpage('#fullpage', {
licenseKey: 'YOUR_KEY_HERE',
autoScrolling: true,
navigation: true,
responsiveWidth: 768,
scrollBar: true
});
}
</script>
The jQuery example is shown here because Webflow already includes jQuery, not because fullPage.js requires it. Pin the version number in your CDN URL (for example, 4.0.20). The snippets above use a pinned sample version for implementation stability, while the library version referenced earlier in this guide is the current release. A versionless URL can auto-update to a new major version that breaks your license key and implementation.
Build the page structure in Webflow
fullPage.js expects a specific DOM structure: a wrapper element with ID fullpage containing direct-child divs with class section. You build this using Div Blocks in Webflow — not Webflow's native Section element, which adds structural attributes that interfere with fullPage.js targeting.
To create the required structure:
- Open the Add panel (+ icon in the left sidebar) and drag a Div Block onto the canvas.
- Select it, open the Element Settings panel (gear icon on the right sidebar), and set the ID field to
fullpage. - Drag another Div Block inside the
#fullpagewrapper. - Assign it the class
sectionin the Style panel and set its height to100VH. - Duplicate the
.sectiondiv for each additional full-screen section you need. - Add your content — text, images, video, Collection List elements — inside each
.sectiondiv.
The resulting structure in the Navigator panel looks like this:
Body
└── Div Block [ID: fullpage]
├── Div Block [Class: section] [Height: 100VH]
├── Div Block [Class: section] [Height: 100VH]
└── Div Block [Class: section] [Height: 100VH]
For horizontal slides within a section, add child Div Blocks with class slide inside any .section div. Publish the site and test on the live URL to verify the setup.
Handle Webflow scroll animation conflicts
Webflow scroll-triggered interactions detect the browser's native scrollTop position. fullPage.js replaces native scrolling with CSS translate3d transforms, so the scroll position never changes and Webflow's "scroll into view" and "while page is scrolling" triggers never fire. This is the most-documented conflict between the two tools.
Three workarounds address this:
- Set
scrollBar: truein your fullPage.js initialization (included in the code example above). This restores the native scrollbar so Webflow animations can detect scroll position. The trade-off is reduced snap behavior and potential frame rate drops with fixed or sticky elements inside the wrapper. - Use fullPage.js callbacks like
afterLoadandonLeaveto add and remove CSS classes that trigger animations. This requires writing JavaScript but gives you precise control over when animations fire. - Use fullPage.js CSS state classes — the library adds
activeto the current section andfp-viewing-SECTION-SLIDEto the<body>element. You can target these classes in Webflow's conditional visibility or in a Code Embed<style>block.
Page Load interactions work without workarounds. The conflict only affects scroll-triggered animations.
Prevent fullPage.js from breaking the Webflow Editor
When a client opens the Webflow Editor to update CMS content, fullPage.js can initialize and break the editor interface. The conditional check in the initialization code above (wf-design-mode class detection) is a documented mitigation pattern, but you should confirm it on the specific site and editing workflow you support. If you use a different initialization pattern, add this guard:
if (!document.documentElement.classList.contains('wf-design-mode')) {
// initialize fullPage.js here
}
Any agency deploying fullPage.js on a site where clients edit CMS content should test this behavior before launch. Without a working guard, clients may be unable to use the editor as expected.
Configure mobile responsiveness
Set responsiveWidth: 768 to disable fullPage.js on viewports narrower than 768 pixels. Below that breakpoint, the page falls back to native scrolling. This is the most reliable approach given multiple documented issues with fullPage.js touch handling on iOS and Android, including keyboard overlap on form inputs and slide-jumping behavior.
Build CMS-driven sections with the Webflow Data API
For sites where each CMS collection item should map to a fullPage.js section, the Webflow CMS API lets you fetch collection items and dynamically generate the section HTML. This approach requires server-side development and is relevant when the number of sections changes based on CMS content — portfolio projects, product features, or team members managed through the CMS.
The relevant APIs for this workflow are:
- The Webflow CMS Collection Items API retrieves items from any collection, filtered by custom fields
- The Webflow Custom Code API can programmatically register and apply scripts to specific pages
- fullPage.js has no server-side API — it is 100% client-side, so all server interaction happens through the Webflow API
This path is only necessary when static Div Blocks in Webflow cannot represent the section structure. For most sites, nesting CMS content inside static .section wrappers (using the custom code method above) is simpler and avoids API development entirely.
Fetch CMS items and generate sections
A typical implementation fetches collection items from the Webflow CMS API, maps each item to a .section div, injects the resulting HTML into the #fullpage wrapper, and then initializes fullPage.js.
To implement this:
- Create a CMS collection in Webflow for your sections. Add fields for section title, background image, body content, and a sort-order number.
- Generate a Webflow API token with
CMS:readscope from your site's Integrations settings. - On your server or serverless function, call
GET /v2/collections/:collection_id/itemswith your bearer token to retrieve the items. - Map each item to an HTML string:
<div class="section">...</div>. - Inject the generated HTML into the
#fullpagewrapper on the page using either the Custom Code API or a client-side fetch-and-render approach. - Initialize fullPage.js after the DOM is populated with the section elements.
This workflow makes sense when the section structure needs to be generated from CMS content rather than modeled as static wrappers in Webflow.
The observer: true option in fullPage.js automatically rebuilds its internal structure when the DOM changes, which helps when sections are injected after initial page load. For static content that does not change frequently, consider pre-rendering sections at build time rather than fetching on every page load.
What can you build with the fullPage.js Webflow integration?
Integrating fullPage.js with Webflow lets you create immersive, section-based scrolling experiences without building scroll-hijacking logic from scratch.
- Agency portfolio sites: Build a case study showcase where each scroll reveals one project at full-screen scale — with video backgrounds, horizontal slide carousels for project images, and dot navigation for jumping between clients. The Machbar brand agency site demonstrates this pattern with video backgrounds and full-screen sections.
- Product landing pages: Walk prospects through a problem-solution-features-CTA narrative where each section occupies the full viewport. Anchor URLs let you deep-link directly to the pricing or features section from ad campaigns or email CTAs.
- Storytelling microsites: Create scroll-driven brand narratives or event pages where horizontal slides serve as timelines and vertical sections pace the story. The Hotel Zola site uses parallax backgrounds and full-screen sections for a property showcase.
- Interactive presentations: Replace slide decks with browser-based presentations that are shareable via URL. Each section acts as a slide, keyboard navigation (arrows, spacebar, Page Up/Down) works natively, and anchor URLs generate direct links to any section — useful for investor decks or onboarding walkthroughs.
If you need more control over dynamic section generation from CMS content, the API integration path covers those cases with full flexibility.
Frequently asked questions
No, fullPage.js does not have an app in the Webflow Apps Marketplace. The integration is implemented entirely through custom code injection or cloneable templates. You add the library manually through page-level custom code fields.
Yes. The GPLv3 open-source license requires your project to be public and GPLv3-compatible. Virtually all commercial Webflow client sites are proprietary and do not qualify. You need a fullPage.js commercial license. Tiers start at $15/year for a single domain. Without a valid license key in your initialization code, the library displays a "Made with fullPage.js" watermark. Note that v3 license keys do not work with v4, and a new purchase is required when upgrading across major versions.
fullPage.js replaces native browser scrolling with CSS
translate3dtransforms. Webflow's scroll-triggered interactions rely on the browser'sscrollTopvalue, which never changes when fullPage.js is active. The library creator confirmed this root cause in the Webflow community forum. SetscrollBar: truein your fullPage.js initialization to restore the native scrollbar, or use fullPage.js callbacks likeafterLoadandonLeaveto trigger animations with CSS class changes. Page Load interactions are not affected by this conflict.Yes, with a structural constraint. fullPage.js requires direct-child
.sectiondivs inside the#fullpagewrapper. Webflow's Collection List element generates additional wrapper elements that break this requirement. The workaround is to use static Div Blocks as your.sectioncontainers and nest Collection List elements inside them for content. If you need each CMS item to be its own section, use the Webflow CMS Collection Items API to fetch items and generate section HTML dynamically.

Description
Add full-screen snap scrolling to Webflow sites using fullPage.js through custom code injection or pre-built cloneable templates.
This integration page is provided for informational and convenience purposes only.

Clean Styles
Connect Clean Styles with Webflow to find, merge, and organize duplicate CSS classes directly inside Webflow, keeping your class structure clean and maintainable.

Impulse
Connect Impulse with Webflow to add popups, gamification widgets, lead capture tools, and compliance banners to your site through a single marketplace app.

Formly & Flowplay
Connect Formly and Flowplay with Webflow to enhance functionality without custom coding.

Better Shadows
Connect Better Shadows with Webflow to create realistic shadow effects by stacking CSS box-shadow declarations with one-click preset application.

Flowstar Open Hours Widget
Connect Flowstar Open Hours Widget integrates with Webflow to display business hours with automatic timezone detection and mobile-responsive formatting.

Flowmonk
Flowmonk syncs Webflow CMS data to Airtable, letting you manage content in Webflow while using Airtable's database features for analysis, collaboration, and automation.

Flowstar Urgency Countdown Timer
Improve conversions by adding an urgency countdown timer in your web pages.

Arvow

Timeline
Timeline provides chronological content infrastructure for Webflow sites without requiring custom development.


