OpenAI: GPT-5 Mini 在「拖拽排序列表」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:OpenAI: GPT-5 Mini
  • 用例名称:拖拽排序列表
  • 测试类型:网页生成
  • 评测维度:交互组件

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深前端开发工程师,专注于 Web 交互组件的实现与用户体验优化。 回答要求: 1. 所有代码(HTML、CSS、JavaScript)必须写在同一个 HTML 文件中,可直接在浏览器中运行,无需任何外部依赖。 2. 优先使用原生 HTML5 Drag and Drop API 实现拖拽功能,代码结构清晰、注释适当。 3. 实现时需考虑边缘情况:如拖拽到列表首尾、快速拖拽、拖拽到自身位置等场景的正确处理。 4. 视觉样式需整洁美观,占位符、拖拽状态等交互反馈需清晰可辨。 5. 代码量适中,聚焦核心功能,不引入不必要的复杂度。

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

# 拖拽排序列表(基础版) 请生成一个单列拖拽排序列表页面,所有代码(HTML、CSS、JavaScript)写在同一个 HTML 文件中,可直接在浏览器运行。 ## 功能要求 ### 核心交互 1. **拖拽排序**:列表项支持上下拖拽,松手后完成位置交换,使用原生 HTML5 Drag and Drop API 实现。 2. **拖拽手柄**:每个列表项左侧显示拖拽手柄图标(如 ⠿ 或 ≡),鼠标悬停时光标变为 `grab`,拖拽时变为 `grabbing`。 3. **占位符显示**:拖拽过程中,目标插入位置显示一个高亮占位符(虚线框或半透明色块),指示放置后的位置。 4. **放置动画**:列表项放置完成后,有简单的过渡动画(如 transform + transition 实现位置平滑过渡或 fade-in 效果)。 ### 数据持久化 5. **localStorage 存储**:每次拖拽排序完成后,将当前列表顺序保存到 `localStorage`;页面刷新后自动读取并还原上次的排列顺序。 ## 初始数据 列表默认包含以下 6 个任务项(可自行设计样式): - 📝 撰写项目需求文档 - 🎨 设计 UI 原型图 - 💻 开发前端页面 - 🔧 编写单元测试 - 🚀 部署到测试环境 - ✅ 验收与上线 ## 视觉要求 - 页面居中布局,列表宽度适中(建议 400-500px) - 列表项有卡片样式(圆角、阴影),拖拽时被拖动项半透明或降低透明度 - 占位符与普通列表项高度一致,视觉上明显区分(如蓝色虚线边框 + 浅蓝背景) - 整体配色简洁,不要求复杂主题 ## 不需要实现 - 多列表(看板)功能 - 嵌套列表 - 触摸/移动端支持 - 键盘导航 - 音效

任务要求

AI 模型需要满足以下要求:

  1. 使用原生 HTML5 Drag and Drop API(dragstart、dragover、drop 等事件)实现拖拽,不依赖第三方库。
  2. 拖拽过程中在正确的目标位置显示占位符,占位符位置随鼠标移动实时更新,且不出现闪烁或位置错误。
  3. 放置完成后列表项顺序正确更新,并有可见的过渡动画效果(不少于 150ms 的 CSS transition)。
  4. 每个列表项具有可识别的拖拽手柄图标,拖拽手柄区域的鼠标光标正确显示为 grab/grabbing。
  5. 排序结果正确持久化到 localStorage,刷新页面后列表顺序与上次一致,初次加载无数据时显示默认顺序。
  6. 正确处理边缘情况:拖拽到自身位置不触发重排,拖拽到列表首尾位置时占位符显示正确。

评测结果

综合得分

该模型在此用例的得分为:82.2 分(满分 100 分),已通过

基础难度评测结果

  • 得分:82.2 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

