wxwork-revision-task-modal-space-selector-fix.md 10 KB

企业微信侧边栏 - 创建改图任务弹窗空间选择修复

🔍 问题描述

在企业微信侧边栏中打开"创建改图任务"弹窗时,"涉及空间"选择区域存在以下问题:

  1. 空间名称显示异常:文字位置错乱,部分空间名称无法正常显示
  2. 勾选框错位:勾选框与文字未对齐,位置偏移
  3. 布局溢出:内容超出可视范围,导致空间选项显示不全

影响范围:企业微信侧边栏(移动端宽度 < 480px)


✅ 修复方案

1. 弹性布局优化(核心修复)

问题根源

原有布局虽然使用了 display: flex,但缺少关键的 min-width: 0 属性,导致文字溢出容器。

修复代码

.space-item {
  display: flex;              // ✅ 弹性布局
  align-items: center;        // ✅ 勾选框与文字垂直居中
  gap: 8px;                   // ✅ 勾选框与文字间距
  min-width: 0;               // ✅ 防止文字溢出容器(关键!)
  box-sizing: border-box;     // ✅ 包含padding和border在内
  
  @media (max-width: 480px) {
    min-height: 42px;         // ✅ 增加高度,确保触摸友好
    gap: 10px;                // ✅ 增大间距,防止重叠
  }
}

修复效果

  • ✅ 勾选框与文字垂直对齐
  • ✅ 间距统一,布局整洁
  • ✅ 触摸目标足够大,易于操作

2. 勾选框尺寸固定

问题根源

勾选框可能被弹性布局拉伸或压缩,导致位置偏移。

修复代码

input[type="checkbox"] {
  width: 16px;
  height: 16px;
  flex: none;                 // ✅ 固定尺寸,不参与弹性分配(关键!)
  flex-shrink: 0;             // ✅ 防止checkbox被压缩
  margin: 0;                  // ✅ 清除默认边距
  cursor: pointer;
  
  @media (max-width: 480px) {
    width: 18px;              // ✅ 企业微信端增大,更易点击
    height: 18px;
  }
}

修复效果

  • ✅ 勾选框尺寸固定,不会变形
  • ✅ 企业微信端增大到18px,提升触摸体验
  • ✅ 清除默认边距,使用gap控制间距

3. 文字溢出处理

问题根源

空间名称过长时,文字溢出导致布局混乱或竖向排列。

修复代码

