你好,Stack主题

Hugo Stack 主题装修历程分享

本文基于Hugo版本0.150.0,Stack版本3.31.0,部分代码使用AI完成

从Neopost到Stack

我觉得对于像我这样的代码白痴,一开始装修博客就去选冷门主题真的是走弯路了。用Neopost主题的时候遇到很多问题用搜索引擎都搜不到可以抄作业的答案,只能一个劲问ai然后一遍一遍试错……
虽然看到博客一点一点有个样子了也比较有满足感,但是太折磨了,思来想去还是换了更多人用教程也更全的Stack主题。

在此感谢:
莱特雷-Hugo Stack主题自定义更改
树响集-Stack主题调整
第三夏尔-Hugo Stack博客主题装修
Naive Koala-Hugo Stack 魔改美化 ;
B1ain’s Blog-hugo博客装修笔记 ;
失迹的博客-建站技术 | 使博客更好地接入 Waline

顺便截图纪念一下用Neopost主题时候的样子吧。

展开图片 Neopost

从默认字体到猫啃糖圆

没啥好说的,星屑同款字体,圆体的神,
附上字体网站链接

背景图和头像

因为还是很喜欢原来做的像素动图风格,本打算沿用,但在Pintrest找了一晚上素材都没有找到很满意的背景图
自己画了一下草图,先凑合用着吧(画不画完还是未知数)
画不来像素风所以整个风格都改了> <

