本文へスキップ

トランジションとアニメーション

スタイルの変化は .Transition(...) でアニメーションします。コンポーネントはフレームごとに再実行されません。

#ホバーのトランジション

トランジションはベーススタイルに置き、ポインターが入ったときと出たときの両方に効くようにします。

func HoverAction() *ui.Element {
	return ui.Button().Child("Continue").
		Padding(12).
		BorderRadius(8).
		BackgroundColor("#334155").
		TextColor("white").
		Opacity(0.85).
		Transition("background-color 160ms ease-out, opacity 160ms ease-out").
		Hover(func(s ui.StyleBuilder) ui.StyleBuilder { return s.BackgroundColor("#2563eb").Opacity(1) })
}

同じ宣言は Active、Focus、Expanded、DragOver でも使えます。

#状態によるアニメーション

目標値はシグナルまたは .When で変えます。アニメーション中はノードをマウントしたままにします。

func AnimatedSelection() *ui.Element {
	selected, setSelected := ui.CreateSignal(false)
	return ui.View().FlexCol().Gap(12).Children(
		ui.Button().Child("Toggle emphasis").OnClick(func() { setSelected(!selected()) }),
		ui.View().Child("Your selection").
			Padding(20).
			BorderRadius(12).
			BackgroundColor("#334155").
			TextColor("white").
			Opacity(0.6).
			Transition("background-color 180ms ease-out, opacity 180ms ease-out").
			When(selected, ui.Style().BackgroundColor("#2563eb"), ui.Style().Opacity(1)),
	)
}

トランジションの途中で逆方向にすると、いま見えている値から続きます。

#時間とフレームレート

複数のプロパティが同じタイミングを共有するときは ui.TransitionDeclaration を使います。

func CappedTransition() *ui.Element {
	return ui.Button().Child("Hover me").Padding(12).BackgroundColor("#334155").TextColor("white").Opacity(0.8).
		Transition(ui.TransitionDeclaration{
			Properties: []string{"background-color", "opacity"},
			Duration:   180 * time.Millisecond,
			Easing:     "ease-out",
			MaxFps:     30,
		}).
		Hover(func(s ui.StyleBuilder) ui.StyleBuilder { return s.BackgroundColor("#2563eb").Opacity(1) })
}
フィールド使い方
.TransitionProperty(...)プロパティ名。カンマ区切りの文字列または []string。
.TransitionDuration(...)ミリ秒数、time.Duration、または "180ms" / "0.18s"。時間は 0–10 秒に制限されます。
.TransitionEasing(...)"linear"、"ease"、"ease-in"、"ease-out"、または "ease-in-out"。
.TransitionMaxFps(...)任意のフレームレート上限。省略するとディスプレイに従います。

ノードは、選んだすべてのプロパティに対して 1 つの時間、イージング、フレームレート上限を持ちます。遅延、cubic-bezier()、プロパティごとのタイミングはサポートされていません。

ui.Style().Transition(180 * time.Millisecond) は背景、ボーダー、テキストの色をアニメーションします。"all" は対応するすべての描画プロパティを含みます。"none" はそのショートハンドを外します。

#対応するプロパティ

トランジション名スタイルメソッド
background-color または background.BackgroundColor(...) または単色の .Background(...)
border-color.BorderColor(...)
border-width.BorderWidth(...)
border-radius.BorderRadius(...)
color.TextColor(...)
opacity.Opacity(...)
transform.Transform(...)
box-shadow.BoxShadow(...)

幅、高さ、パディング、グラデーションのストップは補間されません。スライドするスイッチのつまみには、.Transform("translateX(20px)") と .Transition("transform 160ms ease-out") を使います。

#マウントと視差効果の抑制

トランジションは、既存ノード上の変化をアニメーションします。ui.Show は子をすぐに外し、フェードアウトを待ちません。透明度ゼロでもレイアウトと入力は受け取ります。

ダイアログでは、EnterDuration と ExitDuration が閉じる内容をマウントしたままにする時間を制御します。Dialog を参照してください。

トランジションはシステムの Reduce Motion 設定に従います。1 つのウィンドウで上書きするには native.WindowOptions.ReduceMotion を設定します。

#アニメーション画像

GIF または WebP のパスを ui.Image に渡します。再生はファイルに従い、タイマーは不要です。

func AnimatedImage(path string) *ui.Element {
	return ui.Image().Value(path).
		Width(96).Height(96).ObjectFit("contain")
}

ファイルは CLI の resources オプションでパッケージします。バンドルするリソースと Image を参照してください。