каждый элемент списка ловит события наведения мышки, далее начинается просчет координат каждого элемента, при этом должны быть два массива с отображенными элементами и скрытыми. функция изменения положения элементов должна знать координаты начала и конца списка. если координаты первого отображенного элемента выходят за границы дива то мы его скрываем и переносим в массив скрытых, и одновременно показываем первый скрытый элемент в конце списка. (организуем два стека, короче) вместе с тем запускается функция перемещения всех элементов списка вверх или вниз. Хотя в том что удасться обеспечить их плавное перемещение я сильно сомневаюсь
вот наверно как-то так