Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何点击穿透Electron不规则窗体的透明区域

如何点击穿透Electron不规则窗体的透明区域

作者头像
liulun
修改于 2021-12-23 00:32:59
修改于 2021-12-23 00:32:59
3.1K00
代码可运行
举报
文章被收录于专栏:liulunliulun
运行总次数:0
代码可运行

实现一个不规则窗体

这里我们实现一个圆形窗体,实现其他形状的窗体与这个方法类似。

首先,把窗口的高度(height)和宽度(width)值修改为相同的值,使窗口成为一个正方形。

其次,把窗口的透明属性(transparent)设置为true,这样设置之后窗口还是正方形的,但只要我们控制好内容区域的Dom元素的形状,就可以让窗口看起来像一个不规则形状一样。

不规则窗口往往需要自定义边框和标题栏,所以frame也设置为false。

另外,透明的窗口不可调整大小。所以将resizable属性设置为false。

窗口显示后,为了防止双击窗口可拖拽区触发最大化事件,我们把maximizable属性也设置为false。

最终创建窗口的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
win = new BrowserWindow({
        width: 380,
        height: 380,
        transparent: true,
        frame: false,
        resizable: false,
        maximizable: false,
        //...
})

接下来再修改样式,使内容区域的Dom元素呈现一个圆形:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
html,body { 
  margin: 0px; 
  padding: 0px; 
  pointer-events: none;
}
#app {
 box-sizing: border-box;
 width: 380px; 
 height: 380px;
 border-radius: 190px;
 border: 1px solid green;
 background: #fff;
 overflow: hidden;
 pointer-events: auto;
}

上面样式代码中通过border-radius样式把#app元素设置成了圆形。border-radius负责定义一个元素的圆角样式,如果圆角足够大,整个DIV就变成了一个圆形。

pointer-events样式,在后面会有讲解。

最终实现的窗口界面如图5-7:

如果你略微了解CSS,你会知道除了圆形,你还可以通过CSS样式控制这个窗口成为任意其他形状。

点击穿透透明区域

上面这个应用会有一点小问题,虽然窗口看起来是圆形的,但它其实还是一个正方形窗口,只不过正方形四个角是透明的,所以看起来像一个圆形的窗口。

当我点击下图中的①区域内的文本文件时,鼠标的点击事件还是发生在本窗口内,而不会点击到那个文件上。

作为开发者,我们知晓其中的道理,但作为用户来说,这就显得很诡异。为了达到更好的用户体验,我们需要让鼠标在这4个区域发生点击动作时,点击动作可以穿透本窗口,落在窗口后面的内容上。

Electron官方文档明确说“不能点击穿透透明区域”,这并没有难倒我们,有一个小trick来解决这个问题。

首先,需要用到窗口对象的setIgnoreMouseEvents方法,该方法可以使窗口忽略窗口内的所有鼠标事件,并且在此窗口中发生的所有鼠标事件都将被传递到此窗口背后的内容。

如果调用该方法时传递了forward参数,如:

setIgnoreMouseEvents(true, { forward: true }),

则只有点击事件会穿透窗口,鼠标移动事件仍会触发。

基于此,我们在页面中执行如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  const remote = require("electron").remote;
  let win = remote.getCurrentWindow();
  window.addEventListener("mousemove", event => {
  let flag = event.target === document.documentElement;
  if (flag){
     win.setIgnoreMouseEvents(true, { forward: true });
  } 
  else {
    win.setIgnoreMouseEvents(false);
  }
  });
  win.setIgnoreMouseEvents(true, { forward: true });

注意,这是实验代码,所以用了remote模块,关于remote模块的一些问题,我在“Electron团队为什么要干掉remote模块“有详细描述。

上面的代码中,设置窗口对象监听mousemove事件,当鼠标移入窗口圆形内容区的时候,不允许鼠标事件穿透。当鼠标移入透明区时,允许鼠标事件穿透。

