根据时间切换主题css文件
· 技术积累 · PHP Typecho

[2023-07-08更新] 看惯了一个主题配色,但又不想在后台来回切换其他配色,于是就有了此篇文章,也就是当前博客在用的切换样式

我看大多数网站都是一个开关手动选择,很少数可以自动切;由于本人不太会js,下面的js代码写的比较繁琐

这个php代码,就是根据时间调整当前使用的css样式,变量用于js获取使用

# 根据博客主题调整路径,代码放在header中

<!--根据时间切换配色和logo -->
<?php
date_default_timezone_set('Asia/Shanghai');
//获取当前时间 小时
$hour = date('H');

//获取当前css主题文件名称
$themes = $this->options->css;

//根据当前时间,设定theme变量的值
if ($hour >= 7 && $hour < 19) {
    $theme = $this->options->css;
} 
else{
    $theme = 'black';
};

//指定默认logo图片地址
$logo_path = '/img/logo/'.$theme.'/logo.png';
?>

<!-- 用php输出html和head标签,用于指定class的内容为上面的变量值,方便js获取使用 -->
<?php echo '<html lang="zh-cn" xmlns="//www.w3.org/1999/xhtml" class="'. $theme .'">' ?>
<?php echo '<head class="'. $themes .' ">' ?>

把需要使用暗色的样式拿出来单独写一个css文件,也放到header中加载

/* 所有暗色样式前面都加上html.black,通过这个切换使用的样式 */
html.black body{}
html.black .xxxx{}
html.black #xxxx{}

使用js去获取当前主题绑定的标签的class的值(也就是上面代码中变量值 白天/晚上),通过点击按钮切换不同的样式同时写入到cookie中,在不删除cookie或者超过你设置的cookie有效期,下次访问还是这个样式

<!-- 切换样式按钮,白天隐藏晚上按钮,晚上隐藏白天按钮 -->
<button id="toggle-style">
    <i class="fa fa-moon-o"></i>
    <i class="fa fa-certificate"></i>
</button>
<script>
// 获取HTML元素
var header = document.getElementsByTagName("html")[0];
var headts = document.getElementsByTagName('head')[0];

// 获取当前主题类名
var ts = headts.getAttribute("class").trim();
// 初始当前主题为黑色主题或根据类名获取的主题
var currentTheme = header.classList.contains('black') ? 'black' : ts;

// 获取Logo元素
var Logo = document.querySelector('.intro-logo');

// 获取存储的主题cookie
var cookieTheme = getCookie("theme");

// 如果存在主题cookie,则使用cookie中的主题并设置文档主题
if (cookieTheme) {
    currentTheme = cookieTheme;
    setDocumentTheme(currentTheme);
}

// 监听主题切换按钮的点击事件
document.getElementById("toggle-style").addEventListener("click", function() {
    // 根据当前主题切换主题并更新当前主题
    if (currentTheme === ts) {
        setDocumentTheme("black");
        currentTheme = "black";
    } else if (currentTheme === "black") {
        setDocumentTheme(ts);
        currentTheme = ts;
    }
    // 设置主题cookie
    setCookie("theme", currentTheme);
});

// 设置文档主题
function setDocumentTheme(theme) {
    header.classList.remove(ts, "black"); // 移除之前的主题类
    header.classList.add(theme); // 添加新的主题类
    Logo.src = '/img/logo/' + theme + '/logo.png'; // 更新Logo图像路径
}

// 设置cookie
function setCookie(name, value) {
    var expires = new Date();
    expires.setHours(24, 0, 0, 0); // 设置为下一个凌晨的时间

    var timeDiff = expires.getTime() - Date.now(); // 计算当前时间距离下一个凌晨的时间间隔

    document.cookie = name + "=" + value + "; expires=" + new Date(Date.now() + timeDiff) + "; path=/";
}

// 获取cookie
function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
return null;
}
</script>

白天 07:00 - 18:59

css2.png

晚上 19:00 - 06:59

css1.png


本文最后更新时间 2023-07-08
文章链接地址:https://me.jinchuang.org/archives/1410.html
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处


留言列表

  1. 苏晓晴
    苏晓晴 Windows 10 Microsoft Edge · 广西南宁市 · 回复

    这种方法不怎么好 普遍的都是通过js来操作css属性来实现夜间模式
    我的这个就可以跟随时间来实现 默认是时间 如果通过按钮开关来切换 下次访问就是夜间模式了

    1. Lazy
      Lazy Windows 10 Google Chrome · 上海市上海市 · 回复

      我这也是一时兴起,想实现下按时间切换配色的,主要是菜不会写但可以改改别人写的,先实现了再瞅瞅。不像你们这些大牛,我捣腾起来需要用js的都是找GPT和前端同事😄

留言

顶部
您当前正在使用Internet Explorer浏览器访问本站,本站在此浏览器上兼容性较差
建议使用 Chrome, Firefox, or Edge浏览器访问本网站