【ChatGpt】解决视频框交换中的平滑过渡的问题
- 问题
 - 抽象
 - chatgpt 看看直接给参考代码
 
- 解决
 - 效果
 
问题
在视频的播放中,我们想调换下容器的位置 ,在互调的过程中,如果需要重新进行数据的初始化,获取与加载,就会很慢,效果不好。
没有整改前的拖曳,有严重的加载缓慢,不丝滑
抽象
这个问题,直接抽象一下,就是一个div与另一个div交换,而不影响里面具体内容的播放。
chatgpt 看看直接给参考代码

 代码肯定明显会有一定的问题,但大体逻辑是对的
<div class="container">
  <div class="box" draggable="true"></div>
  <div class="box" draggable="true"></div>
</div>
 
.container {
  display: flex;
  justify-content: center;
}
.box {
  width: 100px;
  height: 100px;
  background-color: red;
  margin: 10px;
}
 
const boxes = document.querySelectorAll('.box');
let dragBox = null;
boxes.forEach(box => {
  box.addEventListener('dragstart', () => {
    dragBox = box;
  });
  box.addEventListener('dragover', e => {
    e.preventDefault();
  });
  box.addEventListener('drop', () => {
    if (dragBox !== box) {
      const dragBoxIndex = Array.from(boxes).indexOf(dragBox);
      const boxIndex = Array.from(boxes).indexOf(box);
      if (dragBoxIndex < boxIndex) {
        box.parentNode.insertBefore(dragBox, box.nextSibling);
      } else {
        box.parentNode.insertBefore(dragBox, box);
      }
    }
  });
});```
 
代码解释:
获取所有的box元素,并为每个元素添加拖拽事件监听。
 当拖拽开始时,将当前拖拽的box元素保存到dragBox变量中。
 当box元素拖拽到其他元素上时,阻止默认行为。
 当box元素被拖放时,如果当前拖拽的box元素不等于目标元素,则交换两个box元素的位置。使用insertBefore方法将dragBox插入到box元素前或后,具体位置根据它们在容器中的位置决定。
我们读懂后,整改下
```html
<!DOCTYPE html>
<html>
<head>
  <title>drag room</title>
</head>
<body>
<div class="container">
  <div class="box" draggable="true">111</div>
  <div class="box" draggable="true">2222</div>
  <div class="box" draggable="true">3333</div>
</div>
  <script>
   
const boxes = document.querySelectorAll('.box');
let dragBox = null;
boxes.forEach(box => {
  box.addEventListener('dragstart', () => {
    dragBox = box;
  });
  box.addEventListener('dragover', e => {
    e.preventDefault();
  });
  box.addEventListener('drop', () => {
    if (dragBox !== box) {
      const dragBoxIndex = Array.from(boxes).indexOf(dragBox);
	  console.log("dragboxindex is :" , dragBoxIndex);
      const boxIndex = Array.from(boxes).indexOf(box);
	  console.log("boxIndex is :" , boxIndex);
	  var dragBoxNext= dragBox.nextSibling;
	  var boxNext = box.nextSibling;
	  box.parentNode.insertBefore(dragBox, boxNext);
	  box.parentNode.insertBefore(box, dragBoxNext);
  //    if (dragBoxIndex < boxIndex) {
  //      box.parentNode.insertBefore(dragBox, box.nextSibling);
   //   } else {
   //     box.parentNode.insertBefore(dragBox, box);
   //   }
	  
    }
  });
});
  </script>
  <style>
   .container {
  display: flex;
  justify-content: center;
}
.box {
  width: 100px;
  height: 100px;
  background-color: red;
  margin: 10px;
}
  </style>
</body>
</html>
 

解决
  const dragItem = document.getElementById("playBox" + dragIndex) as HTMLElement;
        const targetItem = document.getElementById("playBox" + index) as HTMLElement;
        const dragBoxNext= dragItem.nextSibling;
	      var boxNext = targetItem.nextSibling;
        if(targetItem.parentNode){
	      targetItem.parentNode.insertBefore(dragItem, boxNext);
	      targetItem.parentNode.insertBefore(targetItem, dragBoxNext);
        }
 

效果
完成改装后的拖曳



















