Неправильная ширина приходит из-за того, что сам рендер происходит
после того, как опустошится стек вызовов в js (гуглите event loop).
setTimeout(, 0) — не самый очевидный, но рабочий ход, который откладывает вычисление ширины на следующий тик event loop. Попробуйте
MutationObserver, может помочь (сам с ним никогда не работал).