桌面端|Electron BrowserView 实现复合布局

本来不想再写 Electron 相关的文章,毕竟项目都停摆了。但有小伙伴需要就有动力写 ~

前言

虽然官方推荐大家用BrowserView,但市面上相关的资料确实不多,笔者前面介绍了如何用BrowserView实现标签页窗口布局,但标签页布局算是简单模式的,没有复杂的层叠场景,笔者这一篇就进一步介绍下我们是怎么实现出一个主窗口复合布局的。

最终效果

本来想放一个好点的效果视频,但发现线上的功能已经被阉割没什么东西了,所以凑合示意一下:

本文后续的讲解会挑阉割前的设计来讲,实际上远比这个视频复杂的多 ~

附一个客户端下载地址:www.gaoding.com/pro 虽然不维护了,但整体架子还在,有兴趣可以点点看。

布局介绍

完整的产品布局如下:

分为侧边栏、顶部栏、内容区和一个帮助反馈的浮动按钮(这个顶部浮动很难受)。

当然可以不用BrowserView,整体一个 Web 页面套壳一把梭,这样开发是最简单的。

但使用BrowserView的好处也很明显:

  1. 无需关心各个内容区是部署在哪里,有没有跨域问题。
  2. 避免框架融合的痛,各个业务到底是使用 Vue 还是 React 还是什么玩意儿实现的,还能实现业务间解耦。
  3. 离线可用,比如侧边栏和顶部栏采用本地加载,至少网络不好的情况下能出来个框架,这是桌面端的一个特性,但很多应用也没做多好。

我们先不管悬浮的帮助中心按钮,整个主框架上分为3个部分:

  1. 主窗口BrowserWindow对象,URL 加载的 HTML 只有一个作用,渲染底层的背景色。
  2. 顶部栏 + 侧边栏是充满整个窗口的BrowserView, 内容中心是透明区域,这里作用下文讲。
  3. 内容区是由多个BrowserView组成的,跟侧边栏一级导航一一对应,当然它是懒加载。

细节分析

早期做法(遮罩处理)

最后这个形态也是经过一次调整,最早是调研的对象是竞品Figma

我们用字节的 Debugron 工具可以很方便的查看其他 App 得布局、进程等信息。(确实做 Electron 还关注安全的团队更少了 ...)

我们找到它顶部栏的实现:

初始状态就这一条。

当点击更多 ... 时,你会发现这个页面就铺满了。

可以看出它的做法是改变整个顶部栏BrowserView的高度。

但可以看到内容区的内容没有被遮挡,这是因为它下面用了个完全透明的div

我们简单验证,给这个div一个半透明的颜色:

最后呈现结果如下:

这样做的还有一个好处,内容区什么也不用关心,因为它本身是盖在上面的,响应(关闭弹窗)事件还是由顶部栏这一层的div提供就好。

我们最早的做法也是学它(粗糙的草图):

遇到的难题(局限性)

但我们不同的是,我们不止有顶部栏,后面还有侧边一级导航栏,所以如果还用这种方式,就需要一个侧边栏BrowserView

但这样做不仅多一个BrowserView的开销,而且侧边栏和顶部栏的通信也会变的十分复杂。

现在的做法(布局切换)

最后就如开始介绍的那样,只使用一个BrowserView绘制侧边栏和顶部栏,中间是透明区域,这个是早期做法的灵感。

那我们需要的处理的就是:

  1. 正常情况下,内容区的BrowserView层级在框架布局的BrowserView之上。
  2. 如果框架弹出下拉框或者 Tips 的情况,把框架布局的BrowserView的层级置顶。

这其实很简单,我们借助于通信能力即可实现。

我们是多端通用的通信能力,有兴趣可以看下跨端通信终结者|桌面端已加入全家桶🔝

具体实现代码(仅参考):

关于悬浮球(帮助中心)

这个悬浮球恶心的原因是,它必须永远置顶 ...

所以无论框架层级是否置顶,都需要再把这玩意儿置顶下。

关键是Electron没提供层级管理的 API,只有setTopBrowserView ... 调用2次的现象是悬浮球会有略微闪烁的情况,因为不是在同一帧绘制的 ...

后续

本文按评论区小伙伴需要,总结了我们对于这种复合布局是如何处理的,其实还是有很多细节没讲,也是过了个年,记得不是很清楚啦。

如果大家有兴趣、有问题可以本文评论,简单的会直接解答,如果复杂的就单开文章来讲讲 ~

相关推荐
程序员老刘16 小时前
当全网都在喊“程序员要被AI取代了”,Flutter给了另一种答案
flutter·ai编程·客户端
web打印社区2 天前
[特殊字符] 开源好物:web-print-pdf,让 Web 打印像调用接口一样简单!
前端·javascript·vue.js·electron
森总20202 天前
Electron 实战:utilityProcess 服务脚本热更新、用户目录优先启动与 asar 依赖解析
electron
政采云技术2 天前
从投标客户端看 Electron + React 工程化实践
electron
得想办法娶到那个女人2 天前
Vite + Vue 项目打包为 Electron 桌面应用 完整指南
前端·vue.js·electron
李李李勃谦2 天前
Vue3 + Electron + OpenHarmony 跨平台实战:从架构设计到 Markdown 编辑器完整实现
javascript·华为·electron·编辑器·harmonyos
森叶2 天前
Electron 实战:utilityProcess 服务脚本热更新、用户目录优先启动与 asar 依赖解析
前端·javascript·electron
程序员老刘3 天前
Flutter版本选择指南:3.41.7进入稳态,生产环境升级窗口开启 | 2026年4月
flutter·客户端
森叶3 天前
Electron 实战:用 utilityProcess 开子进程,去端口化承载协议处理,并由主进程拦截渲染请求后统一中转
前端·javascript·electron
茅盾体3 天前
Electron图标相关
java·前端·electron