拖拽排序列表(基础版) :root{ --width: 460px; --bg: #f6f8fb; --card: #ffffff; --accent: #e6f0ff; --accent-border: #6ea8ff; --shadow: 0 6px 18px rgba(28,34,40,0.08); --muted: #6b7280; --handle-size: 36px; } html,body{ height:100%; margin:0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial; background: linear-gradient(180deg,#f7fbff 0%, var(--bg) 100%); color: #111827; -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; } .wrap{ min-height:100%; display:flex; align-items:center; justify-content:center; padding:40px 20px; } .panel{ width:var(--width); background:transparent; text-align:left; } h1{ font-size:20px; margin:0 0 14px 0; color:#0f172a; } p.lead{ margin:0 0 18px 0; font-size:13px; color:var(--muted); } /* List styles */ ul#todo-list{ list-style:none; margin:0; padding:8px; display:block; border-radius:12px; } li.item{ display:flex; align-items:center; gap:12px; background:var(--card); padding:10px 12px; border-radius:10px; box-shadow:var(--shadow); margin:8px 0; transition: transform 180ms ease, opacity 160ms ease, box-shadow 160ms ease; user-select:none; cursor: default; } /* Handle */ .handle{ width:var(--handle-size); height:var(--handle-size); display:flex; align-items:center; justify-content:center; border-radius:8px; background:rgba(15,23,42,0.03); color:#475569; font-size:16px; flex:0 0 var(--handle-size); cursor:grab; transition:background 120ms, color 120ms; } /* show grab/grabbing based on dragging state (body.dragging) */ .handle:hover{ background:rgba(15,23,42,0.06); } body.dragging .handle{ cursor:grabbing; } .content{ flex:1 1 auto; font-size:15px; display:flex; gap:10px; align-items:center; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .meta{ font-size:12px; color:var(--muted); } /* dragged item style */ li.item.dragging{ opacity:0.6; transform:scale(0.995); box-shadow:0 8px 24px rgba(16,24,40,0.12); } /* placeholder for drop target */ li.placeholder{...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】该实现整体思路正确,使用原生 HTML5 DnD API 实现了拖拽排序的核心功能,视觉样式较为精良,localStorage 持久化逻辑基本完整。主要问题集中在:①dragend 与 drop 的双重处理逻辑存在冗余,虽然在正常流程中不会产生双重 DOM 操作,但代码逻辑混乱,维护风险较高;②通过 handle 限制拖拽发起的方式(dragstart 中 preventDefault)在 HTML5 DnD 中并不可靠,实际上整个 li 仍可被拖拽;③快速拖拽时 setTimeout 隐藏元素可能导致短暂闪烁。总体而言是一个功能基本可用、视觉效果不错的实现,但在交互细节和代码健壮性上还有提升空间。 【GEMINI】这是一个高质量的实现方案。模型不仅满足了所有功能要求,还在交互细节上表现出色,例如自定义拖拽镜像和对拖拽手柄的严格限制(只有点击手柄才能触发拖拽),体现了资深前端工程师的水准。代码健壮性高,能够完美处理各种边缘交互场景。 【KIMI】该实现是一个高质量的拖拽排序列表组件,完整满足了所有功能需求。原生 HTML5 Drag and Drop API 使用规范,占位符逻辑、拖拽状态反馈、放置动画均实现到位。localStorage 持久化可靠,边缘情况处理较为周全。视觉设计简洁现代,代码结构清晰、注释适当,具有良好的可维护性。 minor 改进点包括统一手柄图标样式、优化事件处理避免重复保存,以及进一步简化部分冗余逻辑。总体而言,这是一个可直接用于生产环境的优秀实现。

进阶难度评测结果

  • 得分:80.9 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

高级拖拽排序看板(单文件实现) :root{ --bg:#f3f6f9; --col-bg:#eef3f7; --card:#ffffff; --muted:#8a95a3; --accent:#3b82f6; --shadow: 0 6px 18px rgba(20,30,50,0.08); --radius:10px; } html,body{height:100%;margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Apple Color Emoji","Segoe UI Emoji";background:var(--bg);color:#0f1724;} .app{max-width:1100px;margin:28px auto;padding:18px;} header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;} h1{font-size:18px;margin:0;} .controls{display:flex;gap:8px;align-items:center;} button.btn{background:var(--accent);color:white;border:0;padding:8px 12px;border-radius:8px;cursor:pointer;box-shadow:var(--shadow);font-weight:600;} button.ghost{background:transparent;color:var(--accent);border:1px solid rgba(59,130,246,0.12);padding:8px 10px;} .board{display:flex;gap:16px;align-items:flex-start;} @media (max-width:800px){ .board{flex-direction:column;} } /* Column */ .col{flex:1;min-width:260px;background:linear-gradient(180deg,#fbfdff, #f7fbff);border-radius:var(--radius);padding:12px;box-shadow:var(--shadow);border:2px solid transparent;} .col.highlight{border-color:rgba(59,130,246,0.45);box-shadow:0 8px 30px rgba(59,130,246,0.06);} .col-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;} .col-title{display:flex;align-items:center;gap:8px;font-weight:700;} .badge{background:var(--accent);color:white;padding:4px 8px;border-radius:999px;font-size:12px;} .add-row{display:flex;gap:6px;align-items:center;margin-bottom:8px;} .add-input{flex:1;padding:8px;border-radius:8px;border:1px solid rgba(15,23,36,0.07);background:white;font-size:14px;} .add-btn{padding:8px 10px;border-radius:8px;border:0;background:var(--accent);color:white;cursor:pointer;} /* List and tasks */ .list{min-height:40px;display:flex;flex-direction:column;gap:8px;padding:6px;}...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】该实现在单文件内完成了看板的核心功能,包括 Pointer Events 拖拽、键盘导航、Web Audio 音效和 localStorage 持久化,整体完成度较高。主要不足在于:拖拽交互的细节处理不够精细(缺少其他元素让位动画、放置飞入动画存在潜在偏差、原位检测有 off-by-one 风险);键盘模式下的 placeholder 位置计算存在逻辑缺陷;事件监听器存在重复注册风险。代码结构清晰,视觉设计现代,但距离「进阶版」的高质量要求还有一定差距,属于功能基本可用但细节待打磨的水平。 【GEMINI】这是一个非常出色的进阶版看板组件实现。模型不仅完美对齐了所有功能需求,还在交互细节上表现优异,特别是键盘导航的逻辑闭环和 Web Audio 的原生合成,体现了资深前端工程师的水准。代码整洁且无外部依赖,完全符合「单文件运行」和「高性能动画」的技术约束。 【KIMI】该实现是一个功能较为完整的拖拽排序看板,核心需求均已覆盖。代码结构清晰,使用现代 API(Pointer Events、Web Audio、MutationObserver)实现高级交互。主要改进空间在于:增强快速操作下的状态稳定性、优化数据持久化策略(如防抖保存)、完善无障碍体验的边界反馈、以及增加代码注释和类型安全。整体达到生产可用水平,但需经过更多边缘场景测试。

困难难度评测结果

  • 得分:71.2 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

高级拖拽看板(嵌套 + 虚拟化 + 无障碍) :root{ --bg:#f6f8fa; --text:#111; --muted:#556; --card:#fff; --accent:#2563eb; --col-width:320px; --gap:16px; --radius:8px; --item-h:64px; --shadow:0 2px 8px rgba(15,23,42,0.08); --success:#16a34a; --danger:#dc2626; } /* Dark theme */ :root[data-theme="dark"]{ --bg:#0b1220; --text:#e6eef8; --muted:#9fb4d8; --card:#0f1724; --accent:#60a5fa; --shadow:0 2px 14px rgba(2,6,23,0.8); } /* High contrast */ :root[data-theme="hc"]{ --bg:#000; --text:#fff; --muted:#fff; --card:#000; --accent:#ffd700; --shadow:0 0 0 3px #fff inset; } html,body{height:100%;margin:0;font-family:Inter,Segoe UI,Roboto,system-ui,-apple-system,"Helvetica Neue";background:var(--bg);color:var(--text)} .app{padding:16px;box-sizing:border-box;min-height:100%;} header{display:flex;align-items:center;gap:12px;margin-bottom:12px} h1{font-size:16px;margin:0} .controls{margin-left:auto;display:flex;gap:8px;align-items:center} button,select{background:var(--card);color:var(--text);border:1px solid #ccc;padding:6px 8px;border-radius:6px;cursor:pointer} button:active{transform:translateY(1px)} .top-stats{display:flex;gap:12px;align-items:center;font-size:13px;color:var(--muted)} .board{display:flex;gap:var(--gap);align-items:flex-start} .column{width:var(--col-width);background:linear-gradient(180deg,transparent,transparent);border-radius:var(--radius);padding:8px;box-sizing:border-box;box-shadow:var(--shadow);display:flex;flex-direction:column;min-height:340px} .col-header{display:flex;justify-content:space-between;align-items:center;padding:6px 8px 10px 8px} .col-body{flex:1;overflow:auto;border-radius:6px;background:transparent;position:relative;padding:4px} .empty-indicator{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--muted);pointer-events:none;font-size:13px} .list-viewport{position:relative} .spacer{width:100%} .item{...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】该实现在架构层面覆盖了题目要求的所有主要功能模块(嵌套拖拽、虚拟化、无障碍、多主题、音效、持久化),代码结构清晰,有模块化思维。但在核心功能的实现细节上存在多处缺陷:虚拟化的高度计算与实际 DOM 尺寸不匹配导致精度问题;拖拽占位符的 DOM 插入位置计算在虚拟化场景下容易出错;兄弟/子节点插入意图的判断逻辑过于简单;跨列拖拽的数据操作存在潜在引用错误。这些问题会在实际使用中造成明显的交互异常,使得整体可用性打折扣。音效和主题系统相对完整,是实现质量较高的部分。整体属于「框架完整但细节有缺陷」的水平,距离生产可用还有一定距离。 【GEMINI】这是一个极高水平的实现,完美满足了所有困难级别的要求。模型不仅在核心的嵌套拖拽和虚拟化技术上表现卓越,更在无障碍交互(尤其是键盘模拟拖拽逻辑)和 Web Audio API 的应用上展现了深厚的工程功底。代码自包含且逻辑严密,是复杂前端交互组件的典范。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...