JavaScript

[JavaScript] 텍스트 물결 효과 만들기

코드비버 2025. 5. 7. 10:25

포트폴리오 제작 중 CSS 애니메이션을 활용해 문장이 물결치는 듯한 효과를 내고 싶었다.

예전에 물결 효과를 구현할 땐 HTML에서 모든 글자를 하나하나 span 태그로 감싸서 각각 애니메이션과 딜레이를 적용했는데, 이러면 두 가지 문제가 있었다.

  • HTML 코드가 너무 길어져 비효율적임
  • 텍스트가 바뀌면 수정이 번거로움

따라서 HTML에 span 태그를 사용하지 않고 JS로 구현할 방법을 찾아보았는데, 애니메이션을 적용할 요소의 내용을 span 태그로 감싼 상태로 바꿔주면 된다.

 

<!--HTML-->

<h1>Hello Words!</h1>
/* CSS */

h1 span{animation:wave_animation 1s ease-in-out infinite;}

@keyframes wave_animation{
    0%, 50%{transform: translateY(0);}
    25%{transform: translateY(-8px);}
}

 

JS를 활용해 h1 태그 안의 'Hello Words!'의 모든 문자를 span 태그로 감싼 상태로 바꿀 예정이기 때문에 h1 태그가 아닌 span 태그에 애니메이션 효과를 적용하는 것이 맞다.

/* JavaScript */

// 애니메이션 효과를 적용할 텍스트를 배열에 저장
const title=document.querySelector('h1');
const textArr=[];
textArr.push(title.textContent);

// h1 태그를 span 태그로 채우기 위해 비움
title.textContent="";

// 텍스트 길이만큼 span 태그 생성 및 텍스트 저장
[...textArr].forEach((value,i)=>{
    const span=document.createElement('span');
    span.textContent=value;
    span.style.animationDelay=`${0.1 * i}s`;
    title.appendChild(span);
});

 

위 코드는 애니메이션 효과를 추가할 문자열을 선택한 다음 한 글자씩 분리하고 span 태그로 감싸서 다시 저장하는 코드이다.

만약 하나의 문장에만 애니메이션 효과를 주려면 여기서 끝내도 상관 없지만 여러개의 제목에 같은 효과를 주려면 아래 코드처럼 모든 제목들을 선택한 후 순회하도록 약간의 수정을 거치면 된다.

/* JavaScript */

// 애니메이션 효과를 적용할 모든 텍스트를 배열에 저장
const titles=document.querySelectorAll('h1');
const textArr=[];

// 선택된 모든 타이틀을 순회하며 내용을 span 태그로 채움
titles.forEach((title, idx)=>{
    textArr.push(title.textContent);
    
    // h1 태그를 span 태그로 채우기 위해 비움
    title.textContent="";
    
    // 텍스트 길이만큼 span 태그 생성 및 텍스트 저장
    [...textArr[idx]].forEach((value, i)=>{
        const span=document.createElement('span');
        span.textContent=value;
        span.style.animationDelay=`${0.1 * i}s`;
        title.appendChild(span);
    });
});