Вот одно из моих стареньких горизонтальных меню на CSS.
Я оттуда удалил все лишнее, оставил только суть.
в нем два последних элемента горизонтального меню разворачиваются вниз-влево, а не вниз-вправо (имеют дополнительный класс rtl).
Также в примере куда лучше, чем в большинстве примеров на форуме реализовано построение структуры <ul><li><ul><li>...</li></ul>, на которой обычно и строятся все CSS-меню. Она тут бесконечна, т.е. сколько угодно уровней вложенности, при этом проста (три строчки).
{if $big_categories_tree && $big_categories_tree_count>0}
{php}
foreach ($this->get_template_vars('big_categories_tree') as $i => $val) if ($val['level']==0) {$prelast=$last; $last = $i;}
$this->assign("last", $last);
$this->assign("prelast", $prelast);
{/php}
<ul class="menu">
{section name=h loop=$big_categories_tree}
{if $smarty.section.h.index == $last || $smarty.section.h.index == $prelast}
<li class="rtl">
{else}
<li>
{/if}
{* --------------------------------- *}
<a href="category_{$big_categories_tree[h].categoryID}.html">{$big_categories_tree[h].name}</a>
{* --------------------------------- *}
{if $big_categories_tree[h.index_next].level <= $big_categories_tree[h].level}</li>{/if}
{if $big_categories_tree[h.index_next].level > $big_categories_tree[h].level}<ul>{/if}
{if $big_categories_tree[h.index_next].level < $big_categories_tree[h].level}{section name=ret loop=$big_categories_tree[h].level-$big_categories_tree[h.index_next].level}</ul></li>{/section}{/if}
{/section}
</ul>
{else}
<div align="center">{$smarty.const.STRING_NO_CATEGORIES}</div>
{/if}
А если воспользоваться идеей Dbus c :last-child, т.е. достаточно разворачивать влево только последнее подменю, то код меню будет еще проще:
{if $big_categories_tree && $big_categories_tree_count>0}
<ul class="menu">
{section name=h loop=$big_categories_tree}
<li>
{* --------------------------------- *}
<a href="category_{$big_categories_tree[h].categoryID}.html">{$big_categories_tree[h].name}</a>
{* --------------------------------- *}
{if $big_categories_tree[h.index_next].level <= $big_categories_tree[h].level}</li>{/if}
{if $big_categories_tree[h.index_next].level > $big_categories_tree[h].level}<ul>{/if}
{if $big_categories_tree[h.index_next].level < $big_categories_tree[h].level}{section name=ret loop=$big_categories_tree[h].level-$big_categories_tree[h.index_next].level}</ul></li>{/section}{/if}
{/section}
</ul>
{else}
<div align="center">{$smarty.const.STRING_NO_CATEGORIES}</div>
{/if}