Получение неправильной высоты окна в Chrome

#javascript #jquery

#javascript #jquery

Вопрос:

Я пытаюсь получить правильную ширину и высоту окна браузера в Chrome. Размер правильный в Firefox, я не пробовал никаких других браузеров.

Я установил для doctype значение !DOCTYPE html и попробовал $( window ).height() , $( window ).width() , window.innerHeight и window.innerWidth , но все они дают неправильные значения.

Я использую openSUSE tumbleweed, а версия chrome — «Версия 86.0.4240.75 (официальная сборка) (64-разрядная версия)»

Обновлен Chrome до «Версии 87.0.4280.88 (официальная сборка) (64-разрядная версия)» это тоже не помогло, по-прежнему неправильный размер.

Я включил пару изображений, которые показывают это, ОБРАТИТЕ ВНИМАНИЕ: значения DOMRect неверны в Chrome, но верны в firefox. Извините, вам может потребоваться увеличить масштаб, чтобы увидеть значения. Ниже приведено то, что я регистрирую в двух изображениях.

 console.log(
    $('#primary')[0].getBoundingClientRect(),
    $( window ).width(),
    window.innerWidth,
    $( window ).height(),
    window.innerHeight
)
 

Мне нужны точные размеры, чтобы все было правильно выстроено. Вы можете видеть на изображении firefox ниже цвет фона «красный» чуть выше горизонтальной полосы прокрутки. Мне нужно знать правильные размеры окна
, чтобы я мог посчитать и выстроить все в ряд.

Есть ли другой более точный способ сделать это?

 Неправильный размер в chrome.

Правильный размер в firefox

Изображение ниже — это то, что я получил из JSFiddle, предложенного в комментарии ниже формы «FSDford». Вы можете увидеть в консоли размер 877 красным цветом «нужно увеличить, чтобы увидеть это». Линейка говорит, что ее ширина равна 856! И снова Firefox имеет правильную ширину.

JSFiddle неправильный размер

JSFiddle правильный размер

Комментарии:

1. Какое значение для ширины вы получаете здесь? jsfiddle.net/Rino_Raj/m2xn6ue7

2. Я сделал, как было предложено, изображение выше — это мои результаты.

3. Просто выстрел в темноте: сколько вы получаете за ширину полосы прокрутки здесь: jdsharp.us/jQuery/minute/calculate-scrollbar-width.php

4. @DanielHuckson ширина страницы может быть уменьшена из-за заполнения. Вы можете попробовать установить box-sizing: border-box; для тегов html и body в CSS. Не забудьте установить отступы и поля как в html, так и в теле на 0 пикселей, поскольку по умолчанию они имеют отступы.

5. Каков вычисляемый размер окна в инспекторе css?

Ответ №1:

Я поддерживаю библиотеку под названием iframe-resizer, которая изменяет размеры фреймов в соответствии с их содержимым, поэтому я потратил несколько лет на поиски наилучшего решения этой проблемы.

Простой ответ заключается в том, что если ваш CSS приводит к переполнению body элемента контентом, он становится сложным и ненадежным.

Моя библиотека предлагает несколько различных методов для решения этой проблемы, и они предлагают разные компромиссы.

Для начала браузер предлагает четыре разных значения высоты и ширины, и они часто дают разные ответы

 document.body.offsetHeight
document.body.scrollHeight
document.documentElement.offsetHeight
document.documentElement.scrollHeight
 

Вы можете найти одну из этих работ для вас, или вы можете прочитать все четыре и использовать наибольшее значение.

Если это не сработает, мы можем получить лучшее значение методом перебора, получив нижнюю позицию каждого элемента на странице и вычисляя наименьшее значение.

  function getAbsoluteHeight() {
   var allElements = document.querySelectorAll('body *')
   var maxBottomVal = 0

   Array.prototype.forEach.call(allElements, function(el) {
     var styles = window.getComputedStyle(el)
     var marginBottom = 0

     if (styles.marginBottom amp;amp; !isNaN(parseInt(styles.marginBottom), 10)) {
        marginBottom = parseInt(styles.marginBottom, 10)
     }

     var posBottom = el.getBoundingClientRect().bottom
     var elBottom = marginBottom   posBottom

     if (elBottom > maxBottomVal) {
        maxBottomVal = elBottom
     }
   })

   return Math.ceil(maxBottomVal)
}
 

Очевидно, что это связано с некоторыми накладными расходами, если вам приходится перепроверять его каждый раз, когда изменяется содержимое страницы или изменяется размер окна. Если вы знаете, какие элементы, вероятно, находятся внизу страницы, вы можете пометить их data-height атрибутом, а затем проверить положение этого элемента с добавлением к нему.

Хотя я говорил здесь только о высоте, все также будет работать с шириной.

Комментарии:

1. Мне это нравится. Даже если это не идеально, это может быть лучшим способом, если вы не возражаете против излишеств.

Ответ №2:

я не думаю, что вам нужен jQuery, чтобы получить ширину окна браузера, просто попробуйте использовать window.innerWidth using native javascript.

Комментарии:

1. Я попробовал window.innerWidth, и я все еще получаю неправильное значение в chrome. Вот css. table. tbody страницы { ширина: 100%; высота: 100%; поле: 0 !важно заполнение: 0 !важно расположение таблицы: исправлено; }

2. я только что попробовал и все сработало нормально, попробуйте записать результат в html-элементе вместо консоли, просто чтобы посмотреть, получите ли вы другой результат … об этом есть документация: viralpatel.net/jquery-window-height-incorrect

3. Я тоже это сделал, и значения те же.

Ответ №3:

Это должно работать для Firefox, Chrome и любого другого браузера.

 var width = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;

var height = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight;
 

Комментарии:

1. Нет, это тоже не сработало. Должно быть, ошибка в openSUSE Tumbleweed версии Chrome. Я не могу придумать ничего другого, что могло бы быть.

2. Не удивлен. Это было проблемой на протяжении десятилетий.