当前位置:首页 > JavaScript

js点击实现元素互换

2026-01-31 04:19:40JavaScript

实现元素互换的 JavaScript 方法

通过 JavaScript 实现点击元素后互换位置,可以结合 DOM 操作和事件监听。以下是几种常见方法:

交换 HTML 元素内容

适用于简单元素内容交换,保留原 DOM 节点:

document.querySelectorAll('.swap-item').forEach(item => {
  item.addEventListener('click', function() {
    const sibling = this.nextElementSibling;
    if (sibling && sibling.classList.contains('swap-item')) {
      const temp = this.innerHTML;
      this.innerHTML = sibling.innerHTML;
      sibling.innerHTML = temp;
    }
  });
});

交换 DOM 节点位置

直接修改节点在 DOM 树中的位置:

function swapNodes(node1, node2) {
  const parent = node1.parentNode;
  const ref = node2.nextSibling;
  parent.insertBefore(node2, node1);
  if (ref) {
    parent.insertBefore(node1, ref);
  } else {
    parent.appendChild(node1);
  }
}

document.querySelector('.container').addEventListener('click', (e) => {
  if (e.target.classList.contains('swap-target')) {
    const next = e.target.nextElementSibling;
    if (next && next.classList.contains('swap-target')) {
      swapNodes(e.target, next);
    }
  }
});

使用 CSS 动画增强交互

添加过渡效果使交换更平滑:

.swappable {
  transition: transform 0.3s ease;
}
function animatedSwap(el1, el2) {
  const rect1 = el1.getBoundingClientRect();
  const rect2 = el2.getBoundingClientRect();

  el1.style.transform = `translate(${rect2.left - rect1.left}px, ${rect2.top - rect1.top}px)`;
  el2.style.transform = `translate(${rect1.left - rect2.left}px, ${rect1.top - rect2.top}px)`;

  setTimeout(() => {
    el1.style.transform = '';
    el2.style.transform = '';
    swapNodes(el1, el2);
  }, 300);
}

实现注意事项

  • 事件委托更适合动态生成的元素
  • 考虑边界情况(如无相邻元素时)
  • 移动端需要添加 touch 事件支持
  • 复杂结构建议使用数据驱动方式(如通过框架)

扩展方案

对于列表重排序需求,可以结合数据数组操作:

js点击实现元素互换

let itemsArray = [...document.querySelectorAll('.list-item')];

function reorderItems(index1, index2) {
  [itemsArray[index1], itemsArray[index2]] = [itemsArray[index2], itemsArray[index1]];
  renderList();
}

function renderList() {
  const container = document.querySelector('.list-container');
  container.innerHTML = '';
  itemsArray.forEach(item => container.appendChild(item));
}

标签: 元素js
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…