You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ReactJS实现自定义行列网格框及箭头键导航功能

实现自定义尺寸网格框及箭头键导航

步骤1:完善HTML结构

给现有元素添加ID方便后续操作,同时新增网格容器:

<input type="number" name="row" id="rowInput" placeholder="行数" min="1">
<input type="number" name="column" id="colInput" placeholder="列数" min="1">
<button id="createBtn">Create Box</button>
<div id="gridContainer"></div>

步骤2:添加基础CSS样式

用CSS Grid实现网格布局,给网格项设置默认样式和选中高亮效果:

#gridContainer {
  margin-top: 20px;
  display: grid;
  gap: 4px;
}

.grid-item {
  width: 50px;
  height: 50px;
  border: 2px solid #ccc;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: border-color 0.2s;
}

.grid-item.active {
  border-color: #2196F3;
  background-color: #E3F2FD;
}

步骤3:编写JavaScript逻辑

实现网格生成、选中状态管理和箭头键导航功能:

const rowInput = document.getElementById('rowInput');
const colInput = document.getElementById('colInput');
const createBtn = document.getElementById('createBtn');
const gridContainer = document.getElementById('gridContainer');

let currentIndex = -1;
let gridItems = [];
let rows = 0;
let cols = 0;

// 生成网格
function generateGrid() {
  rows = parseInt(rowInput.value);
  cols = parseInt(colInput.value);

  if (isNaN(rows) || isNaN(cols) || rows < 1 || cols < 1) {
    alert('请输入有效的正整数');
    return;
  }

  // 清空现有网格
  gridContainer.innerHTML = '';
  gridItems = [];
  currentIndex = -1;

  // 设置网格列数
  gridContainer.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;

  // 创建网格项
  for (let i = 0; i < rows * cols; i++) {
    const item = document.createElement('div');
    item.className = 'grid-item';
    item.textContent = i + 1; // 可选:显示序号
    item.addEventListener('click', () => selectItem(i));
    gridContainer.appendChild(item);
    gridItems.push(item);
  }

  // 默认选中第一个项
  if (gridItems.length > 0) {
    selectItem(0);
  }
}

// 选中指定网格项
function selectItem(index) {
  if (currentIndex !== -1) {
    gridItems[currentIndex].classList.remove('active');
  }
  currentIndex = index;
  gridItems[currentIndex].classList.add('active');
  // 滚动到选中项(可选)
  gridItems[currentIndex].scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}

// 处理箭头键导航
function handleKeydown(e) {
  if (gridItems.length === 0) return;

  switch(e.key) {
    case 'ArrowUp':
      if (currentIndex - cols >= 0) {
        selectItem(currentIndex - cols);
      }
      e.preventDefault();
      break;
    case 'ArrowDown':
      if (currentIndex + cols < rows * cols) {
        selectItem(currentIndex + cols);
      }
      e.preventDefault();
      break;
    case 'ArrowLeft':
      if (currentIndex % cols !== 0) {
        selectItem(currentIndex - 1);
      }
      e.preventDefault();
      break;
    case 'ArrowRight':
      if ((currentIndex + 1) % cols !== 0) {
        selectItem(currentIndex + 1);
      }
      e.preventDefault();
      break;
  }
}

// 绑定事件
createBtn.addEventListener('click', generateGrid);
document.addEventListener('keydown', handleKeydown);

功能说明

  • 输入有效行数和列数后,点击按钮即可生成对应规格的网格
  • 点击任意网格项可选中它,选中项会高亮显示
  • 使用上下左右箭头键可在网格间导航,自动处理边界限制(比如第一行无法向上移动)
  • 可选:网格项显示序号,选中时自动滚动到视野内

内容的提问来源于stack exchange,提问作者Sid Khetarpal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:12:31