美文网首页
Hexo博客实现深色主题切换

Hexo博客实现深色主题切换

作者: 卓技卓品 | 来源:发表于2021-11-29 16:54 被阅读0次

    需求背景

    开源应用内嵌个人博客,由于应用做了深色主题兼容,然而当前博客不支持深色主题,导致夜间查看时屏幕很刺眼。遂研究Hexo Matery主题博客支持深色主题模式。最终效果可参考个人博客:卓技卓品

    实现过程

    第一步,在Web界面添加切换深色主题按钮,找到文件:\blog\themes\matery\layout\layout.ejs。在末尾添加:

    <script>
      function switchNightMode() {
        $('<div class="Cuteen_DarkSky"><div class="Cuteen_DarkPlanet"></div></div>').appendTo($('body')),
          setTimeout(function () {
            $('body').hasClass('DarkMode') ? ($('body').removeClass('DarkMode'), localStorage.setItem('isDark', '0'),$('#nightMode').removeClass('fa-moon-o').addClass('fa-lightbulb-o')): ($('body').addClass('DarkMode'), localStorage.setItem('isDark', '1'), $('#nightMode').removeClass('fa-lightbulb-o').addClass('fa-moon-o')),
              setTimeout(function () {
                $('.Cuteen_DarkSky').fadeOut(1e3, function () {
                  $(this).remove()
                })
              }, 2e3)
          })
      }
      function switchNightModeTop() {
        $('body').hasClass('DarkMode') ? ($('body').removeClass('DarkMode'), localStorage.setItem('isDark', '0'),$('#nightMode').removeClass('fa-moon-o').addClass('fa-lightbulb-o')) : ($('body').addClass('DarkMode'), localStorage.setItem('isDark', '1'), $('#nightMode').removeClass('fa-lightbulb-o').addClass('fa-moon-o'))
      }
    </script>
    
    <script>
    if (localStorage.getItem('isDark') === '1') {
        ('body').addClass('DarkMode');
        }
        else if (new Date().getHours() >= 22 || new Date().getHours() < 7) {
        ('body').addClass('DarkMode');
        } 
        else if (matchMedia('(prefers-color-scheme: dark)').matches) {
        ('body').addClass('DarkMode');
        }
    </script>
    <a onclick="switchNightMode()" id="sma" title="切换主题">
        <i class="fa fa-lightbulb-o" id="nightMode"  aria-hidden="false"></i>
    </a>
    

    第二步,设置按钮显示和点击切换效果。找到:\blog\themes\matery\source\css\my.css文件或\blog\themes\matery\source\css\matery.css,两者选其一。在文件末尾添加:

    /* 深色模式按钮设置 */
    #sma {
        background: #000;
        width: 38px;
        height: 38px;
        display: block;
        position: fixed;
        border-radius: 50%;
        right: 15px;
        bottom: 170px;
        padding-top: 15px;
        margin-bottom: 0;
        z-index: 998;
        cursor: pointer;
    }
    
    #sma .fa-moon-o {
        position: absolute;
        right: 8px;
        bottom: 8px;
        font-size: 1.48rem!important;
    }
    #sma .fa-lightbulb-o  {
        position: absolute;
        right: 13px;
        bottom: 8px;
        font-size: 1.5rem!important;
    }
    
    .fa-moon-o:before {
        content: "\f186";
    }
    .fa-comments:before {
        content: "\f086";
    }
    

    第三步,设置深色主题的配色及对应控件。继续在第二步选中的文件中添加:

    /* 深色主题配色 */
    /* 字体颜色变灰白色 */
    body.DarkMode .fas,
    body.DarkMode .title,
    body.DarkMode .row .text,
    body.DarkMode article .article-content .summary,
    body.DarkMode .card .card-image .card-title,
    body.DarkMode .fa-moon-o:before,
    body.DarkMode .fa-lightbulb-o:before,
    body.DarkMode article .article-tags .chip,
    body.DarkMode .chip-container .tag-title,
    body.DarkMode div.jqcloud a,
    body.DarkMode .friends-container .tag-title,
    body.DarkMode .frind-ship .title h1,
    body.DarkMode .card .card-content p,
    body.DarkMode .card .card-content .dss,
    body.DarkMode .v[data-class='v'] .vcount,
    body.DarkMode .v[data-class='v'] .vcount .vnum,
    body.DarkMode pre code,
    body.DarkMode h1,
    body.DarkMode h2,
    body.DarkMode h3,
    body.DarkMode h4,
    body.DarkMode h5,
    body.DarkMode h6,
    body.DarkMode li,
    body.DarkMode p,
    body.DarkMode header .side-nav .mobile-head .logo-name,
    body.DarkMode header .side-nav .mobile-head .logo-desc,
    body.DarkMode header .side-nav .menu-list a,
    body.DarkMode .bg-cover .post-title,
    body.DarkMode.read .bg-cover .description {
      color: rgba(255, 255, 255, 0.6);
    }
    /* 背景颜色变灰色 */
    body.DarkMode .card,
    body.DarkMode .block-with-text:after {
      background-color: #282c34;
    }
    /* 背景颜色变黑色 */
    body.DarkMode,
    body.DarkMode .v[data-class='v'] .vcount,
    body.DarkMode #rewardModal .modal-content,
    body.DarkMode .modal,
    body.DarkMode header .side-nav,
    body.DarkMode header .side-nav .menu-list .m-nav-show {
      background-color: #12121c;
    }
    /* 改变透明度 */
    body.DarkMode .aplayer {
      background: #2f3742 !important;
    }
    body.DarkMode img,
    body.DarkMode strong {
      filter: brightness(0.7);
    }
    /* 统计图滤镜 */
    body.DarkMode #post-calendar,
    body.DarkMode #category-radar,
    body.DarkMode #tags-chart,
    body.DarkMode #categories-chart,
    body.DarkMode #posts-chart {
        filter: invert(1);
    }
    /*toc目录滤镜*/
    body.DarkMode .toc-widget{
      filter: invert(1);
    }
    /* Skill bar text color */
    body.DarkMode .skillbar .skill-bar-percent {
        color: #000;
    }
    

    第四步,添加切换页面时,读取缓存主题配置。在文件:\blog\themes\matery\source\js\matery.js中,修改fixStyles方法:

    let checkNightMode = function() {
        '1' === localStorage.getItem('isDark') ? ($('body').addClass('DarkMode'), $('#nightMode').removeClass('fa-lightbulb-o').addClass('fa-moon-o')) : ($('#nightMode').removeClass('fa-moon-o').addClass('fa-lightbulb-o')) 
      }
    
    /**
     * 修复样式.
     */
    let fixStyles = function () {
        fixPostCardWidth('navContainer', 'articles');
        fixPostCardWidth('artDetail', 'prenext-posts');
        fixFooterPosition();
        checkNightMode();
    };
    fixStyles();
    

    此时功能修改完成。

    实现优化

    以上完成后,发现切换主题功能已经正常实现了。但是发现切换主题按钮会一直显示在Web界面中。在大屏幕电脑上效果还可以,但是在手机、平板这类小屏幕设备上,该按钮会遮挡文字。并且考虑到切换主题不是一个频繁操作的按钮,所以把该功能迁移到导航栏。迁移步骤如下: 首先将第一步中添加按钮移除。 然后找到\blog\themes\matery\layout_partial\navigation.ejs文件,在对应部分添加切换按钮,注意对应class的配置,该配置会影响按钮在不同尺寸屏幕的显示效果:

    <li>
        <a href="javascript:void(0)" onclick="switchNightMode()" class="hide-on-med-and-down waves-effect waves-light">
            <i class="fa fa-lightbulb-o" id="nightMode"> 切换主题</i>
        </a>
        <a href="#searchModal" class="modal-trigger waves-effect waves-light">
            <i id="searchIcon" class="fa fa-search" title="<%= __('search') %>"></i>
        </a>
    </li>
    

    并在在该文件最后添加点击执行的script方法:

    <script>
      function switchNightMode() {
        $('<div class="Cuteen_DarkSky"><div class="Cuteen_DarkPlanet"></div></div>').appendTo($('body')),
          setTimeout(function () {
            $('body').hasClass('DarkMode') ? ($('body').removeClass('DarkMode'), localStorage.setItem('isDark', '0'),$('#nightMode').removeClass('fa-moon-o').addClass('fa-lightbulb-o')): ($('body').addClass('DarkMode'), localStorage.setItem('isDark', '1'), $('#nightMode').removeClass('fa-lightbulb-o').addClass('fa-moon-o')),
              setTimeout(function () {
                $('.Cuteen_DarkSky').fadeOut(1e3, function () {
                  $(this).remove()
                })
              }, 2e3)
          })
      }
    </script>
    

    然后找到文件\blog\themes\matery\layout_partial\mobile-nav.ejs,在对应位置添加如下代码。设置小屏幕设备显示效果:

    <li>
        <a href="javascript:void(0)" onclick="switchNightMode()" class="waves-effect waves-light">
            <i class="fa fa-lightbulb-o" id="nightMode" title=" 切换主题"></i>切换主题
        </a>
    </li>
    <% if (theme.githubLink && theme.githubLink.enable) { %>
    <li><div class="divider"></div></li>
    <li>
        <a href="<%- theme.githubLink.url %>" class="waves-effect waves-light" target="_blank">
            <i class="fa fa-github-square fa-fw"></i><%- theme.githubLink.title %>
        </a>
    </li>
    

    此时主题切换功能已经全部完成了。

    实现过程中参考博客如下:
    hexo-matery主题魔改日记(2)深色模式

    相关文章

      网友评论

          本文标题:Hexo博客实现深色主题切换

          本文链接:https://www.haomeiwen.com/subject/fbslxrtx.html