Forráskód Böngészése

style(顾客页): 中间那块空白用键盘与金额吃掉(手机键 52→66、金额 34→46;宽屏键行高跟窗口走)

用户报文「中间留白太多了」,问到是哪种窗口时答「两个都看了,都空」(390 与 1440 都空)。
上一版留白 426(390×844)/ 482(1440×900),占屏 50% 上下;参照页在同尺寸下是 465,
**比我们还空** —— 所以没有一个「参照页多少我们就多少」的锚点可用,只能照用户选的方向做:
把空白交给界面自己吃掉(加高键盘、放大金额),而不是把柱子收窄。

- 键行高 52 → 66、键上数字 21 → 24、退格图标 24 → 26;「付款」字号 19 → 21。
- 金额 34 → 46(占位 28 → 36 同比),¥ 26 → 32,金额行 min-height 46 → 62。
- 骨架跟着走:金额块 34 → 46;键区高度由写死的 226 改成
  `calc(var(--key-row) * 4 + 18px)`,行高提成 `--key-row` 变量,两处只有一个源。

手机 390×844:留白 426 → 372,scrollHeight 仍 844(不滚动),键 89×66。
最长的合法金额 "9999999.99" 在 46px 下 canvas 实测 268px,输入框可用 330px。

宽屏另加一段 @media (min-width: 600px),让键盘自己长高。空白在桌面上唯一的用处就是
「别太挤」,不管它就会跟着显示器一起长。行高用 clamp(66px, 12vh, 112px) 而不是定值 ——
定 112 的话 1440×700 这类半屏窗口内容会到 675 而窗口只有 700,再矮一点就平白长出滚动条;
12vh 让它跟着窗口缩,下限 66 就是手机那一档,上限 112 = 键宽(正好见方)。
1440×900:键 112×108、留白 482 → 260;1440×600:键 112×72、留白 104;
1440×700 与 1920×1080 也量过,五档 scroll 都等于视口。390×844 下**逐格不变**
(键仍 89×66、留白仍 372)—— 先往浏览器注入候选 CSS 量过,再改源码,改完复量一致。

量具换了一支:MCP 那个浏览器是用户正在用的窗口,setViewportSize 被钳住(要 1440×900,
读回 innerWidth=1249、outerHeight=1380)⇒ 视口不可控,基于它的读数作废。改用自己的
headless 实例(logs/_measure.mjs,--browser chrome),视口由命令行钉死;两支量具在重叠
处读数一致(390: 372 / 1440: 428)。

验证:键盘交互表 23/23(headless 真点键,含「被拒后再输入即复原」与下单遮罩 5ms 轮询抓取);
加载态骨架与真键区两档逐字节同框(390: 554/282/836;1440: 442/450/892);
`node _verify-checkout/title.mjs` 4 通过 / 0 失败;`pnpm ts:check` 289 条,与改动前同数
(该命令恒 exit 2,基线非零),views/checkout 0 条。

顺带修了预览台一处会污染截图的东西:未知 `/api/*` 原先兜底成 index.html(200 + HTML),
应用启动拉的 `/api/v1/system/param/info` 拿到 HTML 就弹一个 Element Plus 报错吐司
(截图里压在商户名上的那个红块),过几秒自己消失。改成对未 mock 的 `/api/*` 回 404。
这是台子的毛病、不是页面的,但它会混进每一张截图。

只有前端产物变化,无后端改动 ⇒ 无需重打 jar。
alphaH 2 hete
szülő
commit
712e1c4dbe
1 módosított fájl, 51 hozzáadás és 15 törlés
  1. 51 15
      frontend/src/views/checkout/index.vue

+ 51 - 15
frontend/src/views/checkout/index.vue

