【Wails】高大上的半透明“冰霜” 效果

本文介绍了如何使用Wails框架创建一个带有半透明冰霜效果的应用。首先通过`wails init`初始化项目,然后修改`main.go`设置背景为全透明,并引入`windows`包来实现窗口透明和无边框效果。接着,调整CSS删除背景样式以增强透明感。最后,通过添加`data-wails-drag`和`data-wails-no-drag`属性实现界面拖动和关闭功能。文章提供了详细的代码示例和步骤,帮助读者实现类似效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Wails使用半透明“冰霜”效果

首先初始化一个模板项目
wails init -n transparent -t vue

示例仓库https://github.com/skypiaoyizhe/wails-demo

然后把项目跑起来
在这里插入图片描述

修改应用配置

main.go
将背景色改为黑色,透明度0,也就是没有背景。
BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 0},

package main

import (
	"embed"

	"github.com/wailsapp/wails/v2"
	"github.com/wailsapp/wails/v2/pkg/options"
)

//go:embed frontend/dist
var assets embed.FS

func main() {
	// Create an instance of the app structure
	app := NewApp()

	// Create application with options
	err := wails.Run(&options.App{
		Title:            "transparent",
		Width:            1024,
		Height:           768,
		Assets:           assets,
		BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 0},
		OnStartup:        app.startup,
		Bind: []interface{}{
			app,
		},
	})

	if err != nil {
		println("Error:", err.Error())
	}
}

修改网页部分

frontend/src/style.css 删除所有的background样式

html {
    text-align: center;
}

body {
    margin: 0;
    color: white;
    font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
    "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
    sans-serif;
}

@font-face {
    font-family: "Nunito";
    font-style: normal;
    font-weight: 400;
    src: local(""),
    url("assets/fonts/nunito-v16-latin-regular.woff2") format("woff2");
}

#app {
    height: 100vh;
    text-align: center;
}

然后就能看见界面变成了
在这里插入图片描述
继续修改main.go
引入包,修改window下的配置

"github.com/wailsapp/wails/v2/pkg/options/windows"

添加参数

Windows: &windows.Options{
			WebviewIsTransparent:              true,// 网页透明
			WindowIsTranslucent:               true,// 窗口透明
			DisableWindowIcon:                 false,
			DisableFramelessWindowDecorations: false,
			WebviewUserDataPath:               "",
			Theme:                             windows.SystemDefault,
			CustomTheme: &windows.ThemeSettings{
				DarkModeTitleBar:   windows.RGB(20, 20, 20),
				DarkModeTitleText:  windows.RGB(200, 200, 200),
				DarkModeBorder:     windows.RGB(20, 0, 20),
				LightModeTitleBar:  windows.RGB(200, 200, 200),
				LightModeTitleText: windows.RGB(20, 20, 20),
				LightModeBorder:    windows.RGB(200, 200, 200),
			},
		},

完整main.go

package main

import (
	"embed"
	"github.com/wailsapp/wails/v2/pkg/options/windows"

	"github.com/wailsapp/wails/v2"
	"github.com/wailsapp/wails/v2/pkg/options"
)

//go:embed frontend/dist
var assets embed.FS

func main() {
	// Create an instance of the app structure
	app := NewApp()

	// Create application with options
	err := wails.Run(&options.App{
		Title:            "transparent",
		Width:            1024,
		Height:           768,
		Assets:           assets,
		BackgroundColour: &options.RGBA{R: 0, G: 0, B: 0, A: 0},
		OnStartup:        app.startup,
		Bind: []interface{}{
			app,
		},
		Windows: &windows.Options{
			WebviewIsTransparent:              true,
			WindowIsTranslucent:               true,
			DisableWindowIcon:                 false,
			DisableFramelessWindowDecorations: false,
			WebviewUserDataPath:               "",
			Theme:                             windows.SystemDefault,
			CustomTheme: &windows.ThemeSettings{
				DarkModeTitleBar:   windows.RGB(20, 20, 20),
				DarkModeTitleText:  windows.RGB(200, 200, 200),
				DarkModeBorder:     windows.RGB(20, 0, 20),
				LightModeTitleBar:  windows.RGB(200, 200, 200),
				LightModeTitleText: windows.RGB(20, 20, 20),
				LightModeBorder:    windows.RGB(200, 200, 200),
			},
		},
	})

	if err != nil {
		println("Error:", err.Error())
	}
}

