|
| 1 | +--- |
| 2 | +name: nutui-proportional-scaling |
| 3 | +description: >- |
| 4 | + NutUI React proportional scaling on branch feat_resize: runtime --nut-scale-f / |
| 5 | + --nut-scale-font / --nut-scale-icon from scale-f.ts (H5) and scale-f.taro.ts |
| 6 | + (Taro), Sass helpers scale-px / scale-font-px / scale-icon-px and theme font |
| 7 | + tokens in variables.scss & theme-*.scss; profiles standard / large / elderly; |
| 8 | + commit-backed rules e.g. never scale 0px. Use when implementing 多尺寸适配, |
| 9 | + 等比适配, 大字版, 老年版, scale-px, viewport or native bridge scaling, or |
| 10 | + editing component SCSS for resize. |
| 11 | +--- |
| 12 | + |
| 13 | +# NutUI React 等比适配 |
| 14 | + |
| 15 | +## 1. 运行时:谁在写 CSS 变量 |
| 16 | + |
| 17 | +- **H5**:`src/utils/scale-f.ts` |
| 18 | + - `initScaleF(profile?)`:首次计算缩放、`resize` 时 `refreshScaleF`。 |
| 19 | + - `getScaleF`:优先 `jmfe.callNative('DongScreenAdapterPlugin','getScale')`,失败用视口规则。 |
| 20 | + - 视口回退要点:`innerWidth >= 600` 视作 pad,基准乘 `1.2`;`375–600` 间按 `375` 比例,**上限 1.17**(与源码常量一致)。 |
| 21 | +- **Taro 侧复用同一套契约**:`src/utils/scale-f.taro.ts`,并从 `src/utils/index.taro.ts` 导出。 |
| 22 | +- 写入 `:root` 的变量(与 `variables.scss` 一致): |
| 23 | + - `--nut-scale-f`:布局/通用 `scale-px` |
| 24 | + - `--nut-scale-font`:`scale-font-px`、主题 `--nutui-font-size-*` |
| 25 | + - `--nut-scale-icon`:`scale-icon-px`、图标相关 |
| 26 | + |
| 27 | +**档位 `ScaleProfile`**:`standard` | `large` | `elderly`(仅后两者生效额外倍率)。 |
| 28 | +**场景倍率**(与 `getSceneRatio` 一致):老年对 `font` / `icon` / `lego` × `1.3`;大字仅对 `font` × `1.15`。 |
| 29 | + |
| 30 | +**JS 里算像素**:`calcByProfile(baseValue, { scene, profile?, scale?, device? })` — 用于组件内联样式、画布尺寸等,与 Sass 的 `calc(...* var(--nut-scale-*))` 同一套语义。 |
| 31 | + |
| 32 | +--- |
| 33 | + |
| 34 | +## 2. 样式层:`variables.scss` 中的函数 |
| 35 | + |
| 36 | +```scss |
| 37 | +// 根上默认值见 variables.scss :root |
| 38 | +@function scale-px($size) { |
| 39 | + @return calc(#{$size} * var(--nut-scale-f, 1)); |
| 40 | +} |
| 41 | +@function scale-font-px($size) { |
| 42 | + @return calc(#{$size} * var(--nut-scale-font, var(--nut-scale-f, 1))); |
| 43 | +} |
| 44 | +@function scale-icon-px($size) { |
| 45 | + @return calc(#{$size} * var(--nut-scale-icon, var(--nut-scale-f, 1))); |
| 46 | +} |
| 47 | +``` |
| 48 | + |
| 49 | +**主题字号档**(`theme-default.scss` / `theme-dark.scss`):`--nutui-font-size-*` 使用 `calc(Npx * var(--nut-scale-font, var(--nut-scale-f, 1)))`,与 **大字/老年** 档位对齐。 |
| 50 | + |
| 51 | +--- |
| 52 | + |
| 53 | +## 3. 提交里固化的规范(务必遵守) |
| 54 | + |
| 55 | +### 3.1 「0px 不转换」(`1a35d9b8`) |
| 56 | + |
| 57 | +凡应为 **数值 0** 的尺寸,**不要**写 `scale-px(0px)`,一律 **`0`** 或 **`0px`**(如 padding 某一维、`box-shadow` 偏移、border 为 0、`margin: 0`)。 |
| 58 | +否则会得到 `calc(0px * var(--nut-scale-f))`,在部分浏览器或亚像素场景下与纯 `0` 表现不一致。 |
| 59 | + |
| 60 | +### 3.2 `line-height` |
| 61 | + |
| 62 | +- **比例行高**(如 `line-height: 1`):不随系数变,用于挤压行盒、图标对齐等 — 与「等比 px」不同维度。 |
| 63 | +- **与设计稿 px 绑定的行高**:用与字号一致的档位,通常为 **`scale-font-px`**,或与同一变量体系。 |
| 64 | +- 参考历史修复:弹层标题等曾去掉不恰当的固定 `line-height` 以免与大字模式冲突 — 新增时不要给标题随意写死 `line-height: 20px` 类样式,除非走缩放函数或主题变量。 |
| 65 | + |
| 66 | +### 3.3 组件 SCSS 迁移模式(`dc4f1e28` / 后续 style 提交) |
| 67 | + |
| 68 | +- 间距、圆角、`border` 粗细、固定宽高(非纯文字):优先 **`scale-px`**。 |
| 69 | +- 纯字体大小:`scale-font-px` 或主题已有 `--nutui-font-size-*`。 |
| 70 | +- 图标占位:**`scale-icon-px`** 或已有 `--nut-icon-*`。 |
| 71 | +- 保持与 **无障碍/大屏** 相关提交协同:同一文件改尺度时,勿回退 `dialog` 等对大字兼容的改动。 |
| 72 | + |
| 73 | +--- |
| 74 | + |
| 75 | +## 4. 业务接入清单 |
| 76 | + |
| 77 | +1. **入口调用**:在应用入口(仅浏览器环境)调用 `initScaleF(可选档位)`;档位可随业务切换并依赖内部 `setScaleProfile` 刷新变量。 |
| 78 | +2. **Taro**:使用 `scale-f.taro` 导出,保证 H5 与小程序 WebView 行为一致(仍以仓库实现为准)。 |
| 79 | +3. **覆写主题**:通过 `--nutui-*` 或 `--nut-scale-*` 覆盖时,保持 `calc` 与变量回退链完整。 |
| 80 | +4. **验收**:切换标准/大字/老年、收窄与放宽视口、(如有)站内容器走原生 `getScale`,检查布局与字号是否同比变化且无「0px 被 scale」问题。 |
| 81 | + |
| 82 | +--- |
| 83 | + |
| 84 | +## 5. Agent 自检(改完缩放权相关代码时) |
| 85 | + |
| 86 | +- [ ] 新增 **0** 尺寸未误用 `scale-px(0px)`。 |
| 87 | +- [ ] 字体/图标是否应走 **`scale-font-px` / `scale-icon-px`** 而非误用 `scale-px`。 |
| 88 | +- [ ] TS 侧改 `scale-f*` 已同步考虑 **Taro** 文件。 |
| 89 | +- [ ] 修改 `formatScaleValue` / 断点时,已通读 **视口与平板常量** 是否仍与文档、设计一致。 |
| 90 | + |
| 91 | +若与上游分支分歧,以**当前分支 `feat_resize` 最新提交**及 `src/utils/scale-f*.ts`、`src/styles/variables.scss` 为准。 |
0 commit comments