Проблема position:relative и dle_js.js в DLE 9.0-9.2
16.02
4
При вёрстке шаблонов для DLE я часто использую приём для размещения блоков на сайте с помощью position:relative; и position:absolute; - это очень удобный, семантически-правильный, валидный и т.д. способ решения сложных, на первый взгляд вариантов оформления.
12 541
Примером может служить тот же шаблон 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.
Кстати: Как долго сохраняется копия удаленной веб-страницы в поисковике?
Комментарии
Добавить комментарий
Комментировать могут только зарегистрированные пользователи