display: none; не учитываются в дереве разметки. Поэтому вы и не можите вычислить их высоту, т.к. она не назначена движком браузера. Кажды раз, когда вы, что-то изменяете в дереве элементов, браузер перестраивает весь документ, целиком и полностью.visibility, вместо hidden. Но там тоже есть нюансы.