본문으로 건너뛰기

PlAnimateRotate

한 점을 중심으로 도는 내용입니다. 각도가 하나가 아니라 둘이라서, 컴포넌트 하나가 제자리로 들어오는 4분의 1 회전과 끝나지 않는 회전을 모두 담습니다.

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

<PlAnimateRotate from={0} to={360} duration={2400} easing="linear" repeat="infinite" fade={false}>
  <PlIcon icon={<RefreshGlyph />} label="Syncing" />
</PlAnimateRotate>;
dart
import 'package:plass_ui/plass_ui.dart';

const PlAnimateRotate(
  from: 0,
  to: 360,
  duration: Duration(milliseconds: 2400),
  curve: Curves.linear,
  repeat: null,
  fade: false,
  child: PlIcon(icon: RefreshGlyph()),
);

Props

Prop타입기본값설명
mode'in' | 'out''in'제자리로 돌아 들어오는지 돌아 나가는지
fromnumber-180시작하는 각도(도). 음수는 반시계 방향입니다
tonumber0끝나는 각도(도). from과 함께라서 컴포넌트 하나가 제자리로 들어오는 회전과 끝나지 않는 회전을 모두 담습니다 — from={0} to={360} repeat="infinite"
originstring'center'무엇을 중심으로 도는지 — CSS transform-origin 그대로
fadebooleantrue돌면서 함께 나타납니다. 계속 도는 경우에는 끄세요 — 반복되는 fade는 깜빡임으로 읽힙니다
duration공통number440한 번 도는 데 걸리는 시간(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입니다
fromdouble-180시작하는 각도. radian이 아니라 도입니다 — 프레임워크는 radian으로 세지만 디자인 언어는 도로 셉니다
todouble0끝나는 각도(도). from과 함께라서 컴포넌트 하나가 제자리로 들어오는 회전과 끝나지 않는 회전을 모두 담습니다 — from={0} to={360} repeat="infinite"
originAlignmentAlignment.center무엇을 중심으로 도는지 — CSS transform-origin 그대로
fadebooltrue돌면서 함께 나타납니다. 계속 도는 경우에는 끄세요 — 반복되는 fade는 깜빡임으로 읽힙니다
duration공통DurationDuration(milliseconds: 440)한 번 도는 데 걸리는 시간(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로 요소 자체를 바꿀 수 있습니다.

fromto는 radian이 아니라 **도(degree)**입니다. 프레임워크는 radian으로 세고 디자인 언어는 도로 셉니다 — 패키지의 모든 그러데이션이 135°죠 — 그래서 변환은 호출하는 자리마다가 아니라 widget 안에서 한 번 일어납니다. originAlignment입니다.

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

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

Examples

from and to

from만 있으면 도착입니다. 무언가 제자리로 들어와 멈춥니다. fromtorepeat="infinite", easing="linear"와 함께 쓰면 끝나지 않는 회전이 됩니다. 배지나 로딩 표시, 장식용 글리프가 원하는 것이죠. 후자에서는 fade를 끄세요. 반복되는 fade는 깜빡임으로 읽힙니다.

React

origin

CSS transform-origin이면 무엇이든 됩니다. 모서리를 중심으로 도는 것은 바퀴가 아니라 경첩이고, 깃발이나 태그, 더미에 놓이는 카드가 원하는 것입니다.

React

Accessibility

  • prefers-reduced-motion에서는 애니메이션이 통째로 없어지고 내용은 그냥 거기 있습니다. 도착에는 맞는 처리이고, 회전에는 한 번 생각해 볼 문제입니다. 도는 것 자체가 무언가 진행 중이라는 뜻이고 있다면 PlProgressCircular를 쓰세요. 그쪽은 멈추는 대신 느려집니다.
  • 글자에는 쓰지 마세요. 회전한 단어는 길이 전체에 걸쳐 다시 샘플링됩니다. 회전은 디자인 언어가 글리프 위에서 이견 없이 허용하는 유일한 움직임이고 — 라이브러리 전체에서 chevron은 다시 그려지는 대신 돌아갑니다 — 그것이 이 효과가 겨냥하는 종류의 것입니다.
  • 누군가 읽고 있는 페이지의 구석에서 끝없이 도는 것은 이 라이브러리의 나머지가 거부하는 유일한 종류의 움직임입니다. 이유를 주세요.
  • 플랫폼에서 애니메이션이 꺼져 있으면(MediaQuery.disableAnimations) 효과가 통째로 없어지고 내용은 그냥 거기 있습니다. 도착에는 맞는 처리이고, 회전에는 한 번 생각해 볼 문제입니다. 도는 것 자체가 무언가 진행 중이라는 뜻이고 있다면 PlProgressCircular를 쓰세요. 그쪽은 멈추는 대신 느려집니다.
  • 글자에는 쓰지 마세요. 회전한 단어는 길이 전체에 걸쳐 다시 샘플링됩니다.
  • 누군가 읽고 있는 화면 구석에서 끝없이 도는 것은 이 패키지의 나머지가 거부하는 유일한 종류의 움직임입니다. 이유를 주세요.

React 빌드와 다른 점

ReactFlutter이유
from, to가 도 단위double 도, 내부에서 변환프레임워크는 radian으로, 디자인 언어는 도로 셉니다. 변환은 한 자리에 있어야 합니다.
origin이 CSS transform-origin 문자열Alignment프레임워크에 이미 타입이 있습니다.
easing="linear"curve: Curves.linear같은 곡선에 대한 Dart 자신의 이름입니다.
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