Jump to content

TheContentCreator

Circle Member
  • Posts

    1
  • Joined

  • Last visited

Posts posted by TheContentCreator

  1. Site URL: https://www.thecontentcreator.co.uk/

    Hi!

    I've added a piece of custom HTML code to the homepage of my site to run an animated typewriter effect on my H1 title.

    It works perfectly, but I'm having a slight issue with it on mobile devices. Because of the sizing of the screen and the H1 title words, the animation runs onto a second line every now and then, meaning the whole page content shifts down and back up again during the animation - which makes it a bit tricky to read the page on mobile!

    Is there a piece of code I could add to the HTML to either stop it running at all on mobile or reduce the size of the H1 on mobile so that it can animate on a single line?

    The code currently is:

    <div class="container">
      <h1>
        <span class="txt-type" data-wait="3000" data-words='["creative", "ingenious", "magical", "SEO-ed"]'></span>
        copywriting
      </h1>
    </div>
    <style>
    /* CSS RESET */

    /* ALIGN CONTENT */
    .container {
      display: flex;
      /* Remove horizontal 'justify-content' center if you want the base text not to move */
      justify-content: center;
      align-items: center;
    }

    /* ADD CURSOR */
    .txt-type > .txt {
      border-right: 0.08rem solid #fff;
      padding-right: 2px;
      /* Animating the cursor */
      animation: blink 0.6s infinite;
    }

    /* ANIMATION */
    @keyframes blink {
      0% {
        border-right: 0.08rem solid rgba(255, 255, 255, 1);
      }
      100% {
        border-right: 0.08rem solid rgba(255, 255, 255, 0.2);
      }
    }
      #page .section-background {background: white;}
      #page section * {color: black !important;}
      #page .content {
        width: 100%;
    }
    </style>
    <script>
    class TypeWriter {
      constructor(txtElement, words, wait = 2000) {
        this.txtElement = txtElement;
        this.words = words;
        this.txt = "";
        this.wordIndex = 0;
        this.wait = parseInt(wait, 5);
        this.type();
        this.isDeleting = false;
      }

      type() {
        // Current index of word
        const current = this.wordIndex % this.words.length;
        // Get full text of current word
        const fullTxt = this.words[current];

        // Check if deleting
        if (this.isDeleting) {
          // Remove characters
          this.txt = fullTxt.substring(0, this.txt.length - 1);
        } else {
          // Add charaters
          this.txt = fullTxt.substring(0, this.txt.length + 1);
        }

        // Insert txt into element
        this.txtElement.innerHTML = `<span class="txt">${this.txt}</span>`;

        // Initial Type Speed
        let typeSpeed = 60;

        if (this.isDeleting) {
          // Increase speed by half when deleting
          typeSpeed /= 2;
        }

        // If word is complete
        if (!this.isDeleting && this.txt === fullTxt) {
          // Make pause at end
          typeSpeed = this.wait;
          // Set delete to true
          this.isDeleting = true;
        } else if (this.isDeleting && this.txt === "") {
          this.isDeleting = false;
          // Move to next word
          this.wordIndex++;
          // Pause before start typing
          typeSpeed = 500;
        }

        setTimeout(() => this.type(), typeSpeed);
      }
    }

    // Init On DOM Load
    document.addEventListener("DOMContentLoaded", init);

    // Init App
    function init() {
      const txtElement = document.querySelector(".txt-type");
      const words = JSON.parse(txtElement.getAttribute("data-words"));
      const wait = txtElement.getAttribute("data-wait");
      // Init TypeWriter
      new TypeWriter(txtElement, words, wait);
    }

    </script>

×
×
  • Create New...

Squarespace Webinars

Free online sessions where you’ll learn the basics and refine your Squarespace skills.

Hire a Designer

Stand out online with the help of an experienced designer or developer.