复制整个站点的 Svelte 页面转换 __layout.svelte
Svelte page transition duplicating entire site __layout.svelte
我是 Svelte 的新手,我正在尝试在用户导航到新页面时将动画应用到我的页面内容。然而动画导致我的整个网站在动画期间复制。
我的内容是这样的:
<div class="entire-page">
<nav>
<ul>
<li> Navigation items </li>
<li> Navigation items </li>
<li> Navigation items </li>
</ul>
</nav>
<div class="content" in:slideIn out:slideOut>
Here is my first page content. This is supposed to slide in / out.
</div>
</div>
但是,当动画执行时。它复制了所有内容(即.entire-page):这是我浏览器中的结果,直到动画消失:
<div class="entire-page">
<nav>
<ul>
<li> Navigation items </li>
<li> Navigation items </li>
<li> Navigation items </li>
</ul>
</nav>
<div class="content" in:slideIn out:slideOut>
Here is my first page content. This is supposed to slide in / out.
</div>
</div>
<div class="entire-page">
<nav>
<ul>
<li> Navigation items </li>
<li> Navigation items </li>
<li> Navigation items </li>
</ul>
</nav>
<div class="content" in:slideIn out:slideOut>
Here is my second page content. This is supposed to slide in / out.
</div>
</div>
这是因为缺少对元素的引用吗?
是的,这是意料之中的。
(除了动画和过渡之间的混淆)。
您的第一页离开 DOM 并且 out:transition
被触发,这只不过是一些奇特的 css 以某种方式转换元素,在您的情况下是某种幻灯片动画。 DOM 一直存在到动画结束。
在您的新页面出现的同时,这触发了 in:transition
,同样只是花哨的 css,但是 DOM 在那里。
如您所见,从逻辑上讲,在 in/out 转换过程中,整个页面都会出现。 (几乎)您无能为力。
但是,您 可以 做的一件事是将 in:
动画延迟为 out:
动画的持续时间,这样传入页面将等待即将到来的页面已经滑走了。这当然只有在两个页面的过渡持续时间相同时才有效。
如果您不想让两页一页一页地出现,您必须将它们放在另一个 div 中(始终存在)并开始在 [=29= 中调整定位].例如,这可用于让页面从右侧滑入并从左侧滑出,给人一种将另一个推出的印象。
我有一些图像有同样的问题,我想根据 page.url.pathname 进行反应性更改,我的整个 __layout.svelte 都被复制了。
我使用关键指令解决了它:
<script lang="ts">
import { page } from '$app/stores';
import { fade } from 'svelte/transition';
import { colors } from '/stores';
const nav = [{ title: '/Dev', path: '/', imgUrl: '../images/dev', color: 'devBG', keyword: '/dev' }]
let keywordTitle: string;
let activeIndex: number = 0;
$: pageUrl = $page.url.pathname;
$: {
switch (pageUrl) {
case '/':
keywordTitle = nav[0].keyword;
colors.set(nav[0].color);
activeIndex = 0;
break;
}
</script>
{#each nav as cat, i}
{#key $page}
{#if activeIndex === i}
<img transition:fade src="{cat.imgUrl}-1800.jpg " />
{/if}
{/key}
{/each}
key 在表达式的值发生变化时销毁并重新创建它们的内容。
{#key} 的文档:https://svelte.dev/docs#key
我是 Svelte 的新手,我正在尝试在用户导航到新页面时将动画应用到我的页面内容。然而动画导致我的整个网站在动画期间复制。
我的内容是这样的:
<div class="entire-page">
<nav>
<ul>
<li> Navigation items </li>
<li> Navigation items </li>
<li> Navigation items </li>
</ul>
</nav>
<div class="content" in:slideIn out:slideOut>
Here is my first page content. This is supposed to slide in / out.
</div>
</div>
但是,当动画执行时。它复制了所有内容(即.entire-page):这是我浏览器中的结果,直到动画消失:
<div class="entire-page">
<nav>
<ul>
<li> Navigation items </li>
<li> Navigation items </li>
<li> Navigation items </li>
</ul>
</nav>
<div class="content" in:slideIn out:slideOut>
Here is my first page content. This is supposed to slide in / out.
</div>
</div>
<div class="entire-page">
<nav>
<ul>
<li> Navigation items </li>
<li> Navigation items </li>
<li> Navigation items </li>
</ul>
</nav>
<div class="content" in:slideIn out:slideOut>
Here is my second page content. This is supposed to slide in / out.
</div>
</div>
这是因为缺少对元素的引用吗?
是的,这是意料之中的。 (除了动画和过渡之间的混淆)。
您的第一页离开 DOM 并且 out:transition
被触发,这只不过是一些奇特的 css 以某种方式转换元素,在您的情况下是某种幻灯片动画。 DOM 一直存在到动画结束。
在您的新页面出现的同时,这触发了 in:transition
,同样只是花哨的 css,但是 DOM 在那里。
如您所见,从逻辑上讲,在 in/out 转换过程中,整个页面都会出现。 (几乎)您无能为力。
但是,您 可以 做的一件事是将 in:
动画延迟为 out:
动画的持续时间,这样传入页面将等待即将到来的页面已经滑走了。这当然只有在两个页面的过渡持续时间相同时才有效。
如果您不想让两页一页一页地出现,您必须将它们放在另一个 div 中(始终存在)并开始在 [=29= 中调整定位].例如,这可用于让页面从右侧滑入并从左侧滑出,给人一种将另一个推出的印象。
我有一些图像有同样的问题,我想根据 page.url.pathname 进行反应性更改,我的整个 __layout.svelte 都被复制了。
我使用关键指令解决了它:
<script lang="ts">
import { page } from '$app/stores';
import { fade } from 'svelte/transition';
import { colors } from '/stores';
const nav = [{ title: '/Dev', path: '/', imgUrl: '../images/dev', color: 'devBG', keyword: '/dev' }]
let keywordTitle: string;
let activeIndex: number = 0;
$: pageUrl = $page.url.pathname;
$: {
switch (pageUrl) {
case '/':
keywordTitle = nav[0].keyword;
colors.set(nav[0].color);
activeIndex = 0;
break;
}
</script>
{#each nav as cat, i}
{#key $page}
{#if activeIndex === i}
<img transition:fade src="{cat.imgUrl}-1800.jpg " />
{/if}
{/key}
{/each}
key 在表达式的值发生变化时销毁并重新创建它们的内容。 {#key} 的文档:https://svelte.dev/docs#key