当前位置:首页 > JavaScript

js实现积木

2026-02-01 07:05:53JavaScript

以下是使用JavaScript实现积木效果的几种方法,涵盖基础布局、交互逻辑和动画效果:

基础积木布局

使用HTML和CSS创建积木的基本结构,通过JavaScript动态生成积木元素:

// 创建积木容器
const container = document.createElement('div');
container.className = 'block-container';
document.body.appendChild(container);

// 生成彩色积木
const colors = ['#FF5733', '#33FF57', '#3357FF', '#F3FF33'];
for (let i = 0; i < 10; i++) {
  const block = document.createElement('div');
  block.className = 'block';
  block.style.backgroundColor = colors[i % colors.length];
  block.style.width = `${Math.random() * 100 + 50}px`;
  block.style.height = `${Math.random() * 100 + 50}px`;
  container.appendChild(block);
}

拖拽交互实现

为积木添加拖拽功能,使用HTML5的拖拽API:

document.querySelectorAll('.block').forEach(block => {
  block.draggable = true;

  block.addEventListener('dragstart', (e) => {
    e.dataTransfer.setData('text/plain', block.id);
    setTimeout(() => block.style.opacity = '0.4', 0);
  });

  block.addEventListener('dragend', () => block.style.opacity = '1');
});

container.addEventListener('dragover', (e) => {
  e.preventDefault();
  e.dataTransfer.dropEffect = 'move';
});

container.addEventListener('drop', (e) => {
  e.preventDefault();
  const id = e.dataTransfer.getData('text/plain');
  const block = document.getElementById(id);
  block.style.left = `${e.clientX}px`;
  block.style.top = `${e.clientY}px`;
});

物理引擎集成

使用Matter.js实现积木的物理效果:

// 初始化物理引擎
const engine = Matter.Engine.create();
const world = engine.world;
const render = Matter.Render.create({
  element: document.body,
  engine: engine,
  options: { width: 800, height: 600 }
});

// 创建积木物理对象
const blocks = [];
for (let i = 0; i < 5; i++) {
  const block = Matter.Bodies.rectangle(
    Math.random() * 600 + 100,
    Math.random() * 200,
    80,
    80
  );
  blocks.push(block);
}

// 添加到世界并运行
Matter.Composite.add(world, blocks);
Matter.Engine.run(engine);
Matter.Render.run(render);

响应式积木墙

实现根据窗口大小自动调整的积木墙布局:

function createBlockWall() {
  const containerWidth = container.offsetWidth;
  const blockSize = 60;
  const cols = Math.floor(containerWidth / blockSize);

  container.innerHTML = '';
  for (let row = 0; row < 10; row++) {
    for (let col = 0; col < cols; col++) {
      const block = document.createElement('div');
      block.className = 'wall-block';
      block.style.left = `${col * blockSize}px`;
      block.style.top = `${row * blockSize}px`;
      container.appendChild(block);
    }
  }
}

window.addEventListener('resize', createBlockWall);
createBlockWall();

积木碰撞检测

实现简单的积木碰撞检测逻辑:

js实现积木

function checkCollisions() {
  const blocks = document.querySelectorAll('.block');
  blocks.forEach(block1 => {
    blocks.forEach(block2 => {
      if (block1 !== block2 && isColliding(block1, block2)) {
        block1.style.border = '2px dashed red';
        block2.style.border = '2px dashed red';
      }
    });
  });
}

function isColliding(a, b) {
  const rectA = a.getBoundingClientRect();
  const rectB = b.getBoundingClientRect();
  return !(
    rectA.right < rectB.left ||
    rectA.left > rectB.right ||
    rectA.bottom < rectB.top ||
    rectA.top > rectB.bottom
  );
}

setInterval(checkCollisions, 100);

这些方法可以单独使用或组合实现更复杂的积木效果。根据具体需求选择适合的实现方式,如需更真实的物理效果推荐使用专业物理引擎如Matter.js或Cannon.js。

标签: 积木js
分享给朋友:

相关文章

js实现继承

js实现继承

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

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…