Some more scrolling text animations w/ Splitting + ScrollOut.
Some inspired by this tweet
See my originals here
Enjoy!
A Pen by Menglin Chen on CodePen.
.page | |
.text__container Scroll for cascading text effects! | |
.text__container | |
.slots(data-splitting=''). | |
slots | |
.text__container | |
.roulette(data-splitting=''). | |
roulette | |
.text__container | |
.cascade(data-splitting=''). | |
cascade cascade cascade cascade cascade | |
.text__container | |
.hinged(data-splitting=''). | |
hinged | |
.text__container | |
.carousel(data-splitting=''). | |
carousel | |
.text__container | |
.mexiwave(data-splitting=''). | |
mexiwave |
const { Splitting, ScrollOut } = window | |
Splitting() | |
ScrollOut({ | |
scrollingElement: '.page', | |
targets: ['.word', '.cascade'], | |
}) |
<script src="https://unpkg.com/splitting/dist/splitting.js"></script> | |
<script src="https://unpkg.com/scroll-out/dist/scroll-out.min.js"></script> |
@import url('https://fonts.googleapis.com/css?family=Lato:700') | |
:root | |
--font-size 3rem | |
@media(min-width 768px) | |
:root | |
--font-size 5rem | |
* | |
box-sizing border-box | |
body | |
font-family 'Lato', sans-serif | |
margin 0 | |
padding 0 | |
.page | |
height 100vh | |
overflow auto | |
.char | |
text-transform uppercase | |
.text__container | |
align-items center | |
color #fff | |
display flex | |
font-size var(--font-size) | |
height 100vh | |
justify-content center | |
overflow hidden | |
font-weight 300 | |
text-align center | |
width 100vw | |
&:nth-child(n) | |
background #4d05e8 | |
&:nth-child(2n) | |
background #00b5cc | |
&:nth-child(3n) | |
background #446cb3 | |
.cascade | |
display grid | |
grid-auto-rows auto | |
.word | |
--chars 7 | |
--center 3 | |
display grid | |
grid-template-columns repeat(var(--chars), auto) | |
&[data-scroll="in"] .char | |
animation-delay calc(.25s + (var(--word-index) * .1s)) | |
animation-name bloat | |
animation-timing-function ease-out | |
animation-duration .5s | |
.char | |
--offset calc((var(--char-index) - (var(--chars) * var(--word-index))) - var(--center)) | |
transform translate(0, 0) | |
@keyframes bloat | |
0%, 100% | |
transform translate(0, 0) | |
50% | |
transform translate(calc(var(--offset) * 150%), 0) | |
.slots | |
height calc(var(--font-size) * 3) | |
overflow hidden | |
.char | |
text-shadow 0 calc(var(--font-size) * -1) 0 #fff, | |
0 calc(var(--font-size) * -2) 0 #fff, | |
0 calc(var(--font-size) * -3) 0 #fff, | |
0 calc(var(--font-size) * 1) 0 #fff, | |
0 calc(var(--font-size) * 2) 0 #fff, | |
0 calc(var(--font-size) * 3) 0 #fff | |
.char | |
&:nth-of-type(even) | |
animation scrollDown .5s .25s infinite linear | |
&:nth-of-type(odd) | |
animation scrollUp .5s .25s infinite linear | |
@keyframes scrollUp | |
to | |
transform translate(0, calc(var(--font-size) * -1)) | |
@keyframes scrollDown | |
to | |
transform translate(0, calc(var(--font-size) * 1)) | |
.carousel | |
height var(--font-size) | |
width var(--font-size) | |
.word | |
position relative | |
transform-style preserve-3d | |
transform rotateX(-15deg) rotateY(0) | |
height 100% | |
width 100% | |
.char | |
top 50% | |
left 50% | |
position absolute | |
transform translate(-50%, -50%) rotateY(calc(((360 / var(--char-total)) * var(--char-index)) * 1deg)) translate(var(--font-size), 0) | |
.word[data-scroll="in"] | |
animation spin 2s .25s infinite linear | |
@keyframes spin | |
to | |
transform rotateX(-15deg) rotateY(-360deg) | |
.roulette | |
position relative | |
.word[data-scroll='in'] | |
animation rotate 2.5s .25s infinite linear | |
.word | |
display block | |
height 100% | |
width 100% | |
height var(--font-size) | |
width var(--font-size) | |
.char | |
position absolute | |
top 50% | |
left 50% | |
transform translate(-50%, -50%) rotate(calc((var(--char-index) * (360 / var(--char-total)) * 1deg))) translate(0, -150%) | |
@keyframes rotate | |
to | |
transform rotate(-360deg) | |
.hinged | |
[data-scroll='in'] .char | |
transform rotate(0deg) | |
.char | |
transform-origin left bottom | |
transform rotate(-180deg) | |
transition transform .25s calc(var(--char-index) * .1s) | |
.mexiwave | |
[data-scroll='in'] .char | |
animation wave .25s calc(var(--char-index) * .1s) ease | |
@keyframes wave | |
50% | |
transform translate(0, -50%) | |
<link href="https://unpkg.com/splitting/dist/splitting.css" rel="stylesheet" /> |