Я люблю Svelte, но я застрял на чем-то, основанном на c (хотя это всего лишь косметика c). Следующий код должен плавно переходить между двумя элементами, но вместо этого он «прыгает» - очевидно, освобождая место для входящего элемента до его прибытия.
Проблема похожа на этот , который Rich Харрис отметил, что несколько лет назад, но я не вижу, чтобы решение было реализовано. Все примеры на сайте учебного пособия Svelte содержат только один элемент.
Вот базовая c разметка / код:
{#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 . Вы можете увидеть кнопку спрыгнуть вниз, чтобы освободить место для нового элемента. Я добавил задержку перехода «в», равную 400 (я знаю, что это значение по умолчанию, но я хотел установить его явно для ясности). Задержка должна позволить первому элементу перейти перед переходом следующего, как отмечено в первой ссылке (то, что Харрис назвал «хакерским использованием задержки») и предлагает здесь .
Я также попытался явно установить элемент outro'd в position: absolute, чтобы он не занимал место. Вот (все еще не работает должным образом) пример . Кажется, немного не элегантно, даже если это работает. По какой-то причине переход переопределяет установку класса, который устанавливает положение: абсолютное.
Любая помощь очень ценится!
ОБНОВЛЕНИЕ: Я получил желаемый эффект с этим кодом . Здесь я скопировал и изменил переход мухи Svelte, чтобы получить дополнительный параметр - «position», который можно установить как «absolute» или «родственник», или как вам угодно. Несколько настроек CSS, чтобы убедиться, что нет никаких странных побочных эффектов (контейнер, установленный в положение: относительный, и установив ширину каждого элемента на 100%, чтобы они не меняли размер). Это работает, но я все еще чувствую, что должен быть менее трудоемкий метод, без изменения переходов Svelte.