尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Open WebUI 交互设计指南:5个让你用着顺手的界面细节

Open WebUI 交互设计指南:5个让你用着顺手的界面细节 Open WebUI 交互设计指南5个让你用着顺手的界面细节【免费下载链接】open-webuiUser-friendly AI Interface (Supports Ollama, OpenAI API, ...)项目地址: https://gitcode.com/GitHub_Trending/op/open-webuiOpen WebUI 是一款自托管的 AI 聊天界面接上 Ollama 或 OpenAI API 之后你在浏览器里就能用上大模型。用上一段时间你会发现它顺手的地方不在特效而在一堆不起眼的小设计。这篇指南按真实使用场景拆开讲 5 处交互设计帮你明白它为什么用起来这么顺。第一次打开 Open WebUI加载页与侧边栏怎么设计加载等待是新手最容易流失的时刻Open WebUI 把启动阶段做成了有明确进度的画面而不是一闪一闪的空白页。src/app.html里直接写死了这个启动画面的骨架中间是 logo下面一根进度条。div idprogress-bar styleposition: absolute; width: 0%; height: 0.75rem; border-radius: 9999px; background-color: #fff; classbg-white /div这段就是启动时看到的那根白色进度条宽度从 0% 起步由加载脚本驱动增长。同一份文件里还有一段脚本在页面渲染前就读系统深色模式偏好决定先显示亮色还是深色启动图——你还没点进界面主题就已经跟手了。侧边栏开合是同样的思路不是一闪出现的硬切而是用 200 毫秒的宽度过渡动画transition-width duration-200见src/lib/components/chat/Chat.svelte收起时空间平滑让出来眼睛不用重新找内容。拖文件进聊天框拖的不只是附件大多数人把拖拽理解成上传附件但 Open WebUI 把整个输入框都变成了落点落下来的东西比你想的多。const textData e.dataTransfer?.getData(text/plain); if (textData) { const data JSON.parse(textData); if (data.type chat data.id) { const chat await getChatById(localStorage.token, data.id); if (chat) { const chatItem { type: chat, id: chat.id, name: chat.title }; if (!files.find((f) f.id chatItem.id)) { files [...files, chatItem]; } } } }这是src/lib/components/chat/MessageInput.svelte里的拖放处理。落下来的是聊天类型时它不当文件传而是把那条历史对话拉过来当参考资料。也就是说你可以从左侧边栏直接把旧对话拖进输入框让模型接着旧话题答。拖拽在这里不是上传通道是一条引用通道。还有个容易忽略的细节dragleave事件会先判断指针是否真的离开了输入框没离开就不取消高亮。你拖着文件在框里挪动时边框不会一抖一抖而是稳定的一次提示。写长消息、说长话超长粘贴与语音输入长内容最容易把聊天界面搞乱粘贴一大段文本、开口说一分钟话普通实现都容易翻车。Open WebUI 在这里做了两件事。超长粘贴自动变文件开启largeTextAsFile设置后往输入框粘贴超长文本时它不会被塞进输入框把界面撑爆而是自动转成一个文件附件。代码里有个长度阈值判断超过就拦截粘贴、改走文件通道。你看到的是一张文件卡片出现在输入框上方而不是满屏文字。 语音说完直接变文字VoiceRecording bind:recording onConfirm{async (data) { const { text, filename } data; recording false; await insertTextAtCursor(${text}); if ($settings?.speechAutoSend ?? false) { dispatch(submit, prompt); } }} /这段嵌在src/lib/components/chat/MessageInput.svelte里。录完的语音被转写成文字插回你正在写的输入框而不是直接发出去——你可以先改再发。开了speechAutoSend设置转写完就直接发送。先给控制权、再给自动化这是它最稳的地方。键盘盲操作一键发送的快捷键怎么定聊天界面是少数手不离键盘就能完成大部分操作的工具Open WebUI 把发送、换行、取消都留给了键盘。// Depending on the users settings, it will send the message // either when Enter is pressed or when CtrlEnter is pressed. const enterPressed ($settings?.ctrlEnterToSend ?? false) ? (e.key Enter || e.keyCode 13) isCtrlPressed : (e.key Enter || e.keyCode 13) !e.shiftKey; if (enterPressed) { e.preventDefault(); if (prompt ! || files.length 0) { dispatch(submit, prompt); } }这段就是src/lib/components/chat/MessageInput.svelte的发送逻辑本体默认 Enter 发送、ShiftEnter 换行改成 CtrlEnter 发送只要一个开关。还有个容易漏掉的兼容代码专门处理了中日文输入法的选词阶段中文用户按回车选词时不会误发消息。盲打用户最烦的就是我选个字结果发出去了这种事故。⌨️ Esc 键也有用在输入框里按 Esc 会清空当前选中的模型、工具等附加项等于一键回到干净状态。看不见屏幕也能用读屏与深色模式无障碍不是加个标签就完事而是每个图标按钮都得能被读出来。Open WebUI 导航栏是一堆纯图标按钮每个都带描述button classflex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition on:click{async () { await showControls.set(!$showControls); }} aria-labelControls 这段在src/lib/components/chat/Navbar.svelte里。屏幕上是个图标屏幕阅读器念出来的是 Controls——按钮干啥的一目了然。新建聊天、开关侧边栏等按钮同理各有各的aria-label。深色模式方面src/app.html开头那段脚本同时响应系统主题和手动设置还备了纯黑的 OLED 模式手机上靠 viewport 设置和触摸点判断把回车发送这类桌面习惯自动关掉换成更适合手指的操作。加载、拖拽、长内容、键盘、读屏这五个最容易出问题的环节各自磨一遍Open WebUI 的顺手就是这么攒出来的。想自己看代码聊天相关的组件都摆在同一个目录里。官方文档README.md聊天组件源码src/lib/components/chat/后端接口源码backend/open_webui/routers/【免费下载链接】open-webuiUser-friendly AI Interface (Supports Ollama, OpenAI API, ...)项目地址: https://gitcode.com/GitHub_Trending/op/open-webui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表