ライブデモ Live Demo

ドラッグ&ドロップで並べ替え可能なリストです。

A sortable list using drag and drop.

  • Item 1: Research
  • Item 2: Design
  • Item 3: Development
  • Item 4: Testing

AI向け説明 AI Description

`I-007` は HTML5 Drag and Drop API を使用した並べ替え可能なリストです。`dragstart`, `dragover`, `drop`, `dragenter`, `dragleave` イベントを処理し、DOM要素の順序を入れ替えます。

`I-007` implements a sortable list using the HTML5 Drag and Drop API. It handles `dragstart`, `dragover`, and `drop` events to reorder DOM elements.

調整可能パラメータ Adjustable Parameters

実装 Implementation

HTML + CSS + JS

<ul id="list">
  <li draggable="true">Item 1</li>
  <li draggable="true">Item 2</li>
</ul>

<style>
:root {
  --item-padding: 16px;
  --drag-highlight: #5c6ac4;
}
</style>

<script>
// Drag and Drop logic
</script>

React (JSX + CSS)

// react/I-007.jsx
import { useState, useRef } from 'react';
import './I-007.css';

export default function DraggableList({ initialItems = [] }) {
  const [items, setItems] = useState(initialItems);
  const dragItem = useRef();
  const dragOverItem = useRef();

  const dragStart = (e, position) => {
    dragItem.current = position;
    e.target.classList.add('dragging');
  };

  const dragEnter = (e, position) => {
    dragOverItem.current = position;
  };

  const drop = (e) => {
    const copyListItems = [...items];
    const dragItemContent = copyListItems[dragItem.current];
    copyListItems.splice(dragItem.current, 1);
    copyListItems.splice(dragOverItem.current, 0, dragItemContent);
    dragItem.current = null;
    dragOverItem.current = null;
    setItems(copyListItems);
    e.target.classList.remove('dragging'); // In real app, might need more robust class cleanup
  };

  return (
    <ul className="draggable-list">
      {items.map((item, index) => (
        <li
          key={index}
          className="draggable-item"
          draggable
          onDragStart={(e) => dragStart(e, index)}
          onDragEnter={(e) => dragEnter(e, index)}
          onDragEnd={drop}
        >
          <span className="drag-handle">☰</span>
          <span className="drag-content">{item}</span>
        </li>
      ))}
    </ul>
  );
}
/* react/I-007.css */
/* I-007: React styles */
.draggable-list {
  max-width: 400px;
  margin: 0 auto;
  padding: 0;
  list-style: none;
}

.draggable-item {
  background: #fff;
  border: 1px solid #e0e4f0;
  border-radius: 8px;
  padding: 16px;
  margin-bottom: 12px;
  display: flex;
  align-items: center;
  gap: 12px;
  cursor: grab;
  transition: transform 0.2s, box-shadow 0.2s;
}

.draggable-item:active {
  cursor: grabbing;
}

.draggable-item.dragging {
  opacity: 0.5;
  border: 2px dashed #5c6ac4;
}

.drag-handle {
  color: #5c6184;
  cursor: grab;
  padding: 4px;
}

.drag-content {
  flex: 1;
  font-weight: 500;
  color: #1d2242;
}

AIへの指示テンプレート AI Prompt Template

以下のテンプレートをコピーしてAIアシスタントに貼り付けると、このパターンの実装を依頼できます。 Copy the template below and paste it into your AI assistant to request an implementation of this pattern.