» » Проблема position:relative и dle_js.js в DLE 9.0-9.2

Проблема position:relative и dle_js.js в DLE 9.0-9.2

16.02
4
12 102
При вёрстке шаблонов для DLE я часто использую приём для размещения блоков на сайте с помощью position:relative; и position:absolute; - это очень удобный, семантически-правильный, валидный и т.д. способ решения сложных, на первый взгляд вариантов оформления.
Примером может служить тот же шаблон Turnion.
Но вот незадача: при использовании position: relative; для блоков, расположенных на странице (по расчётам браузера) ниже позиции top: 0px; (а это все блоки, кроме шапки) и являющихся родителем для комментариев, возникает очень неприятный "эффект" при добавлении, редактировании и удалении комментариев - страница прокручивается не до верха комментария, а до верха страницы.

А дело всё в том, что в DLE 9.2 в файле engine/classes/js/dle_js.js (для версии 9.0 это js_edit.js) есть функция scrollTop - это эффект прокрутки страницы до редактируемого, удаляемого или добавляемого комментария.
И функция эта использует для определения позиции текущего элемента функцию position(), которая получает значение позиции элемента top и left относительно отступов его предка., а так как у предка задано свойство position:relative; скрипт думает что его позиция top:0; left:0; и соответственно проматывает страницу в позицию top: 70; left: 0; что и даёт столь неприятный эффект прокрутки до начала страницы.

Я уже давно обещался заняться этой проблемой (когда даже толком и не знал чем она вызвана), и вот наконец, нашлось время.
Почитал документацию по jquery и легко нашёл альтернативную функцию определения позиции элемента - offset() - она получает текущие значения отступов относительно документа для первого элемента в наборе, что в нашем случаи более разумный подход, в принципе как и в любом другом.

Ну и подведя итог всему вышесказанному - инструкция по "излечению" этого бага будет выглядеть так:

- открываем engine/classes/js/dle_js.js (для версии 9.0 это js_edit.js) любым текстовым редактором (лучше notepad++);
- находим все вхождения position(), их будет 4 для DLE 9.2 (для DLE 9.0 - 3);
- заменяем все вхождения на offset();
- надеемся на то, что разработчики пофиксят эту проблему в новой версии DLE;

К сожалению, без правки кода движка эту проблему не решить никаким другим способом, кроме перевёрстки шаблона без использования position:relative.

P.S.

Кстати: Как долго сохраняется копия удаленной веб-страницы в поисковике?

Похожие материалы

Комментарии

Razario
Razario 16 февраля 2011 13:32
Разраб на форуме не соглашается с вашей позицией :)
a_lex
a_lex 17 февраля 2011 00:53
я в таких случаях ставлю отрицательный margin этому всплывающему блоку на определенных страницах
ПафНутиЙ
ПафНутиЙ 17 февраля 2011 07:02
Это не всегда удобно. Но собственно дело не в этом даже, дело в том, что целсофт навязывает верстальщикам своё мнение по поводу вёрстки, причём программно и считает, что это правильно.....
a_lex
a_lex 17 февраля 2011 12:17
ну да. достаточно было вынести блок для всплывающих окон в самый низ, чтобы он не зависел никак от верстки.. но думать - это не метод для целсофта

Добавить комментарий

Комментировать могут только зарегистрированные пользователи

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.