VueJs에서 타자기 애니메이션을 추가하는 방법

이 블로그에서는 VueJs에서 타이핑 애니메이션을 만드는 방법을 설명하겠습니다.

미리보기는 다음과 같습니다.



시작하자...

새 VueJs 프로젝트를 만듭니다.

$ vue create animations-vuejs

Vue CLI v5.0.4
? Please pick a preset: Default ([Vue 3] babel, eslint)


Vue CLI v5.0.4
✨  Creating project in /home/user/tutorials/animations-vuejs.
🗃  Initializing git repository...
⚙️  Installing CLI plugins. This might take a while...


added 839 packages, and audited 840 packages in 35s

84 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
🚀  Invoking generators...
📦  Installing additional dependencies...


added 97 packages, and audited 937 packages in 9s

94 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
⚓  Running completion hooks...

📄  Generating README.md...

🎉  Successfully created project animations-vuejs.
👉  Get started with the following commands:

 $ cd animations-vuejs
 $ npm run serve



주형



템플릿은 아주 간단합니다. 타자기 효과를 만들려면 정적 텍스트 요소와 변경 텍스트 요소가 필요합니다. 이 구성 요소에는 div에 캡슐화된 세 개의 span 태그가 포함되어 있습니다.

<template>
  <div class="container">
    <h1>
      Hi, I'm a
      <span class="typed-text">{{ typeValue }}</span>
      <span class="blinking-cursor">|</span>
      <span class="cursor" :class="{ typing: typeStatus }">&nbsp;</span>
    </h1>
  </div>
</template>


스타일



콘텐츠 및 커서 깜박임을 표시하기 위해 나만의 맞춤 스타일을 사용했습니다. 코드는 다음과 같습니다.

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped>
.container {
  width: 100%;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}
h1 {
  font-size: 6rem;
  font-weight: normal;
  span.typed-text {
    color: #d2b94b;
  }
}

// Cursor blinking CSS Starts...
.blinking-cursor {
  font-size: 6rem;
  color: #2c3e50;
  -webkit-animation: 1s blink step-end infinite;
  -moz-animation: 1s blink step-end infinite;
  -ms-animation: 1s blink step-end infinite;
  -o-animation: 1s blink step-end infinite;
  animation: 1s blink step-end infinite;
}
@keyframes blink {
  from,
  to {
    color: transparent;
  }
  50% {
    color: #2c3e50;
  }
}
@-moz-keyframes blink {
  from,
  to {
    color: transparent;
  }
  50% {
    color: #2c3e50;
  }
}
@-webkit-keyframes blink {
  from,
  to {
    color: transparent;
  }
  50% {
    color: #2c3e50;
  }
}
@-ms-keyframes blink {
  from,
  to {
    color: transparent;
  }
  50% {
    color: #2c3e50;
  }
}
@-o-keyframes blink {
  from,
  to {
    color: transparent;
  }
  50% {
    color: #2c3e50;
  }
}
// Cursor blinking CSS Ends...
</style>


Info Using SCSS inside the VueJs (Default ([Vue 3] babel, eslint)) components you may face 'sass-loader' issues. Please refer to this for fixing the problem.



