Discourse没有主题选项吗? 我真的不想再添加另一个扩展了。
更多关于Golang开发中如何实现深色主题功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
啊,好的,你之前没有提到移动端,也没有提到你使用了用户样式。
我确实想知道这个论坛使用的是什么论坛软件。基于看起来相似的Haskell,我猜是Discourse。
最坏的情况是,通过使用 Stylish 浏览器插件覆盖默认"主题",在 UserStyles.org 上找到该论坛运行的相应软件(该软件有暗色主题),或者用 CSS/JS 编写自己的样式并通过 Stylish 应用。
嗯,在我的台式机上我喜欢使用深色主题,但这对我来说并不太重要,因为效果只是视觉上的。反正我在那里使用了用户样式,为我暗化了很多网页。
然而在我的移动设备上,用户样式无法使用,或者至少到目前为止我还没有找到应用它们的方法。但在那里黑暗实际上很重要。
带有深色背景的Haskell论坛消耗的电池电量不到这个论坛的一半。
在Golang开发中实现深色主题功能通常涉及UI框架的选择和主题切换逻辑的实现。以下是基于常见GUI框架的示例:
1. 使用Fyne框架(跨平台GUI)
package main
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"fyne.io/fyne/v2/theme"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Theme Example")
// 创建主题切换按钮
darkTheme := widget.NewButton("Switch to Dark", func() {
myApp.Settings().SetTheme(theme.DarkTheme())
})
lightTheme := widget.NewButton("Switch to Light", func() {
myApp.Settings().SetTheme(theme.LightTheme())
})
content := container.NewVBox(
widget.NewLabel("Hello Fyne!"),
darkTheme,
lightTheme,
)
myWindow.SetContent(content)
myWindow.Resize(fyne.NewSize(400, 300))
myWindow.ShowAndRun()
}
2. 使用Web前端的Golang后端主题管理 对于Web应用,可以通过CSS变量和Golang模板实现:
// main.go
package main
import (
"html/template"
"net/http"
)
type PageData struct {
Theme string
}
func main() {
tmpl := template.Must(template.ParseFiles("index.html"))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 从cookie获取主题偏好
themeCookie, err := r.Cookie("theme")
theme := "light"
if err == nil {
theme = themeCookie.Value
}
data := PageData{Theme: theme}
tmpl.Execute(w, data)
})
http.HandleFunc("/toggle-theme", func(w http.ResponseWriter, r *http.Request) {
theme := r.URL.Query().Get("theme")
http.SetCookie(w, &http.Cookie{
Name: "theme",
Value: theme,
Path: "/",
})
http.Redirect(w, r, "/", http.StatusSeeOther)
})
http.ListenAndServe(":8080", nil)
}
<!-- index.html -->
<!DOCTYPE html>
<html data-theme="{{.Theme}}">
<head>
<style>
:root[data-theme="light"] {
--bg-color: white;
--text-color: black;
}
:root[data-theme="dark"] {
--bg-color: #1a1a1a;
--text-color: white;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
}
</style>
</head>
<body>
<h1>Go Web App</h1>
<a href="/toggle-theme?theme=dark">Dark Theme</a>
<a href="/toggle-theme?theme=light">Light Theme</a>
</body>
</html>
3. 使用Gio框架(即时模式GUI)
package main
import (
"gioui.org/app"
"gioui.org/io/system"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/widget/material"
)
func main() {
go func() {
w := app.NewWindow()
var ops op.Ops
// 主题状态
isDark := false
for {
switch e := w.Event().(type) {
case system.FrameEvent:
gtx := layout.NewContext(&ops, e)
// 根据主题状态选择样式
var th *material.Theme
if isDark {
th = material.NewTheme()
th.Bg = color.NRGBA{R: 0x1a, G: 0x1a, B: 0x1a, A: 0xff}
th.Fg = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff}
} else {
th = material.NewTheme()
}
// 界面布局
layout.Flex{Axis: layout.Vertical}.Layout(gtx,
layout.Rigid(material.Body1(th, "Toggle theme").Layout),
)
e.Frame(gtx.Ops)
}
}
}()
app.Main()
}
这些示例展示了在不同场景下实现深色主题的方法。具体实现取决于你使用的GUI框架或Web技术栈。主题切换的核心是通过修改颜色配置或CSS变量来改变界面外观。

