JavaScript. Подробное руководство, 6-е издание, стр. 262

Он также включает дополнительную проверку на будущее, чтобы не использовать событие «DOMMouseScroll», если Firefox начнет использовать событие «wheel» или «mousewheel». Обратите внимание, что пример 17.3 также является практическим примером управления геометрией элементов и использования приемов позиционирования средствами CSS, о которых рассказывалось в разделах 15.8 и 16.2.1.

Пример 17.3. Обработка событий «mousewheel»

<b>// Заключает элемент содержимого в фрейм, или видимую область заданной ширины</b>

<b>// и высоты (минимальные размеры 50x50). Необязательные аргументы contentX </b>

<b>// и contentY определяют начальное смещение содержимого относительно кадра.</b>

<b>// (Их значения должны быть &lt;= 0.) Фрейму придается обработчик события mousewheel,</b>

<b>// который позволяет пользователю прокручивать элемент и изменять размеры фрейма, </b>

<b>function enclose(content, framewidth, frameheight, contentX, contentY) {</b>

<b>  // Эти аргументы являются не только начальными значениями: они хранят информацию</b>

<b>  // о текущем состоянии, изменяются и используются обработчиком события mousewheel.</b>

<b>  framewidth = Math.max(framewidth, 50);</b>

<b>  frameheight = Math.max(frameheight, 50);</b>

<b>  contentX = Math.min(contentX, 0) || 0;</b>

<b>  contentY = Math.min(contentY, 0) || 0;</b>

<b>  // Создать фрейм и определить для него стили и имя класса CSS </b>

<b>  var frame = document.createElement(&quot;div&quot;);</b>

<b>  frame.className = &quot;enclosure&quot;; // Благодаря этому можно определять стили</b>

<b>                                 // в таблицах стилей</b>

<b>  frame.style.width = framewidth + &quot;px&quot;; // Установить размеры фрейма,</b>

<b>  frame.style.height = frameheight + &quot;px&quot;;</b>

<b>  frame.style.overflow = &quot;hidden&quot;; // Без полос прокрутки</b>

<b>  frame.style.boxSizing = &quot;border-box&quot;; // модель border-box упрощает</b>

<b>  frame.style.webkitBoxSizing = &quot;border-box&quot;; // вычисление новых размеров </b>

<b>  frame.style.MozBoxSizing = &quot;border-box&quot;; // фрейма.</b>

<b>  // Добавить фрейм в документ и поместить в него элемент elt.</b>

<b>  content.parentNode.insertBefore(frame, content);</b>

<b>  frame.appendChild(content);</b>

<b>  // Координаты элемента относительно фрейма</b>

<b>  content.style.position = &quot;relative&quot;;</b>

<b>  content.style.left = contentX + &quot;px&quot;;</b>

<b>  content.style.top = contentY + &quot;px&quot;;</b>

<b>  // Необходимо решить некоторые проблемы совместимости броузеров</b>

<b>  var isMacWebkit = (navigator.userAgent.index0f(&quot;Macintosh&quot;) !== -1 &amp;&amp;</b>

<b> navigator.userAgent.index0f(&quot;WebKit&quot;) !== -1);</b>

<b>  var isFirefox = (navigator.userAgent.index0f(&quot;Gecko&quot;) !== -1);</b>

<b>  // Зарегистрировать обработчики событий mousewheel.</b>

<b>  frame.onwheel = wheelHandler; // Для будущих броузеров</b>

<b>  frame.onmousewheel = wheelHandler; // Для большинства текущих броузеров</b>

<b>  if (isFirefox) // Только Firefox</b>

<b>    frame.addEventListener(&quot;DOMMouseScroll&quot;, wheelHandler, false);</b>

<b>  function wheelHandler(event) {</b>

<b>    var e = event || window.event; // Объект события, стандартный или IE</b>

<b>    // Получить величину прокрутки из объекта события, проверив свойства объекта</b>

<b>    // события wheel, mousewheel (в обоих, 2-мерном и 1-мерном вариантах)</b>

<b>    // и DOMMouseScroll в Firefox.Масштабировать значение так, чтобы один «щелчок»</b>

<b>    // колесика соответствовал 30 пикселам. Если какой-либо из броузеров в будущем</b>

<b>    // будет возбуждать оба типа событий, &quot;wheel&quot; и &quot;mousewheel&quot;, одно и то же</b>

<b>    // событие будет обрабатываться дважды. Но будем надеяться, что отмена</b>

<b>    // события wheel будет предотвращать возбуждение события mousewheel.</b>

<b>    var deltaX = e.deltaX*-30 || // событие wheel</b>

<b>    e.wheelDeltaX/4 || //mousewheel</b>

<b>                    0; // свойство не определено</b>

<b>    var deltaY = e.deltaY*-30 || // событие wheel</b>

<b>              e.wheelDeltaY/4 || // событие mousewheel в Webkit</b>

<b>       (e.wheelDeltaY===undefined &amp;&amp; // Если нет 2-мерного свойства,</b>

<b>                  e.wheelDelta/4) || // использовать 1-мерное свойство</b>

<b>                    e.detail*-10 ||  // событие DOMMouseScroll в Firefox</b>