jsPlumb — визуализируем связи объектов на странице

jsPlumb — визуализируем связи объектов на странице

Привет всем,

Сегодня хотелось познакомить вас с одним замечательным скриптом, который позволяет визуально связывать различные объекты на сайтах. С его помощью удобно делать сетки турниров (в онлайн и офлайн играх), показывать иерархию или наследование. В общем, поле применения широко, как мне кажется.

Этот плагин для jQuery называется jsPlumb и с помощью <canvas> он умеет рисовать линии от одного элемента на странице до другого. Линии могут быть прямые или кривые. Им можно задавать цвета, размер и положение относительно блоков. 

Быстрое и качественное создание сайтов в Крыму, Симферополь.
Студия дизайна «WebDevelop»

Подключение скрипта

jsPlumb корректно работает во всех современных браузерах, а именно:

  • IE 6-8 на Windows XP;
  • Firefox 3.5.8+ на Windows XP;
  • Chrome;
  • Safari 4 (Windows XP и Mac OS X);
  • Opera 10.5 на Windows XP.

Для работы скрипта необходимы библиотеки jquery, jquery.ui.core и explorercanvas:

<script type="text/javascript" src="http://explorercanvas.googlecode.com/svn/trunk/excanvas.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
<script type="text/javascript" src="jquery.jsPlumb-1.0.1-min.js "></script>

Грузить их вы можете и со своего сервера — это как вам удобнее.

Свойства

Скрипт вызывается предельно просто — у него всего один обязательный параметр. Чтобы провести линию от объекта с id="block1" до элемента с id="sblock1", нужно написать вот так:

$("#block1").plumb({target: 'sblock2'});

В итоге вы получаете толстую красную линию между двумя объектами. Теперь давайте посмотрим, как можно настроить эту связь. Итак, у плагина есть следующие параметры.

Тип линии соединения (connector)

По умолчанию скрипт соединяет объекты кривыми Безье, но можно соединить и прямыми линиями:

connector: new jsPlumb.Connectors.Straight()
Место крипления линий (anchors)

У линии есть два конца, которыми она крепится к блокам. Для каждого из них можно задать положение относительно этого блока. Есть стандартные места крепления (jsPlumb.Anchors.BottomCenter, jsPlumb.Anchors.BottomLeft, jsPlumb.Anchors.BottomRight, jsPlumb.Anchors.TopCenter, jsPlumb.Anchors.TopLeft, jsPlumb.Anchors.TopRight, jsPlumb.Anchors.RightMiddle, jsPlumb.Anchors.LeftMiddle, jsPlumb.Anchors.Center) и собственные, у которых можно задавать процентное положение от верхнего левого угла объекта и направление линий:

anchors: [jsPlumb.Anchors.BottomCenter, jsPlumb.makeAnchor(0.75, 0, 0, -1)]
Стиль линии (paintStyle)

У линии можно задать ширины (lineWidth), цвет заливки (strokeStyle) или градиент (gradient). Вот так делается линия шириной 5 пикселов, начинающаяся с черного цвета, к середине перетекающая в красный и потом в белый:

paintStyle: {
gradient: {
stops: [[0, '#000'], [0.5, '#600'] [1, '#FFF']]
},
lineWidth: 5
}
Стиль крепления (endpoint, endpoints, endPointStyle и endPointStyles)

Крепление может быть квадратное (endpoint: new jsPlumb.Endpoints.Rectangle()) и круглое (по умолчанию). Для него можно задать цвет, размер и градиент. Вот так, например, получается первое квадратное крепление серого цвета 10 на 20, а второе — круглое радиусом 6 пикселов:

endpoints: [new jsPlumb.Endpoints.Rectangle(), new jsPlumb.Endpoints.Dot()],
endpointStyles: [{
gradient: { stops: [[0, '#CCC']] },
width: 10,
height: 20
}, {
gradient: { stops: [[0, '#007DDB']] },
radius: 6
}]

