Pen Settings

HTML

CSS

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URLs added here will be added as <link>s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.

+ add another resource

JavaScript

Babel includes JSX processing.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Packages

Add Packages

Search for and use JavaScript packages from npm here. By selecting a package, an import statement will be added to the top of the JavaScript editor for this package.

Behavior

Auto Save

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

Format on Save

If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.

Editor Settings

Code Indentation

Want to change your Syntax Highlighting theme, Fonts and more?

Visit your global Editor Settings.

HTML

              
                <section class="hero">
	<div class="wrap">
		<h2>Hero</h2>
		<ul class="menu">
			<li><a href="#section-1">Section 1</a></li>
			<li><a href="#section-2">Section 2</a></li>
			<li><a href="#section-3">Section 3</a></li>
			<li><a href="#section-4">Section 4</a></li>
			<li><a href="#section-5">Section 5</a></li>
			<li><a href="#section-6">Section 6</a></li>
		</ul>
	</div>
</section>

<main class="sections">
	<h1 class="sections__title">Services</h1>
	<section class="section-1" id="section-1">
		<div class="wrap">
			<div class="container">
				<h2>Section 1</h2>
			</div>
		</div>
	</section>
	<section class="section-2" id="section-2">
		<div class="wrap">

			<div class="container">
				<h2>Section 2</h2>
				<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto ullam optio veniam numquam totam perferendis
					consectetur libero maiores dignissimos asperiores animi odio nisi, quod quidem distinctio sint culpa fugit
					dolores expedita quisquam excepturi reprehenderit assumenda. Temporibus adipisci, odit facere laborum
					deserunt
					necessitatibus, incidunt dignissimos aperiam obcaecati consequatur aliquam praesentium modi quae voluptate
					et
					voluptates libero eveniet facilis alias veritatis consectetur ducimus accusamus itaque. Quod minus eaque
					sint.
					Quo quia dolorem, corrupti vero dolor suscipit. Assumenda sunt vitae, expedita debitis nemo quam totam
					praesentium ab exercitationem voluptate, nulla ex quia saepe. Quis magni, cum suscipit alias sint velit ea
					inventore. Nam?</p>
				<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto ullam optio veniam numquam totam perferendis
					consectetur libero maiores dignissimos asperiores animi odio nisi, quod quidem distinctio sint culpa fugit
					dolores expedita quisquam excepturi reprehenderit assumenda. Temporibus adipisci, odit facere laborum
					deserunt
					necessitatibus, incidunt dignissimos aperiam obcaecati consequatur aliquam praesentium modi quae voluptate
					et
					voluptates libero eveniet facilis alias veritatis consectetur ducimus accusamus itaque. Quod minus eaque
					sint.
					Quo quia dolorem, corrupti vero dolor suscipit. Assumenda sunt vitae, expedita debitis nemo quam totam
					praesentium ab exercitationem voluptate, nulla ex quia saepe. Quis magni, cum suscipit alias sint velit ea
					inventore. Nam?</p>
			</div>
		</div>
	</section>
	<section class="section-3" id="section-3">
		<div class="wrap">

			<div class="container">
				<h2>Section 3</h2>
				<div class="items">
					<div class="item">
						<div class="item__title">Item 1</div>
						<div class="item__text">
							Lorem ipsum dolor sit, amet consectetur adipisicing elit. Beatae quo incidunt autem hic animi similique
							itaque impedit eveniet at repellendus!
						</div>
					</div>
					<div class="item">
						<div class="item__title">Item 2</div>
						<div class="item__text">
							Lorem ipsum dolor sit, amet consectetur adipisicing elit. Beatae quo incidunt autem hic animi similique
							itaque impedit eveniet at repellendus! Lorem ipsum dolor sit, amet consectetur adipisicing elit. Beatae
							quo incidunt autem hic animi similique itaque impedit eveniet at repellendus!
						</div>
					</div>
					<div class="item">
						<div class="item__title">Item 3</div>
						<div class="item__text">
							Lorem ipsum dolor sit, amet consectetur adipisicing elit. Beatae quo incidunt autem hic animi similique
							itaque impedit eveniet at repellendus!
						</div>
					</div>
					<div class="item">
						<div class="item__title">Item 4</div>
						<div class="item__text">
							Lorem ipsum dolor sit, amet consectetur adipisicing elit. Beatae quo incidunt autem hic animi similique
							itaque impedit eveniet at repellendus! Lorem ipsum dolor sit amet consectetur adipisicing elit.
							Laudantium, autem! Quaerat, neque voluptatibus. Similique odit rem, velit adipisci quisquam repudiandae
							perferendis? Ratione natus sed voluptate explicabo quibusdam architecto, dignissimos at.
							<!-- Laudantium, autem! Quaerat, neque voluptatibus. Similique odit rem, velit adipisci quisquam repudiandae
								perferendis? Ratione natus sed voluptate explicabo quibusdam architecto, dignissimos at.
								Laudantium, autem! Quaerat, neque voluptatibus. Similique odit rem, velit adipisci quisquam repudiandae
								perferendis? Ratione natus sed voluptate explicabo quibusdam architecto, dignissimos at.
								Laudantium, autem! Quaerat, neque voluptatibus. Similique odit rem, velit adipisci quisquam repudiandae
								perferendis? Ratione natus sed voluptate explicabo quibusdam architecto, dignissimos at.
								Laudantium, autem! Quaerat, neque voluptatibus. Similique odit rem, velit adipisci quisquam repudiandae
								perferendis? Ratione natus sed voluptate explicabo quibusdam architecto, dignissimos at.
								Laudantium, autem! Quaerat, neque voluptatibus. Similique odit rem, velit adipisci quisquam repudiandae
								perferendis? Ratione natus sed voluptate explicabo quibusdam architecto, dignissimos at.
								Laudantium, autem! Quaerat, neque voluptatibus. Similique odit rem, velit adipisci quisquam repudiandae
								perferendis? Ratione natus sed voluptate explicabo quibusdam architecto, dignissimos at. -->
						</div>
					</div>
					<div class="item">
						<div class="item__title">Item 5</div>
						<div class="item__text">
							Lorem ipsum dolor sit, amet consectetur adipisicing elit. Beatae quo incidunt autem hic animi similique
							itaque impedit eveniet at repellendus!
						</div>
					</div>
				</div>
			</div>
		</div>
	</section>
	<section class="section-4" id="section-4">
		<div class="wrap">

			<div class="container">
				<h2>Section 4</h2>
			</div>
		</div>
	</section>
	<section class="section-5" id="section-5">
		<div class="wrap">

			<div class="container">
				<h2>Section 5</h2>
				<div class="box">
					<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Cupiditate cumque minus dolorem eligendi itaque
						magnam excepturi modi, nemo tempore. Quidem sunt enim dolorum ea nihil. Id accusamus nulla velit
						voluptatum
						dolorum quae ad praesentium harum maxime doloremque excepturi debitis magni sed asperiores beatae,
						corporis
						quod veritatis est minima vitae nisi enim iure illo. Optio accusantium ipsum aperiam nam quam ut obcaecati
						similique, harum, neque ea id at voluptatibus quia repellat dicta rem architecto maiores deleniti
						repellendus, fugit voluptas accusamus? Ea aut doloremque animi nesciunt, quam omnis ex quis, dignissimos
						error quasi iste, porro asperiores quibusdam ut perferendis exercitationem tenetur vel?</p>
					<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Cupiditate cumque minus dolorem eligendi itaque
						magnam excepturi modi, nemo tempore. Quidem sunt enim dolorum ea nihil. Id accusamus nulla velit
						voluptatum
						dolorum quae ad praesentium harum maxime doloremque excepturi debitis magni sed asperiores beatae,
						corporis
						quod veritatis est minima vitae nisi enim iure illo. Optio accusantium ipsum aperiam nam quam ut obcaecati
						similique, harum, neque ea id at voluptatibus quia repellat dicta rem architecto maiores deleniti
						repellendus, fugit voluptas accusamus? Ea aut doloremque animi nesciunt, quam omnis ex quis, dignissimos
						error quasi iste, porro asperiores quibusdam ut perferendis exercitationem tenetur vel?</p>
					<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Cupiditate cumque minus dolorem eligendi itaque
						magnam excepturi modi, nemo tempore. Quidem sunt enim dolorum ea nihil. Id accusamus nulla velit
						voluptatum
						dolorum quae ad praesentium harum maxime doloremque excepturi debitis magni sed asperiores beatae,
						corporis
						quod veritatis est minima vitae nisi enim iure illo. Optio accusantium ipsum aperiam nam quam ut obcaecati
						similique, harum, neque ea id at voluptatibus quia repellat dicta rem architecto maiores deleniti
						repellendus, fugit voluptas accusamus? Ea aut doloremque animi nesciunt, quam omnis ex quis, dignissimos
						error quasi iste, porro asperiores quibusdam ut perferendis exercitationem tenetur vel?</p>
					<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Cupiditate cumque minus dolorem eligendi itaque
						magnam excepturi modi, nemo tempore. Quidem sunt enim dolorum ea nihil. Id accusamus nulla velit
						voluptatum
						dolorum quae ad praesentium harum maxime doloremque excepturi debitis magni sed asperiores beatae,
						corporis
						quod veritatis est minima vitae nisi enim iure illo. Optio accusantium ipsum aperiam nam quam ut obcaecati
						similique, harum, neque ea id at voluptatibus quia repellat dicta rem architecto maiores deleniti
						repellendus, fugit voluptas accusamus? Ea aut doloremque animi nesciunt, quam omnis ex quis, dignissimos
						error quasi iste, porro asperiores quibusdam ut perferendis exercitationem tenetur vel?</p>
					<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Cupiditate cumque minus dolorem eligendi itaque
						magnam excepturi modi, nemo tempore. Quidem sunt enim dolorum ea nihil. Id accusamus nulla velit
						voluptatum
						dolorum quae ad praesentium harum maxime doloremque excepturi debitis magni sed asperiores beatae,
						corporis
						quod veritatis est minima vitae nisi enim iure illo. Optio accusantium ipsum aperiam nam quam ut obcaecati
						similique, harum, neque ea id at voluptatibus quia repellat dicta rem architecto maiores deleniti
						repellendus, fugit voluptas accusamus? Ea aut doloremque animi nesciunt, quam omnis ex quis, dignissimos
						error quasi iste, porro asperiores quibusdam ut perferendis exercitationem tenetur vel?</p>
				</div>
			</div>
		</div>
	</section>
	<section class="section-6" id="section-6">
		<div class="wrap">

			<div class="container">
				<h2>Section 6</h2>
				<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto ullam optio veniam numquam totam perferendis
					consectetur libero maiores dignissimos asperiores animi odio nisi, quod quidem distinctio sint culpa fugit
					dolores expedita quisquam excepturi reprehenderit assumenda. Temporibus adipisci, odit facere laborum
					deserunt
					necessitatibus, incidunt dignissimos aperiam obcaecati consequatur aliquam praesentium modi quae voluptate
					et
					voluptates libero eveniet facilis alias veritatis consectetur ducimus accusamus itaque. Quod minus eaque
					sint.
					Quo quia dolorem, corrupti vero dolor suscipit. Assumenda sunt vitae, expedita debitis nemo quam totam
					praesentium ab exercitationem voluptate, nulla ex quia saepe. Quis magni, cum suscipit alias sint velit ea
					inventore. Nam?</p>
				<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto ullam optio veniam numquam totam perferendis
					consectetur libero maiores dignissimos asperiores animi odio nisi, quod quidem distinctio sint culpa fugit
					dolores expedita quisquam excepturi reprehenderit assumenda. Temporibus adipisci, odit facere laborum
					deserunt
					necessitatibus, incidunt dignissimos aperiam obcaecati consequatur aliquam praesentium modi quae voluptate
					et
					voluptates libero eveniet facilis alias veritatis consectetur ducimus accusamus itaque. Quod minus eaque
					sint.
					Quo quia dolorem, corrupti vero dolor suscipit. Assumenda sunt vitae, expedita debitis nemo quam totam
					praesentium ab exercitationem voluptate, nulla ex quia saepe. Quis magni, cum suscipit alias sint velit ea
					inventore. Nam?</p>
				<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto ullam optio veniam numquam totam perferendis
					consectetur libero maiores dignissimos asperiores animi odio nisi, quod quidem distinctio sint culpa fugit
					dolores expedita quisquam excepturi reprehenderit assumenda. Temporibus adipisci, odit facere laborum
					deserunt
					necessitatibus, incidunt dignissimos aperiam obcaecati consequatur aliquam praesentium modi quae voluptate
					et
					voluptates libero eveniet facilis alias veritatis consectetur ducimus accusamus itaque. Quod minus eaque
					sint.
					Quo quia dolorem, corrupti vero dolor suscipit. Assumenda sunt vitae, expedita debitis nemo quam totam
					praesentium ab exercitationem voluptate, nulla ex quia saepe. Quis magni, cum suscipit alias sint velit ea
					inventore. Nam?</p>
			</div>
		</div>
	</section>
