본문으로 건너뛰기

AnimateTyping

글자가 하나씩 나타나는 효과입니다. 문자열 전체는 첫 프레임부터 스크린 리더를 위해 문서 안에 있고, 움직이는 것은 스크린 리더에게 숨겨진 사본입니다.

tsx
import { AnimateTyping } from 'neba';

<AnimateTyping speed={18}>디자인 시스템이 아니라 화면을 배포하세요.</AnimateTyping>;

Props

Prop타입기본값설명
textstring타이핑할 문자열. children보다 우선합니다
speednumber24초당 글자 수
holdnumber1400다 쓴 뒤 반복 전까지 머무는 시간(ms)
erasebooleanfalse반복 전에 한 번에 지우지 않고 한 글자씩 지웁니다
eraseSpeednumber지우는 속도(초당 글자 수). 기본값은 speed의 두 배
caretbooleantrue글자 뒤의 커서
caretCharReactNode'|'커서로 그릴 것
duration공통number한 번 재생되는 시간(ms)
delay공통number0시작 전 대기(ms)
easingstringCSS 이징 곡선. 기본값은 라이브러리의 곡선
repeat공통number | 'infinite'1반복 횟수
alternate공통booleanfalse한 번 걸러 거꾸로 재생합니다. 반복이 처음으로 튀지 않고 되돌아옵니다
trigger공통'mount' | 'visible' | 'hover' | 'manual''mount'무엇이 재생을 시작하는지. visible은 화면에 들어올 때, hover는 포인터가 올라올 때(포커스 포함), manual은 play가 정합니다
playbooleantrigger가 manual일 때 재생합니다. false → true 될 때마다 처음부터 다시 시작합니다
once공통booleantruetrigger가 visible일 때 처음 한 번만 재생할지. 끄면 화면에 들어올 때마다 다시 재생됩니다
threshold공통number0.2trigger가 visible일 때 화면에 얼마나 들어와야 하는지, 0에서 1 사이
paused공통booleanfalse있는 자리에 붙들어 둡니다
childrenReactNode타이핑할 텍스트. 텍스트만 타이핑됩니다. 자식 중 요소가 있으면 그 안의 글자만 쓰이고 마크업은 무시됩니다

나머지 <div> 속성은 모두 루트로 전달됩니다. 모든 Animate*가 공유하는 설정은 Prop 규약에 있습니다.

타이핑되는 것은 텍스트뿐입니다. 문자열 하나 또는 여럿을 넘기세요. 자식 중 요소가 있으면 그 안의 글자만 쓰이고 마크업은 반영되지 않습니다. 링크의 절반을 정직하게 드러낼 방법이 없기 때문입니다. text는 같은 것을 prop으로 받는 것이고, 둘 다 주면 이쪽이 이깁니다.

예시

speed

초당 글자 수입니다. 시간이 아니라 속도인 이유는, 긴 줄과 짧은 줄이 같은 시간이 아니라 같은 속도로 쓰여야 하기 때문입니다. duration도 받으며, 그 경우에는 문자열 전체를 쓰는 데 걸리는 시간을 뜻합니다.

repeat, hold, erase

repeat은 몇 번 반복하는지, hold는 다 쓴 글이 다음 반복까지 얼마나 머무는지입니다. erase 없이 반복하면 한 프레임에 지워지는데, 교체되는 줄에는 그쪽이 맞습니다. 켜면 eraseSpeed로 한 글자씩 지웁니다. 기본값은 speed의 두 배이고, 사람이 실제로 그렇게 합니다.

delay

시작 전 대기 시간(밀리초)입니다. 줄마다 delay를 주면 여러 개의 타자기가 하나의 기록이 됩니다.

caret

글자 뒤의 커서로, 기본으로 켜져 있습니다. caretChar가 그 모양을 정합니다. , _, 무엇이든 됩니다.

tsx
<AnimateTyping caretChar="▌" caret={false}>
  커서 없음
</AnimateTyping>

접근성

  • 전체 텍스트는 첫 프레임부터 잘린 상자 안에 들어 있고, 움직이는 사본은 aria-hidden입니다. 스크린 리더는 그 줄을 한 번 읽고 공연을 끝까지 지켜보지 않습니다.
  • 축소된 모션 설정에서는 문자열 전체가 즉시 보이고 타이핑은 일어나지 않습니다.
  • 상자의 크기는 지금까지 도착한 글자로 정해지지 않으므로, 주변 텍스트가 매 프레임 다시 배치되지 않습니다.
  • 글자는 code point가 아니라 grapheme 단위로 셉니다. 👩‍👩‍👧도 세 걸음이나 일곱 걸음이 아니라 한 걸음에 도착합니다.

Released under the MIT License