【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);
}
效果
完成改装后的拖曳