接着我们为html,body元素增加样式:pointer-events: none,为#app元素增加样式pointer-events: auto。

设定pointer-events: none后,其所标志的元素就永远不会成为鼠标事件的target了。

为子元素#app设置了pointer-events: auto,说明子元素#app还是可以成为鼠标事件的target的。

也就是说除了圆形区域内可以接收鼠标事件外,其他部分将不再接收鼠标事件。

当鼠标在圆形区域外移动时,窗口对象的mousemove事件触发,event.target为document.documentElement对象(这个事件并不是在html或body元素上触发的,而是在窗口对象上触发的,document.documentElement就是DOM树中的根元素,也就是html节点所代表的元素)。

至此,上文代码中的判断成立,当鼠标在前文所述四个区域移动时,鼠标事件允许穿透。鼠标在圆形区域移动时,鼠标事件不允许穿透。

至此,上文所述判断成立,运行程序,鼠标在正方形四角区域内点击,鼠标事件具备了穿透效果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【动画进阶】极具创意的鼠标交互动画
思索了一番,觉得这个效果利用 CSS 配合部分 Javascript 代码完全也是可以做到的。
Sb_Coco
2024/05/12
2820
【动画进阶】极具创意的鼠标交互动画
点击穿透原理及解决
一、事件触发顺序 PC网页上的大部分操作都是用鼠标的,即响应的是鼠标事件,包括mousedown、mouseup、mousemove和click事件。一次点击行为,可被拆解成:mousedown -> mouseup -> click 三步。   手机上没有鼠标,所以就用触摸事件去实现类似的功能。touch事件包含touchstart、touchmove、touchend,注意手机上并没有tap事件。手指触发触摸事件的过程为:touchstart -> touchmove -> touchend。   手机
吴裕超
2018/03/29
4.3K0
点击穿透原理及解决
怎么用css属性屏蔽鼠标事件(鼠标点击可穿透上层元素)
看到这个需求,我有点懵逼。现在的情况是只有点击日期内容框空白区域时,才会响应点击事件显示下拉日期菜单。
前端_AWhile
2019/08/29
1.8K0
📚一站式解决:H5开发全攻略,看这篇让你省时又省力
在 H5 中,我们通常会使用 REM 和 VW 这两种单位来实现页面的响应式布局。这两种单位可以让页面元素的大小随着根元素(对于 REM)或视口宽度(对于 VW)的大小变化而变化,从而适应不同尺寸的屏幕。
linwu
2023/07/27
9180
CSS 解决z-index上层元素遮挡下层元素点击事件问题
如下,有以下界面,其中右侧边时一个ElementUI Dialog模态对话框,希望在对话框上执行点击操作时,不会点击到被对话框遮挡的页面的按钮,同时,也希望可以点击对话框区域外的其它页面元素
授客
2019/12/12
3.7K0
12 个实用的前端开发技巧总结
常见发生场景:假如我们需要通过 input,type="file"来上传文件,而这个 input 的默认样式,可以说是非常地丑。所以我们希望通过一张图片,与这个 input 大小一样,位置一致地盖在上面。这个时候,显然,这个时候点击图片,input 是不会起作用的。就是因为 img 隔绝了 click 的穿透,而我们希望的是,这个 img 只是视觉上遮挡了 input 的样式,但是点击的时候还是点击到 input。所以,只要让 img 可穿透即可。
winty
2020/06/30
1.2K0
electron 仿制QQ登录界面
注意 不要使用内置的拖动 我们要自己实现! 在页面中加入以下代码就可以实现拖动了!
李昊天
2019/05/26
7.6K0
使用electron实现百度网盘悬浮窗口功能!
没有使用electron内置的-webkit-app-region: drag 因为使用他那个有很多问题 比如事件无法使用 右键无法使用 以及不能使用手型等!
李昊天
2019/05/26
2.6K0
🥬 🐶的uniapp学习之🦌 【计时器】
我这里使用的是npm安装。如果是纯的uniapp项目,是没有包管理器package.json的,更没有node_modules的。
用户4793865
2023/01/12
1.6K0
“穿透”层的鼠标事件
需要实现如下的效果,有一个浮动层,需要层级在它之下的一个元素也能照常响应相应的事件
meteoric
2018/11/15
1.7K0
VisualDrag低代码拖拽模板
因此得研究实现一个拖拽生成低代码平台,通过查询了各种资料,找到了以下比较合适的开源的低代码平台:
不愿意做鱼的小鲸鱼
2022/11/22
1.6K0
VisualDrag低代码拖拽模板
JS中的touch事件与canvas绘图
其中有三个相似的属性touches、targetTouches 及changedTouches,它们有什么不同呢?
码客说
2020/05/09
7.6K0
物理世界的互动之旅:Matter.js入门指南
本文将带您探索 Matter.js,一个强大而易于使用的 JavaScript 物理引擎库。
德育处主任
2023/04/23
2.2K0
物理世界的互动之旅:Matter.js入门指南
Vue组件设计 | 实现水波涟漪效果的点击反馈指令
点击反馈 不知道小伙伴们有没有注意过这样一个细节,有的应用按钮,链接,可交互的卡片点击起来十分有感觉,而有的却像是点在白纸上了一样,是什么造成了他们使用户有如此明显的感受区分呢?.... 1.jpg
coder_koala
2021/07/08
9200
Vue组件设计 | 实现水波涟漪效果的点击反馈指令
如何实现一个丝滑的点击水波效果
注意看addEventListener方法的第三个参数中都设置了passive = true,这个选项用来告诉浏览器我们的处理函数中不会调用preventDefault方法,这么做有什么好处呢?比如touch事件或scroll事件的默认行为都会触发页面的滚动,如果调用了preventDefault方法,那么就会阻止滚动,但问题是浏览器并不知道我们有没有在事件处理函数中调这个方法,那么就必须等待函数执行完毕才知道,有时候函数的执行是比较耗时的,这样就会导致页面卡顿,所以如果我们的处理函数中明确不会调用preventDefault方法,那么就通过passive标志直接告诉浏览器,这样浏览器就不会等待,直接进行滚动,可以显著提升页面性能和体验。
街角小林
2022/10/31
6080
electron+vue从0到1实现一个桌面端日期时间倒计时软件实践(持续更新)
我正在参加跨端技术专题征文活动,详情查看:juejin.cn/post/710123…
十里青山
2022/08/22
1.4K0
electron+vue从0到1实现一个桌面端日期时间倒计时软件实践(持续更新)
冬天到了,给你的网站下个雪吧
女朋友常逛的设计网站这两天页面上多了下雪的效果,于是问我我的网站能下雪吗,作为一个程序员我一般会说实现不了,但是作为男朋友,不能说不行。
街角小林
2022/06/15
3610
冬天到了,给你的网站下个雪吧
如何用纯css打造类materialUI的按钮点击动画并封装成react组件
作为一个前端框架的重度使用者,在技术选型上也会非常注意其生态和完整性.笔者先后开发过基于vue,react,angular等框架的项目,碧如vue生态的elementUI, ant-design-vue, iView等成熟的UI框架, react生态的ant-design, materialUI等,这些第三方UI框架极大的降低了我们开发一个项目的成本和复杂度,使开发者更专注于实现业务逻辑和服务化.
徐小夕
2020/02/19
1.9K0
客户端开发(Electron)认识窗口2
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 如何创建一个非矩形的窗口: 调整主进程代码 调整窗口的宽高尺寸一致,是窗口变为正方形;
前端小鑫同学
2022/12/26
1.1K0
客户端开发(Electron)认识窗口2
记录一些小技巧-CSS篇
选中不在此范围内的元素,例如:div:not(:last-child),选中除最后一个div的所有div元素
WahFung
2020/08/24
8850
记录一些小技巧-CSS篇
推荐阅读
相关推荐
【动画进阶】极具创意的鼠标交互动画
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验