in
всегда должен быть связан с receive
, а out
всегда должен быть связан с send
; in:send
всегда даст странные результаты. У вас также есть несоответствие между местами здесь:
out:send={{ key: location.id }}
in:receive={{ key: selectedLocation.id }}
Они оба должны быть одинаковыми.
Директива animate
предназначена для переупорядочения элементов в пределах списка - поскольку в этом случае первый список всегда идет от [x]
до [y]
, а второй всегда идет от []
до [x, y, z]
нет общих элементов для анимации, так что это неправильное место для использования этой директивы.
При использовании crossfade
отправленные / полученные элементы должны быть одинакового размера, и в идеале они должны выглядеть хорошо, когда расположены друг над другом (т.е. вводить в том же месте относительно ограничивающего прямоугольника элемента и т. Д.). Здесь элемент <button>
делает вещи разных размеров.
Другими словами, что-то вроде этого: https://svelte.dev/repl/f4386ec88df34e3b9a6b513e19374824?version=3.4.4
К сожалению, визуальный сбой все еще присутствует - поскольку мы используем масштабное преобразование в качестве запасного варианта, макет не изменяется, то есть внешняя граница защелкивается и теряется. вместо того, чтобы изменять размер плавно. Вместо этого мы можем использовать переход slide
, но тогда скользящий элемент и элемент перекрестного затухания, кажется, смещаются друг над другом. В любом случае, кажется, что в DOM застрял фантомный элемент и нарушил макет. Я не уверен, является ли это ошибкой Svelte (и если да, то исправима ли она) без дальнейшего расследования, поэтому я поднял проблему: https://github.com/sveltejs/svelte/issues/2957