Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   DnD Tree смещение ноды с помощью мыши лево право (https://javascript.ru/forum/dom-window/82654-dnd-tree-smeshhenie-nody-s-pomoshhyu-myshi-levo-pravo.html)

jabbascript 06.06.2021 19:44

DnD Tree смещение ноды с помощью мыши лево право
 
Вложений: 1
Здравствуйте!!!
Решил я освоить драг энд дроп и начал пилить дерево в котором можно менять ноды с помощью драг энд дропа. Худо бедно сделал. А потом увидел один плагин где вложенность ноды меняется если элемент перемещать влево право, но как это реализовать идей пока нет. Может кто встречался или есть какие идеи?
Вложение 4605

сам плагин https://dbushell.github.io/Nestable/

моя реализация tree dnd (сырая мне пока главное идею понять)
https://codesandbox.io/s/amazing-wav...AndDropTree.js

jabbascript 12.06.2021 16:59

Сделал упрощенный на ванильном js вариант.
Пока единственный вариант видится в блоке проверки на движение в лево или право, но тут уже начинаются
заморочки с dom и действиями над ним. Пока вопрос открыт и не совсем ясно как менять вложенность элементов при движении его влево/право.
if (prevX > e.pageX) {
    console.log("dragged left");
  } else if (prevX + 40 < e.pageX) {
    console.log("dragged right");
  }

ссылка на песочницу https://codesandbox.io/s/vibrant-dre...le=/index.html

const tasksListElement = document.querySelectorAll(`.tasks-tree__list`);
const taskElements = document.querySelectorAll(`.tasks-tree__item`);
 
// link example [url]https://frontend-collective.github.io/react-sortable-tree/?path=/story/basics--treedata-import-export[/url]
// link example [url]https://dbushell.github.io/Nestable/[/url]
 
for (const task of taskElements) {
  task.draggable = true;
}
 
const onDragStart = (e) => {
  e.stopPropagation();
  e.target.classList.add(`selected`);
};
 
const onDragEnd = (e) => {
  e.stopPropagation();
  e.target.classList.remove(`selected`);
};
 
let prevX = -1;
const onDragOver = (e) => {
  e.preventDefault();
  e.stopPropagation();
 
  const selectedElement = document.querySelector(`.selected`);
  const currentHoveredElement = e.target;
 
  if (prevX == -1) {
    prevX = e.pageX;
    return false;
  }
 
  const isMoveable = currentHoveredElement.classList.contains(
    `tasks-tree__item`
  );
 
  if (!isMoveable) {
    return;
  }
 
  if (prevX > e.pageX) {
    console.log("dragged left");
  } else if (prevX + 40 < e.pageX) {
    console.log("dragged right");
  }
 
  const nextElement =
    currentHoveredElement === selectedElement?.nextElementSibling
      ? currentHoveredElement?.nextElementSibling
      : currentHoveredElement;
 
  currentHoveredElement?.parentNode.insertBefore(selectedElement, nextElement);
};
 
taskElements.forEach((el) => {
  el.addEventListener(`dragstart`, onDragStart);
  el.addEventListener(`dragover`, (e) => onDragOver(e));
  el.addEventListener(`dragend`, (e) => onDragEnd(e));
});




<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./style.css">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <section class="tasks">
          <ul class="tasks-tree__list">
            <li class="tasks-tree__item"><div>Item 1</div></li>
            <li class="tasks-tree__item"><div>Item 2</div></li>
            <li class="tasks-tree__item"><div>Item 3</div></li>
            <li class="tasks-tree__item"><div>Item 4</div></li>
            <li class="tasks-tree__item"><div>Item 5</div></li>
            <li class="tasks-tree__item">
                <div>Item 6</div>
                <ul class="tasks-tree__list">
                    <li class="tasks-tree__item"><div>Item 1-2</div></li>
                    <li class="tasks-tree__item"><div>Item 2-2</div></li>
                    <li class="tasks-tree__item"><div>Item 3-2</div></li>
                    <li class="tasks-tree__item">
                        <div>Item 4-2</div>
                        <ul class="tasks-tree__list">
                            <li class="tasks-tree__item"><div>Item 1-3</div></li>
                            <li class="tasks-tree__item"><div>Item 2-3</div></li>
                            <li class="tasks-tree__item"><div>Item 3-3</div></li>
                            <li class="tasks-tree__item"><div>Item 4-3</div></li>
                        </ul>
                    </li>
                </ul>
            </li>
          </ul>
        </section>
    </div>
    <script src="./todo-tree.js" type="module"></script>
</body>
</html>


<style>
html, body {
    margin: 0;
    padding: 0;
  }
  
  body {
    font-family: "Tahoma", sans-serif;
    font-size: 18px;
    line-height: 25px;
    color: #164a44;
    
    background-color: #b2d9d0;
  }
  
  .container {
    display: flex;
    justify-content: center;
  }
  
  .tasks__title {
    margin: 50px 0 20px 0;
    
    text-align: center;
    text-transform: uppercase;
  }
  
  .tasks__list {
    margin: 0;
    padding: 0;
    
    list-style: none;
  }
  
  .tasks__item {
    max-width: 250px;
    margin-bottom: 10px;
    padding: 5px;
    
    text-align: center;
    border: 2px dashed #b2d9d0;
    border-radius: 10px;
    cursor: move;
    background-color: #dff2ef;
  
    transition: background-color 0.5s;
  }
  
  .tasks__item:last-child {
    margin-bottom: 0;
  }
  
  .selected {
    opacity: 0.6;
  }
 
  .tasks-tree__list {
 
    margin-top: 16px;
    list-style: none;
  }
 
  .tasks-tree__item {
    max-width: 250px;
    margin-bottom: 10px;
    padding: 5px;
    
    /* text-align: center; */
    /* border: 2px dashed #b2d9d0; */
    /* border-radius: 10px; */
    cursor: move;
    /* background-color: #dff2ef; */
  
    transition: background-color 0.5s;
  }
 
  .tasks-tree__item div{
    background-color: #dff2ef;
    border: 2px dashed #b2d9d0;
  }
</style>


Часовой пояс GMT +3, время: 22:34.