起こった現象
あるコンポーネントを使用している時にページ間を遷移したとき、
- ページ遷移前のコンテンツがうっすら消え始める
- ページ遷移後のコンテンツがうっすら現れ始める
- ページ遷移前と後のコンテンツが同時に表示される
- ページ遷移前のコンテンツが消える
このような挙動になりました。
アニメーションを実行している認識がなかったので混乱したのですが、結論以下のコードが原因でした。
<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:fly
にundefined
が渡された時、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
へページ遷移してみてください。