运行效果
在这里插入图片描述
此时窗口是透明了,冰霜效果也有了,但是窗口名称还是有点违和感,继续修改。
添加无边框

Frameless: true,

在这里插入图片描述
这样看起来就舒服多了,但是这样就不能拖动窗口和关闭了,就需要用到wail自带的一些方法和参数配置。

退出程序

window.runtime.Quit();

界面可以拖动,添加data-wails-drag
界面不可以拖动部分,添加data-wails-no-drag

完整代码

<script setup>
import HelloWorld from './components/HelloWorld.vue'
const handleQuit = () => {
  window.runtime.Quit();
}
</script>

<template>
  <div data-wails-drag>
    拖动
  </div>
  <div data-wails-no-drag>
    拖不动
  </div>
  <button @click="handleQuit">关闭</button>
  <img id="logo" alt="Wails logo" src="./assets/images/logo-universal.png"/>
  <HelloWorld/>
</template>

<style>
#logo {
  display: block;
  width: 50%;
  height: 50%;
  margin: auto;
  padding: 10% 0 0;
  background-position: center;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  background-origin: content-box;
}
</style>

运行效果
在这里插入图片描述
此时拖动部分可以拖动窗口移动位置,关闭可以关闭窗口,退出程序。

### Wails 框架概述及常见问题 Wails 是一个用于构建桌面应用程序的框架,它允许开发者使用 Go 语言作为后端逻辑,并结合前端技术(如 HTML、CSS 和 JavaScript)来创建用户界面[^1]。通过 Wails,开发者可以轻松地将现代 Web 技术与强大的 Go 后端相结合,从而实现跨平台的桌面应用开发。 #### 核心功能 Wails 提供了以下关键特性: - **Go 语言支持**:后端逻辑完全由 Go 编写,利用其高性能和并发能力[^2]。 - **前端集成**:支持标准 Web 技术栈(HTML、CSS、JavaScript),允许开发者使用熟悉的工具和技术构建界面[^3]。 - **跨平台兼容性**:生成的应用程序可以在 Windows、macOS 和 Linux 上运行[^4]。 - **热重载**:在开发过程中提供热重载功能,提高开发效率[^5]。 #### 常见问题及解决方案 1. **安装问题** 在安装 Wails 时,确保系统已正确安装 Go 环境,并且 `GOPATH` 和 `PATH` 配置正确。如果遇到版本冲突,建议升级到最新版本的 Go 和 Wails[^6]。 2. **前后端通信** Wails 提供了内置的绑定机制,用于在前端和后端之间传递数据。例如,可以通过以下代码在前端调用后端函数: ```javascript window.backend.MyFunction({ key: "value" }).then(result => { console.log(result); }); ``` 对应的后端代码如下: ```go func (a *App) MyFunction(input map[string]string) (string, error) { return "Hello, " + input["key"], nil } ``` 3. **打包问题** 打包应用程序时可能会遇到依赖项缺失或权限不足的问题。确保在执行 `wails build` 命令之前,所有依赖项均已正确安装,并且拥有足够的权限访问相关文件和目录[^7]。 4. **调试技巧** 使用 `wails dev` 命令启动开发服务器,并结合浏览器开发者工具进行调试。此外,还可以通过日志记录功能捕获后端错误信息[^8]。 ```go func (a *App) LogError(err error) { if err != nil { log.Println("Error:", err) } } ``` ### 注意事项 在使用 Wails 开发时,请注意以下几点: - 确保项目结构符合 Wails 的规范,通常包括 `frontend` 和 `backend` 两个主要目录[^9]。 - 定期更新 Wails 及其依赖项,以获取最新的功能和安全修复[^10]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘逸者打瞌睡

如有需要,请私信我。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值