<p class="cool">
  <span data-text="Hello,">Hello,</span>
  <span data-text="I'm">I'm</span>
  <span data-text="the">the</span>
  <span data-text="text.">text.</span>
  <span data-text="How">How</span>
  <span data-text="are">are</span>
  <span data-text="you,">you,</span>
  <span data-text="pal?">pal?</span>
</p>  
:root {
  --background: #f3a683;
  --base: #303952;
  --accent: #786fa6;
  --shadow: #e77f67;
}

html {
  background: var(--background);
  display: grid;
  height: 100%;
  place-items: center;
}

.cool {
  font: bold 3rem/1.2 sans-serif;
  max-width: 20rem;

  span {
    color: var(--shadow);
    display: inline-block;
    position: relative;

    // Setting the stagger "by hand". You have to know the number of children beforehand and loop through them all, or set staggers only for a number of first children. Or set it with js
    @for $i from 1 through 10 {
      &:nth-child(#{$i}) {
        &::before,
        &::after {
          animation-delay: #{$i / 10}s;
        }
      }
    }

    // make the font black again if no animation is playing
    @media (prefers-reduced-motion) {
      color: var(--base);
    }

    // the magic, kinda
    &::before {
      animation: max-height .4s cubic-bezier(0.61, 1, 0.88, 1) 1 normal both;
      color: var(--accent);
    }
    
    &::after {
      animation: max-width .7s cubic-bezier(0.61, 1, 0.88, 1) 1 normal both;
      color: var(--base);
    }
    
    &::before,
    &::after {
      // Using data attribute to avoid duplicated content in HTML. It has a very good support when used in the content property https://caniuse.com/mdn-css_types_attr
      content: attr(data-text);
      left: 0;
      // The overflowing text is cut off
      overflow: hidden;
      position: absolute;
      // Set the speak property to none, because we don't want screen readers to read every word in the paragraph twice. "Hello, hello"? No!
      speak: none;

      // In this case we just don't animate things, BUT we can maybe animate opacity only since reduced motion != no motion
      @media (prefers-reduced-motion) {
        animation: none;
        content: "";
      }
    }
  }
}

@keyframes max-width {
  from {
    max-width: 0;
  }
  to {
    max-width: 100%;
  }
}

@keyframes max-height {
  from {
    max-height: 0;
  }
  to {
    max-height: 100%;
  }
}
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.