С MSDN - Element.clientHeight
Свойство Element.clientHeight, доступное только для чтения, равно нулю для элементов без CSS или встроенных блоков макета, в противном случае это внутренняя высотаэлемент в пикселях, включая отступ, но не горизонтальную полосу прокрутки, границу или поле.
Выделение мое.
Ваш код для песочницы выведен для меня:
1
True Height
233.8
Wrong Height
239
clientWidth
167
Если вас интересует разница в десятичной запятой, ссылка также отмечает:
Примечание. Это свойство округляет значение до целого числа.Если вам нужно дробное значение, используйте element.getBoundingClientRect ().
На самом деле, проблема здесь иная, чем я изначально думал. Рабочая вилка Codepen
Изначально проблема с вашим кодом заключалась в том, что вы пытались проверить высоту до фактического отображения компонента в DOM.
Поскольку высотаdiv зависит от размера окна - при изменении размера окна вам нужно будет пересчитать его.
Для этого я добавил прослушиватель изменения размера окна:
componentDidMount() {
window.addEventListener("resize", this.updateHeightHandler);
}
Я также добавил обработчик - вызывается каждый раз при изменении размера окна - который устанавливает состояние изменения размера окна, а затем записывает вывод в консоль:
updateHeightHandler = () => {
console.log("UPDATE HEIGHT HANDLER");
this.setState({
div1Height: this.div1.clientHeight,
div2Height: this.div2.clientHeight,
div3Height: this.div3.clientHeight
});
this.logHeightHandler();
};
Сначала я пытался заставить это работать безобработчик изменения размера окна (с логикой установки состояния непосредственно в componentDidMount), и он не работал.Изображения не были загружены к моменту запуска componentDidMount (), что привело к неверным результатам.Как только я понял, в чем проблема, решение проверить ее на изменение размера имело смысл для меня, но я открыт для альтернативных предложений, как это можно сделать!
Если это требование, чтобы получитьвысота сразу после загрузки изображений, а не после изменения размера окна - вы можете добавить событие onLoad к элементу <img>
, например, так:
onLoad={this.onImageLoadHandler}
Оттуда вы просто установите состояниедля div, соответствующего загружаемому изображению.
Если вам нужны дополнительные разъяснения о том, как реализовать это, дайте мне знать, и я могу обновить кодовую ручку.