最终效果

实现思路

窗口设置透明

建立系统托盘

获取托盘坐标,实现应用在托盘上方出现

CSS 里面写上加载和退出的动画

添加加载动画的事件,即给元素套上动画

设置单击事件,单击显示或者隐藏程序(或者添加 blur 事件,隐藏应用)

给托盘添加右键菜单退出应用

实现过程

窗口设置透明

const win = new BrowserWindow({
    width: 300,
    height: 400,
    frame: false, // 窗口边框
    skipTaskbar: true, // 窗口是否不显示在任务栏上面
    alwaysOnTop: true, // 窗口置顶
    transparent: true, // 窗口透明
    resizable: false,
    webPreferences: {
        // 通信文件 后面会用到
        preload: path.join(__dirname, "preload.js"),
        backgroundThrottling: false, // 后台运行是否禁止一些操作
    },
});

建立系统托盘

import { Tray } from "electron";

// 传入图标路径
tray = new Tray(path.join(__dirname, "../../public/imgs/logo.ico"));

// 鼠标悬浮托盘时显示的文字
tray.setToolTip("Todo");

获取托盘坐标,实现应用在托盘上方

// 获取托盘所在位置信息
const { width, height, x, y } = tray.getBounds();

// 获取窗口信息 win 是 BrowserWindow 对象
const [w, h] = win.getSize();

// 刚好在正上方
win.setPosition(x   width / 2 - w / 2, y - h - 10);

// 封装成函数
const aboveTrayPosition = (win, tray) => {
    const { width, height, x, y } = tray.getBounds();
    const [w, h] = win.getSize();
    return [x   width / 2 - w / 2, y - h - 10]
}

CSS 里面写上加载和退出的动画

动画应该添加到HTML根元素上,根元素必须得是 宽高 100%

@keyframes show {
    0% {
        opacity: 0;
        transform: translateY(300px) scale(0);
    }
    100% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

@keyframes hide {
    0% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
    100% {
        opacity: 0;
        transform: translateY(300px) scale(0);
    }
}

添加加载动画的事件

// preload.js
import { ipcRenderer } from "electron";

// 对应下面的 win.webContents.send("show");
// 默认有个 event 事件参数
ipcRenderer.on("show", (e) => {
    const root = document.querySelector(".root") as HTMLElement;
    root.style.animation = "show 0.3s linear forwards";
});

// 对应下面的 win.webContents.send("hide", s);
ipcRenderer.on("hide", (e, s: number) => {
    const root = document.querySelector(".root") as HTMLElement;
    root.style.animation = `hide ${s}s linear forwards`;
});

设置单击事件,单击显示或者隐藏程序并加载动画

// 添加托盘图标单击事件
tray.on("click", () => {
    // 窗口是否隐藏
    if (!win.isVisible()) {
        win.setPosition(...aboveTrayPosition(win, tray));
        win.show();
        
        // 展示加载动画
        win.webContents.send("show");
    } else {
        
        const s = 0.3;
        // 展示退出动画
        win.webContents.send("hide", s);
        
        // 退出动画加载完之后再隐藏程序
        setTimeout(() => {
            win.hide();
        }, s * 1000);
    }
});

给托盘添加右键菜单退出应用

import { Menu } from "electron";

// 创建菜单
let menu: Menu = Menu.buildFromTemplate([
    {
        label: "Quit",
        click() {
            app.quit();
        },
    },
]);

// 挂载到托盘右键上
tray.setContextMenu(menu);

总结

到此这篇关于Electron应用显示隐藏时展示动画的文章就介绍到这了,更多相关Electron显示隐藏展示动画内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Electron应用显示隐藏时展示动画效果实例的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. PHP分页显示制作详细讲解

    搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。

  3. jQuery实现文本显示一段时间后隐藏的方法分析

    这篇文章主要介绍了jQuery实现文本显示一段时间后隐藏的方法,结合实例形式分析了jQuery事件响应及页面元素属性动态操作相关实现技巧,需要的朋友可以参考下

  4. 总结IOS中隐藏软键盘的三种方式

    在IOS开发中,软键盘是开发者们经常需要打交道的地方,下面为大家带来我整理总结的三种隐藏键盘的方法。有需要的可以参考借鉴。

  5. 一个显示天气预报的程序

    刚开始学PHP,先编写了一个程序,放在自己的主页上,可以显示天气预报,当然还很不完善,希望大家给提意见。这是有规律可寻的,先判断时间,一般比预报时间晚一个小时的话,肯定可以获取最新的预报数据了。不过现在我没有考虑那么多,以后再说吧!

  6. electron打包vue项目的方法 步骤

    本文主要介绍了electron打包vue项目,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. jQuery实现提交表单时不提交隐藏div中input的方法

    这篇文章主要介绍了jQuery实现提交表单时不提交隐藏div中input的方法,结合实例形式分析了通过设置input的disabled属性实现隐藏input提交的操作技巧,需要的朋友可以参考下

  8. 随机广告显示(PHP函数)

    php#########随机广告显示##########functionmyads(){$dir="ads";#设置存放记录的目录//$dir="ads";#设置存放记录的目录$ads="$dir/ads.txt";#设置广告代码文件$log="$dir/ads.log";#设置ip记录文件$ads_lines=file;$lines=count;#文件总行数####读出广告总数$ads_count和显示次数到数组$display_array########$ads_count=0;$display_co

  9. 基于PyQt5实现状态栏(statusBar)显示和隐藏功能

    这篇文章主要为大家详细介绍了如何利用PyQt5实现状态栏显示和隐藏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  10. Python实现在图像中隐藏二维码的方法详解

    隐写是一种类似于加密却又不同于加密的技术。这篇文章主要介绍了如何利用Python语言实现在图像中隐藏二维码功能,感兴趣的可以了解一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部