画布开得尽可能大了,姑且应用到网页上看看会多么影响加载速度(

切换与旋转效果

按照教程 添加了头像旋转效果,并加了浅色/暗色模式切换头像和背景图的功能,效果不错(就是图太草了)

以下是我魔改的代码:

暗色模式下头像旋转(主题目录\assets\scss\custom.scss)
1// 头像旋转动画
2[data-scheme="dark"] .sidebar header .site-avatar .site-logo {
3  transition: transform 1.65s ease-in-out; // 旋转时间
4}
5
6[data-scheme="dark"] .sidebar header .site-avatar .site-logo:hover {
7  transform: rotate(360deg); // 旋转角度为360度
8}
切换背景图片(主题目录\layouts\partials\footer\custom.html)
 1    /*修改背景图片*/
 2    [data-scheme="light"] body {
 3        background: url({{ (resources.Get "background/light.jpg").Permalink }}) no-repeat center top;
 4        background-size: cover;
 5        background-attachment: fixed;
 6    }
 7    [data-scheme="dark"] body {
 8        background: url({{ (resources.Get "background/dark.jpg").Permalink }}) no-repeat center top;
 9        background-size: cover;
10        background-attachment: fixed;
11    }
切换头像

先修改主题目录\layouts\partials\head\custom.html

 1<script>
 2// 头像切换功能
 3function updateAvatar() {
 4  const avatarImg = document.querySelector('.site-avatar .site-logo');
 5  if (!avatarImg) return;
 6  
 7  const isDark = document.documentElement.getAttribute('data-scheme') === 'dark';
 8  const lightSrc = avatarImg.getAttribute('data-src-light') || avatarImg.src;
 9  const darkSrc = avatarImg.getAttribute('data-src-dark');
10  
11  if (darkSrc && isDark) {
12    avatarImg.src = darkSrc;
13  } else if (lightSrc && !isDark) {
14    avatarImg.src = lightSrc;
15  }
16}
17
18// 初始化
19document.addEventListener('DOMContentLoaded', updateAvatar);
20
21// 监听主题切换
22new MutationObserver(function(mutations) {
23  mutations.forEach(function(mutation) {
24    if (mutation.attributeName === 'data-scheme') {
25      setTimeout(updateAvatar, 50);
26    }
27  });
28}).observe(document.documentElement, { attributes: true });
29</script>

再修改主题目录\layouts\partials\sidebar\left.html(在<header>后修改,注释掉原有设置)

 1<header>
 2    {{ with .Site.Params.sidebar.avatar }}
 3        {{ if (default true .enabled) }}
 4        <figure class="site-avatar">
 5            <a href="{{ .Site.BaseURL | relLangURL }}">
 6            {{ if not .local }}
 7                <img src="{{ .src }}" width="300" height="300" class="site-logo" loading="lazy" alt="Avatar"
 8                    {{ with .srcDark }}data-src-dark="{{ . }}"{{ end }}>
 9            {{ else }}
10                {{ $avatar := resources.Get (.src) }}
11                {{ $avatarDark := resources.Get (.srcDark | default .src) }}
12                
13                {{ if and $avatar $avatarDark }}
14                    {{ $avatarResized := $avatar.Resize "300x" }}
15                    {{ $avatarDarkResized := $avatarDark.Resize "300x" }}
16                    <img src="{{ $avatarResized.RelPermalink }}" 
17                        data-src-light="{{ $avatarResized.RelPermalink }}"
18                        data-src-dark="{{ $avatarDarkResized.RelPermalink }}"
19                        width="{{ $avatarResized.Width }}" 
20                        height="{{ $avatarResized.Height }}" 
21                        class="site-logo" 
22                        loading="lazy" 
23                        alt="Avatar">
24                {{ else if $avatar }}
25                    {{ $avatarResized := $avatar.Resize "300x" }}
26                    <img src="{{ $avatarResized.RelPermalink }}" 
27                        width="{{ $avatarResized.Width }}"
28                        height="{{ $avatarResized.Height }}" 
29                        class="site-logo" 
30                        loading="lazy" 
31                        alt="Avatar">
32                {{ else }}
33                    {{ errorf "Failed loading avatar from %q" . }}
34                {{ end }}
35            {{ end }}
36            </a>
37            {{ with $.Site.Params.sidebar.emoji }}
38                <span class="emoji">{{ . }}</span>
39            {{ end }}
40        </figure>
41        {{ end }}
42    {{ end }}

再在hugo.yamlsidebar里面添加srcdark: img/dark.jpg

1    sidebar:
2        emoji: 😨
3        subtitle: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
4        avatar:
5            enabled: true
6            local: true
7            src: img/light.jpg
8            srcdark: img/dark.jpg

顺说目前的回顶部按钮和鼠标光标是用neopost主题的时候自己画的,我很满意^ ^
回顶部默认点击文本
不过考虑到风格不匹配大概还要重画一个……

更换头像下图标链接

苦于没找到合适的图标素材,自己摸索了一个可以制作出完美适配主题下其他现有图标的办法

先看我做好的图标:Misskeybluesky (这样看起来两个线条粗细不太一致,我也没找到原因,但没关系,最终显示效果是差不多的就行……如果有谁知道为什么,请务必告诉我)
效果

如果有同款需要,可以直接右键上面的图标另存^ ^

寻找svg素材

这里有一个很全的资源网站:维基共享资源
搜索你需要的logo,比如“bluesky”,选择图像-文件类型-svg,选择合适的logo并在下载时选择full resolution,这样我们就能得到一张初始的svg文件:

展开图像

bluesky

编辑svg文件

使用编辑工具对svg文件进行编辑,这里我用的是https://boxy-svg.com/ (需要注册,15天免费试用)

主要需要做的是先把view box调到24x24像素,再把图像调整到view box范围内,四周适当留出2px左右的空白(视具体图像而定),之后就可以保存了

展开图像 调整view box 调整图像

把保存的svg文件在VScode里打开,默认会显示图像预览,需要在右上角找到作为源文本重新打开按钮,查看源文本
为了跟主题原有的图标协调,这里我同时打开了主题目录\assets\icons\brand-twitter.svg的源文本进行比对:

brand-twitter.svg
1<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-twitter" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
2    <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
3    <path d="M22 4.01c-1 .49 -1.98 .689 -3 .99c-1.121 -1.265 -2.783 -1.335 -4.38 -.737s-2.643 2.06 -2.62 3.737v1c-3.245 .083 -6.135 -1.395 -8 -4c0 0 -4.182 7.433 4 11c-1.872 1.247 -3.739 2.088 -6 2c3.308 1.803 6.913 2.423 10.034 1.517c3.58 -1.04 6.522 -3.723 7.651 -7.742a13.84 13.84 0 0 0 .497 -3.753c-.002 -.249 1.51 -2.772 1.818 -4.013z" />
4</svg>

可以直接复制前面两行代码粘贴到正在修改的svg文件中:

未编辑的svg文件源文本

图像

1<?xml version="1.0" encoding="utf-8"?>
2<svg width="24px" height="24px" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
3    <path d="M 6.307 4.451 C 8.615 6.202 11.099 9.759 12.012 11.668 C 12.923 9.76 15.407 6.202 17.717 4.451 C 19.383 3.185 22.083 2.207 22.083 5.321 C 22.083 5.944 21.73 10.549 21.524 11.294 C 20.804 13.893 18.184 14.557 15.854 14.155 C 19.928 14.858 20.964 17.179 18.726 19.501 C 14.477 23.912 12.618 18.395 12.14 16.981 C 12.054 16.722 12.012 16.6 12.012 16.703 C 12.012 16.6 11.97 16.722 11.882 16.981 C 11.407 18.395 9.547 23.912 5.297 19.501 C 3.059 17.179 4.095 14.858 8.17 14.155 C 5.837 14.557 3.219 13.893 2.499 11.294 C 2.294 10.549 1.94 5.944 1.94 5.321 C 1.94 2.207 4.64 3.185 6.307 4.451 Z" style="transform-box: fill-box; transform-origin: 50% 50%;" fill="#000"/>
4</svg>

注意删除正在修改的文件<path>末尾的样式(如style=""fill=""stroke=""等等,总之只保留前面一连串看不懂的数字)

编辑后的源文本

图像

1<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-bluesky" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
2    <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
3    <path d="M 6.307 4.451 C 8.615 6.202 11.099 9.759 12.012 11.668 C 12.923 9.76 15.407 6.202 17.717 4.451 C 19.383 3.185 22.083 2.207 22.083 5.321 C 22.083 5.944 21.73 10.549 21.524 11.294 C 20.804 13.893 18.184 14.557 15.854 14.155 C 19.928 14.858 20.964 17.179 18.726 19.501 C 14.477 23.912 12.618 18.395 12.14 16.981 C 12.054 16.722 12.012 16.6 12.012 16.703 C 12.012 16.6 11.97 16.722 11.882 16.981 C 11.407 18.395 9.547 23.912 5.297 19.501 C 3.059 17.179 4.095 14.858 8.17 14.155 C 5.837 14.557 3.219 13.893 2.499 11.294 C 2.294 10.549 1.94 5.944 1.94 5.321 C 1.94 2.207 4.64 3.185 6.307 4.451 Z" style="transform-box: fill-box; transform-origin: 50% 50%;" />
4</svg>

这样一个适配主题的svg图标就做好了。

应用到主页

把做好的文件放到主题目录\assets\icons\中,并在hugo.yaml(也可能叫config.yaml,我不记得我改过名字吗)里修改menu-social-icon的设置(与文件的标题一致),这样就可以应用到博客页面上了
如果需要更改图标链接的顺序,在params:前面一行添加weight: 数字即可,数字越小则越前

其他工具

找资料的时候又发现一个好用的工具: https://www.svgviewer.dev/ ,有自带的素材库,可以直接改代码看效果,如果只需要基础的图标这个够用了,也比较简单

添加文章封面渐变效果

参考了田八-使用CSS让图片透明渐变 中第三种方法的代码。

效果预览

1

将以下代码添加到custom.scss中即可:

1//文章预览图渐变
2.article-image {
3    img {
4    mask: linear-gradient(to bottom, black 0%, black 25%, rgba(0, 0, 0, 0.8) 40%, rgba(0, 0, 0, 0.4) 70%, transparent 100%);  }
5}

为元素添加鼠标悬停效果

代码是什么,可以吃吗?

先说题外话, 装修过程中渐渐学会了用开发者工具、定位css文件中的元素位置、简单修改悬停效果和添加动画……这之前我真是一窍不通
我是小白,所以把这个过程分享出来,希望能帮助到跟我小白程度一样的人吧。

我一开始还是各种问ai,但ai给出的方案实际上也是它海量检索资料然后缝合的,如果提问的方式不正确,它很难给出跟实际情况适配的答案。
遇到问题时还是先谷歌搜寻一下,比如我想要上面提到的文章封面渐变效果,先用搜索引擎搜索“CSS 图片渐变”,找到了别人分享的实际内容,再去问ai是否可以应用到我的案例上、如果我需要为透明度添加中间值应该怎么做。这样可以提升效率,而不是在ai给出的海量错误代码中迷失。

学会使用开发者工具检查元素,查看元素的属性。
用vscode的资源管理器打开主题文件夹,再在style.scss给出的文件列表里一个一个ctrl+F查找该属性,这样就能很快锁定这个元素的样式代码。
通常建议不要直接在原文件上进行修改,应该在custom.scss中添加代码。

在样式栏中,你也可以很快查找到该元素的某个属性是由哪个选择器定义的,可以直接复制该选择器的名字到css文件中对具体属性进行更改。点击:hov键可以强制设置元素状态,查看该状态下的属性。
1

为常用颜色、阴影等参数创建变量
主题文件夹\assets\scss\variables.scss中,可以看到主题设置的全部变量,我们也可以设置自己的变量以简便修改主题样式的过程。
比如我的主题需要用到很多红色,我设置了:root {--light-red: #e85b56;},这样我就可以使用var(--light-red)来调取这个值,而不用每次都输入具体的值。

案例:左侧菜单栏悬停效果

以下是实现左侧菜单栏悬停效果的具体案例:

  1. 用F12定位元素属性
    选择左侧菜单栏中的元素,可以很清楚地看到class="menu" id="main-menu"

  2. 查找元素的样式代码
    可以在menu.scss中找到#main-menu关键词,以下是它相关的所有样式代码

 1/* Menu style */
 2#main-menu {
 3    list-style: none;
 4    overflow-y: auto;
 5    flex-grow: 1;
 6    font-size: 1.4rem;
 7    background-color: var(--card-background);
 8
 9    box-shadow: var(--shadow-l1);
10    display: none;
11    margin: 0 calc(var(--container-padding) * -1);
12
13    padding: 30px 30px;
14
15    @include respond(xl) {
16        padding: 15px 0;
17    }
18
19    &, .menu-bottom-section ol {
20        flex-direction: column;
21        gap: 30px;
22
23        @include respond(xl) {
24            gap: 25px;
25        }
26    }
27
28    &.show {
29        display: flex;
30    }
31
32    @include respond(md) {
33        align-items: flex-end;
34        display: flex;
35        background-color: transparent;
36        padding: 0;
37        box-shadow: none;
38        margin: 0;
39    }
40
41    li {
42        position: relative;
43        vertical-align: middle;
44        padding: 0;
45
46        @include respond(md) {
47            width: 100%;
48        }
49
50        svg {
51            stroke: currentColor;
52            stroke-width: 1.33;
53            width: 20px;
54            height: 20px;
55        }
56
57        a {
58            height: 100%;
59            display: inline-flex;
60            align-items: center;
61            color: var(--body-text-color);
62            gap: var(--menu-icon-separation);
63        }
64
65        span {
66            flex: 1;
67        }
68
69        &.current {
70            a {
71                color: var(--accent-color);
72                font-weight: bold;
73            }
74        }
75
76        &.menu-bottom-section {
77            margin-top: auto;
78
79            ol {
80                display: flex;
81                padding-left: 0;
82            }
83        }
84    }
85}
  1. custom.scss中添加样式
    这是我为实现左侧菜单栏悬停后变色并加粗放大和添加阴影效果(并做暗色模式区分)而写的代码:
 1#main-menu { //左边菜单
 2    li {
 3        &:hover a{
 4            transition: all 0.2s ease-in-out;
 5            color: var(--light-red);
 6            transform: scale(1.05);
 7            font-weight: bold;
 8            filter: drop-shadow(var(--dropshadow-light));
 9        }
10
11        [data-scheme="dark"] & {
12            &:hover {
13                filter: drop-shadow(var(--dropshadow-dark));
14            }
15        }
16    }
17}

