Scroll-linked animations
An example of linking an animation to scroll using Motion for Vue's useScroll hook.
Source code
<script setup lang="ts">
import { motion, useScroll } from "motion-v"
const { scrollYProgress } = useScroll()
/**
* ============== Styles ================
*/
const scrollIndicator = {
scaleX: scrollYProgress,
position: "fixed",
top: 0,
left: 0,
right: 0,
height: "10px",
originX: 0,
backgroundColor: "#ff0088",
}
</script>
<template>
<div>
<motion.div id="scroll-indicator" :style="scrollIndicator" />
<article class="article">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam
ac rhoncus quam.
</p>
<p>
Fringilla quam urna. Cras turpis elit, euismod eget ligula quis,
imperdiet sagittis justo. In viverra fermentum ex ac vestibulum.
Aliquam eleifend nunc a luctus porta. Mauris laoreet augue ut
felis blandit, at iaculis odio ultrices. Nulla facilisi.
Vestibulum cursus ipsum tellus, eu tincidunt neque tincidunt a.
</p>
<h2>Sub-header</h2>
<p>
In eget sodales arcu, consectetur efficitur metus. Duis
efficitur tincidunt odio, sit amet laoreet massa fringilla eu.
</p>
<p>
Pellentesque id lacus pulvinar elit pulvinar pretium ac non
urna. Mauris id mauris vel arcu commodo venenatis. Aliquam eu
risus arcu. Proin sit amet lacus mollis, semper massa ut, rutrum
mi.
</p>
<p>
Sed sem nisi, luctus consequat ligula in, congue sodales nisl.
</p>
<p>
Vestibulum bibendum at erat sit amet pulvinar. Pellentesque
pharetra leo vitae tristique rutrum. Donec ut volutpat ante, ut
suscipit leo.
</p>
<h2>Sub-header</h2>
<p>
Maecenas quis elementum nulla, in lacinia nisl. Ut rutrum
fringilla aliquet. Pellentesque auctor vehicula malesuada.
Aliquam id feugiat sem, sit amet tempor nulla. Quisque fermentum
felis faucibus, vehicula metus ac, interdum nibh. Curabitur
vitae convallis ligula. Integer ac enim vel felis pharetra
laoreet. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Pellentesque hendrerit ac augue quis pretium.
</p>
<p>
Morbi ut scelerisque nibh. Integer auctor, massa non dictum
tristique, elit metus efficitur elit, ac pretium sapien nisl nec
ante. In et ex ultricies, mollis mi in, euismod dolor.
</p>
<p>Quisque convallis ligula non magna efficitur tincidunt.</p>
<p>
Pellentesque id lacus pulvinar elit pulvinar pretium ac non
urna. Mauris id mauris vel arcu commodo venenatis. Aliquam eu
risus arcu. Proin sit amet lacus mollis, semper massa ut, rutrum
mi.
</p>
<p>
Sed sem nisi, luctus consequat ligula in, congue sodales nisl.
</p>
<p>
Vestibulum bibendum at erat sit amet pulvinar. Pellentesque
pharetra leo vitae tristique rutrum. Donec ut volutpat ante, ut
suscipit leo.
</p>
<h2>Sub-header</h2>
<p>
Maecenas quis elementum nulla, in lacinia nisl. Ut rutrum
fringilla aliquet. Pellentesque auctor vehicula malesuada.
Aliquam id feugiat sem, sit amet tempor nulla. Quisque fermentum
felis faucibus, vehicula metus ac, interdum nibh. Curabitur
vitae convallis ligula. Integer ac enim vel felis pharetra
laoreet. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Pellentesque hendrerit ac augue quis pretium.
</p>
<p>
Morbi ut scelerisque nibh. Integer auctor, massa non dictum
tristique, elit metus efficitur elit, ac pretium sapien nisl nec
ante. In et ex ultricies, mollis mi in, euismod dolor.
</p>
<p>Quisque convallis ligula non magna efficitur tincidunt.</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam
ac rhoncus quam.
</p>
<p>
Fringilla quam urna. Cras turpis elit, euismod eget ligula quis,
imperdiet sagittis justo. In viverra fermentum ex ac vestibulum.
Aliquam eleifend nunc a luctus porta. Mauris laoreet augue ut
felis blandit, at iaculis odio ultrices. Nulla facilisi.
Vestibulum cursus ipsum tellus, eu tincidunt neque tincidunt a.
</p>
<h2>Sub-header</h2>
<p>
In eget sodales arcu, consectetur efficitur metus. Duis
efficitur tincidunt odio, sit amet laoreet massa fringilla eu.
</p>
<p>
Pellentesque id lacus pulvinar elit pulvinar pretium ac non
urna. Mauris id mauris vel arcu commodo venenatis. Aliquam eu
risus arcu. Proin sit amet lacus mollis, semper massa ut, rutrum
mi.
</p>
<p>
Sed sem nisi, luctus consequat ligula in, congue sodales nisl.
</p>
<p>
Vestibulum bibendum at erat sit amet pulvinar. Pellentesque
pharetra leo vitae tristique rutrum. Donec ut volutpat ante, ut
suscipit leo.
</p>
<h2>Sub-header</h2>
<p>
Maecenas quis elementum nulla, in lacinia nisl. Ut rutrum
fringilla aliquet. Pellentesque auctor vehicula malesuada.
Aliquam id feugiat sem, sit amet tempor nulla. Quisque fermentum
felis faucibus, vehicula metus ac, interdum nibh. Curabitur
vitae convallis ligula. Integer ac enim vel felis pharetra
laoreet. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Pellentesque hendrerit ac augue quis pretium.
</p>
<p>
Morbi ut scelerisque nibh. Integer auctor, massa non dictum
tristique, elit metus efficitur elit, ac pretium sapien nisl nec
ante. In et ex ultricies, mollis mi in, euismod dolor.
</p>
<p>Quisque convallis ligula non magna efficitur tincidunt.</p>
<p>
Pellentesque id lacus pulvinar elit pulvinar pretium ac non
urna. Mauris id mauris vel arcu commodo venenatis. Aliquam eu
risus arcu. Proin sit amet lacus mollis, semper massa ut, rutrum
mi.
</p>
<p>
Sed sem nisi, luctus consequat ligula in, congue sodales nisl.
</p>
<p>
Vestibulum bibendum at erat sit amet pulvinar. Pellentesque
pharetra leo vitae tristique rutrum. Donec ut volutpat ante, ut
suscipit leo.
</p>
<h2>Sub-header</h2>
<p>
Maecenas quis elementum nulla, in lacinia nisl. Ut rutrum
fringilla aliquet. Pellentesque auctor vehicula malesuada.
Aliquam id feugiat sem, sit amet tempor nulla. Quisque fermentum
felis faucibus, vehicula metus ac, interdum nibh. Curabitur
vitae convallis ligula. Integer ac enim vel felis pharetra
laoreet. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Pellentesque hendrerit ac augue quis pretium.
</p>
<p>
Morbi ut scelerisque nibh. Integer auctor, massa non dictum
tristique, elit metus efficitur elit, ac pretium sapien nisl nec
ante. In et ex ultricies, mollis mi in, euismod dolor.
</p>
<p>Quisque convallis ligula non magna efficitur tincidunt.</p>
</article>
</div>
</template>
<style>
.article {
max-width: 500px;
padding: 150px 20px;
display: flex;
flex-direction: column;
gap: 20px;
}
</style>Related examples
Latest in Vue
Motion+
Unlock all 400+ examples
- Source code for every Plus example.
- Provide examples direct to your agent via Motion's MCP.
- Lifetime access to new examples and APIs.








