使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)

使用 Electron 实现类似新版 QQ 的登录界面效果,需要注意以下几点:

1. 创建 Electron 项目

使用命令行创建一个新的 Electron 项目,进入项目文件夹后安装必要的依赖:

# 初始化项目
npm init
# 安装 electron
npm install electron --save
# 安装 jquery 和 bootstrap
npm install jquery bootstrap --save

为了实现窗体的旋转效果,我们使用 CSS 3D Transform 这个特性。这里我们还需要引入一个元素,使得窗体可以进行翻转。我使用的是 Flipster,一个 jQuery 插件。安装 Flipster:

npm install flipster --save

2. 编写登录窗口的 HTML 和 CSS

在项目的根目录下,创建一个名为 index.html 的文件,并添加下面的 html 代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>QQ Login</title>
    <!-- 引入 bootstrap 样式文件 -->
    <link rel="stylesheet" href="./node_modules/bootstrap/dist/css/bootstrap.min.css">
    <!-- 引入 flipster 样式文件 -->
    <link rel="stylesheet" href="./node_modules/flipster/dist/jquery.flipster.min.css">
    <!-- 引入自己的样式文件 -->
    <link rel="stylesheet" href="./src/style.css">
</head>
<body>
    <div class="container">
        <div class="login-form-wrapper">
            <form class="login-form">
                <h3>Please Login</h3>
                <div class="form-group">
                    <input type="text" placeholder="Username" class="form-control">
                </div>
                <div class="form-group">
                    <input type="password" placeholder="Password" class="form-control">
                </div>
                <button type="submit" class="btn btn-primary">Login</button>
            </form>
            <!-- 构建翻转窗体 -->
            <ul id="flipster-wrapper">
                <li><img src="./res/1.jpg"></li>
                <li><img src="./res/2.jpg"></li>
                <li><img src="./res/3.jpg"></li>
                <li><img src="./res/4.jpg"></li>
            </ul>
        </div>
    </div>
    <!-- 引入 jQuery -->
    <script src="./node_modules/jquery/dist/jquery.min.js"></script>
    <!-- 引入 bootstrap.js -->
    <script src="./node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
    <!-- 引入 flipster.js -->
    <script src="./node_modules/flipster/dist/jquery.flipster.min.js"></script>
    <!-- 引入自己的脚本文件 -->
    <script src="./src/main.js"></script>
</body>
</html>

接下来在项目的根目录下,创建一个名为 style.css 的样式文件,并添加下列代码:

body {
    margin: 0;
    background-color: #f3f3f3;
    font-family: 'Roboto', sans-serif;
}

.container {
    background-color: transparent;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}

.login-form-wrapper {
    position: absolute;
    width: 450px;
    height: 400px;
    background-color: #fff;
    box-shadow: 0 2px 8px rgba(102, 119, 136, 0.1);
    border-radius: 3px;
    overflow: hidden;
}

.login-form-wrapper .login-form {
    padding: 30px;
}

.login-form-wrapper h3 {
    margin-top: 0;
    margin-bottom: 20px;
    font-size: 24px;
    font-weight: 400;
    color: #333;
}

.form-group {
    margin-bottom: 20px;
}

.form-control {
    box-shadow: none;
    border-radius: 2px;
    border-color: #dcdcdc;
    height: 50px;
    font-size: 16px;
}

.btn-primary {
    background-color: #007bff;
    border-color: #007bff;
    padding: 12px 18px;
    font-size: 16px;
    border-radius: 2px;
}

.btn-primary:hover {
    background-color: #0069d9;
}

/* 翻转窗体相关 */
#flipster-wrapper {
    margin: 70px auto 0;
}

#flipster-wrapper li {
    margin-bottom: 20px;
    border-radius: 2px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

#flipster-wrapper img {
    display: block;
    width: 100%;
    border-radius: 2px;
}

3. 编写 Electron 主进程代码和渲染进程代码

需要注意的是,我们需要使用 这个标签来开启和禁用部分 Electron 特性来达到最佳的运行效果。

在根目录下,创建一个名为 main.js 的文件,添加如下代码:

const { app, BrowserWindow } = require('electron')

let mainWindow = null

