дерганье чисто визуально по причине того что ты повторяешь итерацию с двумя контейнерами и заканчиваешь ее не тогда когда требуется.
Имхо насдо строить логику что экземпляр контейнера должен быть отдельной сущностью и движение контейнеров не должно быть связано друг с другом. Рождение первого контейнера согласно загрузки страницы, дальше итерации по созданию контейнера тогда когда от предыдущего контейнера на экране осталось Х пикселей, % или любое другое условие. Хоть по таймеру клепать.
Скорее всего логика должна быть следующей:
function createBlock() {
// получаем следующие данные из массива
// создаем блок и заставляем его ехать. Когда он уедет желательно дестроить его из памяти.
setTimeout(createBlock, 200);
}
Такой подход во-первых решит масштабирование по вертикали во-вторых избавит от геммороя с дерганьем.
setTimeout можно изменить на что-то другое, кпримеру взять эмиттер, и из экземпляра эмиттить информацию, что блок почти не видно уже и пора создавать новый, а в подписке on на это событие создавать новый блок. Тут как удобнее.