Electron 设置 -webkit-app-region 后无法响应鼠标点击事件的解决方式

一、问题

在开发 Electron 应用的过程中,想要使得窗口在普通大小可以拖动,于是设置给 title-bar css 如下:

.title-bar {

-webkit-app-region: drag;
}

但是设置了这个属性后,发现在 title-bar 上双击全屏和 restore size 的功能又废了,现象如图:

现象

 

怎么办呢?

二、网上现有的方案

通过搜索不难发现,有如下方案:

1. 拖动不要用 -webkit-app-region 了,自己监听 mouseDown 和 mouseUp 来实现吧

2. 父元素设置 -webkit-app-region: drag, 子元素 -webkit-app-region: no-drag 即可

但是,本项目在实际开发过程中有点特殊,即:要实现拖拽和双击放大/缩小的所著元素为同一个 DOM

 

三、最终解决方案

在宿主 Dom 中嵌套一个等宽,等高,但设置了-webkit-app-region: no-drag 属性的 div 即可,上代码:

  <!-- 拖拽使用 -->
  <div [ngClass]="{'title-bar__drag': !isMax}">
    <div style="-webkit-app-region: no-drag; width: 100%;height: 100%"></div>
  </div>

现在,一切都正常啦!

 

可以在需要拖动的元素上添加 `draggable="true"` 属性,并在主进程中监听 `dragstart` 和 `drop` 事件。具体步骤如下: 1. 在需要拖动的元素上添加 `draggable="true"` 属性,例如: ```html <div draggable="true">拖动我</div> ``` 2. 在主进程中,监听 `dragstart` 事件,并设置传输数据和拖动效果,例如: ```javascript const { ipcMain } = require('electron'); ipcMain.on('dragstart', (event, data) => { event.sender.startDrag({ files: [data.file], // 设置传输的数据,例如文件路径 icon: data.icon // 设置拖动的图标 }); }); ``` 3. 在主进程中,监听 `drop` 事件,并处理传输的数据,例如: ```javascript const { ipcMain } = require('electron'); ipcMain.on('drop', (event, data) => { console.log(data.files); // 处理传输的数据,例如获取文件路径 }); ``` 4. 在渲染进程中,监听 `dragstart` 事件,并在事件处理函数中向主进程发送数据,例如: ```javascript const { ipcRenderer } = require('electron'); document.addEventListener('dragstart', (event) => { ipcRenderer.send('dragstart', { file: '/path/to/file', icon: '/path/to/icon.png' }); }); ``` 5. 在渲染进程中,监听 `drop` 事件,并在事件处理函数中处理传输的数据,例如: ```javascript const { ipcRenderer } = require('electron'); document.addEventListener('drop', (event) => { event.preventDefault(); // 阻止默认行为 ipcRenderer.send('drop', { files: event.dataTransfer.files }); }); ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值