Плавный переход, это минимум ajax.
Подгружается не вся страница, а только контент.
Например у Jquery есть функции fadeIn и fadeOut, можно и другими реализовать.
Жмешь на ссылку, отправляется запрос на подгрузку контента следующей страницы, в этот момент происходит "затухание" текущей страницы, контент подгружен, стартует функция "появления". "Сбалансировать" время между запросом контента и его получением можно гифкой ajax-loader.
Если это сделать не асинхронным запросом, получится "каша", ведь первая страница может потухнуть, а вторая еще будет в ожидании, так и вторая может не сразу открыться.
Хотя это можно сделать. Просто к клику вешаешь событие "затухание". Браузер пока ответ не получит от сервера, страницу не сменит. А на ready ДОМа каждой страницы (или только переходов), повешать появление . Будет самый простой эффект плавного перехода между страницами. Клик - затухание, пока браузер ждет ответ на клик - переход на новую страницу - появление контента. Если сервер быстро обрабатывает запросы, сайт оптимизирован, а у пользователя шустрый интернет, будет выглядеть как по настоящему.