PlAnimateBlink
완전한 불투명도와 바닥값 사이를 오가며 맥동하는 내용입니다. 주기가 대칭이라(진하게, 옅게, 진하게) 몇 번을 돌든 시작한 자리에서 끝납니다.
import { PlAnimateBlink } from 'plass-ui';
<PlAnimateBlink min={0.45}>
<PlChip color="warning">Awaiting approval</PlChip>
</PlAnimateBlink>;import 'package:plass_ui/plass_ui.dart';
const PlAnimateBlink(
min: 0.45,
child: PlChip(color: PlassColor.warning, child: Text('Awaiting approval')),
);Props
| Prop | 타입 | 기본값 | 설명 |
|---|---|---|---|
| min | number | 0 | 주기의 바닥에서 얼마나 옅어지는지, 0과 1 사이. 맥동하는 동안에도 읽혀야 하는 것이라면 올려 잡으세요 |
| duration공통 | number | 1000 | 한 번 도는 데 걸리는 시간(ms). CSS 문자열이 아니라 숫자입니다 |
| delay공통 | number | 0 | 시작하기까지 기다리는 시간(ms) |
| easing공통 | string | the house curve | CSS가 쓰는 그대로의 이징 곡선 |
| repeat공통 | number | 'infinite' | 'infinite' | 몇 번 반복할지. 끝없이 돌리려면 Infinity가 아니라 'infinite' — CSS에 그 단어로 그대로 쓰이기 때문입니다 |
| alternate공통 | boolean | false | 한 번 걸러 거꾸로 돌립니다. 반복이 처음으로 튀어 돌아가는 대신 되돌아옵니다 |
| paused공통 | boolean | false | 있는 자리에 멈춰 세웁니다 |
| trigger공통 | 'mount' | 'visible' | 'hover' | 'manual' | 'mount' | 무엇이 시작시키는지. mount는 화면에 올라오자마자, visible은 스크롤되어 보일 때, hover는 포인터나 focus가 닿을 때, manual은 play가 시킬 때만 |
| play공통 | boolean | — | trigger가 manual일 때 실행합니다. false → true가 될 때마다 처음부터 다시 돕니다 |
| once공통 | boolean | true | trigger="visible"에서 처음 한 번만 돌릴지. 끄면 화면에 다시 들어올 때마다 다시 돕니다 |
| threshold공통 | number | 0.2 | trigger="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공통 | number | 0 | 자식마다 delay에 더해지는 시간(ms). 0이면 상자 자체가 재생되고, 그 외에는 효과가 자식들로 옮겨 가면서 상자에서는 빠집니다 |
| durationStep공통 | number | 0 | 자식마다 duration에 더해지는 시간(ms). 음수도 되고, 0 아래로는 내려가지 않습니다 |
| reverse공통 | boolean | false | 마지막 자식부터 첫 자식까지 순서를 뒤집습니다. 순서만 뒤집히고 각 자식은 그대로 앞으로 재생됩니다 |
| render | ReactElement | (props, state) => ReactElement | — | <div> 대신 다른 요소로 렌더링합니다 |
| Prop | 타입 | 기본값 | 설명 |
|---|---|---|---|
| min | double | 0 | 주기의 바닥에서 얼마나 옅어지는지, 0과 1 사이. 맥동하는 동안에도 읽혀야 하는 것이라면 올려 잡으세요 |
| duration공통 | Duration | Duration(milliseconds: 1000) | 한 번 도는 데 걸리는 시간(ms). CSS 문자열이 아니라 숫자입니다 |
| delay공통 | Duration | Duration.zero | 시작하기까지 기다리는 시간(ms) |
| curve공통 | Curve? | the house curve | CSS가 쓰는 그대로의 이징 곡선 |
| repeat공통 | int? | null | 몇 번 반복할지. null이 멈추지 않음을 뜻합니다 — 적을 'infinite'가 없고, -1은 찾아봐야 하는 sentinel입니다 |
| alternate공통 | bool | false | 한 번 걸러 거꾸로 돌립니다. 반복이 처음으로 튀어 돌아가는 대신 되돌아옵니다 |
| paused공통 | bool | false | 있는 자리에 멈춰 세웁니다 |
| trigger공통 | PlassAnimateTrigger | PlassAnimateTrigger.mount | 무엇이 시작시키는지. mount는 화면에 올라오자마자, visible은 스크롤되어 보일 때, hover는 포인터나 focus가 닿을 때, manual은 play가 시킬 때만 |
| play공통 | bool | false | trigger가 manual일 때 실행합니다. false → true가 될 때마다 처음부터 다시 돕니다 |
| once공통 | bool | true | trigger="visible"에서 처음 한 번만 돌릴지. 끄면 화면에 다시 들어올 때마다 다시 돕니다 |
| threshold공통 | double | 0.2 | trigger="visible"에서 얼마나 보여야 보이는 것으로 칠지, 0에서 1 사이 |
| child * | Widget | — | 무엇이 맥동하는지 |
네이티브 <div> 속성은 그대로 통과하고, render로 요소 자체를 바꿀 수 있습니다.
repeat은 int?이고 여기서는 기본값 그대로 null, 즉 멈추지 않음입니다. mode도 fade도 없습니다. blink는 도착이 아니라 주기입니다.
mode도 fade도 없습니다. blink는 도착이 아니라 주기이므로 돌아갈 방향이 없고, 따로 fade할 것도 없습니다.
repeat의 기본값이 여기서는 'infinite'이고 나머지 전부에서는 1입니다. 한 번뿐인 blink는 깜빡임이고, 깜빡임을 요청하는 사람은 없기 때문입니다. 나머지 공유 설정 — duration, delay, easing, alternate, paused, trigger, play, once, threshold — 은 다른 모든 PlAnimate* 컴포넌트에서와 같은 뜻입니다.
세 가지가 더 있고, 이들은 효과를 상자에서 떼어 안의 것들로 옮깁니다. stagger는 각 자식을 자기 위치만큼 뒤로 미루고, durationStep은 자식마다 앞의 것보다 길거나 짧은 재생 시간을 주며, reverse는 집합의 끝에서부터 시작합니다. 키프레임 하나짜리 효과 여섯 개 모두에 있고, PlAnimateFade 페이지에 설명이 있습니다. timeline="view"와 range도 같은 자리에 있고, 효과를 시계가 아니라 독자의 스크롤 위치에 맡깁니다.
Examples
min
주기의 바닥에서 얼마나 옅어지는지입니다. 0이면 내용이 사라집니다. 맥동하는 동안에도 읽혀야 하는 것 — 대부분이 그렇습니다 — 이라면 올려 잡으세요. 절반의 시간에만 있는 단어는 누군가 놓칠 단어입니다.
repeat
횟수는 무언가에 영원히가 아니라 한 번 시선을 끄는 방법입니다. 주기가 대칭이라, 끝난 실행은 내용을 찾았던 그대로 두고 갑니다.
Accessibility
prefers-reduced-motion에서는 애니메이션이 통째로 없어지고 내용은 완전한 불투명도로 남습니다. 그러므로min이 메시지를 나르는 유일한 수단이어서는 안 됩니다. 급한 일이라면 말로도 쓰세요.- 누군가 읽고 있는 페이지의 구석에서 끝없이 움직이는 것은 이 라이브러리의 나머지가 거부하는 유일한 종류의 움직임입니다.
'infinite'보다는 횟수를, 둘보다는 색을 먼저 쓰세요. - 초당 세 번 깜빡이는 것과는 확실히 거리를 두세요. 기본값이 느린 맥동이고, 그대로 두어야 합니다.
- 플랫폼에서 애니메이션이 꺼져 있으면(
MediaQuery.disableAnimations) 효과가 없어지고 내용은 완전한 불투명도로 남습니다. 그러므로min이 메시지를 나르는 유일한 수단이어서는 안 됩니다. 급한 일이라면 말로도 쓰세요. - 누군가 읽고 있는 화면 구석에서 끝없이 움직이는 것은 이 패키지의 나머지가 거부하는 유일한 종류의 움직임입니다.
nullrepeat보다는 횟수를, 둘보다는 색을 먼저 쓰세요. - 초당 세 번 깜빡이는 것과는 확실히 거리를 두세요. 기본값이 느린 맥동이고, 그대로 두어야 합니다.
React 빌드와 다른 점
| React | Flutter | 이유 |
|---|---|---|
repeat="infinite" | repeat: null | 여기서의 기본값이고, 멈추지 않음을 뜻하는 값입니다. |
render | — | Flutter에는 다형적 요소가 없습니다. |
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-motion | MediaQuery.disableAnimations | 플랫폼 자신의 신호입니다. |
stagger, durationStep, reverse | — | React 빌드는 효과를 자식들 자신에게 써 넣으므로 호출자의 레이아웃은 그대로입니다. Flutter에는 집합을 배치할 스타일시트가 없어서, 차등을 준 효과는 행이나 열까지 자기가 가져야 합니다. 그것이 바로 PlAnimateAppear이고, 그것을 여섯 개 더 만드는 일이 됩니다. |
timeline="view" | — | animation-timeline은 여기에 대응물이 없는 CSS 속성입니다. Flutter에서 스크롤 연동 효과는 ScrollPosition으로 구동하는 AnimationController이고, 위젯이 prop으로 받는 것이 아니라 애플리케이션 자신의 배선입니다. |
className, style | — | 통과시킬 class 목록도 style 속성도 없습니다. |