본문으로 건너뛰기

PlAnimateZoom

끝날 자리의 한가운데에서 도착하는 내용입니다. 화면에서 끼어들어야 하는 단 하나(확인, 결과, 방금 나온 숫자)에 쓰세요.

React
tsx
import { PlAnimateZoom } from 'plass-ui';

<PlAnimateZoom>
  <PlBox color="success">92</PlBox>
</PlAnimateZoom>;
dart
import 'package:plass_ui/plass_ui.dart';

const PlAnimateZoom(
  child: PlBox(color: PlassColor.success, child: Text('92')),
);

Props

Prop타입기본값설명
mode'in' | 'out''in'내용이 앞으로 나오는지 뒤로 물러나는지. out은 같은 키프레임을 거꾸로 돌린 것입니다
fromnumber0.4최종 크기에 대한 배수로서, 시작하는 배율. 1보다 크면 실제보다 크게 도착해 제자리로 내려앉고, 읽는 사람 쪽으로 오는 것처럼 읽힙니다
fadebooleantruezoom하면서 함께 나타납니다
duration공통number320한 번 도는 데 걸리는 시간(ms). CSS 문자열이 아니라 숫자입니다
delay공통number0시작하기까지 기다리는 시간(ms)
easing공통stringthe house curveCSS가 쓰는 그대로의 이징 곡선
repeat공통number | 'infinite'1몇 번 반복할지. 끝없이 돌리려면 Infinity가 아니라 'infinite' — CSS에 그 단어로 그대로 쓰이기 때문입니다
alternate공통booleanfalse한 번 걸러 거꾸로 돌립니다. 반복이 처음으로 튀어 돌아가는 대신 되돌아옵니다
paused공통booleanfalse있는 자리에 멈춰 세웁니다
trigger공통'mount' | 'visible' | 'hover' | 'manual''mount'무엇이 시작시키는지. mount는 화면에 올라오자마자, visible은 스크롤되어 보일 때, hover는 포인터나 focus가 닿을 때, manual은 play가 시킬 때만
play공통booleantrigger가 manual일 때 실행합니다. false → true가 될 때마다 처음부터 다시 돕니다
once공통booleantruetrigger="visible"에서 처음 한 번만 돌릴지. 끄면 화면에 다시 들어올 때마다 다시 돕니다
threshold공통number0.2trigger="visible"에서 얼마나 보여야 보이는 것으로 칠지, 0에서 1 사이
timeline공통'auto' | 'view''auto'무엇이 애니메이션을 진행시키는지 — 시계인지 독자의 스크롤 위치인지. view는 duration, delay, repeat, trigger를 무시하고 range로 달립니다
range공통string'entry 0% cover 45%'CSS가 animation-range를 쓰는 그대로. timeline이 view일 때만 읽힙니다
stagger공통number0자식마다 delay에 더해지는 시간(ms). 0이면 상자 자체가 재생되고, 그 외에는 효과가 자식들로 옮겨 가면서 상자에서는 빠집니다
durationStep공통number0자식마다 duration에 더해지는 시간(ms). 음수도 되고, 0 아래로는 내려가지 않습니다
reverse공통booleanfalse마지막 자식부터 첫 자식까지 순서를 뒤집습니다. 순서만 뒤집히고 각 자식은 그대로 앞으로 재생됩니다
renderReactElement | (props, state) => ReactElement<div> 대신 다른 요소로 렌더링합니다
Prop타입기본값설명
modePlassAnimateModePlassAnimateMode.enter내용이 앞으로 나오는지 뒤로 물러나는지. in이 Dart의 예약어라 enter/exit입니다
fromdouble0.4최종 크기에 대한 배수로서, 시작하는 배율. 1보다 크면 실제보다 크게 도착해 제자리로 내려앉고, 읽는 사람 쪽으로 오는 것처럼 읽힙니다
fadebooltruezoom하면서 함께 나타납니다
duration공통DurationDuration(milliseconds: 320)한 번 도는 데 걸리는 시간(ms). CSS 문자열이 아니라 숫자입니다
delay공통DurationDuration.zero시작하기까지 기다리는 시간(ms)
curve공통Curve?the house curveCSS가 쓰는 그대로의 이징 곡선
repeat공통int?1몇 번 반복할지. null이 멈추지 않음을 뜻합니다 — 적을 'infinite'가 없고, -1은 찾아봐야 하는 sentinel입니다
alternate공통boolfalse한 번 걸러 거꾸로 돌립니다. 반복이 처음으로 튀어 돌아가는 대신 되돌아옵니다
paused공통boolfalse있는 자리에 멈춰 세웁니다
trigger공통PlassAnimateTriggerPlassAnimateTrigger.mount무엇이 시작시키는지. mount는 화면에 올라오자마자, visible은 스크롤되어 보일 때, hover는 포인터나 focus가 닿을 때, manual은 play가 시킬 때만
play공통boolfalsetrigger가 manual일 때 실행합니다. false → true가 될 때마다 처음부터 다시 돕니다
once공통booltruetrigger="visible"에서 처음 한 번만 돌릴지. 끄면 화면에 다시 들어올 때마다 다시 돕니다
threshold공통double0.2trigger="visible"에서 얼마나 보여야 보이는 것으로 칠지, 0에서 1 사이
child * Widget무엇이 도착하는지

