# 无框架窗口
> 打开一个没有工具栏、边框或者其它"chrome"外观的窗口。
无框架窗口是指一个没有 [chrome](https://developer.mozilla.org/en-US/docs/Glossary/Chrome)、没有窗口的一些部分,比如并不属于 web 页面中一部分的工具栏。这些是 [`BrowserWindow`](browser-window.md) 类中的选项。
## 创建一个无框架窗口
要创建无框架窗口,必须在 [BrowserWindow](browser-window.md) 的 `options` 中设置 `frame` 为 `false` :
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({width: 800, height: 600, frame: false})
win.show()
```
### macOS 中的实现
在 macOS 10.9 Mavericks 和更新的版本中,有一个替代方案用来指定一个 “chromeless”的窗口。你可能希望隐藏标题栏,应用的内容显示到整个窗口,但仍然保留窗口控制器("traffic lights")进行标准的窗口操作,而不是通过设置 `frame` 为 `false` 完全禁用它们。可以通过指定新的 `titleBarStyle` 选项实现这个目的:
#### `hidden`
产生一个隐藏了标题栏的全屏尺寸内容窗口,但是标题栏的左上方仍保留标准的窗口控制器(“traffic lights”)。
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({titleBarStyle: 'hidden'})
win.show()
```
#### `hidden-inset`
产生一个隐藏的标题栏,有另外一个外观, traffic light 按钮被从窗口变元稍微插入。
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({titleBarStyle: 'hidden-inset'})
win.show()
```
## 透明窗口
通过设置 `transparent` 选项为 `true`,还可以无框架窗口透明:
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({transparent: true, frame: false})
win.show()
```
### 局限
* 不能点击穿透透明区域。我们将介绍一个 API 设置窗口形状来解决这个问题,查看 [our issue](https://github.com/electron/electron/issues/1335) 了解详情。
* 透明窗口不能重设大小。设置 `resizable` 为 `true` 可能在某些平台会使一个透明窗口停止工作。
* `blur` 滤镜只能应用到页面,所以没有办法应用 blur 效果到这个窗口(即,在用户系统上打开的其它应用)下的内容。
* 在 Windows 操作系统,透明窗口在 DWM 被禁用时无法工作。
* 在 Linux 上用户必须应用 `--enable-transparent-visuals --disable-gpu` 到命令行来禁用 GPU 并应用 ARGB 来使窗口透明,这是由一个上游的 bug ,即Linux 上 [alpha 通道在一些 NVidia 驱动上不能工作](https://code.google.com/p/chromium/issues/detail?id=369209) 。
* 在 Mac 上,在一个透明窗口上原生的窗口阴影不能显示。
## 点击穿透窗口
要创建一个点击穿透的窗口,即,使窗口忽略所有的鼠标事件,可以调用 [win.setIgnoreMouseEvents(ignore)][ignore-mouse-events] API:
```javascript
const {BrowserWindow} = require('electron')
let win = new BrowserWindow()
win.setIgnoreMouseEvents(true)
```
## 可拖动区域
默认的,无框架窗口是不能拖动的。应用需要在 CSS 中指定 `-webkit-app-region: drag` 来告诉 Electron 哪些区域是可拖动的(就像操作系统的标准标题栏),而且应用也可以使用 `-webkit-app-region: no-drag` 来从可拖动区域中执行部可拖动区域设置。注意,当前只支持矩形区域。
要使整个窗口可以拖动,可以添加 `-webkit-app-region: drag` 作为 `body` 的样式:
```html
<body style="-webkit-app-region: drag">
</body>
```
注意,如果你已经设置窗口可拖动,就必须使按钮不可拖动,否则不能接受用户的点击事件:
```css
button {
-webkit-app-region: no-drag;
}
```
如果你只设置了一个自定义的标题栏可拖动,需要使标题栏中的所有按钮不能拖动。
## 文本选择
在一个无框架窗口中,拖动行为可能会和选择文本行为冲突。例如,当你拖动一个标题栏,可能意外选中标题栏上的文本。要阻止这个问题,需要在一个可拖动区域禁用文本选择,如下:
```css
.titlebar {
-webkit-user-select: none;
-webkit-app-region: drag;
}
```
## 上下文菜单
在一些平台上,可拖动区域会被当作一个非客户端 client,所以当你右击它,一个系统弹出框弹出。要使上下文菜单行为在所有平台正常工作,千万不要在拖动区域使用自定义上下文菜单。
* [ignore-mouse-events]: browser-window.md#winsetignoremouseeventsignore
- 索引
- 前言.关于Electron
- 第一部分 开发指南
- 第1章.平台支持
- 第2章.安全、原生功能和你的责任
- 第3章.版本说明
- 第4章.发行应用
- 第5章.Mac App商店提交指南
- 第6章.Windows商店指南
- 第7章.应用打包
- 第8章.使用Node原生模块
- 第9章.调试主进程
- 9.1.在VSCode中调试
- 9.2.在node-inspector中调试
- 第10章.使用Selenium和WebDriver
- 第11章.DevTools扩展
- 第12章.使用Pepper Flash插件
- 第13章.使用Widevine CDM插件
- 第14章.通过自动化持续集成系统进行测试
- 第15章.离屏渲染
- 第二部分 使用教程
- 第16章.快速入门
- 第17章.桌面环境集成
- 第18章.在线/离线事件探测
- 第19章.应答式编译器(REPL)
- 第三部分 API参考
- 第20章.API简介
- 第21章.进程对象
- 第22章.Chrome的命令行开关
- 第23章.环境变量
- 第24章.定制的DOM元素
- 24.1.File 对象
- 24.2.webview 标签
- 第25章.主进程模块
- 25.1.app
- 25.2.BrowserWindow
- 25.3.无框架窗口
- 第26章.渲染进程模块
- 第27章.两种进程可用的模块
- 第四部分 高级主题
- 附 FAQ
- 附 文档规范
- 附 示例用例
- 1.无边框窗口