Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.06.2010, 16:03
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

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.
Ответить с цитированием
  #2 (permalink)  
Старый 29.06.2010, 16:12
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

А вы сейчас что view-портом называете? Причём тут scrollWidth/scrollHeight?
Ответить с цитированием
  #3 (permalink)  
Старый 29.06.2010, 16:19
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

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

scrollWidth/scrollHeight - это просто условность, чтобы много не писать, а при появлении окна сразу можно было определить, какие переменные дают какие значения. Просто для теста нужно. Могу убрать из кода и ставить только
var cX1=document.documentElement.scrollWidth;
var cY1=document.documentElement.scrollHeight;
Ответить с цитированием
  #4 (permalink)  
Старый 29.06.2010, 16:23
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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];
}
Ответить с цитированием
  #5 (permalink)  
Старый 29.06.2010, 16:26
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

А можно в контексте моего скрипта этот пример привести?
Хотелось бы иметь cX5 и cY5 слева, а вычисления справа, чтобы точно знать, что это ширина, а это высота вьюпорта.
Ответить с цитированием
  #6 (permalink)  
Старый 29.06.2010, 16:28
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

В контекст вашего скрипта мне влезать не хотелось бы.
Ответить с цитированием
  #7 (permalink)  
Старый 29.06.2010, 16:33
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

Как из этих функций получить ширину и высоту вьюпорта? Что такое doc?
Ответить с цитированием
  #8 (permalink)  
Старый 29.06.2010, 16:58
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Сообщение от uonax
Что такое doc?
document. Необязательный аргумент.
Ответить с цитированием
  #9 (permalink)  
Старый 29.06.2010, 19:25
Аспирант
Отправить личное сообщение для uonax Посмотреть профиль Найти все сообщения от uonax
 
Регистрация: 13.07.2009
Сообщений: 38

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

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

Для остальных браузеров так:
var cX1=document.documentElement.scrollWidth;
var cY1=document.documentElement.scrollHeight;
Ответить с цитированием
  #10 (permalink)  
Старый 29.06.2010, 20:49
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от uonax
Хотя он считает не размер документа со скроллом, а просто размер окна браузера
viewport это и есть окно браузера.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск