VueJs에서 타자기 애니메이션을 추가하는 방법
34532 단어 vuetutorialjavascriptwebdev
미리보기는 다음과 같습니다.
시작하자...
새 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 }"> </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,
};
},
행동 양식
이 메소드에는 어떤 단어가 입력되고 있는지, 입력할지 삭제할지 또는 '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 }"> </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에 있는 저장소에 별표 표시하는 것을 잊지 마십시오. 별은 저에게 동기를 부여하고 높이 평가합니다.
코드리뷰 환영합니다. 내가 더 잘할 수 있는 일이 있으면 알려주세요.
Reference
이 문제에 관하여(VueJs에서 타자기 애니메이션을 추가하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gayathri_r/how-to-add-a-typewriter-animation-in-vuejs-43kj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)