响应式Responsive
组件默认按容器宽度自适应:能换行就换行,长文字省略,不写死宽度。在此之上有四个断点、一种统一的响应式属性写法,以及两个按自身宽度(而不是视口)判断的骨架组件。
断点
四个,都是 min-width:sm 520、md 768、lg 1024、xl 1280。没有“小于 sm”的名字,那就是默认(base)。
拖动浏览器窗口的宽度,亮起的徽标会跟着变。
sm ≥ 520md ≥ 768lg ≥ 1024xl ≥ 1280
css
/* 断点是 min-width,CSS 里直接写数值 */
@media (min-width: 520px) { /* sm */ }
@media (min-width: 768px) { /* md */ }
@media (min-width: 1024px) { /* lg */ }
@media (min-width: 1280px) { /* xl */ }脚本里用 useBreakpoint('md')(视口不小于 768px 时为 true),常量在 BREAKPOINTS 里。它基于 matchMedia,服务端渲染时返回第二个参数 fallback(默认 true)。只是显隐或换布局的话优先用下面的纯 CSS 办法,首屏不会闪。
响应式属性 Responsive<T>
布局原语的 gap、padding、columns、align、justify、span 都接受单个值,或一个按断点给值的对象。
1
2
3
4
ts
type Responsive<T> = T | { base?: T; sm?: T; md?: T; lg?: T; xl?: T };- 对象写法向上补齐:
{ base: 2, md: 4 }等于 base 2、sm 2、md 4、lg 4、xl 4。 - 没给
base时,小于第一个给了值的断点用组件的默认值。 - 实现上是把值写成带断点后缀的 CSS 变量,由样式表在对应的
@media里解析,全程不需要脚本判断视口,服务端渲染出来的首屏就是对的。
Show / Hide
按断点显隐,纯 CSS:内容始终在 DOM 里,只是 display: none。包裹层是 display: contents,不参与布局。
Show above="md":宽屏才有
Show below="md":窄屏才有
Hide below="sm":最窄时隐藏
被隐藏的内容对读屏也是隐藏的,但组件仍然挂载着、副作用照常运行。两套内容差别很大、或者其中一套很重时,改用 useBreakpoint 条件渲染。更多示例见 Show / Hide。
按容器宽度:AppShell 与 SplitPane
断点看的是视口。但一个组件被放进侧栏、对话框或者演示框里时,视口很宽而它自己很窄。这两个骨架组件因此能按自身宽度判断。
SplitPane
SplitPane 始终按自己的宽度决定是否堆叠(@container),stackBelow 指定阈值。
列表
详情
触屏
- 触屏设备(
pointer: coarse)上控件高度自动从 32 / 40 / 48 抬到 36 / 44 / 52,输入框字号变成 16px(避免 iOS 聚焦时放大页面)。 - 悬停样式都包在
@media (hover: hover)里,点按之后不会残留悬停态。 - 贴边的容器(
AppShell、Container、TabBar、悬浮卡片)会避开safe-area-inset-*。 - 对话框在各种宽度下形态不变,都从触发点放大;贴边的抽屉、面板在窄屏上铺满整宽、右上角有关闭按钮,可以朝停靠的一侧滑动关闭;通知横向撑满。
API
useBreakpoint(bp, fallback?)
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
bp* | 'sm' | 'md' | 'lg' | 'xl' | — | 断点名。返回视口是否不小于它。 |
fallback | boolean | true | 服务端渲染时返回的值。 |
相关的还有 useMediaQuery(query, fallback?),用于断点之外的媒体查询。