</main>

<footer>
	<h1>Footer</h1>
</footer>
              
            
!

CSS

              
                * {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

body {
	font-family: "Arial", sans-serif;
	background-color: #f5f5f5;
	overflow-x: hidden;
}

h2 {
	font-size: 50px;
	font-weight: normal;
	margin-bottom: 20px;
}

p {
	margin-bottom: 2.5rem;
}

section {
	overflow: hidden;
	border-bottom: 1px dashed red;
}

section .wrap {
	padding: 50px 20px;
}

section.hero {
	min-height: 70vh;
	background: #eee;
}

section.hero .menu {
	list-style: none;
	margin-top: 20px;
	display: flex;
	gap: 15px;
}

.sections {
	position: relative;
	overflow: hidden;
}

.sections__title {
	font-weight: normal;
	font-size: 16px;
	background: rgba(238, 238, 238, 0.05);
	color: #fff;
	padding: 8px 20px;
	border-radius: 5px;
	mix-blend-mode: exclusion;
	position: absolute;
	top: 50px;
	left: 20px;
	z-index: 15;
}

.pin-spacer:has(.sections__title) {
	mix-blend-mode: exclusion;
}

.sections section {
	position: sticky;
	top: 0;
	z-index: 1;
	overflow: hidden;
}

.sections section .container {
	padding-top: 50px;
}

section.section-1 {
	min-height: 100dvh;
	background: #212121;
	color: #fff;
}

section.section-2 {
	background: #eee;
}

section.section-3 {
	background: #eee;
	min-height: 100dvh;
	height: auto;
}

section.section-3 .wrap {
	position: relative;
	overflow: hidden;
	padding-bottom: 0;
	min-height: 100%;
	height: auto;
}

section.section-3 .wrap > div {
	padding-bottom: 50px;
	border-bottom: 1px dashed red;
}

section.section-3 .items {
	display: flex;
	flex-wrap: nowrap;
	width: fit-content;
	min-width: 100%;
}

section.section-3 .items .item {
	border-left: 1px solid #000;
	width: 35vw;
	padding-left: 20px;
	padding-right: 40px;
}

section.section-3 .items .item__title {
	font-size: 20px;
	margin-bottom: 10px;
}

section.section-4 {
	min-height: 100dvh;
	background: #21212152;
	color: #fff;
}

section.section-5 {
	min-height: 100dvh;
	background: #eee;
}

section.section-5 .wrap {
	position: relative;
	height: auto;
	will-change: transform;
}

section.section-5 .box {
	background: #bbb;
	width: 50vw;
	padding: 20px;
}

section.section-6 {
	background: #212121;
	color: #fff;
}

footer {
	height: 100dvh;
	padding: 50px 20px;
	background: #1e1e1e;
	color: #fff;
	position: relative;
	z-index: 20;
}

              
            
!

JS

              
                $(document).ready(function () {
	gsap.registerPlugin(ScrollTrigger);

	// Existing title animation
	gsap.to(".sections__title", {
		scrollTrigger: {
			trigger: ".sections",
			start: "top top",
			end: "bottom top",
			pin: ".sections__title",
			pinSpacing: true,
			scrub: true
			// markers: true,
		}
	});

	// Animation for all sections
	$(".sections section").each(function (index) {
		const section = $(this);
		const sectionHeight = section.outerHeight();
		const viewportHeight = window.innerHeight;
		const isTallerThanViewport = sectionHeight > viewportHeight;
		const isSection3 = section.hasClass("section-3");

		if (isSection3) {
			const items = section.find('.items');
			const wrap = section.find('.wrap');
			const viewportHeight = window.innerHeight;
			const windowWidth = document.body.clientWidth;

			// Calculate scroll distances
			const itemsWidth = items[0].scrollWidth;
			const horizontalScroll = itemsWidth - windowWidth;

			// Horizontal scroll animation
			gsap.to(items, {
				scrollTrigger: {
					trigger: section,
					start: "top top",
					end: () => `+=${horizontalScroll}`,
					pin: true,
					pinSpacing: false,
					scrub: 1,
					onUpdate: (self) => {
						gsap.to(items, {
							x: -horizontalScroll * self.progress,
							duration: 0,
							ease: "none"
						});
					},
					fastScrollEnd: true,
					preventOverlaps: true,
					markers: {
						startColor: "blue",
						endColor: "blue",
						fontSize: "12px",
						indent: 10
					},
					id: "horizontal"
				}
			});

			// Second animation - vertical scroll after horizontal
			gsap.to(wrap, {
				scrollTrigger: {
					trigger: section,
					start: () => `+=${horizontalScroll + 1}`,
					end: () => isTallerThanViewport ? `+=${sectionHeight}` : `+=${viewportHeight}`,
					pin: true,
					pinSpacing: true,
					scrub: true,
					markers: true,
					onUpdate: (self) => {
						if (isTallerThanViewport) {
							gsap.to(wrap, {
								y: -(sectionHeight) * self.progress,
								duration: 0,
								ease: "none"
							});
						}
					}, 
					markers: {
						startColor: "green",
						endColor: "red"
					},
					id: "sticky"
				}
			});
		} else {
			// Keep existing code for other sections
			gsap.to(this, {
				scrollTrigger: {
					trigger: this,
					start: "top top",
					end: () =>
						isTallerThanViewport ? `+=${sectionHeight}` : `+=${viewportHeight}`,
					pin: true,
					pinSpacing: false,
					scrub: true,
					onUpdate: (self) => {
						if (isTallerThanViewport) {
							gsap.to(section.find(".wrap"), {
								y: -sectionHeight * self.progress,
								duration: 0,
								ease: "none"
							});
						}
					}
				}
			});
		}
	});
});

              
            
!
999px

Console