Hexo的NexT主题更改页面样式

省流:把这亿点CSS代码复制粘贴到文件./source/_data/styles.styl里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/* custom styles */
:root {
--btn-default-bg: transparent;
--btn-default-color: var(--theme-color);
--btn-default-border-color: var(--theme-color);
--btn-default-hover-bg: var(--theme-color);
--btn-default-hover-border-color: var(--theme-color);
--link-hover-color: var(--theme-color);
}
/* theme widgets */
.sidebar-toc-active .sidebar-nav-toc,
.sidebar-overview-active .sidebar-nav-overview {
border-bottom-color: var(--theme-color);
color: var(--theme-color);
}
.post-toc .nav .active > a {
border-bottom-color: var(--theme-color);
color: var(--theme-color);
}
.post-toc .nav .active-current > a {
color: var(--theme-color);
}
/* borders */
.post-copyright ul {
border-left: 8px solid var(--theme-color);
}
.reading-progress-bar {
background: var(--theme-color);
}
/* selections */
::selection {
background: var(--theme-color);
}
.site-title::selection {
background: gold;
color: var(--theme-color);
}
.site-subtitle::selection {
background: gold;
color: var(--theme-color);
}
/* on hover */
.menu-item:hover .badge {
background: var(--link-hover-color);
}
.sidebar-nav li:hover {
color: var(--link-hover-color);
}
.sidebar-toc-active .sidebar-nav-toc:hover,
.sidebar-overview-active .sidebar-nav-overview:hover {
color: var(--link-hover-color);
}
.post-toc .nav .active-current > a:hover {
color: var(--link-hover-color);
}
.posts-expand .post-title-link:hover {
color: var(--link-hover-color);
}
.posts-expand .post-title-link::before {
background: var(--link-hover-color);
}
.posts-collapse .post-content .post-header:hover {
border-bottom-color: var(--link-hover-color);
}
.posts-collapse .post-content .post-header:hover::before {
background: var(--link-hover-color);
}
.posts-collapse .post-content .post-header:hover time {
color: var(--link-hover-color);
}
.posts-collapse .post-content .post-title:hover a {
color: var(--link-hover-color);
}
/* image size */
.post-body img {
margin-top: 0.75em;
margin-bottom: 1.75em;
width: 75%;
}
/* fix ( 1) */
.category-all-page .category-list-count:last-child::after {
content: ' ) '
}

上回说到

正如前面说的,我觉得NexT主题默认的页面配色不咋好看。如果你也有同感,可以照着这篇文章,用CSS自定义某些控件的颜色和样式。本文以.表示Hexo本地仓库的路径。

技术准备

假设准备搭建个人博客的读者已经学会可以做到

  • 用Shell在自己的电脑上执行命令;
  • 了解YAML的基本语法;
  • 大概看懂并“照葫芦画瓢”编写简单的HTMLCSS代码;
  • 阅读(或借助翻译阅读)简单的英文技术文档。

修改页面样式

  1. _config.next.yml文件里找到custom_file_path,取消注释下面#style: source/_data/styles.styl一行,即删除开头的#。这样可以在styles.styl里用CSS自定义控件样式。
  2. 在目录./sources/_data下新建文件styles.styl,然后仔细观察网页上的每个控件,有瞅着样式不好看的就改。本文以“阅读全文”按钮为例,演示如何覆盖main.css里原本的样式,并讲解一点简单的HTML和CSS。本文剩余内容如果不想看,可以直接跳过,复制上面“省流版”中的代码,粘贴到styles.styl文件,保存,然后重新生成静态文件并部署上线。
    1
    hexo g -d # g for generate, d for deploy
  3. 谢谢你给我面子接着往下看:)生成的文件在目录./public下,打开./public/css/main.css,可以看到定义了默认页面样式的CSS代码。CSS中以--开头的是变量,比如--theme-color,而在读取变量的值时用var(--theme-color)。如果按前面说的,在_config.next.yml里有如下设置,
    1
    2
    3
    4
    # Browser header panel color.
    theme_color:
    light: "#fc6423"
    dark: "#e34603"
    那么--theme-color的值在浅色模式下就是#fc6423,而在深色模式下是#e34603。也就是说,在生成的./public/css/main.css里会设置为
    1
    2
    3
    4
    5
    6
    7
    8
    :root {
    --theme-color: #fc6423;
    }
    @media (prefers-color-scheme: dark) {
    :root {
    --theme-color: #e34603;
    }
    }
  4. 如果像这里说的那样用了<!-- more -->,那在主页上会显示这样的“阅读全文”按钮。现在比方说想给原本是黑白色的按钮换一种样式。以换为本站这样为例,可以看到./public/css/main.css里面有这样的内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    :root {
    --btn-default-bg: #fff;
    --btn-default-color: #555;
    --btn-default-border-color: #555;
    --btn-default-hover-bg: #222;
    --btn-default-hover-color: #fff;
    --btn-default-hover-border-color: #222;
    }
    @media (prefers-color-scheme: dark) {
    :root {
    --btn-default-bg: #222;
    --btn-default-color: #ccc;
    --btn-default-border-color: #555;
    --btn-default-hover-bg: #666;
    --btn-default-hover-color: #ccc;
    --btn-default-hover-border-color: #666;
    }
    }
    每个变量的含义与名字相对应,其中btn和bg分别为button(按钮)和background(背景)的缩写。可以在./source/_data/styles.styl中覆盖默认的样式,让按钮的样式颜色和主题颜色风格一致:在styles.styl里写入
    1
    2
    3
    4
    5
    6
    7
    :root {
    --btn-default-bg: transparent;
    --btn-default-color: var(--theme-color);
    --btn-default-border-color: var(--theme-color);
    --btn-default-hover-bg: var(--theme-color);
    --btn-default-hover-border-color: var(--theme-color);
    }
  5. 其他部分的CSS代码我懒得一条一条解释了,基本上都是望文生义,想看的小伙伴可以自己看看改改试试,完了对比一下修改前后的样式。

