clientHeight/clientWidth возвращает разные значения в разных браузерах

Свойства document.body.clientHeight и document.body.clientWidth возвращают разные значения в IE7, IE8 и Firefox:

IE 8:

document.body.clientHeight : 704 
document.body.clientWidth  : 1148

IE 7:

document.body.clientHeight : 704 
document.body.clientWidth  : 1132

Fire Fox:

document.body.clientHeight : 620 
document.body.clientWidth  : 1152

Почему существует это несоответствие?
Существуют ли какие-либо эквивалентные свойства, одинаковые для разных браузеров (IE8, IE7, Firefox) без использования jQuery?


person coder_bro    schedule 07.05.2009    source источник
comment
Вы на самом деле сделали снимок экрана и измеряете clientHeight в разных браузерах? Держу пари, число правильное, измеряя доступное пространство, разные браузеры имеют разное доступное пространство в зависимости от того, сколько места зарезервировано из текстового поля URL-адреса, кнопок и т. Д.   -  person infocyde    schedule 10.02.2011


Ответы (9)


Это связано с блочной моделью браузера. Используйте что-то вроде jQuery или другой библиотеки абстракций JavaScript, чтобы нормализовать модель DOM.

person Paul Alexander    schedule 07.05.2009
comment
Что эквивалентно jQuery для clientWidth и clientHeight? - person coder_bro; 07.05.2009
comment
jQuery $(document).height $(document).width также возвращает значения переменных в разных браузерах. - person coder_bro; 07.05.2009
comment
& @Ngm: jQuery .height() и .width() не эквивалентны clientHeight и clientWidth, потому что они не включают отступы. .innerHeight(), с другой стороны, не учитывает полосы прокрутки... HTML DOM clientHeight не имеет эквивалента jQuery. - person Robert Koritnik; 29.04.2011
comment
@RobertKoritnik arajek указывает на эквивалент jQuery в ответе ниже. - person TheXenocide; 03.10.2012

Пол А прав в том, почему существует несоответствие, но решение, предлагаемое Ngm, неверно (в смысле JQuery).

Эквивалентом clientHeight и clientWidth в jquery (1.3) является

$(window).width(), $(window).height()
person arajek    schedule 15.09.2009
comment
.height() не включает отступы элементов. Если бы кто-то затем использовал .innerHeight(), это все равно было бы неправильно, потому что он не учитывает полосы прокрутки, когда элемент прокручивается. clientHeight - это внутренняя высота, но только видимая (без полос прокрутки). - person Robert Koritnik; 29.04.2011
comment
Я не думаю, что это правда. $(window).height() и document.documentElement.clientHeight часто возвращают совершенно разные значения в разных браузерах. - person DA.; 21.11.2011

Элемент body принимает доступную ширину, которая обычно соответствует области просмотра вашего браузера. Таким образом, в браузере будут разные размеры из-за хромированных границ браузера, полос прокрутки, вертикального пространства, занимаемого меню и еще много чего...

Тот факт, что высота также различается, также говорит мне о том, что вы установили высоту body/html на 100% с помощью css, поскольку высота обычно зависит от элементов внутри body..

Если вы не установите для ширины элемента body фиксированное значение через css или его свойство стиля, его размеры, как правило, всегда будут различаться в разных браузерах/версиях и, возможно, даже в зависимости от плагинов, которые вы установили для браузер. Постоянные значения в таком случае скорее исключение из правил...

Когда вы вызываете .clientWidth для других элементов, которые не принимают автоматическую ширину окна просмотра браузера, он всегда будет возвращать элементы 'width' + 'padding'. Таким образом, div шириной 200 и отступом 20 будет иметь clientWidth = 240 (20 отступов слева и справа).

Однако основная причина, по которой можно вызвать clientWidth, как раз связана с возможными ожидаемыми расхождениями в результатах. Если вы знаете, что получите постоянную ширину и значение известно, то вызов clientWidth будет излишним...

person BGerrissen    schedule 03.08.2010

Эквивалентом offsetHeight и offsetWidth в jQuery является $(window).width(), $(window).height() Это не clientHeight и clientWidth

person Niels Steenbeek    schedule 25.02.2010

Element.clientWidth и Element.clientHeight возвращают высоту/ширину содержимого этого элемента в дополнение к любому применимому отступу.

Реализация jQuery: $(target).outerWidth() & $(target).outerHeight()

.clientWidth и .clientHeight включены в спецификацию модуля просмотра CSSOM, которая в настоящее время находится на стадии рабочего проекта. Хотя современные браузеры имеют согласованную реализацию этой спецификации, для обеспечения стабильной производительности на устаревших платформах следует по-прежнему использовать реализацию jQuery.

Дополнительная информация:

  • https://developer.mozilla[dot]org/en-US/docs/Web/API/Element.clientWidth
  • https://developer.mozilla[dot]org/en-US/docs/Web/API/Element.clientHeight
person Brice    schedule 19.03.2014

Что я сделал, чтобы исправить мою проблему с clientHeight, так это использовать clientHight элементов управления firstChild. Я использую IE 11 для печати меток из базы данных, и clientHeight, который работал в IE 8, возвращал высоту 0 в IE 11. Я нашел свойство в этом элементе управления, которое было указано как firstChild и имело свойство if clientHeight и фактически имело высота, которую я искал. Итак, если ваш элемент управления возвращает clientSize 0, взгляните на свойство его firstChild. Мне помогло...

person Lee Ann Davidson    schedule 10.02.2015

у меня была аналогичная проблема - firefox вернул правильное значение obj.clientHeight, но т.е. не вернул 0. Я изменил его на obj.offsetHeight и это сработало. Кажется, есть какое-то состояние, которое ie имеет для clientheight - это делает его сомнительным...

person Johnny Darvall    schedule 04.07.2010

Это может быть вызвано ошибкой блочной модели IE. Чтобы исправить это, вы можете использовать взлом блочной модели.

person Steve Harrison    schedule 07.05.2009

Еще немного информации об окне браузера: http://www.w3schools.com/js/js_window.asp?output=print

person Biranchi    schedule 15.09.2013