app.on('ready', function() {
    mainWindow = new BrowserWindow({
        width: 450,
        height: 400,
        frame: false, // 隐藏默认窗口栏
        resizable: false, // 禁止窗口大小缩放
        transparent: true, // 窗口透明
        show: false, // 创建窗口时先不显示
        webPreferences: {
            nodeIntegration: true // 开启 Node.js
        }
    })

    // 加载 HTML 文件
    mainWindow.loadFile('./index.html')

    // 当最初的 html 文件加载完成时触发
    mainWindow.once('ready-to-show', () => {
        mainWindow.show() // 显示窗口
    })

    // 监听渲染器进程发来的 ipc 消息
    const { ipcMain } = require('electron')
    ipcMain.on('window-close', () => {
        if (mainWindow !== null) {
            mainWindow.close()
        }
    })
})

在根目录下,创建一个名为 renderer.js 的文件,添加如下代码:

$(function () {
    // 初始化 flipster
    $('#flipster-wrapper').flipster({
        style: 'carousel',
        spacing: -0.5,
        buttons: true,
        nav: false,
        start: 1,
        loop: true
    })

    // 窗口拖动
    var _electron = require('electron')
    var remote = _electron.remote
    var win = remote.getCurrentWindow()
    var drag = document.querySelector('.login-form-wrapper')

    drag.addEventListener('mousedown', function (e) {
        if (e.button !== 0) {
            return
        }

        win.setIgnoreMouseEvents(true)
        var mousePos = null

        document.addEventListener('mousemove', moveCallback, true)
        document.addEventListener('mouseup', mouseupCallback, true)

        function moveCallback (e) {
            e.preventDefault()

            var pos
            if (mousePos === null) {
                mousePos = {
                    x: e.screenX,
                    y: e.screenY
                }
            } else {
                pos = {
                    x: e.screenX - mousePos.x,
                    y: e.screenY - mousePos.y
                }

                win.setPosition(remote.screen.getCursorScreenPoint().x - pos.x, remote.screen.getCursorScreenPoint().y - pos.y)
            }

            mousePos = {
                x: e.screenX,
                y: e.screenY
            }
        }

        function mouseupCallback () {
            win.setIgnoreMouseEvents(false)
            document.removeEventListener('mousemove', moveCallback, true)
            document.removeEventListener('mouseup', mouseupCallback, true)
        }
    })
})

4. 编写菜单和 ipc 监听器

const { Menu, MenuItem } = require('electron')
const { app, BrowserWindow, ipcMain } = require('electron')

app.on('ready', function() {
    const mainWindow = new BrowserWindow({
        width: 700,
        height: 500,
        webPreferences: {
            nodeIntegration: true
        }
    })

    mainWindow.loadFile('index.html')

    mainWindow.webContents.on('did-finish-load', () => {
        const menu = Menu.buildFromTemplate([
            {
                label: 'File',
                submenu: [
                    {
                        label: 'Close',
                        accelerator: 'CmdOrCtrl+W',
                        click() {
                            mainWindow.close()
                        }
                    }
                ]
            },
            {
                label: 'Edit',
                submenu: [
                    {
                        label: 'Undo',
                        accelerator: 'CmdOrCtrl+Z',
                        selector: 'undo:'
                    },
                    {
                        label: 'Redo',
                        accelerator: 'Shift+CmdOrCtrl+Z',
                        selector: 'redo:'
                    },
                    {
                        type: 'separator'
                    },
                    {
                        label: 'Copy',
                        accelerator: 'CmdOrCtrl+C',
                        selector: 'copy:'
                    },
                    {
                        label: 'Cut',
                        accelerator: 'CmdOrCtrl+X',
                        selector: 'cut:'
                    },
                    {
                        label: 'Paste',
                        accelerator: 'CmdOrCtrl+V',
                        selector: 'paste:'
                    },
                    {
                        label: 'Select All',
                        accelerator: 'CmdOrCtrl+A',
                        selector: 'selectAll:'
                    }
                ]
            }
        ])

        ipcMain.on('show-context-menu', (event) => {
            event.preventDefault()
            menu.popup({ window: mainWindow })
        })

        mainWindow.webContents.on('context-menu', (event) => {
            event.preventDefault()
            ipcMain.emit('show-context-menu', event)
        })
    })
})

5. 运行

最后,打开终端,进入项目根目录下,运行以下命令启动应用:

npm start

