Выше было правильно сказано, попробую дополнить.
Вы создаете ДОМ(
calenderTrasform
) и присваиваете
margin-left / width
в одном и том же
event tick
. И грубо говоря, ваш новый html приходит в live DOM уже с margin-left / width — то есть, браузер не фиксирует эти изменения, поэтому и не вызывается transition. А используя setTimeout, вы переносите присваивание margin-left / width в следующий тик в event loop — и после того, как ваша функция «клик» отработает, браузер между делом «познакомится» с новыми нодами в доме, и когда функция по таймеру изменит margin-left, браузер это зафиксирует и запустит transition. И таймер в данном случае является оптимальным решением — a без нужно браузер заставить пересчитать стили:
// ...
$('.calendarBody').html('<div id="calendarTransform">'+content+'</div>');
var $transform = $('#calendarTransform'),
styles = getComputedStyle($transform[0]);
styles['margin-left'];
styles['width'];
$transform.css({'margin-left': -step, 'width': step*2})}, 1);
Также это относится к удалению «display:none» — присваивание всех других стилей в том же тике, не будет расценено браузером как изменения.