JavaScript. Подробное руководство, 6-е издание, стр. 217
В этом разделе рассказывается, как можно переходить от абстрактной, древовидной модели документа к геометрическому, основанному на системе координат визуальному представлению документа в окне броузера, и обратно. Свойства и методы, описываемые здесь, реализованы в броузерах достаточно давно (хотя есть некоторые, которые до недавнего времени присутствовали только в ІЕ, а некоторые не были реализованы в ІЕ до появления версии ІЕ9). К моменту написания этих строк они проходили процесс стандартизации консорциумом W3C в виде стандарта «CSSOM-View Module» ( http://www.w3.org/TR/cssom-view/).
15.8.1. Координаты документа и видимой области
Позиция элемента измеряется в пикселах. Координата X растет слева направо, а координата Y - сверху вниз. Однако существуют две точки, которые мы можем считать началом координат: координаты X и Y элемента могут отсчитываться относительно верхнего левого угла документа или относительно верхнего левого угла видимой области. Для окон верхнего уровня и вкладок «видимой областью» является часть окна броузера, в которой фактически отображается содержимое документа: в нее не входит обрамление окна (меню, панели инструментов, вкладки). Для документов, отображаемых во фреймах, видимой областью является элемент
<b><iframe></b>Если документ меньше видимой области или если он еще не прокручивался, верхний левый угол документа находится в верхнем левом углу видимой области, и начала систем координат документа и видимой области совпадают. Однако в общем случае, чтобы перейти от одной системы координат к другой, необходимо добавлять или вычитать смещения прокрутки. Например, если координата Y элемента имеет значение 200 пикселов в системе координат документа и пользователь прокрутил документ вниз на 75, то в системе координат видимой области координата Y элемента будет иметь значение 125 пикселов. Аналогично, если координата X элемента имеет значение 400 в системе координат видимой области и пользователь прокрутил документ по горизонтали на 200 пикселов, то в системе координат документа координата X элемента будет иметь значение 600.
Система координат документа является более фундаментальной, чем система координат видимой области, и на нее не оказывает влияния величина прокрутки. Однако в клиентских сценариях довольно часто используются координаты видимой области. Система координат документа используется при позиционировании элементов с помощью CSS (глава 16). Но проще всего получить координаты элемента в системе координат видимой области (раздел 15.8.2). Аналогично, когда регистрируется функция-обработчик событий от мыши, координаты указателя мыши передаются ей в системе координат видимой области.
Чтобы перейти от одной системы координат к другой, необходимо иметь возможность определять позиции полос прокрутки окна броузера. Во всех броузерах, кроме ІЕ версии 8 и ниже, эти значения можно узнать с помощью свойств
<b>pageXOffset</b><b>pageYOffset</b><b>Window</b><b>scrollLeft</b><b>scrollTop</b><b>document.documentElement</b><b><body></b><b>document.body</b>Пример 15.8. Получение позиций полос прокрутки окна
<b>// Возвращает текущие позиции полос прокрутки в виде свойств х и у объекта </b><b>function getScrollOffsets(w) {</b><b> // Использовать указанное окно или текущее,</b><b> // если функция вызвана без аргумента </b><b> w = w || window;</b><b> // Следующий способ работает во всех броузерах, кроме IE версии 8 и ниже </b><b> if (w.pageXOffset != null) </b><b> return {x:w.pageXOffset,</b><b> у:w.pageYOffset};</b><b> // Для IE (и других броузеров) в стандартном режиме </b><b> var d = w.document;</b><b> if (document.compatMode == "CSS1Compat") </b><b> return {x:d.documentElement.scrollLeft,</b><b> у:d.documentElement.scrollTop};</b><b> // Для броузеров в режиме совместимости</b><b> return { х:d.body.scrollLeft,</b><b> у:d.body.scrollTop };</b><b>}</b>Иногда бывает удобно иметь возможность определять размеры видимой области, например, чтобы определить, какая часть документа видима в настоящий момент. Как и в случае со смещениями прокрутки, самый простой способ узнать размеры видимой области не работает в IE версии 8 и ниже, а прием, который работает в IE, зависит от режима, в котором отображается документ. Пример 15.9 показывает, как переносимым способом определять размер видимой области. Обратите внимание на сходство программного кода этого примера с программным кодом в примере 15.8.
Пример 15.9. Получение размеров видимой области документа
<b>// Возвращает размеры видимой дбласти в виде свойств w и h объекта </b><b>function getViewportSize(w) {</b><b> // Использовать указанное окно или текущее, если функция вызвана без аргумента </b><b> w = w || window;</b><b> // Следующий способ работает во всех броузерах, кроме IE версии 8 и ниже </b><b> if (w.innerWidth != null)</b><b> return {w:w.innerWidth,</b><b> h:w.innerHeight};</b>