应用启动后,可以看到类似 QQ 登录界面的效果,窗体可以旋转,同时支持菜单和 ipc 监听器。

示例1: 参考代码

示例2: 参考代码

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • jQuery插件zTree实现的基本树与节点获取操作示例

    首先,我们需要了解以下知识点: zTree:一款基于 jQuery 的多功能树插件,官方网站为 http://www.treejs.cn 基本树的实现方式:通过在 HTML 中定义一个包含 id 属性的 元素,zTree 就会自动将其转换为一棵树。 节点的获取操作:可以使用 zTree 提供的一些方法获取节点,如:getNodes、getSelectedNo…

    css 2023年6月10日
    00
  • 比ant更丰富Modal组件功能实现示例详解

    下面我将详细讲解“比ant更丰富Modal组件功能实现示例详解”的完整攻略。 背景 Modal是许多Web应用程序中不可或缺的组件,它可以在不离开当前页面的情况下展示内容。许多开源UI框架如Ant Design都提供了Modal组件,但它们的功能可能无法完全满足我们的需求。因此,我们需要自己开发高度自定义的Modal组件。 步骤 步骤1:定义Modal组件 …

    css 2023年6月9日
    00
  • 浅析Bootstrap缩略图组件与警示框组件

    浅析Bootstrap缩略图组件与警示框组件 Bootstrap是一个经典的前端框架,提供了许多实用的组件和工具。本文将为大家介绍Bootstrap中的缩略图组件和警示框组件。 缩略图组件 在Bootstrap中,缩略图组件一般用于显示一组图片或者视频的缩略图,非常适合用于多媒体网站、电商网站等等。 基本用法 缩略图组件的基本代码如下: <div cl…

    css 2023年6月11日
    00
  • 移动开发之自适应手机屏幕宽度

    移动开发之自适应手机屏幕宽度 在移动开发中,适配不同屏幕尺寸是一个常见的问题。其中,自适应布局是一种经典的解决方案,可以适配不同大小的设备,提高用户体验。下面是自适应手机屏幕宽度的完整攻略: 1. 使用viewport设置屏幕宽度 Viewport是指“视窗”,指的是​​用户实际看到的网页区域。在移动设备上,viewport的宽度与屏幕的宽度有关系。因此,我…

    css 2023年6月10日
    00
  • 什么是网页安全色与216网页安全色

    网页安全色是指在不同的计算机和浏览器上展现效果相同的一系列颜色。在Web开发中,我们通常可以使用CSS设置不同元素的颜色,但是由于不同的设备和浏览器可能对颜色的解析存在差异,可能导致同样的颜色在不同的设备上显示不同。因此,为了保证颜色的一致性,我们可以使用网页安全色。 216网页安全色是指一组经过优化的216种颜色,这些颜色在不同的设备和浏览器上显示效果都相…

    css 2023年6月9日
    00
  • bootstrap3.0教程之多种表格效果(条纹状表格、条纹状表格、鼠标悬停等)

    标题:Bootstrap3.0教程之多种表格效果 前言 在网站制作中,表格是常用的页面元素之一。Bootstrap3.0为我们提供了多种表格效果,可以让我们在设计网站时更加灵活多样化。本篇教程将详细讲解如何利用Bootstrap3.0实现多种表格效果。 条纹状表格 概述 条纹状表格在Bootstrap3.0中是非常常见的一种表格风格,其配色简洁明快,同时也能…

    css 2023年6月10日
    00
  • 详解Layer弹出层样式

    详解Layer弹出层样式 Layer是一个开源的Web弹出层组件,可实现弹出框、信息提示等功能。它具有易用性和可扩展性,可以轻松地进行自定义样式和行为。 Layer基本使用 在使用Layer之前,你需要先引入Layer的相关文件。可以直接引用它的CDN资源,或者下载源码后在自己的项目中使用。 在页面中添加一个按钮,点击它可以弹出一个层: <button…

    css 2023年6月10日
    00
  • JS实现表格响应式布局技巧

    JS实现表格响应式布局技巧可以通过以下步骤来实现: 步骤一:设置表格的HTML结构 首先,需要在HTML文件中创建表格结构。一般来说,表格需要一个表头,以及一个或多个表格行。如下所示: <table> <thead> <tr> <th>Name</th> <th>Age</th&g…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部