Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   Chrome, Safari и размер view-порта с абсолютно позиционируемыми элементами (https://javascript.ru/forum/css-html-browser/10343-chrome-safari-i-razmer-view-porta-s-absolyutno-pozicioniruemymi-ehlementami.html)

uonax 29.06.2010 16:03

Chrome, Safari и размер view-порта с абсолютно позиционируемыми элементами
 
Пытаюсь найти кроссбраузерное решение, позвояющее определить размеры view-порта.
Определил, что нужный результат дают значения
var Width=document.documentElement.scrollWidth;
var Height=document.documentElement.scrollHeight;

Этот способ всегда даёт корректный результат.

Но этот способ даёт сбой в браузерах GoogleChrome и Safari, когда на странице есть элементы со свойством position:absolute; Если задать для элемента свойство position:absolute; и с помощью top и left расположить элемент далеко влево или вправо (например, задав большие значения top=3000 и left=2000), то в этих браузерах view-порт не увеличивается. В других же браузерах, таких как IE, Firefox, Opera view-порт увеличится таким образом, что будет содержать в себе этот элемент.

Помогите найти кроссбраузерное решение, учитывающее этот случай. В разметке может возникнуть ситуация, когда элементы имеют позиционирование position:absolute;, а тогда в браузерах GoogleChrome и Safari мы получим совсем не тот размер view-порта.

Для примера я привожу html-код, с помощью которого я тестирую различные значения.

Код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="Content-Language" content="ru" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <title></title>
  <style type="text/css" media="all">

      * {padding:0; margin:0;}
      html, body, div, p, span, a, table, tbody, tr, td, label, img, ul, li, ol {border:0;}
        html {background-color:blue;}
        body {background-color:olive;}

    #the_image1
    {
          margin:5px;
          position:absolute;
          top:10px;
          left:950px;
    }

    #the_image2
    {
          margin:5px;
          position:absolute;
          top:1500px;
          left:1250px;
    }

    #the_image3
    {
          position:absolute;
          top:1400px;
          left:850px;
    }

  </style>

    <script type="text/javascript">

          function tipShow()
          {

                                var cX1=document.documentElement.scrollWidth;
                                var cY1=document.documentElement.scrollHeight;
                                var cX2=document.body.clientWidth;
                                var cY2=document.body.clientHeight;
                                var cX3=document.body.offsetWidth;
                                var cY3=document.body.offsetHeight;
                                var cX4=window.offsetHeight;
                                var cY4=window.offsetWidth;
                                alert("document.documentElement.scrollWidth/Height = " + cX1 + "x" + cY1 + " document.body.clientWidth/Height = " + cX2+ "x" + cY2 + " document.body.offsetWidth/Height = " + cX3 + "x" + cY3 + " window.offsetHeight/Width= " + cX4+ "x" + cY4 );

                }


    </script>
</head>
<body>

<br />
text
<br />
text
<br />
text


<img id="the_image1" onclick="tipShow();" width="100" src="1.gif" />

<img id="the_image2" onclick="tipShow();" width="100" src="1.gif" />

<img id="the_image3" onclick="tipShow();" width="100" src="1.gif" />

<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
<br />
text
</body>
</html>

Здесь элементы #the_image2 и #the_image3 абсолютно спозиционированы и визуально находятся вне тега body. В браузерах GoogleChrome и Safari view-порт с помощью document.documentElement.scrollWidth; и document.documentElement.scrollHeight; определяется неправильно.
Нормальное зачение view-порта в остальных браузерах составляет 1355х1588.

Kolyaj 29.06.2010 16:12

А вы сейчас что view-портом называете? Причём тут scrollWidth/scrollHeight?

uonax 29.06.2010 16:19

view-порт = вьюпорт из этой статьи:
http://javascript.ru/blog/Andrej-Par...enta-elementov

scrollWidth/scrollHeight - это просто условность, чтобы много не писать, а при появлении окна сразу можно было определить, какие переменные дают какие значения. Просто для теста нужно. Могу убрать из кода и ставить только
var cX1=document.documentElement.scrollWidth;
var cY1=document.documentElement.scrollHeight;

Kolyaj 29.06.2010 16:23

scroll* по логике должен дать размер документа, а не размер окна.

function getRootElement(doc) {
    doc = doc || document;
    return doc.compatMode == 'CSS1Compat' ? doc.documentElement : doc.body;
}

function getViewportSize(doc) {
    doc = doc || document;
    var elem = getRootElement(doc);
    return [elem.clientWidth, elem.clientHeight];
}

uonax 29.06.2010 16:26

А можно в контексте моего скрипта этот пример привести?
Хотелось бы иметь cX5 и cY5 слева, а вычисления справа, чтобы точно знать, что это ширина, а это высота вьюпорта.

Kolyaj 29.06.2010 16:28

В контекст вашего скрипта мне влезать не хотелось бы. :)

uonax 29.06.2010 16:33

Как из этих функций получить ширину и высоту вьюпорта? Что такое doc?

Kolyaj 29.06.2010 16:58

Цитата:

Сообщение от uonax
Как из этих функций получить ширину и высоту вьюпорта?

Вызвать их, очевидно.

Цитата:

Сообщение от uonax
Что такое doc?

document. Необязательный аргумент.

uonax 29.06.2010 19:25

Спасибо за приведённый пример. Хотя он считает не размер документа со скроллом, а просто размер окна браузера, в котором отображается документ, но мне это тоже пригодиться.

Я нашёл решение для GoogleChrom и Safari. корректные ширина и высота документа определяются так:
var cX4=document.body.scrollWidth;
var cY4=document.body.scrollHeight;

Для остальных браузеров так:
var cX1=document.documentElement.scrollWidth;
var cY1=document.documentElement.scrollHeight;

Kolyaj 29.06.2010 20:49

Цитата:

Сообщение от uonax
Хотя он считает не размер документа со скроллом, а просто размер окна браузера

viewport это и есть окно браузера.


Часовой пояс GMT +3, время: 14:40.