碎碎念
顶栏动效曾令我费尽心思,眼见鱼鱼和洪哥的导航栏动画如此流畅,随着页面的上下切换标题和菜单,我感到无比畅快。然而,我发现的教程中都未能实现如此平滑的过渡。因此,我使用所学知识,在他人基础上进行改进,最终达成了我心目中的效果。至于 Twikoo 的美化,一开始我觉得原版实在不够美观,于是决定自行修改。在修改过程中,我也参考了一些小伙伴的内容,你可以在下方的引用链接中查看。
教程
twikoo美化
下面是我进行 Twikoo 美化的所有 CSS 代码,你可以随意将其放入某个自定义 CSS 文件中以使用。
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
|
#twikoo .tk-comments .tk-submit .tk-avatar.tk-has-avatar { display: none; }
#twikoo .tk-comments .tk-submit .tk-row.actions{ margin-bottom: 0; margin-left: 0; }
.tk-main .tk-submit .tk-col .tk-meta-input, #twikoo .tk-comments .tk-submit .tk-col .tk-meta-input{ margin-bottom: 16px; }
.tk-row.actions button.el-button { height: 32px; }
.tk-main .tk-content img { max-width: 100%; height: auto; }
.tk-meta-input input { border-top-right-radius: 12px; border-bottom-right-radius: 12px; }
.tk-meta-input div { border-top-left-radius: 12px; border-bottom-left-radius: 12px; }
.tk-input.el-textarea textarea { border-radius: 12px; min-height: 150px !important; height: auto; }
@media screen and (max-width:420px) { .tk-main .tk-submit .tk-row.actions button.el-button.tk-preview.el-button--default.el-button--small{ display: none; } }
:root { --liushen-radius: 12px; --liushen-card-border-width: 1px; }
[data-theme=light] { --liushen-border-color: #e3e8f7; --liushen-card-bg: #fff; --liushen-card-border: #e3e8f7; --style-border-always: 1px solid var(--liushen-card-border); --liushen-blue: #425AEF; }
[data-theme=dark] { --liushen-border-color: #42444a; --liushen-card-bg: #2c2c2c; --liushen-card-border: #42444a; --style-border-always: 1px solid var(--liushen-card-border); --liushen-blue: #0084FF; }
.twikoo .tk-comments-container>.tk-comment, .twikoo .tk-comments .tk-submit { padding: 20px; margin-top: 0px; margin-bottom: 20px; border-radius: var(--liushen-radius); background: var(--liushen-card-bg); transition: .3s; }
[data-theme=light] .twikoo .tk-comments-container>.tk-comment, .twikoo .tk-comments .tk-submit { box-shadow: var(--card-box-shadow); }
[data-theme=light] .twikoo .tk-comments-container>.tk-comment:hover, .twikoo .tk-comments .tk-submit:hover { box-shadow: var(--card-hover-box-shadow); }
[data-theme=dark] .twikoo .tk-comments-container>.tk-comment, .twikoo .tk-comments .tk-submit { border-style: solid; border-width: var(--liushen-card-border-width); border-color: var(--liushen-card-border); }
.twikoo .tk-extra { border-radius: var(--liushen-radius); background: var(--liushen-card-bg); padding: 0.4rem; margin-bottom: 1rem; transition: .3s; }
[data-theme=light] .twikoo .tk-extra { box-shadow: var(--card-box-shadow); }
[data-theme=light] .twikoo .tk-extra:hover { box-shadow: var(--card-hover-box-shadow); }
[data-theme=dark] .twikoo .tk-extra { border-style: solid; border-width: var(--liushen-card-border-width); border-color: var(--liushen-card-border); }
.twikoo .tk-expand { border-radius: var(--liushen-radius); }
[data-theme=light] .twikoo .tk-expand { box-shadow: var(--card-box-shadow); }
[data-theme=light] .twikoo .tk-expand:hover { box-shadow: var(--card-hover-box-shadow); background-color: var(--btn-bg); }
[data-theme=dark] .twikoo .tk-expand:hover { background-color: var(--liushen-blue); }
[data-theme=dark] .twikoo .tk-expand { border-style: solid; border-width: var(--liushen-card-border-width); border-color: var(--liushen-card-border); }
@media screen and (max-width:570px) { .tk-main .tk-extras { display: none; } }
.tk-row.actions button.el-button { border-radius: 12px !important; }
|
上述备注已经相当详细,因此我就不再赘述。下面是改进前后的效果对比:
导航栏美化
导航栏美化相对复杂一些。首先,你可以看到我的导航栏下滑时会显示标题,因此我们需要将这部分内容添加进来。修改 [root]\themes\butterfly\layout\includes\header\nav.pug 文件中下方代码标出来的内容,去掉加号即为正常缩进。
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
| nav#nav span#blog-info a(href=url_for('/') title="回到主页") if theme.nav.logo img.site-icon(src=url_for(theme.nav.logo)) if theme.nav.display_title span.site-name=config.title #menus !=partial('includes/header/menu_item', {}, {cache: true}) + center(id="name-container") + a(id="page-name" href="javascript:btf.scrollToDest(0, 500)") PAGE_NAME
#nav-right #travellings a.site-page(href=url_for('https://www.travellings.cn/go.html') title="友链接力-随机开往") i.fa-solid.fa-bus.fa-fw #ten-years a.site-page(href=url_for('https://foreverblog.cn/go.html') title="友链接力-十年之约") i.fa-brands.fa-nfc-symbol.fa-fw #random a.site-page(href=url_for('javascript:randomPost()') title="随机前往一个文章") i.fa-solid.fa-shuffle.fa-fw if (theme.algolia_search.enable || theme.local_search.enable || theme.docsearch.enable) #search-button a.site-page.social-icon.search(href="javascript:void(0);" title="站内搜索") i.fa-brands.fa-algolia.fa-fw //#he-plugin-simple
#toggle-menu a.site-page(href="javascript:void(0);" title="展开菜单") i.fas.fa-bars.fa-fw
|
接着,添加自定义 JavaScript 脚本,内容如下:
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
| document.addEventListener('pjax:complete', tonav); document.addEventListener('DOMContentLoaded', tonav);
function tonav() { var nameContainer = document.querySelector("#nav #name-container"); var menusItems = document.querySelector("#nav .menus_items"); var position = $(window).scrollTop();
$(window).scroll(function() { var scroll = $(window).scrollTop();
if (scroll > position + 5) { nameContainer.classList.add("visible"); menusItems.classList.remove("visible"); } else if (scroll < position - 5){ nameContainer.classList.remove("visible"); menusItems.classList.add("visible"); }
position = scroll; });
document.getElementById("page-name").innerText = document.title.split(" | LiuShen's Blog")[0]; }
|
我简单解释一下,我最初使用的代码是:
1 2
| document.getElementById("name-container").setAttribute("style", ""); document.getElementsByClassName("menus_items")[1].setAttribute("style", "display:none!important");
|
但经过查询得知,CSS 中的 display 属性无法实现动态效果,因此无法实现我们想要的渐变效果。于是我做了一些改进,给需要显示的元素单独添加了一个标签 visible。随着页面向上或向下滚动,可以选择相应的元素。这样我们就可以通过 CSS 路径获取到该元素并随意添加内容了。
最后一步是将第一个步骤中添加的元素替换为页面标题。请注意修改下面的信息,如果你不想去除后缀,可以将 .split(“ | LiuShen’s Blog”)[0] 部分删除。
前置工作添加好了,下面我们就开始实现核心的美化部分,添加CSS
。
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
| #nav-right{ flex:1; justify-content: flex-end; margin-left: auto; display: flex; flex-wrap:nowrap; }
#nav.show { display: flex; justify-content: center; }
#nav .site-page { padding-bottom: 14px; } #page-header.not-top-img #nav { display: flex; justify-content: center; }
#nav-group { width: 1400px; display: flex; align-items: center; padding: 0 0.6rem; margin-left: auto; margin-right: auto; }
#nav .menus_items .menus_item .menus_item_child { margin-top: 14px; } #nav .menus_items .menus_item .menus_item_child li a { padding-top: 6px; padding-right: 18px; padding-bottom: 6px; padding-left: 15px; text-align: center; } #nav #travellings { padding: 0 14px 0 ; }
#nav #ten-years { padding: 0 14px 0 0; }
nav.show:not(.hide-menu) .menus_item_child li:not(#sidebar-menus li){ float: left; border-radius: 13px!important; -webkit-border-radius: 13px!important; -moz-border-radius: 13px!important; -ms-border-radius: 13px!important; -o-border-radius: 13px!important; } nav.show:not(.hide-menu) .menus_item_child:not(#sidebar-menus ul){
left:50%; translate:-50%; }
#nav .menus_items .menus_item .menus_item_child { padding: 7px 7px; border-radius: 20px; }
#nav #page-name { position: relative; padding: 10px 30px }
#nav #page-name::before { font-size: 18px; position: absolute; width: 100%; height: 100%; border-radius: 12px; color: #4C4948; top: 0; left: 0; content: '回到顶部'; background-color: #ffffff; transition: all .3s; -webkit-transition: all .3s; -moz-transition: all .3s; -ms-transition: all .3s; -o-transition: all .3s; opacity: 0; line-height: 45px; border: 1px solid #4C4948; }
[data-theme=dark] #nav #page-name::before { color: #B9BABB; background-color: #000000; border: 1px solid #B9BABB; }
#nav #page-name:hover:before { opacity: 1; }
#nav #name-container { transition: opacity 1.2s ease, transform 1.2s ease; opacity: 0; transform: translateY(-80px); z-index: 1; position: absolute; }
#nav .menus_items { transition: opacity 1.2s ease, transform 1.2s ease; opacity: 0; transform: translateY(-80px); z-index: 1; position: absolute; }
#nav #name-container.visible { opacity: 1; z-index: 2; transform: translateY(0); } #nav .menus_items.visible { opacity: 1; z-index: 2; transform: translateY(0); }
@media (max-width: 870px) { #nav #page-name { display:none; } }
|
修改完成后,你可能会发现在刷新页面时状态栏不显示,需要下滑或上滑才能重新显示。这是因为状态栏没有 visible 标签。打开 [root]\themes\butterfly\layout\includes\header,并修改 menu_item.pug 文件中的第二行内容,确保在生成页面时提前添加 visible 标签,以防止刷新后被隐藏。
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
| if theme.menu + .menus_items.visible - .menus_items each value, label in theme.menu if typeof value !== 'object' .menus_item - const valueArray = value.split('||') a.site-page(href=url_for(trim(valueArray[0]))) if valueArray[1] i.fa-fw(class=trim(valueArray[1])) span=' '+label else .menus_item - const labelArray = label.split('||') - const hideClass = labelArray[2] && trim(labelArray[2]) a.site-page.group(class=`${hideClass}` href='javascript:void(0);') if labelArray[1] i.fa-fw(class=trim(labelArray[1])) span=' '+ trim(labelArray[0]) i.fas.fa-chevron-down ul.menus_item_child each val,lab in value - const valArray = val.split('||') li a.site-page.child(href=url_for(trim(valArray[0]))) if valArray[1] i.fa-fw(class=trim(valArray[1])) span=' '+ lab
|
上述代码中,我将隐藏的内容放到了页面的上方,即网站页面之外。这样做是因为我不太熟悉点击穿透的技巧,如果你了解的话,可以教我一下。如果将内容放到页面上方,就不会有这些问题了,因为鼠标根本无法点击到那里。
twikoo表情包
我经常浏览各个博客,发现大多数都使用默认的表情包。偶尔有一些站点会使用多种表情包,但在描述文字方面却经常很凌乱,有的描述文字甚至是一串字符串。对于我来说,表情包的整齐排列非常重要,因为我有点强迫症。我希望描述文字、文件名称和表情包类别名称都能整整齐齐,这样既方便我自己,也方便读者。因此,我稍微整理了一下,将所有表情包都放到了github仓库中,并分享出来,希望能对大家有所帮助。
描述文字是指选中表情包后在评论区显示的文字。为了方便起见,我将所有的描述文字都改成了“表情包名称 + 表情包内容”的格式。经过整理,我选用了 blobcat
、HeyBox
、Heo
、LineDog
、emoji
以及 B 站小电视
等表情包。我将这些表情包整理到了 GitHub 仓库中,你可以自行取用。
其中:
blobcat
来自杜老师的博客HeyBox
自己寻找Heo
来自洪哥的博客LineDog
来自白夜的博客
所有表情包整理的github仓库链接如下,大家可以自行取用:
可以直接调用文件:
1
| https://fastly.jsdelivr.net/gh/willow-god/owo/owo.json
|
该文件仅支持 Twikoo,如果是其他评论系统,请自行修改格式。由于某些原因,JSD 在国内访问速度并不理想,请自行切换其他源或直接复制文件内容到本地使用。下面是国内加速版的表情包文件,图像尽可能使用访问更快速的链接替代,请自行保存文件到本地后即可直接使用:
1
| https://fastly.jsdelivr.net/gh/willow-god/owo/owo-fast.json
|
至此,本篇文章告一段落!篇幅较短,希望能够帮助你们改进自己喜欢的格式!
参考教程
每日一图
— 柳影曳曳,清酒孤灯,扬笔撒墨,心境如霜