doubao-seed-1-6-flash 在「拖拽排序列表」的评测结果
这是该 AI 模型在此测试用例上的详细评测结果。
基本信息
- 模型名称:doubao-seed-1-6-flash
- 用例名称:拖拽排序列表
- 测试类型:网页生成
- 评测维度:交互组件
系统提示词(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 模型需要满足以下要求:
- 使用原生 HTML5 Drag and Drop API(dragstart、dragover、drop 等事件)实现拖拽,不依赖第三方库。
- 拖拽过程中在正确的目标位置显示占位符,占位符位置随鼠标移动实时更新,且不出现闪烁或位置错误。
- 放置完成后列表项顺序正确更新,并有可见的过渡动画效果(不少于 150ms 的 CSS transition)。
- 每个列表项具有可识别的拖拽手柄图标,拖拽手柄区域的鼠标光标正确显示为 grab/grabbing。
- 排序结果正确持久化到 localStorage,刷新页面后列表顺序与上次一致,初次加载无数据时显示默认顺序。
- 正确处理边缘情况:拖拽到自身位置不触发重排,拖拽到列表首尾位置时占位符显示正确。
评测结果
综合得分
该模型在此用例的得分为:75.8 分(满分 100 分),已通过
基础难度评测结果
- 得分:75.8 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
```html 拖拽排序列表 * { margin: 0; padding: 0; box-sizing: border-box; } body { display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #f5f5f5; font-family: Arial, sans-serif; } .container { width: 400px; background-color: #fff; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); overflow: hidden; } ul { list-style: none; } li { display: flex; align-items: center; padding: 12px 16px; cursor: grab; transition: all 0.3s; border-bottom: 1px solid #eee; } li:last-child { border-bottom: none; } li.dragging { opacity: 0.7; transform: scale(0.98); background-color: #f9f9f9; } .handle { margin-right: 8px; color: #999; } .placeholder { border: 2px dashed #409eff; background-color: #e6f7ff; margin: 4px 0; min-height: 50px; } ⠿ 📝 撰写项目需求文档 ⠿ 🎨 设计 UI 原型图 ⠿ 💻 开发前端页面 ⠿ 🔧 编写单元测试 ⠿ 🚀 部署到测试环境 ⠿ ✅ 验收与上线 const list = document.getElementById('sortable-list'); let draggedItem = null; let placeholder = null; // 拖拽开始事件 list.addEventListener('dragstart', (e) => { draggedItem = e.target.closest('li'); draggedItem.classList.add('dragging'); placeholder = document.createElement('li'); placeholder.classList.add('placeholder'); }); // 拖拽过事件处理 list.addEventListener('dragover', (e) => { e.preventDefault(); const target = e.target.closest('li'); if (target) { const rect = target.getBoundingClientRect(); const y = e.clientY - rect.top; if (y > target.offsetHeight / 2) { target.insertAdjacentElement('afterend', placeholder); } else { target.insertAdjacentElement('beforebegin', placeholder); } } }); // 拖拽释放事件 list.addEventListener('drop', (e) => { e.preventDefault(); if (draggedItem && placeholder) { const target = e.target.closest('li'); if (target) { target.insertAdjacentElement( draggedItem === target ? 'afterend' : 'beforebegin', draggedItem ); } else { list.appendChild(draggedItem); } draggedItem.classList.remove('dragging'); placeholder.remove(); draggedItem = null; placeholder = null; saveToLocalStorage(); } }); // 保存列表顺序到localStorage function...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【GEMINI】该模型生成了一个功能完备的拖拽排序列表。核心优势在于逻辑的严谨性和数据持久化的实现,完全满足了 localStorage 存储的要求。视觉表现良好,代码整洁。主要的不足在于「放置动画」较为简单,未能实现真正意义上的平滑位置过渡(如 FLIP 动画),且拖拽过程中的占位符交互流畅度还有优化空间,但作为基础版实现已达到较高水准。 【KIMI】该实现基本完成了核心功能需求,但在拖拽交互的精细度上存在明显缺陷:占位符逻辑与放置动画的配合失误导致过渡效果失效,drop 事件的处理条件判断不够严谨,边缘情况(ESC取消拖拽、快速拖拽)考虑不足。localStorage 持久化功能完整可用,代码结构清晰可读。建议修复 dragend 事件处理、优化 placeholder 与动画的时序配合、改用 CSS 伪类控制光标状态,以提升交互的完整性和流畅度。
进阶难度评测结果
- 得分:61.6 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
```html 拖拽排序看板(进阶版) * { margin: 0; padding: 0; box-sizing: border-box; font-family: sans-serif; } body { background-color: #f0f2f5; } .board { display: flex; min-height: 100vh; padding: 20px; } .column { flex: 1; margin: 0 10px; background-color: #fff; border-radius: 8px; overflow: hidden; display: flex; flex-direction: column; min-width: 250px; } .column-header { display: flex; align-items: center; justify-content: space-between; padding: 10px; background-color: #f5f7fa; font-weight: bold; } .task-count { background-color: #1890ff; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 12px; } .task-list { flex: 1; padding: 10px; } .task { background-color: #fff; border: 1px solid #e8e8e8; border-radius: 4px; padding: 10px; margin-bottom: 10px; display: flex; align-items: center; cursor: pointer; position: relative; transition: transform 200ms ease; } .task:hover .drag-handle { opacity: 1; } .drag-handle { margin-right: 8px; opacity: 0; transition: opacity 0.2s; color: #999; } .task input { width: 100%; border: none; outline: none; } .add-task { padding: 10px; cursor: pointer; color: #999; } .add-task:hover { background-color: #f5f7fa; } .placeholder { height: 40px; margin-bottom: 10px; background-color: #e8e8e8; border-radius: 4px; } .dragging { opacity: 0.5; pointer-events: none; } .column.dragging-over { border: 2px dashed #1890ff; } .focus-ring { outline: 2px solid #1890ff; outline-offset: 2px; } .keyboard-hint { position: fixed; bottom: 20px; left: 20px; background-color: rgba(0,0,0,0.7); color: #fff; padding: 10px; border-radius: 4px; display: none; } 待办 Todo 0 + 添加任务 进行中 In Progress 0 + 添加任务 已完成 Done 0 + 添加任务 键盘操作提示:Tab切换任务,Space拾取,方向键切换列,↑↓调整位置,Space/Enter放置,Escape取消 const columns = ['todo', 'progress', 'done']; let currentDraggedTask = null; let currentColumn = null; let isDragging = false; let placeholder = null; let audioContext = null; let pickSound = null; let placeSound = null; let cancelSound = null; function initAudio() { audioContext =...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【GEMINI】该模型展现了资深前端的开发思路,特别是在 Web Audio 合成音效和触摸长按反馈的处理上非常专业。然而,核心拖拽逻辑的实现较为生硬(占位符仅做位移而非重排),且最严重的缺陷是代码生成不完整,导致键盘导航和部分核心交互逻辑缺失,无法直接投入使用。 【KIMI】该实现是一个未完成的半成品,核心功能存在大量缺陷。拖拽交互虽尝试使用 Pointer Events,但触摸与鼠标逻辑分离导致代码重复且变量作用域错误;占位符与跟随动画实现方式错误,导致视觉反馈与数据结构不同步;放置动画计算逻辑有误。数据持久化基础框架存在但保存时机和一致性有问题,缺少重置功能。键盘导航与 Web Audio 最为薄弱:关键函数缺失、音频初始化未调用、包络设置错误导致静音、ARIA 支持完全缺失。整体代码结构混乱,多处 TODO 功能未实现,不建议作为生产代码使用。
困难难度评测结果
- 得分:46.5 分
- 通过状态:未通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
```html 拖拽排序列表 :root { --bg-color: #fff; --text-color: #000; --border-color: #ccc; --handle-color: #999; } .dark-theme { --bg-color: #333; --text-color: #fff; --border-color: #666; --handle-color: #aaa; } .high-contrast-theme { --bg-color: #000; --text-color: #fff; --border-color: #fff; --handle-color: #fff; } body { font-family: sans-serif; background-color: var(--bg-color); color: var(--text-color); margin: 0; padding: 0; } .theme-switcher { display: flex; gap: 10px; padding: 10px; } .theme-btn { padding: 5px 10px; cursor: pointer; } .sound-switch { padding: 10px; } .kanban { display: flex; gap: 20px; padding: 20px; } .kanban-column { flex: 1; border: 1px solid var(--border-color); border-radius: 4px; min-height: 200px; position: relative; padding: 10px; box-sizing: border-box; role: region; aria-label: "看板列"; } .kanban-column h2 { margin-top: 0; } .virtual-list { height: 400px; overflow-y: auto; position: relative; } .virtual-list .list-item { padding: 10px; border-bottom: 1px solid var(--border-color); cursor: pointer; role: listitem; position: absolute; left: 0; right: 0; transition: transform 0.3s; } .virtual-list .list-item.dragging { opacity: 0.5; } .placeholder { height: 40px; border: 2px dashed var(--border-color); margin: 5px 0; box-sizing: border-box; } .status { padding: 10px; } .reset-btn { padding: 10px; cursor: pointer; } .drag-handle { display: inline-block; width: 20px; height: 20px; background: var(--handle-color); border-radius: 50%; margin-right: 5px; vertical-align: middle; aria-grabbed: "false"; aria-dropeffect: "move"; } 亮色 暗色 高对比度 音效开关: 待办 进行中 已完成 重置为默认数据 const defaultData = { todo: Array.from({length: 200}, (_, i) => ({id: `todo-${i}`, text: `待办项${i}`, children: []})), "in-progress": Array.from({length: 200}, (_, i) => ({id: `in-progress-${i}`, text: `进行中项${i}`, children: []})), done: Array.from({length: 200}, (_, i) => ({id: `done-${i}`, text: `已完成项${i}`, children: []})) }; const ITEM_HEIGHT = 40; const BUFFER_ITEMS = 5; const columns...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【GEMINI】该生成结果在基础的虚拟化列表和多主题系统上表现尚可,但未能完成任务中最核心且难度最高的「嵌套树形拖拽」要求。数据结构虽然是树形的,但渲染和交互逻辑完全是扁平列表,这导致循环引用保护、子节点插入意图等关键功能全部失效。此外,键盘无障碍支持仅停留在事件监听层面,缺乏完整的焦点路径管理。整体更像是一个带虚拟滚动的看板 Demo,而非复杂的嵌套拖拽组件。 【KIMI】该实现严重偏离题目要求,核心功能大量缺失:嵌套树形结构完全未实现(数据扁平无层级)、Pointer Events API 未使用、虚拟化与拖拽协同存在严重缺陷、ARIA 实现错误且键盘导航不可用、音效系统有严重 bug、数据持久化不完整。代码结构混乱,缺乏工程化思维,边缘情况处理几乎为零。建议重新设计架构,优先实现数据模型的嵌套结构,再基于此构建虚拟化和拖拽逻辑。
相关链接
您可以通过以下链接查看更多相关内容: