|
FamilyTree.JSбиблиотека для семейных деревьев |
|
| Онлайн: РИСОВАЛКИ | ИГРЫ | РЕЛАКС программы |
ВведениеFamilyTree.JS – это javascript-библиотека от болгарской компании BALKAN, с помощью которой строятся и отображаются на странице веб-браузера интерактивные генеалогические деревья. Данные дерева набиваются и хранятся в текстовом виде прямо в js-файле в структурированном виде, поддающемся для понимания даже не технарю. Есть предустановленные поля для данных, в том числе для фото, есть возможность создавать свои поля. В бесплатной версии библиотека позволяет создавать дерево с числом узлов до 200 и отображать его с помощью браузера на сайте или локальном компьютере. Платная версия позволяет пользователям сайта редактировать данные дерева прямо на странице дерева, т.е. это уже веб-приложение. ![]() БазаДвижком библиотеки является файл FamilyTree.js. Если его открыть в текстовом редакторе, то непосвященный ничего не поймет, тем более что код в нем минимизирован, т.е. все ненужные пробелы и переводы строк ликвидировны, а названия переменных состоят из одной буквы. Чтобы начать создание семейного дерева надо создать html-файл и в него прописать вызов FamilyTree.js. Например так: <script src="FamilyTree.js"></script>если скачали файл себе, или так: <script src="https://balkan.app/js/FamilyTree.js"></script>Далее вставляете на страницу блок <div id="tree"></div>- в нем будет отображаться контент. Затем пишите основной код: <script>
let family = new FamilyTree("#tree", {
nodeBinding: {
field_0: "name",
img: "img"
},
nodes: [
{ id: 1, pids: [2], name: "Елена Прекрасная", gender: "female" },
{ id: 2, pids: [1], name: "Иван Царевич", gender: "male" },
{ id: 3, mid: 1, fid: 2, name: "Василий Иванович", img: "pics/3-small-foto.jpg", gender: "male" }
]
});
</script>
Всё - первое дерево готово. Это быстрый старт.
Во многомерном массиве nodes в фигурных скобках прописаны объекты, являющиеся персонами в семейном дереве. Свойство id – это оригинальный идентификатор персоны, не может быть двух одинаковых. Свойство pids – это ссылка на id супруга (если их больше 1, то id в квадратных скобках разделять запятой). Свойства mid и fid – это ссылки на id мамы и папы. В свойстве gender указывается, мужчина это или женщина – в дереве у них карточки разных цветов. nodeBinding – это свойства персоны. В примере выше только два свойства "name" (имя) и "img" (фото для карточки). Можно добавлять поля по своему усмотрению, например, field_1: "life" (время жизни) – по умолчанию это поле будет отражено на карточке (узле) в дереве. Следующие поля field_2... в узле дерева не отобразятся, но отобразятся в расширенной карточке, которая открывается в правой области экрана после того, как пользователь кликнул по карточке в дереве. Можно принудительно отобразить поле field_2 и в маленькой карточке, если прописать ему до строки "let family = new FamilyTree..." свойства примерно так: FamilyTree.templates.tommy.field_2 = '<text class="field_2" style="font-size: 14px;" fill="#ffffff" x="25" y="70" text-anchor="middle">{val}</text>';
здесь x и y – это отступ блока в карточке слева и справа, fill – цвет текста, tommy - это тема дерева по умолчанию. Кстати, о темах – их есть несколько. Попробуйте еще hugo - м.б. больше понравится. Для этого после строки "let family = new FamilyTree..." прописать template:"hugo",.
ПоискПоиск по дереву довольно удобный. Искать можно как по всем возможным полям (по умолчанию), так и по отдельному полю. Если вместо поискового контекста задать знак вопроса, то будут выведены названия полей. Если задать поиск a формате "поле контекст", то будет найден контекст только в названном поле. Если задать "контекст_1 контекст_2", то будут найдены объекты, в поле которых есть встречаемость обоих контекстов, причем, не обязательно подряд. ЛайфхакиЧто мне не хватило из базовых встроенных возможностей библиотеки и какой я нашел выход: 1) Не хватило поля для более-менее объемной информации, в котором текст выводился бы на несколько строк, ориентируясь на ширину родительского блока. Это поле мне нужно для общей информации о персоне в свободном виде. Это поля я хотел видеть в расширенной карточке. Создать-то поле я создал, но оно выводилось в одну строку в html-элементе input. Тогда я решил на лету заменять этот элемент на textarea во время генерации расширенной карточки при клике на узел дерева. Сначала в файле index.htm в свойстве nodeBinding прописал новое поле info:"info", заполнил это поле в элементах массива nodes. Потом в конце скрипта дописал:
document.addEventListener('click', (event) => { // делегирование через document работает с динамическими элементами
const gElement = event.target.closest('g');
if (gElement) { // если клик по карточке (узлу)
const input = document.querySelector('input[data-binding="info"]'); // находим нужный input с данными поля info
const textarea = document.createElement('textarea');
Array.from(input.attributes).forEach(attr => {
textarea.setAttribute(attr.name, attr.value);
});
textarea.value = "\n"+input.value;
input.parentNode.replaceChild(textarea, input); // меняем input на textarea с сохранением параметров
textarea.cols = 48; textarea.rows = Math.ceil(textarea.value.length / textarea.cols) + 2; // назначаем кол-во строк
textarea.style.backgroundColor = "#252526";
textarea.style.color = "#CCF"; textarea.style.border = "0";
}
});
Здесь стоит заметить, что кол-во строк в textarea я назначал на лету исходя из длины текста, которое в нем должно поместиться.
2) Не хватило возможности просмотра больших фотографий по каждому человеку. В расширенной карточке вместо кнопки расшаривания сделал кнопку для просмотра большой фотки. Для этого после строки "let family = new FamilyTree..." прописал:
editForm: {
buttons: {
share: null, // Отключает кнопку "Поделиться"
pic: { icon: FamilyTree.icon.add(24,24,'#FF9'), text: "Фото" }, // Добавляю новую кнопку
},
},
Здесь add – это вариант иконки. Есть такие предустановленные варианты: edit, share, pdf, remove, happу, details, svg, png, excel, add, search, xml, link, sad, user, close, undo, redo, ft, addUser, son, wife, husband, mother, father, teddy. В скобках – размер в пикселах и цвет. Дописал функцию в конце скрипта:
family.editUI.on('button-click', function (sender, args) {
if (args.name == 'pic') {
var data = family.get(args.nodeId);
// Создаём затемнённый div на всё окно
const overlay = document.createElement('div');
overlay.style.position = 'fixed';
overlay.style.top = overlay.style.left = '0';
overlay.style.width = overlay.style.height = '100%';
overlay.style.backgroundColor = 'black';
overlay.style.opacity = '0.7';
overlay.style.zIndex = '99';
// Создаём картинку, которая будет поверх overlay (но не внутри него)
const img = document.createElement('img');
img.src = 'imgs/'+data.id+'_big_foto.jpg'; // путь к большой картинке, data.id - id персоны в имени файла
img.style.position = 'fixed';
img.style.zIndex = '100';
img.style.top = img.style.left = '50%';
img.style.transform = 'translate(-50%, -50%)';
img.style.maxWidth = img.style.maxHeight = '95%'; // для адаптивности, чтобы не вылезала за экран
img.style.objectFit = 'contain';
// Создаём кнопку вверху справа для успокоения пользователя
const button = document.createElement('button');
button.textContent = 'X';
button.style.position = 'fixed';
button.style.top = button.style.right = '25px';
button.style.zIndex = '1002';
button.style.padding = '10px 20px';
button.style.fontSize = '16px';
button.style.cursor = 'pointer';
button.style.backgroundColor = '#f44336';
button.style.color = 'white';
button.style.border = 'none';
button.style.borderRadius = '5px';
button.style.fontWeight = 'bold';
// Добавляем всё на страницу
document.body.appendChild(overlay);
document.body.appendChild(img);
document.body.appendChild(button);
// Функция удаления
const removeElements = () => {
overlay.remove();
img.remove();
button.remove();
};
// Вешаем событие на кнопку, а лучше на экран вне большой картинки
button.addEventListener('click', removeElements);
overlay.addEventListener('click', removeElements);
}
});
3) Захотелось немного кастомизировать поиск по дереву. Выше строки "let family = new FamilyTree..." я прописал переменные: FamilyTree.SEARCH_PLACEHOLDER = "Поиск:"; // название поля поиска FamilyTree.SEARCH_CLOSE_RESULT_ON_ESCAPE_OR_CLICKOUTSIDE = 1; // закрытие результатов поиска по любому месту вне результатов FamilyTree.SEARCH_RESULT_LIMIT = 16; // максимальное кол-во найденных карточекНазвания этих переменных я нашел в файле FamilyTree.js после того, как снял минимизацию кода с помощью плагина JSTool для Notepad++. 4) Потребовалась фокусировка на избранной персоне при старте дерева. Моё дерево разрослось и для удобства навигации по нему в движке предусмотрена кнопка на узле (три кружочка), по которой пользователь может раскрыть скрытую ветку. С одной стороны это удобно, с другой стороны моя желаемая для отображения ветка оказалась первоначально скрыта. Выход в следующей функции, которая пишется в конце скрипта: family.onInit(() => family.center(5));где 5 это id желаемого для старта человека. Анатолий Опарин, июнь 2026 Скачать, почитать
📥 Скачать FamilyTree.JS с сайта разработчика. Ещё обзоры для вебмастеров, расширяющие их технологический кругозор: • Памятка начинающему вебмастеру • Amazing Slider – программа для создания HTML5 слайдшоу, галерей, альбомов • Blumentals WeBuilder – удобнейший редактор кода с предпросмотром • Camtasia Studio – видеоредактор с экспортом в интерактивный HTML5 проигрыватель • GDevelop – игровой движок c редактором в вебе, на мобильных и ПК платформах • Google Web Designer – конструктор HTML5 баннеров и приложений • Flip PDF – конвертор PDF документов в HTML5 приложение • Hi Slider – программа для создания продвинутых jQuery слайдеров • Hippani Animator – удобная анимационная студия с экспортом в HTML, video, анимированный gif • Lunacy – для макетирования интернет-страниц • Moodle – практика администратора СДО • MediaWiki – как использовать для ведения и хранения документации • MediaWiki – как скачивать Wiki-страницы в PDF • MediaWiki – как подсвечивать синтаксис программного кода • Nicepage – конструктор сайтов и тем для CMS • Pinegrow – стильный визуальны конструктор сайтов • PowerPoint в HTML5 – обзор софта конвертации • RocketCake – лаконичный визуальный конструктор сайтов • Saola Animate – программа для быстрого и удобного создания анимации в HTML5 • Scratch – визуальный язык программирования и редактор кода • Sozi – программа для создания стильных HTML5 презентаций с перелетами между слайдами • SVG – как сделать анимацию линии (имитацию рисования) • Tilda – самый удобный онлайновый конструктор сайтов, плюсы и минусы • TimelineJS – библиотека для хронологических лент • TurboSite – лаконичный конструктор многостраничных сайтов • TurboWarp – продвинутый форк Scratch для создания HTML5 игр и приложений • WOW Slider – программа для создания красивых HTML5 слайдеров • WYSIWYG Web Builder – мощный визуальный конструктор сайтов • Yonote – веб-сервис для организации базы знаний • HTTP – коротко о протоколе • OpenAPI – спецификация, визуализация, инструментарий • Визуально-блочные среды программирования и моделирования – обзор • Инструменты для создания прототипов интернет-страниц: Axure и ProtoShare • Что нужно знать об электронных платежах вебмастеру интернет-магазина • Как создать интерактивный кроссворд на сайте? • Как работать с Flash в современное время • Спецсимволы HTML – коды около 2000 дизайнерских иконок • 150 нейросетей – категоризированный список со ссылками |
|
|
|
|
|
|