@@ -447,6 +447,10 @@ onUnmounted(() => {
                             白块压在 #fafafa 上几乎分不出边界 */
   --danger: #e34d59;     /* 校验失败。与后台 Element Plus 的 danger 同色 */
   --key-shadow: 0 2px 2px rgb(0 0 0 / 18%), 0 1px 1px rgb(0 0 0 / 16%);
+  /* 键行高。定成变量是因为**两处**要用它:键盘自己,和加载态骨架
+     (骨架高度必须等于键区高度,否则回复一到整页会跳一下)。
+     宽屏那段会覆盖它 —— 见文件末尾的 @media。 */
+  --key-row: 66px;
 
   /* ★ 宽度必须在这里定死,不能留给内容去决定。祖先链 html/body/#app 三层**全是
      display:flex** ⇒ 这一层是个 flex 项,而 flex 项的 min-width:auto 落在 min-content 上:
@@ -506,11 +510,11 @@ onUnmounted(() => {
   align-items: center;
   gap: 8px;
   margin-top: 6px;
-  min-height: 46px;
+  min-height: 62px;
 }
 
 .amount__symbol {
-  font-size: 26px;
+  font-size: 32px;
   font-weight: 700;
 }
 
@@ -521,7 +525,7 @@ onUnmounted(() => {
   min-width: 0;
   padding: 0;
   font-family: inherit;
-  font-size: 34px;
+  font-size: 46px;
   font-weight: 700;
   color: var(--ink);
   font-variant-numeric: tabular-nums;
@@ -529,9 +533,10 @@ onUnmounted(() => {
   border: none;
   outline: none;
 
-  /* 占位比真值小一号、细一档 —— 参照页就是这么分的(30px/500 对 35px/700) */
+  /* 占位比真值小一号、细一档 —— 参照页就是这么分的(30px/500 对 35px/700,
+     这里是它那个比例放大后的 36px/500 对 46px/700) */
   &::placeholder {
-    font-size: 28px;
+    font-size: 36px;
     font-weight: 500;
     color: var(--placeholder);
   }
@@ -577,7 +582,7 @@ onUnmounted(() => {
 .pad {
   display: grid;
   grid-template-columns: repeat(4, 1fr);
-  grid-auto-rows: 52px;
+  grid-auto-rows: var(--key-row);
   gap: 6px;
   padding: 8px 8px calc(8px + env(safe-area-inset-bottom));
 }
@@ -588,7 +593,7 @@ onUnmounted(() => {
   justify-content: center;
   padding: 0;
   font-family: inherit;
-  font-size: 21px;
+  font-size: 24px;
   font-weight: 700;
   color: #000;
   cursor: pointer;
@@ -626,7 +631,7 @@ onUnmounted(() => {
 .pad__key--pay {
   grid-column: 4;
   grid-row: 2 / span 3;
-  font-size: 19px;
+  font-size: 21px;
   color: #fff;
   background: var(--brand);
 
@@ -643,11 +648,42 @@ onUnmounted(() => {
 }
 
 .pad__icon {
-  width: 24px;
-  height: 24px;
+  width: 26px;
+  height: 26px;
   color: #333;
 }
 
+/* ── 宽屏:空白交给键盘吃掉 ──
+   这一屏在桌面上没有「拇指够不够得着」这回事,中间那块空白唯一的用处就是「别太挤」;
+   可不管它的话它会跟着显示器一起长 —— 柱子收到 480 之后,1440×900 实测空出 428px,
+   整页像一条被拉长的收据。让它长在键盘上:键一大,这块空自然就短了。
+
+   行高取 clamp 而不是定值。定 112 的话,1440×700 这种半屏窗口上内容会到 675 而窗口
+   只有 700 —— 再矮一点就平白长出滚动条;12vh 让它跟着窗口缩。下限 66 就是手机那一档
+   (窗口再矮也不小于手机),上限 112 = 键宽(键 112 宽时正好见方,再高就拉长了)。
+   键上的字要一起放大,否则一格 112 里蹲着个 24px 的数字,看着发虚。
+
+   ★ 这一段只挂在 ≥600px。390×844 下逐格不变:键仍 89×66、scrollHeight 仍 844
+   (实测,改前改后同一批读数)。 */
+@media (min-width: 600px) {
+  .checkout {
+    --key-row: clamp(66px, 12vh, 112px);
+  }
+
+  .pad__key {
+    font-size: 30px;
+  }
+
+  .pad__key--pay {
+    font-size: 26px;
+  }
+
+  .pad__icon {
+    width: 34px;
+    height: 34px;
+  }
+}
+
 /* ── 跳转中:盖满整屏 ── */
 .redirect {
   position: fixed;
@@ -730,16 +766,16 @@ onUnmounted(() => {
 
 .skeleton--amount {
   width: 42%;
-  height: 34px;
+  height: 46px;
   margin-top: 10px;
 }
 
 /* 键盘那块占位压在屏幕下沿(margin-top:auto)。高度对齐的是**键区**、不是整个键盘块:
-   4×52 + 3×6 = 226,正好是真键盘第一排键的上沿到最后一排键的下沿(390×844 实测
-   骨架 610→836,真键盘的键 610→836)。键盘块自己的上下各 8px 是贴着页面底色的留白,
-   占位不该连它一起画 —— 那样两边会差 16px。 */
+   4 行 + 3 个 6px 缝 = 4×行高 + 18,正好是真键盘第一排键的上沿到最后一排键的下沿。
+   键盘块自己的上下各 8px 是贴着页面底色的留白,占位不该连它一起画 —— 那样会差 16px。
+   用 `var(--key-row)` 而不是写死:宽屏下行高会变,写死的话骨架与真键区就对不上了。 */
 .pad-skeleton {
-  height: 226px;
+  height: calc(var(--key-row) * 4 + 18px);
   margin: auto 8px calc(8px + env(safe-area-inset-bottom));
   background: #e9ebee;
   border-radius: 5px;