- 人工智能
- AI Agent
- AI 应用
- 前端
- 后端
- 即时通讯
- 交互助手
- 工具调用
【免费下载链接】holaOS
Open-source agentic workspace enterprises can make their own. Connect the systems you already run — 100+ integrations, MCP, chat tools, apps, browser, local files — with shared memory. Any agent (Claude Code, Codex), any model, or BYOK. Set up in clicks, not months. Local-first: your data never leaves your machines.
本篇技术指南完整解读 holaOS 仓库内嵌的 frontend-design 技能中的响应式设计规范(responsive-design.md)。该规范服务于 holaOS 的 Agent 技能体系——当用户在对话中要求构建 Web 组件、页面、制品或应用时,运行时会把这份参考文档随技能注入给模型,指导其生成生产级、可响应、跨设备的界面代码。读完本文,你将掌握移动优先的断点策略、基于输入方式(而非仅屏幕尺寸)的媒体查询、刘海屏安全区处理、响应式图片的完整用法,以及 holaOS 桌面端真实落地的容器查询实践与真机测试方法论。
一、规范在 holaOS 技能体系中的定位
在深入具体技术点之前,先说明这份文档的"身世"。它是 holaOS 运行时内置技能(embedded skills)体系中 frontend-design 技能的参考文档之一,同目录下还并列着 color-and-contrast.md、typography.md、spatial-design.md 等七份规范。
技能主文件 SKILL.md 的 frontmatter 声明了其用途:"Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications",并在 Responsive 小节中指向本参考文档,同时给出两条铁律:
- DO:使用容器查询(
@container)做组件级响应式; - DON'T:在移动端隐藏关键功能——要"适配"界面,而不是"截肢"界面。
从源码结构看,这些技能文件由 workspace-skills.ts 负责发现与注入:运行时通过embeddedSkillsRoot()定位harnesses/src/embedded-skills目录(支持用HOLABOSS_EMBEDDED_SKILLS_DIR环境变量覆盖),扫描每个含SKILL.md的子目录,校验 frontmatter 中的name/description,最终以<skill name="..." location="...">引用的形式把正文注入模型上下文(见 quotedSkillBlock)。因此,本参考文档的内容质量直接决定了 Agent 生成界面的响应式水准——这也是它值得逐条吃透的原因。
二、Mobile-First:先写移动端基线,再用 min-width 分层叠加
规范的第一条原则直指最常见的反模式:
Start with base styles for mobile, use
min-widthqueries to layer complexity. Desktop-first (max-width) means mobile loads unnecessary styles first.
**移动优先(mobile-first)**要求先编写针对移动端的基线样式,再通过min-width断点逐层叠加复杂度;而桌面优先(max-width)会让移动端用户首先加载大量不必要的桌面样式,造成带宽浪费与渲染负担。
在 holaOS 桌面端的 base.css 中可以看到同样的"从窄到宽"思想在容器层面的应用:窄面板(max-width: 448px)时强制弹层收敛宽度、设置行改为纵向堆叠:
/* Narrow panels: clamp popouts and stack settings rows. */ @container panel (max-width: 448px) { [data-popover-popup], [data-menu-popup], [data-select-popup] { max-width: calc(100cqw - 24px); } /* Settings rows stack vertically inside narrow panels */ [data-layout="settings-row"] { flex-direction: column; align-items: stretch; gap: 10px; } }这段代码(base.css)与规范的核心主张完全一致:先保证窄容器下可用,再在宽容器中展开。它展示了 holaOS 对"响应式"的完整定义——不仅针对视口(viewport),还针对组件容器(container),两者共用同一套思维方式。
三、断点:内容驱动,而非设备驱动
Don't chase device sizes—let content tell you where to break. Start narrow, stretch until design breaks, add breakpoint there.
规范反对追逐设备尺寸表(iPhone 13 多宽、Pixel 7 多宽),主张让内容决定断点:从最窄开始拉伸,直到布局"断裂"(文字换行难看、间距失衡、元素重叠)的位置,就在那里加断点。并给出经验值:
- 三个断点通常足够:
640px、768px、1024px; - 能用
clamp()解决的就不要加断点——clamp(min, preferred, max)让字号、间距、列宽随可用空间连续流动,天然免维护。
与断点配套的还有两个来自 spatial-design.md 的补充技巧,它们能让"少断点"成为可能:
- 自调整网格:
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))无需任何断点即可实现"每行至少 280px、能放几列放几列、剩余空间拉伸"的自适应网格; - 容器查询:视口查询(
@media)只服务于页面级布局,组件级响应必须用容器查询,让同一组件在窄侧栏和宽主内容区自动切换形态,而不必依赖任何视口 hack。
四、检测输入方式,而不是只看屏幕尺寸
Screen size doesn't tell you input method.A laptop with touchscreen, a tablet with keyboard—use pointer and hover queries.
触屏笔记本、带键盘的平板——屏幕尺寸完全无法反映输入方式。规范给出完整的pointer/hover媒体查询用法:
/* Fine pointer (mouse, trackpad) */ @media (pointer: fine) { .button { padding: 8px 16px; } } /* Coarse pointer (touch, stylus) */ @media (pointer: coarse) { .button { padding: 12px 20px; } /* Larger touch target */ } /* Device supports hover */ @media (hover: hover) { .card:hover { transform: translateY(-2px); } } /* Device doesn't support hover (touch) */ @media (hover: none) { .card { /* No hover state - use active instead */ } }关键红线:不要依赖 hover 承载任何功能。触屏用户根本无法 hover,悬停态只能作为增强,功能必须始终可通过点击/触摸到达。这背后是"渐进增强"的响应式哲学:先保证无悬停、无精指针环境下的完整可用,再为增强能力加分。
与此呼应的是 spatial-design.md 中的触控目标规范:按钮可以视觉很小,但触控目标必须 ≥ 44px(Apple HIG 建议的触控最小尺寸)。如果视觉尺寸不足,用::before伪元素无侵入地扩展点击热区:
.icon-button { width: 24px; /* Visual size */ height: 24px; position: relative; } .icon-button::before { content: ''; position: absolute; inset: -10px; /* Expand tap target to 44px */ }这与@media (pointer: coarse)增大按钮内边距的思路互为表里:粗指针设备上的交互热区,永远要比视觉尺寸大。
五、Safe Areas:处理刘海屏与圆角
现代手机普遍存在刘海、圆角与底部 Home 指示条。规范要求用env()读取安全区:
body { padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); } /* With fallback */ .footer { padding-bottom: max(1rem, env(safe-area-inset-bottom)); }要点有二:
env()四向取值:safe-area-inset-top/right/bottom/left分别对应顶部刘海、横向圆角、底部 Home 条;max()兜底:padding-bottom: max(1rem, env(safe-area-inset-bottom))保证在无安全区的桌面浏览器上仍保有 1rem 基础内边距,而不是塌成 0——这是移动端代码在桌面端不会失灵的通用技巧。
同时必须在 meta 标签中开启viewport-fit=cover,否则env()取值恒为 0,安全区处理完全不生效:
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">注意viewport-fit=cover会让页面延伸到屏幕圆角之下,因此安全区 padding 与 viewport-fit=cover 必须成对出现,缺一不可。
六、响应式图片:srcset、sizes 与 picture
图片是响应式中最容易做错的一环,规范给出两套互补方案。
6.1 srcset + sizes:按分辨率自适应
<img src="hero-800.jpg" srcset=" hero-400.jpg 400w, hero-800.jpg 800w, hero-1200.jpg 1200w " sizes="(max-width: 768px) 100vw, 50vw" alt="Hero image" >工作原理拆解:
srcset列出候选图片及其真实像素宽度(w描述符,如400w、800w);sizes告知浏览器该图片在页面上实际会显示多宽(例如窄屏满宽100vw、宽屏半宽50vw);- 浏览器综合**视口宽度 × 设备像素比(DPR)**自动选出最合适的文件:在 2x 屏上,
50vw的图片槽位会被视为需要约100vw的物理像素资源,从而选择更高分辨率的候选。
6.2 picture:艺术指导(Art Direction)
当不同尺寸需要不同构图/裁切(而非仅仅不同分辨率)时,用<picture>按媒体条件切换:
<picture> <source media="(min-width: 768px)" srcset="wide.jpg"> <source media="(max-width: 767px)" srcset="tall.jpg"> <img src="fallback.jpg" alt="..."> </picture>- 桌面端展示横向宽幅构图(
wide.jpg),移动端展示纵向竖幅构图(tall.jpg); <img>作为最终的兜底与无障碍锚点:任何<source>不匹配时回退到它,且alt只写一次。
判断用哪种:只需换分辨率用srcset,需要换构图用picture。规范还隐含提醒:src本身也应提供,保证最老浏览器可用。
七、布局适配模式:导航、表格与渐进式披露
规范对三类高频组件给出了明确的移动端适配策略:
导航——三段式演进:
- 移动端:汉堡菜单 + 抽屉(drawer);
- 平板:水平紧凑导航;
- 桌面:带标签的完整导航。
核心原则是"渐进收敛而非删除":同一组导航项在不同宽度下改变呈现密度,而不是在移动端直接砍掉入口。
表格——移动端转卡片: 用display: block配合data-label属性,把表格行重排为卡片式布局。每个单元格在窄屏下通过data-label注入列名,保持"列标题 + 值"的可读对:
@media (max-width: 640px) { table, thead, tbody, th, td, tr { display: block; } td::before { content: attr(data-label); /* 加粗或置灰,作为行内列名 */ } }<td>/* Opt-in helpers — set>赞- 人工智能
- AI Agent
- AI 应用
- 前端
- 后端
- 即时通讯
- 交互助手
- 工具调用
【免费下载链接】holaOS
Open-source agentic workspace enterprises can make their own. Connect the systems you already run — 100+ integrations, MCP, chat tools, apps, browser, local files — with shared memory. Any agent (Claude Code, Codex), any model, or BYOK. Set up in clicks, not months. Local-first: your data never leaves your machines.
相关推荐
GeoAI技术架构深度解析:构建地理空间智能分析工作流
GeoAI技术架构深度解析:构建地理空间智能分析工作流 在当今数据驱动的世界中,地理空间人工智能(GeoAI)正成为环境监测、城市规划、灾害响应等领域的核心技术
人工智能计算机视觉GIS图像处理微调UI-TARS桌面应用:重新定义电脑操作方式的视觉AI智能革命
UI TARS桌面应用:重新定义电脑操作方式的视觉AI智能革命 你是否曾幻想过,只需要对电脑说句话,它就能理解你的意图并自动完成所有操作?传统的自动化工具需要复
人工智能大模型AI Agent桌面应用GUI 自动化浏览器控制MCP 服务MCP Clients如何安装和配置 nvim-spider:10分钟快速上手指南
如何安装和配置 nvim spider:10分钟快速上手指南 想要在Neovim中实现更智能的文本移动吗?nvim spider插件是你的终极解决方案!这款强大