Потому что float частично выводит элементы из потока и его родитель перестает что-либо знать о высоте флоатов.
какие варианты решение существуют?
Перестать использовать флоаты для того, для чего они не предназначены.
Но использовать флексы и гриды.
ul {display:flex}
решит вашу задачу.
Остальные свойства смотрите в справочнике/спецификации и используйте по мере необходимости.