스크립트


  • 데이터

  • 이 구성 요소는 주로 typeValue, displayTextArray, typingSpeed, erasingSpeed ​​및 newTextDelay의 5개 값을 포함합니다. typeValue 필드는 정적 텍스트입니다. displayTextArray 필드는 변화하는 단어의 배열입니다. typingSpeed ​​필드는 타이핑 속도이고 erasingSpeed ​​필드는 삭제 속도입니다. newTextDelay 필드는 다음 단어 인쇄를 시작하기 위한 지연 시간(초)입니다.

    data: () => {
        return {
          typeValue: "",
          typeStatus: false,
          displayTextArray: ["YouTuber", "Developer", "Blogger", "Designer", "Freelancer"],
          typingSpeed: 100,
          erasingSpeed: 100,
          newTextDelay: 2000,
          displayTextArrayIndex: 0,
          charIndex: 0,
        };
      },
    


    행동 양식


  • typeText() & eraseText()

  • 이 메소드에는 어떤 단어가 입력되고 있는지, 입력할지 삭제할지 또는 'typeStatus' 필드를 기반으로 다음 단어로 변경할지를 결정하는 모든 논리가 포함되어 있습니다. 아래를 살펴보십시오.

    methods: {
        typeText() {
          if (this.charIndex < this.displayTextArray[this.displayTextArrayIndex].length) {
            if (!this.typeStatus) this.typeStatus = true;
            this.typeValue += this.displayTextArray[this.displayTextArrayIndex].charAt(
              this.charIndex
            );
            this.charIndex += 1;
            setTimeout(this.typeText, this.typingSpeed);
          } else {
            this.typeStatus = false;
            setTimeout(this.eraseText, this.newTextDelay);
          }
        },
        eraseText() {
          if (this.charIndex > 0) {
            if (!this.typeStatus) this.typeStatus = true;
            this.typeValue = this.displayTextArray[this.displayTextArrayIndex].substring(
              0,
              this.charIndex - 1
            );
            this.charIndex -= 1;
            setTimeout(this.eraseText, this.erasingSpeed);
          } else {
            this.typeStatus = false;
            this.displayTextArrayIndex += 1;
            if (this.displayTextArrayIndex >= this.displayTextArray.length)
              this.displayTextArrayIndex = 0;
            setTimeout(this.typeText, this.typingSpeed + 1000);
          }
        },
      },
    


    생성된 주기



    구성 요소가 로드되면 typeText() 메서드를 호출하여 입력 순서를 시작합니다.

    created() {
       setTimeout(this.typeText, this.newTextDelay + 200);
    },
    


    최종 코드는 다음과 같습니다.

    <template>
      <div class="container">
        <h1>
          Hi, I'm a
          <span class="typed-text">{{ typeValue }}</span>
          <span class="blinking-cursor">|</span>
          <span class="cursor" :class="{ typing: typeStatus }">&nbsp;</span>
        </h1>
      </div>
    </template>
    
    <script>
    export default {
      name: "typeWiriter",
      data: () => {
        return {
          typeValue: "",
          typeStatus: false,
          displayTextArray: ["YouTuber", "Developer", "Blogger", "Designer", "Freelancer"],
          typingSpeed: 100,
          erasingSpeed: 100,
          newTextDelay: 2000,
          displayTextArrayIndex: 0,
          charIndex: 0,
        };
      },
      props: {},
      created() {
        setTimeout(this.typeText, this.newTextDelay + 200);
      },
      methods: {
        typeText() {
          if (this.charIndex < this.displayTextArray[this.displayTextArrayIndex].length) {
            if (!this.typeStatus) this.typeStatus = true;
            this.typeValue += this.displayTextArray[this.displayTextArrayIndex].charAt(
              this.charIndex
            );
            this.charIndex += 1;
            setTimeout(this.typeText, this.typingSpeed);
          } else {
            this.typeStatus = false;
            setTimeout(this.eraseText, this.newTextDelay);
          }
        },
        eraseText() {
          if (this.charIndex > 0) {
            if (!this.typeStatus) this.typeStatus = true;
            this.typeValue = this.displayTextArray[this.displayTextArrayIndex].substring(
              0,
              this.charIndex - 1
            );
            this.charIndex -= 1;
            setTimeout(this.eraseText, this.erasingSpeed);
          } else {
            this.typeStatus = false;
            this.displayTextArrayIndex += 1;
            if (this.displayTextArrayIndex >= this.displayTextArray.length)
              this.displayTextArrayIndex = 0;
            setTimeout(this.typeText, this.typingSpeed + 1000);
          }
        },
      },
    };
    </script>
    
    <!-- Add "scoped" attribute to limit CSS to this component only -->
    <style lang="scss" scoped>
    .container {
      width: 100%;
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    h1 {
      font-size: 6rem;
      font-weight: normal;
      span.typed-text {
        color: #d2b94b;
      }
    }
    
    // Cursor blinking CSS Starts...
    .blinking-cursor {
      font-size: 6rem;
      color: #2c3e50;
      -webkit-animation: 1s blink step-end infinite;
      -moz-animation: 1s blink step-end infinite;
      -ms-animation: 1s blink step-end infinite;
      -o-animation: 1s blink step-end infinite;
      animation: 1s blink step-end infinite;
    }
    @keyframes blink {
      from,
      to {
        color: transparent;
      }
      50% {
        color: #2c3e50;
      }
    }
    @-moz-keyframes blink {
      from,
      to {
        color: transparent;
      }
      50% {
        color: #2c3e50;
      }
    }
    @-webkit-keyframes blink {
      from,
      to {
        color: transparent;
      }
      50% {
        color: #2c3e50;
      }
    }
    @-ms-keyframes blink {
      from,
      to {
        color: transparent;
      }
      50% {
        color: #2c3e50;
      }
    }
    @-o-keyframes blink {
      from,
      to {
        color: transparent;
      }
      50% {
        color: #2c3e50;
      }
    }
    // Cursor blinking CSS Ends...
    </style>
    


    이 솔루션이 마음에 드십니까? GitHub에 있는 저장소에 별표 표시하는 것을 잊지 마십시오. 별은 저에게 동기를 부여하고 높이 평가합니다.

    코드리뷰 환영합니다. 내가 더 잘할 수 있는 일이 있으면 알려주세요.

    좋은 웹페이지 즐겨찾기