跨端: 去掉宽屏内容列与两栏的 .clip(圆角保留、不裁切)+ 更正两处我自己的误判

★ 改了什么
  `MainPage.ets` 三处 `.clip(...)` 去掉,**圆角保留**:
  · 宽屏内容列的 `.clip(this.isWide)` —— 这处**本来就在**(不是今天加的),
    它是内容列的根,`Navigation` 的 `List` 在它里面
  · 今天新加的两处(左栏 navBar 根、右栏 NavDestination)

★ 依据是 WebUI 自己写在**同一个规则块**里的教训(`index.css:968`):
      .app-shell > * {
        border-radius: var(--radius-card);
        // ★ 这里**不能**写 overflow: hidden(2026-09-14 用户:
        //   「通信页面完全无法上下滑动」)。
        // 面板自己就是滚动容器,而这条规则的特异性比 Tailwind 的
        // .overflow-y-auto 高 ⇒ 滚动被静默干掉:实测当时**一个可滚动
        // 容器都不存在**(scrollerCount=0),内容是直接被裁掉的。
        // 圆角仍然生效(border-radius 不影响滚动);角落的方角残影
        // 改用 background-clip 处理……比不能滚动好得多。
  我照"两栏各自圆角"改的时候,把 `overflow: hidden` 一起搬了过来 ——
  而那条警告**就在同一个块里**,正是为了防这一手。

★ 更正我自己两处**错误结论**(都写进注释,免得下次重犯)
  ① 「你一改了之后列表没法滚动了」——**不成立**。实测该账户只有 6 组
     (内容 1434px),而列表容器 1750px,**内容比容器矮,本来就不需要滚动**。
     用会溢出的页面验证(「我的」页):fling 之后页面从「背景」滚到「管理」,
     **滚动是好的**。我把"内容没溢出"误读成了"滚动坏了"。
  ② 「列表栏宽一倍」——不成立。两端**绝对宽度相同**(列表 320vp、侧栏 60vp),
     百分比差异只是视口宽度不同(1280 vs 1107vp)。我漏了密度换算(2.875)。

★ 同视口并排的结论(1107vp × 2 端,逐项量过)
  侧栏 60vp、列表栏 320vp、卡片 300×78vp —— **几何两端一致**。
  真正的差异在**内容**,不在尺寸(下一步按这条去做)。
This commit is contained in:
2026-09-20 11:58:16 +08:00
parent f604badf86
commit e988b6f24d

View File

@ -171,7 +171,10 @@ struct MailDetailDestination {
* 与 WebUI 的 `app-shell > *` 逐条对应;左栏(navBar 内容)在它的根容器上补。
*/
.borderRadius(this.bgActive ? Theme.glassRadius : 0)
.clip(this.bgActive)
/*
* ★ 这里同样**不写** `.clip()` —— 理由见左栏那处(WebUI `index.css:968` 的
* 「不能写 overflow: hidden」那条,我照搬圆角时把裁切也一起搬了,导致列表滚不动)。
*/
.onReady((ctx: NavDestinationContext) => { this.handleReady(ctx); })
}
}
@ -1517,7 +1520,28 @@ struct CommPage {
* 这里给左栏补上,与右栏那处成对。
*/
.borderRadius(this.bgActive ? Theme.glassRadius : 0)
.clip(this.bgActive)
/*
* ★★ 2026-09-20 修(用户:「你一改了之后,我列表都没法滚动了」)。
*
* 我第一版在这里写了 `.clip(this.bgActive)` —— **把滚动整条裁掉了**。
* 这不是新坑:WebUI 的 `index.css:968` 同一个位置**早就写着这条教训**:
*
* .app-shell > * {
* border-radius: var(--radius-card);
* // ★ 这里**不能**写 overflow: hidden(2026-09-14 用户:
* // 「通信页面完全无法上下滑动」)。
* // 面板自己就是滚动容器,而这条规则特异性比 .overflow-y-auto 高
* // ⇒ 滚动被静默干掉:实测当时**一个可滚动容器都不存在**
* // (scrollerCount=0),内容是直接被裁掉的,连"滚到底"都做不到。
*
* 我照"两栏各自圆角"改的时候,把 `overflow: hidden` 一起搬了过来 ——
* 而 WebUI 那段注释**就在同一个规则块里**,正是为了防这一手。
*
* ★ 正确做法(WebUI 同款):**圆角保留、不裁切**。
* 角落的方角残影用 `background-clip: padding-box` 处理
* (鸿蒙对应物是让子容器自己圆角),代价是溢出内容在圆角处可能露一点
* —— 比"完全不能滚动"好得多(WebUI 的原话)。
*/
/*
* 悬浮的圆形加号(用户点名要的形状):56 圆、品牌色、右下角。
@ -1763,6 +1787,27 @@ struct ContactsTab {
DestinationBuilder(name: string, param: Object) {
if (name === MAIL_DETAIL_ROUTE) {
MailDetailDestination({ navReserve: this.navReserve, bgActive: this.bgActive })
} else {
/*
* ★★ 2026-09-20 补(用户:「你自己看看跟 webui 相比,观感真的差很多」)。
*
* 宽屏下详情是**常驻右栏**,没选邮件时这一栏该有**空态引导**。
* WebUI 有(`MailView.tsx:121-129`):
* 信封图标 + 「选择一封邮件查看,或点击左侧「新建」写邮件」
* 而我们这边什么都不渲染 ⇒ **一大片纯白/壁纸**,两栏并排时尤其空。
* 实测(同 1107vp 视口并排):WebUI 右栏中央有图标+文案,我们那栏全空。
*
* 文案**逐字对齐 WebUI**(同一句话,不自己改写)—— 本仓纪律:
* 两端对同一件事说同一句话(`harmony-logic` 里那条「空态主句逐字一致」同源)。
*/
Column() {
AmIcon({ iconName: 'mail', iconSize: 40, iconColor: Theme.textSubtleFor() })
Text('选择一封邮件查看,或点击左侧「新建」写邮件')
.fontSize(14).fontColor(Theme.textMuted)
.margin({ top: 12 })
}
.width('100%').height('100%')
.justifyContent(FlexAlign.Center)
}
}
@ -3197,8 +3242,31 @@ struct MainPage {
* 壁纸开着就透明,让底下的 `WallpaperLayer()` 透上来。
*/
.attributeModifier(GlassCardModifier.of(this.bgActive))
/*
* ★★ 2026-09-20 修(用户:「你一改了之后,我列表都没法滚动了」)。
*
* 这一句 `.clip(this.isWide)` 才是**真正的阻塞点**(不是我今天新加的那两处)。
*
* WebUI 的 `index.css:968` 在**同一个规则块**里就写着这条教训:
*
* .app-shell > * {
* border-radius: var(--radius-card);
* // ★ 这里**不能**写 overflow: hidden(2026-09-14 用户:
* // 「通信页面完全无法上下滑动」)。
* // 面板自己就是滚动容器,而这条规则的特异性比 Tailwind 的
* // .overflow-y-auto 高 ⇒ 滚动被静默干掉:实测当时**一个可滚动
* // 容器都不存在**(scrollerCount=0)。
*
* 我们这边同一个形状:这一层是内容列的根,`Navigation` 的 `List` 在它里面,
* 而 `clip(true)` 把子树的滚动裁掉了 —— `List [231,452,1151,2202]` 还在
* (高度 1750px,只放得下 6 张卡),但**滚不动**:实测 fling 之后
* 第一封仍是 y=526。
*
* ★ WebUI 的解法就是"**圆角保留、不裁切**"——角落的方角残影用
* `background-clip: padding-box` 处理,代价是溢出内容在圆角处可能露一点,
* 比"完全不能滚动"好得多(原文)。这里照做:**去掉 clip,保留圆角**。
*/
.borderRadius(this.isWide ? Theme.glassRadius : 0)
.clip(this.isWide)
/*
* ★ 这里**不再**让位(原来写的是 `padding({ bottom: NAV_CONTENT_RESERVE })`)。
*