네이티브 <div> 속성은 그대로 통과하고, render로 요소 자체를 바꿀 수 있습니다.

durationdelayDuration, curveCurve, repeatnull이 멈추지 않음을 뜻하는 int?입니다.

origin은 의도적으로 없습니다. 모서리에 고정된 zoom은 grow이고, 라이브러리는 하나의 생각에 두 가지 표기를 주지 않습니다. 옆에 있는 것에서 나와야 한다면 PlAnimateGrow를 쓰세요.

공유되는 열 가지 설정 — duration, delay, easing, repeat, alternate, paused, trigger, play, once, threshold — 은 모든 PlAnimate* 컴포넌트에서 같습니다. trigger의 네 값은 PlAnimateFade 페이지에 있습니다.

세 가지가 더 있고, 이들은 효과를 상자에서 떼어 안의 것들로 옮깁니다. stagger는 각 자식을 자기 위치만큼 뒤로 미루고, durationStep은 자식마다 앞의 것보다 길거나 짧은 재생 시간을 주며, reverse는 집합의 끝에서부터 시작합니다. 키프레임 하나짜리 효과 여섯 개 모두에 있고, PlAnimateFade 페이지에 설명이 있습니다. timeline="view"range도 같은 자리에 있고, 효과를 시계가 아니라 독자의 스크롤 위치에 맡깁니다.

Examples

from

기본값이 grow의 두 배가 넘는 거리이고, 그것이 느낌의 차이 전부입니다. 1보다 작으면 페이지 밖으로 나오고, 크면 실제보다 크게 도착해 제자리로 내려앉습니다. 후자는 읽는 사람 쪽으로 오는 것처럼 읽힙니다.

React

결과 알리기

이 효과가 존재하는 이유입니다. 화면에 하나, 한 번, 그것이 참이 되는 순간에.

React

Accessibility

  • prefers-reduced-motion에서는 애니메이션이 통째로 없어지고 내용은 그냥 거기 있습니다.
  • wrapper는 role도 label도 붙이지 않습니다. 알려야 하는 결과라면 자체 live region이 필요합니다. 효과는 보는 사람이 보는 것이지, 스크린리더가 듣는 것이 아닙니다.
  • 이동 거리가 길어서 글자가 눈에 띄게 다시 샘플링됩니다. 숫자나 글리프, 작은 카드에 두세요. 문단에는 PlAnimateFade가 맞습니다.
  • 기본적으로 반복하지 않고, 이 효과는 그대로 두는 편이 좋습니다. 두 번 zoom하는 것은 첫 번째에 도착하지 못한 것입니다.
  • 플랫폼에서 애니메이션이 꺼져 있으면(MediaQuery.disableAnimations) 효과가 통째로 없어지고 내용은 그냥 거기 있습니다.
  • widget은 자기 semantics를 붙이지 않습니다. 알려야 하는 결과라면 자체 Semantics(liveRegion: true)가 필요합니다. 효과는 보는 사람이 보는 것이지, 스크린리더가 듣는 것이 아닙니다.
  • 이동 거리가 길어서 글자가 눈에 띄게 다시 샘플링됩니다. 숫자나 글리프, 작은 카드에 두세요. 문단에는 PlAnimateFade가 맞습니다.
  • 기본적으로 반복하지 않고, 이 효과는 그대로 두는 편이 좋습니다.

React 빌드와 다른 점

ReactFlutter이유
mode="in" | "out"PlassAnimateMode.enter / .exitin은 Dart의 예약어입니다.
fade가 항상 opacity 레이어를 그림fade가 꺼지면 Opacity widget 자체가 없음합성할 레이어가 하나 줄어듭니다.
renderFlutter에는 다형적 요소가 없습니다.
duration, delay가 밀리초Duration프레임워크에 이미 타입이 있습니다.
easing이 CSS 문자열curve, Curve같은 것에 대한 Dart 자신의 이름입니다.
repeat: number | 'infinite'int?, null이 멈추지 않음적을 'infinite'가 없고, -1은 caller가 찾아봐야 하는 sentinel입니다.
trigger="visible"IntersectionObserver가장 가까운 Scrollable을 봅니다여기에는 observer가 없습니다. 위에 scrollable이 없으면 볼 것이 없으므로 그냥 돕니다.
prefers-reduced-motionMediaQuery.disableAnimations플랫폼 자신의 신호입니다.
stagger, durationStep, reverseReact 빌드는 효과를 자식들 자신에게 써 넣으므로 호출자의 레이아웃은 그대로입니다. Flutter에는 집합을 배치할 스타일시트가 없어서, 차등을 준 효과는 행이나 열까지 자기가 가져야 합니다. 그것이 바로 PlAnimateAppear이고, 그것을 여섯 개 더 만드는 일이 됩니다.
timeline="view"animation-timeline은 여기에 대응물이 없는 CSS 속성입니다. Flutter에서 스크롤 연동 효과는 ScrollPosition으로 구동하는 AnimationController이고, 위젯이 prop으로 받는 것이 아니라 애플리케이션 자신의 배선입니다.
className, style통과시킬 class 목록도 style 속성도 없습니다.

Released under the MIT License