Удобный и быстрый баян-контрол на JS

Nov 01, 2010 14:49

Недавно сделал клевый контрол на JS, который заставляет один элемент контейнера  "всплывать" поверх остальных, пока над ним находится мышка.

http://screencast.com/t/jU3vwxBwY

Между элементами исходного контейнера нету пустого пространства и они занимают ровно всю площадь контейнера. Исходный контейнер менять нельзя.

Расскажу, как это сделать так, чтобы работало быстро и удобно.

Заводим поверх нашего контейнера 2 дополнительных прозрачных слоя: dummy-box и hover-box. Сами слои и их элементы позиционируем абсолютно.



dummy-box изначально пуст. Его размеры совпадают с размерами контейнера.

hover-box изначально заполняем элементами, соответствующими элементам исходного контейнера. Они расположены ровно над этими элементами и занимают ровно столько же места. Назовем их hover-area'ми.

Подписываемся на mouseover у всех hover-area. В обработчике события скрываем эту hover-area (display:none) и помещаем внутрь dummy-box'а точный клон элемента контейнера под мышкой (подмышкой?), и даем ему такой размер, чтобы его было видно целиком. Назовем его dummy-element.



Подписываемся на mouseleave у dummy-box. В обработчике события сбрасываем состояние системы. Сбрасываем состояние системы - значит удаляем dummy-element из dummy-box'а и возвращаем скрытую hover-area на место.

Замечания
  1. Самая долгая операция - создание dummy-element'а. Поэтому сложность работы алгоритма целиком зависит от сложности элементов контейнера.
  2. dummy-element можно всячески стилизовать. Я, например, залил фон белым цветом и обвел рамкой.
  3. Все поведение из элементов контейнера нужно дублировать на dummy-element.
  4. На iPad это работать не может физически, потому что там нет mouseover. Поэтому исходные обработчики событий элементов контейнера необходимо оставлять в живых.

javascript, Шаблоны, Школа программирования

Previous post Next post
Up