对于像我这样的小白来说,写悬停效果只需要学会写:hover(悬停状态)、transition(动画效果)、transform(变形)这些很简单的代码,并学会看原样式代码的层级结构就可以了。

如果写的代码效果与预期不一致,或者报错,此时再把已经写好的代码和原本的样式代码贴给ai让它进行修改,比什么都不做就茫然地向ai求助更有效率。

我为我的博客写了一大堆悬停效果,因为它最简单也最容易提升博客阅读体验。(当然,移动端看不了鼠标悬停效果= =

全部的代码就不放出了,总之基本上都是重复上述案例的步骤,不同的元素根据它原有样式的不同可能会有差分
如果需要实现复杂的功能效果,可能需要编辑layouts/partials/footer/custom.html这个文件,这就涉及我知识盲区了> <

页码栏鼠标悬停效果

因为有点复杂,java部分借助了ai

效果预览:
1

这个效果拆分为:

  1. 当前页码高亮(stack自带)
  2. 鼠标悬停在非当前页码时高亮(会写上面的代码就会写这个),同时当前页码变回默认样式
  3. 鼠标悬停在当前页码时不发生改变

实现这一效果的代码:

  1. 编辑custom.scss
 1.page-link { //页面页码栏(需要添加JavaScript代码实现当前页高亮)
 2    transition: all 0.2s ease-in-out;
 3
 4    &.current.reset-style {
 5        font-weight: normal;
 6        background-color: var(--card-background);
 7        color: var(--card-text-color-secondary);
 8    }
 9    &:not(.current):hover { // 其他页面的悬停效果
10        color: var(--light-red);
11        background-color: var(--card-background-selected);
12        transform: scale(1.05);
13        font-weight: bold;
14    }
15}
  1. 编辑custom.html
 1<script>
 2/* 页码栏分页悬停效果 */
 3document.addEventListener('DOMContentLoaded', function() {
 4    const pagination = document.querySelector('.pagination');
 5    const pageLinks = document.querySelectorAll('.page-link');
 6    let currentPage = document.querySelector('.page-link.current');
 7
 8    pageLinks.forEach(link => {
 9        link.addEventListener('mouseenter', function() {
10            // 如果悬停的不是当前页面
11            if (!this.classList.contains('current') && currentPage) {
12                currentPage.classList.add('reset-style');
13            }
14        });
15
16        link.addEventListener('mouseleave', function() {
17            // 恢复当前页面样式
18            if (currentPage) {
19                currentPage.classList.remove('reset-style');
20            }
21        });
22    });
23});
24</script>

更改主页文章卡片可点击区域

Stack主题中,主页的文章卡片的默认点击区域只有文章标题区域,
以下这些代码可以把点击打开文章的区域更改为除分类标签以外的所有区域。

custom.html中添加:

 1<!-- 扩大主页文章卡片可点击区域 -->
 2<script>
 3document.addEventListener('click', function(e) {
 4    const articleDetails = e.target.closest('.article-details');
 5    if (articleDetails && !e.target.closest('.article-category a')) {
 6        const titleLink = articleDetails.querySelector('.article-title a');
 7        if (titleLink) {
 8            window.location.href = titleLink.href;
 9        }
10    }
11});
12</script>

custom.scss中添加:

1//扩大主页文章卡片可点击区域(java),同步更改鼠标光标样式
2.article-details {
3  cursor: url('/mouse/pointer.png'), pointer;
4}

如果没有自定义鼠标样式,去掉url的部分就好了。

配置Waline评论区

初步上手

Waline的官方文档有详细的配置教程。Waline-快速上手

完成HTML引入后,在根目录下的配置文件hugo.yaml(也可能是config.yaml?)中修改参数:

 1params:
 2    comments: # 默认在第39行
 3        enabled: true
 4        provider: waline
 5
 6        waline: #默认在第75行
 7            serverURL: # 填写你的评论区网址,如:serverURL: https://xxxx.vercel.app/
 8            lang: zh-cn # 语言设置为中文
 9            emoji: # 为你的评论区引入表情
10                - https://gcore.jsdelivr.net/gh/Saidosi/azuki-emoji-for-waline@1.0/azukisan/ # 小豆泥
11            locale:
12                admin: 博主 # 设置评论区管理员标签
13                placeholder: |- # 评论框提示词,如果需要换行则输入换行符:"|-",不需要换行的话可以删掉
14                    您无需登录即可发表评论。如果需要收到回复通知,请留下您的邮箱地址。
15                    非登录状态下,如果您留下邮箱,您的头像将自动获取并设置为您的邮箱账户头像。
16                    由于vercle.app域名受到DNS污染,大陆ip地址无法参与评论。
17                nick: 昵称(选填) #昵称栏显示的标题文字,以下同理
18                mail: 邮箱(选填) 
19                link: 网址(选填)

但我在配置过程中还是遇到了评论区无法显示的问题,最后参考失迹的博客-建站技术 | 使博客更好地接入 Waline 第2.1条中的代码完美解决!如果有遇到同款问题,可以去阅读一下这篇文章。

修改评论区样式

配置成功后,Waline评论区可以在本地预览网址localhost:1313中显示,可以同样用F12检查元素的方法更改评论框的样式。
以下是我的样式:

  1    /* 评论区整体样式-by 失迹的博客 */
  2    .waline-container {
  3        background-color: var(--card-background);
  4        border-radius: var(--card-border-radius);
  5        box-shadow: var(--shadow-l1);
  6        padding: var(--card-padding);
  7        --waline-font-size: var(--article-font-size);
  8    }
  9    .waline-container .wl-count {
 10        color: var(--card-text-color-main);
 11    }
 12    /* 暗色模式下输入框背景 */
 13    [data-scheme="dark"] .wl-panel {
 14        background: #212121;
 15    }
 16    /* 提交按钮基础样式 */
 17    .wl-btn.primary {
 18        background: var(--body-text-color);
 19        border: none;
 20    }
 21    /* 提交按钮悬停&激活状态 */
 22    .wl-btn.primary:hover, .wl-btn.primary:active {
 23        border: none;
 24        background: var(--light-red);
 25    }
 26    /* 按正序、……悬停&激活状态 */
 27    .wl-sort li {
 28        transition: color 0.2s ease-in-out;
 29        &:hover {
 30            color: var(--body-text-color);
 31        }
 32        &.active {
 33            color: var(--light-red);
 34        }
 35    }
 36    /* markdown按钮与悬停状态 */
 37    [data-waline] a {
 38        color: var(--body-text-color);
 39        transition: color 0.2s ease-in-out;
 40        &:hover {
 41            color: var(--light-red)
 42        }
 43    }
 44    /* 删除、点赞、回复、编辑按钮悬停&激活状态 */
 45    .wl-card .wl-delete, .wl-card .wl-like, .wl-card .wl-reply, .wl-card .wl-edit {
 46        transition: color 0.2s ease-in-out;
 47        &:hover, &.active {
 48            color: var(--light-red);
 49        }
 50    }
 51    /* 登录按钮悬停&激活 */
 52    .wl-btn:hover, .wl-btn:active {
 53        border-color: var(--light-red);
 54        color: var(--light-red);
 55    }
 56    /* 表情、gif、图片、预览,悬停&激活状态 */
 57    .wl-action {
 58        transition: color 0.2s ease-in-out;
 59        &:hover, &.active{
 60            color: var(--light-red);
 61        }
 62    }
 63    /* 昵称等标签栏(= =艰难对齐) */
 64    .wl-header label {
 65        font-size: 1.4rem;
 66        padding-top: 1.8rem;
 67        padding-left: 2rem;
 68        padding-right: 0;
 69    }
 70    /* 主输入框间距 */
 71    .wl-editor {
 72        padding-left: 1.6rem;
 73        padding-top: 0.5rem;
 74    }
 75    /* 昵称等栏输入框:间距、圆角、字体大小 */
 76    .wl-header input {
 77        margin: 1rem;
 78        border-radius: 4px;
 79        font-size: 1.4rem;
 80    }
 81    /* 预览两个字的颜色 */
 82    .wl-preview h4 {
 83        color: var(--body-text-color);
 84    }
 85    /* 去掉认证符号背景 */
 86    .wl-cards .wl-user .verified-icon {
 87        background: none;
 88    }
 89    /* gif栏搜索框背景色、间距、圆角、输入符 */
 90    .wl-gif-popup input {
 91        background-color: var(--card-background);
 92        padding-left: 1.6rem;
 93        border-radius: 8px;
 94        &:focus-visible {
 95            color: var(--body-text-color);
 96        }
 97    }
 98    /* gif栏图片悬停效果与样式调整 */
 99    .wl-gif-popup img {
100        border-radius: 8px;
101        border: none;
102        transition: all 0.2s ease-in-out;
103        &:hover {
104            border-radius: 8px;
105            mask: linear-gradient(rgb(255, 255, 255) 0%, rgba(255, 255, 255, 0.75) 100%);
106        }
107    }
108    /* 去掉表情悬停时背景 */
109    .wl-emoji-popup button:hover {
110        background: none;
111    }
112    /* 表情悬停效果:放大+旋转 */
113    .wl-emoji-popup .wl-emoji {
114        transition: transform 0.3s ease-in-out;
115        &:hover {
116            transform: scale(1.5) rotate(-15deg);
117        }
118    }
119    /* 不显示评论ip和设备环境等 */
120    .wl-card .wl-meta>span {
121        display: none;
122    }
123    /* 设置上一条的同时调整评论文字位置弥补空缺 */
124    .wl-card .wl-content {
125        padding-top: 0;
126    }

同时,因为我自定义了鼠标样式,也需要为评论区应用我的鼠标样式:

 1// .wl 和.waline 开头的是waline评论区的选择器
 2// default光标图片
 3body,
 4html,
 5.article-content img,
 6.waline-container,
 7.wl-header label {
 8    cursor: url(../mouse/default.png),
 9    auto !important;
10}
11
12// pointer光标图片
13a:hover,
14button:hover,
15.copyCodeButton:hover,
16#dark-mode-toggle,
17.wl-actions label,
18.wl-actions a,
19.wl-emoji-popup .wl-tab-wrapper button,
20.wl-gif-popup img,
21.wl-sort li {
22    cursor: url(../mouse/pointer.png),
23    auto !important;
24}
25
26// text光标图片
27input:hover,
28.site-description,
29.article-subtitle,
30.article-content span,
31.article-content li,
32.article-content p,
33.wl-editor, .wl-input, 
34.wl-header input,
35[data-waline] p {
36    cursor: url(../mouse/text.png),
37    auto;
38}

还隐藏了一些滚动条:

 1// 隐藏一大堆滚动条
 2#TableOfContents, //导航栏
 3#main-menu, //左侧菜单
 4.wl-emoji-popup .wl-tab-wrapper,//评论区表情
 5.wl-gallery, //评论区gif
 6.wl-editor { //评论区主输入框
 7    scrollbar-width: none; /* Firefox */
 8    -ms-overflow-style: none; /* IE and Edge */
 9}
10
11#TableOfContents::-webkit-scrollbar,
12#main-menu::-webkit-scrollbar,
13.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar,
14.wl-gallery::-webkit-scrollbar,
15.wl-editor::-webkit-scrollbar {
16    display: none; /* Chrome, Safari and Opera */
17}

设置邮件通知

参考了失迹的博客-建站技术 | 使博客更好地接入 Waline 第4条中的邮件通知设置,与Sarakale-waline 邮件通知模板样式一览 中的邮件通知模板。

在设置邮件通知过程中需要注意的是,

  1. Google账户需要开启两步验证才能生成应用专用密码;
  2. Vercel每次更改环境变量后都需要reploy才能生效。

此外,在测试邮箱通知功能时的几点发现:

  1. 我用苹果默认邮箱应用打开收到评论的通知邮件,格式有所错位,但网页版邮箱是正常显示的,所以可能根据邮箱登录环境的不同效果会不一致;
  2. 非登录状态下,如果评论者留下了邮箱,Waline会自动获取邮箱账户的头像并设置为评论头像;
  3. 非登录状态下发表的评论只能由管理员删除;
  4. 每分钟只能发表一次评论。

碎碎念

我的Waline评论区用的是Vercel自动分配的网址。知道Vercel.app的域名墙内打不开,搜了一下相关文章貌似解决办法只能是套自定义域名,不愿意购买域名于是我暂且作罢= =
所以目前我的评论区大陆ip地址是无法参与评论的

此外文章点赞和访客数量功能,看到有很多大佬的博客分享了相关教程,但是本人数据敏感+嫌麻烦,也就不考虑做了

目前我的博客差不多就装好了!除了背景图和头像没有画完以外,估计三年内都不会愿意动它了= =
装修博客真的是一件费精力的事情,编程小白更是费力,我从10月1日开始用Stack主题,打这行字的时间是10月5日20:15,中间的时间基本都在折腾博客,一觉醒来就hugo服务器启动,git push完了就去睡觉……

希望我的经验能够帮到其他人省下一些时间和精力。

参考资料

Hugo官方文档
Stack官方文档
Waline-快速上手 ;

莱特雷-Hugo Stack主题自定义更改
树响集-Stack主题调整
第三夏尔-Hugo Stack博客主题装修
Naive Koala-Hugo Stack 魔改美化
B1ain’s Blog-hugo博客装修笔记
维基共享资源
失迹的博客-建站技术 | 使博客更好地接入 Waline
田八-使用CSS让图片透明渐变
Sarakale-waline 邮件通知模板样式一览

本博客已稳定运行
发表了7篇文章 · 总计25.93k字
使用 Hugo 构建
主题 StackJimmy 设计