span {
  flex: 1;                    // ✅ 占据剩余空间
  min-width: 0;               // ✅ 允许文字被截断(关键!)
  font-size: 13px;
  line-height: 1.4;
  
  // 桌面端和平板端:文字省略
  @media (min-width: 769px) {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  
  // 企业微信侧边栏:文字省略
  @media (max-width: 480px) {
    font-size: 13px;          // ✅ 保持易读
    white-space: nowrap;      // ✅ 不换行
    overflow: hidden;         // ✅ 溢出隐藏
    text-overflow: ellipsis;  // ✅ 显示省略号
    word-break: keep-all;     // ✅ 保持单词完整
  }
}

修复效果

  • ✅ 长空间名称自动截断,显示省略号
  • ✅ 文字绝对不会竖向排列
  • ✅ 保持单词完整性,不在单词中间断开

4. 容器宽度限制

问题根源

空间选择容器宽度不受限制,在企业微信侧边栏中可能超出可视范围。

修复代码

.space-selector {
  display: grid;
  overflow-x: hidden;         // ✅ 防止横向溢出
  max-width: 100%;            // ✅ 限制最大宽度
  -webkit-overflow-scrolling: touch; // ✅ iOS平滑滚动
  
  @media (max-width: 480px) {
    grid-template-columns: 1fr; // ✅ 单列布局,确保宽度充足
    max-width: 280px;         // ✅ 匹配企微侧边栏宽度
    padding: 10px;            // ✅ 适中的padding
    max-height: 240px;        // ✅ 增加高度,显示更多空间
  }
}

修复效果

  • ✅ 容器宽度适配企业微信侧边栏(≤280px)
  • ✅ 单列布局,每个空间选项占一行
  • ✅ 防止横向滚动,内容始终在可视范围内

5. 企微WebView兼容

问题根源

企业微信使用定制化WebView,需要特殊处理以避免内容被裁切。

修复代码

.modal-body {
  -webkit-text-size-adjust: 100%; // ✅ 适配企微WebView
  overflow-x: hidden;             // ✅ 防止横向溢出
  -webkit-overflow-scrolling: touch; // ✅ iOS平滑滚动
}

.modal-container {
  @media (max-width: 480px) {
    width: 90vw;                  // ✅ 不超过视口宽度的90%
    max-width: 90vw;              // ✅ 限制最大宽度
    max-height: 80vh;             // ✅ 不超过视口高度的80%
    overflow-y: auto;             // ✅ 内容溢出时显示垂直滚动条
  }
}

修复效果

  • ✅ 文字大小自适应,不被WebView强制缩放
  • ✅ 弹窗大小适配视口,不超出屏幕
  • ✅ 平滑滚动体验,符合iOS用户习惯

6. 已选中状态增强

问题根源

原有已选中状态不够醒目,用户难以快速识别。

修复代码

.space-item.selected {
  border-color: #4f46e5;
  background: #e8f0fe;            // ✅ 企微蓝浅色调(更醒目)
  
  input[type="checkbox"] {
    accent-color: #4f46e5;        // ✅ 勾选框颜色
  }
}

.selected-count {
  font-weight: 600;               // ✅ 增强字重
  padding: 4px 8px;               // ✅ 添加内边距
  background: #ede9fe;            // ✅ 浅色背景
  border-radius: 6px;             // ✅ 圆角
  display: inline-block;          // ✅ 适应内容宽度
}

修复效果

  • ✅ 已选空间背景色更醒目(企微蓝 #e8f0fe)
  • ✅ "已选择 X 个空间"提示更突出
  • ✅ 视觉反馈清晰,用户体验更好

📊 修复前后对比

项目 修复前 修复后
勾选框位置 ❌ 错位,与文字不对齐 ✅ 垂直居中,完美对齐
空间名称显示 ❌ 溢出或竖向排列 ✅ 横向显示,过长省略
容器宽度 ❌ 可能超出可视范围 ✅ 限制在280px内,适配侧边栏
布局方式 ❌ 双列或多列(被压缩) ✅ 单列布局,宽度充足
触摸目标 ❌ 勾选框16px,较小 ✅ 勾选框18px,易点击
已选反馈 ⚠️ 背景色不够醒目 ✅ 企微蓝浅色,清晰可见
文字大小 ⚠️ 可能被WebView缩放 ✅ 固定100%,不被缩放
滚动体验 ⚠️ 普通滚动 ✅ iOS平滑滚动

🎯 核心修复要点

关键CSS属性(必须理解!)

  1. min-width: 0 - 防止flex子项溢出

    // ❌ 错误:文字溢出容器
    .space-item {
     display: flex;
     // 缺少 min-width: 0
    }
       
    // ✅ 正确:文字可以被截断
    .space-item {
     display: flex;
     min-width: 0; // 允许收缩
    }
    
  2. flex: none - 固定尺寸,不参与弹性分配

    // ❌ 错误:勾选框可能被拉伸或压缩
    input[type="checkbox"] {
     width: 16px;
     height: 16px;
    }
       
    // ✅ 正确:勾选框尺寸固定
    input[type="checkbox"] {
     width: 16px;
     height: 16px;
     flex: none; // 不参与弹性分配
     flex-shrink: 0; // 不允许收缩
    }
    
  3. text-overflow: ellipsis - 文字溢出显示省略号

    // ❌ 错误:文字溢出容器外
    span {
     flex: 1;
    }
       
    // ✅ 正确:文字溢出显示...
    span {
     flex: 1;
     min-width: 0;
     white-space: nowrap;
     overflow: hidden;
     text-overflow: ellipsis;
    }
    

🧪 测试验证

测试场景

  1. 短空间名称(如"卧室"、"客厅")

    • ✅ 勾选框与文字对齐
    • ✅ 布局整洁,间距统一
  2. 长空间名称(如"主卧室(带卫生间)")

    • ✅ 文字自动截断,显示省略号
    • ✅ 勾选框始终在左侧,位置固定
  3. 超长空间名称(如"客厅餐厅一体化空间设计")

    • ✅ 文字被截断为"客厅餐厅一体化空..."
    • ✅ 不会竖向排列或溢出容器
  4. 多个空间选择

    • ✅ 已选空间背景色变为企微蓝
    • ✅ "已选择 X 个空间"提示醒目

测试设备

  • 企业微信iOS端(iPhone)
  • 企业微信Android端
  • 企业微信桌面版侧边栏

预期结果

  • ✅ 所有空间选项完整显示
  • ✅ 勾选框与文字完美对齐
  • ✅ 触摸目标足够大,易于点击
  • ✅ 滚动流畅,无卡顿
  • ✅ 已选状态清晰可见

📝 技术总结

Flex布局的黄金法则

  1. 父容器display: flex + align-items: center
  2. 固定尺寸子项flex: none + flex-shrink: 0
  3. 可伸缩子项flex: 1 + min-width: 0
  4. 间距控制:使用gap而非margin

企微WebView适配要点

  1. 禁止文字缩放-webkit-text-size-adjust: 100%
  2. 相对单位:使用vw/vh而非固定px
  3. 平滑滚动-webkit-overflow-scrolling: touch
  4. 防止溢出overflow-x: hidden

响应式设计原则

  1. 移动优先:先设计移动端,再扩展桌面端
  2. 断点合理:768px(平板)、480px(手机)
  3. 触摸友好:按钮/勾选框最小44x44px
  4. 内容优先:减少padding,留给内容更多空间

🚀 部署验证

构建命令

ng build yss-project --base-href=/dev/yss/

部署命令

.\deploy.ps1

验证步骤

  1. 在企业微信中打开任意项目
  2. 点击"创建改图任务"按钮
  3. 选择"大修改"任务类型
  4. 观察"涉及空间"选择区域
  5. 验证勾选框与文字对齐
  6. 尝试选择多个空间
  7. 验证已选状态显示

📚 参考资料

CSS Flexbox规范

企业微信WebView

  • 企业微信API文档
  • Webkit WebView适配指南

响应式设计


修复完成时间:2025-11-30 10:30
修复人员:开发团队
测试状态:✅ 待部署验证
影响范围:企业微信侧边栏 - 创建改图任务弹窗
优先级:🔥 高(影响用户操作体验)