В этот раз я покажу пример небольшого скрипта, позволяющего перемещать HTML блоки на странице.
Когда возникает подобная задача, первое что приходит в голову (по крайней мере мне 😉 ) – использовать готовые плагины. Например, jQuery Sortable. Что ни говори, решение довольно удобное, от пользователя требуется только перетащить объект с помощью мышки.
Но тут есть один недостаток. Если размеры блоков, которые нужно перемещать достаточно большие (например, больше половины высоты окна браузера), то пользоваться такими плагинами становится не удобно.
В такой ситуации, на мой взгляд, лучше добавить к каждому блоку ссылки «Вверх» и «Вниз» с помощью которых и будет выполняться перемещение блоков.
Именно такой вариант мы рассмотрим в этой статье.
Посмотреть результат можно на демонстрационной страничке
Demo
И, если есть желание, можете скачать архив с исходниками.
SourceНачнём с разметки страницы
Чтобы сделать блоки достаточно большими я просто разместил в них картинки, точнее в данном случае каждая картинка представляет собой отдельный блок.
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Перемещение блоков с помощью JS</title> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body> <div id="images"> <img src="images/1t.jpg" alt="картинка 1" /> <img src="images/2t.jpg" alt="картинка 2" /> <img src="images/3t.jpg" alt="картинка 3" /> </div> <script src="http://yandex.st/jquery/1.4.4/jquery.js"></script> <script src="main.js"></script> </body> </html>
Как видите, разметка предельно простая. На странице находятся три картинки и подключены два JS файла (библиотека jQuery
и наш скрипт main.js
, с кодом для перемещения блоков).
Обратите внимание, я не вставлял ссылки «Вверх», «Вниз» на страницу. Перемещение блоков выполняется с помощью JavaScript, поэтому если у пользователя отключена поддержка JS, то и ссылки видеть ему не нужно.
Теперь рассмотрим перемещение блоков
Скрипт main.js.
$(function() { var images = $('img'); images.wrap('<div class="controls" />'); $('<a class="down" href="#">Вниз</a>').insertAfter(images); $('<a class="up" href="#">Вверх</a>').insertAfter(images); $('.up').click(function() { var currentImgBlock = $(this).parent(); var prevImgBlock = currentImgBlock.prev(); swap(currentImgBlock, prevImgBlock); return false; }); $('.down').click(function() { var currentImgBlock = $(this).parent(); var nextImgBlock = currentImgBlock.next(); swap(nextImgBlock, currentImgBlock); return false; }); }); function swap(a, b) { if (a.size() > 0 && b.size() > 0) { a.insertBefore(b); } }
Прежде всего, необходимо добавить ссылки. И, чтобы было удобнее выполнять перемещение, вокруг каждого изображения создадим div
и ссылки будем добавлять в него.
Все эти операции выполняются с помощью четырёх строк кода (строки 2-5). В результате для каждого получим такую разметку.
<div class="controls"> <img alt="картинка 1" src="images/1t.jpg"> <a href="#" class="up">Вверх</a> <a href="#" class="down">Вниз</a> </div>
Теперь назначаем обработчики для ссылок «Вверх» и «Вниз».
Код этих обработчиков практически одинаков, за исключением того, что при клике по ссылке «Вверх» мы должны получить текущий блок (в котором находится ссылка) и предыдущий, а при клике по ссылке «Вниз» — текущий и следующий.
После этого, передаём эти блоки функции swap, которая и выполняет их перемещение. Обратите внимание, что порядок в котором передаются блоки важен. Функция использует метод insertBefore
, поэтому первым необходимо передавать блок, который должен оказаться выше.
Как видите, ничего сложного. Наверное, имеет смысл при клике по ссылке запускать какую-нибудь анимацию, чтобы было видно направление перемещения, но это тема отдельной статьи.
Если есть вопросы, замечания или советы, пишите. Буду рад обсудить!
Успехов!