Golang开发中如何实现深色主题功能

Golang开发中如何实现深色主题功能 我认为论坛引擎支持主题功能。🙄 是否有可用的深色主题?

相关讨论:想要夜间模式/黑色背景

5 回复

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变量来改变界面外观。

回到顶部