页面加载中
博客快捷键
按住 Shift 键查看可用快捷键
ShiftK
开启/关闭快捷键功能
ShiftA
打开/关闭中控台
ShiftD
深色/浅色显示模式
ShiftS
站内搜索
ShiftR
随机访问
ShiftH
返回首页
ShiftL
友链页面
ShiftP
关于本站
ShiftI
原版/本站右键菜单
松开 Shift 键或点击外部区域关闭
互动
最近评论
暂无评论
标签
寻找感兴趣的领域
暂无标签
    0
    文章
    0
    标签
    8
    分类
    10
    评论
    128
    功能
    深色模式
    标签
    JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
    互动
    最近评论
    暂无评论
    标签
    寻找感兴趣的领域
    暂无标签
      0
      文章
      0
      标签
      8
      分类
      10
      评论
      128
      功能
      深色模式
      标签
      JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
      随便逛逛
      博客分类
      文章标签
      复制地址
      深色模式
      AnHeYuAnHeYu
      Search⌘K
      博客
        暂无其他文档

        Solitude主题魔改(二):侧边栏个性时钟

        文章摘要
        本教程详细介绍了如何为Solitude主题添加个性化数字时钟,适用于已熟悉魔改的用户。教程首先解释了如何提交pr以升级主题,或直接参考教程进行魔改。文章重点在于创建JavaScript和CSS文件以实现时钟功能,包括创建数组、设置时间格式、动画帧请求和CSS样式设计。此外,教程还涉及创建侧边栏卡片和配置主题设置以显示时钟,并提供了如何修改Gulp配置以避免压缩时钟JavaScript文件的说明。对于初次魔改的用户,教程还提示了如何引入CSS文件和使用Gulp排除特定文件。
        June 23, 20247 分钟 阅读68 次阅读
        效果展示


        此教程会向Solitude提交pr,可以升级主题的人可以等待主题更新,不可以升级主题的可以直接照着魔改

        之前已经写过一个教程了,是关于鱼鱼的主题实现的,这次换成Solitude主题之后重新写一个,属于是老活老整了,两篇文章相似度高答99.9%

        此教程是为Solitude主题的专项教程,其余Butterfly系主题代码相似,但不完全相同,可自行修改后食用

        安知鱼主题的可以参照这篇文章
        Butterfly魔改:侧边栏添加个性时钟,添加一个数字个性时钟
        创建[themes]/source/js/custom/digit-clock.js文件,在其中添加如下内容:

        js
            // 创建一个包含10个元素的数组,每个元素的值为索引  
            var _time10 = Array.from(Array(10)).map((n, i) => i);
            // 创建一个包含前6个元素的数组,作为时间的小时和分钟  
            var _time6 = _time10.slice(0, 6);
            // 创建一个包含前3个元素的数组,作为时间的秒钟  
            var _time3 = _time10.slice(0, 3);
            // 创建一个包含3个子数组的二维数组,用于表示时钟的结构  
            var _Structure = [
                [_time3, _time10],
                [_time6, _time10],
                [_time6, _time10]
            ];
            // 创建一个div元素作为时钟的容器,并设置id为'clock'  
            var clock = document.createElement('div');
            clock.id = 'clock';
            // 将时钟容器添加到元素中元素中  
            document.getElementById("card-digit-clock").appendChild(clock);
            // 创建一个数组用于存储每个数字组的div元素  
            var digitGroups = [];
            // 请求动画帧并调用update函数  
            requestAnimationFrame(update);
            // 遍历_Structure数组  
            _Structure.forEach(digits => {
                // 创建一个div元素作为数字组的容器,并添加类名'digit-group'  
                var digitGroup = document.createElement('div');
                digitGroup.classList.add('digit-group');
                // 将数字组的容器添加到时钟容器中,并将其添加到digitGroups数组中  
                clock.appendChild(digitGroup);
                digitGroups.push(digitGroup);
                // 遍历digits数组  
                digits.forEach(digitList => {
                    // 创建一个div元素作为数字的容器,并添加类名'digit'  
                    var digit = document.createElement('div');
                    digit.classList.add('digit');
                    // 遍历digitList数组  
                    digitList.forEach(n => {
                        // 创建一个div元素作为数字的子元素,并添加类名'digit-number',设置文本内容为n  
                        var ele = document.createElement('div');
                        ele.classList.add('digit-number');
                        ele.innerText = n;
                        // 将数字的子元素添加到数字的容器中  
                        digit.appendChild(ele);
                    });
                    // 将数字的容器添加到数字组的容器中  
                    digitGroup.appendChild(digit);
                });
            });
            // 定义update函数  
            function update() {
                // 请求动画帧并调用update函数  
                requestAnimationFrame(update);
                // 创建一个Date对象表示当前时间  
                var date = new Date();
                // 获取当前时间的小时、分钟和秒钟,并将它们转换为两位数的字符串数组  
                var time = [date.getHours(), date.getMinutes(), date.getSeconds()].
                    map(n => `0${n}`.slice(-2).split('').map(e => +e)).
                    reduce((p, n) => p.concat(n), []);
                // 遍历time数组  
                time.forEach((n, i) => {
                    var digit = digitGroups[Math.floor(i * 0.5)].children[i % 2].children;
                    // 遍历数字组的子元素  
                    Array.from(digit).forEach((e, i2) => e.classList[i2 === n ? 'add' : 'remove']('bright'));
                });
            }

        创建[themes]/source/css/custom/digit-clock.css文件,在其中添加如下内容:

        css
        #card-digit-clock {
            display: flex;
            justify-content: center;
            align-items: center;
        }
        #clock {
            font-size: 10px;
            position: relative;
        }
        .digit-group {
            display: inline-block;
        }
        .digit-group:not(:last-child):after {
            color: inherit;
            content: ":";
            font-size: 50px;
        }
        .digit {
            display: inline-block;
            width: 33px;
        }
        .digit .digit-number {
            color: inherit;
            transform: rotate(-90deg);
            transition: font-size 200ms,transform 350ms,color 150ms;
        }
        .digit .digit-number.bright {
            color: inherit;
            font-size: 25px;
            transform: rotate(0deg);
        }

        创建侧边栏卡片,在source/_data目录下新建一个aside.yml文件,内容如下:

        yml
        - name: digit-clock
          title:
          class: card-digit-clock
          id: card-digit-clock
          icon:
          content_class:
          content_id: 
          content_html: "<script defer async pjax src='/js/custom/digit-clock.js'></script>"

        假如你有很多的卡片需要排序,那么你就设置一下content_id来进行排序。
        此时你的页面上还不会显示出你的时钟,打开主题设置,在约150行的位置,修改如下:

        yml
        aside:
          # 值:about(关于我)、newestPost(最新文章)、allInfo(网站信息)、flip(公众号二维码)、newest_comment(最新评论)
          # Values: about (info card), newestPost (latest article), allInfo (website information), flip (official account QR code), newest_comment (latest comment)
        
          # 在主页显示的侧边栏信息
          # Sidebar information displayed on the homepage
          home:
            # 固定的信息(滑动不跟随)
            # Fixed information (not followed by sliding)
            noSticky: "about,digit-clock"
            # 不固定的信息(滑动跟随)
            # Unfixed information (sliding follow)
            Sticky: "allInfo"
          # 在文章页显示的侧边栏信息
          # Sidebar information displayed on the article page
          post:
            noSticky: "about,digit-clock"
            Sticky: "newestPost"
          # 在页面中显示的侧边栏信息
          # Sidebar information displayed on the
          page:
            noSticky: "about,digit-clock"
            Sticky: "newestPost,allInfo"

        此处,我在首页,文章页,页面上都设置显示数字时钟,你可以按需修改(此处非完整代码,请勿直接替换)
        假如你是刚迈入魔改的人,你可能需要将css引入,修改themes\solitude\source\css\index.styl文件,在任意一行添加

        styl
        @import 'custom/*.css'

        假如你使用gulp压缩资源,可能会导致无法运行,修改gulpfile.js(我这里是使用的空梦的gulp):

        js
        // 压缩js
        // 参数 doc:https://github.com/terser-js/terser#minify-options
        gulp.task('minify-js', () =>
            gulp.src(['./public/**/*.js','!./public/**/digit-clock.js'])
                .pipe(terser({
                    compress: {
                        /** @see https://blog.csdn.net/weixin_39842528/article/details/81390588 */
                        sequences: 50,
                        unsafe: true,
                        unsafe_math: true,
                        pure_getters: true,
                        ecma: true
                    }
                }))
                .pipe(gulp.dest('./public'))
        )

        我们可以在gulp.src中添加一个!./public/path/to/your/file.js来排除某个文件。这意味着 Gulp 将会处理./public/**/*.js匹配的所有文件,除了./public/path/to/your/file.js。

        最后更新于 June 23, 2024
        On this page
        暂无目录