背景跟随系统主题的变化而变化

背景跟随系统主题的变化而变化

效果如下
在这里插入图片描述

一、实现思路

利用媒体查询的方式

二、相应操作

1.html布局

采用 grid 布局

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>主题切换</title>
</head>

<body>
    <div class="body ">
        <div class="check">
            <div class="light_div"><span>明亮</span></div>
            <div class="dark_div"><span>暗黑</span></div>
            <div class="OS_div"><span>跟随系统</span></div>
        </div>
        <div class="content">
            <div class="table" style="grid-template-columns: auto;font-size: 20px;text-decoration: underline;"><span>王者农药</span></div>
            <div class="table top"><span>角色</span><span>属性</span><span>性别</span></div>
            <div class="table"><span>后裔</span><span>射手</span><span></span></div>
            <div class="table"><span>项羽</span><span>战士</span><span></span></div>
            <div class="table"><span>王昭君</span><span>法师</span><span></span></div>
        </div>
    </div>
</body>

</html>
2.css

主要采用 css的变量——形式如:color: var(上面定义的变量名)

* {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}
/* 默认亮色主题 */

:root {
    --bg1: hsl(144, 100%, 89%);
    --bg2: hsl(42, 94%, 76%);
    --underlineColor: #333;
    --textColor: #333
}
/* 暗黑主题 */
/* 加了html,它的特殊性为011,而原有的html为010,根据层叠规则而生效哪一套
*/

html[data-theme='dark'] {
    --bg1: hsl(198, 44%, 11%);
    --bg2: hsl(198, 39%, 29%);
    --underlineColor: #fff;
    --textColor: #fff
}
/* css 中监听当前系统的颜色 */
/* @media (prefers-color-scheme:dark) {}

;
@media (prefers-color-scheme:light) {}

; */

.body {
    width: 100%;
    height: 100vh;
    background-image: linear-gradient(var(--bg1), var(--bg2));
    display: flex;
    flex-direction: column;
    justify-self: center;
    align-items: center;
    color: var(--textColor);
}

.body .check {
    height: 26px;
    margin-top: 60px;
    margin-bottom: 60px;
    display: grid;
    grid-auto-flow: column;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 20px;
}

.body .content {
    width: 600px;
    height: 315px;
    display: grid;
    border: 2px solid var(--underlineColor);
}

.top {
    font-weight: 700;
}

.body .content .table {
    display: grid;
    /* 溢出后是纵向还是横向排列 */
    grid-auto-flow: column;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 30px;
    justify-items: center;
    align-items: center;
}

.light_div,
.dark_div {
    border-bottom: none;
}

.light_div span:hover,
.dark_div span:hover,
.OS_div span:hover {
    cursor: pointer;
    border-bottom: 1px solid var(--underlineColor);
}
3.js

采用颜色聚合算法来算出图片的主要三个颜色像素

// 通过判断是否点击来确定更换主题
const match = matchMedia('(prefers-color-scheme:light)'); // 可以用来查看系统的主题颜色
if (JSON.parse(localStorage.getItem("os_check"))) {
    OS_State()
    match.addEventListener("change", OS_State); // 用来监听系统是否有发生变化
} else {
    match.removeEventListener("change", OS_State)
    document.documentElement.dataset.theme = localStorage.getItem("_theme_") || "light";
};
let light = document.querySelector(".light_div");
let dark = document.querySelector(".dark_div");
let OS = document.querySelector(".OS_div");
light.addEventListener("click", () => {
    document.documentElement.dataset.theme = "light"
    match.removeEventListener("change", OS_State)
    localStorage.setItem("_theme_", "light")
    localStorage.setItem("os_check", false)
});
dark.addEventListener("click", () => {
    document.documentElement.dataset.theme = "dark"
    match.removeEventListener("change", OS_State)
    localStorage.setItem("_theme_", "dark")
    localStorage.setItem("os_check", false)
})
OS.addEventListener("click", () => {
    // console.log("点击zhuti ");
    localStorage.setItem("os_check", true)
    OS_State() // 点击之后要先运行
    match.addEventListener("change", OS_State)
});
// 做一个判断系统主题颜色的函数
function OS_State() {
    if (match.matches) {
        // console.log("系统明亮");
        document.documentElement.dataset.theme = "light"
        localStorage.setItem("_theme_", "light")
    } else {
        // console.log("系统暗黑");
        document.documentElement.dataset.theme = "dark"
        localStorage.setItem("_theme_", "dark")
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用wxPython的Panel控件来实现这个功能。 首先,创建一个继承自wx.Panel的自定义面板类,然后在该类的构造函数加载背景图片,并在重绘事件绘制该图片: ```python import wx class BackgroundPanel(wx.Panel): def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL, name=wx.PanelNameStr): super().__init__(parent, id, pos, size, style, name) # 加载背景图片 self.background_bitmap = wx.Bitmap("background.png") # 绑定重绘事件 self.Bind(wx.EVT_PAINT, self.OnPaint) def OnPaint(self, event): dc = wx.BufferedPaintDC(self) dc.DrawBitmap(self.background_bitmap, 0, 0) ``` 接下来,在主窗口创建该自定义面板并添加其他控件。为了让其他控件位于背景图片之上,可以使用wx.Panel的SetTransparent方法: ```python class MainFrame(wx.Frame): def __init__(self, parent, title): super().__init__(parent, title=title) # 创建背景面板 self.background_panel = BackgroundPanel(self) # 添加其他控件 self.button = wx.Button(self.background_panel, label="Button") # 将其他控件置于背景图片之上 self.background_panel.SetTransparent(0) ``` 最后,为了让背景图片随着窗口大小的变化而自适应调整大小,可以在重绘事件获取面板的大小并将背景图片缩放到该大小: ```python class BackgroundPanel(wx.Panel): def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL, name=wx.PanelNameStr): super().__init__(parent, id, pos, size, style, name) # 加载背景图片 self.background_bitmap = wx.Bitmap("background.png") # 绑定重绘事件 self.Bind(wx.EVT_PAINT, self.OnPaint) def OnPaint(self, event): dc = wx.BufferedPaintDC(self) # 获取面板大小 panel_size = self.GetSize() # 将背景图片缩放到面板大小 scaled_bitmap = self.background_bitmap.ConvertToImage().Scale(panel_size.x, panel_size.y).ConvertToBitmap() dc.DrawBitmap(scaled_bitmap, 0, 0) ``` 这样,就可以实现一个背景图片跟随窗口大小变化,并让其他控件位于背景图片之上的界面了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值