3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SvelteAdvent Calendar 2024

Day 8

transition:flyで引っかかった話

Last updated at Posted at 2024-12-07

起こった現象

あるコンポーネントを使用している時にページ間を遷移したとき、

  1. ページ遷移前のコンテンツがうっすら消え始める
  2. ページ遷移後のコンテンツがうっすら現れ始める
  3. ページ遷移前と後のコンテンツが同時に表示される
  4. ページ遷移前のコンテンツが消える

このような挙動になりました。
アニメーションを実行している認識がなかったので混乱したのですが、結論以下のコードが原因でした。

<script lang="ts">
	import type { Snippet } from 'svelte';
	import { fly, type FlyParams } from 'svelte/transition';

	let {
		transition = undefined,
		children,
	}: {
		transition?: {
			fly?: FlyParams;
		};
		children: Snippet;
	} = $props();
</script>

<div transition:fly={transition?.fly}>
	{@render children()}
</div>

引っかかったポイントは
transition:flyundefinedが渡された時、transition:flyのデフォルト値でtransitionが実行される」 です。

理由がわかってしまえば当たり前でしたが、undefinedを渡したらtransitionが無効化されるだろうな と思い込んでいたので気づけませんでした。

要するに以下とおなじです。

<div transition:fly>hoge</div>

transitionは非常に便利な機能ですが、transition:xxxのxxx部分を動的に切り替えたりできないなど不便な点があり、こちらのIssueで議論には上がっているようです。

同じ現象にあった人の参考になればいいなと思うので記事として残しておきます。

実際に見たい人へ

リポジトリ

問題のある例

https://svelte5-examples.pages.dev/transition/from
から
https://svelte5-examples.pages.dev/transition/to

へページ遷移してみてください。

解消した例

https://svelte5-examples.pages.dev/conditionalTransition/from
から
https://svelte5-examples.pages.dev/conditionalTransition/to

へページ遷移してみてください。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?