HTML/CSS简介

这里以下图所示的“阅读全文”按钮为例,简单讲一点皮毛知识。

这个按钮对应的HTML代码是这样的:

1
2
3
<div class="post-button">
<a class="btn" href="/hexo-next-config/#more" rel="contents">阅读全文</a>
</div>

其中<div><a>称为标记(tag),classhrefrel称为属性(attribute)。class属性用来给HTML元素(element)指定类名,这样在CSS里就能自定义这个控件的样式风格。后面也会讲到,在JavaScript脚本里也可以利用元素的classid属性控制更复杂的行为。可以看到,在main.css里面有这样的CSS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.btn {
background: var(--btn-default-bg);
border: 2px solid var(--btn-default-border-color);
border-radius: 2px;
color: var(--btn-default-color);
display: inline-block;
font-size: 0.875em;
line-height: 2;
padding: 0 20px;
transition: background-color 0.2s ease-in-out;
}
.btn:hover {
background: var(--btn-default-hover-bg);
border-color: var(--btn-default-hover-border-color);
color: var(--btn-default-hover-color);
}

所以不需要修改这段默认的CSS,只要在styles.styl里修改这些--btn-default-*变量的值就行了。

  • .btn { ... }这样以.开头的CSS,是对应HTML属性class="btn"控件的样式;而.btn:hover { ... }则是对应HTML属性class="btn"的控件在鼠标悬停时的样式。
    1
    2
    3
    <div class="btn">
    <div>Some other elements</div>
    </div>
  • a { ... }这样不以.开头的CSS,则是对应HTML标记为<a>控件的样式。
    1
    <a href="https://example.iw17.cc" target="_blank">Example</a>

还有时会遇到这样的CSS代码

1
2
3
4
5
6
/* image size */
.post-body img {
margin-top: 0.75em;
margin-bottom: 1.75em;
width: 75%;
}
  • .post-body img { ... }这样在大括号前以空格分隔的,是在HTML属性class="post-body"的控件下,标记为<img>的一级或多级子控件的样式;
    1
    2
    3
    4
    5
    6
    <div class="post-body">
    <img src="/example.jpg" alt="Example text" /><!-- yes -->
    <div>
    <img src="/example1.jpg" alt="Example text" /><!-- yes -->
    </div>
    </div>
  • 而像.post-body > img { ... }这样以大于号分隔的,就只对一级子控件有效。
    1
    2
    3
    4
    5
    6
    <div class="post-body">
    <img src="/example.jpg" alt="Example text" /><!-- yes -->
    <div>
    <img src="/example1.jpg" alt="Example text" /><!-- no -->
    </div>
    </div>

词汇表

英文 中文
attribute 属性
background 背景
border 边界
button 按钮
class
collapse 收起
content 内容
default 默认
element 元素
expand 展开
hover 悬停
link 链接
menu 菜单
sidebar 侧边栏
site 站点
subtitle 副标题
tag 标记
theme 主题
title 标题
transparent 透明的