你有没有这种经历:
深夜加班,盯着几千行财务报表,鼠标点到一个关键数字,结果眼睛瞬间“迷路”——到底是哪一列的收入?哪一行的成本?来回扫好几遍,头都大了。
几乎所有重度用表格的人都遇到过这个痛点:选中一个单元格后,画面几乎没变化。只靠那一点点浅色背景,很难快速定位整行整列的关联数据。尤其在大屏、多列、复杂报表场景下,这种“视觉迷失”简直是效率杀手。
其实,这个问题早就有人解决了——它叫“单元格选中后的十字高亮”,也有人亲切地叫它“聚光灯”效果。就像舞台灯光一下子打下来,整个焦点瞬间清晰。
可惜,Excel至今没有原生支持。
国内的WPS早就悄悄加上了,用起来很爽。
而对于Web端、企业级应用开发者来说,SpreadJS作为一款真正的可编程控件,虽然当前版本不内置这个功能,却给了我们最自由的实现空间——自己动手,几分钟就能做出甚至比WPS更好用的版本。
今天我们就来聊聊这个“小而美”的功能:它为什么重要、别人是怎么做的、以及开发者如何在SpreadJS里把它玩出花来。
一、什么是“十字高亮/聚光灯”效果?
简单说:
当你选中任意一个(或一批)单元格后,自动高亮整行 + 整列,形成一个醒目的十字交叉区域。当前选中的单元格(或范围)像被聚光灯照亮,其他区域则变暗或半透明。
对比普通选中状态(只是当前格背景浅一点):
- 十字高亮能瞬间告诉你“这行数据整体趋势”“这列指标相互关系”
- 眼睛几乎不用跳跃,阅读效率大幅提升
- 特别适合财务报表、数据分析看板、物流清单、大屏监控等场景
几乎所有财务、数据分析、产品、运营同学看到这个效果都会说一句:“早知道有这个,我报表看得快多了!”
二、Excel为什么没有这个功能?
微软对Excel的设计理念一直是极简 + 通用。他们担心加太多视觉辅助会让界面显得“杂乱”,干扰核心用户群(尤其是习惯简洁的老用户)。
结果就是:这个呼声喊了十几年,官方依然没有原生支持。
网上能找到的方案大多是:
- 用条件格式 + CELL函数模拟(但必须按F9刷新,选中后不自动跟进)
- 写VBA监听SelectionChange事件(对普通用户门槛太高)
-
安装第三方插件(安全、兼容性又成问题)
用户反馈里,类似“希望Excel能高亮整行整列”的帖子年年都有,却始终停留在“建议”阶段。
这也让很多人转向WPS——毕竟,人家直接给解决了。
三、WPS是怎么做到的?
WPS表格(尤其是桌面版)对此事的处理非常接地气。
操作路径超级简单:
- 打开表格
- 右下角状态栏有个“高亮行列”小图标(或视图 → 高亮行列)
- 一点就开启,选中任意单元格,十字高亮立刻出现
- 还能点小箭头换颜色(蓝、绿、粉等)
优点显而易见:
- 开箱即用,零学习成本
- 普通白领、财务阿姨用起来毫无压力
- 确实大幅提升了长表格的阅读体验
但它也有局限:
- 高亮样式固定,无法深度定制(比如是否高亮表头、透明度、是否加动画)
- 如果你要把它嵌入到企业内部系统、做权限控制、跟随主题皮肤……WPS就无能为力了
一句话:WPS给出了标准答案,但它是个封闭的答案。
四、SpreadJS:不原生支持,却是最懂开发者的“空白画布”
这里要先诚实说一句:截至目前,SpreadJS官方并没有内置“十字聚光灯”这个开关。
但这恰恰是它的魅力所在——SpreadJS不是一个“黑盒子工具”,而是一款高度可编程的JavaScript表格控件。它把API、事件、渲染钩子全部开放给你。
这意味着什么?
- 你可以在Web端(React/Vue/Angular)轻松嵌入
- 可以和业务系统深度融合(动态开关、角色权限、跟随暗黑模式)
- 支持多Sheet联动、移动端触屏适配、大数据量优化
- 产品经理角度:用户反馈“想要聚光灯效果”,3天就能上线新特性
- 开发者角度:完全掌控体验,不被任何厂商“锁死”
Excel没有给出答案,WPS给你标准答案,SpreadJS给你一张空白画布——想怎么画,就怎么画。
五、在SpreadJS中实现十字高亮的思路与关键点
(以下内容适合有开发经验的读者;普通用户/产品经理可以粗看,感受“原来这么灵活”即可)
核心逻辑其实不复杂:监听选中变化 → 计算位置 → 绘制遮罩层。
常见实现方式(基于SpreadJS公开API):
1.监听事件
-
主要用
SelectionChanging/SelectionChanged捕获用户选中的变化。2.同时监听视口滚动(
TopRowChanged、LeftColumnChanged)、缩放(ViewZoomed)、Sheet切换(ActiveSheetChanged),确保高亮跟随视口实时更新。
2.创建四个浮动DIV遮罩
- left / right:覆盖选中区域左右两侧整列
- top / bottom:覆盖选中区域上下两侧整行
- 设置半透明白色或浅蓝背景(opacity 0.4~0.6),pointer-events:none 避免挡操作
- 全部append到body,position:absolute,z-index高于canvas
3.计算位置与尺寸
-
用
sheet.getCellRect(row, col)获取单元格在画布中的像素坐标。2.结合
spread.getHost().querySelector("canvas")的bounding rect,算出四个DIV的left/top/width/height。3.特殊情况处理:当选中单元格在视口外(滚动后看不到),需做边界判断,只显示靠近视口的一侧遮罩,或干脆隐藏。
4.清理与多选支持
-
每次选中变化前,先remove旧的DIV。
2.支持多选区域(getSelections()返回数组),为每个selection创建一套遮罩。
5.开关与可配置
-
封装成函数
bootCrossHighlight(spread, true/false),方便随时开启/关闭。2.可扩展参数:颜色、透明度、是否包含表头、动画过渡时长等。
事件监听 → 获取选中 & 视口信息 → 计算四个DIV位置 → 动态更新样式
用这种方式做出来的效果,不仅能复刻WPS的体验,还能做得更丝滑:
- 支持触屏长按选中
- 可做成“跟随鼠标的动态聚光”
六、最后想说
一个小小的十字高亮,看似不起眼,却真实反映了工具是否真正懂用户的差距。
Excel选择保守,守护了亿级用户的习惯;
WPS选择贴心,让无数普通人用得舒服;
而SpreadJS选择把权力交给开发者——让你能把WPS的亮点、Excel的兼容性、自己团队的个性化需求,全部揉到一起。
如果你正在做企业级Web报表、数据中台、SaaS后台……
如果你也厌倦了“能用但总觉得差点意思”的表格体验……
不妨试试给SpreadJS加个十字聚光灯。
很可能只是几小时的工作,却能让用户每天少骂几句“这个表格看瞎眼了”。
欢迎在评论区分享你的表格痛点,或者你希望的“终极聚光灯”应该长什么样。
我们一起,让表格更好看,也更好用。
完整demo地址,欢迎查看:单元格选中十字高亮
(完)