Ну вот, основные свойства мы рассмотрели. Остальные вы можете посмотреть в документации. Теперье переходим к методам.

Методы

Отключение связей

Для отключения связей между элементами существует несколько методов:

$("#block1").detach("sblock2"); // отключает связь между блоками block1 и sblock2
$("#block1").detachAll(); // отключает все связи блока block1
jsPlumb.detachEverything(); // отключает вообще все связи на странице
Скрытие и отображение связей

Связи элементов можно так же скрывать или показывать в нужный момент:

jsPlumb.hide("block1"); // скрывает все связи блока block1
jsPlumb.show("block1"); // показывает все связи блока block1
jsPlumb.toggle("block1"); // показывает/скрывает все связи блока block1
Перерисовка связей

При необходимости связи отдельного блок (jsPlumb.repaint()) или все связи на страницы (jsPlumb.repaintEverything()) можно перерисовать.

Пример работы

В дополнение к демонстрации на сайте автора, я сделал свой пример:

Смотреть демо

Если есть вопросы, пишите. Пока!

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 27

MyFreeWeb
explorercanvas — не обязательно.
Grin
MyFreeWeb, обязательно, если хотите, чтобы в IE работало.
juice
Спасибо за обзор, теперь буду иметь ввиду!
#
juice
Влад
Спасибо.

P. S.
В общем, поле применения широко, как мне кажется.
#
Влад
Sergey
Ребята! Вы меня почти каждый день радуете - только что-нибудь мне нужно - вы в ближайшее время публикуете материал, либо уже есть он у вас... Спасибо!
d1mmmk
черт, а мне пришлось месяц назад ручками все это писать для одного проекта…

спасибо что открыли мне глаза =)
Kykyryzo
офигенно, как раз исал нечто подобное, чтобы перелинковку страниц показывать
Lelik
Спасибо, хорошая статья)
Drafter1
О просто спасения для меня, я уже устал искать, а тут само появилось.Отлично
Семен
Ух, очень полезная информация. С трудом мог представить что такое возможно. Обязательно использую когда возникнет необходимость.
darya
Я искала в сети долго эту инфу и благодаря вам наконец-то нашла!
#
darya
recens
Огромное спасибо.
Буквально пару дней назад понадобилось подобное решение, и я уже собиралась писать свой велосипед. Теперь не буду :)
zorro
Четко, кратко и интересно описали все нюансы, спасибо. :) Вы правы, изобретать велосипед не обязательно.
#
zorro
romanko
минимум кода но красиво то как ))
Ден
красиво слов нет просто)
Motorstorm
romanko, да... мне тоже скрипт понравился:)
mrdc
в вашем примере, блоки после определённого колличества перетаскиваний собственно перетаскиваться и отказываются, что характерно - на сайте автора всё работает отлично.
но это мелкие придирки, а в целом - крутота
#
mrdc  
alexpts
А аналоги какие-то есть на js, кроме jsplumb для построения визуальных связей между элементами страницы?
alexpts
У меня что-то перетаскивания плохо работают при использовании .plumb()

Если просто .draggable(), то все ок таскается, а вот при использовании .plumb() очень плохо элементы перетасиваются. В чем может быть дело?
Роман
Информация для меня очень полезная, как для новичка. Спасибо за нее.
demm
alexpts,

такая же фигня :( .
Как исправить? Или вообще как выключить перетаскивание?
#
demm
Anton
никаких действий и связей нет никаких
#
Anton
Honers
Спасибо за статью! Для меня как для новичка очень полезная информация!
Alexss
Otlichniy sait! spasibo za poleznuy informaciy
Инна
Пример на сайте ваш не работает и скрипт не катит
#
Инна
Герман
Хорошая статья, молодец. Только демо-пример починить бы следовало ;)
bitrixdo
Недоступен файл http://jsplumb.googlecode.com/svn/trunk/js/jquery.jsPlumb-1.0.1-min.js хорошо бы поправить) Плагин крутой

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler