Одним из вариантов является:
1) Исходное (целое) изображение
2) Предварительно нарезанное по вкусу (на маленькие рваные пазлы) с помошью слайсер-инструмента в фоторедакторе
3) Далее вы работаете с селектором тега изображения и скрываете его при наведении курсора
img:hover {
display: none;
}
4) Фрагменты нарезанного изображения должны быть абсолютно позиционированы таким образом, что вы собираете этот пазл виртуально в целое изображение, причем все эти фрагменты должны иметь свой контейнер-родитель, которому прописываете относительное позиционирование (position: relative) и относительно него вы двигаете эти пазлы собирая в целую картину, и все это к тому же спрятано за исходное изображение за счет Лееринга (работы со слоями) z-index: значение;
img.fragment_1 {
position: absolute;
top: _px;
left: _px;
}
5) После этого к каждому фрагменту вы обращаетесь к его идентиффикатору (id) и посредством javascript пишете функцию движения этих элементов, при событии onmouseover="name_function()" в желаемую сторону за счет transform: translate() или же меняя координаты top/right/bottom/left, каждому из них.
Ну и далее уже дело творчества, можно довести все это до порядочного результата применяя различного рода фильтры к кускам (прозрачность/затухание или же резкое изчезновение (их поведение после разлетания) дело уже вкуса и задачи