【发布时间】:2020-05-09 22:32:01
【问题描述】:
我喜欢 Svelte,但我坚持做一些基本的事情(尽管只是表面上的)。下面的代码应该在两个元素之间平滑过渡,但它会“跳跃”——显然是在传入元素到达之前为它腾出空间。
这个问题类似于 Rich Harris 几年前指出的this one,但我没有看到解决方案已实施。 Svelte tutorial site 转换的所有示例都只有一个元素。
这是基本的标记/代码:
{#if div1}
<div
in:fly={{ x: 100, duration: 400, delay: 400 }}
out:fly={{ x: 100, duration: 400 }}>Div 1</div>
{:else}
<div
in:fly={{ x: 100, duration: 400, delay: 400 }}
out:fly={{ x: 100, duration: 400 }}>Div 2</div>
{/if}
<button on:click={()=>{ div1 = !div1}}>Switch</button>
在 Vue 中的等效工作是:
<transition name="fly" mode="out-in">
<div v-if="div1">Div 1</div>
<div v-else>Div 2</div>
</transition>
这是Code Sandbox example。您可以看到按钮向下跳来为新元素腾出空间。我添加了一个等于 400 持续时间的“in”转换延迟(我知道这是默认设置,但为了清楚起见,我想明确设置它)。延迟应该允许第一个元素在转换下一个元素之前转换出来,如第一个链接中所述(Harris 称之为“延迟的黑客使用”)并建议here。
我还尝试将被淘汰的元素显式设置为 position: absolute,这样它就不会占用空间。 Here is a (still not working properly) example。似乎有点不雅,即使它正在工作。出于某种原因,转换覆盖了设置位置的类:absolute。
非常感谢任何帮助!
更新:我得到了想要的效果with this code。我在这里所做的是复制和修改 Svelte 的飞行过渡以获取一个额外的参数——“位置”,它可以设置为“绝对”或“相对”或任何你想要的。对 CSS 进行了一些调整以确保没有奇怪的副作用(将容器设置为 position: relative,并将每个元素的宽度设置为 100% 以确保它们不会改变大小)。这行得通,但我仍然觉得应该有一种不那么劳动密集型的方法,无需修改 Svelte 的过渡。
【问题讨论】:
-
所有代码沙箱链接都不起作用。
-
我写了一个blog post 来解决这个CSS网格问题。希望有帮助!
标签: svelte-3