<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Fomalhaut🥝</title>
  
  
  <link href="https://www.fomal.cc/atom.xml" rel="self"/>
  
  <link href="https://www.fomal.cc/"/>
  <updated>2026-10-03T23:40:00.000Z</updated>
  <id>https://www.fomal.cc/</id>
  
  <author>
    <name>Fomalhaut🥝</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>通过DeepSeek Harness修复和优化网站</title>
    <link href="https://www.fomal.cc/posts/d5a4e2f1.html"/>
    <id>https://www.fomal.cc/posts/d5a4e2f1.html</id>
    <published>2026-09-30T21:00:00.000Z</published>
    <updated>2026-10-03T23:40:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>写在前面（这次和以往不太一样）</b></font></p><ol><li>这篇不是搭建教程，是一次<strong>老站的体检和维修记录</strong>。如果你的博客也闷头跑了三四年没管过，大概率能对号入座。</li><li>全文操作都在博客根目录下进行，下文统一用 <code>[BlogRoot]</code> 指代，牵涉到改源码的地方我都写到了<strong>文件和行号</strong>。</li><li>这次全程是 <a href="https://github.com/deepseek-ai/deepseek-harness">DeepSeek Harness</a> 陪我做的：我出需求、做判断、拍板要不要动；它去翻文件、探测 CDN 存活、读源码、改代码、跑构建验证。所以这篇也可以当成一份「AI 到底能帮上多少忙」的实录 —— 结论是先卖个关子，看到最后。</li></ol><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li><li><a href="/posts/d5a4e2f1.html">🍬通过DeepSeek Harness修复和优化网站</a> ⇦当前位置🪂</li></ol></div><h2 id="一、起因：红字不是那天才有的">一、起因：红字不是那天才有的</h2><p>先把一个容易被误会的说法纠正掉：<strong>这不是「某天随手按了下 F12，才发现控制台红了一片」的故事。</strong></p><p>这些报错我早就知道。</p><p>三四年跑下来，站里依赖的那些外部资源是<strong>一件一件慢慢死掉</strong>的。它们很守规矩，从来不一起罢工：某段时间是某个 CDN 开始抽风，过一阵换成某个图床连不上，再往后是某个公共接口悄悄停了服。死一个，页面上就少一样东西 —— 某个图标不显示、某张图变成裂图、某个小模块空着。文章照样能读，页面照样能开。</p><p>我也不是没看见。F12 按过很多次，每次都想「下次一起修」，然后下次又变成了下次。<strong>坏掉的东西只要不影响你看文章，就永远排在待办清单的最后一条。</strong></p><p>真正让我下决心的是发现死掉的东西已经从边角蔓延到了骨架。那天我本来只是想看看某个 CSS 改动的效果，随手按了下 F12，看到的就是这些：</p><!-- 📷 配图建议：localhost:4000 的 F12 控制台截图，红字一片 --><p>一眼扫过去，大概三类毛病：</p><ul><li><strong>51la 的统计脚本</strong>：<code>blocked by CORS policy</code>，接着是 <code>403</code></li><li><strong>TianliCDN</strong>：<code>net::ERR_CONNECTION_CLOSED</code> 连着三条</li><li><strong>字节跳动静态资源库</strong>：直接 <code>404</code></li></ul><p>底下还有几条 JS 报错更扎眼：</p><figure class="highlight xquery"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Uncaught ReferenceError: $ <span class="literal">is</span><span class="built_in"> not</span> defined</span><br><span class="line">    <span class="keyword">at</span> fomal.js:<span class="number">72</span>:<span class="number">1</span></span><br><span class="line"></span><br><span class="line">Uncaught ReferenceError: LazyLoad <span class="literal">is</span><span class="built_in"> not</span> defined</span><br><span class="line">    <span class="keyword">at</span> lazyLoadImg (main.js:<span class="number">717</span>:<span class="number">35</span>)</span><br></pre></td></tr></table></figure><p>说白了就是：<strong>该加载的没加载，加载了的又用不上。</strong></p><p>一边是「还能用」，一边是「再拖下去就是给未来的自己挖坑」—— 这些红字存不存在，取决于你今天开不开 F12，但损失是实实在在的：样式丢一半、脚本半死不活、统计全废、某个模块永远空着。</p><p>所以那天我没有像往常一样把 F12 关掉了事，而是想：<strong>要不，一次修完？</strong></p><p>刚好那阵子我在重度使用 DeepSeek Harness，于是顺手把这事丢给了它 —— 我描述症状，它去翻文件。</p><h2 id="二、第一轮：先把「哪些东西真的死了」搞清楚">二、第一轮：先把「哪些东西真的死了」搞清楚</h2><p>修之前得先知道坏了多少。</p><p>这里有个坑值得单独说：<strong>光看浏览器报错是不够的</strong>。浏览器只会告诉你「我这次没拿到」，但不会告诉你「这东西是不是早就没人维护了」。有些 CDN 你本地挂了是因为你自己的网络，有些是真死了。</p><p>所以第一件事是<strong>挨个探测</strong>：把首页要加载的第三方资源全列出来，逐个发请求，看状态码、看响应字节、看首字节时间。</p><p>结果比我想的惨：</p><table><thead><tr><th>资源</th><th>症状</th><th>结论</th></tr></thead><tbody><tr><td><code>cdn1.tianli0.top</code></td><td><code>ERR_CONNECTION_CLOSED</code> × 3</td><td>域名已停服</td></tr><tr><td><code>cdn.staticfile.org</code></td><td>能访问，但解析到 202.181.25.22</td><td><strong>香港节点</strong>，大陆访问绕路</td></tr><tr><td><code>cdn.jsdelivr.net</code></td><td>104.17.207.5，TTFB 520ms ~ 1.8s</td><td>Cloudflare，时快时慢</td></tr><tr><td><code>cdnjs.cloudflare.com</code></td><td>MathJax 从这加载</td><td>国内基本不通</td></tr><tr><td><code>sdk.51.la</code></td><td>403 + 本地 CORS</td><td>接口变了</td></tr><tr><td><code>lf3-cdn-tos.bytecdntp.com</code></td><td>404</td><td>已下线</td></tr></tbody></table><p>看到第三行的时候我愣了一下 —— <strong>staticfile 我一直以为是国内的</strong>。查了下 IP 归属才发现是香港，难怪有时候打开慢，原来一直在绕。</p><p>第一轮的原则定得很简单：</p><ol><li><strong>能换公共库的都换成公共库</strong>，优先国内源；</li><li><strong>尽量收敛到同几个域名</strong>，这样浏览器能复用连接，还能提前 <code>preconnect</code>；</li><li><strong>实在找不到源的就本地化</strong>，塞进 <code>source/js/</code> 里自托管。</li></ol><p>这一轮一共动了 14 处，分布在：</p><ul><li><code>[BlogRoot]/_config.butterfly.yml</code> —— element-ui、jQuery、Vue、clipboard、sweetalert2、vanilla-lazyload、instant.page、typed.js、FontAwesome、APlayer、Meting 等</li><li><code>[BlogRoot]/source/social/fcircle/index.md</code> —— 友链朋友圈用的两个 JS-Heo 脚本</li><li><code>[BlogRoot]/source/_data/link.yml</code> —— 友链里的两张图</li></ul><p>其中 <code>winbox</code> 这个库比较特殊，全网的国内镜像都没收它，最后只能把 15KB 的文件下载下来放进 <code>source/js/winbox.bundle.min.js</code> 自己托管。</p><div class="note warning no-icon flat"><p>改配置之前<strong>先备份</strong>。我这次是复制了一份到 <code>[BlogRoot]/bak/20260930-cdn-fix/</code>，后面的所有改动也都各自留了 <code>.before</code> 备份。魔改这种事，没有备份就是在赌运气。</p></div><h2 id="三、换源路上踩的几个坑">三、换源路上踩的几个坑</h2><p>这段单拎出来说，因为<strong>国内镜像站的路子和 jsDelivr 不一样</strong>，直接照搬 URL 大概率是 404。</p><h3 id="3-1-npmmirror-不是每个包都有-min">3.1 npmmirror 不是每个包都有 <code>.min</code></h3><p><code>registry.npmmirror.com</code> 的路径规则是 <code>/包名/版本/files/包内相对路径</code>。听起来很直观，但：</p><ul><li><code>algoliasearch@4.14.3</code> <strong>没有 <code>.min</code> 版本</strong>，只有 <code>files/dist/algoliasearch-lite.umd.js</code></li><li><code>@fancyapps/ui@4.0.31</code> 同理，只有 <code>files/dist/fancybox.umd.js</code> 和 <code>files/dist/fancybox.css</code></li><li><code>typed.js@2.0.12</code> 的主文件在 <code>files/lib/typed.min.js</code>，<strong>不在 <code>dist/</code> 下</strong></li></ul><p>硬套 <code>.min</code> 后缀的结果是返回一段 JSON：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;error&quot;</span><span class="punctuation">:</span> <span class="string">&quot;[NOT_FOUND] File algoliasearch@4.14.3/dist/algoliasearch-lite.umd.min.js&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="3-2-lib-baomitu-的「假-200」">3.2 lib.baomitu 的「假 200」</h3><p>这个更阴。360 的 <code>lib.baomitu.com</code> 遇到不存在的路径，<strong>返回的是 HTTP 200</strong>，正文只有 14 个字节：</p><figure class="highlight ldif"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">404</span>: Not Found</span><br></pre></td></tr></table></figure><p>也就是说，如果你只看状态码，会以为一切正常。</p><p>所以判断一个源到底可不可用，<strong>必须同时看状态码、字节数和内容</strong>，三个都对上才算数。这一条我后来在探测 leaflet 的时候又用上了。</p><h3 id="3-3-同一个库，镜像之间路径不一样">3.3 同一个库，镜像之间路径不一样</h3><p>MathJax 3.2.2 在两个源上的文件形态就差很多：</p><table><thead><tr><th>源</th><th>路径</th><th>大小</th><th>首字节</th></tr></thead><tbody><tr><td>npmmirror</td><td><code>/mathjax/3.2.2/files/es5/tex-mml-chtml.js</code></td><td>1146 KB（未压缩）</td><td>352 ms</td></tr><tr><td>360 baomitu</td><td><code>/mathjax/3.2.2/es5/tex-mml-chtml.min.js</code></td><td>1114 KB</td><td>281 ms</td></tr></tbody></table><p>只差 40KB，最后我选了 npmmirror。原因不是它更快，而是<strong>想统一域名</strong> —— 站上已经有一堆资源在 npmmirror 了，<code>preconnect</code> 建一次连接就能全用上，省掉一次 DNS + TLS。这种账要算总账，不能单看一个文件。</p><h2 id="四、「这些源都是国内的么？」——然后有了第二份体检报告">四、「这些源都是国内的么？」——然后有了第二份体检报告</h2><p>第一轮换完，我盯着配置文件看了半天，突然想到一个问题：<strong>我换的这些都是国内的么？国内访问到底快多少？</strong></p><p>这问题问得挺好，因为它逼出了一份真正有价值的报告。</p><p>做法是把首页要加载的第三方资源全抓出来，统计三件事：<strong>域名解析到哪、首字节多少、总共多大</strong>。</p><p>部分结果：</p><table><thead><tr><th>域名</th><th>IP 归属</th><th>实测 TTFB</th></tr></thead><tbody><tr><td><a href="http://registry.npmmirror.com">registry.npmmirror.com</a></td><td>1.194.31.54（河南）</td><td>37 ~ 105 ms</td></tr><tr><td><a href="http://npm.elemecdn.com">npm.elemecdn.com</a></td><td>183.61.231.x（广东）</td><td>40 ~ 105 ms</td></tr><tr><td><a href="http://cdn.jsdmirror.com">cdn.jsdmirror.com</a></td><td>113.240.66.249 等</td><td>43 ms</td></tr><tr><td><a href="http://lib.baomitu.com">lib.baomitu.com</a></td><td>240e 段（中国电信 IPv6）</td><td>48 ms</td></tr><tr><td><a href="http://sdk.51.la">sdk.51.la</a></td><td>27.159.90.74 等</td><td>122 ms</td></tr><tr><td><a href="http://cdn.staticfile.org">cdn.staticfile.org</a></td><td><strong>202.181.25.22（香港）</strong></td><td>203 ~ 356 ms</td></tr><tr><td><a href="http://cdn.jsdelivr.net">cdn.jsdelivr.net</a></td><td>104.17.207.5（Cloudflare）</td><td>520 ms ~ 1.8 s</td></tr></tbody></table><p>换源的效果是实打实的：<code>typed.js</code> 从 391ms 掉到 40ms。</p><p>但报告里最扎心的是最后一行：</p><table><thead><tr><th>资源</th><th>TTFB</th><th>总耗时</th></tr></thead><tbody><tr><td><a href="http://www.fomal.cc">www.fomal.cc</a> 首页（208 KB）</td><td>693 ms</td><td>911 ms</td></tr><tr><td><a href="http://source.fomal.cc">source.fomal.cc</a> 一张 35 KB 的图</td><td>1041 ms</td><td>—</td></tr></tbody></table><p><strong>我自己站点的 TTFB，比所有第三方 CDN 都慢。</strong> 换源能省的也就几百毫秒，真正的天花板在部署侧。这个后面单独开一篇再聊，Vercel 的国内访问优化又是另一个坑了。</p><p>也正是这份报告，让我发现了真正的&quot;体积刺客&quot;。</p><h2 id="五、重头戏：905KB-的-Vue-Element-UI，只为了弹几个提示框">五、重头戏：905KB 的 Vue + Element-UI，只为了弹几个提示框</h2><p>报告里有一行数据特别刺眼：</p><figure class="highlight erlang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">首屏第三方资源 <span class="number">33</span> 个 URL，共 <span class="number">2.72</span> MB</span><br><span class="line">  npmmirror   <span class="number">1.25</span> MB</span><br><span class="line">  staticfile  <span class="number">1.01</span> MB   ← 走香港的</span><br><span class="line">  google      <span class="number">0.20</span> MB</span><br><span class="line">  elemecdn    <span class="number">0.16</span> MB</span><br><span class="line">  ...</span><br></pre></td></tr></table></figure><p>拆开 staticfile 那 1.01MB，是三个东西：</p><table><thead><tr><th>文件</th><th>大小</th></tr></thead><tbody><tr><td>element-ui JS（<code>index.js</code>）</td><td>577 KB</td></tr><tr><td>element-ui CSS（<code>index.css</code>）</td><td>236 KB</td></tr><tr><td>Vue 2.6.14</td><td>92 KB</td></tr></tbody></table><p><strong>加起来 905 KB。</strong></p><p>而我的站点用 Vue 干了什么呢？我把 <code>fomal.js</code> 从头到尾看了一遍，所有 Vue 用法长这样：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">  <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&quot;复制成功🍬&quot;</span>,</span><br><span class="line">      <span class="attr">message</span>: <span class="string">&quot;内容已复制到剪贴板&quot;</span>,</span><br><span class="line">      <span class="attr">position</span>: <span class="string">&quot;top-left&quot;</span>,</span><br><span class="line">      <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">      <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">      <span class="attr">duration</span>: <span class="number">3000</span>,</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p><strong>全文只有 14 处这样的代码，全是右下角/左上角冒出来的那个小提示框。</strong> 参数形态一模一样，没有 <code>v-if</code>、没有 <code>v-for</code>、没有模板、没有路由、没有一个组件。</p><p>905 KB 换来 14 个 Toast。</p><p>当时我的表情大概是：？？？</p><h3 id="那为什么一直没删">那为什么一直没删</h3><p>因为当年抄过来的时候，教程都这么写。Element-UI 的 Notification 确实好用，一句 <code>this.$notify()</code> 就弹出来了，谁管它多大呢。</p><p>而且删起来有心理障碍：站点里到处是 <code>.el-</code> 开头的 class，看着就像&quot;离不开它&quot;。</p><p>结果一查：</p><ul><li><code>themes/butterfly/</code> 的 layout 里，<strong>没有一处 <code>el-</code> class</strong></li><li><code>source/js/</code> 里也没有</li><li><code>custom.css</code> 里的 <code>.el-*</code> 规则，<strong>几乎全部包在 <code>#twikoo</code> / <code>.twikoo</code> 作用域内</strong></li></ul><p>而 Twikoo 1.6.17 的发行版<strong>自带一副 Element-UI 样式</strong>（我去包里翻过，<code>.el-textarea__inner</code>、<code>.el-button--primary</code>、<code>.el-input__inner</code>、<code>el-loading-spinner</code> 全都在）。</p><p>也就是说：评论框的样式是 Twikoo 自己带的，跟全局那份 Element-UI 一点关系都没有。</p><p>那就删。</p><h3 id="手写一个-7KB-的通知组件">手写一个 7KB 的通知组件</h3><p>弹窗不能不管，所以抄一份最小的实现出来。新文件 <code>[BlogRoot]/source/js/notify.js</code>，<strong>7150 字节</strong>，零依赖原生 JS：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">fomalNotify</span>(&#123;</span><br><span class="line">  <span class="attr">title</span>: <span class="string">&quot;复制成功🍬&quot;</span>,</span><br><span class="line">  <span class="attr">message</span>: <span class="string">&quot;内容已复制到剪贴板&quot;</span>,</span><br><span class="line">  <span class="attr">position</span>: <span class="string">&quot;top-left&quot;</span>,</span><br><span class="line">  <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">  <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">  <span class="attr">duration</span>: <span class="number">3000</span>,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>内部做了这些事：</p><ul><li>四种类型 <code>success / warning / info / error</code>，图标是内联 SVG，配色沿用 Element-UI 那套（<code>#67c23a</code> / <code>#e6a23c</code> / <code>#f56c6c</code> / <code>#909399</code>）</li><li>六种位置，按 <code>位置 + offset</code> 缓存容器，同一个位置的通知自动堆叠</li><li>进出场动画用 <code>requestAnimationFrame</code> 加 <code>.is-enter</code> 类控制，关闭时加 <code>.is-leave</code> 后 320ms 移除节点</li><li>鼠标悬停暂停计时，移开继续</li><li>容器 <code>isConnected</code> 检查，兼容 pjax 局部刷新</li></ul><p>然后把 <code>fomal.js</code> 里那 14 处整个换掉：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">- new Vue(&#123;</span></span><br><span class="line"><span class="deletion">-   data: function () &#123;</span></span><br><span class="line"><span class="deletion">-     this.$notify(&#123; title: &quot;复制成功🍬&quot;, message: &quot;...&quot;, type: &quot;success&quot; &#125;)</span></span><br><span class="line"><span class="deletion">-   &#125;</span></span><br><span class="line"><span class="deletion">- &#125;)</span></span><br><span class="line"><span class="addition">+ fomalNotify(&#123; title: &quot;复制成功🍬&quot;, message: &quot;...&quot;, type: &quot;success&quot; &#125;)</span></span><br></pre></td></tr></table></figure><p>再回到 <code>_config.butterfly.yml</code>，把三行注释掉：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">- &lt;link rel=&quot;stylesheet&quot; href=&quot;https://.../element-ui@2.15.6/lib/theme-chalk/index.css&quot;&gt;</span></span><br><span class="line"><span class="deletion">- &lt;script src=&quot;https://.../vue@2.6.14/dist/vue.min.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="deletion">- &lt;script src=&quot;https://.../element-ui@2.15.6/lib/index.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><p><strong>905 KB → 7 KB。</strong></p><p>顺带说一个细节：Element-UI 的 CSS 原来挂在 <code>inject.head</code> 里，是<strong>同步阻塞渲染</strong>的 —— 也就是说那 236KB 没下完，页面就是白屏。现在也没了。</p><h2 id="六、MathJax-背了三年的锅">六、MathJax 背了三年的锅</h2><p>我写算法题解那阵子一直纳闷：有几篇带公式的文章，公式就是显示不出来，全是红字或者原始 LaTeX。</p><p>当时以为是 Markdown 语法写错了，改了又改，没用。</p><p>这次顺手查了一下，真相挺无语的。</p><p><code>_config.butterfly.yml</code> 里有这么一段：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">mathjax:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">cdn:</span> <span class="string">https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js</span></span><br></pre></td></tr></table></figure><p>看起来没毛病对吧？问题是 —— <strong>主题压根不读这个字段。</strong></p><p>Butterfly 4.3.1 实际的取值路径是：</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">theme.asset.mathjax  ←  themes<span class="regexp">/butterfly/</span>scripts<span class="regexp">/events/</span>cdn.js 生成</span><br><span class="line">       ↑</span><br><span class="line">themes<span class="regexp">/butterfly/</span>plugins.yml 里 mathjax 项</span><br><span class="line">       ↑</span><br><span class="line">默认 provider = cdnjs</span><br></pre></td></tr></table></figure><p>所以最终产物里写的是 <code>https://cdnjs.cloudflare.com/ajax/libs/mathjax/...</code>，而 <code>cdnjs.cloudflare.com</code> 国内基本不通。</p><p><strong>182 个页面里有 35 个加载了 MathJax，35 个全挂。</strong></p><p>修法反而简单，让配置文件里的字段真正生效就行：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="addition">+ mathjax: https://registry.npmmirror.com/mathjax/3.2.2/files/es5/tex-mml-chtml.js</span></span><br></pre></td></tr></table></figure><p>写进 <code>_config.butterfly.yml</code> 的 <code>CDN.option</code> 段之后，构建产物里 35 个页面全部指向 npmmirror。</p><p>这个坑我记得最清楚 —— <strong>因为它不是&quot;坏了&quot;，而是&quot;你以为它开着，其实从来就没开过&quot;。</strong> 这类问题最难发现，因为没有任何报错，只是东西不出现。</p><h2 id="七、意外收获：hexo-tag-map-把路径写死在了-node-modules-里">七、意外收获：hexo-tag-map 把路径写死在了 node_modules 里</h2><p>修完上面这些，我以为完事了。结果在扫&quot;还有没有漏网的境外域名&quot;时，又揪出来一个。</p><p>地图标签用的是 <code>hexo-tag-map</code> 插件，它加载 leaflet 的方式是写死的：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// node_modules/hexo-tag-map/index.js 第 14-18 行</span></span><br><span class="line"><span class="keyword">const</span> css_text = <span class="string">`&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-map/lib/leaflet@1.7.1.css&quot;&gt;`</span>;</span><br><span class="line"><span class="keyword">const</span> js_text = <span class="string">`&lt;script data-pjax src=&quot;https://cdn.jsdelivr.net/npm/hexo-tag-map/lib/leaflet@1.7.1.js&quot;&gt;&lt;/script&gt;`</span>;</span><br><span class="line"><span class="comment">// 还有 ChineseTmsProviders、proj4、proj4leaflet</span></span><br></pre></td></tr></table></figure><p>五个文件全指向 <code>cdn.jsdelivr.net</code>，也就是 Cloudflare。</p><p>改 <code>node_modules</code> 是最直接的办法，但<strong>下次 <code>npm i</code> 就没了</strong>，这种改法属于给自己埋雷。</p><p>我试了下国内镜像，都不太顺：</p><ul><li>npmmirror 对 <code>hexo-tag-map</code> 直接返回 <strong>403</strong>（这个包被屏蔽了）</li><li><code>cdn.jsdmirror.com</code> 三个文件都能拿到，但首字节 839 ~ 1142ms，比 jsDelivr 还慢</li><li><code>lib.baomitu.com</code> <strong>只有 leaflet 本体</strong>，中文地图源和 proj4 都没有</li></ul><p>那就自托管吧 —— <strong>还能比自托管更快的东西不存在，除非你不加载。</strong></p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">source/js/tag-map/</span><br><span class="line">├── leaflet-<span class="number">1.7</span>.<span class="number">1</span><span class="selector-class">.css</span>                    (<span class="number">13</span>,<span class="number">920</span> B)</span><br><span class="line">├── leaflet-<span class="number">1.7</span>.<span class="number">1</span><span class="selector-class">.js</span>                     (<span class="number">141</span>,<span class="number">941</span> B)</span><br><span class="line">├── leaflet<span class="selector-class">.ChineseTmsProviders-1</span>.<span class="number">0.4</span><span class="selector-class">.js</span> (<span class="number">4</span>,<span class="number">330</span> B)</span><br><span class="line">├── proj4-<span class="number">2.4</span>.<span class="number">3</span><span class="selector-class">.js</span>                       (<span class="number">71</span>,<span class="number">123</span> B)</span><br><span class="line">└── proj4leaflet-<span class="number">1.0</span>.<span class="number">1</span><span class="selector-class">.min</span><span class="selector-class">.js</span>            (<span class="number">4</span>,<span class="number">051</span> B)</span><br></pre></td></tr></table></figure><p>文件是从 <code>node_modules/hexo-tag-map/lib/</code> 原样复制的，只把文件名里的 <code>@</code> 换成了 <code>-</code>（<code>@</code> 在 URL 里要转义，麻烦）。</p><p>然后写了个 Hexo 插件放 <code>[BlogRoot]/scripts/tag-map-local.js</code>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="variable constant_">CDN_PREFIX</span> = <span class="string">&quot;https://cdn.jsdelivr.net/npm/hexo-tag-map/lib/&quot;</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">LOCAL_PREFIX</span> = <span class="string">&quot;/js/tag-map/&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">FILE_MAP</span> = &#123;</span><br><span class="line">  <span class="string">&quot;leaflet@1.7.1.css&quot;</span>: <span class="string">&quot;leaflet-1.7.1.css&quot;</span>,</span><br><span class="line">  <span class="string">&quot;leaflet@1.7.1.js&quot;</span>: <span class="string">&quot;leaflet-1.7.1.js&quot;</span>,</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&quot;after_render:html&quot;</span>, <span class="keyword">function</span> (<span class="params">html</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (html.<span class="title function_">indexOf</span>(<span class="variable constant_">CDN_PREFIX</span>) === -<span class="number">1</span>) <span class="keyword">return</span> html;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> src <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">keys</span>(<span class="variable constant_">FILE_MAP</span>)) &#123;</span><br><span class="line">    html = html.<span class="title function_">split</span>(<span class="variable constant_">CDN_PREFIX</span> + src).<span class="title function_">join</span>(<span class="variable constant_">LOCAL_PREFIX</span> + <span class="variable constant_">FILE_MAP</span>[src]);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> html;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>选 <code>after_render:html</code> 而不是改依赖包，是因为 <code>scripts/</code> 目录会跟着仓库走，重装依赖也不会丢。</p><p>配套还要在 <code>_config.yml</code> 里加一行，让这五个库文件原样复制、别被 Nunjucks 渲染：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"> skip_render:</span><br><span class="line"><span class="addition">+  - &#x27;js/tag-map/*&#x27;   # leaflet / proj4 第三方库原文件，原样复制，不做 Nunjucks 渲染</span></span><br></pre></td></tr></table></figure><div class="note info no-icon flat"><p>这里有个小插曲：<code>_config.yml</code> 这个文件是 <strong>CRLF 换行</strong>的，第一次我用 <code>\n</code> 做字符串匹配死活不中，换成 <code>\r\n</code> 才成功。跨平台改配置文件的时候，换行符真的要留心。</p></div><p>至此，<strong>全站产物里 <code>cdn.jsdelivr.net</code> 的引用归零。</strong></p><h2 id="八、以为收工了：背景图没了">八、以为收工了：背景图没了</h2><p>改完上面那一批，我以为可以收工了。刷新页面 —— <strong>banner 一片黑，背景图没了。</strong></p><h3 id="8-1-先抓到的不是背景，是-Service-Worker">8.1 先抓到的不是背景，是 Service Worker</h3><p>控制台里最扎眼的是这几条：</p><p>`@<br>Uncaught (in promise) TypeError: Failed to convert value to ‘Response’. sw.js:1</p><p>Fetch error: <a href="http://localhost:4000/css/index.css">http://localhost:4000/css/index.css</a><br>TypeError: Failed to convert value to ‘Response’.<br>at handle (sw.js:197:16)<br>at sw.js:15:27<br>`@</p><p><code>Failed to convert value to 'Response'</code> 是个很好认的症状：<code>respondWith()</code> 收到了一个 <code>undefined</code>。</p><p>问题出在 <code>themes/butterfly/source/sw.js</code>（现已改名为 <code>themes/fomalhaut/</code>） —— 这是早年从别处抄来的一个「CDN 分流器」，作用是把静态资源转到对象存储去取。要命的是这一段：</p><p><code>@js return fetch(req).catch(error =&gt; &#123;   console.error('Fetch error:', req.url, error); &#125;); </code>@</p><p><code>catch</code> 回调里<strong>少了一个 <code>return</code></strong>。请求成功时看不出来，一旦失败这个函数就返回 <code>undefined</code>，紧接着 <code>event.respondWith(undefined)</code> 直接抛错，这个请求当场作废。</p><p>更糟的是它<strong>给所有同源请求都套了 <code>respondWith</code></strong>（文件里甚至注册了两个 <code>fetch</code> 监听器，第二个是半成品，里面用了一个从未定义过的变量）。也就是说：那一跳只要失败，CSS、图片、脚本就可能整片加载不出来。</p><p>「背景图没了」其实只是它的连带伤害之一。</p><p>修法没什么玄学：</p><ul><li>只拦截目标域名（<code>www.fomal.cc</code>）的 GET 请求，其余请求<strong>直接 <code>return</code>，根本不调用 <code>respondWith</code></strong>；</li><li>分流失败先回退 <code>return await fetch(req)</code>，再失败才返回 504 兜底；</li><li>本地开发环境（<code>localhost</code> / <code>127.0.0.1</code>）<strong>自动注销</strong> Service Worker，免得调试时一直被缓存的版本阴。</li></ul><div class="note warning no-icon flat"><p><strong>Service Worker 真正的坑在于它是「隐形」的</strong>：注册过一次就会一直活着。哪怕你把源码删了、把注册代码去掉了，老访客的浏览器里那个旧版本还在拦截请求 —— 你改了文件，他看到的还是老逻辑。</p><p>所以改完 <code>sw.js</code> 之后，记得去 <code>Application → Service Workers</code> 里确认新版本已经接管，必要时手动 <code>unregister</code> 再清一下 <code>Cache Storage</code>。</p></div><h3 id="8-2-背景图本来就是个「依赖-JS-才存在」的东西">8.2 背景图本来就是个「依赖 JS 才存在」的东西</h3><p>Service Worker 修好之后再刷新 —— 还是黑的。于是顺着渲染链路一路往下查，最后定位到一行 CSS：</p><p><code>@css #web_bg &#123;   background: var(--default-bg); &#125; </code>@</p><p><code>--default-bg</code> 这四个变量（还有 darkmode / mobileday / mobilenight 三个）在<strong>整个构建产物里只有使用、没有任何一处定义</strong>。唯一定义它们的地方，是 <code>fomal.js</code> 在运行时往这个标签里写内容：</p><p>`@html</p><style id="defineBg"></style><p>`@</p><p>而它在配置文件里就是<strong>一个空标签</strong>。</p><p>也就是说：<strong>背景图从来不是「CSS 里的图」，而是「JS 运行时塞进去的图」</strong>。JS 一旦没跑到那一步，背景必然空白 —— 这个设计平时看不出来，出事的时候就是黑屏，而且你怎么刷新都没用。</p><p>所以第一步是把默认值直接内联进去，让「JS 全挂」和「背景还在」这两件事脱钩：</p><p>`@html</p><style id="defineBg">  :root{    --default-bg:url(https://sourcebucket.s3.bitiful.net/img/home_bg.webp);    --darkmode-bg:url(https://sourcebucket.s3.bitiful.net/img/dark_mode.webp);    --mobileday-bg:url(https://sourcebucket.s3.bitiful.net/img/snow.webp);    --mobilenight-bg:url(https://sourcebucket.s3.bitiful.net/img/mb8.webp);  }</style><p>`@</p><p>这四张图我挨个测了，全部 200，最慢的一张 278ms。<strong>图一直好好地在服务器上躺着，是我们自己没去取。</strong></p><h3 id="8-3-真正的元凶：7-个随机壁纸-API-死了-5-个">8.3 真正的元凶：7 个随机壁纸 API 死了 5 个</h3><p>那 JS 为什么写不出有效的背景？因为美化模块允许自定义背景，地址存在 <code>localStorage.blogbg</code> 里。顺着这个值往下查，挖出两个坑。</p><p><strong>坑一：一个拼错的单词。</strong></p><p>「恢复默认背景」按钮的代码是这样的：</p><p><code>@js function resetBg() &#123;   localStorage.setItem(&quot;blogbg&quot;, &quot;deafult&quot;);   // default 拼成了 deafult   resetBg_(); &#125; </code>@</p><p>只要点过一次，这个非法值就<strong>永久</strong>留在浏览器里：之后每次加载，判断 <code>blogbg == 'default'</code> 都是假，于是走自定义分支，把 <code>--default-bg: deafult;</code> 写进 CSS —— 一个非法值，浏览器直接忽略，背景全空。</p><p><strong>坑二：设置面板里那些「随机壁纸」，源已经死了一大半。</strong></p><p>我把面板里的壁纸 API 挨个测了一遍：</p><table><thead><tr><th>壁纸源</th><th>实测结果</th></tr></thead><tbody><tr><td><code>bing.img.run</code>（必应每日 / 随机）</td><td>连接失败</td></tr><tr><td><code>api.yimian.xyz</code></td><td>8 秒超时</td></tr><tr><td><code>cdn.seovx.com</code></td><td>连接失败</td></tr><tr><td><code>api.ixiaowai.cn/gqapi</code></td><td>连接失败</td></tr><tr><td><code>source.unsplash.com</code></td><td>已停服（503）</td></tr><tr><td><code>api.btstu.cn</code></td><td>只有 http，HTTPS 站被混合内容拦掉</td></tr><tr><td><code>picsum.photos</code></td><td>能用，但要 2.8 秒</td></tr></tbody></table><p><strong>七个里死了五个。</strong> 而当年在设置面板里点过这些按钮的人（包括我自己），浏览器里存的就是这些死链 —— 每次打开网站，都在等一张永远不会来的图。</p><p>修法是三件套：</p><ol><li><strong>换源</strong>：必应每日 / 随机 → <code>bing.biturl.top</code>，二次元图 → <code>loliapi.com/acg</code>，seovx → <code>api.dujin.org/pic</code>，unsplash 和 btstu → <code>t.mwm.moe</code>。实测 195~430ms 出图，全部国内可达。</li><li><strong>写入前先探测</strong>：点了新壁纸先发一个 <code>Image</code> 请求试加载，加载不出来就<strong>不写进 localStorage</strong>，并弹一句「这个壁纸源失效了🥲」—— 至少让人知道为什么没反应，而不是傻等。</li><li><strong>自愈</strong>：启动时校验 <code>localStorage</code> 里的值，只要它既不是 <code>default</code>、也不是颜色、也不像 <code>url(...)</code> 或 <code>http</code> 开头，一律按 <code>default</code> 处理并回写。以后就算再出现类似的脏值，用户也不用自己去清缓存。</li></ol><p>（最开始那条 <code>$ is not defined</code> 也是这一轮顺带根治的，方法记在 10.3 节。）</p><h2 id="九、战果">九、战果</h2><p>改完必须验证，不然等于没改。</p><p>验证方式是<strong>在临时目录里跑一次完整构建</strong>，然后扫描产物。为什么不直接在博客目录跑？因为本地的 <code>hexo server</code> 正占着 <code>public/</code> 和 <code>db.json</code>，会打架。</p><p>构建结果：<strong>182 个 HTML 页面，7.6 秒</strong>，重复跑了三次都稳定。</p><p>然后是逐项验收：</p><table><thead><tr><th>检查项</th><th>结果</th></tr></thead><tbody><tr><td>唯一的外部 <code>&lt;script src&gt;</code></td><td>26 个 → <strong>24 个</strong></td></tr><tr><td><code>cdn.jsdelivr.net</code> 引用</td><td><strong>0</strong>（此前 3 处 leaflet）</td></tr><tr><td><code>cdn.staticfile.org</code> 作为资源加载</td><td><strong>0</strong>（换源前 1.01 MB）</td></tr><tr><td>Vue + Element-UI</td><td><strong>0</strong>（换来自研的 7 KB）</td></tr><tr><td>MathJax 指向 npmmirror 的页面</td><td><strong>35 / 35</strong></td></tr><tr><td>引入 <code>/js/notify.js</code> 的页面</td><td>182 / 182</td></tr><tr><td>含 <code>preconnect</code> 的页面</td><td>182 / 182</td></tr><tr><td>带 jQuery 本地兜底的页面</td><td>186 / 186</td></tr><tr><td>内联默认背景变量的页面</td><td>186 / 186</td></tr></tbody></table><p>（第一轮统计时全站 182 个页面；背景修复那一轮之后站里多了几篇文章，最后一次完整构建是 <strong>186 个 HTML 页面 / 11 秒</strong>，零报错。所以表格里的分母会不太一样。）</p><p>现在剩下的 24 个外部脚本，全部在这些域名上：</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">cdn<span class="selector-class">.jsdmirror</span><span class="selector-class">.com</span>      <span class="number">2</span>   JS-Heo 朋友圈</span><br><span class="line">lib<span class="selector-class">.baomitu</span><span class="selector-class">.com</span>        <span class="number">1</span>   pjax</span><br><span class="line">npm<span class="selector-class">.elemecdn</span><span class="selector-class">.com</span>      <span class="number">10</span>   echarts地图 / swiper / wowjs / gitcalendar / Meting / pace</span><br><span class="line">registry<span class="selector-class">.npmmirror</span><span class="selector-class">.com</span> <span class="number">9</span>   fancybox / algoliasearch / aplayer / clipboard /</span><br><span class="line">                           instant<span class="selector-class">.page</span> / instantsearch / jquery / sweetalert2 / lazyload</span><br><span class="line">sdk.<span class="number">51</span><span class="selector-class">.la</span>              <span class="number">2</span>   统计 + 监控</span><br><span class="line">sourcebucket<span class="selector-class">.s3</span><span class="selector-class">.bitiful</span><span class="selector-class">.net</span> <span class="number">1</span>  echarts</span><br></pre></td></tr></table></figure><p><strong>境外域名：0。</strong></p><p>体积账：</p><table><thead><tr><th></th><th>之前</th><th>之后</th></tr></thead><tbody><tr><td>首屏第三方资源</td><td>2.72 MB</td><td>~1.82 MB</td></tr><tr><td>其中 Vue + Element-UI</td><td>905 KB</td><td>7 KB</td></tr></tbody></table><p>省下来的 898 KB，差不多是原来的三分之一。</p><!-- 📷 配图建议：优化前后的 Network 面板对比截图，或者 Lighthouse 分数对比 --><h2 id="十、几个值得单独记下来的坑">十、几个值得单独记下来的坑</h2><p>这段是给自己（和未来的你）看的。</p><h3 id="10-1-别用正则去改-JS-源码，尤其别用非贪婪跨块匹配">10.1 别用正则去改 JS 源码，尤其别用非贪婪跨块匹配</h3><p>我一开始想批量替换那 14 处 <code>new Vue</code>，写了个看着挺聪明的正则：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/<span class="keyword">new</span> <span class="title class_">Vue</span>\(\s*\&#123;\s*<span class="attr">data</span>:\s*<span class="keyword">function</span>\s*\(\)\s*\&#123;\s*<span class="variable language_">this</span>\.\$notify\((\&#123;[\s\S]*?\&#125;)\)\s*;?\s*\&#125;\s*\&#125;\)/g;</span><br></pre></td></tr></table></figure><p>匹配到 13 处（预期 14 处），写回文件之后语法直接炸了：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">SyntaxError</span>: <span class="title class_">Missing</span> <span class="keyword">catch</span> or <span class="keyword">finally</span> after <span class="keyword">try</span></span><br></pre></td></tr></table></figure><p>原因是 <code>[\s\S]*?</code> 这种非贪婪匹配<strong>会跨过相邻代码块的边界</strong>，把一个块的收尾花括号吞掉，结构就被破坏了。</p><p>后来改成&quot;扫描器 + 括号配对&quot;：先预处理出一个掩码，跳过字符串、注释和正则字面量，然后用括号深度去精确定位每一处的起止位置，从后往前替换。</p><p><strong>结果是精确命中 14 处，一处不多一处不少。</strong></p><p>教训就是：<strong>改源码这种活儿，正则是最不靠谱的工具。</strong> 要么用 AST，要么老老实实做括号配对 —— 图省事的下场就是回滚重来。</p><h3 id="10-2-Hexo-会给-source-下的-js-跑-Nunjucks">10.2 Hexo 会给 <code>source/</code> 下的 .js 跑 Nunjucks</h3><p>我新建 <code>notify.js</code> 的时候，JSDoc 里写了这么一行：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Object</span>&#125; opt 选项对象</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure><p>构建直接报错：</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Nunjucks Error: js/<span class="keyword">notify</span>.js [<span class="type">Line</span> <span class="number">83</span>, <span class="keyword">Column</span> <span class="number">21</span>] expected variable <span class="keyword">end</span></span><br></pre></td></tr></table></figure><p>因为我写 JSDoc 时习惯性用了双花括号来标注可选字段，那对括号被当成了 Nunjucks 的变量插值。<strong>Hexo 的 <code>source/</code> 目录下所有文本文件都会过一遍 Nunjucks</strong>，包括 <code>.js</code>。</p><p>改成 <code>@param &#123;Object&#125; opt</code> 就没事了。</p><p>顺便一提，<code>fomal.js</code> 里我故意嵌了 18 处<strong>本站的提示框和折叠块标签</strong>，靠的就是这个机制 —— 每次构建的时候展开成真正的 HTML。<strong>同一个特性，既是坑也是特性。</strong></p><h3 id="10-3-is-not-defined：一个-CDN-挂掉，整个文件停摆">10.3 <code>$ is not defined</code>：一个 CDN 挂掉，整个文件停摆</h3><p>回到最开始那两条 JS 报错。</p><p><code>fomal.js:72</code> 那段是在拿访问者的大致位置（在首页欢迎语里显示「你是来自 xx 的朋友」）：</p><p><code>@js $.ajax(&#123;   type: 'get',   url: 'https://apis.map.qq.com/ws/location/v1/ip',   data: &#123; key: '...', output: 'jsonp' &#125;,   dataType: 'jsonp',   success: function (res) &#123; /* ... */ &#125; &#125;); </code>@</p><p>问题是它<strong>依赖 jQuery</strong>。而 jQuery 是从 CDN 加载的，CDN 一死，<code>fomal.js</code> 第 44 行的 <code>$(window).scrollTop()</code> 就抛错，<strong>整个文件从这里中断</strong> —— 后面 3800 行代码一行都不会执行，包括写背景图的那段。</p><p>这就是「一个外部依赖挂掉，整个文件停摆」的经典样本：<strong>同步的顶层代码里出现了一个可能不存在的全局变量，这份脚本就变成了定时炸弹。</strong></p><p>第一轮只是把 jQuery 换到了国内镜像，炸弹还在。这次加了一行本地兜底：</p><p>`@html</p><script>window.jQuery || document.write('<script src="/js/jquery.min.js"><\/script>')</script><p>`@</p><p>CDN 活着就走 CDN，死了就用站内自托管的备份（89 KB）。<strong>自托管一份兜底，是从「依赖别人」到「自己兜得住」最便宜的一步。</strong></p><p>（字符串里的 <code>&lt;/script&gt;</code> 必须写成 <code>&lt;\/script&gt;</code>，否则 HTML 解析器会以为脚本块提前结束了 —— 顺手记一笔。另外 <code>LazyLoad is not defined</code> 属于同一类毛病，出在主题的 <code>main.js</code> 里，这次没动，留个记号。）</p><p>回到最开始那两条 JS 报错。</p><p><code>fomal.js:72</code> 那段是在拿访问者的大致位置（在首页欢迎语里显示&quot;你是来自 xx 的朋友&quot;）：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$.<span class="title function_">ajax</span>(&#123;</span><br><span class="line">  <span class="attr">type</span>: <span class="string">&quot;get&quot;</span>,</span><br><span class="line">  <span class="attr">url</span>: <span class="string">&quot;https://apis.map.qq.com/ws/location/v1/ip&quot;</span>,</span><br><span class="line">  <span class="attr">data</span>: &#123; <span class="attr">key</span>: <span class="string">&quot;...&quot;</span>, <span class="attr">output</span>: <span class="string">&quot;jsonp&quot;</span> &#125;,</span><br><span class="line">  <span class="attr">dataType</span>: <span class="string">&quot;jsonp&quot;</span>,</span><br><span class="line">  <span class="attr">success</span>: <span class="keyword">function</span> (<span class="params">res</span>) &#123;</span><br><span class="line">    <span class="comment">/* ... */</span></span><br><span class="line">  &#125;,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>问题是它<strong>依赖 jQuery，而 jQuery 是在页面底部才加载的</strong>，顺序对不上，于是就有了 <code>$ is not defined</code>。</p><p>这次换源把 jQuery 换到了国内镜像，但<strong>加载顺序的问题没动</strong>。<code>LazyLoad is not defined</code> 也是同一类毛病。</p><p>留着下次修吧 —— 反正这篇已经够长了 🤣</p><h2 id="十一、顺带排掉的一颗雷：三个-Markdown-渲染器抢一个位置">十一、顺带排掉的一颗雷：三个 Markdown 渲染器抢一个位置</h2><p>有一件事我原本没打算管——直到「关于」页自己先坏了。</p><p>某天点进去发现，「1.线路信息🚁」之后那一整块变成了<strong>没被解析的原始 Markdown</strong>：列表全连成一段，链接还带着 <code>[fomal.cc](https://www.fomal.cc/)</code> 的括号，小标题的 <code>##</code> 两个字面量直接杵在页面上。第一反应是标签没闭合、要么缩进写坏了，回头一看那篇文件一个字都没动过。</p><p>真正的原因藏得比较深：<strong>这个站同时装了三个 Markdown 渲染器。</strong></p><figure class="highlight mel"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">@upupming/hexo-<span class="keyword">renderer</span>-markdown-it-plus</span><br><span class="line">hexo-<span class="keyword">renderer</span>-kramed</span><br><span class="line">hexo-<span class="keyword">renderer</span>-markdown-it</span><br></pre></td></tr></table></figure><p>它们注册的是同一批扩展名（<code>md</code>、<code>markdown</code>、<code>mkd</code> …），而 <code>node_modules/hexo/lib/extend/renderer.js</code> 里的注册是「<strong>后注册者胜</strong>」；更麻烦的是 <code>hexo/lib/hexo/load_plugins.js</code> 用 bluebird 的 <code>Promise.map</code> <strong>并发</strong>加载插件，谁先加载完基本看运气——同一份仓库连跑两次，插件的完成顺序都不一样。</p><p>运气不好、<code>hexo-renderer-kramed</code> 赢的时候，它的 HTML 块规则会把 <code>&lt;div class=&quot;about_page&quot;&gt;</code> <strong>之后</strong>的整段 Markdown 当成纯文本吞掉，就是我看到的那个样子。判它赢还有个简单指纹：kramed 会给标题补 <code>&lt;a class=&quot;headerlink&quot;&gt;</code>、给表格套一层 <code>div.table-container</code>。</p><p><strong>最麻烦的不是它坏，是它坏了不会自己好。</strong> Hexo 不重渲染已经缓存的文档：</p><ul><li><code>Cache.compareFile</code> 只要 <code>cache.modified === mtime</code> 就直接返回 <code>skip</code>（hash 一样也是 skip），<strong>touch 源文件完全没用</strong>；</li><li><code>node_modules/hexo/lib/plugins/processor/post.js:77</code> 碰到 <code>type</code> 是 <code>skip</code> 的文档直接 <code>return</code>；</li><li>而 <code>before_generate/render_post.js</code> 里的 renderPostFilter 只认 <code>post.content == null</code> 的文档。</li></ul><p>三条叠在一起的结果是：db.json 里那份坏 HTML 会一直赖着，除非整站 clean 重建——而重建又是在赌运气。后来那次全站重建，kramed 又赢了一次：<code>public/personal/about/index.html</code> 里 <code>## 2.技术栈</code> 是字面量、<code>&lt;h2&gt;</code> 只剩 3 个（正常 5 个），db.json 里有标题的 53 篇文档<strong>全部</strong>是 kramed 风格。</p><p>修法分两步。<strong>急救</strong>是把 db.json 里那篇的缓存记录和 content 字段手术删掉（15807407 → 15785922 字节），先让页面能看；<strong>根治</strong>是从 <code>package.json</code> 里删掉那一行：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">-    &quot;hexo-renderer-kramed&quot;: &quot;^0.1.4&quot;,</span></span><br></pre></td></tr></table></figure><p>这里有个容易吓到自己的地方：删了依赖要不要 <code>npm uninstall</code>？<strong>不用。</strong> Hexo 的 <code>load_plugins</code> 只加载 <code>package.json</code> 里列出的包，<code>node_modules/</code> 里的残留放着不加载、无害。</p><p>删之前当然要做对照——万一 kramed 才是当前生效的那个，删掉等于把 84 篇文章全部重渲染一遍。做法是把 84 篇 <code>.md</code> 用 <code>hexo.post.render()</code> 重新渲染取 sha256：<strong>含 kramed 和不含 kramed，指纹完全一样</strong>（<code>0ceb6517…</code>），说明它早就不生效了，摘掉对现有输出逐字节零影响。</p><div class="note info no-icon flat"><p>那份排查记录里还顺手更正了一个自己早先给错的结论：之前得到的「摘掉后只有 5/87 篇对得上」，是<strong>测量对象错位</strong>——拿 kramed 版本的缓存去比 markdown-it 版本的输出，比的不是「有 kramed」和「无 kramed」。这种自我更正比结论本身更值钱。</p></div><p>留了个尾巴：<code>@upupming/hexo-renderer-markdown-it-plus</code> 和 <code>hexo-renderer-markdown-it</code> 还在并存，只是 6 次观测里 plus 总是先完成、markdown-it 后完成，所以是后者生效。想把竞态彻底消掉，可以把 plus 也摘掉，但要重做一遍同样的对照验证。</p><p>副作用一个：kramed 独有的标题自链接 <code>&lt;a class=&quot;headerlink&quot;&gt;</code> 不见了。想留可以在 <code>_config.yml</code> 的 <code>markdown.anchors</code> 下面加 <code>permalink: true</code>、<code>permalinkClass: headerlink</code>、<code>permalinkSide: left</code>，再把符号留空。我没接回去——标题 id 两种渲染器本来就一致。</p><h2 id="十二、给页脚加了个「旅行者-1-号」">十二、给页脚加了个「旅行者 1 号」</h2><p>页脚那个计时器（「本站居然运行了 X 天 X 小时 X 分 X 秒」，白天挂「科研摸鱼中」的牌子、晚上换成「下班休息啦」）跑了两年多，这次在旁边加了一句更远的东西：</p><blockquote><p>旅行者 1 号当前距离地球 25,0xx,xxx,xxx 千米，约为 1xx.xxxxxx 个天文单位（信号单程需 XX 小时 XX 分）🚀</p></blockquote><p>这东西<strong>不能随便算</strong>。「距离 = 速度 × 时间」那种近似公式，放到两百多亿公里外误差能到几百万公里。所以做法是从 JPL Horizons 取真实星历（DE440 地球星历 + Jacobson 2022 的旅行者 1 号解），<strong>离线</strong>做最小二乘拟合，把系数直接打进 <code>fomal.js</code>，运行时只做多项式求值——不联网、不请求接口，也不会哪天因为第三方接口停服而变成空白（这个教训前面刚吃过）。</p><p>模型拆成两块：</p><ul><li><strong>旅行者 1 号</strong>：线性趋势 + 切比雪夫残差（3 个坐标 × 47 项）</li><li><strong>地球</strong>：年谐波（含线性慢调制）+ 月球项（3 个坐标 × 26 项）</li></ul><p>在日心黄道 J2000 坐标下分别算出两体位置，再取几何距离 <code>|r_V1 − r_earth|</code>。时间也要处理：系数是按 TDB 儒略日拟合的，输入毫秒时间戳得先换算 <code>jd = ms / 86400000 + 2440587.5 + 69.184 / 86400</code>（那里多出来的 69.184 秒，是从 UTC 到 TDB 的近似差）。</p><p>有效期 2026-01-01 ~ 2100-01-01，窗口外自动钳位到边界（退化成只保留线性趋势），不会算出离谱的数。精度上，与 Horizons 的几何距离对着比（2026—2100 年两万多个独立采样点）<strong>均方根约 4000 千米、最大约 12000 千米（≈ 8×10⁻⁵ 天文单位）</strong>——已经远好于 JPL 自己对旅行者 1 号位置的预测不确定度（2030 年约 ±20 万千米）。</p><p>还有个细节值得单独说：它输出的是<strong>几何距离</strong>（此刻真实距离），不是光行时修正后的视距离；旁边那句「信号单程需 X 小时 Y 分」就是拿这个距离除光速再取整。</p><p>顺手把欢迎信息也重做了：</p><ul><li>站长坐标改成深圳市南山区（<code>113.930413, 22.531901</code>，代码里留了注释「换坐标只改这一行」）</li><li>原来那套「按省份/城市各写一句欢迎语」的大 switch 整个删掉了——辽宁省是「我想吃烤鸡架！」，上海市是「众所周知，中国只有两个城市。」，写的时候很开心，但它有一百多行，而且只对国内 IP 有意义。现在改成按访问者的本地时间打招呼：上午好 / 中午好 / 下午好 / 晚上好 / 夜深了，再带上当前时刻</li><li>IP 显示加了个小处理：在每个冒号后面插一个 <code>&lt;wbr&gt;</code>，让 IPv6 地址能在冒号处断行，不至于把卡片撑破</li></ul><p>文案从「欢迎来自 广东省 深圳市 龙华区 的小伙伴，晚上好，夜生活嗨起来！您现在距离站长约 88 公里，当前的IP地址为：…」变成了「来自 广东省 深圳市 龙华区 的访客，现在是 22:41，你目前距站长约 16 公里，IP地址：…」。</p><p>公告栏也一起精简了：删掉 <code>zeabur.fomal.cc</code>、<code>fleek.fomal.cc</code> 两条早就停掉的备用线路，以及整块「— chatGPT —」，只留主域名两个 + netlify 备用 + APP 下载。理由很直白——<strong>挂着不能用的东西比不挂更糟</strong>，它会让人以为还有退路。</p><h2 id="十三、主题正式改名叫-Fomalhaut-了">十三、主题正式改名叫 Fomalhaut 了</h2><p>这主题从 Butterfly 4.3.1 改到现在，已经没几行是原来的样子了，但目录还叫 <code>themes/butterfly</code>、配置还叫 <code>_config.butterfly.yml</code>，每次看都觉得别扭。于是改名。</p><p>改名听起来是体力活，但它属于那种<strong>一处漏了就直接坏</strong>的操作——Hexo 找主题配置，是按 <code>_config.&lt;主题目录名&gt;.yml</code> 拼出来的：</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">themes<span class="regexp">/butterfly/</span>            →  themes<span class="regexp">/fomalhaut/</span></span><br><span class="line">_config.butterfly.yml        →  _config.fomalhaut.yml</span><br><span class="line">_config.yml   theme: butterfly  →  theme: fomalhaut</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">package</span>.json   name: hexo-theme-butterfly  →  hexo-theme-fomalhaut</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>scripts<span class="regexp">/events/i</span>nit.js   弃用提示改成 _config.fomalhaut.yml</span><br><span class="line">.gitignore                  补上 themes<span class="regexp">/fomalhaut/</span>.git</span><br></pre></td></tr></table></figure><p>顺带给主题加了个自报家门的启动横幅：在 Hexo 的 ready 事件里打 5 行 ASCII 艺术字 FOMALHAUT，下面跟一行版本号：</p><figure class="highlight oxygene"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">主题版本：<span class="number">1.0</span>.<span class="number">0</span> (<span class="keyword">Inherited</span> <span class="keyword">from</span> Butterfly <span class="number">4.3</span>.<span class="number">1</span>)</span><br></pre></td></tr></table></figure><p>主题自己的版本号单独写在一个 <code>fomalhautVersion</code> 常量里（以后改这一行就行），Butterfly 的版本从主题 <code>package.json</code> 的 version 字段读出来。两个小坑：</p><ol><li>版本行里中文要按<strong>两个字符宽</strong>算才能居中（判断 <code>\u2E80-\uFFEF</code> 这个区段），不然会明显偏左；</li><li><strong>别顺手去改主题 package.json 里的 version</strong> —— 主题的 <code>cdn.js</code> 还拿这个版本号拼 jsdelivr / unpkg 的资源地址，改了会把静态资源路径一起改坏。</li></ol><p>最后还有两处小打磨：</p><ul><li>作者卡片的按钮从「前往小窝」改成「Github主页」，指向 <code>github.com/fomalhaut1998</code></li><li>首页卡片右上角那个小箭头，主题里是直角 <code>clip-path</code>，在 <code>custom.css</code> 里用同链选择器（特异性相同、顺序更靠后）覆盖成圆角：元素固定 20×10px、圆角半径约 2px，曲线按 4 段采样成多边形顶点坐标——<code>border-radius</code> 对 <code>clip-path</code> 不生效，只能这么硬算</li></ul><p>改完的感受是：<strong>这种「机械但零容错」的活儿，交给 AI 一遍过是最划算的</strong>；真正难的是判断「哪些地方必须跟着改」——上面那张清单里，漏掉任何一行都不会报错，只会安静地不生效，或者干脆整个站渲染不出来。</p><h2 id="十四、把「刷新时先闪一下」也抹平了">十四、把「刷新时先闪一下」也抹平了</h2><p>前面背景图修好之后，我注意到一个更细的毛病：<strong>每次刷新页面，会先闪一帧默认壁纸（还有默认字体），然后才跳成我自己设的那张。</strong></p><p>不算故障，但很扎眼。原因也不复杂：壁纸、卡片透明度、主题色这些美化设置都存在 <code>localStorage</code> 里，而<strong>负责读它们、再把值写进 CSS 变量的那 3800 行 <code>fomal.js</code>，是放在页面底部、等 HTML 和 CSS 都处理完才开始跑的</strong>。第一帧渲染时，CSS 用的还是 <code>:root</code> 里的默认值——于是先画一帧默认壁纸，再被脚本改掉。</p><p>要抹掉这一帧只有一条路：<strong>赶在首帧之前把值写进去</strong>。于是在 <code>_config.fomalhaut.yml</code> 的 <code>inject.head</code> 里插了一段内联脚本（<code>&lt;script id=&quot;beautyBoot&quot;&gt;</code>）：它同步执行，早于 body 解析、也早于首帧。位置很讲究——必须放在那批 <code>&lt;style id=&quot;...&quot;&gt;</code> 标签<strong>后面</strong>，否则 <code>document.getElementById()</code> 什么都拿不到。</p><p>它一共接管八类设置，套路都一样：读 <code>localStorage</code>，然后直接改对应 <code>&lt;style&gt;</code> 标签的 <code>textContent</code>：</p><ul><li>自定义壁纸 → <code>defineBg</code></li><li>卡片透明度 → <code>transPercent</code></li><li>背景滤镜（模糊 / 饱和度 / 对比度）→ <code>bgFilterParam</code></li><li>主题色 → <code>themeColor</code></li><li>字体 → <code>--global-font</code>（选「默认字体」时，还要像 <code>fomal.js</code> 那样动态插一段 <code>&lt;style&gt;</code>）</li><li>侧边部件 / 侧栏显隐 / 侧栏位置 / 顶栏常驻 / 霓虹灯 / 帧率开关 → <code>rightSide</code>、<code>aside-show</code>、<code>aside-pos</code>、<code>nav-display</code>、<code>menu_shadow</code>、<code>#fps</code></li></ul><p>几个必须对齐的细节：</p><ol><li>壁纸要<strong>连 <code>--darkmode-bg</code> 一起写</strong>（脚本里那个 <code>SAME = &quot;;--darkmode-bg:&quot;</code> 常量就是干这个的），不然切到夜间模式还是旧图；</li><li>取值规则必须和 <code>fomal.js</code> 的初始化<strong>逐字一致</strong>：<code>null</code>、空串、字符串 <code>&quot;undefined&quot;</code> / <code>&quot;null&quot;</code> 都算「没设置」，走默认值；</li><li>这段脚本只是<strong>提前把同样的值写一遍</strong>，不新增任何请求，也不改 <code>fomal.js</code> 的逻辑——两边的结果必须一模一样，否则会出现「刷新后闪回默认值」这种更诡异的现象。</li></ol><p>写的时候先在 <code>.tmp-boot-draft.js</code> 里当独立文件调通，再内联进配置。要说这轮修的东西里哪些最不容易被发现，<strong>就是这种「一帧」级别的问题</strong>：它不影响任何功能，只在每次刷新的头 100 毫秒里出现一次。</p><h2 id="十五、美化面板里那根「点不动」的滑条">十五、美化面板里那根「点不动」的滑条</h2><p>顺手修的第二个体验问题：<strong>卡片透明度那根进度条，只有拖右边那个圆点才有反应，点轨道左边完全没动静。</strong></p><p>两个原因叠在一起：</p><ul><li><code>input[type=range]</code> 本体只有 <strong>5px 高</strong>，圆点却有 <strong>15px</strong>——想点中那 5px 的细线本来就很难；</li><li>更麻烦的是它上面盖了一层 <code>.rang_width</code>（<code>position: absolute</code>）用来显示彩色进度，<strong>这层把鼠标事件全吃掉了</strong>，点下去根本传不到 input。</li></ul><p>修法分三层，缺一层都不成立。</p><p><strong>一、把可点击区域做大</strong>（<code>custom.css</code>）：<code>.range</code> 加 <code>padding: 9px 0</code>，视觉高度不变，可点区域从 5px 扩到 23px；顺手加 <code>cursor: pointer</code>、<code>user-select: none</code>，触屏上给 <code>touch-action: pan-y</code>——纵向照样滚页面，只有横向拖动才交给滑条。</p><p><strong>二、让进度条别再挡路</strong>：<code>.rang_width</code> 的 <code>top</code> 跟着 <code>padding</code> 对齐到 9px，并加 <code>pointer-events: none</code>。它只是装饰，不该接收事件。</p><p><strong>三、坐标换算</strong>（<code>fomal.js</code> 里新写的 <code>rangeValueFromX()</code>）：把鼠标横坐标换成滑条的值。这里有几个容易算错的地方：</p><ul><li>要<strong>扣掉圆点自身的宽度</strong>（<code>usable = rect.width - 15</code>），否则拖到最右边永远到不了 max，最左边也点不出 min；</li><li>按 <code>step</code> 取整，再抹掉浮点误差的尾巴；</li><li>直接改 <code>value</code> <strong>不会触发 <code>oninput</code></strong>，所以另外补一个 <code>input</code> 事件（<code>new Event(&quot;input&quot;, &#123; bubbles: true &#125;)</code>）派发出去，复用原来那套 <code>setTrans()</code>——这样「点击跳转」和「拖动滑块」走的是同一条逻辑，不会变成两套代码各自维护。</li></ul><p>再往上包一层：<code>bindRangeJump()</code> 在滑条所在的框上接 <code>mousedown</code> / <code>touchstart</code>，<code>initRangeJump()</code> 在 document 上<strong>只注册一次</strong> <code>pointermove</code> / <code>pointerup</code>（拖出轨道再松手也能正确结束，反复开关小窗也不会重复绑定）。最后在美化小窗创建完之后挂两行：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">initRangeJump</span>();</span><br><span class="line"><span class="title function_">bindRangeJump</span>(<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;transSet&quot;</span>));</span><br></pre></td></tr></table></figure><p>改主题文件之前，先抽了个独立页面 <code>slider-fix-check.html</code> 出来——把真实的 CSS 和一段真实代码的切片（<code>.tmp-real-slice.js</code>）拼进去，在浏览器里先把手感确认好。<strong>这种小交互最怕「改完不知道好没好」</strong>，有个能单独打开的自测页，比每次刷新整站去试效率高得多。</p><h2 id="十六、两枚新徽章，和一个「不用再管」的朋友圈">十六、两枚新徽章，和一个「不用再管」的朋友圈</h2><p>页脚那排徽章更新了：</p><ul><li>主题徽章从 <code>Theme-Butterfly-6513df.svg</code> 换成自制的 <code>Theme-Fomalhaut-6513df.svg</code>（沿用同一个色号），链接指向改名后的 <code>hexo-theme-Fomalhaut</code> 仓库；</li><li>新增一枚 <code>CDN-npmmirror-fff2cc.svg</code>——这轮换源把大部分静态库搬到了 npmmirror，值得在页脚记一笔；</li><li>两张 SVG 也存进了 <code>source/assets/badge/</code> 存档，线上依旧走缤纷云的桶。</li></ul><p>比徽章更值得写的是<strong>朋友圈（友链动态）那条链路</strong>。它原来的数据源是 <code>https://fcircle.fomal.cc/</code>，也就是我自建的 Vercel 爬虫接口。</p><p>这次把 <code>source/social/fcircle/index.md</code> 里的 <code>private_api_url</code> 换成了仓库里的静态文件：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 数据源：仓库里的静态 data.json（由 GitHub Action 每 6 小时生成，经 jsDelivr 国内 CDN 分发）</span></span><br><span class="line"><span class="attr">private_api_url</span>: <span class="string">&#x27;https://cdn.jsdmirror.com/gh/fomalhaut1998/hexo-circle-of-friends@main/data.json?&#x27;</span>,</span><br></pre></td></tr></table></figure><p>看起来只是换了个地址，其实是<strong>把「需要有人维护的服务」换成了「一个文件」</strong>：爬虫照旧每 6 小时跑一次，结果直接提交进 GitHub 仓库；前端拿的是 CDN 上的静态 JSON，没有函数、没有运行时、没有要续费的平台。写这篇之前顺手查了下它是活的：HTTP 200、7689 字节（8 KB），<code>statistical_data</code> 和 <code>article_data</code> 都在，26 篇文章。</p><p>回头看，这一整晚修的都是同一件事：<strong>把依赖第三方、依赖人去盯的东西，换成放在自己仓库里、躺在 CDN 上的东西。</strong> 它们唯一的失效条件，就是我自己不提交。</p><h2 id="十七、顺手的三件小事">十七、顺手的三件小事</h2><p><strong>标签统计图的排序一直是错的。</strong> 标签页那张「Top 10 标签统计图」由主题的 <code>hexo_echarts.js</code> 这个 helper 生成，它取前 N 名的写法是 <code>sort((x, y) =&gt; y[0] - x[0])</code>——而 <code>x[0]</code> 是标签名（字符串），字符串相减得到 <code>NaN</code>，排序函数永远返回 <code>NaN</code>，<strong>排了等于没排</strong>。改成按文章数降序、同数按名字排：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">tagArr.<span class="title function_">sort</span>(</span><br><span class="line">  <span class="function">(<span class="params">x, y</span>) =&gt;</span> y[<span class="number">1</span>] - x[<span class="number">1</span>] || <span class="title class_">String</span>(x[<span class="number">0</span>]).<span class="title function_">localeCompare</span>(<span class="title class_">String</span>(y[<span class="number">0</span>]), <span class="string">&quot;zh&quot;</span>),</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p><strong>「随便逛逛」在本地预览时会跳到生产站。</strong> 那个按钮是随机跳一篇博文，数据来自 <code>/baidusitemap.xml</code>；而 sitemap 里的 <code>&lt;loc&gt;</code> 是绝对地址（域名由 <code>_config.yml</code> 的 <code>url</code> 决定），所以本地 <code>localhost:4000</code> 点一下，会把自己的浏览器直接扔到 <code>www.fomal.cc</code> 去。改成统一转成同源相对路径：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> u = <span class="keyword">new</span> <span class="title function_">URL</span>(el.<span class="property">textContent</span>.<span class="title function_">trim</span>(), location.<span class="property">origin</span>);</span><br><span class="line"><span class="keyword">return</span> u.<span class="property">pathname</span> + u.<span class="property">search</span> + u.<span class="property">hash</span>;</span><br></pre></td></tr></table></figure><p>顺手加了道保险：抽到的地址如果和当前页面相同，最多重抽 20 次（原来只判断一次）。</p><p><strong>帧率显示的采样窗口从 1 秒缩到 0.5 秒</strong>（<code>now &gt; 500 + lastTime</code>），刷新频率翻倍。这一处是上一轮改的，我写这篇的时候才发现漏记了——所以「顺手」这话不能全信，改完不写下来，过一天自己都不记得。</p><h2 id="十八、统计页的三张图，其实是一张过期了-30-天的-token">十八、统计页的三张图，其实是一张过期了 30 天的 token</h2><p>上次修完背景图之后，我去 <code>/site/census/</code> 看了一眼，发现三张图 —— 访问地图、访问趋势、访问来源 —— 全是空白。</p><p>「空白」这个状态特别有迷惑性：它不像报错那么显眼，也不像「本来就还没数据」那么理直气壮。点开控制台才知道，<code>census.js</code> 从百度统计接口拿回来的是：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span> <span class="attr">&quot;error_code&quot;</span><span class="punctuation">:</span> <span class="number">111</span><span class="punctuation">,</span> <span class="attr">&quot;error_msg&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Access token expired&quot;</span> <span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>而三个 <code>.catch()</code> 里只写了一行 <code>console.log(error)</code>，错误被安安静静地吞掉了。<strong>页面上看不出「没数据」和「服务挂了」的区别，这就是它能坏很久而我一直没发现的原因。</strong></p><p>百度统计的 <code>access_token</code> 有效期只有 30 天，过期之后要拿 <code>refresh_token</code> 去换新的。这里有个坑值得单独记：<strong>refresh_token 是一次性的</strong>。我用同一个 token 调了第二次刷新接口，直接返回：</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">error </span>400 expired_token: refresh token has been used</span><br></pre></td></tr></table></figure><p>所以刷新完必须把返回的新 refresh_token 一并写回去。<code>census.js</code> 里现在是三行联动（第 4 行刷新链接里的、第 9 行注释里的、第 10 行的 access_token），下次到期是 10 月 31 日之前 —— 我把这句话也写进注释里了，因为<strong>这个坑一年会来十二次，而人一年会忘十二次</strong>。</p><p>顺手做了两件事，让这类故障下次别再静默。</p><p><strong>第一，接口挂了要看得见。</strong> 加了两个小函数：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">censusResult</span>(<span class="params">data</span>) &#123; ... &#125;            <span class="comment">// 校验返回体，异常时抛错</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">showChartFallback</span>(<span class="params">id, error</span>) &#123; ... &#125;  <span class="comment">// 在图表容器里显示「统计服务暂不可用 + 原因」</span></span><br></pre></td></tr></table></figure><p>原来那三个 <code>.catch</code> 只打日志，现在会在图表原来的位置上写清楚「统计服务暂不可用」，以及具体是什么原因 —— 从界面就能看出来是服务挂了，而不是自己网卡了。</p><p><strong>第二，让地图跟着主题色走。</strong> 那张中国地图原来写死了 <code>['#39c5bb', '#b9ebe4']</code> 两级色阶，主题色是绿的时候看着还行，换成粉的、紫的就格格不入。但主题色不是常量：它是主题运行时写进 <code>&lt;style id=&quot;themeColor&quot;&gt;</code> 的 CSS 变量，取值来自设置面板，所以只能在运行时读：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">getComputedStyle</span>(<span class="variable language_">document</span>.<span class="property">documentElement</span>).<span class="title function_">getPropertyValue</span>(<span class="string">&quot;--theme-color&quot;</span>);</span><br></pre></td></tr></table></figure><p>读到 rgb 之后，再用「叠白」「叠黑」两个函数派生出同色系的浅色调和深色调，把悬浮高亮的 <code>gold</code> 换成主题色的深色，悬浮标签的文字颜色按背景亮度在深灰和白色之间自适应。最后加一个 <code>MutationObserver</code> 盯着那个 <code>&lt;style&gt;</code> 标签 —— 你在设置面板里换主题色，地图会跟着一起变，不用刷新页面。</p><p>顺带还改了 51la 那排数字。原来只显示 5 格，把「总访问量」漏掉了，<code>order</code> 数组改一行就能加回来：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> order = [<span class="number">6</span>, <span class="number">1</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">4</span>, <span class="number">5</span>]; <span class="comment">// 下标 6 = 总访问量</span></span><br></pre></td></tr></table></figure><p>再加千分位。这里有个细节：51la 的 <code>quote.js</code> 是<strong>被当纯文本抓回来</strong>的，它自带的格式化函数根本不会执行，所以只能自己补一个正则；顺手给 <code>match()</code> 加了 <code>|| []</code> 兜底 —— 抓不到的时候原来是 TypeError，整个统计块直接空白。</p><p>（顺便说一句：改完这些，统计页终于从「三张白板」变回了有内容的页面。这类改动没有任何技术难度，纯粹是<strong>没人往那儿看</strong> —— 前面屏幕上那些红字是这样，这三张图也是这样。）</p><h2 id="十九、一块贡献日历的三次搬家">十九、一块贡献日历的三次搬家</h2><p>统计页顶部还有一块 GitHub 贡献日历，它今天挪了三次家 —— 大概是整篇里最能说明「自建服务为什么会烂掉」的例子。</p><p><strong>起点</strong>是它在转圈。链路是这样的：<code>hexo-filter-gitcalendar</code> 往页面里注入一句 <code>GitCalendarInit(jsonurl, color, user)</code>，前端的 <code>gitcalendar.js</code> 拿这个地址去 <code>fetch</code> 一年的贡献数据。</p><p><strong>第一次搬家：先找个别人的接口顶着。</strong> 原来的数据由自建的 Vercel 函数 <code>gitcalendar.fomal.cc</code> 提供 —— 它的做法是抓 <code>https://github.com/fomalhaut1998</code> 的主页 HTML，再用两条正则把日历抠出来。GitHub 后来把日历改成了异步加载：</p><table><thead><tr><th></th><th>旧代码期望</th><th>实测</th></tr></thead><tbody><tr><td>数据来源</td><td>主页内嵌的日历</td><td>主页 HTML 里 <code>data-date=</code> 出现 <strong>0 次</strong></td></tr><tr><td>日期正则</td><td><code>data-date=&quot;(.*?)&quot; data-level</code></td><td>属性顺序变成 <code>data-date … id … data-level</code></td></tr><tr><td>计数正则</td><td><code>&lt;span class=&quot;sr-only&quot;&gt;N contribution</code></td><td>每天的计数搬进了 <code>&lt;tool-tip&gt;</code></td></tr></tbody></table><p>结果 <code>zip(*sorted_data)</code> 解到一个空列表，抛 <code>ValueError</code>，Vercel 只回一个 96 字节的 <code>FUNCTION_INVOCATION_FAILED</code>。<strong>抓 HTML 的接口本质上是在别人家的装修上打洞，人家一改版就塌。</strong></p><p>临时方案很省事 —— <code>_config.yml</code> 里加一行 <code>jsonurl</code>，先指向别人的公开接口：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jsonurl:</span> <span class="string">&quot;https://gh-calendar.rschristian.dev/user/fomalhaut1998&quot;</span></span><br></pre></td></tr></table></figure><p><strong>第二次搬家：把自己的接口修好。</strong> 老代码改了两版才跑通。v1 换了 <code>requests</code> 库还是 500，而且返回的是 Vercel 的通用错误页 —— 说明异常发生在进入 <code>try</code> 之前，也就是<strong>模块导入阶段就崩了</strong>（<code>requirements.txt</code> 里 pin 的是 2020 年的版本）。所以 v2 干脆做了两件事：</p><ol><li>全部改用标准库 <code>urllib</code>，不再有任何第三方依赖；</li><li>所有分支收敛到一个出口，任何异常都变成 JSON，不再出现 Vercel 的通用 500 页。</li></ol><p>还加了一个自检入口 <code>?__debug</code>，返回运行时 Python 版本、抓取状态、抓到的字节数、关键正则的命中次数，以及页面开头 200 字。<strong>排查远程接口最痛苦的是「你看不见里面」，那就先让自己能看见。</strong></p><p><strong>第三次搬家：连前端资源也拿回来。</strong> 修接口的时候才发现，不只是数据在别人手里 —— <code>gitcalendar.css</code> 和 <code>gitcalendar.js</code> 也挂在 <code>npm.elemecdn.com</code> 上。于是两个文件搬回本站（<code>14564</code> 与 <code>3045</code> 字节），顺手给 js 打了个补丁：原版只在<strong>成功分支</strong>里摘掉加载动画 <code>#git_loading</code>，</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#125;).<span class="title function_">catch</span>(<span class="keyword">function</span>(<span class="params">error</span>) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(error)      <span class="comment">// 接口一挂，转圈永远不停</span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>补丁在 catch 里补上收尾，并在日历容器里写一句「📅 贡献日历暂不可用 / 数据来源：GitHub · 稍后刷新重试」。这里还有一个隐藏依赖：<code>#git_container &#123; display: none &#125;</code> 这条样式<strong>写在 <code>#git_loading</code> 内部</strong>，所以「摘掉转圈」和「让日历显示出来」是同一个动作，顺序不能颠倒。</p><p><strong>终点（这次的答案）：不要服务，只要一个文件。</strong> 前面两版修的都是「抓 HTML」，GitHub 下次改版还会坏。所以最后走了一条和朋友圈（<code>hexo-circle-of-friends</code>）完全一样的路：</p><figure class="highlight fortran"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">GitHub GraphQL API → GitHub <span class="keyword">Action</span>（每 <span class="number">6</span> 小时）→ gitcalendar-<span class="keyword">data</span> 仓库里的 <span class="keyword">data</span>.json</span><br><span class="line">                                                            ↓ jsDelivr / jsdmirror</span><br><span class="line">                          访客浏览器里的 gitcalendar.js 直接 fetch 这个文件</span><br></pre></td></tr></table></figure><p>没有 Vercel 函数、没有第三方接口、没有会欠费或过期的项目 —— <strong>唯一能让它失效的事情是 GitHub 自己挂了</strong>。几个值得记下来的细节：</p><ul><li>数据单独放一个仓库。如果把这个每 6 小时提交一次的任务放在博客仓库里，<strong>每次提交都会触发一次整站重新部署</strong>；</li><li>生成脚本的形状校验是硬性的：周数不是 53、最后一周为空、GraphQL 报错 —— 任一情况直接退出，并且<strong>不覆写 data.json</strong>。宁可数据旧 6 小时，也不要页面空白；</li><li>实测：11943 字节、53 周、369 天，与 <code>raw.githubusercontent.com</code> 上的原文<strong>逐字节一致</strong>；<code>gitcalendar.js</code> 里硬编码取的 <code>git_data[47]/[48]/[51]/[52]</code> 在 53 周结构下全部合法；</li><li>代价是当天的贡献最多滞后 6 小时。原来的 <code>apiurl</code> 留着没删，<strong>删掉 <code>jsonurl</code> 那行就能切回自己的接口</strong>。</li></ul><p>最后是一个反复踩到的坑：<strong><code>_config.yml</code> 不在 hexo server 的监听范围里</strong>。<code>node_modules/hexo/lib/hexo/index.js:345-346</code> 只监听 source 和 theme，所以改完配置必须重启，否则页面里注入的还是旧地址（实测改完刷新，源码里仍然是 <code>GitCalendarInit(&quot;https://gitcalendar.fomal.cc/api?fomalhaut1998&quot;...)</code>）。</p><h2 id="二十、滚动条，和一只挡路的猫">二十、滚动条，和一只挡路的猫</h2><p>两件视觉上的小事，都是今天才发现的。</p><p><strong>滚动条上的斜条纹其实一直没出现。</strong> 很早以前我给滚动条写过一套样式：主题色滑块、45 度斜条纹、圆角。但它从来没显示过 —— 因为后来我又给 Firefox 加了标准属性：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">scrollbar-width</span>: thin;</span><br><span class="line"><span class="attribute">scrollbar-color</span>: <span class="built_in">var</span>(--theme-color) <span class="number">#f1f1f1</span>;</span><br></pre></td></tr></table></figure><p>问题是 Chrome / Edge 121+ 也认这两个标准属性了，而<strong>一旦它们不是 <code>auto</code>，浏览器就会完全忽略 <code>::-webkit-scrollbar</code> 伪元素样式</strong> —— 不是被覆盖，是整个不生效。所以修法反直觉：在支持伪元素的浏览器里，把标准属性<strong>退回 auto</strong>：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@supports</span> selector(::-webkit-scrollbar) &#123;</span><br><span class="line">  * &#123;</span><br><span class="line">    <span class="attribute">scrollbar-color</span>: auto <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">scrollbar-width</span>: auto <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Firefox 不认识 <code>selector(::-webkit-scrollbar)</code>，会跳过这一段，继续用它认识的标准双色滚动条 —— <strong>两边就都能看了</strong>。</p><p>条纹本身也重做了一版「发廊转筒」：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">::-webkit-scrollbar-thumb &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">background-image</span>: <span class="built_in">repeating-linear-gradient</span>(</span><br><span class="line">    <span class="number">45deg</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.45</span>) <span class="number">0</span> <span class="number">9px</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.2</span>) <span class="number">9px</span> <span class="number">18px</span></span><br><span class="line">  );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>条纹宽度试了三档：3px 太密，像被马赛克糊过；7px 仍然偏密；<strong>9px 是松弛、但还没糊成一块色板的那个档位</strong>。</p><p><strong>然后是那只猫。</strong> 右下角有只报时猫，鼠标移上去会冒一个气泡显示当前时间。它平时不显眼，直到你发现<strong>它把底下的东西全挡住了</strong> —— 侧边栏的按钮、导航图标，指针移过去既不亮也点不动，因为它是绝对定位浮在页面右侧的一层。</p><p>修法很简单，让它只当「视觉挂件」：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.neko</span> &#123;</span><br><span class="line">  <span class="attribute">pointer-events</span>: none; <span class="comment">/* 不吃鼠标事件，底下的链接照常能点 */</span></span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#333</span> <span class="meta">!important</span>; <span class="comment">/* 白色气泡上用 #333，跟主题色反而怪 */</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>代价立刻出现</strong>：<code>pointer-events: none</code> 的元素收不到 <code>:hover</code>，报时气泡再也不出来了。于是把「悬停」这件事从 CSS 搬到 JS 自己做：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> r = el.<span class="title function_">getBoundingClientRect</span>();</span><br><span class="line"><span class="keyword">var</span> inside =</span><br><span class="line">  clientX &gt;= r.<span class="property">left</span> &amp;&amp;</span><br><span class="line">  clientX &lt;= r.<span class="property">right</span> &amp;&amp;</span><br><span class="line">  clientY &gt;= r.<span class="property">top</span> &amp;&amp;</span><br><span class="line">  clientY &lt;= r.<span class="property">bottom</span>;</span><br><span class="line"><span class="keyword">if</span> (inside) &#123;</span><br><span class="line">  <span class="title function_">nekoClockTick</span>();</span><br><span class="line">  $neko.<span class="title function_">addClass</span>(<span class="string">&quot;hoverOn&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>三个细节：</p><ul><li><code>mousemove</code> 触发频率很高，套一层 <code>requestAnimationFrame</code> 合流 —— <strong>一帧最多判定一次</strong>；</li><li>指针移出整个窗口之后不会再有 <code>mousemove</code>，补一个 <code>window.mouseout</code> + <code>e.relatedTarget</code> 为空的兜底，否则气泡会一直挂在那儿；</li><li>定时器在 <code>window</code> 上留了 <code>__nekoClockTimer</code> 标记，脚本被重复执行也不会叠出好几个。</li></ul><p><strong>这两件事的共同点是：它们都不报错。</strong> 一个样式被默默忽略、一只猫默默挡住按钮，控制台里没有一行红字，你只会觉得「这个按钮怎么点不动」。所以回头看，<strong>修网站最费时间的从来不是修，而是发现。</strong></p><h2 id="二十一、节日提醒：从「必须点一下确定」换成左上角一张卡片">二十一、节日提醒：从「必须点一下确定」换成左上角一张卡片</h2><p>先说一个此前一直被我无视的东西：博客的节日提醒。</p><p>旧版是一套 SweetAlert2 居中弹窗 —— 到了元旦、春节、国庆这种日子，页面正中间弹出一个框，挡住内容，必须点一下「确定」才能继续看文章。老实讲，作为一个偶尔路过自己博客的人，我都被它烦过。所以这次干脆重写。</p><p><strong>旧的写法是二十多个 if。</strong> 节日判断全塞在 <code>source/js/fomal.js</code> 里：一个节日一个 <code>if</code>，里面写死「今年是哪一年、今天是不是那一天」，最后调一次 <code>Swal.fire(...)</code>。这种写法有两个麻烦：</p><ul><li>清明、冬至这种跟节气走的节日，日期每年都不一样，而旧代码是<strong>按年份硬编码</strong>的 —— 意思是过一年你就得进去改一次数。人不会记得改。</li><li>想加一个节日，得在将近四千行的 <code>fomal.js</code> 里找到对的位置，复制一坨 <code>if</code> 再改文案。</li></ul><p><strong>新的写法是一张表。</strong> 现在多了一个 <code>source/js/festival.js</code>（14199 字节 / 433 行），里面只有一张 <code>FESTIVALS</code> 表，30 条节日各占一块：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">id</span>: <span class="string">&#x27;mid-autumn&#x27;</span>,</span><br><span class="line">  <span class="attr">title</span>: <span class="string">&#x27;中秋节&#x27;</span>,</span><br><span class="line">  <span class="attr">lunar</span>: [[<span class="string">&#x27;八月&#x27;</span>, <span class="string">&#x27;十五&#x27;</span>]],        <span class="comment">// 农历八月十五</span></span><br><span class="line">  <span class="attr">message</span>: <span class="string">&#x27;中秋快乐\n愿你与牵挂的人共此一轮月。&#x27;</span>,</span><br><span class="line">  <span class="attr">type</span>: <span class="string">&#x27;success&#x27;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>判断条件支持四种写法，可以叠加，满足任意一种就弹：</p><table><thead><tr><th>写法</th><th>例子</th><th>说明</th></tr></thead><tbody><tr><td><code>solar</code></td><td><code>[[10, 1], [10, 2], [10, 3]]</code></td><td>公历，国庆一次管三天</td></tr><tr><td><code>term</code></td><td><code>[4, 7]</code></td><td>节气：4 月的第 7 个节气 = 清明，按年自动算</td></tr><tr><td><code>lunar</code></td><td><code>[['八月', '十五']]</code></td><td>农历，写法跟页面上显示的农历一致</td></tr><tr><td><code>week</code></td><td><code>[5, 0, 2]</code></td><td>5 月第 2 个星期日 —— 母亲节是这么写的</td></tr></tbody></table><p>文案里有几个占位符：<code>&#123;year&#125;</code> 是当前年份，<code>&#123;since:1949&#125;</code> 会算成「距 1949 年多少年」，所以国庆那条写的是「祝祖国{since:1949}岁生日快乐！」，不用每年改；愚人节那种需要随机挑一句的，用 <code>pick: ['…', '…']</code>。</p><p><strong>弹的箱子也换了。</strong> 节日卡片现在走的是我上一轮写的那个通知组件（<code>source/js/notify.js</code>），落在左上角，十秒后自己收起，想提前关就点右上角的叉：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">fomalNotify</span>(&#123;</span><br><span class="line">  <span class="attr">position</span>: <span class="string">&quot;top-left&quot;</span>,</span><br><span class="line">  <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">  <span class="attr">duration</span>: <span class="number">10000</span>,</span><br><span class="line">  <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>一天只弹一张卡（记在 <code>sessionStorage</code> 的 <code>fomal-festival-shown</code> 里；隐身模式下 <code>sessionStorage</code> 可能不可用，代码里 catch 掉就算了，不值得为它报个错）。</p><p>顺便，这张卡还能不等节日就预览：</p><ul><li>控制台输入 <code>fomalFestival.list</code> 看全部节日；</li><li><code>fomalFestival.preview('national')</code> 立刻弹出国庆那张卡（不占用当天的去重名额）；</li><li>或者直接在地址后面加 <code>#festival=mid-autumn</code>（换成表里的 id）。</li></ul><p><strong>农历换算拆成了单独一个文件。</strong> 节气与农历那套算法原来也在 <code>fomal.js</code> 里，这次抽成了 <code>source/js/lunar.js</code>（24401 字节 / 1089 行，覆盖 1900–2100 年），对外就三个函数：<code>solar2lunar()</code>（不传参就是今天）、<code>lunar2solar()</code>、<code>getTerm(year, n)</code>（第 n 个节气，1 是小寒、7 是清明、24 是冬至）。</p><p>两个细节值得记下来：</p><ol><li><strong>顺序不能错。</strong> <code>festival.js</code> 依赖 <code>lunar.js</code>，注入时它必须在前 —— <code>_config.fomalhaut.yml:1263</code> 是 lunar.js，<code>:1265</code> 才是 festival.js。</li><li><strong><code>lunar.js</code> 故意没写成 IIFE、也没开严格模式。</strong> 那几个函数必须挂在全局上给 <code>festival.js</code> 用；文件头也写明了：里面的算法是逐行照搬过来的，要加新逻辑请另开文件，别动它。</li></ol><p><strong>这一进一出，主脚本瘦了一圈。</strong> <code>source/js/fomal.js</code> 从 3961 行降到 2799 行 —— 少了一千一百多行。搬出去的部分变成了两个各管一事的文件：<code>lunar.js</code>（24 KB）+ <code>festival.js</code>（14 KB）。</p><p><strong>顺手删掉的还有两样东西。</strong> 一是四条公祭日提醒（九一八、卢沟桥、南京大屠杀、世界慰安妇纪念日），二是一整套「纪念日到点把整站变灰」的代码（<code>fomal.js</code> 里原来有 4 处 grayscale 处理）。这两处是我自己要求删的：网站是个人博客，不是宣传栏，该记的事我自己会记得，不需要代码到点提醒我。删干净之后，grayscale 在 <code>fomal.js</code> 里归零。</p><p>同时补了八个日常节日（情人节、母亲节、父亲节、儿童节、建军节、感恩节、平安夜、腊八节），原来那些祝福语的文案也顺手改稳了一点。表里还留着两条私货：<code>cat-birthday</code> 和 <code>fomal-birthday</code> —— 一只猫的生日，和站长的生日。</p><p>最后，SweetAlert2 那条外链脚本也一起卸了：现在整个仓库搜不到一处 <code>sweetalert</code>。</p><h2 id="二十二、首页改成-3-×-3，以及一种把置顶写在正文里的写法">二十二、首页改成 3 × 3，以及一种把置顶写在正文里的写法</h2><p>这轮还有两件事都落在首页上。</p><p><strong>第一件：一页 12 篇改成 9 篇。</strong></p><p>起因是首页看着有点「糊」。我这边首页是三列布局（<code>themes/fomalhaut/source/css/_index_card_style/multicard.styl:146-150</code>：窗口宽 ≥1069px 时卡片宽度 32.3%，也就是一行三张），而 <code>_config.yml:84</code> 的 <code>index_generator.per_page</code> 写的是 12 —— 12 除以 3 正好四行，一屏密密麻麻塞满。</p><p>改成 9 就是三列三行，一屏刚好摆满，底下的留白出来了，翻页从 5 页变成 6 页。不算大改，但第一眼的观感确实不一样了。</p><p>顺手把侧栏那张「最新文章」卡片也撤了（<code>_config.fomalhaut.yml:967</code> 的 <code>aside.card_recent_post.enable</code> 改成 <code>false</code>）：首页已经全是文章列表，侧栏再来一份「最新 5 篇」纯属重复。模板里是 <code>themes/fomalhaut/layout/includes/widget/card_recent_post.pug:1</code> 的那个 <code>if</code> 控制的，改完这个 DOM 整个不会生成。</p><p>验证还是老老实实构建一遍：<code>hexo clean &amp;&amp; hexo generate</code> 退出码 0、263 个文件；<code>public/index.html</code> 里真实文章卡片 9 个（<code>.recent-post-item</code> 一共 11 个，另外 2 个是轮播和分类磁贴的整行容器，不算），出现 <code>/page/6/</code>，全站找不到 <code>card-recent-post</code> 这个 DOM。</p><p><strong>第二件：置顶换了个写法。</strong></p><p>这事有点好笑。上一轮为了解决「新文章排在第 13 位、首页根本看不见」，我把 12 篇文章的置顶全删了，让首页恢复纯时间倒序。结果现在又需要置顶了 —— 但这次我不想再往 Front-Matter 里塞 <code>sticky: 数字</code>：那玩意儿肉眼看不见，一篇文章到底有没有被置顶，你得点开文件才知道。</p><p>所以现在可以在<strong>正文里任意位置</strong>写一行 HTML 注释：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- sticky --&gt;</span></span><br><span class="line">置顶，等价于 Front-Matter 里写 sticky: 1</span><br><span class="line"><span class="comment">&lt;!-- sticky: 2 --&gt;</span></span><br><span class="line">强置顶，角标颜色更深</span><br></pre></td></tr></table></figure><ul><li>标记会在渲染时被自动删掉，不会漏进正文、摘要、RSS 和搜索结果；</li><li>Front-Matter 里的 <code>sticky</code> 优先，正文标记只在没写的时候生效；</li><li>排序还是 <code>node_modules/hexo-generator-index/lib/generator.js:10</code> 那一行 <code>sort((a, b) =&gt; (b.sticky || 0) - (a.sticky || 0))</code>，不用装任何置顶插件。</li></ul><p>实现是新增的 <code>scripts/sticky-post.js</code>（2753 字节），注册在 <code>after_post_render</code> 上、<code>priority = 5</code>。这个数字是故意的：Hexo 的 <code>excerpt</code> 过滤器用的是默认 priority 10，所以这个小脚本一定先跑，标记会在任何摘要切分之前就被剥掉 —— 否则摘要的头一行就是一句 HTML 注释，很煞风景。剥的时候四个地方都过一遍（<code>data.raw</code>、<code>content</code>、<code>excerpt</code>、<code>more</code>），顺手把可能留下的空段落（<code>&lt;p&gt;&lt;/p&gt;</code>）清掉。</p><p>首页卡片的左上角现在会挂一个置顶角标：<code>themes/fomalhaut/layout/includes/mixins/post-ui.pug:143</code> 的 <code>postStickyBadge</code> 混入负责渲染，只有首页才画（<code>is_home() &amp;&amp; article.sticky &gt; 0</code>），<code>sticky &gt;= 2</code> 会多一个 <code>is-top</code> 类，颜色更深更红。样式在 <code>themes/fomalhaut/source/css/_custom/custom.css:3519-3604</code>：26px 的胶囊、橙红渐变底、13px 的图标，另加一道斜向高光每 3.4 秒划过一次 —— 没什么技术原因，就是让人第一眼能看见。暗色模式下阴影加深一点，<code>prefers-reduced-motion</code> 下高光动画直接不显示。</p><p>有个细节记一下：角标只能贴在卡片<strong>内部</strong>的左上角。因为 <code>.recent-post-item</code> 本身是 <code>overflow: hidden</code>，想做成越界的小缎带会被直接裁掉。</p><p>现在有两篇用了这个标记：这篇，和那篇《Markdown 语法与外挂标签写法汇总》。</p><h2 id="二十三、美化面板里那面错排的图墙，和那个不像控件的取色框">二十三、美化面板里那面错排的图墙，和那个不像控件的取色框</h2><p>美化面板（右下角那个糖果按钮）里「四、背景设置」有一面图墙，壁纸一张挨一张，点一下就换。这面墙在窄屏下一直是错排的。</p><p><strong>问题长这样：</strong> 一行只放得下一张图，右边留一大片空白；而在 579px 这种「一行刚好能放两三张」的宽度下，最后一行只剩两张时会被 <code>justify-content: space-between</code> 推到最左和最右，中间空出一大块。</p><p><strong>原因在两条 CSS 上：</strong></p><ul><li><code>themes/fomalhaut/source/css/_custom/custom.css:1114</code>：<code>.bgbox &#123; display: flex; flex-wrap: wrap; justify-content: space-between; &#125;</code></li><li><code>custom.css:1120</code>：<code>.pimgbox, .imgbox, .box &#123; height: 100px; width: 166px; margin: 10px; &#125;</code>（≤768px 时宽度改成 135px、高度 73px）</li></ul><p>固定宽度 + <code>space-between</code>：一行装不下两张就只能放一张；末行不满时两端对齐，中间必然出现空洞。</p><p><strong>改法就是换成 grid。</strong> 从「一行能塞几张算几张」改成「列宽固定、从左往右排满一行再换行」：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 桌面 */</span></span><br><span class="line"><span class="selector-class">.bgbox</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: grid;</span><br><span class="line">  <span class="attribute">grid-template-columns</span>: <span class="built_in">repeat</span>(auto-fill, <span class="built_in">minmax</span>(<span class="number">150px</span>, <span class="number">1</span>fr));</span><br><span class="line">  <span class="attribute">gap</span>: <span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">align-items</span>: start;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.bgbox</span> &gt; <span class="selector-class">.pimgbox</span>,</span><br><span class="line"><span class="selector-class">.bgbox</span> &gt; <span class="selector-class">.imgbox</span>,</span><br><span class="line"><span class="selector-class">.bgbox</span> &gt; <span class="selector-class">.box</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* ≤768px：列窄一点、间距小一点 */</span></span><br><span class="line"><span class="selector-class">.bgbox</span> &#123;</span><br><span class="line">  <span class="attribute">grid-template-columns</span>: <span class="built_in">repeat</span>(auto-fill, <span class="built_in">minmax</span>(<span class="number">110px</span>, <span class="number">1</span>fr));</span><br><span class="line">  <span class="attribute">gap</span>: <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.bgbox</span> &gt; <span class="selector-class">.imgbox</span>,</span><br><span class="line"><span class="selector-class">.bgbox</span> &gt; <span class="selector-class">.box</span> &#123;</span><br><span class="line">  <span class="attribute">height</span>: auto;</span><br><span class="line">  aspect-ratio: <span class="number">135</span> / <span class="number">73</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>auto-fill</code> + <code>minmax()</code> 的意思是「按容器宽度自己算能放几列」，所以不会再出现手写的宽度和缝隙对不上。实测（真实构建出来的页面，注入探针量的）：</p><table><thead><tr><th>视口宽度</th><th>改之前</th><th>改之后</th></tr></thead><tbody><tr><td>320</td><td>8 行 × 1 张（135×73）</td><td>4 行 × 2 张（114×62）</td></tr><tr><td>390</td><td>8 行 × 1 张</td><td>4 行 × 2 张（147×80）</td></tr><tr><td>414</td><td>2 张/行，行内空隙 37px</td><td>2 张/行（159×86），间距 10</td></tr><tr><td>579</td><td>3 张/行，末行两端对齐空 194px</td><td>2 行 × 4 张（114×61）</td></tr><tr><td>768</td><td>4 张/行，行内空隙 35px</td><td>5 张/行（125×67），末行左对齐</td></tr><tr><td>1280</td><td>3 张/行，末行空 350px</td><td>空洞消失（列宽自适应）</td></tr></tbody></table><p><strong>第二个是那个取色框。</strong> 「四、背景设置 → 5. 纯色」里的取色框一直是浏览器原生外观：比旁边的色块高 10px（110 对 100）、方角、多一圈 1px 边框，一眼就能看出「这不是同一个世界的控件」。改法是：</p><ul><li><code>appearance: none</code> 去掉原生外观，尺寸对齐同级色块（宽 100%、高 100px、圆角 10px）；</li><li>底下垫一层彩虹渐变 <code>conic-gradient(...)</code>，再把原生的色块用 <code>::-webkit-color-swatch &#123; opacity: 0 &#125;</code> 藏掉；</li><li>「自定义颜色」四个字从写死的 <code>left/top</code> 改成水平居中（<code>left: 0; right: 0; top: 50%; transform: translateY(-50%)</code>）。</li></ul><p>点击还是弹系统取色器，只是外观换成了自己的。手机端再补一条 <code>.bgbox &gt; #define_colors &#123; height: auto; aspect-ratio: 135 / 73 &#125;</code>，跟同级色块一样高。</p><p><strong>最后一条教训：<code>_custom/</code> 下的文件不吃 <code>hexo generate</code>。</strong> 主题把 <code>source/css/_custom/custom.css</code> 当私有文件（下划线开头），改完必须 <code>hexo clean &amp;&amp; hexo generate</code> 才会重新编译。我第一次改完只跑了 <code>generate</code>，浏览器里死活没变化，一度以为是缓存。</p><h2 id="二十四、欢迎信息的空蓝框、页脚的第四年、手机上的滚动条">二十四、欢迎信息的空蓝框、页脚的第四年、手机上的滚动条</h2><p><strong>欢迎信息先占个位。</strong> 侧栏那张欢迎卡片要等腾讯地图的接口回来才知道你在哪，接口慢的时候它就是一个空蓝框。现在：</p><ul><li>脚本一执行就先写一行「欢迎信息正在加载中…」进去；</li><li><code>showWelcome()</code> 开头加了守卫：没拿到 <code>ipLoacation.result.location</code> 就先显示加载提示然后 return（顺手修掉了控制台里那个未捕获的 TypeError）；</li><li><code>pjax:complete</code> 之后再挂一次，页面切换回来也有占位；</li><li>十秒还没等到数据，就换成「欢迎信息加载失败，请刷新重试🥺」。</li></ul><p>实测：0.6 / 1.6 / 5 秒都停在「加载中」，11.5 秒变成失败提示；接口正常时 0.6 秒就换成真正的欢迎语。</p><p><strong>页脚那个运行时长开始算「年」了。</strong> 以前显示「本站居然运行了 1514 天 17 小时 21 分 05 秒」—— 一千多天到底是几年，得自己算。现在按满周年计算：</p><ul><li>建站时间 2022-08-09，到 2026-08-09 记 4 年，剩下的天数从周年日重新数；</li><li>具体是 <code>anniv = new Date(grt)</code>、<code>years = now.getFullYear() - grt.getFullYear()</code>，如果周年日还没过就把 <code>years--</code> 并重算 <code>anniv</code>，再 <code>dnum = Math.floor(rest / 86400000)</code>；</li><li>秒从 <code>Math.round</code> 换成了 <code>Math.floor</code> —— 原来的写法在最后一秒会算出「60 秒」，看着挺怪的。</li></ul><p>现在显示的是「本站居然运行了 4 年 53 天 17 小时 21 分 05 秒」。</p><p><strong>手机端补了一条自绘滚动条。</strong> 上一轮把电脑端的滚动条改成主题色斜条纹之后，手机端一直没跟上 —— 因为手机浏览器（以及 Chromium 的 overlay 滚动条模式）根本不认 <code>::-webkit-scrollbar</code>，只用系统滚动条，那条规则在手机上等于没写。</p><p>所以 ≤768px 干脆把系统滚动条藏起来（<code>scrollbar-width: none</code> + <code>html::-webkit-scrollbar &#123; width: 0; height: 0 &#125;</code>），用一个自己画的替代：<code>custom.css:69-116</code> 里的 <code>#mscrollbar</code> / <code>#mscrollbar-thumb</code>，由 <code>source/js/fomal.js:2740-2798</code> 驱动 ——</p><ul><li>固定在右边缘，宽 8px，滑块高度按 <code>vh * vh / total</code> 算、最小 30px；</li><li>随滚动进度 <code>translateY</code> 移动，滚动时淡入，停下来 0.9 秒后淡出（<code>HIDE_DELAY = 900</code>）；</li><li>条纹和颜色跟电脑端那条一样（<code>var(--theme-color)</code> + 45° 的 9px/18px 重复渐变）；</li><li>监听 <code>scroll</code>（<code>passive: true</code>）、<code>resize</code>、<code>DOMContentLoaded</code>、<code>pjax:complete</code>，换页之后它还在。</li></ul><p>桌面端一行都没动 —— 窗口超过 768px 时自绘条不会加 <code>mscrollbar-on</code> 类，也就不会出现两条滚动条。</p><h2 id="二十五、节日那天，除了卡片还放了一场礼炮">二十五、节日那天，除了卡片还放了一场礼炮</h2><p><strong>卡片是「告诉你今天是什么日子」，礼炮是「替今天高兴一下」。</strong> 节日提醒从居中弹窗改成左上角卡片之后，喜庆的那几天还是有点安静，于是又加了一层：命中「喜庆节日」时，卡片弹出的同时整屏放一遍烟花。</p><p>规则写得很克制：</p><ul><li>节日表 <code>source/js/festival.js</code> 里只有 <code>celebrate: true</code> 的条目才放，一共 16 个 —— 元旦、情人节、劳动节、520 情人节、儿童节、建党节、建军节、国庆节、平安夜、圣诞节、站长生日，加上春节、元宵、端午、七夕、中秋这五个农历节日；表里一共 29 条，喜庆的占一半多一点。</li><li><strong>平常日子一个字节都不下载</strong>：<code>festival.js:376-395</code> 的 <code>loadFx()</code> 命中时才 <code>document.createElement('script')</code> 插入 <code>/js/celebrate.js</code>（<code>async</code>，<code>onload</code> 之后才调 <code>fomalCelebrate(&#123; colors: f.colors &#125;)</code>），<code>fxLoading</code> 防止重复插入；新脚本 6946 字节。</li><li><code>source/js/celebrate.js</code> 的参数都写在文件开头：8 发礼炮（<code>ROCKETS = 8</code>）、每发 104 个粒子（<code>SPLASH = 104</code>）、整段动画硬上限 7600ms（<code>TOTAL = 7600</code>），到点自己收工并把 canvas 从 DOM 里摘掉。</li><li>canvas 铺满全屏、<code>pointer-events: none</code>、<code>z-index: 9998</code> —— 比通知卡片的 9999 低一层，所以卡片上的字不会被烟花糊住，也不会挡住任何点击。</li><li>像素比最高按 2 渲染、粒子上限约 500（低端机不卡）；系统开了「减少动态效果」（<code>prefers-reduced-motion: reduce</code>）时<strong>直接不播放</strong>。</li></ul><p>顺带按要求下线了「小猫咪生日」那条提醒 —— 生日从此只有站长一个。</p><h2 id="二十六、把「标签-分类-文章统计」并成一张「文章统计」">二十六、把「标签 / 分类 / 文章统计」并成一张「文章统计」</h2><p>理由很朴素：三张页面说的是同一件事（本站写了些什么、各标签各分类各有多少篇），却分在「文章」和「网站」两个下拉里，点进去三张图长得还差不多。</p><p>合并的方式不是删页面，而是给主题加了一个<strong>通用跳转页</strong>：</p><ul><li><code>source/tags/index.md</code> 的 <code>type</code> 从 <code>tags</code> 改成 <code>echarts</code>、<code>title</code> 改成「文章统计」，它成为唯一的落点（<code>/tags/</code>）；</li><li><code>source/categories/index.md</code> 与 <code>source/site/echarts/index.md</code> 只留 front-matter：<code>type: redirect</code> + <code>redirect_to: /tags/</code> + <code>comments: false</code> + <code>sitemap: false</code>（不让搜索引擎记两条重复地址）；</li><li>新增 <code>themes/fomalhaut/layout/includes/page/redirect.pug</code>（488 字节）：<code>meta http-equiv=&quot;refresh&quot;</code> 加 <code>location.replace()</code> 双保险，下面留一行「该页面已合并到「文章统计」，正在自动跳转……」和手动链接（万一脚本被挡）；</li><li><code>themes/fomalhaut/layout/page.pug:8-18</code> 的 <code>case page.type</code> 里补一个 <code>when 'redirect'</code> 分支，以后任何页面想搬家，只需要写两行 front-matter；</li><li><code>includes/page/echarts.pug</code> 在原三张图后面补上「标签云」和「分类列表」两块（复用原标签页、分类页的正文），统计页自己就是完整的一页；</li><li><code>_config.fomalhaut.yml</code> 里「文章」下拉删掉「标签」「分类」，换成一条「文章统计: /tags/ || icon-shujutongji1」；「网站」下拉里的「文章统计: /site/echarts/」删掉。</li></ul><p><strong>顺手把归档页顶部那张「文章发布统计」图删了。</strong> 归档页的主角是时间线，页顶再压一张柱状图很挤；<code>themes/fomalhaut/layout/archive.pug</code> 从 510 字节缩到 310 字节（删掉 <code>echarts.min.js</code> 的引入、<code>#posts-echart</code> 容器和 <code>posts_echarts(...)</code> 调用），但 <code>posts_echarts</code> 这个 helper 没删 —— <code>/tags/</code> 那页还在用它。</p><h2 id="二十七、三张统计图的标题挪到图表外面">二十七、三张统计图的标题挪到图表外面</h2><p>同一批图还有个小问题：标题是 ECharts 自己画的（<code>title</code> 选项），于是图例、标题、图形挤在同一块 canvas 里，窄屏下标题容易被图例压住。</p><p>改法是让助手函数支持一个新参数：</p><ul><li><code>themes/fomalhaut/scripts/helpers/hexo_echarts.js</code> 三个 helper（<code>posts_echarts</code>、<code>tag_ranking_bar</code>、<code>categories_pic</code>）里各加一行 <code>const showTitle = options.titlePosition !== 'outside'</code>，把 <code>title.show</code> 接到这个变量上；</li><li><code>includes/page/echarts.pug</code> 里三张图各配一个 <code>&lt;center&gt;&lt;font size=&quot;4&quot; style=&quot;font-weight:bold&quot;&gt;标题&lt;/font&gt;&lt;/center&gt;</code>，调用时传 <code>titlePosition: 'outside'</code>；</li><li>不传这个参数的老调用行为完全不变。</li></ul><h2 id="二十八、菜单动手术：二级菜单居中、四个入口下线">二十八、菜单动手术：二级菜单居中、四个入口下线</h2><p><strong>二级菜单居中。</strong> 主题原来的做法是按栏目写死偏移 —— <code>custom.css</code> 里躺着 6 条 <code>nth-child(2)~(7) .menus_item_child &#123; left: -149px ~ -105px &#125;</code>，每个栏目一条，宽度一变就得重算。「标签/分类」并成「文章统计」之后子菜单变窄，一眼就看得出对不齐。现在只留一条规则：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#nav</span> <span class="selector-class">.menus_items</span> <span class="selector-class">.menus_item</span> <span class="selector-class">.menus_item_child</span> &#123; <span class="attribute">left</span>: <span class="number">50%</span>; <span class="attribute">right</span>: auto; <span class="attribute">transform</span>: <span class="built_in">translateX</span>(-<span class="number">50%</span>); &#125;</span><br></pre></td></tr></table></figure><p>坑在动画上：主题 <code>_global/function.styl</code> 里的 <code>@keyframes sub_menus</code> 只做 <code>translateY</code>，而 <code>head.styl:304</code> 用的是 <code>animation: sub_menus .3s .1s ease both</code> —— <code>both</code> 会把动画结束态一直保持着，于是静态的 <code>translateX(-50%)</code> 被覆盖，菜单又跑偏。所以我在 <code>custom.css</code> 里<strong>同名覆盖</strong>了一份 <code>@keyframes sub_menus</code>，把 <code>-50%</code> 一起写进关键帧（<code>translate(-50%, 10px)</code> → <code>translate(-50%, 0)</code>），进场动画和下落的观感都还在。实测二级菜单中心与父项盒中心差 −4px（父项左侧 8px 内边距造成，肉眼看不出来）；宽度是自适应的 —— 父项从 186px 变到 254px 时子菜单从 623px 跟到 691px，中心始终是 1060.5px。</p><p><strong>四个入口下线。</strong> 这次删掉的是「游戏」「动画」两个菜单项，以及整个「个人」父项（「唠叨」「恋爱小屋」），「关于」挪到「网站」栏。删的是<strong>菜单入口</strong>而不是页面：<code>source/personal/bb/</code>、<code>source/personal/love/</code> 两个目录删了，但 <code>/life/games/</code>、<code>/box/animation/</code> 这些页面文件都还在，直链打开依然正常 —— 有些老文章的正文里还链着它们。</p><p>「关于」就更有意思了：页面文件一直在 <code>source/personal/about/</code> 下，如果为了让 URL 好看而搬去 <code>/about/</code>，页脚、右键菜单和好几篇旧文章里的链接就全断了，所以路径没动，只是把它挂进了「网站」下拉。改完 <code>hexo clean &amp;&amp; hexo generate</code> 是 262 files in 3.19s。</p><h2 id="二十九、列表页的翻页也换成首页那种方块">二十九、列表页的翻页也换成首页那种方块</h2><p>首页的翻页是圆角小方块卡片，归档页和标签/分类的列表页却还是主题默认的「细边线数字」，两处风格对不上。这次没动主题源码，而是把一段样式注进了 <code>_config.fomalhaut.yml</code> 的 <code>inject.head</code>（<code>&lt;style id=&quot;listPagination&quot;&gt;</code>）：</p><ul><li>选择器写成 <code>.layout &gt; div:not(.recent-posts) .pagination &gt; *</code>，正好<strong>放过首页</strong>（首页的 <code>.recent-posts</code> 已经在主题里排好了），只管归档、标签、分类这些列表页；</li><li>每个页码 <code>display: inline-block</code>、<code>width / height / line-height: 2.5em</code>、<code>margin: 0 6px</code>，圆角 8px，底色 <code>var(--card-bg)</code>、阴影 <code>var(--card-box-shadow)</code>，悬停换成 <code>var(--btn-hover-color)</code>；</li><li>第一版被说「字太扁」，于是提高选择器优先级、把行高写死成 2.5em，第二版才对齐。</li></ul><h2 id="三十、打赏二维码：换源、居中、缩小">三十、打赏二维码：换源、居中、缩小</h2><p>三件事一起做：</p><ul><li><strong>换源</strong>：<code>_config.fomalhaut.yml</code>（第 476、479 行）与关于页 <code>source/personal/about/index.md</code> 里两个收款码都换成 <code>https://sourcebucket.s3.bitiful.net/img/vx_code.webp</code> 和 <code>…/zhifubao_code.webp</code>（关于页那个微信 tab 的缩放从 60% 调到 50%）；</li><li><strong>弹窗居中</strong>：<code>reward.styl</code> 里 <code>.reward-button</code> 加 <code>position: relative</code>，<code>.reward-main</code> 从 <code>left: -55%; width: 150%</code> 改成 <code>left: 50%; translate: -50% 0; width: max-content</code>；</li><li><strong>缩小</strong>：二维码高度 280px → 140px，整张卡片约 328×197 CSS px。</li></ul><p>这里踩了两个纯 CSS 的坑。第一个：用 <code>transform: translateX(-50%)</code> 居中不行 —— 主题给弹窗挂了 <code>animation: donate_effcet .3s .1s ease both</code>，那个关键帧只做 <code>translateY</code>，<code>fill-mode: both</code> 会把横向位移一起吃掉。第二个：改用 <code>left: 0; right: 0; margin: auto</code> 加 <code>width: max-content</code> 也不行 —— 绝对定位下 <code>max-content</code> 会按 <code>width: auto</code> 解析，<code>auto</code> 外边距算出来是 0。最后用的是<strong>独立属性 <code>translate</code></strong>：它和 <code>transform</code> 是两条不同的属性（合成顺序是 <code>translate → rotate → scale → transform</code>），动画动它的 <code>transform</code>，居中动它的 <code>translate</code>，互不干扰。实测弹窗中心与按钮中心偏差 0 设备像素。</p><h2 id="三十一、美化面板的初始尺寸不再靠猜">三十一、美化面板的初始尺寸不再靠猜</h2><p>侧栏那个「美化」面板以前的初始尺寸是 <code>resize(窗口宽 × 0.6, 70%)</code> —— 于是窗口越宽它越宽：1920 宽的屏上弹出 1152×700 的面板，右边一大片空白，第一节还没显示完。</p><p>现在改成<strong>按内容量</strong>（<code>source/js/fomal.js</code> 新增 <code>winboxNeedSize()</code>）：</p><ul><li>宽度 = 首按钮左缩进 + 前 5 个 <code>.swf</code> 按钮的宽度与外边距 − 末位右边距 + 容器左右内边距 + 面板装饰宽 + 10px 余量。为什么是 5 个？因为「字体设置」第一行正好是 5 个按钮，能排下不折行，宽度就够了；</li><li>高度 = 第一节最后一行（<code>#asidePosSet</code> 所在那一行）的底边 − 面板顶 + 下内边距 + 6px；</li><li>上下限 620×420，再用视口的 95% × 92% 夹一道；量不到（元素还没渲染）就回退到 780×540。</li></ul><p>配套改了 <code>winResize()</code>：桌面分支做<strong>两趟量</strong> —— 先把宽度定下来，再量一次高度（宽度一变，行是否折行才确定，高度才是最终值），最后 <code>move('center', 'center')</code>；<code>toggleWinbox()</code> 里 <code>createWinbox()</code> 之后补一次 <code>winResize()</code>（<code>createWinbox</code> 是先 <code>resize</code> 再写 <code>innerHTML</code> 的，写完内容尺寸才准）。</p><p>实测：1423×736 下从 854×515 变成 802×534；1920×1000 下从 1152×700 变成 802×534 —— 不再随窗口变宽；800×744 下是 752×681（被上限夹住）。手机端分支（≤768px，95% 宽 / 90% 高）一行没动。</p><h2 id="三十二、给-139-个友链做了一次体检：81-个搬进「失联友链」">三十二、给 139 个友链做了一次体检：81 个搬进「失联友链」</h2><p>友链页越攒越多，「茫茫人海」那一组里有 118 个站点，早就不知道哪些还活着。</p><p>这次做了一件笨但有用的事：把 0～3 这四个分类里<strong>记录在册的 139 个在线友链</strong>全部探测一遍，判定顺序是 HTTPS 请求（跟随跳转）→ HTTP 回退 → 直连 TLS → 公共 DNS（DoH）复核 → 首轮失败的再重试一次。结论是 <strong>81 个已经打不开</strong>，全部搬进「4.失联友链🎈」，那一组从 10 条变成 95 条：</p><table><thead><tr><th>分类</th><th>改前</th><th>改后</th><th>移出</th></tr></thead><tbody><tr><td>0.推荐网站🍔</td><td>4</td><td>1</td><td>3</td></tr><tr><td>1.技术支持🍟</td><td>13</td><td>9</td><td>4</td></tr><tr><td>2.宝藏网站🍉</td><td>30</td><td>16</td><td>14</td></tr><tr><td>3.茫茫人海🍗</td><td>118</td><td>54</td><td>64</td></tr><tr><td>4.失联友链🎈</td><td>10</td><td>95</td><td>+81</td></tr></tbody></table><p>失联的原因也分了类：<strong>55 个是域名解析都没了</strong>（NXDOMAIN，用公共 DNS 复核结果一致），其余是域名被抢注 / 劫持成垃圾站、TLS 证书过期或域名不匹配、连接直接超时。过程留在四个文件里：<code>probe-pass1.json</code>（首轮 200 判定与页面标题）、<code>probe-dns-doh.json</code>（53 个 DNS 死站）、<code>probe-nondns-pass2.json</code>（超时与 TLS 类的二次复核，比如「海底捞里没有鱼」是 <code>UND_ERR_CONNECT_TIMEOUT</code>、「鹤川博客」是 <code>ERR_TLS_CERT_ALTNAME_INVALID</code>）、<code>move-plan.json</code>（每一条的搬迁原因：<code>dns</code> 还是 <code>tls:…</code>）。</p><p>搬家的写法很克制：只加两行 —— <code>theme_color: &quot;#ebebeb&quot;</code> 和 <code>offline: true</code>，原来的头像、简介、截图都留着 —— 因为<strong>站是站长的，不该因为一年打不开就替人删掉</strong>，归到最后一组、头像变成灰度，等站长修好了再搬回来。改动只落在 <code>source/_data/link.yml</code>，主题源码一行没碰。</p><p><strong>页脚也跟着换血。</strong> 页脚那 8 个位置里，有 4 个（<code>Ethan.Tzy</code> / 小染Blog / 初柒工坊云 / Leonus）都在这份失联名单里，索性换成了「广告位招租」的占位图（<code>ad.webp</code>），保留的 4 个是 Fomalhaut🥝 / Butterfly / Akilarの糖果屋 / 安知鱼 —— 8 格的排版没变，只是不再挂打不开的链接。</p><h2 id="三十三、侧栏多了日历和倒计时两张卡">三十三、侧栏多了日历和倒计时两张卡</h2><p>侧栏原来有一张「通讯录」卡，下面是公告栏。这次在公告栏<strong>上面</strong>插了两张自绘卡片（<code>themes/fomalhaut/layout/includes/widget/index.pug</code> 里把 <code>card_top_self</code> 从公告栏下方挪到上方，文章页和非文章页两个分支都改了）：</p><ul><li><strong>日历卡</strong>：「日历加载中…」占位之后换成「第 39 周 周四 / 01 / 2026 年 10 月 第 274 天 / 丙午马年 八月廿一」，下面跟一张当月迷你月历（今天高亮，表头是「日一二三四五六」）；</li><li><strong>倒计时卡</strong>：「距离春节 / 128 / 2027-02-06」，再加本年、本月、本周三条进度条（含「还剩 N 天」）。</li></ul><p>两张卡都是纯前端算的：<code>source/js/aside-calendar.js</code>（13795 字节）加 <code>source/css/aside-calendar.css</code>（6370 字节），卡片定义挂在 <code>source/_data/widget.yml</code> 里，每 60 秒重算一次 —— 跨零点会自动换日、换月历。周数按 ISO 口径（当年第一个周四所在的那一周算第 1 周），农历那行走 <code>lunar.js</code> 的 <code>solar2lunar()</code> 和 <code>calendarFormatter.lunar2solar()</code>，哪天农历库没加载进来，也只是少一行字，不会整张卡报错。</p><p><strong>这里有个我记了很久的坑：不能拿 <code>innerHTML</code> 直接覆盖卡片容器。</strong> <code>widget.yml</code> 里的 HTML 是这样写的：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;cal-skeleton&quot;</span>&gt;</span>日历加载中…<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/css/aside-calendar.css&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;/js/aside-calendar.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p><code>innerHTML = ...</code> 一执行，<code>&lt;link&gt;</code> 就从 DOM 里被摘掉了，样式表随之失效 —— 之前怎么改都不生效，就是栽在这儿。所以脚本里用 <code>mount()</code> 只替换挂载节点（优先 <code>.cal-skeleton</code>，其次 <code>[data-cal-mount]</code>，都没有才追加一个新盒子），<strong>容器本身永远不动</strong>。调试时也能直接调：<code>fomalAsideCalendar.compute()</code> / <code>.setNow(new Date(2026, 9, 1, 21, 0, 0))</code> / <code>.renderAll()</code>；<code>source/cal-test/index.html</code> 是留给它的预览页。</p><p>另外按要求把侧栏的「通讯录」（友链）卡隐藏了：<code>_config.fomalhaut.yml</code> 里 <code>aside.card_friend_link.enable: false</code>。要注意 <code>hexo server</code> 只在启动时读主题配置，运行期改了不会重新渲染，所以 <code>aside-calendar.css</code> 末尾补了一条兜底 <code>#aside-content .card-friend-link &#123; display: none &#125;</code> —— 重启之后卡片本身不再输出，这条规则就自动变成空转。</p><h2 id="三十四、202-张图，一个文件">三十四、202 张图，一个文件</h2><p>画廊的「一些好看的图片」这个页面，之前是用很蠢的办法分页的：<code>photo/</code> 目录下 <code>p2.md</code> 到 <code>p17.md</code> 一共 17 个文件，每个文件里手写 12 张图、末尾再手写「上一页 / 下一页」的链接；壁纸页也一样，风景、萌宠、手机三个入口各是一个文件。加一张图要翻到对应那一页，改页码要连着改好几个文件。</p><p>现在改成：<strong>一个相册只有一个 markdown 文件</strong>，图片按顺序一行一张往下贴，分页交给构建期生成。front-matter 里写一行 <code>gallery_per_page: 12</code> 就够了，<code>hexo generate</code> 的时候 <code>scripts/gallery-pager.js</code> 把这个页面按 12 张一页切开，生成 <code>index.html</code>、<code>p2.html</code>、<code>p3.html</code>……；翻页条直接用主题自带的 <code>paginator</code> helper（<code>prev_text</code> / <code>next_text</code> / <code>mid_size</code> 与首页列表页逐字一致），不手写一个 <code>&lt;a&gt;</code>。</p><p>几个细节值得记一笔：</p><ul><li><strong>旧链接不 404。</strong> <code>p2.html</code>～<code>p17.html</code> 这些路径名不变，只是内容从「你手写的那一页」变成「按顺序数的第 N 页」，站外引用的老链接照样能打开。</li><li><strong>想按主题分段，加一行注释就行。</strong> 在交界处写 <code>&lt;!-- pagebreak --&gt;</code>，生成器就地断页。</li><li><strong><code>scripts/</code> 目录不被 hexo server 监听。</strong> 新增或修改 <code>gallery-pager.js</code> 之后必须重启 hexo server，否则页面会退化成「所有图片挤在一页、没有翻页条」—— 不报错、不空白，只是静悄悄没生效。</li></ul><p>photo 现在是 202 张图一个文件、17 页；壁纸 54 张、5 页。</p><h2 id="三十五、画廊大厅的两张卡片居中">三十五、画廊大厅的两张卡片居中</h2><p>画廊首页就两张卡片（封面专区 / 背景专区），一直靠在左边，右边空一大块。查下来靠左不是配置项，而是主题样式写死的：</p><figure class="highlight styl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">figure</span><span class="selector-class">.gallery-group</span> &#123; <span class="attribute">float</span>: left; <span class="attribute">width</span>: <span class="built_in">calc</span>(<span class="number">50%</span> - <span class="number">8px</span>) &#125;</span><br></pre></td></tr></table></figure><p><code>float: left</code> 把两张卡片按 50% 宽度往左推，行尾自然空一半。主题源码能改，但主题一升级就丢，所以放在 <code>_custom/custom.css</code> 里覆盖：容器改成 flex + <code>justify-content: center</code>，卡片 <code>float: none</code>，宽度顺手从 50% 收到 <code>calc(33% - 11px)</code>，窄屏再退回两列。</p><h2 id="三十六、「休闲」栏目下线">三十六、「休闲」栏目下线</h2><p>三个要求是一起做的：删掉休闲下的影院子页面、把休闲里的「八音盒」改名「影音」并挪到八宝箱第一个、然后整个休闲栏目拿掉。</p><p>改动落在 <code>_config.fomalhaut.yml</code> 的菜单表里：删掉「休闲」父项与「影院」子项；「八音盒」改名「影音」、<code>/life/music/</code> 路径不动、整体上移到八宝箱首位；<code>source/life/music/index.md</code> 的 <code>title</code> 跟着改；<code>source/life/movies/</code> 整目录删除（原来那页 193 行）。改完还要手工清一次 <code>public/life/movies/</code> —— 源目录删了，产物还在。</p><h2 id="三十七、归档页不要侧栏，宽屏页面收窄">三十七、归档页不要侧栏，宽屏页面收窄</h2><p>两件跟宽度有关的事。</p><p>一是<strong>归档页的右侧栏</strong>：<code>_config.fomalhaut.yml</code> 第 947 行 <code>aside: archive: false</code>，归档页不再输出侧栏，正文占满。归档页本来就是按年翻列表，侧栏那些卡片基本用不上。</p><p>二是<strong>给非首页的独立页面加了个宽度上限</strong>：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">id</span>=<span class="string">&quot;pageWidthLimit&quot;</span>&gt;</span><span class="language-css"><span class="selector-class">.layout</span><span class="selector-pseudo">:has</span>(<span class="selector-id">#page</span>),<span class="selector-class">.layout</span><span class="selector-pseudo">:has</span>(<span class="selector-id">#archive</span>),<span class="selector-class">.layout</span><span class="selector-pseudo">:has</span>(<span class="selector-id">#tag</span>),<span class="selector-class">.layout</span><span class="selector-pseudo">:has</span>(<span class="selector-id">#category</span>)&#123;<span class="attribute">max-width</span>:<span class="number">1200px</span>&#125;</span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><p><code>:has()</code> 正好能表达「页面里含 <code>#page</code>（独立页）/ <code>#archive</code> / <code>#tag</code> / <code>#category</code> 时收窄到 1200px」，首页和文章页不受影响；窄屏下 <code>max-width</code> 本来就不起作用，自动铺满。之前 27 寸屏上这些页面能拉到 1900px 以上，一行字 200 多字符宽，看着很累。</p><h2 id="三十八、友链卡片的写死高度">三十八、友链卡片的写死高度</h2><p>友链页的卡片高度原来是写死的 —— 写死那会儿整页宽度是 1400px，后来页面收窄到 1200px，卡片变窄而高度不变，于是每张卡片都显得又高又瘦、图片上下留白。</p><p>现在把高度交给图片自己撑：<code>.site-card:not(.mini-link) &#123; height: auto !important &#125;</code> + <code>.site-card .img &#123; height: auto !important; aspect-ratio: 16 / 10 &#125;</code>。16:10 是原来那批截图的固有比例，宽度怎么变高度自动跟着走，一行 5 / 4 / 3 / 2 张四个断点都不用再调数字。顺手把悬停缩放也定了：<code>.site-card:hover .img &#123; scale: 1.02 !important &#125;</code>。</p><h2 id="三十九、美化面板多了「三、字体设置」">三十九、美化面板多了「三、字体设置」</h2><p>美化面板加了一节「三、字体设置」，分两组：常规字体 7 款（霞鹜文楷 Screen / 霞鹜文楷 / 霞鹜新晰黑 / 思源宋体 / 筑紫 A 丸 2.0 / 汉仪唐美人 / 甜甜圈海报）加一个「系统默认」，代码块字体 4 款（Monaco / Consolas / Maple Mono / Hack）。</p><p>最值得说的是<strong>为什么代码字体要单独立一个变量</strong>：主题只给 <code>#article-container pre/code</code> 设了等宽字体，文章区之外的行内 <code>code</code>（侧栏、卡片、通知里的那些）根本不受影响。所以新加了 <code>--code-font</code>，并在 <code>custom.css</code> 里补一条覆盖面更广的规则：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pre, <span class="selector-tag">code</span>, <span class="selector-tag">kbd</span>, <span class="selector-tag">samp</span> &#123; <span class="attribute">font-family</span>: <span class="built_in">var</span>(--code-font, Monaco_1), <span class="built_in">var</span>(--global-font), <span class="string">&quot;Microsoft YaHei&quot;</span>, … &#125;</span><br></pre></td></tr></table></figure><p>面板里点一下，JS 只做 <code>document.documentElement.style.setProperty('--code-font', name)</code>，全站代码字体当场切换，选择记在 localStorage。</p><p>另一个坑是<strong>系统默认字体在 Windows 上其实是「四个字都不同」</strong>：原来那档的字体栈只写了 <code>-apple-system</code>，macOS 认，Windows 不认，于是 <code>font-family: var(--global-font)</code> 的元素（左上角站点名、首页大标题、副标题、作者名）直接掉到浏览器默认字体上 —— 我把 Chrome 的标准字体设成霞鹜文楷，那几个标题就变成楷体了。现在补成完整系统栈（<code>-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Lato, Roboto, 'PingFang SC', 'Microsoft JhengHei', 'Microsoft YaHei', sans-serif</code>），顺手把混进正文栈的 Consolas 拿掉。</p><p>字体名、<code>@font-face</code>、面板按钮 id（<code>swf_</code> / <code>swfc_</code> 加字体名）三处是一一对应的，改名要一起改。这次重命名了三个（汉仪唐美人、甜甜圈海报、筑紫 A 丸 2.0），下架了两个（MiSans、优设好身体）；存量访客 localStorage 里的旧值会在打开面板时被白名单清掉，回落到默认。</p><h2 id="四十、摸鱼牌开始认法定节假日">四十、摸鱼牌开始认法定节假日</h2><p>页脚那块「摸鱼牌」，以前按周末判断，现在按<strong>国务院的放假通知</strong>判断：休息日显示「放假啦，光明正大地摸鱼～」，工作日显示「上班偷偷摸鱼，别被发现～」。</p><p>数据用的是 holiday-cn 那份（只记录法定放假日与调休上班日，其余按周末算）：2024~2026 直接内置在 <code>fomal.js</code> 的 <code>HOLIDAY_TABLE</code> 里，离线也能算对；2027 年以后自动从 jsDelivr 拉一份当年的 JSON，按年缓存在 localStorage；拉不到就退回「周末即休息日」，不让页脚因为一个接口挂掉。</p><p>副作用是<strong>调休终于正常了</strong>：假期前那个调休上班的周末会显示上班，假期里的周末显示放假 —— 之前那种「今天是周六所以显示放假，实际却要去上班」的错位没有了。</p><h2 id="四十一、侧栏日历：农历、节气、日出日落">四十一、侧栏日历：农历、节气、日出日落</h2><p>侧栏那两张卡这两天又长了一圈。</p><p>日历卡除了月份和当天，现在还有：ISO 周数（第 39 周）、农历日期（丙午马年 八月廿一）、当月迷你月历（今天高亮），以及两条小字 —— 下一个节气（「N 天后是霜降」，当天就显示「今天就是霜降」）和当天的日出日落时刻（☀️06:32 / 🌙18:07）。</p><p>日出日落是按访客位置现算的：优先用定位拿到的经纬度，拿不到就按访客时区推一个经度，再兜底到站长的纬度，用一套标准天文公式（儒略日 + 太阳赤纬 + 时角）算，两极那种算不出来的情况直接不显示。</p><p>倒计时卡加了本周 / 本月 / 本年的进度条与剩余天数，目标（现在是春节）支持按农历或公历指定。</p><p>还有一个默认行为要说明：<strong>只要访客没手动切过深浅色，这两张卡就会按真实日出日落自动切日夜模式</strong>；访客自己点过暗黑模式按钮之后就再也不会动它 —— 尊重手动选择优先。</p><p>实现上踩的坑也记一下：渲染结果必须塞进卡片里的一个<strong>挂载节点</strong>，不能 <code>innerHTML</code> 整个卡片。因为 <code>widget.yml</code> 里的 html 带着 <code>&lt;link rel=&quot;stylesheet&quot;&gt;</code> 和 <code>&lt;script&gt;</code>，它们都是 <code>.item-content</code> 的子节点，一旦被覆盖掉，<code>&lt;link&gt;</code> 从 DOM 里移除、样式表按规范失效 —— 症状就是「CSS 完全不生效」。</p><h2 id="四十二、天文馆：旅行者号现在飞到了哪里">四十二、天文馆：旅行者号现在飞到了哪里</h2><p>八宝箱新增一个「天文馆」，里面是一张全屏的交互式太阳系星图：八颗行星的实时相对位置，加上两艘已经飞出日球层的探测器。鼠标移到任意天体上看数据，拖下方的时间条能看它们 80 多年的运动，切到「立体」还能把整个太阳系转起来。</p><p>页面是独立的 <code>voyager.html</code>（自带样式和脚本，在 <code>_config.yml</code> 里 <code>skip_render</code> 掉），用 iframe 嵌进文章页。两个小机关：</p><ul><li><strong>iframe 自己长高。</strong> 图表高度是动态的，子页面用 <code>postMessage</code> 发 <code>voyager-height</code>、父页面收到就改 <code>iframe.style.height</code>；反过来父页面在 DOMContentLoaded、load、以及 1.5 秒后各发一次 <code>voyager-ping</code> 主动问一次 —— 只做一边，慢网络下就会留一截滚动条。</li><li><strong>配色跟着站点主题走。</strong> 底色不是写死的，而是 <code>color-mix(in srgb, var(--theme-color) 5%, #0d0d0d)</code> 从站点主题色派生 —— 换主题色，这一页的整体色调跟着变。</li></ul><p>页面上「发射时 470 W / 每年衰减约 4 W」、旅行者 1 号 3.567 AU/年、2 号 3.246 AU/年，以及「40.5 AU 外回头拍的暗淡蓝点」，都是算距离用的常量，不是随手写的文案。</p><h2 id="四十三、给博客安了一个-AI-页面助手">四十三、给博客安了一个 AI 页面助手</h2><p>右侧按钮列多了一个小鲸鱼，点开是「页面助手」：能读当前这一页的正文，回答跟这一页有关的问题；问「这个页面讲了什么」，它会先一句话概括、再列 3-5 条要点。</p><p>调用的是 DeepSeek 的接口，流式返回，字是边生成边出来的。几个设计上的取舍：</p><ul><li><strong>Key 不进仓库。</strong> 配置里 <code>api_key</code> 留空，改读站点根目录的 <code>.ai-chat-key</code>（已加 .gitignore）。</li><li><strong>上下文按页分桶。</strong> 对话历史存在 localStorage，但键里带页面路径 —— 文章页聊的和关于页聊的互不干扰，各自记 12 轮；本页正文最多 32000 字进上下文（超长文章取开头 60% + 结尾 35%，中间省略的部分只把小节标题给模型，让它直说「这段我没看到」而不是猜），面板底部实时显示「上下文 ≈ N 字 · 本页 N 字（全文 N，取了开头和结尾） + 对话 N 条」。</li><li><strong>面板可以拖着改大小。</strong> 右下角手柄缩放，尺寸记在 localStorage，不满意一键复位；手机上自动收成窄面板。</li><li><strong>超时保护。</strong> 「首字迟迟不来」和「中途卡住不再吐字」都算超时（每收到一段就重新计时），提示「N 秒没收到回复，稍后重试」；接口报错也有对应的中文提示，不把原始错误甩给访客。</li><li><strong>不依赖任何前端库。</strong> 按钮、面板、样式全部运行时创建，不用 jQuery、不用 Vue —— 上次刚把 905KB 的 Element-UI 请出去，没必要为了一个聊天框再请回来。</li></ul><h2 id="四十四、又是两个「静默失效」的-bug">四十四、又是两个「静默失效」的 bug</h2><p>这轮又逮到两个不报错、但确实已经坏了的功能。</p><p><strong>一是首页「小冰磁贴」点进去跳到外站。</strong> 首页顶部那一排短链接（🍡 小Fの算法学习笔记 等）和末尾的「查看更多…」，点下去跳的是 <code>www.fomal.cc</code>，也就是生产站自己 —— 本地预览时一跳就出去了。原因是插件 <code>hexo-magnet-fomal</code> 拼 HTML 时把 <code>config.url</code> 硬拼在 href 前面，而它没有任何「链接前缀」配置项；直接改 <code>node_modules</code> 又会在下次装依赖时丢掉。最后在站点根 <code>scripts/</code> 里加了个补丁：用 <code>after_render:html</code> 过滤器，只把 <code>class=&quot;magnet_link&quot;</code> / <code>&quot;magnet_link_more&quot;</code> 的链接就地改成站内相对路径 —— canonical、og:url、sitemap、分享链接这些该绝对的地方一律不碰。</p><p><strong>二是首页轮播「有时候图片出不来」。</strong> 具体是站内跳转回首页（pjax 往返）之后，轮播绕回那一下图片区域是空的，直接刷新首页反而正常 —— 所以是「有时候」。链条捋下来是三方时序问题：主题开了懒加载，图片 <code>src</code> 被换成占位图、真图放在 <code>data-lazy-src</code>，靠 <code>main.js</code> 里一个 <code>LazyLoad</code> 实例在登记的时候填回去；pjax 完成时主题先重新执行一遍轮播脚本（新建 Swiper），紧接着<strong>同步</strong>调了一次 <code>lazyLoadInstance.update()</code> —— 而 Swiper 的循环克隆 <code>swiper-slide-duplicate</code> 是在构造之后才插进 DOM 的，克隆永远晚于那次 update，于是循环到克隆位就没图。修法是在页面加载完成、pjax 完成、以及 <code>MutationObserver</code> 观察到轮播 DOM 变化之后，各补一次 <code>update()</code>。刷新不复现的原因也清楚了：正常加载时 defer 脚本先跑，LazyLoad 构造时克隆已经在 DOM 里。</p><h2 id="四十五、APP-下载链接换源，右键模式按钮有了状态">四十五、APP 下载链接换源，右键模式按钮有了状态</h2><p>两件小事收尾。</p><p>公告栏里「APP 下载」的链接原来指向缤纷云的对象存储，换成了 unpkg 上的 <code>fomalhaut1998_picgodemo@latest/Fomalhaut.apk</code> —— 应用包跟着 npm 包走版本，两边不用手动对齐，顺手把链接两侧的 🍧 去掉了。</p><p>侧栏「右键模式」按钮以前点一下会弹通知告诉你切成了哪种模式，但按钮本身看不出当前状态。现在给它加了状态显示：开启时跟随主题色，关闭时变成灰色底加一条 45° 斜杠，<code>title</code> 也会写清楚当前是站内右键还是系统右键。状态源和 <code>fomal.js</code> 里那份 localStorage 是同一个键，包装了 <code>changeMouseMode()</code> 在切换时同步刷新，pjax 换页后会重新应用一次。</p><h2 id="四十六、统计页：三张图不再用别人的蓝色">四十六、统计页：三张图不再用别人的蓝色</h2><p>网站统计页（<code>/site/census/</code>）是拼起来的：上方 51LA 的实时访客与总访问量、中间 GitHub 贡献日历、下面百度统计的三张图（访客地域分布 / 访问趋势 / 来源构成）。这一轮把这一页整个翻新了一遍，起因是两个毛病。</p><p><strong>一是样式被当成了页面摘要。</strong> 原来整页的样式全写在这个 markdown 文件里，而 Hexo 会把页面开头那一段当摘要塞进 <code>&lt;meta name=&quot;description&quot;&gt;</code> —— 搜索引擎和分享卡片拿到的是一坨 CSS。现在样式整段挪进 <code>source/css/census.css</code>（383 行），页面只留结构：外层 <code>div.census</code>，每个板块一个 <code>section.census-sec</code>，标题用 <code>.census-sec__head / __icon / __text / __title</code> 拼出来。</p><p><strong>二是三张图用的是别人的蓝色。</strong> 地图主色是写死的 <code>'rgba(128,255,165)'</code>、趋势线 <code>'rgba(1,191,236)'</code>、无数据省份底色 <code>'rgb(230,232,234)'</code> —— 美化面板换主题色，这三张图一动不动。现在加了 <code>censusRgbToHsl()</code>（读 <code>--theme-color</code>，支持 <code>rgb()</code> 和 <code>#hex</code> 两种写法）配 <code>censusHsl(h,s,l)</code>：把主题色转到 HSL，钳住饱和度（30–92）和明度（30–78），再生成一串同色相、不同深浅的色阶，地图四档（主色 / 浅色调低值 / 深色调悬浮 / 无数据省份底色）都从这串色里取。深色模式另走一套判断（<code>censusIsDark()</code> 看根元素的 <code>data-theme</code>）。</p><p><code>census.js</code> 从 449 行长到 579 行，多出来的基本都是配色与两套主题的分支。</p><h2 id="四十七、-tags-的标题变成了胶囊，图表跟着主题色走">四十七、/tags/ 的标题变成了胶囊，图表跟着主题色走</h2><p>文章统计页（<code>/tags/</code>）那三张 echarts 是主题的 helper 生成的：标题直接输出成 <code>&lt;center&gt;&lt;font size=&quot;4&quot;&gt;标题📃&lt;/font&gt;&lt;/center&gt;</code>，配色写死在主题脚本里（<code>themes/fomalhaut/scripts/helpers/hexo_echarts.js</code> 里的 <code>#425aef</code>）。</p><p>改的原则还是<strong>不动主题</strong>：新增 <code>source/css/stats.css</code>（269 行）与 <code>source/js/stats.js</code>（430 行）。样式全部挂在 <code>#page:has(#posts-echart)</code> 底下 —— 整个站只有这一页有那个 id，所以规则不会漏到别的页面去；浏览器不支持 <code>:has()</code> 时整块失配、页面退回原样，属于渐进增强而不是渐进破坏。</p><p>JS 做两件事：把 <code>&lt;center&gt;</code> 那个标题拆成「图标胶囊 + 标题 + 说明」，让排版和站内其他页面统一；再取主题内联脚本里暴露的全局 <code>postsChart / tagsChart / categoriesChart</code>，按 <code>--theme-color</code> 重新 <code>setOption()</code> —— canvas 背景置空（让卡片自己的底色透出来）、网格线和图例跟明暗模式走。触发时机三个：首屏、<code>pjax:complete</code>、以及主题色或明暗变化时。页面上找不到 <code>#posts-echart</code> 就直接返回，不做任何事。</p><h2 id="四十八、朋友圈：59-行变-528-行，只为一面卡墙">四十八、朋友圈：59 行变 528 行，只为一面卡墙</h2><p>朋友圈页原本是主题自带的列表样式，这次换成了网格卡片（内部叫「方案 A · 网格卡」）：59 行 → 528 行。</p><p>规矩和上一轮一致：<strong>全部落在页内内联的 <code>&lt;style&gt;</code> / <code>&lt;script&gt;</code> 里，主题源码一行没改</strong>。配色不用写死的颜色，一律 <code>color-mix(in srgb, var(--theme-color) X%, transparent)</code> 从主题色派生，也刻意不覆盖朋友圈引擎自己的 <code>--heo-*</code> 变量 —— 引擎升级时这套样式不至于把它的布局打散。</p><p>两个细节是不得不动 JS 的：圆形头像在引擎输出里带着一圈「灰色残缺弧」（图片本身被裁过），用 <code>clip-path</code> 裁成圆把残边压掉；引擎输出里没有「来源域名」这个字段，所以底部补了一小段脚本注入「域名 + favicon」角标，顺手把顶部那几个统计数字填上。<strong>纯 CSS 拿不到的东西，才允许动用脚本。</strong></p><p>三个候选方案都留了对比页（<code>bak/2026-10-03-朋友圈改版/朋友圈改版预览-三版对比.html</code>）。</p><h2 id="四十九、友人帐：数量角标是-CSS-数出来的">四十九、友人帐：数量角标是 CSS 数出来的</h2><p>友人帐那一页这次从 79 行写到了 302 行，改版的重点是卡片和配色，但我觉得最有意思的是那三处数字。</p><p>页面上要显示三种计数：每个分类标题上的「N 位」、每个分组那一排卡片的总数、以及页脚那行「— 共 N 位朋友 · M 个分类 —」。这三处<strong>没有一行 JS，也没有构建期统计</strong>，全是 CSS 计数器数出来的：<code>counter-reset: fklall fklcat</code> 开在容器上，每个分类 <code>counter-increment: fklcat</code>，每张卡片 <code>counter-increment: fklall fklcard</code>，然后 <code>content: counter(fklcard) &quot; 位&quot;</code>、页脚 <code>content: &quot;— 共 &quot; counter(fklall) &quot; 位朋友 · &quot; counter(fklcat) &quot; 个分类 —&quot;</code>。好处很直接：构建完就是死的静态文本，pjax 换页不用重算，也不用担心 JS 出错时数字消失。代价是计数器的重置点要写在正确的位置上 —— 每个托盘的 <code>counter-reset</code> 必须挂在那组 <code>site-card-group</code> 上。</p><p>配色是一个变量：<code>--fkl-accent: var(--theme-color, #39c5bb)</code>，卡片、悬停、角标都从它派生。</p><p>顺手修掉两个旧毛病：悬停时是「青字配蓝底」（对比度很差），改成白字主题色药丸；页脚的「推荐友链」原来不足四个、里面还夹着我自己的卡片，现在补足 4+4 并把「0.推荐网站🍔」整组从我自己的友链数据里删掉（<code>source/_data/link.yml</code> 1131 → 1121 行）。</p><h2 id="五十、八宝箱导航：四版迭代，78-个站点">五十、八宝箱导航：四版迭代，78 个站点</h2><p>八宝箱（网址导航）这一页从 98 行长到 381 行，最后是六个分类、78 个站点，原来的三个分类（算法之家 / 实用工具 / 上帝之眼）重新拆成了 AI 助手与评测 / 博客托管 / 图床服务 / 知识社区 / 实用工具 / 仰望星空。</p><p>卡片从「大截图」换成「圆形头像 + 标题 + 两行描述」的小卡 —— 和友人帐的小卡同源，两页看起来是一套东西。原来的站点大截图不删，只给 <code>display: none</code>：配合主题的 lazyload，它连下载都不会发生，等于白省流量。</p><p><strong>图标全部自托管。</strong> 78 个图标（<code>.png / .ico / .svg / .jpg</code>）一起进了 <code>source/box/nav/icons/</code>。外链 favicon 一是慢、二是经常被墙，本地化之后这一页的打开速度是整个站里最快的之一。</p><p>四个版本的过程也都留着以备回看：v1「算法之家版」353 行 → v2 427 行 → v3 373 行 → v4 380 行（定稿）。改到第三版才想明白：真正要改的不是「再加一类站点」，而是先把卡片的信息密度降下来。</p><h2 id="五十一、公告卡调了八版">五十一、公告卡调了八版</h2><p>侧栏那张公告卡这一轮前后改了八个版本，最后定型是「主线路 / 备用线路 / 手机 App」三段式：线路做成可点的胶囊（<code>hover</code> 时填主题色、白字），右侧用一行淡色小字标部署平台（Vercel / Netlify / Cloudflare / Render），手机 App 那行是一个下载按钮 + 内联 svg 图标 + 「3.3 MB」的说明。</p><p>八个版本大致分两类：<strong>前两版在改结构</strong> —— v2 还是老写法（<code>&lt;center&gt;</code> + <code>class=&quot;anno_content&quot;</code> + <code>&lt;font color&gt;</code>），v3 和 v4 换成了 <code>a-row / a-chip</code> 的胶囊结构，但标签还叫「线路一 / 备用」，并且多带一行「已运行 N 天 · 文章 N 篇 · 线路 4 条」的元信息（后来觉得这一行和侧栏资讯卡重复，砍掉了）；<strong>后面五版都在改 CSS</strong> —— 换行、收窄以配合评论区样式、加宽、侧栏 360px、侧栏 380px，最后让它填满。</p><p>配色的核心是「浅色压深、深色提亮」：主题色在浅底上对比度不够，所以浅色模式下把它压到 62% 的明度（<code>#25706b</code>），深色模式下提亮到 78%（<code>#7fe3da</code>）。</p><p>最后那个宽度问题交给容器查询：卡片更窄时（窗口变小、或者侧栏收窄）自动降一档，不用再去猜一个固定像素值。</p><h2 id="五十二、侧栏那张个人卡：玻璃、马克笔，和一个会看时间的状态">五十二、侧栏那张个人卡：玻璃、马克笔，和一个会看时间的状态</h2><p>侧栏第一张卡（<code>#aside-content &gt; .card-widget.card-info</code>，只作用于这一张，公告栏、最新文章、网站资讯那些卡片一律不受影响）这次做成了「磨砂玻璃 + 马克笔名字」。</p><p><strong>玻璃</strong>是在卡内加一层 <code>::before</code>：<code>backdrop-filter: blur(11px) saturate(1.45)</code> 加一个上浅下深的渐变，再用 <code>mask-image: linear-gradient(180deg, transparent 0, #000 22%)</code> 让最上面那一段变透明 —— 头像那部分于是露出卡片自己的背景图，像是压在玻璃底下。卡里所有内容都提到 <code>z-index: 1</code> 之上。</p><p><strong>名字</strong>用黄色马克笔高亮加一点微倾。位置这里踩了个坑：一开始用 <code>inline-block</code>，结果侧栏一宽，名字就被挤到头像右侧同一行、看着像贴在头像右下角。换成 <code>display: table; max-width: 100%; margin: .14em auto 0</code> —— 块级收缩盒，宽度还是跟着文字走，但一定另起一行、水平居中在头像正下方。深色模式下原来的白字压黄条对比度不够，改成墨字压黄条。</p><p><strong>状态</strong>是头像右下角那颗 28×28 的小圆点。它原来永远写死一句「🎯 专注学习中」，现在会看时间了：睡觉中 zzz 😴（23:00–07:00）、放假摸鱼中 🏖️（周末 + 法定节假日）、上班摸鱼中 🐟（工作日 07:00–18:00）、下班玩耍中 🎮（工作日 18:00–23:00）。四个状态按顺序判断、命中即停；判定表用的是和页脚摸鱼牌同一份 2026 年放假与调休数据，年份不在表里就退回「周末即休息日」。鼠标移上去时小圆点从 28px 展到 105px 把文字露出来，pjax 换页后重新应用，并且每 60 秒校准一次。</p><p>夜间模式这一块来回比过六种名字配色和两档玻璃模糊（<code>bak/card-redesign-20261003/</code> 里 18 张对照图），最后挑的就是上面这套。</p><h2 id="五十三、贡献日历的小方块终于圆了">五十三、贡献日历的小方块终于圆了</h2><p>统计页那块 GitHub 贡献日历，每一格原来是尖角的 <code>fillRect</code>。这次把方块改成 30% 圆角。</p><p>不能用 <code>ctx.roundRect</code>（部分浏览器还没有），所以写了个 <code>git_fillroundrect(ctx,x,y,w,h,r)</code> 用 <code>arcTo</code> 画路径兜底；半径取边长的 30%，超过半边长时自动退化成圆/胶囊，不会画出畸形的格子。调用处只换了函数名，颜色、坐标、悬停逻辑一行没动。<code>gitcalendar.js</code> 337 → 351 行。</p><h2 id="五十四、不蒜子换成-vercount，以及那个转不完的遮罩">五十四、不蒜子换成 vercount，以及那个转不完的遮罩</h2><p>这两件事都落在「访客计数」这条链上。</p><p><strong>换源</strong>：文章页脚那行访问量原来由不蒜子提供（<code>busuanzi.ibruce.info</code>），多地访问不稳定，现在换成 vercount（<code>events.vercount.one</code>）：<code>preconnect</code> 换掉、脚本源换掉、文章页的 PV 位置补一个「—」占位。顺带把加载期的转圈图标删了 —— 数还没来的时候显示「—」比转一个圈更诚实。之前为了让不蒜子不阻塞渲染而做的「脚本搬到底部异步加载」补丁，换源之后也就不需要了，一并撤掉。</p><p><strong>遮罩 bug</strong> 是用户先发现的：进 <code>/tags/</code> 再点别的页面，页面会整份刷新，而且加载遮罩一直转。根因在主题的 pjax 配置里 —— <code>pjaxSelectors</code> 写死了三个只存在于 <code>/tags/</code> 的选择器（<code>#tag-echarts</code> / <code>#posts-echart</code> / <code>#categories-echarts</code>）。pjax 每次换页都要比对新旧页面的选择器数量，数量不等就抛错：<code>DOM doesn’t look the same on new loaded page: '#tag-echarts' - new 0, old 1</code>。这个异常被上层捕获后只触发 <code>pjax:error</code>、<strong>不触发 <code>pjax:complete</code></strong>，而关遮罩的 <code>preloader.endLoading()</code> 恰好挂在 <code>pjax:complete</code> 的最后一句 —— 于是错误分支里页面被强制整份跳转，遮罩却没人关，一直转。</p><p>修法是运行期把这三个选择器从 <code>selectors</code> 里摘掉（那张图仍然由 <code>'#body-wrap'</code> 那一项重新执行，不会漏图），再用访问器接住 <code>window.Pjax</code> 的每次赋值、把滤镜包一层，防止主题在换页后把列表还原回去。兜底三处：<code>pjax:send</code> 后 6 秒还没 <code>complete</code>、<code>pjax:error</code>、从 bfcache 恢复，都强制 <code>endLoading()</code>。回滚只要删掉这个文件和配置里那一行。</p><h2 id="五十五、Twikoo-评论区跟着主题色走了">五十五、Twikoo 评论区跟着主题色走了</h2><p>评论用的是 Twikoo 2.x（<code>registry.npmmirror.com</code> 上的 <code>twikoo.all.min.js</code>，评论卡片宽度与头像那部分本来就在 <code>custom.css</code> 里单独调过）。原样能跑，但和站内卡片的语言对不上，所以新增 <code>source/css/twikoo.css</code>（656 行）做了一层美化。</p><p>两个原则。<strong>一是只写 <code>.tk-*</code> 类名</strong> —— Twikoo 1.x 那批 <code>.el-*</code> 类完全不动，以后升级 Twikoo 也不会被这套样式拖住。<strong>二是配色不写死</strong>：主色就是 <code>--tk-accent: var(--theme-color)</code>；按钮这种实心场景需要更深的底，用 <code>hsl(from var(--tk-accent) h s 30%)</code> 把明度直接压到 30% —— 因为满饱和度的主题色（默认 <code>#39c5bb</code>）在白底上对比度只有 2.1，按钮文字根本看不清。每个用 <code>color-mix()</code> 的变量前面都留一行 <code>rgba(...)</code> 回退值，老浏览器不至于整块失效。</p><h2 id="五十六、把打赏关掉，页脚补上「听点音乐」">五十六、把打赏关掉，页脚补上「听点音乐」</h2><p><strong>打赏暂停。</strong> 微信和支付宝两张收款二维码从「关于」页撤下，文章底部的「投喂作者」按钮也一起关掉（配置里 <code>reward</code> 关）。关于页原来那段「投喂方式」的 tab 换成一段说明：投喂栏目 2022-12-7 开启，此前的所得都用在建站上，历史投喂名单继续保留在下面。</p><p><strong>页脚多了「听点音乐」。</strong> 页脚那几行链接里，最后一行只放了「网站统计」一个，右半边空着 —— 因为 <code>custom.css</code> 里 <code>.ft-links li a</code> 写的是 <code>width: 50%</code>。补上「听点音乐」指向 <code>/life/music/</code>，两列刚好填满。</p><p>为什么用注入脚本（<code>source/js/footer-music.js</code>，40 行）而不是改主题：页脚那几行的链接是写死在 <code>footer.pug</code> 里的，主题的 <code>footer</code> 配置只有 owner / custom_text / copyright 三项，<code>inject</code> 也没有「注入到页脚内部」的位置。所以走脚本，带 <code>data-ft-music</code> 做幂等，pjax 换页后重补一次。</p><p>八音盒那页顺手补了内容：歌单来源（网易云「温柔治愈：所幸世上有光 总会相逢」，71 首）和四条热评（3227 / 6275 / 4.7 万 / 1.1 万赞）—— 只有一个播放器的页面太素了。</p><h2 id="五十七、版权卡里的链接不再是写死的域名">五十七、版权卡里的链接不再是写死的域名</h2><p><strong>症状</strong>：文章底部版权卡里的「文章链接」点下去会跳到 <code>www.fomal.cc</code>。主站上没问题，但从镜像线路或 <code>localhost</code> 打开时，它会把访客带回主域。</p><p><strong>根因</strong>在主题模板 <code>post-copyright.pug</code>：链接取自 <code>page.copyright_url</code> 或 <code>page.permalink</code>，再交给 hexo 的 <code>url_for</code> —— 而 <code>url_for</code> 对 <code>http(s)://</code> 开头的地址是原样放行的，所以写死的绝对地址一路穿到页面上；主题的 <code>post_copyright</code> 配置只有 enable / author / license 那几项，没有「链接用相对还是绝对」的开关。</p><p><strong>改法</strong>是在渲染期只改版权卡里那一个 <code>&lt;a&gt;</code>：<code>scripts/post-copyright-local-link.js</code> 把 <code>href</code> 换成站内相对路径 <code>/posts/xxx.html</code>，显示文字也一起换；浏览器里再由 <code>source/js/inject/pc-local-link.js</code> 补上当前访问域名。canonical / og:url / sitemap / 分享按钮 / 图片 CDN 这些「本来就该绝对」的地方一律不碰。顺手还修了浅色主题下版权卡的配色。</p><h2 id="五十八、Service-Worker-的第二版：从「只换源」到「真的快」">五十八、Service Worker 的第二版：从「只换源」到「真的快」</h2><p>上一版 SW 的本意是给缤纷云的图加缓存，实际上只干了「换源」一件事，有两个 bug：</p><ul><li>版本号读的是 <code>db.read('blog_version')</code>，但 KV 里从来没有人写过这个键 —— 每次读出来都是空，缓存判断永远走不到，等于白装上；</li><li>拼缓存 URL 的 <code>fullpath()</code> 把查询串丢了，于是缤纷云的图片处理参数（<code>?w=400&amp;fmt=webp&amp;q=73</code>）全部失效，缓存下来的是原图。</li></ul><p>新版（177 行）把这两件事都补上了：站点版本改成 <code>index.html</code> 的内容哈希写进 KV，版本一变就清空资源缓存；查询串原样带到对象存储。另外只介入白名单域名 —— <code>TARGET_HOSTS = ['www.fomal.cc','fomal.cc','www.fomal.cn','fomal.cn']</code>，netlify / cloudflare / render / <a href="http://github.io">github.io</a> 那几个备用线刻意排除在外：它们本来就是「万一主域挂了」时的退路，不该被主域的缓存逻辑影响。</p><p>抓取策略：HTML 回源优先（拿不到再吃缓存），其余资源缓存优先、超过 TTL 后台静默校正一次，任何异常都回退到浏览器原始请求。<strong>SW 最忌讳的行为是「用户点不动页面」</strong>，所以每个分支的兜底都是「放行」。</p><h2 id="五十九、一天之内拆掉三座屎山">五十九、一天之内拆掉三座屎山</h2><p>这一天的后半程没再动界面，都在拆三个堆了很久的东西：<code>source/js/fomal.js</code>（13 万字节）、<code>_config.fomalhaut.yml</code>（2037 行）、<code>custom.css</code>（4124 行）。</p><p>原则先说清楚：<strong>能走配置就不改主题源码</strong>（<code>themes/</code> 下的 pug / styl / js 一个都没动）、每个阶段先做可校验的备份、所有新增和改动的代码都带中文块注释。分四步：</p><p><strong>P0 止血。</strong> 翻代码时发现，全站的 <code>console.log</code> / <code>warn</code> / <code>error</code> 早就被整体置空了 —— 当年大概是嫌控制台吵，于是这三年的脚本报错都被静音了。现在只静音 <code>log</code>，<code>error</code> 和 <code>warn</code> 永远保留，<code>?debug=1</code> 或在本地时 <code>log</code> 也照常输出。同时移走三个被一起发布的 <code>fomal.js.bak-*</code>（369KB 死 JS），并修掉 <code>gulpfile.js</code> 的 <code>compress</code> 任务没有 <code>return</code> 的问题（terser 还没写完，gulp 就退出了）。</p><p><strong>P1 拆 fomal.js。</strong> 2973 行单体 → 105 行主引导 + 10 个模块/数据文件：<code>data/voyager1.js</code>（114 行，旅行者号距离模型）、<code>data/holidays.js</code>（72 行，法定休息日 + 来年 CDN 拉取）、<code>modules/console-art.js</code>（100 行）、<code>modules/shell.js</code>（278 行）、<code>modules/effects.js</code>（253 行）、<code>modules/reading.js</code>（109 行）、<code>modules/nav.js</code>（217 行）、<code>modules/cursor.js</code>（670 行）、<code>modules/footer-time.js</code>（64 行）、<code>modules/settings.js</code>（1253 行，最大的一块）。<strong>不套 IIFE</strong> —— 主题模板里到处是内联 <code>onclick</code>，这些函数必须留在全局。验证：逐文件 <code>vm.Script</code> 编译、全局重名扫描、构建 368 个文件、浏览器四个页面零异常且 21 个全局入口全在。</p><p><strong>P2 把配置里的内联代码抽干。</strong> <code>inject</code> 段里塞了 26 段内联 <code>style</code> / <code>script</code>（约 647 行），抽成 <code>source/css/site-inject.css</code>（10 个样式块合并）和 <code>source/js/inject/</code> 下 6 个脚本，配置只留 <code>&lt;link&gt;</code> / <code>&lt;script src&gt;</code>，配置文件 2037 → 1482 行。抽的时候逐字比对、YAML 解析、构建 375 个文件，再用浏览器的注入探针验证：滚动锚点 70px、公告卡 70 条规则、侧栏 360px、翻页按钮圆角，全部命中。</p><p><strong>P3 整理 custom.css。</strong> 4124 → 3936 行（净删 341 行代码，另加 152 行文件头索引）。删的是真死代码：侧栏卡片动态渐变整段、一条 <code>order: 3px solid</code>（<code>border</code> 的笔误，浏览器本来就丢弃它）、没有人引用的 <code>@keyframes</code>、已经下线功能的整段（TianliGPT 189 行）、与无前缀版逐字相同的几个前缀 <code>@keyframes</code>，以及 42 条可以证明被更晚规则覆盖的前缀声明。判据是「只有较早那块声明的每个属性，都被同选择器的更晚块声明过，才可删」—— 11 组重复选择器里只有 1 条满足。</p><p>这一步的验证方式值得单独记：把改前改后的 CSS 分别挂进无头 Chrome，遍历 <code>document.styleSheets</code> 导出「媒体上下文 + 选择器 + 属性 = 值」的快照逐条比对 —— <strong>559 条 → 558 条，唯一差异就是那条 <code>order:</code></strong>。这种清理最怕「看起来删干净了」，而层层覆盖的样式单看文件根本数不清，只有让浏览器把最终生效的那份摊开给你看才算数。</p><p>文件头还写了 31 条分节目录、25 个媒体查询 / 19 个 <code>@keyframes</code> / 11 个 <code>@font-face</code> 的索引、6 条改动约定，以及 6 条「故意不改、只记录」的已知问题 —— 比如 <code>.settings input[type=&quot;checkbox&quot;]</code> 的 <code>transition</code> 漏了时长（本意大约 .2s），因为不动行为所以只留条记录。</p><h2 id="六十、AI-助手的-Key-挪到了服务端">六十、AI 助手的 Key 挪到了服务端</h2><p>前端那个 AI 页面助手，Key 原来放在站点根目录的 <code>.ai-chat-key</code> 里（不进 git）。只有站长自己在本机跑起来才用得上 —— 一旦想让访客也能用，Key 就不能再进浏览器。</p><p>于是新增了 <code>api/chat/completions.js</code>（171 行，部署在 Vercel 的 Serverless 函数）和 <code>vercel.json</code>：真 Key 只存服务端环境变量 <code>DEEPSEEK_API_KEY</code>，前端 <code>api_base</code> 改成同源 <code>/api</code>。顺带做了三件必要的门：来源白名单（默认 <code>fomal.cc / www.fomal.cc</code>，<code>*.vercel.app</code> 预览自动放行）、每 IP 每小时限流（默认 120 次）、以及 <code>max_tokens</code> 上限 8192、messages 最多 24 条、请求体上限 400KB。</p><p>用不用这套代理由构建期决定：<code>scripts/ai-chat-inject.js</code> 发现环境里有 <code>DEEPSEEK_API_KEY</code>，就把前端配置改成走 <code>/api</code>，否则保持本机直连 + 读 <code>.ai-chat-key</code>。同一个仓库、两种运行方式，不改配置。</p><p>接口也能自检：<code>GET</code> 一下会返回 <code>&#123;&quot;ok&quot;:true,&quot;mode&quot;:&quot;proxy&quot;,&quot;hasKey&quot;:true&#125;</code> 这一类的信息，部署对了没有一目了然。</p><h2 id="六十一、最后说两句">六十一、最后说两句</h2><p>回头看这次维修，我大概有这么几个感受。</p><p><strong>第一，老站的问题往往是&quot;你以为它在工作&quot;。</strong> MathJax 那个字段挂在配置文件里三年，主题从来没读过；Element-UI 拖着 905KB，实际只用了个 Toast；背景图那 4 个 CSS 变量干脆没有人定义过。这类问题不会报错，只会让你觉得&quot;网站好像有点慢，但也能用&quot;。</p><p>而且它们<strong>不是某天一起坏掉的，是一件一件慢慢失效的</strong> —— 今天死个 CDN，下周死个图床，隔几个月死个接口。每次只坏一点点，每次都不影响你读文章，于是就永远轮不到修。等哪天真的攒够了，你会以为是&quot;网站突然出问题了&quot;，其实是<strong>三年的账单一起到期</strong>。</p><p><strong>第二，判断性能不能只看单点。</strong> 换源之前我以为 CDN 就是瓶颈，结果一测发现<strong>我自己首页的 TTFB（693ms）比任何一个 CDN 都慢</strong>。省下来的那几百毫秒，可能还不如把 Vercel 的接入优化一下。做事要算总账。</p><p><strong>第三，AI 帮了大忙，但坑还是得自己踩。</strong> 这次 DeepSeek Harness 干了绝大部分体力活：翻遍 <code>fomal.js</code> 3800 行找到全部 14 处 Vue、逐个探测几十个 CDN 的存活和速度、写通知组件、跑构建验证、统计产物里的资源分布。<strong>这些活儿如果我自己干，大概是熬两个晚上。</strong></p><p>但有几个判断它替不了我：</p><ul><li>905KB 的 Vue 到底删不删 —— 删错了整个站的弹窗全没了，这个风险得我拍板</li><li>文章正文里出现 <code>cdn.staticfile.org</code> 到底是&quot;资源没换干净&quot;还是&quot;文章历史记录&quot;—— 它一开始也搞混了，把那些字样当成漏网之鱼，后来才想明白要看<strong>标签属性</strong>而不是全文匹配</li><li>最后要不要合并提交、什么时候部署</li></ul><p><strong>它会犯错，也会自我纠正；它给的结论要验证，但验证的成本比从头做低太多了。</strong></p><p><strong>不过，上面这些其实都还是第一轮。</strong> 9 月 30 号那晚算是急救 —— 把真正死了的东西找出来、换掉、验证。后面两天多则是我自己主动想改的：首页从 4×3 变回 3×3、图墙从 flex 换成 grid、菜单砍掉四个入口、相册从 17 个手写页面收成一个文件、侧栏添了日历和倒计时、还给博客塞了个 AI 页面助手。<strong>修坏掉的东西只是止损，改这些才是我当初搭这个站的原因。</strong></p><p><strong>第四，很多问题不是读代码读出来的，是量出来的。</strong> 图墙那段最典型：我一开始只知道「有时候一行排不满」，盯着 CSS 也看不出所以然。最后是把页面在 320 / 390 / 414 / 579 / 768 / 1280 六个宽度下各截一张图，一张一张数格子，才看清固定宽度的 flex 会在 579px 这种宽度上剩出 194px 的空档。<strong>这类问题只有截图和数字能证明，源码里找不到答案。</strong></p><p><strong>第五，静默失效也长在自己写的代码里。</strong> 换源那轮死的是外部依赖，这一轮的坑是自己埋的：首页轮播里 <code>lazyLoadInstance.update()</code> 比 Swiper 克隆节点早了一步，于是循环到克隆位就没图；用 <code>innerHTML</code> 整体覆盖卡片容器，把 <code>&lt;link&gt;</code> 从 DOM 里摘掉，样式表跟着失效；首页磁贴的链接被插件写死成绝对地址，点一下就跳出站。<strong>它们全都不报错，表现只是「有时候」「偶尔」「这里怎么没生效」。</strong> 两条教训收下：带 <code>&lt;style&gt;</code> / <code>&lt;link&gt;</code> 的容器永远别整体覆盖，只替换挂载节点；懒加载遇上会自己克隆节点的组件，<code>update()</code> 的时机要往后放。</p><p><strong>第六，也给自己留了退路。</strong> 这三天一共留下 57 组 <code>bak/</code> 备份目录，每组里是改动前的文件加一页回滚说明。改坏了不用翻 git 历史猜，把 <code>before__</code> 开头的文件覆盖回去就行 —— 对我这种经常在凌晨两点改 CSS 的人，这比什么技巧都重要。</p><p><strong>第七，顺手把这几天的数字记一下：</strong> 砍掉 905KB 的 Vue + Element-UI，换成 7KB 的自研通知；139 个友链条目体检，81 个失联搬进「失联友链」；相册从 17 个手写页面收成 1 个文件；美化面板从不能选字体变成 11 款（常规 7 + 代码 4）；侧栏多了两张卡；博客多了个 46KB、零依赖的 AI 助手，Key 存在 <code>.ai-chat-key</code> 里不进 git。<strong>全部改动的文件清单在文末，一共 154 条 —— 这篇记录本身，也从当初的十来节写到了 61 节。</strong></p><p><strong>第八，最贵的 bug 是不报告的那种。</strong> 拆 <code>fomal.js</code> 的时候才发现，全站的 <code>console.log / warn / error</code> 早就被整体置空了 —— 当年大概只是嫌控制台吵，结果是这三年里任何脚本挂掉，浏览器都安静得像什么都没发生。现在只静音 <code>log</code>，<code>error</code> 和 <code>warn</code> 永远保留，<code>?debug=1</code> 或者本地打开时 <code>log</code> 也照常输出。<strong>省掉几行噪音的代价，是三年看不见的错误。</strong></p><p><strong>第九，连记录自己都会写错日期。</strong> 这一天留下的备份目录里，有一批名字写的是 <code>20261004</code>、<code>20261005</code>，其实全都是 10 月 3 号建的 —— 另一个会话以为自己活在两天后。文件的修改时间不会骗人，名字会。所以前面那句「它给的结论要验证」，也包括验证它自己起的文件名。</p><p>要说还有什么意外，那就是<strong>连这份记录本身都出过 bug</strong>：旧时光那页交给 AI 顺手维护，它写漏了一个时间轴的闭合标记，结果那一整天的记录渲染成一堆没有日期的条目、编号从 1 重新开始 —— 是我自己打开页面觉得不对，才发现标记少了一个。所以前面那句话得再说一遍：<strong>它给的结论要验证，包括它替你写出来的文档。</strong></p><p>所以这次的经验大概就是：<strong>把&quot;翻文件、查资料、跑验证&quot;交给它，把&quot;要不要动、动到什么程度&quot;留给自己。</strong></p><hr><p>就这样，网站又续了几年命 🍬</p><p>如果这篇对你有帮助，或者你也发现自家站里藏着个 900KB 的巨物，欢迎在评论区聊聊 —— 说不定你的比我更离谱。</p><div class="note info no-icon flat"><p><strong>本文涉及的文件清单</strong>（都在 <code>[BlogRoot]</code> 下）：</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br></pre></td><td class="code"><pre><span class="line">_config.fomalhaut.yml                     <span class="number">26</span> 处改动（换源 <span class="regexp">/ preconnect /</span> 背景内联默认值 / jQuery 兜底）</span><br><span class="line">_config.yml                               skip_render 加 <span class="number">1</span> 行</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                        <span class="number">14</span> 处 Vue 替换 + 背景机制重写</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>notify.js                       新增 <span class="number">7150</span> 字节</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>jquery.min.js                   新增 <span class="number">89501</span> 字节（jQuery 兜底）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>winbox.bundle.min.js            新增（无国内源的本地化）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>tag-map/                        新增 <span class="number">5</span> 个文件</span><br><span class="line">scripts/tag-map-local.js                  新增 <span class="number">1369</span> 字节</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span>/sw.js             重写 <span class="number">98</span> 行</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>layout.pug  本地开发自动注销 SW</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/social/</span>fcircle/index.md            <span class="number">3</span> 处换源</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/_data/</span>link.yml                     <span class="number">2</span> 处换源</span><br><span class="line">bak<span class="regexp">/20260930-cdn-fix/</span>                     第一轮备份</span><br><span class="line">bak<span class="regexp">/20260930-optimize/</span>                    第二轮备份</span><br><span class="line">bak<span class="regexp">/20260930-swfix/</span>                       第三轮备份（Service Worker）</span><br><span class="line">bak<span class="regexp">/20260930-bgfix/</span>                       第四轮备份（背景图）</span><br><span class="line"></span><br><span class="line">（以下为 <span class="number">2026</span>-<span class="number">09</span>-<span class="number">30</span> 深夜追加的一轮）</span><br><span class="line"><span class="keyword">package</span>.json                              删掉 hexo-renderer-kramed（渲染器竞态根因）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                        新增旅行者 <span class="number">1</span> 号距离模型 + 欢迎信息改版</span><br><span class="line">_config.fomalhaut.yml                    作者卡片按钮 / 公告栏精简（主题改名后的配置文件名）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_custom/custom.css   首页卡片箭头改圆角</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>scripts<span class="regexp">/events/</span>welcome.js       主题启动横幅</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>scripts<span class="regexp">/events/i</span>nit.js          改名后的弃用提示</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">package</span>.json             name 改为 hexo-theme-fomalhaut</span><br><span class="line">_config.yml                              theme: fomalhaut</span><br><span class="line">bak<span class="regexp">/renderer-check/</span>                       渲染器故障排查记录与备份</span><br><span class="line">bak<span class="regexp">/20260930-voyager/</span>                     旅行者 <span class="number">1</span> 号模型备份</span><br><span class="line">bak<span class="regexp">/20260930-authorcard/</span>                  作者卡片备份</span><br><span class="line">bak<span class="regexp">/20260930-arrow/</span>                       箭头圆角备份（含预览图）</span><br><span class="line">bak<span class="regexp">/20260930-banner/</span>                      启动横幅备份</span><br><span class="line">bak<span class="regexp">/20260930-rename/</span>                      主题改名备份</span><br><span class="line">（以下为 <span class="number">2026</span>-<span class="number">10</span>-<span class="number">01</span> 凌晨追加的一轮）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>scripts<span class="regexp">/helpers/</span>hexo_echarts.js     标签统计图排序修复</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>footer.pug          页脚徽章更新（Theme-Fomalhaut / CDN-npmmirror）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/assets/</span>badge/                        新增 <span class="number">2</span> 枚自制徽章 SVG</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/social/</span>fcircle/index.md              朋友圈数据源改为仓库静态 data.json</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                          滑条增强 + 「随便逛逛」同源修复</span><br><span class="line">_config.fomalhaut.yml                       新增首屏预置脚本 beautyBoot</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_custom/custom.css       滑条可点击区 <span class="number">5</span>px → <span class="number">23</span>px</span><br><span class="line">bak<span class="regexp">/20260930-echarts/</span>                       标签统计图脚本备份</span><br><span class="line">bak<span class="regexp">/20261001-article/</span>                       本轮文章与旧时光备份</span><br><span class="line">（以下为 <span class="number">2026</span>-<span class="number">10</span>-<span class="number">01</span> 下午追加的一轮）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>census.js                            百度统计 token 更新 + 三图兜底 + 地图跟随主题色</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/site/</span>census/index.md                    <span class="number">51</span>la 增加「总访问量」+ 千分位 + 抓取兜底</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/gi</span>tcalendar.js                       自托管并打补丁（<span class="number">14564</span> 字节）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/css/gi</span>tcalendar.css                     自托管（<span class="number">3045</span> 字节，与原版逐字节一致）</span><br><span class="line">_config.yml                                    贡献日历改走静态 data.json（第 <span class="number">239</span> 行）+ css/js 指向本站（第 <span class="number">252</span>-<span class="number">253</span> 行）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_custom/custom.css 滚动条条纹 + 标准属性回退 + 猫咪点击穿透</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                             猫咪：报时防重入 + 指针命中判定</span><br><span class="line">bak<span class="regexp">/20261001-baidu-token/</span>  bak<span class="regexp">/20261001-chart-fallback/</span>  bak<span class="regexp">/20261001-theme-color/</span>   统计页三处备份</span><br><span class="line">bak<span class="regexp">/20261001-statistic-order/</span>  bak<span class="regexp">/20261001-statistic-numfmt/</span>                          <span class="number">51</span>la 统计备份</span><br><span class="line">bak<span class="regexp">/20261001-gitcalendar-jsonurl/</span>  -own-api<span class="regexp">/  -selfhost/</span>  -planb<span class="regexp">/  -planb-live/</span>        贡献日历四次改动备份</span><br><span class="line">（以下为 <span class="number">2026</span>-<span class="number">10</span>-<span class="number">01</span> 傍晚追加的一轮）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>festival.js                      新增 <span class="number">14199</span> 字节（<span class="number">30</span> 条节日表 + 左上角卡片）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>lunar.js                         新增 <span class="number">24401</span> 字节（农历 / 二十四节气，从 fomal.js 搬出）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                         节日代码搬走（<span class="number">3961</span> → <span class="number">2799</span> 行）+ 运行时长按年 + 手机端自绘滚动条</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>notify.js                        <span class="number">7369</span> 字节（补左上角位置，节日卡片要用）</span><br><span class="line">_config.yml                                index_generator.per_page <span class="number">12</span> → <span class="number">9</span>（第 <span class="number">84</span> 行）</span><br><span class="line">_config.fomalhaut.yml                      侧栏「最新文章」下线（第 <span class="number">967</span> 行）+ lunar.js / festival.js 注入（第 <span class="number">1263</span>-<span class="number">1265</span> 行）</span><br><span class="line">scripts/sticky-post.js                     新增 <span class="number">2753</span> 字节（正文标记置顶）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/mi</span>xins/post-ui.pug    postStickyBadge 置顶角标（第 <span class="number">143</span> 行）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_custom/custom.css         置顶角标 + 图墙 grid 化 + 取色框 + 手机端自绘滚动条</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/_posts/</span><span class="number">2022</span>-<span class="number">08</span>-<span class="number">09</span>-Markdown语法与外挂标签写法汇总.md   正文加置顶标记</span><br><span class="line">bak<span class="regexp">/20261001-homepage-3rows/</span>  bak<span class="regexp">/20261001-bgbox-grid/</span>  -desktop<span class="regexp">/  bak/</span><span class="number">20261001</span>-define-colors/</span><br><span class="line">bak<span class="regexp">/20261001-welcome-loading/</span>  bak<span class="regexp">/20261001-uptime-years/</span>  bak<span class="regexp">/20261001-sticky-post/</span>     本轮七组备份</span><br><span class="line"></span><br><span class="line">（以下为 <span class="number">2026</span>-<span class="number">10</span>-<span class="number">01</span> 深夜追加的一轮）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>celebrate.js                        新增 <span class="number">6946</span> 字节（全屏礼炮，命中喜庆节日才按需加载）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>festival.js                         <span class="number">16</span> 条节日加 celebrate 标记 + 礼炮按需加载（第 <span class="number">376</span>-<span class="number">395</span> 行）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/tags/i</span>ndex.md                          type 改 echarts、标题改「文章统计」（三页合一后的落点）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/categories/i</span>ndex.md  <span class="keyword">source</span><span class="regexp">/site/</span>echarts<span class="regexp">/index.md     改为跳转页（type: redirect + redirect_to: /</span>tags/）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>page/redirect.pug           新增 <span class="number">488</span> 字节（通用跳转页）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout/page.pug              新增 when <span class="string">&#x27;redirect&#x27;</span> 分支（第 <span class="number">17</span>-<span class="number">18</span> 行）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>page/echarts.pug            补「标签云」「分类列表」两块 + 标题移到图表外</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout/archive.pug           删掉页顶「文章发布统计」图（<span class="number">510</span> → <span class="number">310</span> 字节）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>scripts<span class="regexp">/helpers/</span>hexo_echarts.js            titlePosition: <span class="string">&#x27;outside&#x27;</span>（三个 helper）</span><br><span class="line">_config.fomalhaut.yml                         菜单精简 + 文章统计入口 + 列表页翻页样式（<span class="keyword">inject</span>.head）+ 通讯录卡关闭</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_custom/custom.css              二级菜单居中（删 <span class="number">6</span> 条写死偏移 + 覆盖 sub_menus 关键帧）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_layout/reward.styl             打赏弹窗居中 + 二维码 <span class="number">280</span> → <span class="number">140</span>px</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/personal/</span>about/index.md                关于页两个收款码同步换源</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                            新增 winboxNeedSize()：美化面板尺寸按内容量计算</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/_data/</span>link.yml                         <span class="number">81</span> 个失联站点移入「失联友链」（加 offline 标记）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>footer.pug   <span class="number">4</span> 个失效友链位换成「广告位招租」</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/_data/</span>widget.yml                       侧栏新增日历卡 / 倒计时卡</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>aside-calendar.js                   新增 <span class="number">13795</span> 字节（日历 + 倒计时 + 农历 / ISO 周）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/css/</span>aside-calendar.css                 新增 <span class="number">6370</span> 字节（含隐藏通讯录卡的兜底规则）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>widget/index.pug           card_top_self 挪到公告栏上方</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/cal-test/i</span>ndex.html                    日历卡预览页</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/personal/</span>bb<span class="regexp">/  source/</span>personal<span class="regexp">/love/</span>    整目录删除（唠叨 / 恋爱小屋）</span><br><span class="line">bak<span class="regexp">/20261001-merge-tags-categories/</span> … bak<span class="regexp">/20261002-footer-ad-slots/</span>    本轮 <span class="number">15</span> 组备份</span><br><span class="line"></span><br><span class="line">（以下为 <span class="number">2026</span>-<span class="number">10</span>-<span class="number">03</span> 凌晨追加的一轮）</span><br><span class="line">scripts/gallery-pager.js                  新增 <span class="number">6076</span> 字节（相册按 gallery_per_page 自动分页）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/g</span>allery<span class="regexp">/photo/i</span>ndex.md         <span class="number">202</span> 张图合并进一个文件（删 p2~p17 共 <span class="number">16</span> 个页面）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/g</span>allery<span class="regexp">/wallpaper/i</span>ndex.md     <span class="number">54</span> 张图合并进一个文件（删 p2~p4 共 <span class="number">3</span> 个页面）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/g</span>allery/index.md               画廊大厅两卡片居中（规则落在 custom.css）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/life/mu</span>sic<span class="regexp">/index.md                「八音盒」改名「影音」；source/</span>life<span class="regexp">/movies/</span> 整目录删除</span><br><span class="line">_config.fomalhaut.yml                     菜单（休闲下线 / 新增天文馆）+ 归档页去侧栏（第 <span class="number">947</span> 行）+ 非首页宽 <span class="number">1200</span>px（第 <span class="number">1246</span> 行）+ 右键模式状态（第 <span class="number">1248</span>-<span class="number">1260</span> 行）+ 字体栈 + ai_chat 段 + APP 下载换源</span><br><span class="line">_config.yml                               skip_render 加 <span class="number">2</span> 行（js<span class="regexp">/ai-chat.js、box/</span>astronomy/voyager.html）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                        新增法定休假表 + 摸鱼牌按休息日切换 + 字体设置（<span class="number">7</span>+<span class="number">4</span> 款）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/_data/</span>widget.yml                   日历卡 / 倒计时卡带上版本号</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>aside-calendar.js               <span class="number">13795</span> → <span class="number">29039</span> 字节（农历 <span class="regexp">/ 节气 /</span> 日出日落 <span class="regexp">/ IP 定位 /</span> 自动日夜 / 进度条）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/css/</span>aside-calendar.css             <span class="number">6848</span> → <span class="number">8072</span> 字节</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/</span>astronomy/index.md             新增（iframe 引入 voyager.html，postMessage 自适应高度）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/</span>astronomy/voyager.html         新增 <span class="number">72906</span> 字节（交互式太阳系星图，独立页面）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/</span>astronomy<span class="regexp">/img/</span>                 新增 <span class="number">3</span> 张图（探测器 <span class="regexp">/ 金唱片 /</span> 暗淡蓝点）</span><br><span class="line">scripts/magnet-local-links.js             新增 <span class="number">4916</span> 字节（首页磁贴链接本地化）</span><br><span class="line">scripts/swiper-lazyload-fix.js            新增 <span class="number">3761</span> 字节（修 pjax 往返后轮播克隆图空白）</span><br><span class="line">scripts/ai-chat-<span class="keyword">inject</span>.js                 新增 <span class="number">3239</span> 字节（站点级注入器）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>ai-chat.js                      新增 <span class="number">46498</span> 字节（AI 页面助手前端本体）</span><br><span class="line">.ai-chat-key                              新增（DeepSeek Key，已加 .gitignore）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_custom/custom.css   画廊居中 + 字体 @font-face 重整 + 友链卡片 <span class="number">16</span>:<span class="number">10</span> + 代码字体规则</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>header/nav.pug   导航三个按钮改内联 SVG symbol</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/personal/</span>about/index.md            内容有变动（无备份可逐行对照，未在正文展开）</span><br><span class="line">bak<span class="regexp">/2026-10-02-page-width/</span>  bak<span class="regexp">/2026-10-02-site-card-height/</span>  bak<span class="regexp">/20261002-app-download-link/</span></span><br><span class="line">bak<span class="regexp">/20261002-gallery-autopager/</span>  bak<span class="regexp">/20261002-gallery-center/</span>  bak<span class="regexp">/20261002-remove-life-column/</span></span><br><span class="line">bak<span class="regexp">/20261003-archive-no-aside/</span>  bak<span class="regexp">/20261002-linkyml-offline-move/</span>     本轮八组备份</span><br><span class="line">（以下为 <span class="number">2026</span>-<span class="number">10</span>-<span class="number">03</span> 白天到深夜追加的一轮）</span><br><span class="line">_config.fomalhaut.yml                     <span class="number">26</span> 段内联样式 <span class="regexp">/ 脚本抽出（2037 → 1482 行）+ stats.css /</span> twikoo.css 与 author-status <span class="regexp">/ stats /</span> footer-music <span class="regexp">/ pjax-guard /</span> webinfo-card / pc-local-link 注入 + 打赏关闭</span><br><span class="line">_config.yml                               index per_page <span class="number">9</span> 与 skip_render 两行（js<span class="regexp">/ai-chat.js、box/</span>astronomy/voyager.html）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>fomal.js                        <span class="number">2973</span> → <span class="number">105</span> 行（拆成 modules<span class="regexp">/ 8 个 + data/</span> <span class="number">2</span> 个）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/m</span>odules<span class="regexp">/                        新增 shell /</span> effects <span class="regexp">/ reading /</span> nav <span class="regexp">/ cursor /</span> footer-time <span class="regexp">/ settings /</span> console-art</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>data/                           新增 voyager1.js（旅行者号距离模型）、holidays.js（法定休息日）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/i</span>nject<span class="regexp">/                         新增 beauty-boot /</span> right-menu-state-boot <span class="regexp">/ scroll-gap-fix /</span> webinfo-card <span class="regexp">/ pc-local-link /</span> ft-ad-extra</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/css/</span>site-<span class="keyword">inject</span>.css                新增 <span class="number">275</span> 行（原配置里 <span class="number">26</span> 段内联样式合并成 <span class="number">10</span> 块）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>ai-chat.js                      AI 页面助手前端本体（<span class="number">1044</span> 行）</span><br><span class="line">scripts<span class="regexp">/ai-chat-inject.js                 构建期注入器（有服务端 Key 就走 /</span>api）</span><br><span class="line">api<span class="regexp">/chat/</span>completions.js                   新增 <span class="number">171</span> 行（Vercel Serverless 代理：来源白名单 <span class="regexp">/ 限流 /</span> 上限）</span><br><span class="line">vercel.json                               新增（函数 maxDuration <span class="number">60</span>、memory <span class="number">512</span>）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>author-status.js                新增 <span class="number">87</span> 行（睡觉 <span class="regexp">/ 放假 /</span> 上班 / 下班四态）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>pjax-guard.js                   新增 <span class="number">143</span> 行（摘掉统计页专属选择器 + 遮罩兜底）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>footer-music.js                 新增 <span class="number">40</span> 行（页脚「听点音乐」）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>stats.js                        新增 <span class="number">430</span> 行（<span class="regexp">/tags/</span> 标题胶囊 + 图表跟随主题色）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/css/</span>stats.css                      新增 <span class="number">269</span> 行（作用域 #page:has(#posts-echart)）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/</span>census.js                       <span class="number">449</span> → <span class="number">579</span> 行（配色由主题色派生 / 明暗两套）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/site/</span>census/index.md               <span class="number">88</span> → <span class="number">122</span> 行（样式外移，结构改 section）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/css/</span>census.css                     新增 <span class="number">383</span> 行</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/css/</span>twikoo.css                     新增 <span class="number">656</span> 行（Twikoo <span class="number">2</span>.x 评论美化）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/gi</span>tcalendar.js                  <span class="number">337</span> → <span class="number">351</span> 行（贡献日历方块 <span class="number">30</span>% 圆角）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/social/</span>fcircle/index.md            <span class="number">59</span> → <span class="number">528</span> 行（朋友圈网格卡）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/social/</span>link/index.md               <span class="number">79</span> → <span class="number">302</span> 行（友人帐：数字全是 CSS 计数器）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/_data/</span>link.yml                     删掉「<span class="number">0</span>.推荐网站」整组（含自己的卡片）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/</span>nav/index.md                   <span class="number">98</span> → <span class="number">381</span> 行（六类 <span class="number">78</span> 站，四版迭代）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/box/</span>nav<span class="regexp">/icons/</span>                     新增 <span class="number">78</span> 个本地图标</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/life/mu</span>sic/index.md                补歌单来源与四条热评</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/personal/</span>about/index.md            撤下打赏二维码，改成「投喂通道暂时关闭」</span><br><span class="line">scripts/post-copyright-local-link.js      新增 <span class="number">123</span> 行（版权卡链接本地化）</span><br><span class="line"><span class="keyword">source</span><span class="regexp">/js/i</span>nject/pc-local-link.js         浏览器里补当前访问域名</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>widget<span class="regexp">/card_webinfo.pug   42 → 139 行（KPI /</span> 时间条 / 年度柱状）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>head/preconnect.pug       不蒜子 → vercount</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>additional-js.pug         不蒜子 → vercount</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span>layout<span class="regexp">/includes/</span>header/post-info.pug      <span class="number">152</span> → <span class="number">150</span> 行（占位「—」，去掉转圈）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span>/sw.js              <span class="number">177</span> 行（第二版：版本哈希 + 查询串原样 + 域名白名单）</span><br><span class="line">themes<span class="regexp">/fomalhaut/</span><span class="keyword">source</span><span class="regexp">/css/</span>_custom/custom.css   <span class="number">4124</span> → <span class="number">3936</span> 行（P3 清理 + <span class="number">152</span> 行文件头地图）</span><br><span class="line">gulpfile.js                                compress 任务补 <span class="keyword">return</span></span><br><span class="line">bak<span class="regexp">/2026-10-03-屎山重构/</span>                    P0–P3 文档与改动前快照（<span class="number">105</span> 文件）</span><br><span class="line">bak<span class="regexp">/2026-10-03-八宝箱导航改版/</span>  bak<span class="regexp">/2026-10-03-友人帐改版/</span>  bak<span class="regexp">/2026-10-03-朋友圈改版/</span>   三页改版记录</span><br><span class="line">bak<span class="regexp">/20261003-webinfo/</span>  bak<span class="regexp">/card-redesign-20261003/</span>          小站资讯卡与作者卡预览图</span><br><span class="line">bak<span class="regexp">/20261004-census-redesign/</span>  bak<span class="regexp">/20261005-stats-redesign/</span>   统计两页预览</span><br><span class="line">bak<span class="regexp">/20261005-close-reward/</span>  bak<span class="regexp">/20261005-footer-music/</span>  bak<span class="regexp">/post-copyright-local-link/</span>   打赏 <span class="regexp">/ 页脚 /</span> 版权卡</span><br><span class="line">bak<span class="regexp">/announcement-20261003-v3-wrap/</span>  -v4-trim<span class="regexp">/  -20261004-twikoo-ui/</span>  -v5-wider<span class="regexp">/ … -v8-fill/</span>   公告卡八版</span><br><span class="line">bak<span class="regexp">/20261003-gitcalendar-rounded/</span>  bak<span class="regexp">/20261003-toc-fix/</span>  bak<span class="regexp">/aplayer-volume-check/</span>        本轮其余备份</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">🍬红字我早就看见了，只是一直拖着没修。</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>Linux系统移植篇(三)——根文件系统的构建</title>
    <link href="https://www.fomal.cc/posts/92cc006e.html"/>
    <id>https://www.fomal.cc/posts/92cc006e.html</id>
    <published>2023-04-01T15:00:00.000Z</published>
    <updated>2023-04-01T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note flat info flat"><p>Linux“三巨头”已经完成了 2 个了，就剩最后一个 rootfs (根文件系统)了，本章我们就来学习一下根文件系统的组成以及如何构建根文件系统。这是 Linux 移植的最后一步，根文件系统构建好以后就意味着我们已经拥有了一个完整的、可以运行的最小系统。以后我们就在这个最小系统上编写、测试 Linux 驱动，移植一些第三方组件，逐步的完善这个最小系统。最终得到一个功能完善、驱动齐全、相对完善的操作系统。</p></div><h2 id="1-根文件系统简介">1.根文件系统简介</h2><ul><li><p>文件系统一般也叫做 rootfs，那么什么叫根文件系统？看到“文件系统”这四个字，很多人，包括我第一反应就是 FATFS、FAT、EXT4、YAFFS 和 NTFS 等这样的文件系统。在这里，根文件系统并不是 FATFS 这样的文件系统代码，EXT4 这样的文件系统代码属于 Linux 内核的一部分。Linux 中的根文件系统更像是<strong>一个文件夹或者叫做目录</strong>(在我看来就是一个文件夹，只不过是特殊的文件夹)，在这个目录里面会有很多的子目录。<strong>根目录下和子目录中会有很多的文件，这些文件是 Linux 运行所必须的，比如库、常用的软件和命令、设备文件、配置文件等等</strong>。以后我们说到文件系统，如果不特别指明，统一表示根文件系统。对于根文件系统专业的解释，百度百科上是这么说的：</p></li><li><p><span style="color:red">根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统</span>，内核代码映像文件保存在根文件系统中，而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。</p></li><li><p>百度百科上说内核代码镜像文件保存在根文件系统中，但是我们嵌入式 Linux 并没有将内核代码镜像保存在根文件系统中，而是保存到了其他地方。比如 NAND Flash 的指定存储地址、EMMC 专用分区中。根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统，然后从根文件系统中读取初始化脚本，比如 <code>rcS</code>，<code>inittab </code>等。根文件系统和 Linux 内核是分开的，单独的 Linux 内核是没法正常工作的，必须要搭配根文件系统。如果不提供根文件系统，Linux 内核在启动的时候就会提示内核崩溃(Kernel panic)的提示。</p></li><li><p>根文件系统的这个“根”字就说明了这个文件系统的重要性，它是其他文件系统的根，没有这个“根”，其他的文件系统或者软件就别想工作。比如我们常用的 <code>ls</code>、<code>mv</code>、<code>ifconfig</code> 等命令其实就是一个个小软件，只是这些软件没有图形界面，而且需要输入命令来运行。这些小软件就保存在根文件系统中，这些小软件是怎么来的呢？这个就是我们本章教程的目的，教大家来构建自己的根文件系统，这个根文件系统是满足 Linux 运行的<strong>最小根文件系统</strong>，后续我们可以根据自己的实际工作需求不断的去填充这个最小根文件系统，最终使其成为一个相对完善的根文件系统。</p></li><li><p>在构建根文件系统之前，我们先来看一下根文件系统里面大概都有些什么内容，以 Ubuntu 为例，根文件系统的目录名字为‘/’，没看错就是一个斜杠，所以输入如下命令就可以进入根目录中：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd / //进入根目录</span><br></pre></td></tr></table></figure></li><li><p>进入根目录以后输入“ls”命令查看根目录下的内容都有哪些：</p><p><img src="https://cdnjson.com/images/2023/04/01/p20cbb000fccb8ba382.webp" alt=""></p></li><li><p>根目录下子目录和文件不少，但是这些都是 Ubuntu 所需要的，其中有很多子目录和文件我们嵌入式 Linux 是用不到的，所以这里就讲解一些常用的子目录：</p><ol><li><p><strong>/bin 目录</strong></p><p>看到“bin”大家应该能想到 bin 文件，bin 文件就是<strong>可执行文件</strong>。所以此目录下存放着系统需要的可执行文件，一般都是一些命令，比如 ls、mv 等命令。此目录下的命令所有的客户都可以使用。</p></li><li><p><strong>/dev 目录</strong></p><p>dev 是 device 的缩写，所以此目录下的文件都是和<strong>设备</strong>有关的，此目录下的文件都是设备文件。在 Linux 下一切皆文件，即使是硬件设备，也是以文件的形式存在的，比如<code>/dev/ttymxc0</code>(I.MX6ULL 根目录会有此文件)就表示 I.MX6ULL 的串口 0，我们要想通过串口 0 发送或者接收数据就要操作文件<code>/dev/ttymxc0</code>，通过对文件<code>/dev/ttymxc0</code> 的读写操作来实现串口 0 的数据收发。</p></li><li><p><strong>/etc 目录</strong></p><p>此目录下存放着各种<strong>配置文件</strong>，大家可以进入 Ubuntu 的 etc 目录看一下，里面的配置文件非常多！但是在嵌入式 Linux 下此目录会很简洁。</p></li><li><p><strong>/lib 目录</strong></p><p>lib 是 library 的简称，也就是<strong>库</strong>的意思，因此此目录下存放着 Linux 所必须的库文件。这些库文件是共享库，命令和用户编写的应用程序要使用这些库文件。</p></li><li><p><strong>/mnt 目录</strong><br><strong>临时挂载目录</strong>，一般是空目录，可以在此目录下创建空的子目录，比如/mnt/sd、/mnt/usb，这样就可将 SD 卡或者 U 盘挂载到/mnt/sd 或者/mnt/usb 目录中。</p></li><li><p><strong>/proc 目录</strong></p><p>此目录一般是空的，当 Linux 系统启动以后会将此目录作为 proc 文件系统的挂载点，proc 是个<strong>虚拟文件系统</strong>，没有实际的存储设备。proc 里面的文件都是<strong>临时存在</strong>的，一般用来存储系统运行信息文件。</p></li><li><p><strong>/usr 目录</strong></p><p>要注意，usr 不是 user 的缩写，而是 Unix Software Resource 的缩写，也就是 <strong>Unix 操作系统软件资源目录</strong>。这里有个小知识点，那就是 Linux 一般被称为类 Unix 操作系统，苹果的 MacOS 也是类 Unix 操作系统。关于 Linux 和 Unix 操作系统的渊源大家可以直接在网上找 Linux 的发展历史来看。既然是软件资源目录，因此/usr 目录下也存放着很多软件，一般系统安装完成以后此目录占用的空间最多。</p></li><li><p><strong>/var 目录</strong><br>此目录存放一些可以改变的数据。</p></li><li><p><strong>/sbin 目录</strong><br>此目录页用户存放一些可执行文件，但是此目录下的文件或者说命令只有<strong>管理员</strong>才能使用，主要用户系统管理。</p></li><li><p><strong>/sys 目录</strong><br>系统启动以后此目录作为 sysfs 文件系统的挂载点，sysfs 是一个<strong>类似于 proc 文件系统的特殊文件系统</strong>，sysfs 也是基于 ram 的文件系统，也就是说它也没有实际的存储设备。此目录是系统设备管理的重要目录，此目录通过一定的组织结构向用户提供详细的内核数据结构信息。</p></li><li><p><strong>/opt</strong></p><p><strong>可选</strong>的文件、软件存放区，由用户选择将哪些文件或软件放到此目录中。</p></li></ol><ul><li>关于 Linux 的根目录就介绍到这里，接下来的构建根文件系统就是研究如何创建上面这些子目录以及子目录中的文件。</li></ul></li></ul><h2 id="2-BusyBox-构建根文件系统">2.BusyBox 构建根文件系统</h2><h3 id="2-1-BusyBox-简介">2.1 BusyBox 简介</h3><ul><li>上一小节说了，根文件系统里面就是一堆的可执行文件和其他文件组成的？难道我们得一个一个的从网上去下载这些文件？显然这是不现实的！那么有没有人或者组织专门干这个事呢？他们负责“收集”这些文件，然后将其打包，像我们这样的开发者可以直接拿来用。答案是有的，它就叫做 BusyBox！其名字分为“Busy”和“Box”，也就是忙碌的盒子。盒子是用来放东西的，忙碌的是因为它要提供根文件系统所需的件，所以忙碌。<strong>BusyBox 是一个集成了大量的 Linux 命令和工具的软件，像 ls、mv、ifconfig 等命令 BusyBox 都会提供</strong>。BusyBox 就是一个大的工具箱，这个工具箱里面集成了 Linux 的许多工具和命令。一般下载 BusyBox 的源码，然后配置 BusyBox，选择自己想要的功能，最后编译即可。BusyBox 准备好以后就可以构建根文件系统了。</li></ul><h3 id="2-2-编译-BusyBox-构建根文件系统">2.2 编译 BusyBox 构建根文件系统</h3><ul><li><p>一般我们在 Linux 驱动开发的时候都是通过 nfs 挂载根文件系统的，当产品最终上市开卖的时候才会将根文件系统烧写到 EMMC 或者 NAND 中。所以要在 nfs 服务器目录中创建一个名为 <code>rootfs</code> 的子目录(名字大家可以随意起，为了方便就用了 rootfs)，比如我的电脑中<code>/home/zuozhongkai/linux/nfs</code>就是我设置的 NFS 服务器目录，使用如下命令创建名为 rootfs 的子目录：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir rootfs</span><br></pre></td></tr></table></figure></li><li><p>创建好的 rootfs 子目录就用来存放我们的根文件系统了。</p></li><li><p>将 <code>busybox-1.29.0.tar.bz2</code> 发送到 Ubuntu 中，存放位置大家随便选择。然后使用如下命令将其解压：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar -vxjf busybox-1.29.0.tar.bz2</span><br></pre></td></tr></table></figure></li><li><p>解压完成以后进入到 <code>busybox-1.29.0</code> 目录中，此目录中的文件和文件夹如图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p215cfb9d0c8e25c4b4.webp" alt=""></p></li></ul><ol><li><p>修改 Makefile，添加编译器</p><ul><li><p>同 Uboot 和 Linux 移植一样，打开 busybox 的顶层 <code>Makefile</code>，添加 <code>ARCH</code> 和 <code>CROSS_COMPILE</code>的值，如下所示：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-</span><br><span class="line">......</span><br><span class="line">ARCH ?= arm</span><br></pre></td></tr></table></figure></li><li><p><code>CORSS_COMPILE</code> 使用了绝对路径！主要是为了防止编译出错。</p></li></ul></li><li><p>busybox 中文字符支持</p><ul><li><p>如果默认直接编译 busybox 的话，在使用 SecureCRT 的时候中文字符是显示不正常的，中文字符会显示为“?”，比如你的中文目录，中文文件都显示为“?”。不知道从哪个版本开始 busybox 中的 shell 命令对中文输入即显示做了限制，即使内核支持中文但在 shell 下也依然无法正确显示。 所以我们需要修改 busybox 源码，取消 busybox 对中文显示的限制，打开文件<code>busybox-1.29.0/libbb/printable_string.c</code>，找到函数 <code>printable_string</code>，缩减后的函数内容如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">char</span>* FAST_FUNC <span class="title function_">printable_string</span><span class="params">(<span class="type">uni_stat_t</span> *stats, <span class="type">const</span> <span class="type">char</span></span></span><br><span class="line"><span class="params">str)</span></span><br><span class="line">&#123;</span><br><span class="line"> <span class="type">char</span> *dst;</span><br><span class="line"> <span class="type">const</span> <span class="type">char</span> *s;</span><br><span class="line"></span><br><span class="line"> s = str;</span><br><span class="line"> <span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">     <span class="type">unsigned</span> <span class="type">char</span> c = *s;</span><br><span class="line">     <span class="keyword">if</span> (c == <span class="string">&#x27;\0&#x27;</span>) &#123;</span><br><span class="line">...</span><br><span class="line">     &#125;</span><br><span class="line">     <span class="keyword">if</span> (c &lt; <span class="string">&#x27; &#x27;</span>)</span><br><span class="line">         <span class="keyword">break</span>;</span><br><span class="line">     <span class="keyword">if</span> (c &gt;= <span class="number">0x7f</span>)</span><br><span class="line">         <span class="keyword">break</span>;</span><br><span class="line">     s++;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> ENABLE_UNICODE_SUPPORT</span></span><br><span class="line"> dst = unicode_conv_to_printable(stats, str);</span><br><span class="line"><span class="meta">#<span class="keyword">else</span></span></span><br><span class="line"> &#123;</span><br><span class="line">     <span class="type">char</span> *d = dst = xstrdup(str);</span><br><span class="line">     <span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">         <span class="type">unsigned</span> <span class="type">char</span> c = *d;</span><br><span class="line">         <span class="keyword">if</span> (c == <span class="string">&#x27;\0&#x27;</span>)</span><br><span class="line">             <span class="keyword">break</span>;</span><br><span class="line">         <span class="keyword">if</span> (c &lt; <span class="string">&#x27; &#x27;</span> || c &gt;= <span class="number">0x7f</span>)</span><br><span class="line">             *d = <span class="string">&#x27;?&#x27;</span>;</span><br><span class="line">         d++;</span><br><span class="line">     &#125;</span><br><span class="line">...</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"> <span class="keyword">return</span> auto_string(dst);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>第 15 和 16 行，当字符大于 0X7F 以后就跳出去了。</p></li><li><p>第 29 和 30 行，如果支持 UNICODE 码的话，当字符大于 0X7F 就直接输出所以我们需要对这 4 行代码进行修改，修改以后如下所示：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">char</span>* FAST_FUNC <span class="title function_">printable_string</span><span class="params">(<span class="type">uni_stat_t</span> *stats, <span class="type">const</span> <span class="type">char</span> *str)</span></span><br><span class="line">&#123;</span><br><span class="line"> <span class="type">char</span> *dst;</span><br><span class="line"> <span class="type">const</span> <span class="type">char</span> *s;</span><br><span class="line"></span><br><span class="line"> s = str;</span><br><span class="line"> <span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">...</span><br><span class="line">     <span class="keyword">if</span> (c &lt; <span class="string">&#x27; &#x27;</span>)</span><br><span class="line">         <span class="keyword">break</span>;</span><br><span class="line">     <span class="comment">/* 注释掉下面这个两行代码 */</span></span><br><span class="line">     <span class="comment">/* if (c &gt;= 0x7f)</span></span><br><span class="line"><span class="comment">         break; */</span></span><br><span class="line">     s++;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> ENABLE_UNICODE_SUPPORT</span></span><br><span class="line"> dst = unicode_conv_to_printable(stats, str);</span><br><span class="line"><span class="meta">#<span class="keyword">else</span></span></span><br><span class="line"> &#123;</span><br><span class="line">     <span class="type">char</span> *d = dst = xstrdup(str);</span><br><span class="line">     <span class="keyword">while</span> (<span class="number">1</span>) &#123;</span><br><span class="line">         <span class="type">unsigned</span> <span class="type">char</span> c = *d;</span><br><span class="line">         <span class="keyword">if</span> (c == <span class="string">&#x27;\0&#x27;</span>)</span><br><span class="line">             <span class="keyword">break</span>;</span><br><span class="line">         <span class="comment">/* 修改下面代码 */</span></span><br><span class="line">         <span class="comment">/* if (c &lt; &#x27; &#x27; || c &gt;= 0x7f) */</span></span><br><span class="line">         <span class="keyword">if</span>( c &lt; <span class="string">&#x27; &#x27;</span>)</span><br><span class="line">             *d = <span class="string">&#x27;?&#x27;</span>;</span><br><span class="line">         d++;</span><br><span class="line">     &#125;</span><br><span class="line">...</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"> <span class="keyword">return</span> auto_string(dst);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>示例代码中红色部分的代码就是被修改以后的，主要就是禁止字符大于 0X7F 以后 break 和输出‘?’。 接着打开文件 <code>busybox-1.29.0/libbb/unicode.c</code>，找到如下内容：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">char</span>* FAST_FUNC <span class="title function_">unicode_conv_to_printable2</span><span class="params">(<span class="type">uni_stat_t</span></span></span><br><span class="line"><span class="params">stats, <span class="type">const</span> <span class="type">char</span> *src, <span class="type">unsigned</span> width, <span class="type">int</span> flags)</span></span><br><span class="line"></span><br><span class="line">  <span class="type">char</span> *dst;</span><br><span class="line">  <span class="type">unsigned</span> dst_len;</span><br><span class="line">  <span class="type">unsigned</span> uni_count;</span><br><span class="line">  <span class="type">unsigned</span> uni_width;</span><br><span class="line">  <span class="keyword">if</span> (unicode_status != UNICODE_ON) &#123;</span><br><span class="line">      <span class="type">char</span> *d;</span><br><span class="line">      <span class="keyword">if</span> (flags &amp; UNI_FLAG_PAD) &#123;</span><br><span class="line">          d = dst = xmalloc(width + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">              *d++ = (c &gt;= <span class="string">&#x27; &#x27;</span> &amp;&amp; c &lt; <span class="number">0x7f</span>) ? c : <span class="string">&#x27;?&#x27;</span>;</span><br><span class="line">              src++;</span><br><span class="line">          &#125;</span><br><span class="line">          *d = <span class="string">&#x27;\0&#x27;</span>;</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">          d = dst = xstrndup(src, width);</span><br><span class="line">          <span class="keyword">while</span> (*d) &#123;</span><br><span class="line">              <span class="type">unsigned</span> <span class="type">char</span> c = *d;</span><br><span class="line">              <span class="keyword">if</span> (c &lt; <span class="string">&#x27; &#x27;</span> || c &gt;= <span class="number">0x7f</span>)</span><br><span class="line">                  *d = <span class="string">&#x27;?&#x27;</span>;</span><br><span class="line">              d++;</span><br><span class="line">          &#125;</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      <span class="keyword">return</span> dst;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> dst;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>第 13 行，当字符大于 0X7F 以后，d++就为‘?’。</p></li><li><p>第 21 和 22 行，当字符大于 0X7F 以后，*d 也为‘?’。 修改后内容如下所示：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1003</span> <span class="type">static</span> <span class="type">char</span>* FAST_FUNC <span class="title function_">unicode_conv_to_printable2</span><span class="params">(<span class="type">uni_stat_t</span></span></span><br><span class="line"><span class="params">*stats, <span class="type">const</span> <span class="type">char</span> *src, <span class="type">unsigned</span> width, <span class="type">int</span> flags)</span></span><br><span class="line">&#123;</span><br><span class="line">   <span class="type">char</span> *dst;</span><br><span class="line">   <span class="type">unsigned</span> dst_len;</span><br><span class="line">   <span class="type">unsigned</span> uni_count;</span><br><span class="line">   <span class="type">unsigned</span> uni_width;</span><br><span class="line"></span><br><span class="line">   <span class="keyword">if</span> (unicode_status != UNICODE_ON) &#123;</span><br><span class="line">       <span class="type">char</span> *d;</span><br><span class="line">       <span class="keyword">if</span> (flags &amp; UNI_FLAG_PAD) &#123;</span><br><span class="line">           d = dst = xmalloc(width + <span class="number">1</span>);</span><br><span class="line">.</span><br><span class="line">               <span class="comment">/* 修改下面一行代码 */</span></span><br><span class="line">               <span class="comment">/* *d++ = (c &gt;= &#x27; &#x27; &amp;&amp; c &lt; 0x7f) ? c : &#x27;?&#x27;; */</span></span><br><span class="line">               *d++ = (c &gt;= <span class="string">&#x27; &#x27;</span>) ? c : <span class="string">&#x27;?&#x27;</span>;</span><br><span class="line">               src++;</span><br><span class="line">           &#125;</span><br><span class="line">           *d = <span class="string">&#x27;\0&#x27;</span>;</span><br><span class="line">       &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">           d = dst = xstrndup(src, width);</span><br><span class="line">           <span class="keyword">while</span> (*d) &#123;</span><br><span class="line">               <span class="type">unsigned</span> <span class="type">char</span> c = *d;</span><br><span class="line">               <span class="comment">/* 修改下面一行代码 */</span></span><br><span class="line">               <span class="comment">/* if (c &lt; &#x27; &#x27; || c &gt;= 0x7f) */</span></span><br><span class="line">               <span class="keyword">if</span>(c &lt; <span class="string">&#x27; &#x27;</span>)</span><br><span class="line">                   *d = <span class="string">&#x27;?&#x27;</span>;</span><br><span class="line">               d++;</span><br><span class="line">           &#125;</span><br><span class="line">       &#125;</span><br><span class="line">.</span><br><span class="line">       <span class="keyword">return</span> dst;</span><br><span class="line">   &#125;</span><br><span class="line">.</span><br><span class="line"></span><br><span class="line">   <span class="keyword">return</span> dst;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>示例代码中红色部分的代码就是被修改以后的，同样主要是禁止字符大于 0X7F 的时候设置为‘?’。busybox 中文字符支持跟代码修改有关的就改好了，最后还需要配置 busybox 来使能 unicode 码，这个稍后我们配置 busybox 的时候在设置。</p></li></ul></li><li><p>配置 busybox</p><ul><li><p>根我们编译 Uboot、Linux kernel 一样，我们要先对 busybox 进行默认的配置，有以下几种配置选项：</p><ol><li><code>defconfig</code>，缺省配置，也就是默认配置选项。</li><li><code>allyesconfig</code>，全选配置，也就是选中 busybox 的所有功能。</li><li><code>allnoconfig</code>，最小配置。</li></ol></li><li><p>我们一般使用默认配置即可，因此使用如下命令先使用默认配置来配置一下 busybox：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make defconfig</span><br></pre></td></tr></table></figure></li><li><p>busybox 也支持图形化配置，通过图形化配置我们可以进一步选择自己想要的功能，输入如下命令打开图形化配置界面：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make menuconfig</span><br></pre></td></tr></table></figure></li><li><p>略</p></li></ul></li><li><p>编译 busybox</p><ul><li><p>配置好 busybox 以后就可以编译了，我们可以指定编译结果的存放目录，我们肯定要将编译结果存放到前面创建的 <code>rootfs</code> 目录中，输入如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">make</span><br><span class="line">make install CONFIG_PREFIX=/home/zuozhongkai/linux/nfs/rootfs</span><br></pre></td></tr></table></figure></li><li><p><code>COFIG_PREFIX</code> 指 定 编 译 结 果 的 存 放 目 录 ， 比 如 我 存 放 到<code>/home/zuozhongkai/linux/nfs/rootfs</code>目录中，等待编译完成。编译完成以后如下图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p22.webp" alt=""></p></li><li><p>编译完成以后会在 busybox 的所有工具和文件就会被安装到 <code>rootfs</code> 目录中，<code>rootfs</code> 目录内容如下图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p23.webp" alt=""></p></li><li><p>从图可以看出，<code>rootfs</code> 目录下有 <code>bin</code>、<code>sbin</code> 和 <code>usr</code> 这三个目录，以及 <code>linuxrc</code> 个文件。前面说过 Linux 内核 init 进程最后会查找用户空间的 init 程序，找到以后就会运行这个用户空间的 init 程序，从而切换到用户态。如果 bootargs 设置 <code>init=/linuxrc</code>，那么 linuxrc 就是可以作为用户空间的 init 程序，所以用户态空间的 init 程序是 busybox 来生成的。 busybox 的工作就完成了，但是此时的根文件系统还不能使用，还需要一些其他的文件，我们继续来完善 rootfs。</p></li></ul></li></ol><h3 id="2-3-向根文件系统添加-lib-库">2.3 向根文件系统添加 lib 库</h3><ol><li><p>向 rootfs 的<code>/lib</code>目录添加库文件</p><ul><li><p>Linux 中的应用程序一般都是需要<strong>动态库</strong>的，当然你也可以编译成静态的，但是静态的可执行文件会很大。如果编译为动态的话就需要动态库，所以我们需要向根文件系统中添加动态库。在 rootfs 中创建一个名为<code>lib</code>的文件夹，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir lib</span><br></pre></td></tr></table></figure></li><li><p>lib 文件夹创建好了，库文件从哪里来呢？lib 库文件从交叉编译器中获取，前面我们搭建交叉编译环境的时候将交叉编译器存放到了<code>/usr/local/arm/</code>目录中。交叉编译器里面有很多的库文件，这些库文件具体是做什么的我们作为初学者肯定不知道，既然我不知道那就简单粗暴的把所有的库文件都放到我们的根文件系统中。这样做出来的根文件系统肯定很大，但是我们现在是学习阶段，还做不了裁剪。这就是为什么我们推荐大家购买 512MB+8GB 版本的 EMMC 核心版，如果后面要学习 QT 的话那占用的空间将更大，不裁剪的话 512MB 的 NAND 完全不够用的！而裁剪又是需要经验的，我们都是初学者，哪里来的经验啊。所以我们推荐初学者购买 EMMC 版核心板并不是说为了多赚大家的钱，而是从实际角度考虑的。</p></li><li><p>进入如下路径对应的目录：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib</span><br></pre></td></tr></table></figure></li><li><p>此目录下有很多的<code>*so*</code>(*是通配符)和<code>.a</code> 文件，这些就是库文件，将此目录下所有的<code>*so*</code>和<code>.a</code>文件都拷贝到 <code>rootfs/lib</code> 目录中，拷贝命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/lib/ -d</span><br></pre></td></tr></table></figure></li><li><p>后面的<code>-d</code>表示拷贝符号链接，这里有个比较特殊的库文件：<code>ld-linux-armhf.so.3</code>，此库文件也是个符号链接，相当于 Windows 下的快捷方式。会链接到库 <code>ld-2.19-2014.08-1-git.so</code> 上，输入命令<code>ls ld-linux-armhf.so.3 -l</code>查看此文件详细信息，如图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p24.webp" alt=""></p></li><li><p>可以看出，<code>ld-linux-armhf.so.3</code> 后面有个“-&gt;”，表示其是个软连接文件，链接到文件 <code>ld-2.19-2014.08-1-git.so</code>，因为其是一个“快捷方式”，因此大小只有 24B。但是，<code>ld-linux-armhf.so.3</code> 不能作为符号链接，否则的话在根文件系统中执行程序无法执行！所以我们需要 <code>ld-linux-armhf.so.3</code> 完成逆袭，由“快捷方式”变为“本尊”，方法很简单，那就是重新复制 <code>ld-linux-armhf.so.3</code>，只是不复制软链接即可，先将 <code>rootfs/lib</code> 中的 <code>ld-linux-armhf.so.3</code> 文件删掉，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rm ld-linux-armhf.so.3</span><br></pre></td></tr></table></figure></li><li><p>然 后 重 新 进 入 到 <code>/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linuxgnueabihf/arm-linux-gnueabihf/libc/lib</code> 目录中，重新拷贝 <code>ld-linux-armhf.so.3</code>，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp ld-linux-armhf.so.3 /home/zuozhongkai/linux/nfs/rootfs/lib/</span><br></pre></td></tr></table></figure></li><li><p>拷贝完成以后再到 <code>rootfs/lib</code> 目录下查看 <code>ld-linux-armhf.so.3</code> 文件详细信息，如图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p25.webp" alt=""></p></li><li><p>可以看出，此时 <code>ld-linux-armhf.so.3</code> 已经不是软连接了，而是实实在在的一个库文件，而且文件大小为 724392B。 继续进入如下目录中：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib</span><br></pre></td></tr></table></figure></li><li><p>此目录下也有很多的的<code>*so*</code>和<code>.a</code>库文件，我们将其也拷贝到 <code>rootfs/lib</code> 目录中，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/lib/ -d</span><br></pre></td></tr></table></figure></li><li><p><code>rootfs/lib</code> 目录的库文件就这些了，完成以后的 <code>rootfs/lib</code> 目录如下图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p26.webp" alt=""></p></li></ul></li><li><p>向 rootfs 的<code>usr/lib</code>目录添加库文件</p><ul><li><p>在 rootfs 的 usr 目录下创建一个名为 <code>lib</code> 的目录，将如下目录中的库文件拷贝到<code>rootfs/usr/lib</code>目录下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib</span><br></pre></td></tr></table></figure></li><li><p>将此目录下的 <code>*so*</code> 和 <code>.a</code> 库文件都拷贝到 <code>rootfs/usr/lib</code> 目录中，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/usr/lib/ -d</span><br></pre></td></tr></table></figure></li><li><p>完成以后的 <code>rootfs/usr/lib</code> 目录如下图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p27.webp" alt=""></p></li><li><p>至此，根文件系统的库文件就全部添加好了，可以使用<code>du</code>命令来查看一下 <code>rootfs/lib</code> 和<code>rootfs/usr/lib</code> 这两个目录的大小，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd rootfs //进入根文件系统目录</span><br><span class="line">du ./lib ./usr/lib/ -sh //查看lib和usr/lib 这两个目录的大小</span><br></pre></td></tr></table></figure></li><li><p>结果如图 38.2.3.5 所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p28.webp" alt=""></p></li><li><p>可以看出 <code>lib</code> 和 <code>usr/lib</code> 这两个文件的大小分别为 57MB 和 67MB，加起来就是 57+67=124MB。非常大！所以正点原子的 256MB 和 512MB 的 NAND 核心版就不是给初学者准备的，而是给大批量采购的企业准备的，还是那句话，初学者选择 EMMC 版本的。</p></li></ul></li></ol><h3 id="2-4-创建其他文件夹">2.4 创建其他文件夹</h3><ul><li><p>在根文件系统中创建其他文件夹，如 <code>dev</code>、<code>proc</code>、<code>mnt</code>、<code>sys</code>、<code>tmp</code> 和 <code>root</code> 等，创建完成以后如下图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p29.webp" alt=""></p></li><li><p>目前来看，这个根文件系统好像已经准备好了，究竟有没有准备好，直接测一下就知道了！</p></li></ul><h2 id="3-根文件系统初步测试">3.根文件系统初步测试</h2><ul><li><p>接下来我们使用测试一下前面创建好的根文件系统 rootfs，测试方法就是使用 NFS 挂载，uboot 里面的<code>bootargs</code> 环境变量会设置<code>root</code>的值，所以我们将 <code>root</code> 的值改为 NFS 挂载即可。在 Linux 内核源码里面有相应的文档讲解如何设置，文档为 Documentation/filesystems/nfs/nfsroot.txt，格式如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">root=/dev/nfs nfsroot=[&lt;server-ip&gt;:]&lt;root-dir&gt;[,&lt;nfs-options&gt;] ip=&lt;client-ip&gt;:&lt;server-ip&gt;:&lt;gw-ip&gt;:&lt;netmask&gt;:&lt;hostname&gt;:&lt;device&gt;:&lt;autoconf&gt;:&lt;dns0-ip&gt;:&lt;dns1-ip&gt;</span><br></pre></td></tr></table></figure><ul><li><server-ip>：服务器 IP 地址，也就是存放根文件系统主机的 IP 地址，那就是 Ubuntu 的 IP 地址，比如我的 Ubuntu 主机 IP 地址为 192.168.1.250。</li><li><root-dir>：根文件系统的存放路径，比如我的就是/home/zuozhongkai/linux/nfs/rootfs。</li><li><nfs-options>：NFS 的其他可选选项，一般不设置。</li><li><client-ip>：客户端 IP 地址，也就是我们开发板的 IP 地址，Linux 内核启动以后就会使用此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内，并且没有被其他的设备使用，在 Ubuntu 中使用 <code>ping</code> 命令 ping 一下就知道要设置的 IP 地址有没有被使用，如果不能 ping 通就说明没有被使用，那么就可以设置为开发板的 IP 地址，比如我就可以设置为 192.168.1.251。</li><li><server-ip>：服务器 IP 地址，前面已经说了。</li><li><gw-ip>：网关地址，我的就是 192.168.1.1。</li><li><netmask>：子网掩码，我的就是 255.255.255.0。</li><li><hostname>：客户机的名字，一般不设置，此值可以空着。</li><li><device>：设备名，也就是网卡名，一般是 eth0，eth1….，正点原子的 I.MX6U-ALPHA 开发板的 ENET2 为 eth0，ENET1 为 eth1。如果你的电脑只有一个网卡，那么基本只能是 eth0。这里我们使用 ENET2，所以网卡名就是 eth0。</li><li><autoconf>：自动配置，一般不使用，所以设置为 off。</li><li><dns0-ip>：DNS0 服务器 IP 地址，不使用。</li><li><dns1-ip>：DNS1 服务器 IP 地址，不使用。</li></ul></li><li><p>根据上面的格式 bootargs 环境变量的 root 值如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">root=/dev/nfs nfsroot=192.168.1.250:/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off</span><br></pre></td></tr></table></figure></li><li><p><code>proto=tcp</code>表示使用 TCP 协议，<code>rw</code>表示 nfs 挂载的根文件系统为可读可写。启动开发板，进入 uboot 命令行模式，然后重新设置 <code>bootargs</code> 环境变量，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">setenv bootargs &#x27;console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250: /home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1: 255.255.255.0::eth0:off&#x27; //设置 bootargs</span><br><span class="line">saveenv //保存环境变量</span><br></pre></td></tr></table></figure></li><li><p>设置好以后使用<code>boot</code>命令启动 Linux 内核，结果如下图所示：</p></li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p30.webp" alt=""></p><ul><li><p>可以看出，我们进入了根文件系统，说明我们的根文件系统工作了！如果没有启动进入根文件系统的话可以重启一次开发板试试。我们可以输入<code>ls</code>命令测试一下，结果如下图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p31.webp" alt=""></p></li><li><p>可以看出 <code>ls</code> 命令工作正常！那么是不是说明我们的 rootfs 就制作成功了呢？大家注意，在进入根文件系统的时候会有<code>can't run '/etc/init.d/rcS': No such file or directory </code>错误提示，提示很简单，说是无法运行<code>/etc/init.d/rcS</code>这个文件，因为这个文件不存在。如下图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p32.webp" alt=""></p></li><li><p>看来我们的 rootfs 还是缺文件啊，没什么说的，一步一步的完善吧。</p></li></ul><h2 id="4-完善根文件系统">4.完善根文件系统</h2><h3 id="4-1-创建-etc-init-d-rcS-文件">4.1 创建/etc/init.d/rcS 文件</h3><ul><li><p><code>rcS</code> 是个 shell 脚本，Linux 内核启动以后需要启动一些服务，而 <code>rcS</code> 就是规定启动哪些文件的脚本文件。在 rootfs 中创建 <code>/etc/init.d/rcS</code> 文件，然后在 rcS 中输入如下所示内容：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"></span><br><span class="line">PATH=/sbin:/bin:/usr/sbin:/usr/bin:<span class="variable">$PATH</span></span><br><span class="line">LD_LIBRARY_PATH=<span class="variable">$LD_LIBRARY_PATH</span>:/lib:/usr/lib</span><br><span class="line"><span class="built_in">export</span> PATH LD_LIBRARY_PATH</span><br><span class="line"></span><br><span class="line">mount -a</span><br><span class="line"><span class="built_in">mkdir</span> /dev/pts</span><br><span class="line">mount -t devpts devpts /dev/pts</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> /sbin/mdev &gt; /proc/sys/kernel/hotplug</span><br><span class="line">mdev -s</span><br></pre></td></tr></table></figure></li><li><p>第 1 行，表示这是一个 shell 脚本。</p></li><li><p>第 3 行，PATH 环境变量保存着可执行文件可能存在的目录，这样我们在执行一些命令或者可执行文件的时候就不会提示找不到文件这样的错误。</p></li><li><p>第 4 行，<code>LD_LIBRARY_PATH</code> 环境变量保存着库文件所在的目录。</p></li><li><p>第 5 行，使用 <code>export</code> 来导出上面这些环境变量，相当于声明一些“全局变量”。</p></li><li><p>第 7 行，使用 <code>mount</code> 命令来挂载所有的文件系统，这些文件系统由文件 <code>/etc/fstab</code> 来指定，所以我们一会还要创建 <code>/etc/fstab</code> 文件。</p></li><li><p>第 8 和 9 行，创建目录 <code>/dev/pts</code>，然后将 <code>devpts</code> 挂载到 <code>/dev/pts</code> 目录中。</p></li><li><p>第 11 和 12 行，使用 <code>mdev</code> 来管理热插拔设备，通过这两行，Linux 内核就可以在 <code>/dev</code> 目录下自动创建设备节点。关于 mdev 的详细内容可以参考 busybox 中的 docs/mdev.txt 文档。</p></li><li><p>示例代码中的 rcS 文件内容是最精简的，大家如果去看 Ubuntu 或者其他大型 Linux 操作系统中的 rcS 文件，就会发现其非常复杂。因为我们是初次学习，所以不用搞这么复杂的，而且这么复杂的 rcS 文件也是借助其他工具创建的，比如 buildroot 等。</p></li><li><p>创建好文件 <code>/etc/init.d/rcS</code> 以后一定要给其可执行权限！使用如下命令给予 <code>/ec/init.d/rcS</code> 可执行权限：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod 777 rcS</span><br></pre></td></tr></table></figure></li><li><p>设置好以后就重新启动 Linux 内核，启动以后如图所示：</p></li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p33.webp" alt=""></p><ul><li>可以看到，提示找不到 <code>/etc/fstab</code> 文件，还有一些其他的错误，我们先把 <code>/etc/fstab</code> 这个错误解决了。说不定把这个问题解决以后其他的错误也就解决了。前面我们说了<code>mount -a</code>挂载所有根文件系统的时候需要读取 <code>/etc/fstab</code>，因为<code>/etc/fstab</code> 里面定义了该挂载哪些文件，好了，接下来就是创建 <code>/etc/fstab</code> 文件。</li></ul><h3 id="4-2-创建-etc-fstab-文件">4.2 创建/etc/fstab 文件</h3><ul><li><p>在 rootfs 中创建 <code>/etc/fstab</code> 文件，<code>fstab</code> 在 Linux 开机以后自动配置哪些需要自动挂载的分区，格式如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;file system&gt; &lt;mount point&gt; &lt;type&gt; &lt;options&gt; &lt;dump&gt; &lt;pass&gt;</span><br></pre></td></tr></table></figure></li><li><p><file system>：要挂载的特殊的设备，也可以是块设备，比如 <code>/dev/sda</code> 等等。</p></li><li><p><mount point>：挂载点。</p></li><li><p><type>：文件系统类型，比如 ext2、ext3、proc、romfs、tmpfs 等等。</p></li><li><p><options>：挂载选项，在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使用 defaults，也就是默认选项，defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。</p></li><li><p><dump>：为 1 的话表示允许备份，为 0 不备份，一般不备份，因此设置为 0。</p></li><li><p><pass>：磁盘检查设置，为 0 表示不检查。根目录‘/’设置为 1，其他的都不能设置为 1，其他的分区从 2 开始。一般不在 fstab 中挂载根目录，因此这里一般设置为 0。</p></li><li><p>按照上述格式，在 fstab 文件中输入如下内容：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">&lt;file system&gt; &lt;mount point&gt; &lt;<span class="built_in">type</span>&gt; &lt;options&gt; &lt;dump&gt; &lt;pass&gt;</span></span><br><span class="line">proc /proc proc defaults 0 0</span><br><span class="line">tmpfs /tmp tmpfs defaults 0 0</span><br><span class="line">sysfs /sys sysfs defaults 0 0</span><br></pre></td></tr></table></figure></li><li><p><code>fstab</code> 文件创建完成以后重新启动 Linux，结果如下图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p34.webp" alt=""></p></li><li><p>可以看出，启动成功，而且没有任何错误提示。但是我们要还需要创建一个文件<code>/etc/inittab</code>。</p></li></ul><h3 id="4-3-创建-etc-inittab-文件">4.3 创建/etc/inittab 文件</h3><ul><li><p><code>inittab</code> 的详细内容可以参考 busybox 下的文件 <code>examples/inittab</code>。init 程序会读取 <code>/etc/inittab</code> 这个文件，<code>inittab</code> 由若干条指令组成。每条指令的结构都是一样的，由以“:”分隔的 4 个段组成，格式如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;id&gt;:&lt;runlevels&gt;:&lt;action&gt;:&lt;process&gt;</span><br></pre></td></tr></table></figure></li><li><p><id>：每个指令的标识符，不能重复。但是对于 busybox 的 init 来说，<id>有着特殊意义。对于 busybox 而言<id>用来指定启动进程的控制 tty，一般我们将串口或者 LCD 屏幕设置为控制 tty。</p></li><li><p><runlevels>：对 busybox 来说此项完全没用，所以空着。</p></li><li><p><action>：动作，用于指定<process>可能用到的动作。busybox 支持的动作如下所示：</p><ul><li>sysinit：在系统初始化的时候 process 才会执行一次。</li><li>respawn：当 process 终止以后马上启动一个新的。</li><li>askfirst：和 respawn 类似，在运行 process 之前在控制台上显示“Please press Enter to activate this console.”。只要用户按下“Enter”键以后才会执行 process。</li><li>wait：告诉 init，要等待相应的进程执行完以后才能继续执行。</li><li>once：仅执行一次，而且不会等待 process 执行完成。</li><li>restart：当 init 重启的时候才会执行 procee。</li><li>ctrlaltdel：当按下 ctrl+alt+del 组合键才会执行 process。</li><li>shutdown：关机的时候执行 process。</li></ul></li><li><p><process>：具体的动作，比如程序、脚本或命令等。</p></li><li><p>参考 busybox 的 <code>examples/inittab</code> 文件，我们也创建一个 <code>/etc/inittab</code>，在里面输入如下内容：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">etc/inittab</span></span><br><span class="line">::sysinit:/etc/init.d/rcS</span><br><span class="line">console::askfirst:-/bin/sh</span><br><span class="line">::restart:/sbin/init</span><br><span class="line">::ctrlaltdel:/sbin/reboot</span><br><span class="line">::shutdown:/bin/umount -a -r</span><br><span class="line">::shutdown:/sbin/swapoff -a</span><br></pre></td></tr></table></figure></li><li><p>第 2 行，系统启动以后运行 <code>/etc/init.d/rcS</code> 这个脚本文件。</p></li><li><p>第 3 行，将 console 作为控制台终端，也就是 <code>ttymxc0</code>。</p></li><li><p>第 4 行，重启的话运行<code>/sbin/init</code>。</p></li><li><p>第 5 行，按下 ctrl+alt+del 组合键的话就运行<code>/sbin/reboot</code>，看来 ctrl+alt+del 组合键用于重启系统。</p></li><li><p>第 6 行，关机的时候执行<code>/bin/umount</code>，也就是卸载各个文件系统。</p></li><li><p>第 7 行，关机的时候执行<code>/sbin/swapoff</code>，也就是关闭交换分区。</p></li><li><p><code>/etc/inittab</code> 文件创建好以后就可以重启开发板即可，至此！根文件系统要创建的文件就已经全部完成了。接下来就要对根文件系统进行其他的测试，比如我们自己编写的软件运行是否正常、是否支持软件开机自启动、中文支持是否正常以及能不能链接等。</p></li></ul><h2 id="5-根文件系统其他功能测试">5.根文件系统其他功能测试</h2><h3 id="5-1-软件运行测试">5.1 软件运行测试</h3><ul><li><p>我们使用 Linux 的目的就是运行我们自己的软件，我们编译的应用软件一般都使用动态库，使用动态库的话应用软件体积就很小，但是得提供库文件，库文件我们已经添加到了根文件系统中。我们编写一个小小的测试软件来测试一下库文件是否工作正常，在根文件系统下创建一个名为<code>drivers</code>的文件夹，以后我们学习 Linux 驱动的时候就把所有的实验文件放到这个文件夹里面。</p></li><li><p>在 ubuntu 下使用 vim 编辑器新建一个 <code>hello.c</code> 文件，在 <code>hello.c</code> 里面输入如下内容：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>) &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;hello world!\r\n&quot;</span>);</span><br><span class="line">        sleep(<span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p><code>hello.c</code> 内容很简单，就是循环输出“hello world”，<code>sleep</code> 相当于 Linux 的延时函数，单位为秒，所以 sleep(2)就是延时 2 秒。编写好以后就是编译，因为我们是要在 ARM 芯片上运行的，所以要用交叉编译器去编译，也就是使用 <code>arm-linux-gnueabihf-gcc</code> 编译，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">arm-linux-gnueabihf-gcc hello.c -o hello</span><br></pre></td></tr></table></figure></li><li><p>使用 <code>arm-linux-gnueabihf-gcc</code> 将 <code>hello.c</code> 编译为 <code>hello</code> 可执行文件。这个 <code>hello</code> 可执行文件究竟是不是 ARM 使用的呢？使用“file”命令查看文件类型以及编码格式：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">file hello //查看 hello 的文件类型以及编码格式</span><br></pre></td></tr></table></figure></li><li><p>结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p35.webp" alt=""></p></li><li><p>可以看出：<code>hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked…… </code>，hello 是个 32 位的 LSB 可执行文件，ARM 架构的，并且是动态链接的。所以我们编译出来的 hello 文件没有问题。将其拷贝到 <code>rootfs/drivers</code> 目录下，在开发板中输入如下命令来执行这个可执行文件：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /drivers //进入 drivers 目录</span><br><span class="line">./hello //执行 hello</span><br></pre></td></tr></table></figure></li><li><p>结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p36.webp" alt=""></p></li><li><p>可以看出，hello 这个软件运行正常，说明我们的根文件系统中的共享库是没问题的，要想终止 hello 的运行，按下“ctrl+c”组合键即可。此时大家应该能感觉到，hello 执行的时候终端是没法用的，除非使用“ctrl+c”来关闭 hello，那么有没有办法既能让 hello 正常运行，而且终端能够正常使用？那肯定是有的，让 hello 进入后台运行就行了，让一个软件进入后台的方法很简单，运行软件的时候加上“&amp;”即可，比如<code>./hello &amp;</code>就是让 hello 在后台运行。在后台运行的软件可以使用<code>kill -9 pid</code>(进程 ID)”命令来关闭掉，首先使用<code>ps</code>命令查看要关闭的软件 PID 是多少，ps 命令用于查看所有当前正在运行的进程，并且会给出进程的 PID。输入<code>ps</code>命令，结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p37.webp" alt=""></p></li><li><p>可以看出 hello 对应的 PID 为 166，因此我们使用如下命令关闭在后台运行的 hello 软件：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kill -9 166</span><br></pre></td></tr></table></figure></li><li><p>因为 hello 在不断的输出“hello world”所以我们的输入看起来会被打断，其实是没有的，因为我们是输入，而 hello 是输出。在数据流上是没有打断的，只是显示在 SecureCRT 上就好像被打断了，所以只管输入<code>kill -9 166</code>即可。hello 被 kill 以后会有提示，如图 38.5.1.4 所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p38.webp" alt=""></p></li><li><p>再去用 ps 命令查看一下当前的进程，发现没有 hello 了。这个就是 Linux 下的软件后台运行以及如何关闭软件的方法，重点就是 3 个操作：软件后面加<code>&amp;</code>、使用 <code>ps</code> 查看要关闭的软件 PID、使用<code>kill -9 pid</code>来关闭指定的软件。</p></li></ul><h3 id="5-2-中文字符测试">5.2 中文字符测试</h3><ol><li><p>设置 SecureCRT 使用 UTF-8 编码</p><ul><li>因为 Linux 使用的编码格式为 UTF-8，因此要先设置 SecureCRT 的编码格式。打开<code>Options-&gt;Session Options…</code>，打开<code>Session Options</code>对话框，选择左侧的<code>Appearance</code>，然后在右侧的<code>Character encoding:</code>栏选择 UTF-8 编码，如图所示：</li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p39.webp" alt=""></p><ul><li>设置好以后点击下方的“Ok”按钮即可，SecureCRT 我们就设置好了。</li></ul></li><li><p>创建中文文件</p><ul><li><p>在 ubuntu 中向在 rootfs 目录新建一个名为“中文测试”的文件夹，然后在 SecureCRT 下查看中文名能不能显示正确。输入<code>ls</code>命令，结果如图 38.5.2.2 所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p40.webp" alt=""></p></li><li><p>可以看出“中文测试”这个文件夹显示正常，接着<code>touch</code>命令在“中文测试”文件夹中新建一个名为“测试文档.txt”的文件，并且使用 vim 编辑器在其中输入“这是一个中文测试文件”，借此来测试一下中文文件名和中文内容显示是否正常。在 SecureCRT 中使用“cat”命令来查看“测试文档.txt”中的内容，结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p41.webp" alt=""></p></li><li><p>可以看出，“测试文档.txt”的中文内容显示正确，而且中文路径也完全正常，说明我们的根文件系统已经完美支持中文了！</p></li></ul></li></ol><h3 id="5-3-开机自启动测试">5.3 开机自启动测试</h3><ul><li><p>目前我们的 hello 软件都是等 Linux 启动进入根文件系统以后手动输入命令<code>./hello</code>来完成的。我们一般做好产品以后都是需要开机自动启动相应的软件，本节我们就以 hello 这个软件为例，讲解一下如何实现开机自启动。前面我们说过了，进入根文件系统的时候会运行 <code>/etc/init.d/rcS</code> 这个 shell 脚本，因此我们可以在这个脚本里面添加自启动相关内容。添加完成以后的 <code>/etc/init.d/rcS</code> 文件内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/sh</span></span><br><span class="line">PATH=/sbin:/bin:/usr/sbin:/usr/bin</span><br><span class="line">LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib</span><br><span class="line">runlevel=S</span><br><span class="line">umask 022</span><br><span class="line">export PATH LD_LIBRARY_PATH runlevel</span><br><span class="line"></span><br><span class="line">mount -a</span><br><span class="line">mkdir /dev/pts</span><br><span class="line">mount -t devpts devpts /dev/pts</span><br><span class="line"></span><br><span class="line">echo /sbin/mdev &gt; /proc/sys/kernel/hotplug</span><br><span class="line">mdev -s</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">开机自启动</span></span><br><span class="line">cd /drivers</span><br><span class="line">./hello &amp;</span><br><span class="line">cd /</span><br></pre></td></tr></table></figure></li><li><p>第 16 行，进入 drivers 目录，因为要启动的软件存放在 drivers 目录下。</p></li><li><p>第 17 行，以后台方式执行 hello 这个软件。</p></li><li><p>第 18 行，退出 drivers 目录，进入到根目录下。</p></li><li><p>自启动代码添加完成以后就可以重启开发板，看看 hello 这个软件会不会自动运行。结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p42.webp" alt=""></p></li><li><p>可以看出，hello 开机自动运行了，说明开机自启动成功。</p></li></ul><h3 id="5-4-外网连接测试">5.4 外网连接测试</h3><ul><li><p>这里说的外网不是外国哪些 404 网站的连接测试，而是百度、淘宝等这些网站的测试。也就是说看看我们的开发板能不能上网，能不能和我们的局域网外的这些网站进行通信。测试方法很简单，就是通过 ping 命令来 ping 一下百度的官网：<a href="http://www.baidu.com">www.baidu.com</a>。输入如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ping www.baidu.com</span><br></pre></td></tr></table></figure></li><li><p>结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p43.webp" alt=""></p></li><li><p>可以看出，测试失败，提示 <a href="http://www.baidu.com">www.baidu.com</a> 是个“bad address”，也就是地址不对，显然我们的地址是正确的。<a href="http://xn--www-i68dycue24cm0orkm5t2a2udeyi792cjhqng0e9cn36u.baidu.com">之所以出现这个错误提示是因为www.baidu.com</a> 的地址解析失败了，并没有解析出其对应的 IP 地址。我们需要配置域名解析服务器的 IP 地址，一般域名解析地址可以设置为所处网络的网关地址，比如 192.168.1.1。也可以设置为 114.114.114.114，这个是运营商的域名解析服务器地址。</p></li><li><p>在 rootfs 中新建文件 <code>/etc/resolv.conf</code>，然后在里面输入如下内容：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nameserver 114.114.114.114</span><br><span class="line">nameserver 192.168.1.1</span><br></pre></td></tr></table></figure></li><li><p>设置很简单，<code>nameserver</code> 表示这是个域名服务器，设置了两个域名服务器地址：<code>114.114.114.114</code> 和<code>192.168.1.1</code>，大家也可以改为其他的域名服务器试试。如果使用<code>udhcpc</code>命令自动获取 IP 地址，“udhcpc”命令会修改 nameserver 的值，一般是将其设置为对应的网关地址。修改好以后保存退出，重启开发板！重启以后重新 ping 一下百度官网，结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/04/01/p44.webp" alt=""></p></li><li><p>可以看出 ping 百度官网成功了！域名也成功的解析了，至此！我们的根文件系统就彻底的制作完成，这个根文件系统最好打包保存一下，防止以后做实验不小心破坏了根文件系统而功亏一篑，又得从头制作根文件系统。<strong>uboot、Linux kernel、rootfs 这三个共同构成了一个完整的 Linux 系统</strong>，现在的系统至少是一个可以正常运行的系统，后面我们就可以在这个系统上完成 Linux 驱动开发的学习。</p></li></ul>]]></content>
    
    
    <summary type="html">🍂本文简单概括构建Linux内核根文件系统的流程</summary>
    
    
    
    <category term="嵌入式知识点总结" scheme="https://www.fomal.cc/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="嵌入式" scheme="https://www.fomal.cc/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="Linux驱动" scheme="https://www.fomal.cc/tags/Linux%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>Linux系统移植篇(二)——Linux内核移植</title>
    <link href="https://www.fomal.cc/posts/7aaa16c1.html"/>
    <id>https://www.fomal.cc/posts/7aaa16c1.html</id>
    <published>2023-03-30T00:00:00.000Z</published>
    <updated>2023-04-01T02:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-NXP-官方开发板-Linux-内核编译">1.NXP 官方开发板 Linux 内核编译</h2><ul><li>NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的，所以我们肯定是以 I.MX6ULL EVK 开发板为参考，然后将 Linux 内核移植到 I.MX6U-ALPHA 开发板上的。</li></ul><h3 id="1-1-修改顶层-Makefile">1.1 修改顶层 Makefile</h3><ul><li><p>修改顶层 Makefile，直接在顶层 <code>Makefile</code> 文件里面定义 <code>ARCH</code> 和 <code>CROSS_COMPILE</code> 这两个的变量值为 <code>arm</code> 和 <code>arm-linux-gnueabihf-</code>，结果如图所示：</p><p><img src="https://cdnjson.com/images/2023/03/30/pic8.webp" alt=""></p></li><li><p>第 252 和 253 行分别设置了 <code>ARCH</code> 和 <code>CROSS_COMPILE</code> 这两个变量的值，这样在编译的时候就不用输入很长的命令了。</p></li></ul><h3 id="1-2-配置并编译-Linux-内核">1.2 配置并编译 Linux 内核</h3><ul><li><p>和 uboot 一样，在编译 Linux 内核之前要先配置 Linux 内核。每个板子都有其对应的默认配置文件，这些默认配置文件保存在 <code>arch/arm/configs</code> 目录中。<code>imx_v7_defconfig</code> 和 <code>imx_v7_mfg_defconfig </code>都可作为 I.MX6ULL EVK 开发板所使用的默认配置文件。但是这里建议使用 <code>imx_v7_mfg_defconfig</code> 这个默认配置文件，首先此配置文件默认支持 I.MX6UL 这款芯片，而且重要的一点就是此文件编译出来的<code>zImage</code> 可以通过 NXP 官方提供的 MfgTool 工具烧写！<code>imx_v7_mfg_defconfig</code> 中的“mfg”的意思就是 MfgTool。</p></li><li><p>进入到 Ubuntu 中的 Linux 源码根目录下，执行如下命令配置 Linux 内核：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">make clean //第一次编译 Linux 内核之前先清理一下</span><br><span class="line">make imx_v7_mfg_defconfig //配置 Linux 内核</span><br></pre></td></tr></table></figure></li><li><p>配置完成以后如图：</p><p><img src="https://cdnjson.com/images/2023/03/30/pic9.webp" alt=""></p></li><li><p>配置完成以后就可以编译了，使用如下命令编译 Linux 内核：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make -j16 //编译 Linux 内核</span><br></pre></td></tr></table></figure></li><li><p>等待编译完成，结果如图所示：</p><p><img src="https://cdnjson.com/images/2023/03/30/pic10.webp" alt=""></p></li><li><p>Linux 内核编译完成以后会在 <code>arch/arm/boot</code> 目录下生成 <code>zImage</code> 镜像文件，如果使用设备树的话还会在 <code>arch/arm/boot/dts</code> 目录下开发板对应的.dtb(设备树)文件，比如 <code>imx6ull-14x14-evk.dtb</code> 就是 NXP 官方的 I.MX6ULL EVK 开发板对应的设备树文件。至此我们得到两个文件：</p><ol><li>Linux 内核镜像文件：<code>zImage</code>。</li><li>NXP 官方 I.MX6ULL EVK 开发板对应的设备树文件：<code>imx6ull-14x14-evk.dtb</code>。</li></ol></li></ul><h3 id="1-3-Linux-内核启动测试">1.3 Linux 内核启动测试</h3><ul><li><p>在上一小节我们已经得到了 NXP 官方 I.MX6ULL EVK 开发板对应的 <code>zImage</code> 和 <code>imx6ull-14x14-evk.dtb</code> 这两个文件。这两个文件能不能在正点原子的 I.MX6U-ALPHA EMMC 版开发板上启动呢？测试一下不就知道了，在测试之前确保 uboot 中的环境变量 <code>bootargs</code> 内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw</span><br></pre></td></tr></table></figure></li><li><p>将上一小节编译出来的 <code>zImage</code> 和 <code>imx6ull-14x14-evk.dtb</code> 复制到 Ubuntu 中的 tftp 目录下，因为我们要在 uboot 中使用 tftp 命令将其下载到开发板中，拷贝命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cp arch/arm/boot/zImage /home/zuozhongkai/linux/tftpboot/ -f</span><br><span class="line">cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/zuozhongkai/linux/tftpboot/ -f</span><br></pre></td></tr></table></figure></li><li><p>拷贝完成以后就可以测试了，启动开发板，进入 uboot 命令行模式，然后输入如下命令将 <code>zImage</code> 和 <code>imx6ull-14x14-evk.dtb</code> 下载到开发板中并启动：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">tftp 80800000 zImage</span><br><span class="line">tftp 83000000 imx6ull-14x14-evk.dtb</span><br><span class="line">bootz 80800000 - 83000000</span><br></pre></td></tr></table></figure></li><li><p>结果图所示：</p><p><img src="https://cdnjson.com/images/2023/03/30/pic11.webp" alt=""></p></li><li><p>从图可以看出，此时 Linux 内核已经启动了，如果 EMMC 中的根文件系统存在，我们就可以进入到 Linux 系统里面使用命令进行操作如图所示:</p><p><img src="https://cdnjson.com/images/2023/03/30/pic12.webp" alt=""></p></li></ul><h3 id="1-4-根文件系统缺失错误">1.4 根文件系统缺失错误</h3><ul><li><p>Linux 内核启动以后是需要根文件系统的，根文件系统存在哪里是由 uboot 的 <code>bootargs</code> 环境变量指定，<code>bootargs</code> 会传递给 Linux 内核作为命令行参数。比如上一小节设置 <code>root=/dev/mmcblk1p2</code>，也就是说根文件系统存储在 <code>/dev/mmcblk1p2</code> 中，也就是 EMMC 的分区 2 中。这是因为正点原子的 EMMC 版本开发板出厂的时候已经 EMMC 的分区 2 中烧写好了根文件系统，所以设置 <code>root=/dev/mmcblk1p2</code>。如果我们不设置根文件系统路径，或者说根文件系统路径设置错误的话会出现什么问题？这个问题是很常见的，我们在实际的工作中开发一个产品，这个产品的第一版硬件出来以后我们是没有对应的根文件系统可用的，必须要自己做根文件系统。在构建出对应的根文件系统之前 Linux 内核是没有根文件系统可用的，此时 Linux 内核启动以后会出现什么问题呢？带着这个问题，我们将 uboot 中的 <code>bootargs</code> 环境变量改为“console=ttymxc0,115200”，也就是不填写 root 的内容了，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">setenv bootargs &#x27;console=ttymxc0,115200&#x27; //设置 bootargs</span><br><span class="line">saveenv //保存</span><br></pre></td></tr></table></figure></li><li><p>修改完成以后重新从网络启动，启动以后会有如图 37.2.4.1 所示错误：</p><p><img src="https://cdnjson.com/images/2023/03/30/pic13.webp" alt=""></p></li><li><p>在图中最后会有下面这一行：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)</span><br></pre></td></tr></table></figure></li><li><p>也就是提示内核崩溃，因为 VFS(虚拟文件系统)不能挂载根文件系统，因为根文件系统目录不存在。即使根文件系统目录存在，如果根文件系统目录里面是空的依旧会提示内核崩溃。这个就是根文件系统缺失导致的内核崩溃，但是内核是启动了的，只是根文件系统不存在而已。</p></li></ul><h2 id="2-在-Linux-中添加自己的开发板">2.在 Linux 中添加自己的开发板</h2><ul><li>在上一小节中我们通过编译 NXP 官方 I.MX6ULL EVK 开发板对应的 Linux 内核，发现其可以在正点原子的 EMMC 版本开发板启动，所以我们就参考 I.MX6ULL EVK 开发板的设置，在 Linux 内核中添加正点原子的 I.MX6U-ALPHA 开发板。</li></ul><h3 id="2-1-添加开发板默认配置文件">2.1 添加开发板默认配置文件</h3><ul><li><p>将 <code>arch/arm/configs</code> 目 录 下 的 <code>imx_v7_mfg_defconfig</code> 重 新 复 制 一 份 ， 命 名 为 <code>imx_alientek_emmc_defconfig</code>，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd arch/arm/configs</span><br><span class="line">cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig</span><br></pre></td></tr></table></figure></li><li><p>打开 <code>imx_alientek_emmc_defconfig</code> 文件，找到“CONFIG_ARCH_MULTI_V6=y”这一行，将其屏蔽掉，如图所示：</p><p><img src="https://cdnjson.com/images/2023/03/31/p10.webp" alt=""></p></li><li><p>因为 I.MX6ULL 是 ARMV7 架构的，因此要屏蔽掉 V6 相关选项，否则后面做驱动实验的时候可能会遇到驱动模块无法加载的情况。以后 <code>imx_alientek_emmc_defconfig</code> 就是正点原子的 EMMC 版开发板默认配置文件了。完成以后如图：</p><p><img src="https://cdnjson.com/images/2023/03/31/p11.webp" alt=""></p></li><li><p>以后就可以使用如下命令来配置正点原子 EMMC 版开发板对应的 Linux 内核了：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make imx_alientek_emmc_defconfig </span><br></pre></td></tr></table></figure></li></ul><h3 id="2-2-添加开发板对应的设备树文件">2.2 添加开发板对应的设备树文件</h3><ul><li><p>添加适合正点原子 EMMC 版开发板的设备树文件，进入目录 <code>arch/arm/boot/dts</code> 中，复制一份 <code>imx6ull-14x14-evk.dts</code>，然后将其重命名为 <code>imx6ull-alientek-emmc.dts</code>，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd arch/arm/boot/dts </span><br><span class="line">cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts </span><br></pre></td></tr></table></figure></li><li><p><code>.dts</code> 是设备树源码文件，编译 Linux 的时候会将其编译为<code>.dtb</code> 文件。<code>imx6ull-alientek-emmc.dts</code>创 建 好 以 后 我 们 还 需 要 修 改 文 件 <code>arch/arm/boot/dts/Makefile</code> ， 找 到 <code>dtb-$(CONFIG_SOC_IMX6ULL)</code>配置项，在此配置项中加入<code>imx6ull-alientek-emmc.dtb</code> ，如下所示：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">dtb-<span class="variable">$(CONFIG_SOC_IMX6ULL)</span> += \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-adc.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-cs42888.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-ecspi.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-emmc.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-epdc.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-flexcan2.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-gpmi-weim.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-lcdif.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-ldo.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-qspi.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-qspi-all.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-tsc.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-uart2.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-usb.dtb \ </span><br><span class="line">    imx6ull-14x14-ddr3-arm2-wm8958.dtb \ </span><br><span class="line">    imx6ull-14x14-evk.dtb \ </span><br><span class="line">    imx6ull-14x14-evk-btwifi.dtb \ </span><br><span class="line">    imx6ull-14x14-evk-emmc.dtb \ </span><br><span class="line">    imx6ull-14x14-evk-gpmi-weim.dtb \ </span><br><span class="line">    imx6ull-14x14-evk-usb-certi.dtb \ </span><br><span class="line">    imx6ull-alientek-emmc.dtb \ </span><br><span class="line">    imx6ull-9x9-evk.dtb \ </span><br><span class="line">    imx6ull-9x9-evk-btwifi.dtb \ </span><br><span class="line">    imx6ull-9x9-evk-ldo.dtb </span><br></pre></td></tr></table></figure></li><li><p>这样编译 Linux 的时候就可以从 <code>imx6ull-alientek-emmc.dts</code> 编译出 <code>imx6ull-alientek-emmc.dtb</code> 文件了</p></li></ul><h3 id="2-3-编译测试">2.3 编译测试</h3><ul><li><p>Linux 内核里面已经添加了正点原子 I.MX6UL-ALIPHA EMMC 版 开 发 板 了 ， 接 下 接 编 译 测 试 一 下 ， 我 们 可 以 创 建 一 个 编 译 脚 本 ，<code>imx6ull_alientek_emmc.sh</code>，脚本内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/sh</span> </span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean </span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig </span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig </span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16 </span><br></pre></td></tr></table></figure></li><li><p>第 2 行，清理工程。</p></li><li><p>第 3 行，使用默认配置文件 <code>imx_alientek_emmc_defconfig</code> 来配置Linux 内核。</p></li><li><p>第 4 行，打开Linux 的图形配置界面，如果不需要每次都打开图形配置界面可以删除此行。</p></li><li><p>第 5 行，编译 Linux。</p></li><li><p>执行shell 脚本 <code>imx6ull_alientek_emmc.sh</code> 编译Linux 内核，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod 777 imx6ull_alientek_emmc.sh //给予可执行权限 </span><br><span class="line">./imx6ull_alientek_emmc.sh //执行 shell 脚本编译内核 </span><br></pre></td></tr></table></figure></li><li><p>编译完成以后就会在目录 <code>arch/arm/boot</code> 下生成 <code>zImage</code> 镜像文件。在 <code>arch/arm/boot/dts</code> 目录下生成 <code>imx6ull-alientek-emmc.dtb</code> 文件。将这两个文件拷贝到 tftp 目录下，然后重启开发板，在uboot 命令模式中使用 tftp 命令下载这两个文件并启动，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">tftp 80800000 zImage </span><br><span class="line">tftp 83000000 imx6ull-alientek-emmc.dtb </span><br><span class="line">bootz 80800000 – 83000000 </span><br></pre></td></tr></table></figure></li><li><p>Linux 内核启动成功，说明我们已经在 NXP 提供的 Linux 内核源码中添加了正点原子I.MX6UL-ALPHA 开发板。</p><p><img src="https://cdnjson.com/images/2023/03/31/p12.webp" alt=""></p></li></ul><h2 id="3-CPU-主频和网络驱动修改">3.CPU 主频和网络驱动修改</h2><h3 id="3-1-CPU-主频修改">3.1 CPU 主频修改</h3><ol><li><p>设置 I.MX6U-ALPHA 开发板工作在 792MHz</p><ul><li><p>确保EMMC 中的根文件系统可用！然后重新启动开发板，进入终端(可以输入命令)</p></li><li><p>利用如下命令行以后输入如下命令查看cpu 信息：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /proc/cpuinfo </span><br></pre></td></tr></table></figure><p><img src="https://cdnjson.com/images/2023/03/31/p13.webp" alt=""></p></li><li><p>在图中有 <code>BogoMIPS</code> 这一条，此时 <code>BogoMIPS</code> 为3.00，BogoMIPS 是 Linux 系统中衡量处理器运行速度的一个“尺子”，处理器性能越强，主频越高，BogoMIPS 值就越大。BogoMIPS 只是粗略的计算 CPU 性能，并不十分准确。但是我们可以通过 BogoMIPS 值来大致的判断当前处理器的性能。在图中并没有看到当前 CPU 的工作频率，那我们就转变另一种方法查看当前 CPU 的工作频率。进入到目录<code>/sys/bus/cpu/devices/cpu0/cpufreq</code>中，此目录下会有很多文件，如图所示：</p></li></ul><p><img src="https://cdnjson.com/images/2023/03/31/p14.webp" alt=""></p><ul><li><p>此目录中记录了 CPU 频率等信息：</p></li><li><p>scaling_governor：governor(调频)策略，Linux 内核一共有 5 中调频策略，</p><ol><li>Performance，最高性能，直接用最高频率，不考虑耗电。</li><li>Interactive，一开始直接用最高频率，然后根据 CPU 负载慢慢降低。</li><li>Powersave，省电模式，通常以最低频率运行，系统性能会受影响，一般不会用这个！</li><li>Userspace，可以在用户空间手动调节频率。</li><li>Ondemand，定时检查负载，然后根据负载来调节频率。负载低的时候降低 CPU 频率，这样省电，负载高的时候提高 CPU 频率，增加性能。</li></ol></li><li><p>使用如下命令查看当前 CPU 频率：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat cpuinfo_cur_freq </span><br></pre></td></tr></table></figure></li><li><p>查得当前 CPU 频率为 198MHz，工作频率很低！其他的值如下：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">cpuinfo_cur_freq = 198000 </span><br><span class="line">cpuinfo_max_freq = 792000 </span><br><span class="line">cpuinfo_min_freq = 198000 </span><br><span class="line">scaling_cur_freq = 198000 </span><br><span class="line">scaling_max_freq = 792000 </span><br><span class="line"><span class="built_in">cat</span> scaling_min_freq = 198000 </span><br><span class="line">scaling_available_frequencies = 198000 396000 528000 792000 </span><br><span class="line"><span class="built_in">cat</span> scaling_governor = ondemand </span><br></pre></td></tr></table></figure></li><li><p>可以看出，当前 CPU 支持 198MHz、396MHz、528Mhz 和 792MHz 四种频率切换，其中调频策略为 <code>ondemand</code>，也就是定期检查负载，然后根据负载情况调节 CPU 频率。因为当前我们开发板并没有做什么工作，因此 CPU 频率降低为 198MHz 以省电。如果开发板做一些高负载的工作，比如播放视频等操作那么 CPU 频率就会提升上去。查看 <code>stats</code> 目录下的 <code>time_in_state</code> 文件可以看到 CPU 在各频率下的工作时间，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /sys/bus/cpu/devices/cpu0/cpufreq/stats/time_in_state </span><br></pre></td></tr></table></figure><p><img src="https://cdnjson.com/images/2023/03/31/p15.webp" alt=""></p></li><li><p>从图中可以看出，CPU 在 198MHz、396MHz、528MHz 和 792MHz 都工作过，其中 198MHz 的工作时间最长！假如我们想让 CPU 一直工作在 792MHz 那该怎么办？很简单，配置Linux 内核，将调策略选择为<code>performance</code>。或者修改<code>imx_alientek_emmc_defconfig</code> 文件，此文件中有下面几行：</p></li></ul>  <figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y  // 配置 ondemand 为默认调频策略</span><br><span class="line">CONFIG_CPU_FREQ_GOV_POWERSAVE=y // 使能 powersave 策略</span><br><span class="line">CONFIG_CPU_FREQ_GOV_USERSPACE=y // 使能 userspace 策略</span><br><span class="line">CONFIG_CPU_FREQ_GOV_INTERACTIVE=y  // 使能 interactive 策略</span><br></pre></td></tr></table></figure><ul><li><p>将示例代码中的第 1 行屏蔽掉，然后在第 4 行后面添加：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG_CPU_FREQ_GOV_ONDEMAND=y </span><br></pre></td></tr></table></figure></li><li><p>修改完成以后重新编译 Linux 内核，编译之前先清理一下工程！因为我们重新修改过默认配置文件了，编译完成以后使用新的 <code>zImage</code> 镜像文件重新启动 Linux 。再次查看 <code>/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq</code> 文件的值，可以看出，当前 CPU 频率为 792MHz 了。查看 <code>scaling_governor</code> 文件看一下当前的调频策略，可以看出当前的 CPU 调频策略为 <code>preformance</code>，也就是高性能模式，一直以最高主频运行。</p></li></ul></li><li><p>超频至 700MHz</p><ul><li><p>修改一下设备树文件 <code>arch/arm/boot/dts/imx6ull.dtsi</code> 即可，打开imx6ull.dtsi，找到下面代码：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">cpu0: cpu@0 &#123; </span><br><span class="line">     compatible = &quot;arm,cortex-a7&quot;; </span><br><span class="line">     device_type = &quot;cpu&quot;; </span><br><span class="line">     reg = &lt;0&gt;; </span><br><span class="line">     clock-latency = &lt;61036&gt;; /* two CLK32 periods</span><br><span class="line">     operating-points = &lt; </span><br><span class="line">         /* kHz  uV */ </span><br><span class="line">         996000  1275000 </span><br><span class="line">         792000  1225000 </span><br><span class="line">         696000  1225000 // 新加入的</span><br><span class="line">         528000  1175000 </span><br><span class="line">         396000  1025000 </span><br><span class="line">         198000  950000 </span><br><span class="line">     &gt;; </span><br><span class="line">     fsl,soc-operating-points = &lt; </span><br><span class="line">     /* KHz uV */ </span><br><span class="line">     996000 1175000 </span><br><span class="line">     792000 1175000 </span><br><span class="line">     696000 1175000 // 新加入的</span><br><span class="line">     528000 1175000 </span><br><span class="line">     396000 1175000 </span><br><span class="line">      198000 1175000 </span><br><span class="line"><span class="meta prompt_"> &gt;</span><span class="language-bash">;</span> </span><br></pre></td></tr></table></figure></li><li><p>第 10 行，加入了“696000 1225000”，这个就是696MHz 的支持。</p></li><li><p>第 19 行，加入了“696000 1175000”，也是对 696MHz 的支持。 修改好以后保存，并且编译设备树，在 Linux 内核源码根目录下输入如下命令编译设备树：</p></li></ul>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make dtbs </span><br></pre></td></tr></table></figure><ul><li>命令“make dtbs”只编译设备树文件，也就是将.dts 编译为.dtb，编译完成以后使用新的设备 树 文 件 <code>imx6ull-alientek_emmc.dtb</code> 启 动 Linux 。 重 启 以 后 查 看 文 件<code>/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies</code> 的内容，可以看出，此时支持了 696MHz。如果设置调频策略为 <code>performance</code>，那么处理器就会一直工作在696MHz。可以对比一下工作在528MHz 和696MHz 下的BogoMIPS 的值，528MHz 和 696MHz 下的 BogoMIPS 值分别为8.00 和 10.54，相当于性能提升了(10.54/8)-1=31.75%。</li></ul></li></ol><h3 id="3-2-修改-EMMC-驱动">3.2  修改 EMMC 驱动</h3><ol><li><p>使能8 线 EMMC 驱动</p><ul><li><p>正点原子EMMC 版本核心板上的EMMC 采用的 8 位数据线</p><p><img src="https://cdnjson.com/images/2023/03/31/p16.webp" alt=""></p></li><li><p>Linux 内核驱动里面 EMMC 默认是4 线模式的，4 线模式肯定没有 8 线模式的速度快，所以本节我们将 EMMC 的驱动修改为 8 线模式。修改方法很简单，直接修改设备树即可，打开文件 <code>imx6ull-alientek-emmc.dts</code>，找到如下所示内容：</p></li></ul>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&amp;usdhc2 &#123; </span><br><span class="line">    pinctrl-names = &quot;default&quot;; </span><br><span class="line">    pinctrl-0 = &lt;&amp;pinctrl_usdhc2&gt;; </span><br><span class="line">    non-removable; </span><br><span class="line">    status = &quot;okay&quot;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure><ul><li><p>改为如下代码：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&amp;usdhc2 &#123; </span><br><span class="line">    pinctrl-names = &quot;default&quot;, &quot;state_100mhz&quot;, &quot;state_200mhz&quot;; </span><br><span class="line">    pinctrl-0 = &lt;&amp;pinctrl_usdhc2_8bit&gt;; </span><br><span class="line">    pinctrl-1 = &lt;&amp;pinctrl_usdhc2_8bit_100mhz&gt;; </span><br><span class="line">    pinctrl-2 = &lt;&amp;pinctrl_usdhc2_8bit_200mhz&gt;; </span><br><span class="line">    bus-width = &lt;8&gt;; </span><br><span class="line">    non-removable; </span><br><span class="line">    status = &quot;okay&quot;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure></li></ul></li><li><p>关闭 EMMC 1.8V 供电选项</p><ul><li><p>此时EMMC 工作电压是3.3V 的，因此我们要在示例代码中的 <code>usdhc2</code> 设备树节点中添加“no-1-8-v”选项，也就是关闭 1.8V 这个功能选项。防止内核在运行的时候用 1.8V 去驱动 EMMC，导致 EMMC 驱动出现问题，修改后的 usdhc2 节点内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&amp;usdhc2 &#123; </span><br><span class="line">    pinctrl-names = &quot;default&quot;, &quot;state_100mhz&quot;, &quot;state_200mhz&quot;; </span><br><span class="line">    pinctrl-0 = &lt;&amp;pinctrl_usdhc2_8bit&gt;; </span><br><span class="line">    pinctrl-1 = &lt;&amp;pinctrl_usdhc2_8bit_100mhz&gt;; </span><br><span class="line">    pinctrl-2 = &lt;&amp;pinctrl_usdhc2_8bit_200mhz&gt;; </span><br><span class="line">    bus-width = &lt;8&gt;; </span><br><span class="line">    non-removable; </span><br><span class="line">    no-1-8-v; </span><br><span class="line">    status = &quot;okay&quot;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure></li><li><p>修改完成以后保存一下 <code>imx6ull-alientek-emmc.dts</code>，然后使用命令“make dtbs”重新编译一下设备树，编译完成以后使用新的设备树重启 Linux 系统即可。</p></li></ul></li></ol><h3 id="3-3-V2-4及以后版本底板网络驱动修改">3.3 V2.4及以后版本底板网络驱动修改</h3><ul><li>讲解 uboot 移植的时候就已经说过了，正点原子开发板的网络和NXP 官方的网络硬件上不同，网络 PHY 芯片由KSZ8081 换为了 SR8201F，两个网络 PHY 芯片的复位IO 也不同。所以 Linux 内核自带的网络驱动是驱动不起来 I.MX6U-ALPHA 开发板上的网络的，需要做修改。</li></ul><ol><li><p>修改 SR8201F 的复位以及网络时钟引脚驱动</p><ul><li><p>ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。ENET2的复位引脚 ENET2_RST 连接在 I.MX6ULL 的 SNVS_TAMPER8 上。打开设备树文件 <code>imx6ull-alientek-emmc.dts</code>，找到如下代码：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">pinctrl_spi4: spi4grp &#123; </span><br><span class="line">                fsl,pins = &lt; </span><br><span class="line"> MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1 </span><br><span class="line"> MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1 </span><br><span class="line"> MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1 </span><br><span class="line"> MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000</span><br><span class="line">                &gt;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure></li><li><p>示例代码中第 5 和 6 行就是初始化 <code>SNVS_TAMPER7</code> 和<code> SNVS_TAMPER8</code> 这两个引脚的，不过看样子好像是作为了 SPI4 的 IO，这不是我们想要的，所以将 588 和 589 这两行删除掉！删除掉以后继续在 <code>imx6ull-alientek-emmc.dts</code> 中找到如下所示代码：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">spi4 &#123; </span><br><span class="line">   compatible = &quot;spi-gpio&quot;; </span><br><span class="line">   pinctrl-names = &quot;default&quot;; </span><br><span class="line">   pinctrl-0 = &lt;&amp;pinctrl_spi4&gt;; </span><br><span class="line">   pinctrl-assert-gpios = &lt;&amp;gpio5 8 GPIO_ACTIVE_LOW&gt;;  </span><br><span class="line">   ... </span><br><span class="line">   cs-gpios = &lt;&amp;gpio5 7 0&gt;; </span><br></pre></td></tr></table></figure></li><li><p>第 5 行，设置<code>GPIO5_IO08</code> 为SPI4 的一个功能引脚(我也不清楚具体作为什么功能用)，而 <code>GPIO5_IO08</code> 就是 <code>SNVS_TAMPER8</code> 的GPIO 功能引脚。 第 7 行设置 <code>GPIO5_IO07</code> 作为 SPI4 的片选引脚，而 <code>GPIO5_IO07</code> 就是 <code>SNVS_TAMPER7</code> 的 GPIO 功能引脚。 现在我们需要 <code>GPIO5_IO07 </code>和 <code>GPIO5_IO08</code> 分别作为 ENET1 和 ENET2 的复位引脚，而不是SPI4 的什么功能引脚，因此将示例代码中的第 5 行和第 7 行处的代码删除掉！！否则会干扰到网络复位引脚！ 在 <code>imx6ull-alientek-emmc.dts</code> 里面找到名为“iomuxc_snvs”的节点(直接搜索)，然后在此节点下添加网络复位引脚信息，添加完成以后的“iomuxc_snvs”的节点内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">&amp;iomuxc_snvs &#123; </span><br><span class="line"> pinctrl-names = &quot;default_snvs&quot;; </span><br><span class="line">        pinctrl-0 = &lt;&amp;pinctrl_hog_2&gt;; </span><br><span class="line">        imx6ul-evk &#123; </span><br><span class="line">... /*省略掉其他*/ </span><br><span class="line"> </span><br><span class="line"> /*enet1 reset zuozhongkai*/ </span><br><span class="line"> pinctrl_enet1_reset: enet1resetgrp &#123; </span><br><span class="line"> fsl,pins = &lt; </span><br><span class="line"> /* used for enet1 reset */ </span><br><span class="line"> MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 </span><br><span class="line"><span class="meta prompt_"> &gt;</span><span class="language-bash">;</span> </span><br><span class="line"> &#125;; </span><br><span class="line"> </span><br><span class="line"> /*enet2 reset zuozhongkai*/ </span><br><span class="line"> pinctrl_enet2_reset: enet2resetgrp &#123; </span><br><span class="line"> fsl,pins = &lt; </span><br><span class="line"> /* used for enet2 reset */ </span><br><span class="line"> MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 </span><br><span class="line"><span class="meta prompt_"> &gt;</span><span class="language-bash">;</span> </span><br><span class="line"> &#125;; </span><br><span class="line">       &#125;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure></li><li><p>第 1 行，<code>imx6ull-alientek-emmc.dts</code> 文件中 <code>iomuxc_snvs</code> 节点；第 8-13 行，ENET1 网络复位引脚配置信息；第 16~21 行，ENET2 网络复位引脚配置信息；最后还需要修改一下 ENET1 和 ENET2 的网络时钟引脚配置，继续在 <code>imx6ull-alientek-emmc.dts</code> 中找到如下所示代码：</p></li></ul>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">pinctrl_enet1: enet1grp &#123; </span><br><span class="line">    fsl,pins = &lt; </span><br><span class="line"> MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b031 </span><br><span class="line">    &gt;; </span><br><span class="line">&#125;; </span><br><span class="line"> </span><br><span class="line">pinctrl_enet2: enet2grp &#123; </span><br><span class="line">    fsl,pins = &lt; </span><br><span class="line"> MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0 </span><br><span class="line"> MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b031 </span><br><span class="line">    &gt;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure><ul><li>第 10 和 25 行，分别为 ENET1 和ENET2 的网络时钟引脚配置信息，将这两个引脚的电气属性值改为 0x4001b031(原来默认值就是 0x4001b031)。修改完成以后记得保存一下 <code>imx6ull-alientek-emmc.dts</code>，网络复位以及时钟引脚驱动就修改好了。</li></ul></li><li><p>修改 fec1 和fec2 节点的 pinctrl-0 属性</p><ul><li><p>在 <code>imx6ull-alientek-emmc.dts</code> 文件中找到名为“fec1”和“fec2”的这两个节点，修改其中的“pinctrl-0”属性值，修改以后如下所示：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">&amp;fec1 &#123; </span><br><span class="line"> pinctrl-names = &quot;default&quot;; </span><br><span class="line"> pinctrl-0 = &lt;&amp;pinctrl_enet1 </span><br><span class="line"> &amp;pinctrl_enet1_reset&gt;; </span><br><span class="line"> phy-mode = &quot;rmii&quot;; </span><br><span class="line">... </span><br><span class="line"> status = &quot;okay&quot;; </span><br><span class="line">&#125;; </span><br><span class="line"> </span><br><span class="line">&amp;fec2 &#123; </span><br><span class="line"> pinctrl-names = &quot;default&quot;; </span><br><span class="line"> pinctrl-0 = &lt;&amp;pinctrl_enet2 </span><br><span class="line">             &amp;pinctrl_enet2_reset&gt;; </span><br><span class="line"> phy-mode = &quot;rmii&quot;; </span><br><span class="line">... </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure></li><li><p>第 3~4 行，修改后的 fec1 节点“pinctrl-0”属性值。</p></li><li><p>第 12~13 行，修改后的 fec2 节点“pinctrl-0”属性值。</p></li></ul></li><li><p>修改 SR8201F 的PHY 地址</p><ul><li><p>在 uboot 移植章节中，我们说过 ENET1 的 LAN8720A 地址为 0x2，ENET2 的 LAN8720A地址为 0x1。在 <code>imx6ull-alientek-emmc.dts</code> 中找到如下代码：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">&amp;fec1 &#123; </span><br><span class="line">    pinctrl-names = &quot;default&quot;; </span><br><span class="line">.. </span><br><span class="line">    phy-handle = &lt;&amp;ethphy0&gt;; </span><br><span class="line">    status = &quot;okay&quot;; </span><br><span class="line">&#125;; </span><br><span class="line"> </span><br><span class="line">&amp;fec2 &#123; </span><br><span class="line">    pinctrl-names = &quot;default&quot;; </span><br><span class="line">.. </span><br><span class="line">    phy-handle = &lt;&amp;ethphy1&gt;; </span><br><span class="line">    status = &quot;okay&quot;; </span><br><span class="line"> </span><br><span class="line">    mdio &#123; </span><br><span class="line">        #address-cells = &lt;1&gt;; </span><br><span class="line">        #size-cells = &lt;0&gt;; </span><br><span class="line"> </span><br><span class="line">        ethphy0: ethernet-phy@0 &#123; </span><br><span class="line">            compatible = &quot;ethernet-phy-ieee802.3-c22&quot;; </span><br><span class="line">            reg = &lt;2&gt;; </span><br><span class="line">        &#125;; </span><br><span class="line"> </span><br><span class="line">        ethphy1: ethernet-phy@1 &#123; </span><br><span class="line">            compatible = &quot;ethernet-phy-ieee802.3-c22&quot;; </span><br><span class="line">            reg = &lt;1&gt;; </span><br><span class="line">        &#125;; </span><br><span class="line">    &#125;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure></li><li><p>第 1~6 行，ENET1 对应的设备树节点。</p></li><li><p>第 8~28 行，ENET2 对应的设备树节点。但是第 14-28 行的 <code>mdio</code> 节点描述了 ENET1 和 ENET2 的 PHY 地址信息。将示例代码改为如下内容：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">&amp;fec1 &#123; </span><br><span class="line">    pinctrl-names = &quot;default&quot;; </span><br><span class="line">    pinctrl-0 = &lt;&amp;pinctrl_enet1 </span><br><span class="line">            &amp;pinctrl_enet1_reset&gt;; </span><br><span class="line">    phy-mode = &quot;rmii&quot;; </span><br><span class="line">    phy-handle = &lt;&amp;ethphy0&gt;; </span><br><span class="line">    phy-reset-gpios = &lt;&amp;gpio5 7 GPIO_ACTIVE_LOW&gt;; </span><br><span class="line">    phy-reset-duration = &lt;200&gt;; </span><br><span class="line">    status = &quot;okay&quot;; </span><br><span class="line">&#125;; </span><br><span class="line"></span><br><span class="line">&amp;fec2 &#123; </span><br><span class="line">    pinctrl-names = &quot;default&quot;; </span><br><span class="line">    pinctrl-0 = &lt;&amp;pinctrl_enet2 </span><br><span class="line">                &amp;pinctrl_enet2_reset&gt;; </span><br><span class="line">    phy-mode = &quot;rmii&quot;; </span><br><span class="line">    phy-handle = &lt;&amp;ethphy1&gt;; </span><br><span class="line">    phy-reset-gpios = &lt;&amp;gpio5 8 GPIO_ACTIVE_LOW&gt;; </span><br><span class="line">    phy-reset-duration = &lt;200&gt;; </span><br><span class="line">    status = &quot;okay&quot;; </span><br><span class="line"> </span><br><span class="line">    mdio &#123; </span><br><span class="line">        #address-cells = &lt;1&gt;; </span><br><span class="line">        #size-cells = &lt;0&gt;; </span><br><span class="line"> </span><br><span class="line">        ethphy0: ethernet-phy@2 &#123; </span><br><span class="line">            compatible = &quot;ethernet-phy-ieee802.3-c22&quot;; </span><br><span class="line">            smsc,disable-energy-detect; </span><br><span class="line">            reg = &lt;2&gt;; </span><br><span class="line">         &#125;; </span><br><span class="line">  </span><br><span class="line">        ethphy1: ethernet-phy@1 &#123; </span><br><span class="line">            compatible = &quot;ethernet-phy-ieee802.3-c22&quot;; </span><br><span class="line">            smsc,disable-energy-detect; </span><br><span class="line">            reg = &lt;1&gt;; </span><br><span class="line">        &#125;; </span><br><span class="line">    &#125;; </span><br><span class="line">&#125;; </span><br></pre></td></tr></table></figure></li><li><p>第 7 和 8 行，添加了 ENET1 网络复位引脚所使用的 IO 为 <code>GPIO5_IO07</code>，低电平有效。复位低电平信号持续时间为 200ms。</p></li><li><p>第 18 和 19 行，ENET2 网络复位引脚所使用的 IO 为 <code>GPIO5_IO08</code>，同样低电平有效，持续时间同样为 200ms。</p></li><li><p>第 28 和 34 行，<code>smsc,disable-energy-detect</code>表明 PHY 芯片是 SMSC 公司的，这样 Linux内核就会找到 SMSC 公司的 PHY 芯片驱动来驱动 LAN8720A。</p></li><li><p>第 26 行，注意<code>ethernet-phy@</code>后面的数字是 PHY 的地址，ENET1 的 PHY 地址为 2，所以“@”后面是 2。</p></li><li><p>第 29 行，reg 的值也表示 PHY 地址，ENET1 的 PHY 地址为2，所以reg=2。</p></li><li><p>第 32 行，ENET2 的 PHY 地址为1，因此“@”后面为 1。</p></li><li><p>第 35 行，因为 ENET2 的 PHY 地址为 1，所以 reg=1。</p></li><li><p>至此，SR8201F 的 PHY 地址就改好了，保存一下 <code>imx6ull-alientek-emmc.dts</code> 文件。然后使<br>用<code>make dtbs</code>命令重新编译一下设备树。</p></li></ul></li><li><p>修改 fec_main.c 文件</p><ul><li><p>要 在 I.MX6ULL 上 使 用 SR8201F ， 需 要 修 改 一 下 Linux 内 核 源 码 ， 打 开<code>drivers/net/ethernet/freescale/fec_main.c</code>，找到函数 <code>fec_reset_phy</code>，在 <code>fec_reset_phy</code> 函数中加入如下代码：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">static void fec_reset_phy(struct platform_device *pdev) </span><br><span class="line">&#123; </span><br><span class="line">   int err, phy_reset; </span><br><span class="line">   int msec = 1; </span><br><span class="line">   struct device_node *np = pdev-&gt;dev.of_node; </span><br><span class="line"> </span><br><span class="line">   if (!np) </span><br><span class="line">       return; </span><br><span class="line"> </span><br><span class="line">   err = of_property_read_u32(np, &quot;phy-reset-duration&quot;, &amp;msec);</span><br><span class="line">   /* A sane reset duration should not be longer than 1s */ </span><br><span class="line">   if (!err &amp;&amp; msec &gt; 1000) </span><br><span class="line">       msec = 1; </span><br><span class="line"> </span><br><span class="line">   phy_reset = of_get_named_gpio(np, &quot;phy-reset-gpios&quot;, 0); </span><br><span class="line">   if (!gpio_is_valid(phy_reset)) </span><br><span class="line">       return; </span><br><span class="line"> </span><br><span class="line">   err = devm_gpio_request_one(&amp;pdev-&gt;dev, phy_reset, </span><br><span class="line">                   GPIOF_OUT_INIT_LOW, &quot;phy-reset&quot;); </span><br><span class="line">   if (err) &#123; </span><br><span class="line">       dev_err(&amp;pdev-&gt;dev, &quot;failed to get phy-reset-gpios: %d\n&quot;</span><br><span class="line"> </span><br><span class="line">       return; </span><br><span class="line">   &#125; </span><br><span class="line">   msleep(msec); </span><br><span class="line">   gpio_set_value(phy_reset, 1); </span><br><span class="line">   msleep(200); /* 复位结束后至少再延时 150ms才能继续操作SR8201F */</span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure></li><li><p>第 28 行就是新加入的代码，根据 SR8201F 收据手册上的要求，SR8201F 在复位结束以后需要等待至少 150ms 才能操作 SR8201F，因此这里添加了一个 200ms 的延时。</p></li></ul></li><li><p>网络驱动测试</p><ul><li><p>修改好设备树和 Linux 内核以后重新编译一下，得到新的 <code>zImage</code> 镜像文件和 <code>imx6ull-alientek-emmc.dtb</code> 设备树文件，使用网线将 I.MX6U-ALPHA 开发板的两个网口与路由器或者电脑连接起来，最后使用新的文件启动Linux 内核。启动以后使用<code>ifconfig</code>命令查看一下当前活动的网卡有哪些，结果如图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p17.webp" alt=""></p></li><li><p>从图可以看出，当前没有活动的网卡。输入命令<code>ifconfig -a</code>来查看一下开发板中存在的所有网卡，结果如下图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p18.webp" alt=""></p></li><li><p>can0 为CAN 接口的网卡，eth0 和eth1 才是网络接口的网卡，其中eth0 对应于 ENET2，eth1 对应于 ENET1。使用如下命令依次打开 eth0 和 eth1 这两个网卡：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ifconfig eth0 up </span><br><span class="line">ifconfig eth1 up </span><br></pre></td></tr></table></figure></li><li><p>网卡的打开过程如图：</p><p><img src="https://cdnjson.com/images/2023/04/01/p19.webp" alt=""></p></li><li><p>可以看到<code>Generic PHY</code>字样，说明当前的网络驱动使用的就是 Linux 内核自带的通用网络 PHY 驱动。 再次输入<code>ifconfig</code>命令来查看一下当前活动的网卡，结果如图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p20.webp" alt=""></p></li><li><p>可以看出，此时 eth0 和 eth1 两个网卡都已经打开，并且工作正常，但是这两个网卡都还没有 IP 地址，所以不能进行 ping 等操作。使用如下命令给两个网卡配置IP 地址：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ifconfig eth0 192.168.1.251 </span><br><span class="line">ifconfig eth1 192.168.1.252 </span><br></pre></td></tr></table></figure></li><li><p>上述命令配置 eth0 和eth1 这两个网卡的 IP 地址分别为 192.168.1.251 和 192.168.1.252，注意 IP 地址选择的合理性，一定要和自己的电脑处于同一个网段内，并且没有被其他的设备占用！设置好以后，使用<code>ping</code>命令来 ping 一下自己的主机，如果能ping 通那说明网络驱动修改成功！比如我的Ubuntu 主机 IP 地址为 192.168.1.250，使用如下命令 ping 一下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ping 192.168.1.250 </span><br></pre></td></tr></table></figure></li><li><p>结果如图所示：</p><p><img src="https://cdnjson.com/images/2023/04/01/p21.webp" alt=""></p></li><li><p>可以看出，ping 成功，说明网络驱动修改成功！我们在后面的构建根文件系统和 Linux 驱动开发中就可以使用网络调试代码啦。</p></li></ul><h2 id="4-总结">4.总结</h2><ul><li><p><span style="color:red;font-weight:bold">关于Linux 内核的移植就讲解到这里，简单总结一下移植步骤： </span></p><ol><li><p>在Linux 内核中查找可以参考的板子，一般都是半导体厂商自己做的开发板。</p></li><li><p>编译出参考板子对应的 <code>zImage</code> 和 <code>.dtb</code> 文件。</p></li><li><p>使用参考板子的 <code>zImage</code> 文件和 <code>.dtb</code> 文件在我们所使用的板子上启动 Linux 内核，看能否启动。</p></li><li><p>如果能启动的话就万事大吉，如果不能启动那就悲剧了，需要调试 Linux 内核。不过一般都会参考半导体官方的开发板设计自己的硬件，所以大部分情况下都会启动起来。启动Linux 内核用到的外设不多，一般就 DRAM(Uboot 都初始化好的)和串口。作为终端使用的串口一般都会参考半导体厂商的Demo 板。</p></li><li><p>修改相应的驱动，像 NAND Flash、EMMC、SD 卡等驱动官方的 Linux 内核都是已经提供好了，基本不会出问题。重点是<strong>网络驱动</strong>，因为 Linux 驱动开发一般都要通过网络调试代码，所以一定要确保网络驱动工作正常。如果是处理器 <strong>内部 MAC+外部 PHY</strong> 这种网络方案的话，一般网络驱动都很好处理，因为在 Linux 内核中是有外部 PHY 通用驱动的。只要设置好<strong>复位引脚、PHY 地址信息</strong>基本上都可驱动起来。</p></li><li><p>Linux 内核启动以后需要<strong>根文件系统</strong>，如果没有根文件系统的话肯定会崩溃，所以确定Linux内核移植成功以后就要开始根文件系统的构建。</p></li></ol></li></ul></li></ol>]]></content>
    
    
    <summary type="html">🌳本文简单概括将Linux内核移植至I.MX6ULL开发板的流程</summary>
    
    
    
    <category term="嵌入式知识点总结" scheme="https://www.fomal.cc/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="嵌入式" scheme="https://www.fomal.cc/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="Linux驱动" scheme="https://www.fomal.cc/tags/Linux%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>Linux系统移植篇(一)——Uboot移植</title>
    <link href="https://www.fomal.cc/posts/9e744961.html"/>
    <id>https://www.fomal.cc/posts/9e744961.html</id>
    <published>2023-03-28T21:00:00.000Z</published>
    <updated>2023-04-01T02:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-NXP-官方开发板-uboot-编译测试">1.NXP 官方开发板 uboot 编译测试</h2><h3 id="1-1-查找-NXP-官方的开发板默认配置文件">1.1 查找 NXP 官方的开发板默认配置文件</h3><ul><li><p>uboot 移植并不是完完全全从零开始将 uboot 移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的，这个工作一般是半导体厂商做的，半导体厂商负责将 uboot 移植到他们的芯片上，因此半导体厂商都会自己做一个开发板，这个开发板就叫做原厂开发板，比如大家学习 STM32 时听说过的 discover 开发板就是 ST 自己做的。半导体厂商会将 uboot 移植到他们自己的原厂开发板上，测试好以后就会将这个 uboot 发布出去，这就是大家常说的原厂 BSP 包。我们一般做产品的时候就会<strong>参考原厂的开发板做硬件，然后在原厂提供的 BSP 包上做修改，将 uboot 或者 linux kernel 移植到我们的硬件上</strong>。这个就是 uboot 移植的一般流程：</p><ol><li>在 uboot 中找到参考的开发平台，一般是原厂的开发板。</li><li>参考原厂开发板移植 uboot 到我们所使用的开发板上。</li></ol></li><li><p>正点原子的 I.MX6ULL 开发板参考的是 NX 官方的 I.MX6ULL EVK 开发板做的硬件，因此我们在移植 uboot 时就可以以 NXP 官方的 I.MX6ULL EVK 开发板为蓝本。</p></li><li><p>本章我们是将 NXP 官方的 uboot 移植到正点原子的 I.MX6ULL 开发板上在移植之前，我们先编译一下 NXP 官方 I.MX6ULL EVK 开发板对应的 uboot，首先是配置 uboot，<code>configs</code> 录下有很多跟 I.MX6UL/6ULL 有关的配置如下图所示：</p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.8.webp" style="zoom:50%;" /></li><li><p>从图中可以看出有很多的默认配置文件，其中以 <code>mx6ul</code> 开头的是 I.MX6UL 芯片的，mx6ull 开头的是 I.MX6ULL 开发板的。I.MX6UL/6ULL 有 9x9mm 和 14x14mm 两种尺寸的，所以我们可以看到会有 mx6ull_9x9 和 mx6ull_14x14 开头的默认配置文件。我们使用的是 14x14mm 的芯片，所以关注 mx6ull_14x14 开头的默认配置文件。正点原子的 I.MX6ULL 有 EMMC 和 NAND 两个版本的，因此我们最终只需要关注 <code>mx6ull_14x14_evk_emmc_defconfig</code> 和<code>mx6ull_14x14_evk_nand_defconfig</code> 这两个配置文件就行了。本章我们讲解 EMMC 版本的移植（NAND 版本移植很多类似），所以使用<code>mx6ull_14x14_evk_emmc_defconfig</code> 作为默认配置文件。</p></li></ul><h3 id="1-2-编译-NXP-官方开发板对应的-uboot">1.2 编译 NXP 官方开发板对应的 uboot</h3><ul><li><p>找到 NXP 官方 I.MX6ULL EVK 开发板对应的默认配置文件以后就可以编译一下，使用如下命令编译 uboot：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig</span><br><span class="line">make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16</span><br></pre></td></tr></table></figure></li><li><p>在编译的时候需要输入<code>ARCH</code> 和<code>CORSS_COMPILE</code>这两个变量的值，这样太麻烦了。我们可以直接在顶层 <code>Makefile</code> 中直接给 <code>ARCH</code> 和<code>CORSS_COMPILE</code> 赋值：</p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.815e2821ae7139ef0.png" style="zoom:80%;" /></li><li><p>250、251 行就是直接给 <code>ARCH</code> 和 <code>CROSS_COMPILE</code> 赋值，这样我们就可以使用如下简短的命令来编译 uboot：</p></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">make mx6ull_14x14_evk_emmc_defconfig</span><br><span class="line">make V=1 -j16</span><br></pre></td></tr></table></figure><ul><li><p>如果既不想修改 uboot 的顶层 Makefile，又想编译的时候不用输入那么多，那么就直接创建个 shell 脚本就行了，shell 脚本名为 <code>mx6ull_14x14_emmc.sh</code>，然后在 shell 脚本里面输入如下内容：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean</span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig</span><br><span class="line">make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16</span><br></pre></td></tr></table></figure></li><li><p>记得给<code>mx6ull_14x14_emmc.sh</code> 这个文件可执行权限，使用 <code>mx6ull_14x14_emmc.sh</code> 脚本编译 uboot 的时候每次都会清理一下工程，然后全部重新编译，编译的时候直接执行这个脚本就行了，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./mx6ull_14x14_evk_emmc.sh</span><br></pre></td></tr></table></figure></li><li><p>编译完成以后会生成<code>u-boot.bin</code>、<code>u-boot.imx</code> 等文件，但是这些文件是 NXP 官方 I.MX6ULL EVK 开发板。能不能用到正点原子的 I.MX6ULL 开发板上呢？试一下不就知道了！</p></li></ul><h3 id="1-3-烧写验证与驱动测试">1.3 烧写验证与驱动测试</h3><ul><li><p>将 imxdownload 软件拷贝到 uboot 源码根目录下，然后使用 imxdownload 软件将 <code>u-boot.bin</code>烧写到 SD 卡中，烧写命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod 777 imxdownload //给予 imxdownload 可执行权限</span><br><span class="line">./imxdownload u-boot.bin /dev/sdd //烧写到 SD 卡中，不能烧写到/dev/sda 或 sda1 里面</span><br></pre></td></tr></table></figure></li><li><p>烧写完成以后将 SD 卡插入 I.MX6U-ALPHA 开发板的 TF 卡槽中，最后设置开发板从 SD 卡启动。打开 SecureCRT，设置好开发板所使用的串口并打开，复位开发板，SecureCRT 接收到如下图所示信息：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.8cd2d02997534778a.webp" alt=""></p></li><li><p>从图可以看出，uboot 启动正常，虽然我们用的是 NXP 官方 I.MX6ULL 开发板的 uboot，但是在正点原子的 I.MX6ULL 开发板上是可以正常启动的。而且 DRAM 识别正确，为 512MB，如果用的 NAND 版本的核心版的话 uboot 启动会失败！因为 NAND 核心版用的 256MB 的 DRAM。</p></li></ul><ol><li><p>SD 卡和 EMMC 驱动检查</p><ul><li><p>检查 SD 卡和 EMMC 驱动是否正常，使用命令 <code>mmc list</code> 列出当前的 MMC 设备，结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.86e1d1d7943901146.png" alt=""></p></li><li><p>从图 33.1.3.2 可以看出当前有两个 MMC 设备，检查每个 MMC 设备信息，先检查 MMC 设备 0，输入如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mmc dev 0</span><br><span class="line">mmc info</span><br></pre></td></tr></table></figure><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.888740a6198c865fa.webp" alt=""></p></li><li><p>可以看出，mmc 设备 0 是 SD 卡，SD 卡容量为 14.8GB，这个和我所使用的 SD 卡信息相符，说明 SD 卡驱动正常。再来检查 MMC 设备 1，输入如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mmc dev 1</span><br><span class="line">mmc info</span><br></pre></td></tr></table></figure><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.805d18e528f3a5447.webp" alt=""></p></li><li><p>可以看出，mmc 设备 1 为 EMMC，容量为 7.3GB，说明 EMMC 驱动也成功，SD 卡和 EMMC 的驱动都没问题。</p></li></ul></li><li><p>LCD 驱动检查</p><ul><li>如果 uboot 中的 LCD 驱动正确的话，启动 uboot 以后 LCD 上应该会显示出 NXP 的 logo</li></ul></li><li><p>网络驱动</p><ul><li><p>uboot 启动的时候提示“Board Net Initialization Failed”和“No ethernet found.”这两行，说明网络驱动也有问题，正常情况下应该是如下图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.8b996bc095e39ed8c.webp" alt=""></p></li><li><p>现在没有图中的信息，说明当前 uboot 的网络部驱动也是有问题的，这是因为正点原子开发板的网络芯片<strong>复位引脚</strong>和 NXP 官方开发板不一样，因此需要修改驱动。</p></li><li><p>总结一下 NXP 官方 I.MX6ULL EVK 开发板的 uboot 在正点原子 EMMC 版本 I.MX6ULL 开发板上的运行情况：</p><ol><li>uboot 启动正常，DRAM 识别正确，SD 卡和 EMMC 驱动正常。</li><li>uboot 里面的 LCD 驱动默认是给 4.3 寸 480x272 分辨率的，如果使用的其他分辨率的屏幕需要修改驱动。</li><li>网络不能工作，识别不出来网络信息，需要修改驱动。 接下来我们要做的工作如下：</li><li>前面我们一直使用着 NXP 官方开发板的 uboot 配置，接下来需要在 uboot 中添加我们自己的开发板，也就是正点原子的 I.MX6ULL 开发板。</li><li>解决 LCD 驱动和网络驱动的问题。</li></ol></li></ul></li></ol><h2 id="2-在-U-Boot-中添加自己的开发板">2.在 U-Boot 中添加自己的开发板</h2><ul><li>NXP 官方 uboot 中默认都是 NXP 自己的开发板，虽说我们可以直接在官方的开发板上直接修改，使 uboot 可以完整的运行在我们的板子上。但是从学习的角度来讲，这样我们就不能了解到 uboot 是如何添加新平台的。接下来我们就参考 NXP 官方的 I.MX6ULL EVK 开发板，学习如何在 uboot 中添加我们的开发板或者开发平台。</li></ul><h3 id="2-1-添加开发板默认配置文件">2.1 添加开发板默认配置文件</h3><ul><li><p>先在 configs 目录下创建默认配置文件，复制 <code>mx6ull_14x14_evk_emmc_defconfig</code>，然后重命名为 <code>mx6ull_alientek_emmc_defconfig</code>，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd configs</span><br><span class="line">cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig</span><br></pre></td></tr></table></figure></li><li><p>然后将文件 <code>mx6ull_alientek_emmc_defconfig</code> 中的内容改成下面的：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">CONFIG_SYS_EXTRA_OPTIONS=<span class="string">&quot;IMX_CONFIG=board/freescale/mx6ull_alientek_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK&quot;</span></span><br><span class="line">CONFIG_ARM=y</span><br><span class="line">CONFIG_ARCH_MX6=y</span><br><span class="line">CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y</span><br><span class="line">CONFIG_CMD_GPIO=y</span><br></pre></td></tr></table></figure></li><li><p>可以看出<code>mx6ull_alientek_emmc_defconfig</code> 基本和 <code>mx6ull_14x14_evk_emmc_defconfig</code> 中的内容一样，只是第 1 行和第 4 行做了修改。</p></li></ul><h3 id="2-2-添加开发板对应的头文件">2.2 添加开发板对应的头文件</h3><ul><li><p>在目录 <code>include/configs</code> 下添加 I.MX6ULL-ALPHA 开发板对应的头文件，复制<code>include/configs/mx6ullevk.h</code>，并重命名为 <code>mx6ull_alientek_emmc.h</code>，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp include/configs/mx6ullevk.h include/configs/mx6ull_alientek_emmc.h</span><br></pre></td></tr></table></figure></li><li><p>拷贝完成以后将：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> __MX6ULLEVK_CONFIG_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> __MX6ULLEVK_CONFIG_H</span></span><br></pre></td></tr></table></figure></li><li><p>改为：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> __MX6ULL_ALIENTEK_EMMC_CONFIG_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> __MX6ULL_ALIENTEK_EMMC_CONFIG_H</span></span><br></pre></td></tr></table></figure></li><li><p><code>mx6ull_alientek_emmc.h</code> 里面有很多宏定义，这些宏定义基本用于配置 uboot，也有一些 I.MX6ULL 的配置项目。如果我们自己要想使能或者禁止 uboot 的某些功能，那就在<code>mx6ull_alientek_emmc.h</code> 里面做修改即可。<code>mx6ull_alientek_emmc.h</code> 里面的内容比较多，去掉一些用不到的配置，精简后的内容如下(略)：</p></li><li><p>可以看出，<code>mx6ull_alientek_emmc.h</code> 文件中基本都是&quot;CONFIG_&quot;开头的宏定义，这也说明 <code>mx6ull_alientek_emmc.h</code> 文件的主要功能就是配置或者裁剪 uboot。如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可，如果不需要某个功能的话就删除掉对应的宏即可。我们详细的看一下 mx6ull_alientek_emmc.h 中这些宏都是什么功能：</p><ul><li>宏<code> PHYS_SDRAM_SIZE</code> 就是板子上 DRAM 的大小、</li><li>宏 <code>CONFIG_DISPLAY_CPUINFO</code>，uboot 启动的时候可以输出 CPU 信息</li><li>宏 <code>CONFIG_DISPLAY_BOARDINFO</code>，uboot 启动的时候可以输出板子信息</li><li>宏 <code>CONFIG_SYS_MALLOC_LEN</code> 为 malloc 内存池大小，这里设置为 16MB</li><li>宏 <code>CONFIG_MXC_UART_BASE</code> 表示串口寄存器基地址</li><li>宏 <code>CONFIG_SYS_FSL_ESDHC_ADDR</code> 为 EMMC 所使用接口的寄存器基地址</li><li>和 I2C 有关的宏定义，用于控制使能哪个 I2C，I2C 的速度为多少</li><li>宏 <code>CONFIG_MFG_ENV_SETTINGS</code> 定义了一些环境变量，使用 MfgTool 烧写系统时候会用到这里面的环境变量</li><li>宏 <code>CONFIG_EXTRA_ENV_SETTINGS</code> 也是设置一些环境变量</li><li>宏 <code>CONFIG_SYS_LOAD_ADDR</code> 表示 linux kernel 在 DRAM 中的加载地址，也就是 linux kernel 在 DRAM 中的存储首地址，<code>CONFIG_LOADADDR</code>=0X80800000</li><li>宏 <code>CONFIG_SYS_HZ</code> 为系统时钟频率，这里为 1000Hz</li><li>宏 <code>PHYS_SDRAM</code> 为 I.MX6ULL 的 DRAM 控制器 MMDC0 所管辖的 DRAM 范围起始地址，也就是 0X80000000</li><li>…</li></ul></li><li><p>关于 <code>mx6ull_alientek_emmc.h</code> 就讲解到这里，其中以 <code>CONFIG_CMD</code> 开头的宏都是用于使能相应命令的，其他的以 <code>CONFIG</code> 开头的宏都是完成一些配置功能的。以后会频繁的和<code>mx6ull_alientek_emmc.h</code> 这个文件打交道。</p></li></ul><h3 id="2-3-添加开发板对应的板级文件夹">2.3 添加开发板对应的板级文件夹</h3><ul><li><p>uboot 中每个板子都有一个对应的文件夹来存放板级文件，比如开发板上外设驱动文件等等。NXP 的 <a href="http://I.MX">I.MX</a> 系列芯片的所有板级文件夹都存放在 <code>board/freescale</code> 目录下，在这个目录下有个名为 <code>mx6ullevk</code> 的文件夹，这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件夹。复制 <code>mx6ullevk</code>，将其重命名为 <code>mx6ull_alientek_emmc</code>，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd board/freescale/</span><br><span class="line">cp mx6ullevk/ -r mx6ull_alientek_emmc</span><br></pre></td></tr></table></figure></li><li><p>进 入 <code>mx6ull_alientek_emmc</code> 目 录 中 ， 将 其 中 的 <code>mx6ullevk.c</code> 文 件 重 命 名 为<code>mx6ull_alientek_emmc.c</code>，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd mx6ull_alientek_emmc</span><br><span class="line">mv mx6ullevk.c mx6ull_alientek_emmc.c</span><br></pre></td></tr></table></figure></li><li><p>我们还需要对 <code>mx6ull_alientek_emmc</code> 目录下的文件做一些修改：</p><ol><li><p>修改<code>mx6ull_alientek_emmc</code> 目录下的 <code>Makefile</code> 文件 ：</p><p>将 mx6ull_alientek_emmc 下的 Makefile 文件内容改为如下所示：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># (C) Copyright <span class="number">2015</span> Freescale Semiconductor, Inc.</span><br><span class="line">#</span><br><span class="line"># SPDX-License-Identifier:   GPL<span class="number">-2.0</span>+</span><br><span class="line"><span class="meta">#</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">obj-y  := mx6ull_alientek_emmc.o</span></span><br><span class="line"></span><br><span class="line">extra-$(CONFIG_USE_PLUGIN) :=  plugin.bin</span><br><span class="line">$(obj)/plugin.bin: $(obj)/plugin.o</span><br><span class="line"> $(OBJCOPY) -O binary --gap-fill <span class="number">0xff</span> $&lt; $@</span><br></pre></td></tr></table></figure><p>重点是第 6 行的<code>obj-y</code>，改为<code>mx6ull_alientek_emmc.o</code>，这样才会编译<code>mx6ull_alientek_emmc.c</code>这个文件。</p></li><li><p>修改<code>mx6ull_alientek_emmc</code> 目录下的 <code>imximage.cfg</code> 文件，将 imximage.cfg 中的下面一句：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000</span><br></pre></td></tr></table></figure><p>改为：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PLUGIN board/freescale/mx6ull_alientek_emmc/plugin.bin 0x00907000</span><br></pre></td></tr></table></figure></li><li><p>修改<code>mx6ull_alientek_emmc</code> 目录下的 Kconfig 文件</p><p>修改 Kconfig 文件，修改后的内容如下：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">if TARGET_MX6ULL_ALIENTEK_EMMC</span><br><span class="line">  </span><br><span class="line">config SYS_BOARD</span><br><span class="line"> default <span class="string">&quot;mx6ull_alientek_emmc&quot;</span></span><br><span class="line">  </span><br><span class="line">config SYS_VENDOR</span><br><span class="line"> default <span class="string">&quot;freescale&quot;</span></span><br><span class="line">  </span><br><span class="line">config SYS_SOC</span><br><span class="line"> default <span class="string">&quot;mx6&quot;</span></span><br><span class="line">  </span><br><span class="line">config SYS_CONFIG_NAME</span><br><span class="line"> default <span class="string">&quot;mx6ull_alientek_emmc&quot;</span></span><br><span class="line">  </span><br><span class="line"><span class="keyword">endif</span></span><br></pre></td></tr></table></figure></li><li><p>修改 <code>mx6ull_alientek_emmc</code> 目录下的 <code>MAINTAINERS</code> 文件</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">MX6ULL_ALIENTEK_EMMC BOARD</span><br><span class="line"><span class="section">M:    Peng Fan &lt;peng.fan@nxp.com&gt;</span></span><br><span class="line"><span class="section">S:    Maintained</span></span><br><span class="line"><span class="section">F:    board/freescale/mx6ull_alientek_emmc/</span></span><br><span class="line"><span class="section">F:    include/configs/mx6ull_alientek_emmc.h</span></span><br></pre></td></tr></table></figure></li></ol></li></ul><h3 id="2-4-修改-U-Boot-图形界面配置文件">2.4 修改 U-Boot 图形界面配置文件</h3><ul><li><p>uboot 是支持图形界面配置，修改文件<code>arch/arm/cpu/armv7/mx6/Kconfig</code>(如果用的 I.MX6UL 的话，应该修改 arch/arm/Kconfig 这个文件)，在 207 行加入如下内容：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">config TARGET_MX6ULL_ALIENTEK_EMMC</span><br><span class="line"> bool <span class="string">&quot;Support mx6ull_alientek_emmc&quot;</span></span><br><span class="line"> select MX6ULL</span><br><span class="line"> select DM</span><br><span class="line"> select DM_THERMAL</span><br></pre></td></tr></table></figure></li><li><p>在最后一行的 endif 的前一行添加如下内容：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source <span class="string">&quot;board/freescale/mx6ull_alientek_emmc/Kconfig&quot;</span></span><br></pre></td></tr></table></figure></li><li><p>添加完成以后的 Kconfig 文件如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.8-1.webp" alt=""></p></li><li><p>到此为止，I.MX6U-ALPHA 开发板就已经添加到 uboot 中了，接下来就是编译这个新添加的开发板。</p></li></ul><h3 id="2-5-使用新添加的板子配置编译-uboot">2.5 使用新添加的板子配置编译 uboot</h3><ul><li><p>在 uboot 根目录下新建一个名为 <code>mx6ull_alientek_emmc.sh</code> 的 shell 脚本，在这个 shell 脚本里面输入如下内容：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean</span><br><span class="line">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig</span><br><span class="line">make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16</span><br></pre></td></tr></table></figure></li><li><p>第 3 行我们使用的默认配置文件就是刚刚新建的<code>mx6ull_alientek_emmc_defconfig</code> 这个配置文件。给予 <code>mx6ll_alientek_emmc.sh</code> 可执行权限，然后运行脚本来完成编译，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod 777 mx6ull_alientek_emmc.sh //给予可执行权限，一次即可</span><br><span class="line">./mx6ull_alientek_emmc.sh //运行脚本编译 uboot</span><br></pre></td></tr></table></figure></li><li><p>等待编译完成，编译完成以后输入如下命令，查看一下<code>mx6ull_alientek_emmc.h</code> 这个头文件有没有被引用：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -nR &quot;mx6ull_alientek_emmc.h&quot;</span><br></pre></td></tr></table></figure></li><li><p>如果有很多文件都引用了<code>mx6ull_alientek_emmc.h</code> 这个头文件，那就说明新板子添加成功：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.8-2.webp" alt=""></p></li><li><p>编译完成以后就使用 imxdownload 将新编译出来的 u-boot.bin 烧写到 SD 卡中测试，SecureCRT 输出结果如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.8-3.webp" alt=""></p></li><li><p>此时的 Board 还是“MX6ULL 14x14 EVK”，因为我们参考的 NXP 官方的 I.MX6ULL 开发板来添加自己的开发板。如果接了 LCD 屏幕的话会发现 LCD 屏幕并没有显示 NXP 的 logo，而且此时的网络同样也没识别出来。前面已经说了，默认 uboot 中的 LCD 驱动和网络驱动在正点原子的 I.MX6U-ALPHA 开发板上是有问题的，需要修改。</p></li></ul><h3 id="2-6-LCD-驱动修改">2.6 LCD 驱动修改</h3><ul><li><p>一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的，xxx 为板子名称，比如 <code>mx6ull_alientek_emmc.h</code> 和 <code>mx6ull_alientek_emmc.c</code> 这两个文件。 一般修改 LCD 驱动重点注意以下几点：</p><ol><li>LCD 所使用的 GPIO，查看 uboot 中 LCD 的 IO 配置是否正确。</li><li>LCD 背光引脚 GPIO 的配置。</li><li>LCD 配置参数是否正确。</li></ol></li><li><p>正点原子的 I.MX6U-ALPHA 开发板 LCD 原理图和 NXP 官方 I.MX6ULL 开发板一致，也就是 LCD 的 IO 和背光 IO 都一样的，所以 IO 部分就不用修改了。需要修改的之后 LCD 参数，打开文件 <code>mx6ull_alientek_emmc.c</code>，找到如下所示内容：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">display_info_t</span> <span class="title">const</span> <span class="title">displays</span>[] =</span> &#123;&#123;</span><br><span class="line"> .bus = MX6UL_LCDIF1_BASE_ADDR,</span><br><span class="line"> .addr = <span class="number">0</span>,</span><br><span class="line"> .pixfmt = <span class="number">24</span>,</span><br><span class="line"> .detect = <span class="literal">NULL</span>,</span><br><span class="line"> .enable = do_enable_parallel_lcd,</span><br><span class="line"> .mode = &#123;</span><br><span class="line"> .name = <span class="string">&quot;TFT43AB&quot;</span>,</span><br><span class="line"> .xres = <span class="number">480</span>,</span><br><span class="line"> .yres = <span class="number">272</span>,</span><br><span class="line"> .pixclock = <span class="number">108695</span>,</span><br><span class="line"> .left_margin = <span class="number">8</span>,</span><br><span class="line"> .right_margin = <span class="number">4</span>,</span><br><span class="line"> .upper_margin = <span class="number">2</span>,</span><br><span class="line"> .lower_margin = <span class="number">4</span>,</span><br><span class="line"> .hsync_len = <span class="number">41</span>,</span><br><span class="line"> .vsync_len = <span class="number">10</span>,</span><br><span class="line"> .sync = <span class="number">0</span>,</span><br><span class="line"> .vmode = FB_VMODE_NONINTERLACED</span><br><span class="line">&#125; &#125; &#125;;</span><br></pre></td></tr></table></figure></li><li><p>代码中定义了一个变量 <code>displays</code>，类型为 <code>display_info_t</code>，这个结构体是 LCD 信息结构体，其中包括了 LCD 的分辨率，像素格式，LCD 的各个参数等。<code>display_info_t</code> 定义在文件 <code>arch/arm/include/asm/imx-common/video.h</code> 中，定义如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">display_info_t</span> &#123;</span></span><br><span class="line"> <span class="type">int</span> bus;</span><br><span class="line"> <span class="type">int</span> addr;</span><br><span class="line"> <span class="type">int</span> pixfmt;</span><br><span class="line"> <span class="type">int</span> (*detect)(<span class="keyword">struct</span> <span class="type">display_info_t</span> <span class="type">const</span> *dev);</span><br><span class="line"> <span class="type">void</span> (*enable)(<span class="keyword">struct</span> <span class="type">display_info_t</span> <span class="type">const</span> *dev);</span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">fb_videomode</span> <span class="title">mode</span>;</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>pixfmt 是像素格式，也就是一个像素点是多少位，如果是 RGB565 的话就是 16 位，如果是 888 的话就是 24 位，一般使用 RGB888。结构体 <code>display_info_t</code> 还有个 mode 成员变量，此成员变量也是个结构体，为<code>fb_videomode</code>，定义在文件 <code>include/linux/fb.h</code> 中，定义如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">fb_videomode</span> &#123;</span></span><br><span class="line"> <span class="type">const</span> <span class="type">char</span> *name; <span class="comment">/* optional */</span></span><br><span class="line"> u32 refresh; <span class="comment">/* optional */</span></span><br><span class="line"> u32 xres;</span><br><span class="line"> u32 yres;</span><br><span class="line"> u32 pixclock;</span><br><span class="line"> u32 left_margin;</span><br><span class="line"> u32 right_margin;</span><br><span class="line"> u32 upper_margin;</span><br><span class="line"> u32 lower_margin;</span><br><span class="line"> u32 hsync_len;</span><br><span class="line"> u32 vsync_len;</span><br><span class="line"> u32 sync;</span><br><span class="line"> u32 vmode;</span><br><span class="line"> u32 flag;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>结构体 fb_videomode 里面的成员变量为 LCD 的参数，这些成员变量函数如下：</p></li><li><p>name：LCD 名字，要和环境变量中的 panel 相等。</p></li><li><p>xres、yres：LCD X 轴和 Y 轴像素数量。</p></li><li><p>pixclock：像素时钟，每个像素时钟周期的长度，单位为皮秒。</p></li><li><p>left_margin：HBP，水平同步后肩。</p></li><li><p>right_margin：HFP，水平同步前肩。</p></li><li><p>upper_margin：VBP，垂直同步后肩。</p></li><li><p>lower_margin：VFP，垂直同步前肩。</p></li><li><p>hsync_len：HSPW，行同步脉宽。</p></li><li><p>vsync_len：VSPW，垂直同步脉宽。</p></li><li><p>vmode：大多数使用 FB_VMODE_NONINTERLACED，也就是不使用隔行扫描。</p></li><li><p>可以看出，这些参数和我们第二十四章讲解 RGB LCD 的时候参数基本一样，唯一不同的像素时钟 pixclock 的含义不同，以正点原子的 7 寸 1024*600 分辨率的屏幕(ATK7016)为例，屏幕要求的像素时钟为 51.2MHz，因此：<code>pixclock=(1/51200000)*10^12=19531 </code></p></li><li><p>再根据其他的屏幕参数，可以得出 ATK7016 屏幕的配置参数如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">display_info_t</span> <span class="title">const</span> <span class="title">displays</span>[] =</span> &#123;&#123;</span><br><span class="line"> .bus = MX6UL_LCDIF1_BASE_ADDR,</span><br><span class="line"> .addr = <span class="number">0</span>,</span><br><span class="line"> .pixfmt = <span class="number">24</span>,</span><br><span class="line"> .detect = <span class="literal">NULL</span>,</span><br><span class="line"> .enable = do_enable_parallel_lcd,</span><br><span class="line"> .mode = &#123;</span><br><span class="line"> .name = <span class="string">&quot;TFT7016&quot;</span>,</span><br><span class="line"> .xres = <span class="number">1024</span>,</span><br><span class="line"> .yres = <span class="number">600</span>,</span><br><span class="line"> .pixclock = <span class="number">19531</span>,</span><br><span class="line"> .left_margin = <span class="number">140</span>, <span class="comment">//HBPD</span></span><br><span class="line"> .right_margin = <span class="number">160</span>, <span class="comment">//HFPD</span></span><br><span class="line"> .upper_margin = <span class="number">20</span>, <span class="comment">//VBPD</span></span><br><span class="line"> .lower_margin = <span class="number">12</span>, <span class="comment">//VFBD</span></span><br><span class="line"> .hsync_len = <span class="number">20</span>, <span class="comment">//HSPW</span></span><br><span class="line"> .vsync_len = <span class="number">3</span>, <span class="comment">//VSPW</span></span><br><span class="line"> .sync = <span class="number">0</span>,</span><br><span class="line"> .vmode = FB_VMODE_NONINTERLACED</span><br><span class="line">&#125; &#125; &#125;;</span><br></pre></td></tr></table></figure></li><li><p>使用示例代码中的屏幕参数替换掉 <code>mx6ull_alientek_emmc.c</code> 中 uboot 默认的屏幕参数。</p></li><li><p>打开 <code>mx6ull_alientek_emmc.h</code>，找到所有如下语句：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">panel=TFT43AB</span><br></pre></td></tr></table></figure></li><li><p>将其改为：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">panel=TFT7016</span><br></pre></td></tr></table></figure></li><li><p>也就是设置 panel 为 TFT7016，panel 的值要与示例代码中的<code>.name </code>成员变量的值一致。修改完成以后重新编译一遍 uboot 并烧写到 SD 中启动。重启以后 LCD 驱动一般就会工作正常了，LCD 上回显示 NXP 的 logo。但是有可能会遇到 LCD 并没有工作，还是黑屏，这是什么原因呢？在 uboot 命令模式输入“print”来查看环境变量 panel 的值，会发现 panel 的值要是 TFT43AB(或其他的，反正不是 TFT7016)，如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/28/I.MX6ULinuxV1.8-4.webp" alt=""></p></li><li><p>这是因为之前有将环境变量保存到 EMMC 中，uboot 启动以后会先从 EMMC 中读取环境变量，如果 EMMC 中没有环境变量的话才会使用 <code>mx6ull_alientek_emmc.h</code> 中的默认环境变量。如果 EMMC 中的环境变量 panel 不等于 TFT7016，那么 LCD 显示肯定不正常，我们只需要在 uboot 中修改 panel 的值为 TFT7016 即可，在 uboot 的命令模式下输入如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">setenv panel TFT7016</span><br><span class="line">saveenv</span><br></pre></td></tr></table></figure></li><li><p>上述命令修改环境变量 panel 为 TFT7016，然后保存，重启 uboot，此时 LCD 驱动就工作正常了。如果 LCD 还是没有正常工作的，那就要检查自己哪里有没有改错，或者还有哪里没有修改。</p></li></ul><h3 id="2-7-底板网络驱动修改">2.7 底板网络驱动修改</h3><div class="note info flat"><p>V2.4 及以后版本的底板网络芯片更换为 SR8201F，并且网络 PHY 地址也有改变</p></div><ol><li><p>I.MX6U-ALPHA 开发板网络简介</p><ul><li><p>I.MX6UL/ULL 内部有个以太网 MAC 外设，也就是 ENET，需要外接一个 PHY 芯片来实现网络通信功能，也就是<strong>内部 MAC+外部 PHY 芯片</strong>的方案。大家可能听过 DM9000 这个网络芯片，在一些没有内部 MAC 的 CPU 中，比如三星的 2440，4412 等，就会采用 DM9000 来实现联网功能。DM9000 提供了一个类似 SRAM 的访问接口，主控 CPU 通过这个接口即可与 DM9000 进行通信，DM9000 就是一个 MAC+PHY 芯片。这个方案就相当于外部 MAC+外部 PHY，那么 I.MX6U 这样的内部 MAC+PHY 芯片与 DM9000 方案比有什么优势吗？那优势大了去了！首先就是通信效率和速度，一般 SOC 内部的 MAC 是带有一个专用 DMA (Direct Memory Access) 的，专门用于处理网络数据包，采用 SRAM 来读写 DM9000 的速度是压根就没法和内部 MAC+外部 PHY 芯片的速度比。采用外部 DM9000 完全是无奈之举，谁让 2440，4412 这些芯片内部没有以太网外设呢，现在又想用有线网络，没有办法只能找个 DM9000 的方案。从这里也可以看出，三星的 2440、4412 这些芯片设计之初就不是给工业产品用的，他们是给消费类电子使用的，比如手机、平板等，手机或平板要上网，可以通过 WIFI 或者 4G，我是没有见过哪个手机或者平板上网是要接根网线的。正点原子的 I.MX6U-ALPHA 开发板也可以通过 WIFI 或者 4G 上网，这个是后话了。</p></li><li><p>I.MX6UL/ULL 有两个网络接口 ENET1 和 ENET2，正点原子的 I.MX6U-ALPHA 开发板提供了这两个网络接口，其中 ENET1 和 ENET2 都使用 SR8201F 作为 PHY 芯片。NXP 官方的 I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片，SR8201F 相比 KSZ8081 具有体积小、外围器件少、价格便宜等优点。直接使用 KSZ8081 固然可以，但是我们在实际的产品中不一定会使用 KSZ8081，有时候为了降低成本会选择其他的 PHY 芯片，这个时候就有个问题：换了 PHY 芯片以后网络驱动怎么办？为此，正点原子的 I.MX6U-ALPHA 开发板将 ENET1 和 ENET2 的 PHY 换成了 SR8201F，这样就可以给大家讲解<strong>更换 PHY 芯片以后如何调整网络驱动，使网络工作正常</strong>。</p></li><li><p>ENET1 的网络 PHY 芯片为 SR8201F，通过 RMII 接口与 I.MX6ULL 相连，正点原子 I.MX6U-ALPHA 开发板的 ENET1 引脚与 NXP 官方的 I.MX6ULL EVK 开发板基本一样，唯独复位引脚不同。正点原子 I.MX6U-ALPHA 开发板的 ENET1 复位引脚 ENET1_RST 接到了 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。 SR8201F 内部是有寄存器的，I.MX6ULL 会读取 SR8201F 内部寄存器来判断当前的物理链接状态、连接速度(10M 还是 100M)和双工状态(半双工还是全双工)。I.MX6ULL 通过 MDIO 接口来读取 PHY 芯片的内部寄存器，MDIO 接口有两个引脚，ENET_MDC 和 ENET_MDIO， ENET_MDC 提供时钟，ENET_MDIO 进行数据传输。一个 MDIO 接口可以管理 32 个 PHY 芯片，同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分，MIDO 接口通过不同的器件地址即可访问到相应的 PHY 芯片。I.MX6U-ALPHA 开发板 ENET1 上连接的 SR8201F 器件地址为 0X2，所示我们要修改 ENET1 网络驱动的话重点就三点：</p></li></ul><ol><li>ENET1 复位引脚初始化。</li><li>SR8201F 的器件 ID。</li><li>SR8201F 驱动</li></ol><ul><li>关于 ENET2 网络驱动的修改也注意一下三点：</li></ul><ol><li>ENET2 的复位引脚，ENET2 的复位引脚 ENET2_RST 接到了 I.MX6ULL 的 SNVS_TAMPER8 上。</li><li>ENET2 所使用的 PHY 芯片器件地址，PHY 器件地址为 0X1。</li><li>SR8201F 驱动，ENET1 和 ENET2 都使用的 SR8201F，所以驱动肯定是一样的。</li></ol></li><li><p>网络 PHY 地址修改</p><ul><li><p>首先修改 uboot 中的 ENET1 和 ENET2 的 PHY 地址和驱动，打开 <code>mx6ull_alientek_emmc.h </code>这个文件，找到如下代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifdef</span> CONFIG_CMD_NET</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_CMD_PING</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_CMD_DHCP</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_CMD_MII</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_MXC</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_MII</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_ENET_DEV 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> (CONFIG_FEC_ENET_DEV == 0)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IMX_FEC_BASE ENET_BASE_ADDR</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_MXC_PHYADDR     0x2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_XCV_TYPE         RMII</span></span><br><span class="line"><span class="meta">#<span class="keyword">elif</span> (CONFIG_FEC_ENET_DEV == 1)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IMX_FEC_BASE ENET2_BASE_ADDR</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_MXC_PHYADDR 0x1</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_XCV_TYPE RMII</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_ETHPRIME <span class="string">&quot;FEC&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_PHYLIB</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_PHY_MICREL</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure></li><li><p>第 7 行的宏 <code>CONFIG_FEC_ENET_DEV</code> 用于选择使用哪个网口，默认为 1，也就是选择 ENET2。第 11 行为 ENET1 的 PHY 地址，默认是 0X2，第 15 行为 ENET2 的 PHY 地址，默认为 0x1。根据前面的分析可知，正点原子的 I.MX6U-ALPHA 开发板 ENET1 的 PHY 地址刚好也为 0X2，ENET2 的 PHY 地址也是 0X1，所以可以直接使用默认配置，不需要我们修改。</p></li><li><p>第 21 行定了一个宏 <code>CONFIG_PHY_MICREL</code>，此宏用于使能 uboot 中 Micrel 公司的 PHY 驱动，KSZ8081 这颗 PHY 芯片就是 Micrel 公司生产的，不过 Micrel 已经被 Microchip 收购了。如果要使用 SR8201F，那么就得将 <code>CONFIG_PHY_MICREL</code> 改为 <code>CONFIG_PHY_REALTEK</code>。因为 SR8201F 就是 Pin to Pin 替换 Realtek 的 RTL8201F 的，因此可以直接使用 Realtek 的相关驱动。所以示例代码理论上有三处要修改：</p><ol><li>修改 ENET1 网络 PHY 的地址。</li><li>修改 ENET2 网络 PHY 的地址。</li><li>使能 REALTEK 公司的 PHY 驱动。</li></ol></li><li><p>但是，由于我们开发板上 SR8201F 的 PHY 地址和默认的配置一样，因此只需要是能 REALTEK 公司的 PHY 驱动，大家如果使用的其他品牌的开发板，那么就要根据实际情况来修改对应的 ENET1 和 ENET2 网络 PHY 地址。 修改后的网络 PHY 地址参数如下所示：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifdef</span> CONFIG_CMD_NET</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_CMD_PING</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_CMD_DHCP</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_CMD_MII</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_MXC</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_MII</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_ENET_DEV 1</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">if</span> (CONFIG_FEC_ENET_DEV == 0)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IMX_FEC_BASE ENET_BASE_ADDR</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_MXC_PHYADDR      0x2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_XCV_TYPE         RMII</span></span><br><span class="line"><span class="meta">#<span class="keyword">elif</span> (CONFIG_FEC_ENET_DEV == 1)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IMX_FEC_BASE ENET2_BASE_ADDR</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_MXC_PHYADDR     0x1</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_FEC_XCV_TYPE RMII</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_ETHPRIME <span class="string">&quot;FEC&quot;</span></span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_PHYLIB</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_PHY_REALTEK</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure></li></ul></li><li><p>删除 uboot 中 74LV595 的驱动代码</p><ul><li><p>uboot 中网络 PHY 芯片地址修改完成以后就是网络复位引脚的驱动修改了，打开<code>mx6ull_alientek_emmc.c</code>，找到如下代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> IOX_SDI IMX_GPIO_NR(5, 10)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IOX_STCP  IMX_GPIO_NR(5, 7)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IOX_SHCP  IMX_GPIO_NR(5, 11)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IOX_OE IMX_GPIO_NR(5, 8)</span></span><br></pre></td></tr></table></figure></li><li><p>以 IOX 开头的宏定义是 74LV595 的相关 GPIO，因为 NXP 官方 I.MX6ULL EVK 开发板使用 74LV595 来扩展 IO，两个网络的复位引脚就是由 74LV595 来控制的。正点原子的 I.MX6U-ALPHA 开发板并没有使用 74LV595，因此我们将对应的代码删除掉，替换为如下所示代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> ENET1_RESET IMX_GPIO_NR(5, 7)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ENET2_RESET IMX_GPIO_NR(5, 8)</span></span><br></pre></td></tr></table></figure></li><li><p>ENET1 的复位引脚连接到 SNVS_TAMPER7 上，对应 GPIO5_IO07，ENET2 的复位引脚连接到 SNVS_TAMPER8 上，对应 GPIO5_IO08。继续在 <code>mx6ull_alientek_emmc.c</code> 中找到如下代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">iomux_v3_cfg_t</span> <span class="type">const</span> iox_pads[] = &#123;</span><br><span class="line">    <span class="comment">/* IOX_SDI */</span></span><br><span class="line">    MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),</span><br><span class="line">    <span class="comment">/* IOX_SHCP */</span></span><br><span class="line">    MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),</span><br><span class="line">    <span class="comment">/* IOX_STCP */</span></span><br><span class="line">    MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),</span><br><span class="line">    <span class="comment">/* IOX_nOE */</span></span><br><span class="line">    MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>同理，这是 74LV595 的 IO 配置参数结构体，将其删除掉（因为其用到这两个 IO 会冲突）。继续在 <code>mx6ull_alientek_emmc.c</code> 中找到函数 <code>iox74lv_init</code>，如下所示：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">iox74lv_init</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> i;</span><br><span class="line">    gpio_direction_output(IOX_OE, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (i = <span class="number">7</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">        gpio_direction_output(IOX_SHCP, <span class="number">0</span>);</span><br><span class="line">        gpio_direction_output(IOX_SDI, seq[qn_output[i]][<span class="number">0</span>]);</span><br><span class="line">        udelay(<span class="number">500</span>);</span><br><span class="line">        gpio_direction_output(IOX_SHCP, <span class="number">1</span>);</span><br><span class="line">        udelay(<span class="number">500</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    ......</span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">     * shift register will be output to pins</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    gpio_direction_output(IOX_STCP, <span class="number">1</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">iox74lv_set</span><span class="params">(<span class="type">int</span> index)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> i;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (i = <span class="number">7</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">        gpio_direction_output(IOX_SHCP, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (i == index)</span><br><span class="line">            gpio_direction_output(IOX_SDI, seq[qn_output[i]][<span class="number">0</span>]);</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            gpio_direction_output(IOX_SDI, seq[qn_output[i]][<span class="number">1</span>]);</span><br><span class="line">        udelay(<span class="number">500</span>);</span><br><span class="line">        gpio_direction_output(IOX_SHCP, <span class="number">1</span>);</span><br><span class="line">        udelay(<span class="number">500</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    ......</span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">      * shift register will be output to pins</span></span><br><span class="line"><span class="comment">      */</span></span><br><span class="line">    gpio_direction_output(IOX_STCP, <span class="number">1</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p><code>iox74lv_init</code> 函数是 74LV595 的初始化函数，iox74lv_set 函数用于控制 74LV595 的 IO 输出电平，将这两个函数全部删除掉！ 在 <code>mx6ull_alientek_emmc.c</code> 中找到 <code>board_init</code> 函数，此函数是板子初始化函数，会被 <code>board_init_r</code> 调用，<code>board_init</code> 函数内容如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">board_init</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">......</span><br><span class="line">imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));</span><br><span class="line">    iox74lv_init();</span><br><span class="line">    ......</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p><code>board_init</code> 会调用 <code>imx_iomux_v3_setup_multiple_pads</code> 和 <code>iox74lv_init</code> 这两个函数来初化 74lv595 的 GPIO，将这两行删除掉。至此，<code>mx6ull_alientek_emmc.c</code> 中关于 74LV595 芯片的驱动代码<strong>都删除掉</strong>了，接下来就是添加 I.MX6U-ALPHA 开发板两个网络复位引脚了。</p></li></ul></li><li><p>添加 I.MX6U-ALPHA 开发板网络复位引脚驱动</p><ul><li><p>在 <code>mx6ull_alientek_emmc.c</code> 中找到如下所示代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">iomux_v3_cfg_t</span> <span class="type">const</span> fec1_pads[] = &#123;</span><br><span class="line">    MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),</span><br><span class="line">    MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    ...</span><br><span class="line">    MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">iomux_v3_cfg_t</span> <span class="type">const</span> fec2_pads[] = &#123;</span><br><span class="line">    MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),</span><br><span class="line">    MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    ...</span><br><span class="line">    MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>结构体数组 <code>fec1_pads</code> 和 <code>fec2_pads</code> 是 ENET1 和 ENET2 这两个网口的 <strong>IO 配置参数</strong>，在这两个数组中添加两个网口的复位 IO 配置参数，完成以后如下所示：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">iomux_v3_cfg_t</span> <span class="type">const</span> fec1_pads[] = &#123;</span><br><span class="line">    MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),</span><br><span class="line">    MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">..</span><br><span class="line">    MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">iomux_v3_cfg_t</span> <span class="type">const</span> fec2_pads[] = &#123;</span><br><span class="line">    MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),</span><br><span class="line">    MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">..</span><br><span class="line">    MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),</span><br><span class="line">    MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>第 7 行和 16 行分别是 ENET1 和 ENET2 的复位 IO 配置参数。继续在文件 <code>mx6ull_alientek_emmc.c</code> 中找到函数 <code>setup_iomux_fec</code>，此函数默认代码如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">setup_iomux_fec</span><span class="params">(<span class="type">int</span> fec_id)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (fec_id == <span class="number">0</span>)</span><br><span class="line">        imx_iomux_v3_setup_multiple_pads(fec1_pads,</span><br><span class="line">                         ARRAY_SIZE(fec1_pads));</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        imx_iomux_v3_setup_multiple_pads(fec2_pads,</span><br><span class="line">                         ARRAY_SIZE(fec2_pads));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>函数 <code>setup_iomux_fec</code> 就是根据 <code>fec1_pads</code> 和 <code>fec2_pads</code> 这两个网络 IO 配置数组来初始化 I.MX6ULL 的网络 IO。我们需要在其中添加网络复位 IO 的初始化代码，并且复位一下 PHY 芯片，修改后的 <code>setup_iomux_fec</code> 函数如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">setup_iomux_fec</span><span class="params">(<span class="type">int</span> fec_id)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (fec_id == <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line"></span><br><span class="line">        imx_iomux_v3_setup_multiple_pads(fec1_pads,</span><br><span class="line">                         ARRAY_SIZE(fec1_pads));</span><br><span class="line"></span><br><span class="line">        gpio_direction_output(ENET1_RESET, <span class="number">1</span>);</span><br><span class="line">        gpio_set_value(ENET1_RESET, <span class="number">0</span>);</span><br><span class="line">        mdelay(<span class="number">20</span>);</span><br><span class="line">        gpio_set_value(ENET1_RESET, <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        imx_iomux_v3_setup_multiple_pads(fec2_pads,</span><br><span class="line">                         ARRAY_SIZE(fec2_pads));</span><br><span class="line">        gpio_direction_output(ENET2_RESET, <span class="number">1</span>);</span><br><span class="line">        gpio_set_value(ENET2_RESET, <span class="number">0</span>);</span><br><span class="line">        mdelay(<span class="number">20</span>);</span><br><span class="line">        gpio_set_value(ENET2_RESET, <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">   mdelay(<span class="number">150</span>); <span class="comment">/* 复位结束后至少延时150ms才能正常使用*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>示例代码中第 9 行 ~ 12 行和第 18 行~ 21 行分别对应 ENET1 和 ENET2 的复位 IO 初始化，将这两个 IO 设置为输出并且硬件复位一下 LAN8720A，这个硬件复位很重要！第 22 行复位结束以后一定要至少延时 150ms 才能操作 SR8201F，这个在 SR8201F 数据手册里面有详细要求的，否则会导致 uboot 无法识别 SR8201F。</p></li><li><p>至此网络的复位引脚驱动修改完成，重新编译 uboot，然后将 <code>u-boot.bin</code> 烧写到 SD 卡中并启动，uboot 启动信息如图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/29/I.MX6ULinuxV1.8ba935c053cf3b280.webp" alt=""></p></li><li><p>可以看到“Net:FEC1”这一行，提示当前使用的 FEC1 这个网口，也就是 ENET2。在 uboot 中使用网络之前要先设置几个环境变量，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">setenv ipaddr 192.168.1.55 //开发板 IP 地址</span><br><span class="line">setenv ethaddr b8:ae:1d:01:00:00 //开发板网卡 MAC 地址</span><br><span class="line">setenv gatewayip 192.168.1.1 //开发板默认网关</span><br><span class="line">setenv netmask 255.255.255.0 //开发板子网掩码</span><br><span class="line">setenv serverip 192.168.1.250 //服务器地址，也就是 Ubuntu 地址</span><br><span class="line">saveenv //保存环境变量</span><br></pre></td></tr></table></figure></li><li><p>设置好环境变量以后就可以在 uboot 中使用网络了，用网线将 I.MX6U-ALPHA 上的 ENET2 与电脑或者路由器连接起来，保证开发板和电脑在同一个网段内，通过 ping 命令来测试一下网络连接，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ping 192.168.1.250</span><br></pre></td></tr></table></figure></li><li><p>结果如图：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/29/2db035447d32f61b48ba5ccf307cd97c.webp" alt=""></p></li><li><p>有“host 192.168.1.250 is alive”这句，说明 ping 主机成功，说明 ENET2 网络工作正常。再来测试一下 ENET1 的网络是否正常工作，打开<code>mx6ull_alientek_emmc.h</code>，将 <code>CONFIG_FEC_ENET_DEV </code>改为 0，然后重新编译一下 uboot 并烧写到 SD 卡中重启。重启开发板，uboot 输出信息如图 33.2.8.5 所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/29/aa.webp" alt=""></p></li><li><p>有“Net：FEC0”这一行，说明当前使用的 FEC0 这个网卡，也就是 ENET1，同样的 ping 一下主机，结果如图 33.2.8.6 所示：</p><p><img src="https://cdnjson.com/images/2023/03/29/bb.webp" alt=""></p></li><li><p>ping 主机也成功，说明 ENET1 网络也工作正常，至此，I.MX6U-ALPHA 开发板的两个网络都工作正常了，建议大家将 ENET2 设置为 uboot 的默认网卡！也就是将宏 <code>CONFIG_FEC_ENET_DEV</code> 设置为 1 。</p></li></ul><h3 id="2-8-其他需要修改的地方">2.8 其他需要修改的地方</h3><ul><li><p>在 uboot 启动信息中会有“Board: MX6ULL 14x14 EVK”这一句，也就是说板子名字为“MX6ULL 14x14 EVK”，要将其改为我们所使用的板子名字，比如“MX6ULL ALIENTEK EMMC”或者“MX6ULL ALIENTEK NAND”。打开文件 <code>mx6ull_alientek_emmc.c</code>，找到函数<code>checkboard</code>，将其改为如下所示内容：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">checkboard</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (is_mx6ull_9x9_evk())</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;Board: MX6ULL 9x9 EVK\n&quot;</span>);</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;Board: MX6ULL ALIENTEK EMMC\n&quot;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>修改完成以后重新编译 uboot 并烧写到 SD 卡中验证，uboot 启动信息如图所示：</p><p><img src="https://cdnjson.com/images/2023/03/29/pic1.webp" alt=""></p></li><li><p>Board 变成了“MX6ULL ALIENTEK EMMC”。至此 uboot 的驱动部分就修改完成了，uboot 移植也完成了，uboot 的最终目的就是<strong>启动 Linux 内核</strong>，所以需要通过启动 Linux 内核来判断 uboot 移植是否成功。在启动 Linux 内核之前我们先来学习两个重要的环境变量 <code>bootcmd</code> 和 <code>bootargs</code>。</p></li></ul></li></ol><h2 id="3-bootcmd-和-bootargs-环境变量">3.bootcmd 和 bootargs 环境变量</h2><ul><li><p>uboot 中有两个非常重要的环境变量 <code>bootcmd</code> 和 <code>bootargs</code>，接下来看一下这两个环境变量。<code>bootcmd </code>和 <code>bootagrs</code> 是采用类似 shell 脚本语言编写的，里面有很多的变量引用，这些变量其实都是环境变量，有很多是 NXP 自己定义的。文件 <code>mx6ull_alientek_emmc.h</code> 中的宏 <code>CONFIG_EXTRA_ENV_SETTINGS</code> 保存着这些环境变量的默认值，内容如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">if</span> defined(CONFIG_SYS_BOOT_NAND)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_EXTRA_ENV_SETTINGS \</span></span><br><span class="line"><span class="meta">    CONFIG_MFG_ENV_SETTINGS \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;panel=TFT43AB\0&quot;</span> \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;fdt_addr=0x83000000\0&quot;</span> \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;fdt_high=0xffffffff\0&quot;</span>   \</span></span><br><span class="line"><span class="meta">..</span></span><br><span class="line">        <span class="string">&quot;bootz $&#123;loadaddr&#125; - $&#123;fdt_addr&#125;\0&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">else</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_EXTRA_ENV_SETTINGS \</span></span><br><span class="line"><span class="meta">    CONFIG_MFG_ENV_SETTINGS \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;script=boot.scr\0&quot;</span> \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;image=zImage\0&quot;</span> \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;console=ttymxc0\0&quot;</span> \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;fdt_high=0xffffffff\0&quot;</span> \</span></span><br><span class="line"><span class="meta">    <span class="string">&quot;initrd_high=0xffffffff\0&quot;</span> \</span></span><br><span class="line"><span class="meta">..</span></span><br><span class="line">     <span class="string">&quot;findfdt=&quot;</span>\</span><br><span class="line">       <span class="string">&quot;if test $fdt_file = undefined; then &quot;</span> \</span><br><span class="line">        <span class="string">&quot;if test $board_name = EVK &amp;&amp; test $board_rev = 9X9; then &quot;</span> \</span><br><span class="line">         <span class="string">&quot;setenv fdt_file imx6ull-9x9-evk.dtb; fi; &quot;</span> \</span><br><span class="line">     <span class="string">&quot;if test $board_name = EVK &amp;&amp; test $board_rev = 14X14; then &quot;</span> \</span><br><span class="line">                    <span class="string">&quot;setenv fdt_file imx6ull-14x14-evk.dtb; fi; &quot;</span> \</span><br><span class="line">            <span class="string">&quot;if test $fdt_file = undefined; then &quot;</span> \</span><br><span class="line">            <span class="string">&quot;echo WARNING: Could not determine dtb to use; fi; &quot;</span> \</span><br><span class="line">            <span class="string">&quot;fi;\0&quot;</span> \</span><br></pre></td></tr></table></figure></li><li><p>宏 <code>CONFIG_EXTRA_ENV_SETTINGS</code> 是个条件编译语句，使用 NAND 和 EMMC 的时候宏 <code>CONFIG_EXTRA_ENV_SETTINGS</code> 的值是不同的。</p></li></ul><h3 id="3-1-环境变量-bootcmd">3.1 环境变量 bootcmd</h3><ul><li><p><code>bootcmd</code> 在前面已经说了很多次了，bootcmd 保存着 uboot 默认命令，uboot 倒计时结束以后就会执行 bootcmd 中的命令。这些命令一般都是用来启动 Linux 内核的，比如读取 EMMC 或者 NAND Flash 中的 Linux 内核镜像文件和设备树文件到 DRAM 中，然后启动 Linux 内核。可以在 uboot 启动以后进入命令行设置 <code>bootcmd</code> 环境变量的值。如果 EMMC 或者 NAND 中没有保存 bootcmd 的值，那么 uboot 就会使用默认的值，板子第一次运行 uboot 的时候都会使用默认值来设置 <code>bootcmd</code> 环境变量。打开文件 <code>include/env_default.h</code>，在此文件中有如下所示内容：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifdef</span> DEFAULT_ENV_INSTANCE_EMBEDDED</span></span><br><span class="line"> <span class="type">env_t</span> environment __PPCENV__ = &#123;</span><br><span class="line">     ENV_CRC,    <span class="comment">/* CRC Sum */</span></span><br><span class="line"> <span class="meta">#<span class="keyword">ifdef</span> CONFIG_SYS_REDUNDAND_ENVIRONMENT</span></span><br><span class="line">     <span class="number">1</span>,      <span class="comment">/* Flags: valid */</span></span><br><span class="line"> <span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line">     &#123;</span><br><span class="line"> <span class="meta">#<span class="keyword">elif</span> defined(DEFAULT_ENV_INSTANCE_STATIC)</span></span><br><span class="line"> <span class="type">static</span> <span class="type">char</span> default_environment[] = &#123;</span><br><span class="line"> <span class="meta">#<span class="keyword">else</span></span></span><br><span class="line"> <span class="type">const</span> uchar default_environment[] = &#123;</span><br><span class="line"> <span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"> <span class="meta">#<span class="keyword">ifdef</span>  CONFIG_ENV_CALLBACK_LIST_DEFAULT</span></span><br><span class="line">     ENV_CALLBACK_VAR <span class="string">&quot;=&quot;</span> CONFIG_ENV_CALLBACK_LIST_DEFAULT <span class="string">&quot;\0&quot;</span></span><br><span class="line"> <span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"> <span class="meta">#<span class="keyword">ifdef</span>  CONFIG_ENV_FLAGS_LIST_DEFAULT</span></span><br><span class="line">     ENV_FLAGS_VAR <span class="string">&quot;=&quot;</span> CONFIG_ENV_FLAGS_LIST_DEFAULT <span class="string">&quot;\0&quot;</span></span><br><span class="line"> <span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"> <span class="meta">#<span class="keyword">ifdef</span>  CONFIG_BOOTARGS</span></span><br><span class="line">     <span class="string">&quot;bootargs=&quot;</span> CONFIG_BOOTARGS         <span class="string">&quot;\0&quot;</span></span><br><span class="line"> <span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_BOOTCOMMAND</span></span><br><span class="line">    <span class="string">&quot;bootcmd=&quot;</span>  CONFIG_BOOTCOMMAND      <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_RAMBOOTCOMMAND</span></span><br><span class="line">    <span class="string">&quot;ramboot=&quot;</span>  CONFIG_RAMBOOTCOMMAND       <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_NFSBOOTCOMMAND</span></span><br><span class="line">    <span class="string">&quot;nfsboot=&quot;</span>  CONFIG_NFSBOOTCOMMAND       <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> defined(CONFIG_BOOTDELAY) &amp;&amp; (CONFIG_BOOTDELAY &gt;= 0)</span></span><br><span class="line">    <span class="string">&quot;bootdelay=&quot;</span>    __stringify(CONFIG_BOOTDELAY)   <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> defined(CONFIG_BAUDRATE) &amp;&amp; (CONFIG_BAUDRATE &gt;= 0)</span></span><br><span class="line">    <span class="string">&quot;baudrate=&quot;</span> __stringify(CONFIG_BAUDRATE)    <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_LOADS_ECHO</span></span><br><span class="line">    <span class="string">&quot;loads_echo=&quot;</span>   __stringify(CONFIG_LOADS_ECHO)  <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_ETHPRIME</span></span><br><span class="line">    <span class="string">&quot;ethprime=&quot;</span> CONFIG_ETHPRIME         <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_IPADDR</span></span><br><span class="line">    <span class="string">&quot;ipaddr=&quot;</span>   __stringify(CONFIG_IPADDR)  <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_SERVERIP</span></span><br><span class="line">    <span class="string">&quot;serverip=&quot;</span> __stringify(CONFIG_SERVERIP)    <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_SYS_AUTOLOAD</span></span><br><span class="line">    <span class="string">&quot;autoload=&quot;</span> CONFIG_SYS_AUTOLOAD     <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_PREBOOT</span></span><br><span class="line">    <span class="string">&quot;preboot=&quot;</span>  CONFIG_PREBOOT          <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_ROOTPATH</span></span><br><span class="line">    <span class="string">&quot;rootpath=&quot;</span> CONFIG_ROOTPATH         <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_GATEWAYIP</span></span><br><span class="line">    <span class="string">&quot;gatewayip=&quot;</span>    __stringify(CONFIG_GATEWAYIP)   <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_NETMASK</span></span><br><span class="line">    <span class="string">&quot;netmask=&quot;</span>  __stringify(CONFIG_NETMASK) <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_HOSTNAME</span></span><br><span class="line">    <span class="string">&quot;hostname=&quot;</span> __stringify(CONFIG_HOSTNAME)    <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_BOOTFILE</span></span><br><span class="line">    <span class="string">&quot;bootfile=&quot;</span> CONFIG_BOOTFILE         <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_LOADADDR</span></span><br><span class="line">    <span class="string">&quot;loadaddr=&quot;</span> __stringify(CONFIG_LOADADDR)    <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_CLOCKS_IN_MHZ</span></span><br><span class="line">    <span class="string">&quot;clocks_in_mhz=1\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> defined(CONFIG_PCI_BOOTDELAY) &amp;&amp; (CONFIG_PCI_BOOTDELAY &gt; 0)</span></span><br><span class="line">    <span class="string">&quot;pcidelay=&quot;</span> __stringify(CONFIG_PCI_BOOTDELAY)<span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_ENV_VARS_UBOOT_CONFIG</span></span><br><span class="line">    <span class="string">&quot;arch=&quot;</span>     CONFIG_SYS_ARCH         <span class="string">&quot;\0&quot;</span></span><br><span class="line">    <span class="string">&quot;cpu=&quot;</span>      CONFIG_SYS_CPU          <span class="string">&quot;\0&quot;</span></span><br><span class="line">    <span class="string">&quot;board=&quot;</span>    CONFIG_SYS_BOARD        <span class="string">&quot;\0&quot;</span></span><br><span class="line">    <span class="string">&quot;board_name=&quot;</span>   CONFIG_SYS_BOARD        <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span> CONFIG_SYS_VENDOR</span></span><br><span class="line">    <span class="string">&quot;vendor=&quot;</span>   CONFIG_SYS_VENDOR       <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span> CONFIG_SYS_SOC</span></span><br><span class="line">    <span class="string">&quot;soc=&quot;</span>      CONFIG_SYS_SOC          <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span>  CONFIG_EXTRA_ENV_SETTINGS</span></span><br><span class="line">    CONFIG_EXTRA_ENV_SETTINGS</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line">    <span class="string">&quot;\0&quot;</span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span> DEFAULT_ENV_INSTANCE_EMBEDDED</span></span><br><span class="line">    &#125;</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>第 13~23 行 ， 这 段 代 码 是 个 条 件 编 译 ， 由 于 没 有 定 义<code>DEFAULT_ENV_INSTANCE_EMBEDDED</code> 和<code>CONFIG_SYS_REDUNDAND_ENVIRONMENT</code>，因此 <code>uchar default_environment[]</code>数组保存环境变量。 在示例代码中指定了很多环境变量的默认值，比如 bootcmd 的默认值就是 <code>CONFIG_BOOTCOMMAND</code> ，<code>bootargs</code> 的默认值就是 <code>CONFIG_BOOTARGS</code>。我们可以在<code>mx6ull_alientek_emmc.h</code> 文件中通过设置宏 <code>CONFIG_BOOTCOMMAND </code>来设置 bootcmd 的默认值，NXP 官方设置的 CONFIG_BOOTCOMMAND 值如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> CONFIG_BOOTCOMMAND \</span></span><br><span class="line"><span class="meta">       <span class="string">&quot;run findfdt;&quot;</span> \</span></span><br><span class="line"><span class="meta">       <span class="string">&quot;mmc dev $&#123;mmcdev&#125;;&quot;</span> \</span></span><br><span class="line"><span class="meta">       <span class="string">&quot;mmc dev $&#123;mmcdev&#125;; if mmc rescan; then &quot;</span> \</span></span><br><span class="line"><span class="meta">           <span class="string">&quot;if run loadbootscript; then &quot;</span> \</span></span><br><span class="line"><span class="meta">               <span class="string">&quot;run bootscript; &quot;</span> \</span></span><br><span class="line"><span class="meta">           <span class="string">&quot;else &quot;</span> \</span></span><br><span class="line"><span class="meta">               <span class="string">&quot;if run loadimage; then &quot;</span> \</span></span><br><span class="line"><span class="meta">                   <span class="string">&quot;run mmcboot; &quot;</span> \</span></span><br><span class="line"><span class="meta">               <span class="string">&quot;else run netboot; &quot;</span> \</span></span><br><span class="line"><span class="meta">               <span class="string">&quot;fi; &quot;</span> \</span></span><br><span class="line"><span class="meta">           <span class="string">&quot;fi; &quot;</span> \</span></span><br><span class="line"><span class="meta">       <span class="string">&quot;else run netboot; fi&quot;</span></span></span><br></pre></td></tr></table></figure></li><li><p>看起来很复杂的样子！因为 uboot 使用了类似 shell 脚本语言的方式来编写的，我们一行一行来分析。 第 2 行，<code>run findfdt</code>；使用的是 uboot 的 run 命令来运行 <code>findfdt</code>，<code>findfdt</code> 是 NXP 自行添加的环境变量，是用来查找开发板对应的设备树文件(.dtb)。IMX6ULL EVK 的设备树文件为 <code>imx6ull-14x14-evk.dtb</code>，findfdt 内容如下：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;findfdt=&quot;</span>\</span><br><span class="line"><span class="string">&quot;if test $fdt_file = undefined; then &quot;</span> \</span><br><span class="line"><span class="string">&quot;if test $board_name = EVK &amp;&amp; test $board_rev = 9X9; then &quot;</span> \</span><br><span class="line"> <span class="string">&quot;setenv fdt_file imx6ull-9x9-evk.dtb; fi; &quot;</span> \</span><br><span class="line"> <span class="string">&quot;if test $board_name = EVK &amp;&amp; test $board_rev = 14X14; then &quot;</span> \</span><br><span class="line"> <span class="string">&quot;setenv fdt_file imx6ull-14x14-evk.dtb; fi; &quot;</span> \</span><br><span class="line"> <span class="string">&quot;if test $fdt_file = undefined; then &quot;</span> \</span><br><span class="line"> <span class="string">&quot;echo WARNING: Could not determine dtb to use; fi; &quot;</span> \</span><br><span class="line"><span class="string">&quot;fi;\0&quot;</span> \</span><br></pre></td></tr></table></figure></li><li><p>findfdt 里面用到的变量有<code>fdt_file</code>，<code>board_name</code>，<code>board_rev</code>，这三个变量内容如下：</p><figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fdt_file=undefined，board_name=EVK，board_rev=14X14</span><br></pre></td></tr></table></figure></li><li><p>findfdt 做的事情就是判断，<code>fdt_file</code> 是否为 undefined，如果 <code>fdt_file</code> 为 undefined 的话那要根据板子信息得出所需的.dtb 文件名。此时 fdt_file 为 undefined，所以根据 <code>board_name</code> 和<code>board_rev</code> 来判断实际所需的.dtb 文件，如果 <code>board_name</code> 为 EVK 并且<code>board_rev=9x9</code> 的话 fdt_file 就为 <code>imx6ull-9x9-evk.dtb</code>。如果 board_name 为 EVK 并且 board_rev=14x14 的话 fdt_file 设置为 <code>imx6ull-14x14-evk.dtb</code>。因此 IMX6ULL EVK 板子的设备树文件就是 <code>imx6ull-14x14-evk.dtb</code>，因此<code>run findfdt</code> 的结果就是设置 fdt_file 为 <code>imx6ull-14x14-evk.dtb</code>。 第 3 行，<code>mmc dev $&#123;mmcdev&#125;</code>用于切换 mmc 设备，mmcdev 为 1，因此这行代码就是：mmc dev 1，也就是切换到 EMMC 上。</p></li><li><p>第 4 行，先执行 <code>mmc dev $&#123;mmcdev&#125;</code> 切换到 EMMC 上，然后使用命令 <code>mmc rescan</code> 扫描看有没有 SD 卡或者 EMMC 存在，如果没有的话就直接跳到 13 行，执行 <code>run netboot</code>，netboot 也是一个自定义的环境变量，这个变量是从网络启动 Linux 的。如果 mmc 设备存在的话就从 mmc 设备启动。 第 5 行，运行<code>loadbootscript</code> 环境变量，此环境变量内容如下：</p></li><li><p>第 5 行，运行 <code>loadbootscript</code> 环境变量，此环境变量内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">loadbootscript=fatload mmc $&#123;mmcdev&#125;:$&#123;mmcpart&#125; $&#123;loadaddr&#125; $&#123;script&#125;;</span><br></pre></td></tr></table></figure></li><li><p>其中 mmcdev=1，mmcpart=1，loadaddr=0x80800000，script= boot.scr，因此展开以后就是：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">loadbootscript=fatload mmc 1:1 0x80800000 boot.scr;</span><br></pre></td></tr></table></figure></li><li><p><code>loadbootscript</code> 就是从 mmc1 的分区 1 中读取文件 <code>boot.src</code> 到 DRAM 的 0X80800000 处。但是 mmc1 的分区 1 中没有 boot.src 这个文件，可以使用命令“ls mmc 1:1”查看一下 mmc1 分区 1 中的所有文件，看看有没有 <code>boot.src</code> 这个文件。 第 6 行，如果加载 <code>boot.src</code> 文件成功的话就运行 <code>bootscript</code> 环境变量，<code>bootscript</code> 的内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">bootscript=echo Running bootscript from mmc ...;</span><br><span class="line">source</span><br></pre></td></tr></table></figure></li><li><p>因为 <code>boot.src</code> 文件不存在，所以 <code>bootscript</code> 也就不会运行。 第 8 行，如果 <code>loadbootscript</code> 没有找到 <code>boot.src</code> 的话就运行环境变量 <code>loadimage</code>，环境变量 <code>loadimage</code> 内容如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">loadimage=fatload mmc $&#123;mmcdev&#125;:$&#123;mmcpart&#125; $&#123;loadaddr&#125; $&#123;image&#125;</span><br></pre></td></tr></table></figure></li><li><p>其中 mmcdev=1，mmcpart=1，loadaddr=0x80800000，image = zImage，展开以后就是：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">loadimage=fatload mmc 1:1 0x80800000 zImage</span><br></pre></td></tr></table></figure></li><li><p>可以看出 <code>loadimage</code> 就是从 mmc1 的分区中读取 <code>zImage</code> 到内存的 0X80800000 处，而 mmc1 的分区 1 中存在 zImage。 第 9 行，加载 linux 镜像文件 zImage 成功以后就运行环境变量 <code>mmcboot</code>，否则的话运行 <code>netboot</code> 环境变量。<code>mmcboot</code> 环境变量如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">&quot;mmcboot=echo Booting from mmc ...; &quot; \</span><br><span class="line">    &quot;run mmcargs; &quot; \</span><br><span class="line">    &quot;if test $&#123;boot_fdt&#125; = yes || test $&#123;boot_fdt&#125; = try; then &quot; \</span><br><span class="line">        &quot;if run loadfdt; then &quot; \</span><br><span class="line">            &quot;bootz $&#123;loadaddr&#125; - $&#123;fdt_addr&#125;; &quot; \</span><br><span class="line">        &quot;else &quot; \</span><br><span class="line">            &quot;if test $&#123;boot_fdt&#125; = try; then &quot; \</span><br><span class="line">                &quot;bootz; &quot; \</span><br><span class="line">            &quot;else &quot; \</span><br><span class="line">                &quot;echo WARN: Cannot load the DT; &quot; \</span><br><span class="line">            &quot;fi; &quot; \</span><br><span class="line">        &quot;fi; &quot; \</span><br><span class="line">    &quot;else &quot; \</span><br><span class="line">        &quot;bootz; &quot; \</span><br><span class="line">    &quot;fi;\0&quot; \</span><br></pre></td></tr></table></figure></li><li><p>第 1 行，输出信息“Booting from mmc …”。 第 2 行，运行环境变量 <code>mmcargs</code>，<code>mmcargs</code> 用来设置 <code>bootargs</code>，后面分析 <code>bootargs</code> 的时候在学习。 第 3 行，判断 <code>boot_fdt</code> 是否为 yes 或者 try，根据 uboot 输出的环境变量信息可知 boot_fdt=try。因此会执行 4 行的语句。 第 4 行，运行环境变量 <code>loadfdt</code>，环境变量 <code>loadfdt</code> 定义如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">loadfdt=fatload mmc $&#123;mmcdev&#125;:$&#123;mmcpart&#125; $&#123;fdt_addr&#125; $&#123;fdt_file&#125;</span><br></pre></td></tr></table></figure></li><li><p>展开以后就是：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">loadfdt=fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb</span><br></pre></td></tr></table></figure></li><li><p>因此 <code>loadfdt</code> 的作用就是从 mmc1 的分区 1 中读取 <code>imx6ull-14x14-evk.dtb</code> 文件并放到 0x83000000 处。 第 8 行，如果读取.dtb 文件成功的话那就调用命令 bootz 启动 linux，调用方法如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bootz $&#123;loadaddr&#125; - $&#123;fdt_addr&#125;;</span><br></pre></td></tr></table></figure></li><li><p>展开就是：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bootz 0x80800000 - 0x83000000 (注意‘-’前后要有空格)</span><br></pre></td></tr></table></figure></li><li><p>至此 Linux 内核启动，如此复杂的设置就是为了从 EMMC 中读取 zImage 镜像文件和设备树文件。经过分析，浓缩出来的仅仅是 4 行精华：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mmc dev 1 //切换到 EMMC</span><br><span class="line">fatload mmc 1:1 0x80800000 zImage //读取 zImage 到 0x80800000 处</span><br><span class="line">fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //读取设备树到 0x83000000 处</span><br><span class="line">bootz 0x80800000 - 0x83000000 //启动 Linux</span><br></pre></td></tr></table></figure></li><li><p>NXP 官方将 <code>CONFIG_BOOTCOMMAND</code> 写的这么复杂只有一个目的：为了兼容多个板子，所以写了个很复杂的脚本。当我们明确知道我们所使用的板子的时候就可以大幅简化宏 <code>CONFIG_BOOTCOMMAND</code> 的 设 置 ， 比 如 我 们 要 从 EMMC 启 动 ， 那 么 宏 <code>CONFIG_BOOTCOMMAND</code> 就可简化为：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">define CONFIG_BOOTCOMMAND \</span></span><br><span class="line"><span class="language-bash"> <span class="string">&quot;mmc dev 1;&quot;</span> \</span></span><br><span class="line"><span class="language-bash"> <span class="string">&quot;fatload mmc 1:1 0x80800000 zImage;&quot;</span> \</span></span><br><span class="line"><span class="language-bash"> <span class="string">&quot;fatload mmc 1:1 0x83000000 imx6ull-alientek-emmc.dtb;&quot;</span> \</span></span><br><span class="line"><span class="language-bash"> <span class="string">&quot;bootz 0x80800000 - 0x83000000;&quot;</span></span></span><br></pre></td></tr></table></figure></li><li><p>或者可以直接在 uboot 中设置 <code>bootcmd</code> 的值，这个值就是保存到 EMMC 中的，命令如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">setenv bootcmd &#x27;mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;&#x27;</span><br></pre></td></tr></table></figure></li></ul><h3 id="3-2-环境变量-bootargs">3.2 环境变量 bootargs</h3><ul><li><p><code>bootargs</code> 保存着 uboot 传递给 Linux 内核的参数，在上一小节讲解 <code>bootcmd</code> 的时候说过，<code>bootargs</code> 环境变量是由 <code>mmcargs</code> 设置的，<code>mmcargs</code> 环境变量如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mmcargs=setenv bootargs console=$&#123;console&#125;,$&#123;baudrate&#125; root=$&#123;mmcroot&#125;</span><br></pre></td></tr></table></figure></li><li><p>其中 <code>console=ttymxc0，baudrate=115200，mmcroot=/dev/mmcblk1p2 rootwait rw</code>，因此将 <code>mmcargs</code> 展开以后就是：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw</span><br></pre></td></tr></table></figure></li><li><p>可以看出环境变量 <code>mmcargs</code> 就是设置 <code>bootargs</code> 的值为<code>console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw</code>，bootargs 就是设置了很多的参数的值，这些参数 Linux 内核会使用到，常用的参数有：</p></li></ul><ol><li>console<ul><li><strong>console 用来设置 linux 终端(或者叫控制台)，也就是通过什么设备来和 Linux 进行交互</strong>，是串口还是 LCD 屏幕？如果是串口的话应该是串口几等等。一般设置串口作为 Linux 终端，这样我们就可以在电脑上通过 SecureCRT 来和 linux 交互了。这里设置 console 为 <code>ttymxc0</code>，因为 linux 启动以后 I.MX6ULL 的串口 1 在 linux 下的设备文件就是<code>/dev/ttymxc0</code>，在 Linux 下，一切文件。 ttymxc0 后面有个“,115200”，这是设置串口的波特率，<code>console=ttymxc0,115200</code> 综合起来就是设置 ttymxc0（也就是串口 1）作为 Linux 的终端，并且串口波特率设置为 115200。</li></ul></li><li>root<ul><li><strong>root 用来设置根文件系统的位置</strong>，<code>root=/dev/mmcblk1p2</code> 用于指明根文件系统存放在 mmcblk1 设备的分区 2 中。EMMC 版本的核心板启动 linux 以后会存在/dev/mmcblk0、/dev/mmcblk1、/dev/mmcblk0p1、/dev/mmcblk0p2、/dev/mmcblk1p1 和/dev/mmcblk1p2 这样的文件，其中/dev/mmcblkx(x=0~n)表示 mmc 设备，而/dev/mmcblkxpy(x=0~n,y=1~n)表示 mmc 设备 x 的分区 y。在 I.MX6U-ALPHA 开发板中/dev/mmcblk1 表示 EMMC，而<code>/dev/mmcblk1p2</code> 表示 EMMC 的分区 2。</li><li>root 后面有<code>rootwait rw</code>，<strong>rootwait 表示等待 mmc 设备初始化完成以后再挂载</strong>，否则的话 mmc 设备还没初始化完成就挂载根文件系统会出错的。<strong>rw 表示根文件系统是可以读写的</strong>，不加 rw 的话可能无法在根文件系统中进行写操作，只能进行读操作。</li></ul></li><li>rootfstype<ul><li>此选项一般配置 root 一起使用，<code>rootfstype</code> 用于指定根文件系统类型，如果根文件系统为<code>ext</code> 格式的话此选项无所谓。如果根文件系统是 yaffs、jffs 或 ubifs 的话就需要设置此选项，指定根文件系统的类型。</li><li>bootargs 常设置的选项就这三个，后面遇到其他选项的话再讲解。</li></ul></li></ol><h2 id="4-uboot-启动-Linux-测试">4.uboot 启动 Linux 测试</h2><ul><li>uboot 已经移植好了，<code>bootcmd</code> 和 <code>bootargs</code> 这两个重要的环境变量也讲解了，接下来就要测试一下 uboot 能不能完成它的工作：启动 Linux 内核。我们测试两种启动 Linux 内核的方法，一种是直接从 EMMC 启动，一种是从网络启动</li></ul><h3 id="4-1-从-EMMC-启动-Linux-系统">4.1 从 EMMC 启动 Linux 系统</h3><ul><li><p>从 EMMC 启动也就是将编译出来的 Linux 镜像文件 <code>zImage</code> 和设备树文件保存在 EMMC 中，uboot 从 EMMC 中读取这两个文件并启动，这个是我们产品最终的启动方式。但是我们目前还没有讲解如何移植 linux 和设备树文件，以及如何将 <code>zImage</code> 和设备树文件保存到 EMMC 中。不过大家拿到手的 I.MX6U-ALPHA 开发板(EMMC 版本)已经将 <code>zImage</code> 文件和设备树文件烧写到了 EMMC 中，所以我们可以直接读取来测试。先检查一下 EMMC 的分区 1 中有没有 <code>zImage</code> 文件和设备树文件，输入命令<code>ls mmc 1:1</code>，结果如图所示：</p><p><img src="https://cdnjson.com/images/2023/03/29/aa.webp" alt=""></p></li><li><p>从图中可以看出，此时 EMMC 分区 1 中存在 <code>zimage</code> 和 <code>imx6ull-alientek-emmc.dtb</code> 这两个文件，所以我们可以测试新移植的 uboot 能不能启动 linux 内核。设置 <code>bootargs</code> 和 <code>bootcmd</code> 这两个环境变量，设置如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">setenv bootargs &#x27;console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw&#x27;</span><br><span class="line">setenv bootcmd &#x27;mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;&#x27;</span><br><span class="line">saveenv</span><br></pre></td></tr></table></figure></li><li><p>设置好以后直接输入 <code>boot</code>，或者 <code>run bootcmd</code> 即可启动 Linux 内核，如果 Linux 内核启动成功的话就会输出如图所示的启动信息：</p><p><img src="https://cdnjson.com/images/2023/03/29/pic2.webp" alt=""></p></li></ul><h3 id="4-2-从网络启动-Linux-系统">4.2 从网络启动 Linux 系统</h3><ul><li><p>从网络启动 linux 系统的唯一目的就是为了调试！不管是为了调试 linux 系统还是 linux 下的驱动。每次修改 linux 系统文件或者 linux 下的某个驱动以后都要将其烧写到 EMMC 中去测试，这样太麻烦了。我们可以设置 linux 从网络启动，也就是将 linux 镜像文件和根文件系统都放到 Ubuntu 下某个指定的文件夹中，这样每次重新编译 linux 内核或者某个 linux 驱动以后只需要使用 cp 命令将其拷贝到这个指定的文件夹中即可，这样就不用需要频繁的烧写 EMMC，这样就加快了开发速度。我们可以通过 nfs 或者 tftp 从 Ubuntu 中下载 <code>zImage</code> 和设备树文件，根文件系统的话也可以通过 nfs 挂载，不过本节我们不讲解如何通过 nfs 挂载根文件系统，这个在讲解根文件系统移植的时候再讲解。这里我们使用 <code>tftp</code> 从 Ubuntu 中下载 <code>zImage</code> 和设备树文件，前提是要将 zImage 和设备树文件放到 Ubuntu 下的 <code>tftp</code> 目录中。设置 <code>bootargs</code> 和 <code>bootcmd</code> 这两个环境变量，设置如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">setenv bootargs &#x27;console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw&#x27;</span><br><span class="line">setenv bootcmd &#x27;tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000&#x27;</span><br><span class="line">saveenv</span><br></pre></td></tr></table></figure></li><li><p>一开始是通过 tftp 下载 <code>zImage</code> 和 <code>imx6ull-alientek-emmc.dtb</code> 这两个文件，过程如下图所示：</p></li></ul><p><img src="https://cdnjson.com/images/2023/03/29/pic3.webp" alt=""></p><ul><li><p>下载完成以后就是启动 Linux 内核，启动过程如图 33.4.2.2 所示：</p><p><img src="https://cdnjson.com/images/2023/03/29/pic4.webp" alt=""></p><h2 id="5-总结">5.总结</h2><ul><li><p><span style="color:red;font-weight:bold">uboot 移植到此结束，简单总结一下 uboot 移植的过程：</span></p><ol><li><p>不管是购买的开发板还是自己做的开发板，基本都是参考半导体厂商的 demo 板，而半导体厂商会在他们自己的开发板上移植好 <code>uboot</code>、<code>linux kernel</code> 和 <code>rootfs</code> 等，最终制作好 BSP 包提供给用户。我们可以在官方提供的 BSP 包的基础上添加我们的板子，也就是俗称的移植。</p></li><li><p>我们购买的开发板或者自己做的板子一般都不会原封不动的照抄半导体厂商的 demo 板，都会根据实际的情况来做修改，既然有修改就必然涉及到 uboot 下驱动的移植。</p></li><li><p>一般 uboot 中需要解决<strong>串口、NAND、EMMC 或 SD 卡、网络和 LCD 驱动</strong>，因为 uboot 的主要目的就是启动 Linux 内核，所以不需要考虑太多的外设驱动。</p></li><li><p>在 uboot 中添加自己的板子信息，根据自己板子的实际情况来修改 uboot 中的驱动。</p></li></ol></li></ul></li></ul>]]></content>
    
    
    <summary type="html">🥭本文简单概括将Uboot移植至I.MX6ULL开发板的流程</summary>
    
    
    
    <category term="嵌入式知识点总结" scheme="https://www.fomal.cc/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="嵌入式" scheme="https://www.fomal.cc/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="Linux驱动" scheme="https://www.fomal.cc/tags/Linux%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>无服务器部署自己的chatGPT</title>
    <link href="https://www.fomal.cc/posts/74ac8dc8.html"/>
    <id>https://www.fomal.cc/posts/74ac8dc8.html</id>
    <published>2023-03-23T00:00:00.000Z</published>
    <updated>2023-03-29T22:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><ul><li>B 站审核太严格，投了很多次都不给过，只能把视频搬到这里了</li><li>本教程收集 Github 几个开源项目，实现无服务器搭建属于自己的私人 chatGPT</li><li>本文主要针对无服务器的同学进行讲解，若有服务器可通过 Docker 容器化部署，详见对应项目的开源文档</li><li>自建的好处：不用魔法就可以访问、比官网稳定、装逼效果 MAX</li><li>演示站点：<a href="https://chatgpt.fomal.cc">chatgpt.fomal.cc</a>、<a href="https://chatgpt1.fomal.cc">chatgpt1.fomal.cc</a>、<a href="https://chatgpt2.fomal.cc">chatgpt2.fomal.cc</a>、<a href="https://chatgpt3.fomal.cc">chatgpt3.fomal.cc</a></li><li><strong><font color=red>注意：演示站点仅供测试请不要随意使用，因为用的都是我的额度！！！！</font></strong></li></ul></div><h2 id="1-视频教程">1.视频教程</h2><div class="video"><video controls preload><source src='https://txmov2.a.yximgs.com/upic/2023/03/23/00/BMjAyMzAzMjMwMDMyMDhfMjI2NzY3NzEzNF85ODc4MzA4MDQxNl8wXzM=_b_Bede88676c4d88f06885fb2438750b5d7.mp4' type='video/mp4'>Your browser does not support the video tag.</video></div><br><ul><li><p>注意：视频仅演示了<a href="https://github.com/Chanzhaoyu/chatgpt-web">Chanzhaoyu/chatgpt-web</a> + Railway 的搭建方案</p></li><li><p>经过笔者测试：对于该项目，<a href="https://dashboard.render.com/">Render</a>的 Docker 环境部署也是可以用的</p></li></ul><h2 id="2-文字版教程">2.文字版教程</h2><ul><li><b>前置条件</b>：<ol><li>需要一个 OPENAI 账号(chatGPT 账号)，或者有效的 API KEY，没有的话叫朋友借一个 key</li><li>需要一个国内的域名，没有的可以去<a href="https://www.vpsor.cn/">硅云</a>白嫖一个</li><li>需要有能够访问外国网站的能力(你懂的)</li></ol></li></ul><h3 id="2-1-Chanzhaoyu-chatgpt-web">2.1 Chanzhaoyu/chatgpt-web</h3><ul><li><p>开源地址：<a href="https://github.com/Chanzhaoyu/chatgpt-web"><strong>Chanzhaoyu/chatgpt-web</strong></a></p></li><li><p>示例图片：<br><img src="https://tuchuang.voooe.cn/images/2023/03/23/image.webp" style="zoom:67%;" /></p></li><li><p>正式教程：</p><ol><li><p>进入<a href="https://github.com/Chanzhaoyu/chatgpt-web">Chanzhaoyu/chatgpt-web</a>，将点击右上角的<code>fork</code>，创建一个副本到自己的仓库(最好是 fork，到时候可以<code>sync fork</code>同步更新)，选择只 fork 主分支，此时自己的仓库应该有了一份项目副本；</p><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-1.webp" style="zoom: 67%;" /><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-2.webp" style="zoom: 80%;" /></li><li><p>打开<a href="https://railway.app/">Railway</a>官网，注册并绑定自己的 Github 账户，然后选择右上角的<code>New Project</code>新建一个项目，从 Github 仓库中选出刚刚自己 fork 过来的项目，然后选择添加环境变量；</p><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-3.webp" style="zoom:50%;" /><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-4.webp" style="zoom:80%;" /></li><li><p>添加两个环境变量：<code>PORT</code>为<code>3002</code>；<code>OPENAI_API_KEY</code>到<a href="https://platform.openai.com/account/api-keys">OPENAI 控制台-查看 API_KEY</a>进行生成与获取，记住 API_KEY 只能看到一次，记住复制保存，不然要重新生成，将这里的 API_KEY 复制到 Railway 项目的环境变量中，然后保存就会自动触发新一轮部署；</p><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-5.webp" style="zoom:60%;" /></li><li><p>添加自定义域名：分别进入<code>部署的项目</code>-&gt;<code>Settings</code>-&gt;<code>Domains</code>-&gt;<code>Custom Domain</code>输入自己拥有的域名，然后会生成要求解析的类型、名称和值，到自己对应的域名控制台添加相应的解析记录；</p><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-7.webp" style="zoom: 40%;" /><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-8.webp" style="zoom:67%;" /></li><li><p>待域名解析生效后，进入自定义域名即可访问到自己部署的 chatGPT，可以看到自己的 key 是有余量的，因此最好不要被被人用，否则很快会消耗完额度(目前不知道会不会恢复)；</p><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-9.webp" style="zoom:50%;" /><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-10.webp" style="zoom: 30%;" /></li></ol></li></ul><h3 id="2-2-ourongxing-chatgpt-vercel">2.2 ourongxing/chatgpt-vercel</h3><ul><li><p>开源地址：<a href="https://github.com/ourongxing/chatgpt-vercel"><strong>ourongxing/chatgpt-vercel</strong></a></p></li><li><p>示例图片：</p><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-11.webp" style="zoom:80%;" /></li><li><p>正式教程：</p><ol><li><p>将项目 fork 到自己的仓库</p></li><li><p>注册<a href="https://vercel.com/dashboard">Vercel</a>并绑定自己的 Github 账号</p></li><li><p>部署刚刚 fork 过来的项目，环境变量只需要写<code>OPENAI_API_KEY</code>，其值的获取参考 2.1</p></li><li><p>部署完成后绑定自定义域名，访问自定义域即可到达 chatGPT</p></li></ol></li></ul><h3 id="2-3-ddiu8081-chatgpt-demo">2.3 ddiu8081/chatgpt-demo</h3><ul><li><p>开源地址：<a href="https://github.com/ddiu8081/chatgpt-demo"><strong>ddiu8081/chatgpt-demo</strong></a></p></li><li><p>示例图片：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/23/image-12.webp" alt=""></p></li><li><p>正式教程：同 2.2</p></li></ul><h3 id="2-4-Yidadaa-ChatGPT-Next-Web-推荐">2.4 Yidadaa/ChatGPT-Next-Web(推荐)</h3><ul><li><p>本人强烈推荐这个项目，因为UI、交互、速度方面都是最好的，而且部署在Vercel非常简单！</p></li><li><p>开源地址：<a href="https://github.com/Yidadaa/ChatGPT-Next-Web">Yidadaa/ChatGPT-Next-Web</a></p></li><li><p>示例图片：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/29/image.webp" alt=""></p></li><li><p>正式教程：见开源文档，和2.2接近</p></li></ul><h2 id="3-福利🍀：chatGPT镜像站列表">3.福利🍀：chatGPT镜像站列表</h2><ul><li><p>开源地址：</p><ol><li><a href="https://github.com/xx025/carrot"><strong>xx025/carrot</strong></a></li><li><a href="https://github.com/LiLittleCat/awesome-free-chatgpt"><strong>LiLittleCat/awesome-free-chatgpt</strong></a></li></ol></li><li><p>这两个开源项目都收集了多个可用的chatGPT镜像站，大家可以自行摸索，总会找到能用的！</p></li></ul>]]></content>
    
    
    <summary type="html">🍰教你没有服务器搭建属于自己的私人chatGPT</summary>
    
    
    
    <category term="简易教程" scheme="https://www.fomal.cc/categories/%E7%AE%80%E6%98%93%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="chatGPT" scheme="https://www.fomal.cc/tags/chatGPT/"/>
    
  </entry>
  
  <entry>
    <title>Linux驱动模型详解</title>
    <link href="https://www.fomal.cc/posts/dd1040c8.html"/>
    <id>https://www.fomal.cc/posts/dd1040c8.html</id>
    <published>2023-03-19T16:00:00.000Z</published>
    <updated>2023-03-19T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><p>以下内容部分摘录自公众号：<code>嵌入式与Linux那些事</code>，仅用于个人交流与学习，如涉及侵权请联系站长删除！</p></div><h2 id="1-Linux-驱动模型">1.Linux 驱动模型</h2><blockquote><p>本节内容，重在理解。面试时，面试官很大可能会让你挑一个你熟悉的驱动讲讲，如何编写的？能回答出大概的驱动框架就可以。</p></blockquote><h3 id="1-1-字符设备驱动模型">1.1 字符设备驱动模型</h3><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_9c9a4506e9c11693.png" alt=""></p><ul><li><p>驱动初始化中涉及到一个设备描述结构的概念。在任何一种驱动模型中，设备都会用内核中的一种结构来描述，这种结构成为<strong>设备描述结构</strong>。字符设备在内核中使用<code>struct cdev</code>这种结构来描述。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">cdev</span> </span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">kobject</span> <span class="title">kobj</span>;</span></span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">module</span> *<span class="title">owner</span>;</span></span><br><span class="line">    <span class="type">const</span> <span class="class"><span class="keyword">struct</span> <span class="title">file_operations</span> *<span class="title">ops</span>;</span> <span class="comment">//设备操作集</span></span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">list_head</span> <span class="title">list</span>;</span></span><br><span class="line">    <span class="type">dev_t</span> dev; <span class="comment">//设备号</span></span><br><span class="line">    <span class="type">unsigned</span> <span class="type">int</span> count; <span class="comment">//设备数</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>count表明该类型设备的数目，如有两个串口，则count的值为2。</p></li><li><p>dev是设备号，包含有主设备号和次设备号的信息。主设备号用于区分设备的类型，次设备号用于标记相同类型的设备的不同个体。如串口1和串口2使用同一驱动程序，则其主设备号相同，但次设备号不同。Linux内核中使用<code>dev_t</code>类型来定义设备号，<code>dev_t</code>这种类型其实质为32位的<code>unsigned int</code>，其中高12位为主设备号，低20位为次设备号。</p><ol><li>知道主设备号与次设备号，可通过<code>dev_t dev = MKDEV(主设备号，次设备号)</code> 获得设备号；</li><li>从设备号分解出主设备号：主设备号 = <code>MAJOR(dev_t dev) </code></li><li>从设备号分解出次设备号：次设备号 = <code>MINOR(dev_t dev)</code></li></ol></li><li><p>主设备号是一个重要的资源，可以通过静态申请和动态分配为设备分配一个主设备号：</p><ol><li>静态申请：开发者自己选择一个数字作为主设备号，然后通过函数<code>register_chrdev_region</code>向内核申请使用。这种方法的缺点是如果申请使用的设备号已经被内核中的其它驱动使用了，则申请失败。</li><li>动态分配：使用<code>alloc_chrdev_region</code>由内核分配一个可用的主设备号。因为内核知道哪些号已经被使用了，所以不会导致分配到已经被使用的号。既然设备号是一种资源，则设备驱动在退出后都应该释放该资源。使用<code>unregister_chrdev_region</code>函数释放这些设备号。</li></ol></li><li><p>ops是操作函数集。<code>file_operations</code>是一个很重要的结构，该结构的成员基本都是函数指针，并且是一些文件操作的函数的指针。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">file_operations</span> &#123;</span></span><br><span class="line">  <span class="class"><span class="keyword">struct</span> <span class="title">module</span> *<span class="title">owner</span>;</span></span><br><span class="line">  <span class="type">loff_t</span>(*llseek) (<span class="keyword">struct</span> file *, <span class="type">loff_t</span>, <span class="type">int</span>);</span><br><span class="line">  <span class="type">ssize_t</span>(*read) (<span class="keyword">struct</span> file *, <span class="type">char</span> __user *, <span class="type">size_t</span>, <span class="type">loff_t</span> *);</span><br><span class="line">  <span class="type">ssize_t</span>(*aio_read) (<span class="keyword">struct</span> kiocb *, <span class="type">char</span> __user *, <span class="type">size_t</span>, <span class="type">loff_t</span>);</span><br><span class="line">  <span class="type">ssize_t</span>(*write) (<span class="keyword">struct</span> file *, <span class="type">const</span> <span class="type">char</span> __user *, <span class="type">size_t</span>, <span class="type">loff_t</span> *);</span><br><span class="line">  <span class="type">ssize_t</span>(*aio_write) (<span class="keyword">struct</span> kiocb *, <span class="type">const</span> <span class="type">char</span> __user *, <span class="type">size_t</span>, <span class="type">loff_t</span>);</span><br><span class="line">  <span class="type">int</span> (*readdir) (<span class="keyword">struct</span> file *, <span class="type">void</span> *, <span class="type">filldir_t</span>);</span><br><span class="line">  <span class="type">unsigned</span> <span class="title function_">int</span> <span class="params">(*poll)</span> <span class="params">(<span class="keyword">struct</span> file *, <span class="keyword">struct</span> poll_table_struct *)</span>;</span><br><span class="line">  <span class="type">int</span> (*ioctl) (<span class="keyword">struct</span> inode *, <span class="keyword">struct</span> file *, <span class="type">unsigned</span> <span class="type">int</span>, <span class="type">unsigned</span> <span class="type">long</span>);</span><br><span class="line">  <span class="type">int</span> (*mmap) (<span class="keyword">struct</span> file *, <span class="keyword">struct</span> vm_area_struct *);</span><br><span class="line">  <span class="type">int</span> (*open) (<span class="keyword">struct</span> inode *, <span class="keyword">struct</span> file *);</span><br><span class="line">  <span class="type">int</span> (*flush) (<span class="keyword">struct</span> file *);</span><br><span class="line">  <span class="type">int</span> (*release) (<span class="keyword">struct</span> inode *, <span class="keyword">struct</span> file *);</span><br><span class="line">  <span class="type">int</span> (*fsync) (<span class="keyword">struct</span> file *, <span class="keyword">struct</span> dentry *, <span class="type">int</span> datasync);</span><br><span class="line">  <span class="type">int</span> (*aio_fsync) (<span class="keyword">struct</span> kiocb *, <span class="type">int</span> datasync);</span><br><span class="line">  <span class="type">int</span> (*fasync) (<span class="type">int</span>, <span class="keyword">struct</span> file *, <span class="type">int</span>);</span><br><span class="line">  <span class="type">int</span> (*lock) (<span class="keyword">struct</span> file *, <span class="type">int</span>, <span class="keyword">struct</span> file_lock *);</span><br><span class="line">  <span class="type">ssize_t</span>(*readv) (<span class="keyword">struct</span> file *, <span class="type">const</span> <span class="keyword">struct</span> iovec *, <span class="type">unsigned</span> <span class="type">long</span>, </span><br><span class="line"><span class="type">loff_t</span> *);</span><br><span class="line">  <span class="type">ssize_t</span>(*writev) (<span class="keyword">struct</span> file *, <span class="type">const</span> <span class="keyword">struct</span> iovec *, <span class="type">unsigned</span> <span class="type">long</span>, </span><br><span class="line"><span class="type">loff_t</span> *);</span><br><span class="line">  <span class="type">ssize_t</span>(*sendfile) (<span class="keyword">struct</span> file *, <span class="type">loff_t</span> *, <span class="type">size_t</span>, <span class="type">read_actor_t</span>, <span class="type">void</span> </span><br><span class="line">__user *);</span><br><span class="line">  <span class="type">ssize_t</span>(*sendpage) (<span class="keyword">struct</span> file *, <span class="keyword">struct</span> page *, <span class="type">int</span>, <span class="type">size_t</span>, <span class="type">loff_t</span> *, </span><br><span class="line"><span class="type">int</span>);</span><br><span class="line">  <span class="type">unsigned</span> <span class="title function_">long</span> <span class="params">(*get_unmapped_area)</span> <span class="params">(<span class="keyword">struct</span> file *, <span class="type">unsigned</span> <span class="type">long</span>,<span class="type">unsigned</span> </span></span><br><span class="line"><span class="params"><span class="type">long</span>, <span class="type">unsigned</span> <span class="type">long</span>,<span class="type">unsigned</span> <span class="type">long</span>)</span>;</span><br><span class="line">&#125;;    </span><br></pre></td></tr></table></figure></li><li><p><code>struct file_operations</code>是一个函数指针的集合，定义能在设备上进行的操作。结构中的函数指针指向驱动中的函数，这些函数实现一个针对设备的操作, 对于不支持的操作则设置函数指针为 NULL。例如：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">file_operations</span> <span class="title">dev_fops</span> =</span> &#123;</span><br><span class="line">    .llseek = <span class="literal">NULL</span>,</span><br><span class="line">    .read = dev_read,</span><br><span class="line">    .write = dev_write,</span><br><span class="line">    .ioctl = dev_ioctl,</span><br><span class="line">    .open = dev_open,</span><br><span class="line">    .release = dev_release,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>该结构体表示应用程序能够对设备文件使用函数<code>read()</code>, <code>write()</code>等，但不能使用函数<code>llseek()</code>。当执行到<code>read()</code>函数时，内核根据该结构体转移到驱动程序中的<code>dev_read</code>函数去执行。</p></li><li><p>驱动初始化有四大步骤：</p><ol><li><strong>分配</strong></li></ol><ul><li>cdev变量的定义可以采用静态和动态两种办法：</li><li>静态分配：<code>struct cdev mdev</code>；</li><li>动态分配：<code>struct cdev *pdev = cdev_alloc()</code>；</li></ul><ol start="2"><li><strong>初始化</strong></li></ol><ul><li><code>struct cdev</code>的初始化使用<code>cdev_init</code>函数来完成。</li><li>原型：<code>cdev_init(struct cdev *cdev, const struct file_operations *fops)  </code></li><li>参数：<ul><li><code>cdev</code>：待初始化的cdev结构</li><li><code>fops</code>：设备对应的操作函数集</li></ul></li></ul><ol start="3"><li><strong>注册</strong><ul><li>字符设备的注册使用<code>cdev_add</code>函数来完成。</li><li>原型：<code>cdev_add(struct cdev *p, dev_t dev, unsigned count) </code></li><li>参数：<ul><li><code>p</code>：待添加到内核的字符设备结构</li><li><code>dev</code>：设备号</li><li><code>count</code>：该类设备的设备个数</li></ul></li></ul></li><li><strong>硬件初始化</strong></li></ol><ul><li>根据相应硬件的数据手册完成初始化。</li></ul></li></ul><h3 id="1-2-实现设备操作">1.2 实现设备操作</h3><ul><li><p>由struct file_operations可以看出，要实现的操作并不少，这里只介绍一些重要的操作。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> (*open)(<span class="keyword">struct</span> inode *, <span class="keyword">struct</span> file *) <span class="comment">//打开设备，响应open系统调用</span></span><br><span class="line"><span class="type">int</span> (*release)(<span class="keyword">struct</span> inode *, <span class="keyword">struct</span> file *);<span class="comment">//关闭设备，响应close系统调用</span></span><br><span class="line"><span class="type">loff_t</span> (*llseek)(<span class="keyword">struct</span> file *, <span class="type">loff_t</span>, <span class="type">int</span>) <span class="comment">//重定位读写指针，响应lseek系统调用</span></span><br><span class="line"><span class="type">ssize_t</span> (*read)(<span class="keyword">struct</span> file *, <span class="type">char</span> __user *, <span class="type">size_t</span>, <span class="type">loff_t</span> *) <span class="comment">//从设备读取数据，响应read系统调用</span></span><br><span class="line"><span class="type">ssize_t</span> (*write)(<span class="keyword">struct</span> file *, <span class="type">const</span> <span class="type">char</span> __user *, <span class="type">size_t</span>, <span class="type">loff_t</span> *) <span class="comment">//向设备写入数据，响应write系统调用</span></span><br></pre></td></tr></table></figure></li><li><p>以上几个函数涉及到了<code>struct inode</code>和<code>struct file</code>这两种结构体。</p></li><li><p>在Linux系统中，每一个<strong>打开的文件</strong>，在内核中都会关联一个<code>struct file</code>结构体，它由内核在打开文件时创建，在文件关闭后释放。该结构体的重要成员有：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">loff_t</span> f_pos <span class="comment">/*文件读写指针*/</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">file_operations</span> *<span class="title">f_op</span> /*该文件所对应的操作*/</span></span><br></pre></td></tr></table></figure></li><li><p>每一个存在于文件系统里面的文件都会关联一个<code>inode</code> 结构，该结构主要用来<strong>记录文件物理上的信息</strong>。因此，它和代表打开文件的file结构是不同的。一个文件<strong>没有被打开时不会关联file结构，但是却会关联一个inode结构</strong>。该结构体重要的成员有：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">dev_t</span> i_rdev <span class="comment">/*设备号*/</span></span><br></pre></td></tr></table></figure></li><li><p>一个设备支持的函数操作又称为设备方法。</p></li><li><p><code>open</code>设备方法是驱动程序用来为以后的操作完成<strong>初始化</strong>准备工作的。在大部分驱动程序中，open完成如下工作：<strong>标明次设备号、启动设备</strong>。</p></li><li><p><code>release</code>设备方法的作用与open相反，这个设备方法有时也称为close，它完成的工作是<strong>关闭设备</strong>。</p></li><li><p><code>read</code>设备方法通常完成两件事情：从设备中<strong>读取数据</strong>(属于硬件访问类操作)，将读取到的数据<strong>返回给应用程序</strong>。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ssize_t</span> (*read)(<span class="keyword">struct</span> file *filp,<span class="type">char</span> __user *buff,<span class="type">size_t</span> count,<span class="type">loff_t</span> *offp)</span><br></pre></td></tr></table></figure></li><li><p>参数说明：</p><ol><li><code>filp</code>：与字符设备文件关联的file结构指针，由内核创建。</li><li><code>buff</code>：从设备读取到的数据，需要<strong>保存到的位置</strong>。由read系统调用提供该参数。</li><li><code>count</code>：请求传输的<strong>数据量</strong>，由read系统调用提供该参数。</li><li><code>offp</code>：文件的<strong>读写位置</strong>，由内核从file结构中取出后(相当于读取指针)，传递进来。</li></ol></li><li><p>要注意的是，<code>buff</code>参数是来源于用户空间的指针，这类指针都<strong>不能被内核代码直接引用</strong>，必须使用专门的函数：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">copy_to_user</span><span class="params">(<span class="type">void</span> __user *to, <span class="type">const</span> <span class="type">void</span> *from, <span class="type">int</span> n)</span><span class="comment">// 内核态-&gt;用户态</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">copy_from_user</span><span class="params">(<span class="type">void</span> *to, <span class="type">const</span> <span class="type">void</span> __user *from, <span class="type">int</span> n)</span><span class="comment">// 用户态-&gt;内核态</span></span><br></pre></td></tr></table></figure></li><li><p>其中<code>copy_to_user()</code>用于将内核数据传送给用户空间；<code>copy_from_user()</code>用于将用户空间的数据传送给内核空间。</p></li><li><p><code>write</code>设备方法通常完成两件事情：<strong>从应用程序提供的地址中取出数据，将数据写入设备</strong>(属于硬件访问类操作)</p></li><li><p>函数原型：<code>ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *)</code></p></li><li><p>驱动注销：当我们从内核中卸载驱动程序的时候，需要使用<code>cdev_del</code>函数来完成字符设备的注销。</p></li><li><p>一个驱动程序范例：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/module.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/types.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/fs.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/errno.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/init.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/cdev.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;asm/uaccess.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/slab.h&gt;</span></span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> dev1_registers[<span class="number">5</span>];</span><br><span class="line"><span class="type">int</span> dev2_registers[<span class="number">5</span>];</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">cdev</span> <span class="title">cdev</span>;</span> <span class="comment">// 字符驱动设备</span></span><br><span class="line"><span class="type">dev_t</span> devno;<span class="comment">// 设备号</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">/*文件打开函数*/</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">mem_open</span><span class="params">(<span class="keyword">struct</span> inode *inode, <span class="keyword">struct</span> file *filp)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">/*获取次设备号*/</span></span><br><span class="line">    <span class="type">int</span> num = MINOR(inode-&gt;i_rdev);</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">if</span> (num==<span class="number">0</span>)</span><br><span class="line">        filp-&gt;private_data = dev1_registers;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span>(num == <span class="number">1</span>)</span><br><span class="line">        filp-&gt;private_data = dev2_registers;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="keyword">return</span> -ENODEV;  <span class="comment">//无效的次设备号</span></span><br><span class="line"> </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>; </span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/*文件释放函数*/</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">mem_release</span><span class="params">(<span class="keyword">struct</span> inode *inode, <span class="keyword">struct</span> file *filp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/*读函数 返回读取了多少个数据*/</span></span><br><span class="line"><span class="type">static</span> <span class="type">ssize_t</span> <span class="title function_">mem_read</span><span class="params">(<span class="keyword">struct</span> file *filp, <span class="type">char</span> __user *buf, <span class="type">size_t</span> size, <span class="type">loff_t</span> *ppos)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">long</span> p =  *ppos;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> count = size;</span><br><span class="line">  <span class="type">int</span> ret = <span class="number">0</span>;</span><br><span class="line">  <span class="type">int</span> *register_addr = filp-&gt;private_data; <span class="comment">/*获取设备的寄存器基地址*/</span></span><br><span class="line"> </span><br><span class="line">  <span class="comment">/*判断读位置是否有效*/</span></span><br><span class="line">  <span class="keyword">if</span> (p &gt;= <span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>))</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span> (count &gt; <span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>) - p)</span><br><span class="line">    count = <span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>) - p;</span><br><span class="line"> </span><br><span class="line">  <span class="comment">/*读数据到用户空间 从基地址偏移p个(p为开始读的位置 即ppos描述的相对位置)*/</span></span><br><span class="line">  <span class="keyword">if</span> (copy_to_user(buf, register_addr+p, count))</span><br><span class="line">  &#123;</span><br><span class="line">    ret = -EFAULT;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    *ppos += count;</span><br><span class="line">    ret = count;</span><br><span class="line">  &#125;</span><br><span class="line"> </span><br><span class="line">  <span class="keyword">return</span> ret;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/*写函数*/</span></span><br><span class="line"><span class="type">static</span> <span class="type">ssize_t</span> <span class="title function_">mem_write</span><span class="params">(<span class="keyword">struct</span> file *filp, <span class="type">const</span> <span class="type">char</span> __user *buf, <span class="type">size_t</span> size, <span class="type">loff_t</span> *ppos)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">long</span> p =  *ppos;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> count = size;</span><br><span class="line">  <span class="type">int</span> ret = <span class="number">0</span>;</span><br><span class="line">  <span class="type">int</span> *register_addr = filp-&gt;private_data; <span class="comment">/*获取设备的寄存器地址*/</span></span><br><span class="line"> </span><br><span class="line">  <span class="comment">/*分析和获取有效的写长度*/</span></span><br><span class="line">  <span class="keyword">if</span> (p &gt;= <span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>))</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span> (count &gt; <span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>) - p)</span><br><span class="line">    count = <span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>) - p;</span><br><span class="line"> </span><br><span class="line">  <span class="comment">/*从用户空间写入数据*/</span></span><br><span class="line">  <span class="keyword">if</span> (copy_from_user(register_addr + p, buf, count))</span><br><span class="line">    ret = -EFAULT;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    *ppos += count;</span><br><span class="line">    ret = count;</span><br><span class="line">  &#125;</span><br><span class="line"> </span><br><span class="line">  <span class="keyword">return</span> ret;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* seek文件定位函数 */</span></span><br><span class="line"><span class="type">static</span> <span class="type">loff_t</span> <span class="title function_">mem_llseek</span><span class="params">(<span class="keyword">struct</span> file *filp, <span class="type">loff_t</span> offset, <span class="type">int</span> whence)</span></span><br><span class="line">&#123; </span><br><span class="line">    <span class="type">loff_t</span> newpos;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">switch</span>(whence) &#123;</span><br><span class="line">      <span class="keyword">case</span> SEEK_SET: </span><br><span class="line">        newpos = offset;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line">      <span class="keyword">case</span> SEEK_CUR: </span><br><span class="line">        newpos = filp-&gt;f_pos + offset;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line">      <span class="keyword">case</span> SEEK_END: </span><br><span class="line">        newpos = <span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>)<span class="number">-1</span> + offset;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line">      <span class="keyword">default</span>: </span><br><span class="line">        <span class="keyword">return</span> -EINVAL;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ((newpos&lt;<span class="number">0</span>) || (newpos&gt;<span class="number">5</span>*<span class="keyword">sizeof</span>(<span class="type">int</span>)))</span><br><span class="line">        <span class="keyword">return</span> -EINVAL;</span><br><span class="line"> </span><br><span class="line">    filp-&gt;f_pos = newpos;</span><br><span class="line">    <span class="keyword">return</span> newpos;</span><br><span class="line"> </span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/*文件操作结构体*/</span></span><br><span class="line"><span class="type">static</span> <span class="type">const</span> <span class="class"><span class="keyword">struct</span> <span class="title">file_operations</span> <span class="title">mem_fops</span> =</span></span><br><span class="line">&#123;</span><br><span class="line">  .llseek = mem_llseek,</span><br><span class="line">  .read = mem_read,</span><br><span class="line">  .write = mem_write,</span><br><span class="line">  .open = mem_open,</span><br><span class="line">  .release = mem_release,</span><br><span class="line">&#125;;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/*设备驱动模块加载函数*/</span></span><br><span class="line"><span class="type">static</span> <span class="type">int</span> <span class="title function_">memdev_init</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="comment">/*初始化cdev结构*/</span></span><br><span class="line">  cdev_init(&amp;cdev, &amp;mem_fops);</span><br><span class="line"> </span><br><span class="line">  <span class="comment">/* 注册字符设备 */</span></span><br><span class="line">  alloc_chrdev_region(&amp;devno, <span class="number">0</span>, <span class="number">2</span>, <span class="string">&quot;memdev&quot;</span>);</span><br><span class="line">  cdev_add(&amp;cdev, devno, <span class="number">2</span>);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/*模块卸载函数*/</span></span><br><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">memdev_exit</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">  cdev_del(&amp;cdev);   <span class="comment">/*注销设备*/</span></span><br><span class="line">  unregister_chrdev_region(devno, <span class="number">2</span>); <span class="comment">/*释放设备号*/</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line">MODULE_LICENSE(<span class="string">&quot;GPL&quot;</span>);</span><br><span class="line"> </span><br><span class="line">module_init(memdev_init);</span><br><span class="line">module_exit(memdev_exit);</span><br></pre></td></tr></table></figure></li></ul><h3 id="1-3-总线设备驱动模型">1.3 总线设备驱动模型</h3><ul><li><p>自内核2.6版本开始，需要关注的是<strong>总线、设备和驱动</strong>这3个实体，总线将设备和驱动绑定。在Linux内核系统中注册一个设备的时候，会寻找与之对应驱动进行匹配；相反地，系统中注册一个驱动的时候，会去寻找一个对应的设备进行匹配。<strong>匹配的的工作由总线来完成</strong>。</p></li><li><p><strong>在Linux设备中有的是没有对应的物理总线的，但为了适配Linux的总线模型，内核针对这种没有物理总线的设备开发了一种虚拟总线——platform总线</strong>。将设备和驱动独立开，驱动尽可能写的通用，当来了一个类似的设备后也可以使用这个驱动，让驱动程序可以重用。这体现了Linux驱动的软件架构设计的思想。</p></li><li><p>按照这个思路，Linux中的设备和驱动都需要挂接在一种总线上，比如i2c总线上的eeprom，eeprom作为设备，<strong>eeprom的驱动都挂接在i2c驱动上</strong>。但是在嵌入式系统中，<strong>soc系统一般都会集成独立的i2c控制器，控制器也是需要驱动的，但是再按照设备-总线-驱动模型进行设计，就会发现无法找到一个合适总线去挂接控制器设备和控制器驱动了（i2c控制器是挂接在CPU内部的总线上，而不是i2c总线）</strong>，所以Linux发明了一种虚拟总线，称为platform总线，相应的设备称为<strong>platform_device（控制器设备），对应的驱动为platform_driver（控制器驱动），用platform总线来承载这些相对特殊的系统</strong>。</p></li><li><p>注意：<strong>所谓的platform_device并不是与字符设备、块设备和网络设备并列的概念，而是Linux系统提供的一种附加手段</strong>。例如，在 S3C6410处理器中，把内部集成的I2C、RTC、SPI、LCD、看门狗等控制器都归纳为platform_device，而它们本身就是字符设备。我们要记住，platform 驱动只是在<strong>字符设备驱动外套一层platform_driver 的外壳</strong>。引入platform模型符合Linux 设备模型 —— 总线、设备、驱动，设备模型中配套的sysfs节点都可以用，方便我们的开发；<strong>当然你也可以选择不用，不过就失去了一些platform带来的便利</strong>。</p></li><li><p>设备驱动中引入platform 概念，隔离BSP和驱动。在BSP中定义platform设备和设备使用的资源、设备的具体匹配信息，而在驱动中，只需要通过API去获取资源和数据，做到了板相关代码和驱动代码的分离，使得驱动具有更好的可扩展性和跨平台性。</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_2f0a872f1c6846a7.png" alt=""></p></li><li><p><strong>下面分析下总线设备驱动模型的匹配过程</strong></p><ol><li>一边的<code>device</code>结构体和另一边的<code>较稳定的 driver 代码</code>的联系：<code>device_add()</code>除将<code>device</code>结构放到 bus 的<code>dev 链表</code>之外，还会从另一边的<code>drv</code>链表中取表元即某个<code>driver</code>结构，用总线里的一个<code>（.match）</code>函数来作比较，看另一边的<code>driver</code>是否支持一边的<code>device</code>。若是能够支持，则接着调用软件驱动部分的<code>.probe</code>函数。<code>driver_register()</code>会将<code>bus_drv_dev</code>模型中的较稳定代码<code>driver</code>结构体放到虚拟总线的某个链表（drv 链表）中。从另一边的<code>dev</code>链表中取出每一个<code>device</code>结构用 bus 中的<code>.match</code>函数来作比较。</li><li>若支持则调用<code>.probe</code>函数。左右两个注册就建立起来的一种机制。在<code>.probe</code>函数中做的事件由自已决定，打印一句话，或注册一个字符设备，再或注册一个<code>input_dev</code>结构体等等都是由自已决定。强制的把一个驱动程序分为左右两边这种机制而已，可以把这套东西放在任何地方，这里的<code>driver</code>只是个结构体不要被这个名字迷惑，<code>device</code>也只是个结构体，里面放什么内容都是由自已决定的。</li></ol></li></ul><h3 id="1-4-输入子系统模型">1.4 输入子系统模型</h3><ul><li><p>每个硬件都有一个<code>input_dev</code>结构体，每个软件都有一个<code>input_handler</code>结构体。<code>input_dev</code>和<code>input_handler</code>分别通过<code>input_register_device()</code>，<code>input_register_handler()</code>向核心层注册硬件和软件。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">input_register_device</span><span class="params">(<span class="keyword">struct</span> input_dev *dev)</span>   <span class="comment">//*dev:要注册的驱动设备</span></span><br><span class="line">&#123;</span><br><span class="line"> ... ...</span><br><span class="line">       list_add_tail(&amp;dev-&gt;node, &amp;input_dev_list);   <span class="comment">//(1)放入链表中</span></span><br><span class="line"> ... ...</span><br><span class="line">       list_for_each_entry(handler, &amp;input_handler_list, node)  <span class="comment">//(2)</span></span><br><span class="line">       input_attach_handler(dev, handler);</span><br><span class="line"> ... ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_34a2270120dbb70a.png" alt=""></p><ul><li>从<code>input_dev</code>方向分析：<code>input</code>设备在增加到<code>input_dev_list</code>链表上之后，会查找 <code>input_handler_list</code>事件处理链表上的<code>handler</code>进行匹配，这里的匹配方式与总线设备驱动模型的<code>device</code>和<code>driver</code>匹配过程很相似，所有的<code>input_device</code>都挂在<code>input_dev_list</code>上，所有类型的事件都挂在<code>input_handler_list</code>上，进行“匹配相亲”。如果匹配上了，就调用<code>input_handler</code>的<code>connect</code>函数进行连接。设备就是在此时注册的。</li><li>从<code>input_handler</code>方向分析：将<code>handler</code>挂到链表<code>input_handler_list</code>下，然后遍历<code>input_dev_list</code>链表,查找并匹配输入设备对应的事件处理层，如果匹配上了，就调用<code>connect</code>函数进行连接，并创建<code>input_handle</code>结构。</li><li>所以，不管新添加<code>input_dev</code>还是<code>input_handler</code>，都会进入<code>input_attach_handler()</code>判断两者id是否有支持, 若两者支持便进行连接。</li></ul><h3 id="1-5-platform总线的匹配规则是什么？在具体应用上要不要先注册驱动再注册设备？有先后顺序没？">1.5 platform总线的匹配规则是什么？在具体应用上要不要先注册驱动再注册设备？有先后顺序没？</h3><ul><li>匹配规则就是当有一个新的设备挂起时，总线被唤醒，<code>match</code>函数被调用，用<code>device</code>名字去跟本总线下的所有驱动名字去比较。相反就是用驱动的名字去<code>device</code>链表中和所有<code>device</code>的名字比较。如果匹配上，才会调用驱动中的<code>probe</code>函数，否则不调用。至于先后顺序，鉴于个人理解，<strong>不会有影响</strong>，不管谁先谁后，bus都会完成匹配工作。</li><li>设备驱动模型的出现主要有三个好处：<ol><li>设备与驱动分离，驱动<strong>可移植性增强</strong>；</li><li>设备驱动抽象结构以总线结构表示看起来更加<strong>清晰明了</strong>，谁是属于哪一条bus的；</li><li>设备与驱动分离，很好的奠定了<strong>热插拔</strong>机制。</li></ol></li></ul><h2 id="2-Linux内核">2.Linux内核</h2><h3 id="2-1-内核镜像格式有几种？分别有什么区别？">2.1 内核镜像格式有几种？分别有什么区别？</h3><ol><li>uboot经过编译直接生成的elf格式的可执行程序是u-boot，这个程序类似于windows下的exe格式，在操作系统下是<strong>可以直接执行</strong>的。但是这种格式<strong>不能用来烧录下载</strong>。我们用来烧录下载的是u-boot.bin，这个东西是由u-boot使用arm-linux-objcopy工具进行加工（主要目的是去掉一些无用的东西）得到的。这个u-boot.bin就叫镜像（image），镜像就是用来烧录到iNand中执行的。</li><li>linux内核经过编译后也会生成一个elf格式的可执行程序，叫<strong>vmlinux或vmlinuz</strong>，这个就是<strong>原始的未经任何处理加工的原版内核elf文件</strong>；嵌入式系统部署时烧录的一般不是这个vmlinuz/vmlinux，而是要用objcopy工具去制作成烧录镜像格式（就是u-boot.bin这种，但是内核没有.bin后缀），经过制作加工成烧录镜像的文件就叫<strong>Image</strong>（制作把78M大的精简成了7.5M，因此这个制作烧录镜像主要目的就是缩减大小，节省磁盘）。</li><li>原则上Image就可以直接被烧录到Flash上进行启动执行（类似于u-boot.bin），但是实际上并不是这么简单。实际上linux的作者们觉得Image还是太大了所以对Image进行了压缩，并且在image压缩后的文件的<strong>前端附加了一部分解压缩代码</strong>。构成了一<strong>个压缩格式的镜像就叫zImage</strong>。（因为当年Image大小刚好比一张软盘（软盘有2种，1.2M的和1.44MB两种）大，为了节省1张软盘的钱于是乎设计了这种压缩Image成zImage的技术）。</li><li>uboot为了启动linux内核，还发明了一种内核格式叫uImage。<strong>uImage是由zImage加工得到的</strong>，uboot中有一个工具，可以将zImage加工生成uImage。注意：uImage不关linux内核的事，linux内核只管生成zImage即可，然后uboot中的mkimage工具再去由zImage加工生成uImage来给uboot启动。这个加工过程其实就是<strong>在zImage前面加上64字节的uImage的头信息即可</strong>。</li><li>原则上uboot启动时应该给他uImage格式的内核镜像，但是实际上uboot中也可以支持zImage，是否支持就看x210_sd.h中是否定义了LINUX_ZIMAGE_MAGIC这个宏。所以大家可以看出：有些uboot是支持zImage启动的，有些则不支持。但是<strong>所有的uboot肯定都支持uImage启动</strong>。</li><li>如果直接在kernel底下去<code>make uImage</code>会提供<code>mkimage command not found</code>。解决方案是去<code>uboot/tools</code>下<code>cp mkimage /usr/local/bin/</code>，复制mkimage工具到系统目录下。再去<code>make uImage</code>即可。</li></ol><blockquote><p>通过上面的介绍我们了解了内核镜像的各种格式，如果通过uboot启动内核，Linux必须为<strong>uImage</strong>格式。</p></blockquote><h3 id="2-2-内核中申请内存有哪几个函数？有什么区别？">2.2 内核中申请内存有哪几个函数？有什么区别？</h3><ol><li><p><strong>kmalloc</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> *<span class="title function_">kmalloc</span><span class="params">(<span class="type">size_t</span> size, <span class="type">gfp_t</span> flags)</span></span><br></pre></td></tr></table></figure><p><code>kmalloc</code>是内核中最常用的一种内存分配方式，它通过调用<code>kmem_cache_alloc</code>函数来实现。<code>kmalloc</code>一次最多能申请的内存大小由<code>include/linux/Kmalloc_size.h</code>的内容来决定，在默认的2.6.18内核版本中，kmalloc一次最多能申请大小为131702B也就是<strong>128KB</strong>字节的连续物理内存。测试结果表明，如果试图用kmalloc函数分配大于128KB的内存，编译不能通过。</p></li><li><p><strong>vmalloc</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> *<span class="title function_">vmalloc</span><span class="params">(<span class="type">unsigned</span> <span class="type">long</span> size)</span></span><br></pre></td></tr></table></figure><p>前面几种内存分配方式都是物理连续的，能保证较低的平均访问时间。但是在某些场合中，对内存区的请求不是很频繁，较高的内存访问时间也可以接受，这是就可以分配一段<strong>线性连续，物理不连续</strong>的地址，带来的好处是一次可以<strong>分配较大块的内存</strong>。图3-1表示的是<code>vmalloc</code>分配的内存使用的地址范围。<code>vmalloc</code>对一次能分配的内存大小没有明确限制。出于性能考虑，应谨慎使用<code>vmalloc</code>函数。在测试过程中，<strong>最大能一次分配1GB的空间</strong>。</p></li><li><p><strong>dma_alloc_coherent</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> *<span class="title function_">dma_alloc_coherent</span><span class="params">(<span class="keyword">struct</span> device *dev, <span class="type">size_t</span> size,<span class="type">ma_addr_t</span> </span></span><br><span class="line"><span class="params">*dma_handle, <span class="type">gfp_t</span> gfp)</span></span><br></pre></td></tr></table></figure><p>DMA(直接内存访问 Direct Memory Access)是一种硬件机制，允许外围设备和主存之间直接传输IO数据，而不需要CPU的参与，使用DMA机制能<strong>大幅提高与设备通信的吞吐量</strong>。DMA操作中，涉及到CPU<strong>高速缓存和对应的内存数据一致性</strong>的问题，必须保证两者的数据一致，在x86_64体系结构中，硬件已经很好的解决了这个问题，<code>dma_alloc_coherentget_free_pages</code>函数实现差别不大，前者实际是调用<code>alloc_pages</code>函数来分配内存，因此一次分配内存的大小限制和后者一样。<code>__get_free_pages</code>分配的内存同样可以用于DMA操作。测试结果证明，<code>dma_alloc_coherent</code>函数一次能分配的最大内存也为<strong>4M</strong>。</p></li><li><p><strong>ioremap</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> * <span class="title function_">ioremap</span> <span class="params">(<span class="type">unsigned</span> <span class="type">long</span> offset, <span class="type">unsigned</span> <span class="type">long</span> size)</span></span><br></pre></td></tr></table></figure><p><code>ioremap</code>是一种更直接的内存“分配”方式，使用时直接<strong>指定物理起始地址和需要分配内存</strong>的大小，然后将该段<strong>物理地址映射到内核地址空间</strong>。<code>ioremap</code>用到的物理地址空间都是事先确定的，和上面的几种内存分配方式并不太一样，并不是分配一段新的物理内存。<code>ioremap</code>多用于<strong>设备驱动</strong>，可以让CPU直接访问外部设备的IO空间。<code>ioremap</code>能映射的内存由原有的物理内存空间决定，所以没有进行测试。</p></li></ol><h3 id="2-3-什么是内核空间，用户空间？">2.3 什么是内核空间，用户空间？</h3><ul><li><p>对 32 位操作系统而言，它的寻址空间（虚拟地址空间，或叫线性地址空间）为 4G（2的32次方）。也就是说一个进程的最大地址空间为 4G。</p></li><li><p>操作系统的核心是内核(kernel)，它独立于普通的应用程序，可以访问受保护的内存空间，也有访问底层硬件设备的所有权限。为了保证内核的安全，现在的操作系统一般都强制<strong>用户进程不能直接操作内核</strong>。具体的实现方式基本都是由<strong>操作系统将虚拟地址空间划分为两部分</strong>，一部分为内核空间，另一部分为用户空间。针对 Linux 操作系统而言，<strong>最高的 1G 字节</strong>(从虚拟地址 <code>0xC0000000</code> 到 <code>0xFFFFFFFF</code>)由内核使用，称为<strong>内核空间</strong>。而<strong>较低的 3G 字节</strong>(从虚拟地址<code> 0x00000000</code> 到 <code>0xBFFFFFFF</code>)由各个进程使用，称为用户空间。</p></li><li><p>对上面这段内容我们也可以这样理解：<br>每个进程的 4G 地址空间中，最高 1G 都是一样的，即内核空间。只有剩余的 3G 才归进程自己使用。换句话说就是，<strong>最高 1G 的内核空间是被所有进程共享的</strong>！</p></li><li><p>下图描述了每个进程 4G 地址空间的分配情况：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_2871bf1c01d4ad3a.png" alt=""></p></li></ul><h3 id="2-4-为什么需要区分内核空间与用户空间？">2.4 为什么需要区分内核空间与用户空间？</h3><ul><li>在 CPU 的所有指令中，有些指令是非常危险的，如果错用，将导致系统崩溃，比如<strong>清内存、设置时钟</strong>等。如果允许所有的程序都可以使用这些指令，那么系统<strong>崩溃的概率将大大增加</strong>。</li><li>所以，CPU 将指令分为<strong>特权指令</strong>和<strong>非特权指令</strong>，对于那些危险的指令，只允许操作系统及其相关模块使用，普通应用程序只能使用那些不会造成灾难的指令。比如 Intel 的 CPU 将特权等级分为 4 个级别：Ring0~Ring3。</li><li>其实 Linux 系统只使用了 Ring0 和 Ring3 两个运行级别(Windows 系统也是一样的)。当进程运行在 Ring3 级别时被称为运行在用户态，而运行在 Ring0 级别时被称为运行在内核态。</li></ul><h3 id="2-5-什么是内核态和用户态？">2.5 什么是内核态和用户态？</h3><ul><li>当进程<strong>运行在内核空间时</strong>就处于内核态，而进程<strong>运行在用户空间</strong>时则处于用户态。</li><li>在内核态下，进程运行在内核地址空间中，此时 CPU 可以执行任何指令。运行的代码也不受任何的限制，可以自由地访问任何有效地址，也可以直接进行端口的访问。</li><li>在用户态下，进程运行在用户地址空间中，被执行的代码要受到 CPU 的诸多检查，它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址，且只能对任务状态段(TSS)中 I/O 许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。</li><li>对于以前的 DOS 操作系统来说，是没有内核空间、用户空间以及内核态、用户态这些概念的。可以认为所有的代码都是运行在内核态的，因而，用户编写的应用程序代码可以很容易的让操作系统崩溃掉。</li><li>对于 Linux 来说，通过区分内核空间和用户空间的设计，<strong>隔离了操作系统代码</strong>(操作系统的代码要比应用程序的代码健壮很多)<strong>与应用程序代码</strong>。即便是单个应用程序出现错误，也不会影响到操作系统的稳定性，这样其它的程序还可以正常的运行(Linux 可是个多任务系统啊！)。所以，<strong>区分内核空间和用户空间本质上是要提高操作系统的稳定性及可用性</strong>。</li></ul><h3 id="2-6-用户空间与内核通信方式有哪些？">2.6 用户空间与内核通信方式有哪些？</h3><ol><li><p><strong>使用API</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">get_user(x，ptr) <span class="comment">//在内核中被调用，获取用户空间指定地址的数值并保存到内核变量x中。</span></span><br><span class="line">put_user(x，ptr) <span class="comment">//在内核中被调用，将内核空间的变量x的数值保存到到用户空间指定地址处。</span></span><br><span class="line">copy_from_user()/copy_to_user() <span class="comment">//主要应用于设备驱动读写函数中，通过系统调用触发。</span></span><br></pre></td></tr></table></figure></li><li><p><strong>使用proc文件系统</strong><br>和<code>sysfs</code>文件系统类似，也可以作为内核空间和用户空间交互的手段。<code>/proc</code> 文件系统是一种虚拟文件系统，通过他可以作为一种linux内核空间和用户空间的桥梁。与普通文件不同，这里的虚拟文件的内容都是动态创建的。使用<code>/proc</code>文件系统的方式很简单。调用<code>create_proc_entry</code>，返回一个<code>proc_dir_entry</code>指针，然后去填充这个指针指向的结构就好了。(相当于proc为用户空间的进程开了个口访问内核空间)</p></li><li><p><strong>使用sysfs文件系统+kobject</strong><br>每个在内核中注册的<code>kobject</code>都对应着<code>sysfs</code>系统中的一个目录。可以通过读取根目录下的<code>sys</code>目录中的文件来获得相应的信息。除了<code>sysfs</code>文件系统和<code>proc</code>文件系统之外，一些其他的虚拟文件系统也能同样达到这个效果。</p></li><li><p><strong>netlink</strong><br><code>netlink socket</code>提供了一组类似于BSD风格的API，用于用户态和内核态的IPC。相比于其他的用户态和内核态IPC机制，netlink有几个好处：1.使用自定义一种协议完成数据交换，不需要添加一个文件等。2.可以支持多点传送。3.支持内核先发起会话。4.异步通信，支持缓存机制。</p></li><li><p><strong>文件</strong><br>应该说这是一种比较笨拙的做法，不过确实可以这样用。当处于内核空间的时候，直接操作文件，将想要传递的信息写入文件，然后用户空间可以读取这个文件便可以得到想要的数据了。下面是一个简单的测试程序，在内核态中，程序会向<code>/home/melody/str_from_kernel</code>文件中写入一条字符串，然后我们在用户态读取这个文件，就可以得到内核态传输过来的数据了。</p></li><li><p><strong>使用mmap系统调用</strong><br>可以将内核空间的地址映射到用户空间。在以前做嵌入式的时候用到几次。一方面可以在<code>driver</code>中修改<code>Struct file_operations</code>结构中的<code>mmap</code>函数指针来重新实现一个文件对应的映射操作。另一方面，也可以直接打开<code>/dev/mem</code>文件，把物理内存中的某一页映射到进程空间中的地址上。其实，除了重写<code>Struct file_operations</code>中<code>mmap</code>函数，我们还可以重写其他的方法如<code>ioctl</code>等，来达到驱动内核空间和用户空间通信的方式。</p></li><li><p><strong>信号</strong><br>从内核空间向进程发送信号。这个倒是经常遇到，用户程序出现重大错误，内核发送信号杀死相应进程。</p></li></ol><h3 id="2-7-内核链表为什么具有通用性？">2.7 内核链表为什么具有通用性？</h3><ul><li><p>内核中由于要管理大量的设备，但是各种设备各不相同，必须将他们统一起来管理，于是内核设计者就想到了使用通用链表来处理，通用链表看似神秘，实际上就是<strong>双向循环链表</strong>，这个链表的每个节点都是只有指针域，没有任何数据域。</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_3c843e4275924363.png" alt=""></p></li><li><p>使用通用链表的好处是：</p><ol><li><p>通用链表中每个节点中<strong>没有数据域</strong>，也就是说无论数据结构有多复杂在链表中只有前后级指针。</p></li><li><p>如果一个数据结构（即是描述设备的设备结构体）想要用通用链表管理，只需要在结构体中包含<strong>节点的字段</strong>即可。</p></li><li><p>双向链表可以从任意一个节点的前后遍历整个链表，<strong>遍历非常方便</strong>。</p></li><li><p>使用循环链表使得可以不断地循环遍历管理节点，像进程的调度：操作系统会把<strong>就绪的进程</strong>放在一个管理进程的就绪队列的通用链表中管理起来，循环不断地，为他们<strong>分配时间片</strong>，获得cpu进行周而复始的进程调度。</p></li></ol></li></ul><h3 id="2-8-应用程序中open-在linux中执行过程中是如何从用户空间到内核空间？">2.8 应用程序中open()在linux中执行过程中是如何从用户空间到内核空间？</h3><ol><li>应用层调用<code>open</code>函数，在VFS层中找到<code>struct inode</code>结构体，判断是字符设备还是块设备，根据设备号，可以找到对应的驱动程序。</li><li>在驱动层中，每个字符设备都有一个<code>struct cdev</code>结构体，这个结构体通过<code>struct inode</code>结构体中的<code>i_cdev</code>把连接起VFS层和驱动层，<code>struct cdev</code>结构体描述了字符设备所有信息，其中最重要的一项就是字符设备的操作函数接口，即<code>const struct file_operations *ops</code></li><li><code>struct cdev</code>结构体中的<code>struct file</code>结构体记录了操作字符设备的一些函数，比如<code>open read write</code>函数等。<code>struct file</code>结构体其实是在VFS层的，通过<code>struct file</code>结构体指针指向驱动层的<code>struct file</code>结构体将驱动层函数和VFS层链接起来</li><li>任务完成，VFS层会给应用返回一个<strong>文件描述符（fd）</strong>。这个fd是和<code>struct file</code>结构体对应的。</li></ol><h2 id="3-设备驱动">3.设备驱动</h2><h3 id="3-1-请简述主设备号和次设备号的用途">3.1 请简述主设备号和次设备号的用途</h3><ul><li><strong>主设备号：主设备号标识设备对应的特定的驱动程序</strong>。虽然现代的linux内核允许多个驱动程序共享主设备号，但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织</li><li><strong>次设备号：次设备号由内核使用，用于确定由主设备号对应驱动程序中的各个设备</strong>。依赖于驱动程序的编写方式，我们可以通过次设备号获得一个指向内核设备的直接指针，也可将此设备号当作设备本地数组的索引。</li></ul><h3 id="3-2-字符型驱动设备怎么创建设备文件？">3.2 字符型驱动设备怎么创建设备文件？</h3><ol><li>手动创建<br><code>mknod /dev/led c 250 0 </code>，其中<code>dev/led</code>为设备节点 ,<code>c</code> 代表字符设备, <code>250</code>代表主设备号, <code>0</code>代表次设备号。</li><li>自动创建<br><code>UDEV/MDEV</code>是运行在用户态的程序，可以动态管理设备文件，包括创建和删除设备文件，运行在用户态意味着系统要运行之后，在 <code>/etc/init.d/rcS</code> 脚本文件中会执行 <code>mdev -s</code> 自动创建设备节点。</li></ol><h3 id="3-3-设备驱动程序中如何注册一个字符设备？分别解释一下它的几个参数的含义">3.3 设备驱动程序中如何注册一个字符设备？分别解释一下它的几个参数的含义</h3><ul><li>注册一个字符设备驱动有两种方法：<ol><li><code>void cdev_init(struct cdev *cdev, struct file_operations *fops)</code> 该注册函数可以将<code>cdev</code>结构嵌入到自己的设备特定的结构中。<code>cdev</code>是一个指向结构体<code>cdev</code>的指针，而<code>fops</code>是指向一个类似于<code> file_operations</code>结构（可以是<code>file_operations</code>结构，但不限于该结构）的指针。</li><li><code>int register_chrdev(unsigned int major, const char *name, struct file operations *fops)</code>；该注册函数是早期的注册函数，<code>major</code>是设备的主设备号，<code>name</code>是驱动程序的名称，而<code>fops</code>是默认的<code>file_operations</code>结构（这是只限于<code>file_operations</code>结构）。对于<code>register_chrdev</code>的调用将为给定的主设备号注册0－255作为次设备号，并为每个设备建立一个对应的默认<code>cdev</code>结构。</li></ol></li></ul><h3 id="3-4-dev-下面的设备文件是怎么创建出来的？">3.4 /dev/下面的设备文件是怎么创建出来的？</h3><ul><li>普遍说法有三种方式，<strong>devfs机制</strong>，<strong>udev机制</strong>，再有一个就是<strong>手动创建</strong>设备节点。谈谈个人见解：<ol><li><code>devfs</code>机制从来没用过，应该是2.6以前的内核使用的；</li><li><code>udev</code>：其实就是现在常用的<code>device_create()</code>、<code>class_create()</code>这一套接口，所谓<code>udev</code>是上层用户空间程序，是基于驱动中创建使用了这两个接口而起作用的，但是<code>udev</code>在日常开发中几乎接触不到，我们只需在驱动中调用创建节点的这两个API就ok了，剩下的工作就交给<code>udev</code>去做了，有想深究它具体实现原理的那就自己去研究吧，我觉得会用就行了；</li><li><code>mknod</code>：新手最常用的一种创建设备节点方法，但并非入门后就再没有用途，在某些情境下，或许有人不想使用<code>udev</code>机制，于是把节点创建工作写在脚本里，这样也是无可厚非的。</li></ol></li></ul><h3 id="3-5-Linux设备中字符设备和块设备有什么主要区别？分别举例。">3.5 Linux设备中字符设备和块设备有什么主要区别？分别举例。</h3><ul><li>Linux中I/O设备分为两类：块设备和字符设备。两种设备本身没有严格限制，但是，基于不同的功能进行了分类。</li><li><strong>字符设备</strong>：提供<strong>连续</strong>的数据流，应用程序可以顺序读取，通常不支持随机存取。相反，此类设备支持<strong>按字节/字符</strong>来读写数据。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。</li><li><strong>块设备</strong>：应用程序可以<strong>随机访问</strong>设备数据，程序可自行确定读取数据的位置。硬盘是典型的块设备，应用程序可以寻址磁盘上的<strong>任何位置</strong>，并由此读取数据。此外，数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同，块设备并不支持基于字符的寻址。如：u盘，SD卡，磁盘等。</li></ul><h3 id="3-6-驱动中操作物理绝对地址为什么要先ioremap？">3.6 驱动中操作物理绝对地址为什么要先ioremap？</h3><ul><li><code>ioremp</code>是内核中用来将外设寄存器物理地址映射到主存上去的接口，即将io地址空间映射到虚拟地址空间上去，便于操作。为什么非要映射呢，因为<strong>保护模式下的cpu只认虚拟地址，不认物理地址</strong>，给它物理地址它并不帮你做事，所以你要操作外设上的寄存器必须先映射到虚拟内存空间，拿着虚拟地址去跟cpu对接，从而操作寄存器。</li></ul><h3 id="3-7-insmod，rmmod一个驱动模块，会执行模块中的哪个函数？在设计上要注意哪些问题？">3.7 insmod，rmmod一个驱动模块，会执行模块中的哪个函数？在设计上要注意哪些问题？</h3><ul><li>分别会执行<code>module_init()</code>和<code>module_exit()</code>指定的<code>init</code>函数和<code>exit</code>函数。要注意的就是，尽量使在<code>init</code>函数中出现的资源申请及使用，都要有对应的释放操作在<code>exit</code>中，即<code>init</code>申请，<code>eixt</code>释放。</li></ul><h3 id="3-8-NAND驱动的probe流程">3.8 NAND驱动的probe流程</h3><ul><li><code>probe</code> 函数就会与NAND芯片进行，主要做的事情主要包括这几个方面：读取NAND芯片的ID ，然后查表得到这片NAND芯片的如厂商，page size，erase size以及chip size等信息，接着根据<code>struct nand_chip</code> 中<code>options</code>的值的不同，或者在NAND 芯片中的特定位置查找<code>bad block table</code>，或者scan整个NAND 芯片，并在内存中建立<code>bad block table</code>。说起来复杂，但其实所有的这些动作，都可以在MTD提供的一个叫做<code>nand_scan</code>的函数中完成。</li></ul><h3 id="3-9-Linux驱动开发中，常用的调试方法有哪些？">3.9 Linux驱动开发中，常用的调试方法有哪些？</h3><ul><li><p>利用<code>printk</code>，查看OOP消息，利用<code>strace</code>，利用内核内置的<code>hacking</code>选项，利用<code>ioctl</code>方法，利用<code>/proc </code>文件系统，使用<code>kgdb</code>。</p></li><li><p><code>strace</code> 是一个可用于诊断、调试和教学的 Linux 用户空间跟踪器，监控用户空间进程和内核的交互，比如系统调用、信号传递、进程状态变更等。</p></li><li><p><code>ioctl</code> 是设备驱动程序中设备控制接口函数，一个字符设备驱动通常会实现设备打开、关闭、读、写等功能，在一些需要细分的情境下，如果需要扩展新的功能，通常以增设<code>ioctl()</code>命令的方式实现。</p><blockquote><p>建议大家，亲手动手调试下。面试中，很大可能会问你，在写驱动过程中遇到了什么问题的，如何解决的？如果你能讲出以上几种调试方法中的一两种，一定会让面试官刮目相看！</p></blockquote></li></ul><h2 id="4-Linux驱动开发常用函数">4.Linux驱动开发常用函数</h2><h3 id="4-1-ioremap">4.1 ioremap</h3><ol><li><p><strong>简介</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> * __ioremap(<span class="type">unsigned</span> <span class="type">long</span> phys_addr, <span class="type">unsigned</span> <span class="type">long</span> size, <span class="type">unsigned</span> <span class="type">long</span> flags)</span><br><span class="line"><span class="type">void</span> *<span class="title function_">ioremap</span><span class="params">(<span class="type">unsigned</span> <span class="type">long</span> phys_addr, <span class="type">unsigned</span> <span class="type">long</span> size)</span></span><br></pre></td></tr></table></figure><p>入口：<code>phys_addr</code>：要映射的起始的IO地址；<br><code>size</code>：要映射的空间的大小；<br><code>flags</code>：要映射的IO空间的和权限有关的标志；<br><code>phys_addr</code>：是要映射的物理地址<br><code>size</code>：是要映射的长度，单位是字节<br>头文件：<code>io.h</code></p></li><li><p><strong>主要功能</strong></p><ul><li>将一个IO地址空间映射到内核的虚拟地址空间上去，便于访问。</li><li><code>ioremap</code>是内核提供的用来映射外设寄存器到主存的函数，我们要映射的地址已经从<code>pci_dev</code>中读了出来（上一步），这样就水到渠成的成功映射了而不会和其他地址有冲突。映射完了有什么效果呢？我举个例子，比如某个网卡有100 个寄存器，他们都是连在一块的，位置是固定的，假如每个寄存器占4个字节那么一共400个字节的空间被映射到内存成功后，<code>ioaddr</code>就是这段地址的开头（注意<code>ioaddr</code>是虚拟地址，而<code>mmio_start</code>是物理地址，它是BIOS得到的，肯定是物理地址，而保护模式下CPU不认物理地址，只认虚拟地址），<code>ioaddr+0</code>就是第一个寄存器的地址，<code>ioaddr+4</code>就是第二个寄存器地址（每个寄存器占4个字节），以此类推，我们就能够在内存中访问到所有的寄存器进而操控他们了。</li></ul></li></ol><h3 id="4-2-open">4.2 open</h3><ol><li><p>函数定义</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">open</span><span class="params">( <span class="type">const</span> <span class="type">char</span> * pathname, <span class="type">int</span> flags)</span>;</span><br><span class="line"><span class="type">int</span> <span class="title function_">open</span><span class="params">( <span class="type">const</span> <span class="type">char</span> * pathname,<span class="type">int</span> flags, <span class="type">mode_t</span> mode)</span>;</span><br></pre></td></tr></table></figure></li><li><p>参数说明<br><code>pathname </code>：文件的名称，可以包含（绝对和相对）路径<br><code>flags</code>：文件打开模式<br><code>mode</code>: 用来规定对该文件的所有者，文件的用户组及系统中其他用户的访问权限，则文件权限为：<code>mode&amp;(~umask)</code></p></li></ol><h3 id="4-3-read">4.3 read</h3><ol><li><p><strong>函数定义</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ssize_t</span> <span class="title function_">read</span><span class="params">(<span class="type">int</span> fd, <span class="type">void</span> * buf, <span class="type">size_t</span> count)</span>;</span><br></pre></td></tr></table></figure></li><li><p><strong>函数说明</strong><br><code>read()</code>会把参数<code>fd</code>所指的文件传送<code>count</code>个字节到<code>buf</code>指针所指的内存中。</p></li><li><p><strong>返回值</strong><br>返回值为实际读取到的字节数，如果返回0，表示已到达文件尾或是无可读取的数据。若参数<code>count</code> 为0,则<code>read()</code>不会有作用并返回0。</p></li><li><p><strong>注意</strong><br><code>read</code>时<code>fd</code>中的数据如果小于要读取的数据，就会引起阻塞。<code>read</code>的用法比<code>write</code>较为简单，此处不叙述过多。</p></li></ol><h3 id="4-4-write">4.4 write</h3><ol><li><p>函数定义</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ssize_t</span> <span class="title function_">write</span> <span class="params">(<span class="type">int</span> fd, <span class="type">const</span> <span class="type">void</span> * buf, <span class="type">size_t</span> count)</span>;</span><br></pre></td></tr></table></figure></li><li><p>函数说明<br><code>write()</code>会把参数<code>buf</code>所指的内存写入<code>count</code>个字节到参数放到所指的文件内。</p></li><li><p>返回值<br>如果顺利<code>write()</code>会返回实际写入的字节数。当有错误发生时则返回-1，错误代码存入<code>errno</code>中。</p></li><li><p>说明</p><ul><li><p><code>write()</code>函数返回值一般无0，只有当如下情况发生时才会返回0：<code>write(fp, p1+len, (strlen(p1)-len)</code>中第三参数为0，此时<code>write()</code>什么也不做，只返回0。</p></li><li><p><code>write()</code>函数从<code>buf</code>写数据到<code>fd</code>中时，若buf中数据无法一次性读完，那么第二次读buf中数据时，其读位置指针（也就是第二个参数<code>buf</code>）不会自动移动，需要程序员编程控制。而不是简单的将buf首地址填入第二参数即可。如可按如下格式实现读位置移动：<code>write(fp, p1+len, (strlen(p1)-len)</code>。 这样<code>write</code>第二次循环时变会从<code>p1+len</code>处写数据到<code>fp</code>, 之后的也由此类推，直至<code>strlen(p1)-len</code>变0。</p></li><li><p>在<code>write</code>一次可以写的最大数据范围内（貌似是<code>BUFSIZ</code>,8192），第三参数<code>count</code>大小最好为<code>buf</code>中数据的大小，以免出现错误。(经过笔者再次试验，<code>write</code>一次能够写入的并不只有8192这么多，作者尝试一次写入81920000，结果也是可以，看来其一次最大写入数据并不是8192，但内核中确实有<code>BUFSIZ</code>这个参数，具体指什么还有待研究)</p></li></ul></li></ol><h3 id="4-5-copy-to-user">4.5 copy_to_user</h3><ol><li><p>函数定义</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> <span class="type">long</span> <span class="title function_">copy_to_user</span><span class="params">(<span class="type">void</span> *to, <span class="type">const</span> <span class="type">void</span> *from, <span class="type">unsigned</span> <span class="type">long</span> n)</span></span><br></pre></td></tr></table></figure></li><li><p>参数说明<br><code>to</code>：目标地址（用户空间）<br><code>from</code>：源地址（内核空间）<br><code>n</code>：将要拷贝数据的字节数</p></li><li><p>函数说明<br>从内核空间中读取数据到用户空间。</p></li><li><p>返回值<br>成功返回0，失败返回没有拷贝成功的数据字节数。</p></li></ol><h3 id="4-6-copy-from-user">4.6 copy_from_user</h3><ol><li><p>函数定义</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> <span class="type">long</span> <span class="title function_">copy_from_user</span><span class="params">(<span class="type">void</span> *to, <span class="type">const</span> <span class="type">void</span> *from, <span class="type">unsigned</span> <span class="type">long</span> n)</span>;</span><br></pre></td></tr></table></figure></li><li><p>参数说明<br><code>to</code>：目标地址（内核空间）<br><code>from</code>：源地址（用户空间）<br><code>n</code>：将要拷贝数据的字节数</p></li><li><p>函数说明<br>从用户空间中读取数据到内核空间。</p></li><li><p>返回值：<br>成功返回0，失败返回没有拷贝成功的数据字节数。</p></li></ol>]]></content>
    
    
    <summary type="html">🍃本文将总结Linux驱动模型相关知识</summary>
    
    
    
    <category term="嵌入式知识点总结" scheme="https://www.fomal.cc/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="嵌入式" scheme="https://www.fomal.cc/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="Linux驱动" scheme="https://www.fomal.cc/tags/Linux%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>Linux驱动基础知识</title>
    <link href="https://www.fomal.cc/posts/c59270e7.html"/>
    <id>https://www.fomal.cc/posts/c59270e7.html</id>
    <published>2023-03-19T14:00:00.000Z</published>
    <updated>2023-03-19T14:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><p>以下内容部分摘录自公众号：<code>嵌入式与Linux那些事</code>，仅用于个人交流与学习，如涉及侵权请联系站长删除！</p></div><h2 id="1-指令">1.指令</h2><h3 id="1-1-常用的Linux指令">1.1 常用的Linux指令</h3><ol><li><p><strong>怎么查看当前进程？怎么执行退出？怎么查看当前路径？</strong><br>查看当前进程： <code>ps</code><br>执行退出： <code>exit</code><br>查看当前路径： <code>pwd</code></p></li><li><p><strong>ls 命令执行什么功能？ 可以带哪些参数？</strong><br><strong>功能</strong><br>列出指定目录中的目录，以及文件<br><strong>参数</strong><br><code>-a</code> 显示所有文件及目录 (. 开头的隐藏文件也会列出)<br><code>-l</code> 除文件名称外，亦将文件型态、权限、拥有者、文件大小等资讯详细列出<br><code>-r</code> 将文件以相反次序显示(原定依英文字母次序)<br><code>-t</code> 将文件依建立时间之先后次序列出<br><code>-A</code> 同 -a ，但不列出 “.” (目前目录) 及 “…” (父目录)<br><code>-F</code> 在列出的文件名称后加一符号；例如可执行档则加 “*”, 目录则加 “/”<br><code>-R</code> 若目录下有文件，则以下之文件亦皆依序列出</p></li><li><p><strong>创建目录用什么命令？</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir runoob        #在工作目录下，建立一个名为 runoob 的子目录 </span><br><span class="line">mkdir -p runoob2/test   #在工作目录下的 runoob2 目录中，建立一个名为 test 的子目录。</span><br><span class="line">若 runoob2 目录原本不存在，则建立一个。（注：本例若不加 -p 参数，且原本 runoob2 目录不存在，则产生错误。）</span><br></pre></td></tr></table></figure></li><li><p><strong>创建文件用什么命令？</strong></p><p><strong>vi或vim</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi file1.txt #直接创建并打开一个文件file1.txt</span><br></pre></td></tr></table></figure><p><strong>touch</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">touch file2.txt #创建新的空文件file2.txt</span><br></pre></td></tr></table></figure><p><strong>echo</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">echo &quot;this is a new file&quot; &gt; file3.txt   #创建文件file3.txt并将this is a new file写入（说明：使用&gt;指令覆盖文件原内容并重新输入内容，若文件不存在则创建文件。）</span><br><span class="line">echo &quot;add contents&quot; &gt;&gt;file3.txt    #在已存在的文件补充写入新内容add contents（说明：使用&gt;&gt;指令向文件追加内容，原内容将保存。）</span><br></pre></td></tr></table></figure><p><strong>less 、more 、cat</strong></p><p>三者都是将文件内容输出到标准输出，其中less和more可以分页显示，cat是显示全部。<br>三者可以根据已经存在的文件创建新的文件。假设已经存在文件1.txt。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cat 1.txt &gt; 2.txt</span><br><span class="line">less 1.txt &gt; 3.txt</span><br><span class="line">more 1.txt &gt; 4.txt</span><br></pre></td></tr></table></figure><p>此时创建的文件内容都和1.txt中文件内容相同。</p><p><strong>cd</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd &gt; file3.txt  #创建新的空文件file3.txt</span><br><span class="line">cd &gt;&gt; file4.txt  #创建新的空文件file4.txt</span><br></pre></td></tr></table></figure><p>cd最主要的作用是切换目录，在cd后面跟&gt;或&gt;&gt;再加上文件名就可以创建一个内容为空的文件。它和echo的区别之处在于<strong>echo可写文件内容，而cd并不能</strong>。</p></li><li><p>复制文件用什么命令？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp –r test/ newtest #将当前目录 test/ 下的所有文件复制到新目录 newtest 下(前-&gt;后)</span><br></pre></td></tr></table></figure></li><li><p>查看文件内容有哪些命令可以使用？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">vi 文件名  #编辑方式查看，可修改</span><br><span class="line">cat 文件名 #显示全部文件内容</span><br><span class="line">more 文件名 #分页显示文件内容</span><br><span class="line">less 文件名 #与 more 相似，更好的是可以往前翻页</span><br><span class="line">tail 文件名 #仅查看尾部，还可以指定行数</span><br><span class="line">head 文件名 #仅查看头部,还可以指定行数</span><br></pre></td></tr></table></figure></li><li><p>怎么向屏幕输出带空格的字符串，比如&quot;hello world&quot;?</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo hello world</span><br></pre></td></tr></table></figure></li><li><p>移动文件用哪个命令？改名用哪个命令？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mv source_file(文件) dest_file(文件) #将源文件名 source_file 改为目标文件名 dest_file</span><br><span class="line">mv source_file(文件) dest_directory(目录) #将文件 source_file 移动到目标目录 dest_directory 中</span><br></pre></td></tr></table></figure></li><li><p>删除文件用哪个命令？如果需要连目录及目录下文件一块删除呢？删除空文件夹用什么命令？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rm -rf file/directory    #删除当前目录下的所有文件及目录，并且是直接删除，无需逐一确认</span><br><span class="line">rm -rf  directory/       #删除目录 directory，不管该目录下是否有子目录或文件</span><br></pre></td></tr></table></figure></li><li><p>查找文件内容用哪个命令？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">grep test *file  #在当前目录中，查找后缀有 file 字样的文件中包含 test 字符串的文件，并打印出该字符串的行</span><br><span class="line">grep -r update /etc/acpi #查找指定目录/etc/acpi 及其子目录（如果存在子目录的话）下所有文件中包含字符串&quot;update&quot;的文件(递归)</span><br><span class="line">grep -v test *test*      #查找文件名中包含 test 的文件中不包含test 的行(排除)</span><br></pre></td></tr></table></figure></li><li><p>查找文件用哪个命令？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">find . -name &quot;*.c&quot;  #将当前目录及其子目录下所有文件后缀为 .c 的文件列出来</span><br><span class="line">find . -ctime -20   #将当前目录及其子目录下所有最近 20 天内更新过的文件列出</span><br></pre></td></tr></table></figure></li><li><p>cat命令</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">cat -n textfile1  #把 textfile1 的文档内容加上行号后输入到屏幕</span><br><span class="line">cat -n textfile1 &gt; textfile2  #把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里</span><br><span class="line">cat -b textfile1 textfile2 &gt;&gt; textfile3  #把 textfile1 和 textfile2 的文档内容加上行号（空白行不加）之后将内容附加到 textfile3 文档里</span><br><span class="line">cat /dev/null &gt; /etc/test.txt #清空 /etc/test.txt 文档内容</span><br></pre></td></tr></table></figure></li></ol><h3 id="1-2-常用的GCC指令">1.2 常用的GCC指令</h3><ol><li><p>预处理 (-E .i)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -E test.c -o test.i #把预处理的结果导出到test.i文件</span><br></pre></td></tr></table></figure></li><li><p>编译为汇编代码(-S .s)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -S test.i -o test.s #编译器将test.i翻译成汇编语言，并将结果存储在test.s文件中。</span><br></pre></td></tr></table></figure></li><li><p>汇编(-c .o)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -c test.s -o test.o #将汇编代码编译为目标文件（.o）但不链接</span><br></pre></td></tr></table></figure></li><li><p>链接(无后缀)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc test.o -o test #将生成的目标文件test.o生成最终的可执行文件test</span><br></pre></td></tr></table></figure></li><li><p>一步到位编译(.c 无后缀)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc test.c -o test #将源文件test.c编译链接为可执行文件test</span><br></pre></td></tr></table></figure></li><li><p>多文件编译</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc test1.c test2.c -o test</span><br></pre></td></tr></table></figure></li><li><p>警告处理</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">gcc -w test.c -o test  # 忽略编译时的警告</span><br><span class="line">gcc -Wall test.c -o test #编译后显示所有警告</span><br><span class="line">gcc -Werror test.c -o test #在产生警告的地方停止编译</span><br></pre></td></tr></table></figure></li></ol><h3 id="1-3-常用的GDB调试指令">1.3 常用的GDB调试指令</h3><ul><li><p>GDB（GNU symbolic debugger）是 GNU Project 调试器</p></li><li><p>GNU操作系统是一种由自由软件构成的类 Unix 操作系统</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">gcc -g test.c -o test  #编译时生成debug有关的程序信息</span><br><span class="line">gdb test        #启动调试</span><br><span class="line">help #查看命令帮助，具体命令查询在gdb中输入help + 命令,简写h</span><br><span class="line">run #重新开始运行文件（run-text：加载文本文件，run-bin：加载二进制文件）,简写r</span><br><span class="line">start #单步执行，运行程序，停在第一执行语句</span><br><span class="line">list #查看原代码（list-n,从第n行开始查看代码。list+ 函数名：查看具体函数）,简写l</span><br><span class="line">set #设置变量的值</span><br><span class="line">next #单步调试（逐过程，函数直接执行）,简写n</span><br><span class="line">step #单步调试（逐语句：跳入自定义函数内部执行）,简写s</span><br><span class="line">backtrace #查看函数的调用的栈帧和层级关系,简写bt</span><br><span class="line">frame #切换函数的栈帧,简写f</span><br><span class="line">info #查看函数内部局部变量的数值,简写i</span><br><span class="line">finish #结束当前函数，返回到函数调用点</span><br><span class="line">continue #继续运行,简写c</span><br><span class="line">print #打印值及地址,简写p</span><br><span class="line">quit #退出gdb,简写q</span><br><span class="line">break+num #在第num行设置断点,简写b</span><br><span class="line">info breakpoints #查看当前设置的所有断点</span><br><span class="line">delete breakpoints num #删除第num个断点,简写d</span><br><span class="line">display #追踪查看具体变量值</span><br><span class="line">undisplay #取消追踪观察变量</span><br><span class="line">watch #被设置观察点的变量发生修改时，打印显示</span><br><span class="line">i watch #显示观察点</span><br><span class="line">enable breakpoints #启用断点</span><br><span class="line">disable breakpoints #禁用断点</span><br><span class="line">x #查看内存x/20xw 显示20个单元，16进制，4字节每单元</span><br><span class="line">run argv[1] argv[2] #调试时命令行传参</span><br><span class="line">set follow-fork-mode child #Makefile项目管理：选择跟踪父子进程(fork())</span><br></pre></td></tr></table></figure></li></ul><h3 id="1-4-常用的驱动开发指令">1.4 常用的驱动开发指令</h3><ol><li><p>加载/卸载驱动</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">insmod/modprobe #加载驱动</span><br><span class="line">rmmod   #卸载驱动Linux驱动如何查看驱动模块中打印信息？</span><br></pre></td></tr></table></figure></li><li><p>Linux驱动如何查看驱动模块中打印信息？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dmesg</span><br></pre></td></tr></table></figure></li><li><p>如何查看内核中已有的字符设备的信息？</p><p><code>lsmod</code> 和<code>modprobe</code>：<code>lsmod</code>可以查看模块的依赖关系，<code>modprobe</code>在加载模块时会加载其他依赖的模块。</p></li><li><p>如何查看正在使用的有哪些中断号？</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /proc/interrupt</span><br></pre></td></tr></table></figure></li></ol><h2 id="2-Uboot">2.Uboot</h2><h3 id="2-1-什么是bootloader？">2.1 什么是bootloader？</h3><ul><li>Linux系统要启动就必须需要一个 bootloader程序，也就说芯片上电以后先运行一段bootloader程序。这段 bootloader程序会先<strong>初始化时钟，看门狗，中断，SDRAM，等外设，然后将 Linux内核从 flash（NAND, NOR FLASH,SD,MMC等）拷贝到SDRAM中，最后启动Linux内核</strong>。当然了， bootloader的实际工作要复杂的多，但是它最主要的工作就是启动 Linux内核。</li><li>bootloader和 Linux内核的关系就跟PC上的BIOS和 Windows的关系一样，<strong>bootloader就相当于BIOS。总得来说，Bootloader就是一小段程序，它在系统上电时开始执行，初始化硬件设各、准备好软件环境，最后调用操作系统内核</strong>。</li></ul><h3 id="2-2-uboot启动过程中做了那些事？">2.2 uboot启动过程中做了那些事？</h3><ol><li><p><strong>第一阶段</strong><br>初始化时钟，关闭看门狗，关中断，启动ICACHE，关闭DCACHE和TLB，关闭MMU，初始化SDRAM，初始化NAND FLASH，重定位。</p><blockquote><p>Linux的看门狗（Watchdog）是一种硬件或软件机制，用于监视系统的运行状态，以防止系统出现故障或死机的情况。它能够检测到系统的异常情况并自动采取一些预设的措施，例如重启系统或发送警报信息。</p></blockquote></li><li><p><strong>第二阶段</strong><br>初始化一个串口，检测系统内存映射，将<strong>内核映象和根文件系统映象从Flash上读到SDRAM空间</strong>中，为内核设置启动参数，调用内核。</p></li></ol><h3 id="2-3-uboot和内核如何完成参数传递？">2.3 uboot和内核如何完成参数传递？</h3><ul><li>uboot启动后已经完成了基本的硬件初始化（如：内存、串口等），接下来，它的主要任务就是加载Linux内核到开发板的内存，然后跳转到Linux内核所在的地址运行。<br><strong>PS:只要问到uboot，面试官必问uboot和内核的参数传递，所以一定要知道！</strong><br>具体是如何跳转呢？做法很简单，直接修改PC寄存器的值为Linux内核所在的地址，这样CPU就会从Linux内核所在的地址去取指令，从而执行内核代码。</li><li>在前面我们已经知道，在跳转到内核以前，uboot需要做好以下三件事情：<ol><li><strong>CPU寄存器的设置</strong><br>R0=0<br>R1=机器类型ID；对于ARM结构的CPU，其机器类型ID可以参见 linux/arch/arm tools/ mach-types<br>R2=启动参数标记列表在RAM中起始基地址</li><li><strong>CPU工作模式</strong><br>必须禁止中断（IRQs和FIQs）<br>CPU必须为SVC模式</li><li><strong>Cache和MMU的设置</strong><br>MMU必须关闭<br>指令 Cache可以打开也可以关闭<br>数据 Cache必须关闭<br>其中上面第一步CPU寄存器的设置中，就是通过R0，R1，R2三个参数给内核传递参数的。</li></ol></li></ul><h3 id="2-4-为什么要给内核传递参数呢？">2.4 为什么要给内核传递参数呢？</h3><ul><li>在此之前，uboot已经完成了硬件的初始化，可以说已经”适应了“这块开发板。然而，内核并不是对于所有的开发板都能完美适配的（如果适配了，可想而知这个内核有多庞大，又或者有新技术发明了，可以完美的适配各种开发板），此时，对于开发板的环境一无所知。所以，要想启动Linux内核，uboot必须要给内核传递一些必要的信息来告诉内核<strong>当前所处的环境</strong>。</li></ul><h3 id="2-5-如何给内核传递参数？">2.5 如何给内核传递参数？</h3><ul><li>uboot把<strong>机器ID通过R1传递给内核</strong>，Linux内核运行的时候，首先就从R1中读取机器ID来判断是否支持当前机器。这个机器ID实际上就是开发板<strong>CPU的ID</strong>，每个厂家生产出一款CPU的时候都会给它指定一个唯一的ID，大家可以到uboot源码的<code>arch\arm\include\asm\mach-type.h</code>文件中去查看。</li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_ddc0a2e996fc49f9.png" alt=""></p><ul><li><p><strong>R2存放的是块内存的基地址</strong>，这块内存中存放的是uboot给Linux内核的其他参数。这些参数有内存的<strong>起始地址、内存大小、Linux内核启动后挂载文件系统的方式</strong>等信息。很明显，参数有多个，不同的参数有不同的内容，为了让Linux内核能精确的解析出这些参数，双方在传递参数的时候要求参数在存放的时猴需要按照<strong>双方规定的格式存放</strong>。</p></li><li><p>除了约定好参数存放的地址外，还要<strong>规定参数的结构</strong>。Linux2.4.x以后的内核都期望以<strong>标记列表</strong>（tagged_list）的形式来传递启动参数。标记，就是一种数据结构；标记列表，就是挨着存放的多个标记。标记列表以标记<code>ATAG_CORE</code>开始，以标记<code>ATAG_NONE</code>结束。</p></li><li><p>标记的数据结构为tag，它<strong>由一个tag_header结构和一个联合（union）组成</strong>。tag_header结构表示标记的类型及长度，比如是表示内存还是表示命令行参数等。对于不同类型的标记使用不同的联合（union），比如表示内存时使用tag_ mem32，表示命令行时使用 tag_cmdline。具体代码见<code>arch\arm\include\asm\setup.h</code>。</p></li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_8bc5f63ffa1c78c9.png" alt=""></p><ul><li>从上面可以看出，struct_tag结构体由structtag_header+联合体union构成，结构体struct tag_header用来描述每个tag的头部信息，如tag的类型，tag大小。联合体union用来描述每个传递给Linux内核的参数信息。</li></ul><h3 id="2-5-为什么uboot要关掉caches？">2.5 为什么uboot要关掉caches？</h3><ul><li>caches是cpu内部的一个2级缓存，它的作用是将常用的数据和指令放在cpu内部。caches是通过CP15管理的，刚上电的时候，cpu还不能管理caches。上电的时候指令cache可关闭，也可不关闭，但<strong>数据cache一定要关闭</strong>，否则可能导致刚开始的代码里面，去取数据的时候，从cache里面取，而这时候<strong>RAM中数据还没有caches过来，导致数据预取异常</strong>。</li></ul><h2 id="3-文件系统">3.文件系统</h2><h3 id="3-1-什么是根文件系统？">3.1 什么是根文件系统？</h3><ul><li><p>根文件系统首先是一种文件系统，该文件系统不仅具有普通文件系统的存储数据文件的功能，但是相对于普通的文件系统，它的特殊之处在于，它是<strong>内核启动时所挂载（mount）的第一个文件系统</strong>，内核代码的映像文件保存在根文件系统中，系统引导启动程序会在根文件系统挂载之后从中把一些<strong>初始化脚本（如rcS、inittab）和服务</strong>加载到内存中去运行，里面包含了Linux系统能够运行<strong>所必需的应用程序、库</strong>等，比如可以给用户提供操作 Linux的控制界面的shell程序、动态连接的程序运行时需要的glibc库等。</p></li><li><p>文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上，是没有办法真正的启动Linux操作系统的，会出现无法加载文件系统的错误。</p></li></ul><h3 id="3-2-根文件系统为什么这么重要？">3.2 根文件系统为什么这么重要？</h3><ul><li><p>根文件系统之所以在前面加一个“根”，说明它是加载其它文件系统的“根”，那么<strong>如果没有这个根，其它的文件系统也就没有办法进行加载的</strong>。根文件系统包含系统启动时<strong>所必须的目录和关键性的文件</strong>，以及使其他文件系统得以挂载（mount）所必要的文件。例如：</p><ul><li><p>init进程的应用程序必须运行在根文件系统上。</p></li><li><p>根文件系统提供了根目录“/”。</p></li><li><p>linux挂载分区时所依赖的信息存放于根文件系统<code>/etc/fstab</code>这个文件中。</p></li><li><p>shell命令程序必须运行在根文件系统上，譬如<code>ls</code>、<code>cd</code>等命令。</p></li></ul></li><li><p>总结：一套linux体系，只有内核本身是不能工作的，必须要rootfs（上的etc目录下的配置文件、<code>/bin/sbin</code>等目录下的shell命令，还有/lib目录下的库文件等）相配合才能工作。</p></li></ul><h3 id="3-3-可执行映像文件通常由几部分构成，它们有什么特点？">3.3 可执行映像文件通常由几部分构成，它们有什么特点？</h3><p>可执行映像文件通常由以下几部分构成：</p><ul><li>一个或多个代码段，代码段的属性为只读。</li><li>零个或多个包含初始化数据的数据段，数据段的属性为可读写。</li><li>零个或多个不包含初始化数据的数据段，数据段的属性为可读写。</li></ul><h2 id="4-中断">4.中断</h2><h3 id="4-1-硬中断-软中断是什么？有什么区别？">4.1 硬中断 / 软中断是什么？有什么区别？</h3><ul><li><p><strong>硬中断</strong></p><ol><li>硬中断是由<strong>硬件</strong>产生的，比如，像磁盘，网卡，键盘，时钟等。<strong>每个设备或设备集都有它自己的IRQ</strong>（中断请求）。基于IRQ，CPU可以将相应的请求分发到对应的硬件驱动上（注：硬件驱动通常是内核中的一个子程序，而不是一个独立的进程）。</li><li>处理中断的驱动是需要运行在CPU上的，因此，当中断产生的时候，CPU会中断当前正在运行的任务，来处理中断。在有多核心的系统上，<strong>一个中断通常只能中断一颗CPU</strong>（也有一种特殊的情况，就是在大型主机上是有硬件通道的，它可以在没有主CPU的支持下，可以同时处理多个中断。）。</li><li><strong>硬中断可以直接中断CPU</strong>。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程，中断代码本身也可以被其他的硬中断中断。</li><li>对于时钟中断，内核调度代码会将当前正在运行的进程挂起，从而让其他的进程来运行。它的存在是为了让<strong>调度代码（或称为调度器）可以调度多任务</strong>。</li></ol></li><li><p><strong>软中断</strong></p><ol><li>软中断的处理非常像硬中断。然而，它们仅仅是由<strong>当前正在运行的进程</strong>所产生的。</li><li><strong>通常，软中断是一些对I/O的请求</strong>。这些请求会调用内核中可以调度I/O发生的程序。<strong>对于某些设备，I/O请求需要被立即处理，而磁盘I/O请求通常可以排队并且可以稍后处理</strong>。根据I/O模型的不同，进程或许会被挂起直到I/O完成，此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生。并且调度过程通常和磁盘I/O的方式是相同。</li><li><strong>软中断仅与内核相联系</strong>。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间，并且当需要的时候内核也会调度这个进程去运行。</li><li>软中断并不会直接中断CPU。也<strong>只有当前正在运行的代码（或进程）才会产生软中断</strong>。这种中断是一种<strong>需要内核为正在运行的进程去做一些事情</strong>（通常为I/O）的请求。有一个特殊的软中断是Yield调用，它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。</li></ol><blockquote><p>说人话就是只会影响内核去间接调度CPU，而不会直接中断CPU去处理中断服务程序</p></blockquote></li><li><p>区别</p><ol><li>软中断是执行<strong>中断指令</strong>产生的，而硬中断是由<strong>外设</strong>引发的。</li><li>硬中断的中断号是由<strong>中断控制器</strong>提供的，软中断的中断号由指令直接指出，无需使用中断控制器。</li><li>硬中断是<strong>可屏蔽</strong>的，软中断不可屏蔽。</li><li>硬中断处理程序要确保它能<strong>快速</strong>地完成任务，这样程序执行时才不会等待较长时间，称为<strong>上半部</strong>。</li><li>软中断处理<strong>硬中断未完成的工作</strong>，是一种推后执行的机制，属于<strong>下半部</strong>。</li></ol></li></ul><h3 id="4-2-中断为什么要区分上半部和下半部？">4.2 中断为什么要区分上半部和下半部？</h3><ul><li>Linux中断分为硬件中断和内部中断（异常），调用过程：<strong>外部中断产生-&gt;发送中断信号到中断控制器-&gt;通知处理器产生中断的中断号</strong>，让其进一步处理。</li><li>对于中断上半部和下半部的产生，为了中断处理过程中被新的中断打断，将中断处理一分为二，<strong>上半部登记新的中断，快速处理简单的任务，剩余复杂耗时的处理留给下半部处理，下半部处理过程中可以被中断，上半部处理时不可被中</strong>断。</li></ul><h3 id="4-3-中断下半部一般如何实现？">4.3 中断下半部一般如何实现？</h3><ul><li><strong>软中断、tasklet、工作队列</strong></li><li><a href="https://blog.csdn.net/qq_16933601/article/details/107239908?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161962026516780264032212%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&amp;request_id=161962026516780264032212&amp;biz_id=0&amp;utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-107239908.pc_v2_rank_blog_default&amp;utm_term=%E4%B8%AD%E6%96%AD%E9%A1%B6%E5%8D%8A%E9%83%A8%E5%92%8C%E5%BA%95%E5%8D%8A%E9%83%A8%E7%9A%84%E7%90%86%E8%A7%A3">详细版解释</a></li></ul><h3 id="4-4-linux中断的响应执行流程？中断的申请及何时执行-何时执行中断处理函数-？">4.4 linux中断的响应执行流程？中断的申请及何时执行(何时执行中断处理函数)？</h3><ul><li>中断的响应流程：<strong>cpu接受中断-&gt;保存中断上下文跳转到中断处理历程-&gt;执行中断上半部-&gt;执行中断下半部-&gt;恢复中断上下文</strong>。</li><li>中断的申请request_irq的正确位置：应该是在第一次打开、硬件被告知中断之前。</li></ul>]]></content>
    
    
    <summary type="html">🍁本文将总结Linux驱动相关基础知识</summary>
    
    
    
    <category term="嵌入式知识点总结" scheme="https://www.fomal.cc/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="嵌入式" scheme="https://www.fomal.cc/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="Linux驱动" scheme="https://www.fomal.cc/tags/Linux%E9%A9%B1%E5%8A%A8/"/>
    
  </entry>
  
  <entry>
    <title>ARM体系架构知识点总结</title>
    <link href="https://www.fomal.cc/posts/c570025b.html"/>
    <id>https://www.fomal.cc/posts/c570025b.html</id>
    <published>2023-03-05T16:10:00.000Z</published>
    <updated>2023-03-19T13:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><p>以下内容部分摘录自公众号：<code>嵌入式与Linux那些事</code>，仅用于个人交流与学习，如涉及侵权请联系站长删除！</p></div><h2 id="1-硬件基础">1.硬件基础</h2><h3 id="1-1-CPU、MPU、MCU、SOC、SOPC联系与差别？">1.1 CPU、MPU、MCU、SOC、SOPC联系与差别？</h3><ol><li><p><strong>CPU（Central Processing Unit）</strong></p><p>CPU是一台计算机的<strong>运算核心和控制核心</strong>。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶段：提取（Fetch）、解码（Decode）、执行（Execute）和写回（Writeback）。CPU从存储器或高速缓冲存储器中取出指令，放入指令寄存器，并对指令译码，并执行指令。所谓的计算机的可编程性主要是指对CPU的编程。</p></li><li><p><strong>MPU(Micro Processor Unit)</strong></p><p>MPU叫<strong>微处理器</strong>（不是微控制器），通常代表一个<strong>功能强大的CPU</strong>（暂且理解为<strong>增强版的CPU</strong>吧）,但不是为任何已有的特定计算目的而设计的芯片。这种芯片往往是个人计算机和高端工作站的核心CPU。最常见的微处理器是Motorola的68K系列和Intel的X86系列。</p></li><li><p><strong>MCU(Micro Control Unit)</strong></p><p>MCU叫微控制器，是指随着大规模集成电路的出现及其发展，将<strong>计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上</strong>，形成芯片级的芯片，比如51，avr这些芯片，内部<strong>除了CPU外还有RAM,ROM,可以直接加简单的外围器件</strong>（电阻，电容）就可以运行代码了，而MPU如x86，arm这些就不能直接放代码了，它只不过是增强版的CPU，所以得添加RAM,ROM。MCUMPU最主要的区别就睡能否直接运行代码。MCU有内部的RAMROM，而MPU是增强版的CPU，需要添加外部RAMROM才可以运行代码。</p></li><li><p><strong>SOC（Systemon Chip）</strong></p><p>SOC指的是片上系统，MCU只是<strong>芯片级</strong>的芯片，而<strong>SOC是系统级的芯片</strong>，它既MCU（51，avr）那样有内置RAM,ROM同时又像MPU（arm）那样强大的，不单单是放简单的代码，可以放系统级的代码，也就是说可以<strong>运行操作系统</strong>（将就认为是MCU集成化与MPU强处理力各优点二合一）。</p></li><li><p><strong>SOPC（System On a Programmable Chip）</strong></p><p>SOPC可编程片上系统（FPGA就是其中一种），上面4点的硬件配置是固化的，就是说51单片机就是51单片机，不能变为avr，而avr就是avr不是51单片机，他们的硬件是一次性掩膜成型的，能改的就是软件配置，说白点就是改代码，本来是跑流水灯的，改下代码，变成数码管，而SOPC则是<strong>硬件配置，软件配置都可以修改</strong>，软件配置跟上面一样，没什么好说的，至于硬件，是可以自己构建的也就是说这个芯片是自己构造出来的，<strong>这颗芯片我们叫“白片”</strong>，什么芯片都不是，把<strong>硬件配置信息下载进去了，他就是相应的芯片了</strong>，可以让他变成51，也可以是avr，甚至arm，同时SOPC是在SOC基础上来的，所以他也是系统级的芯片，所以记得当把他变成arm时还得加外围ROM，RAM之类的，不然就是MPU了。</p></li></ol><h3 id="1-2-交叉编译器是什么？为什么需要交叉编译器？">1.2 交叉编译器是什么？为什么需要交叉编译器？</h3><ol><li><strong>在一种计算机环境中运行的编译程序，能编译出在另外一种环境下运行的代码</strong>，我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说，就是在一个平台上生成另一个平台上的可执行代码。</li><li>这里需要注意的是所谓平台，实际上包含两个概念：<strong>体系结构（Architecture）、操作系统（Operating System）</strong>。同一个体系结构可以运行不同的操作系统；同样，同一个操作系统也可以在不同的体系结构上运行。举例来说，我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称；而x86 WinNT平台实际上是Intel x86体系结构和WindowsNT for x86操作系统的简称。</li><li>有时是因为目的平台上不允许或不能够安装我们所需要的编译器，而我们又<strong>需要这个编译器的某些特征</strong>；有时是因为目的平台上的<strong>资源贫乏</strong>，无法运行我们所需要编译器；有时又是因为目的<strong>平台还没有建立</strong>，连操作系统都没有，根本谈不上运行什么编译器。</li></ol><h3 id="1-3-描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别？">1.3 描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别？</h3><p>基于RAM</p><ol><li>需要把硬盘和其他介质的代码先加载到ram中，加载过程中一般有<strong>重定位</strong>的操作。</li><li><strong>速度比基于ROM的快，可用RAM比基于ROM的少</strong>，因为所有的代码，数据都必须存放在RAM中。</li></ol><p>基于ROM</p><ol><li><strong>速度较基于RAM的慢</strong>，因为会有一个把变量，部分代码等从存储器（硬盘，flash）搬移到RAM的过程。</li><li><strong>可用RAM资源比基于RAM的多</strong></li></ol><h2 id="2-ARM处理器">2.ARM处理器</h2><h3 id="2-1-什么是哈佛结构和冯诺依曼结构？">2.1 什么是哈佛结构和冯诺依曼结构？</h3><p>定义：冯诺依曼结构釆用指令和数据<strong>统一编址</strong>，使用<strong>同条总线</strong>传输，CPU读取指令和数据的操作<strong>无法重叠</strong>。哈佛结构釆用指令和数据<strong>独立编址</strong>，使用<strong>两条独立的总线传输</strong>，CPU读取指令和数据的操作<strong>可以重叠</strong>。</p><p>利弊：冯诺依曼结构主要用于<strong>通用计算机领域</strong>，需要对存储器中的代码和数据频繁的进行修改，统一编址有利于<strong>节约资源</strong>。哈佛结构主要用于<strong>嵌入式计算机</strong>，程序固化在硬件中，有较高的<strong>可靠性、运算速度和较大的吞吐量</strong>。</p><h3 id="2-2-什么是ARM流水线技术？">2.2 什么是ARM流水线技术？</h3><ol><li><p>流水线技术通过<strong>多个功能部件并行</strong>工作来<strong>缩短程序执行时间</strong>，提高处理器核的<strong>效率和吞吐率</strong>，从而成为微处理器设计中最为重要的技术之一。ARM7处理器核使用了典型<strong>三级流水线的冯·诺伊曼结构</strong>，ARM9系列则采用了基于<strong>五级流水线的哈佛结构</strong>。通过增加流水线级数简化了流水线各级的逻辑，进一步提高了处理器的性能。</p></li><li><p>PC代表<strong>程序计数器</strong>，流水线使用三个阶段，因此指令分为三个阶段执行：1.<strong>取指</strong>（从存储器装载一条指令）；2.<strong>译码</strong>（识别将要被执行的指令）；3.<strong>执行</strong>（处理指令并将结果写回寄存器）。而<strong>R15（PC）总是指向“正在取指”的指令</strong>，而不是指向“正在执行”的指令或正在“译码”的指令。一般来说，人们习惯性约定将“正在执行的指令作为参考点”，称之为当前第一条指令，因此<strong>PC总是指向第三条指令</strong>。当ARM状态时，每条指令为4字节长，所以PC始终指向该指令地址加8字节的地址，即：<strong>PC值=当前程序执行位置+8</strong>；</p></li><li><p>ARM指令是三级流水线，取指，译指，执行，同时执行的，现在PC指向的是正在取指的地址（下一条指令），那么<strong>cpu正在译指的指令地址是PC-4</strong>（假设在ARM状态下，一个指令占4个字节），<strong>cpu正在执行的指令地址是PC-8</strong>，也就是说PC所指向的地址和现在所执行的指令地址相差8。当突然发生中断的时候，保存的是PC的地址（PC-8+4=<strong>PC-4</strong>下一条指令的地址）。这样你就知道了，<strong>如果返回的时候返回PC，那么中间就有一个指令没有执行</strong>，所以用<code>SUB pc lr-irq </code></p><p><img src="https://tuchuang.voooe.cn/images/2023/03/05/ARM7025050fed1ab1a6.png" alt=""></p></li></ol><h3 id="2-3-ARM有几种工作模式？">2.3 ARM有几种工作模式？</h3><ol><li><p><strong>用户模式(USR)</strong></p><p>用户模式是用户程序的工作模式，它运行在操作系统的用户态，它<strong>没有权限去操作其它硬件资源</strong>，只能执行处理自己的数据，也<strong>不能切换到其它模式下</strong>，要想访问硬件资源或切换到其它模式只能通过<strong>软中断或产生异常</strong>。</p></li><li><p><strong>系统模式(SYS)</strong></p><p>系统模式是<strong>特权模式</strong>，不受用户模式的限制。用户模式和系统模式共用一套寄存器，操作系统在该模式下可以方便的访问用户模式的寄存器，而且操作系统的一些特权任务可以使用这个模式<strong>访问一些受控的资源</strong>。</p><blockquote><p>说明：用户模式与系统模式两者<strong>使用相同的寄存器</strong>，都没有SPSR（Saved Program Statement Register，已保存程序状态寄存器），但系统模式比用户模式有更高的权限，可以访问所有系统资源。</p></blockquote></li><li><p><strong>一般中断模式(IRQ)</strong></p><p>一般中断模式也叫普通中断模式，用于处理一般的中断请求，通常在硬件<strong>产生中断信号之后自动进入</strong>该模式，该模式为特权模式，可以<strong>自由访问系统硬件资源</strong>。</p></li><li><p><strong>快速中断模式(FIQ)</strong></p><p>快速中断模式是相对一般中断模式而言的，它是用来处理<strong>对时间要求比较紧急的中断请求</strong>，主要用于高速数据传输及通道处理中。（快中断有许多（R8~R14）自己的专用寄存器，发生中断时，使用自己的寄存器就避免了保存和恢复某些寄存器。如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器，异常中断处理程序必须保存和恢复这些寄存器）</p></li><li><p><strong>管理模式（SVC）</strong></p><p>管理模式是<strong>CPU上电后默认模式</strong>，因此，在该模式下主要用来做<strong>系统的初始化</strong>，软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时，通过软件中断进入该模式。</p><blockquote><p>说明：系统复位或开机、软中断时进入到SVC模式下。</p></blockquote></li><li><p><strong>终止模式(ABT)</strong></p><p>中止模式用于支持虚拟内存或存储器保护，当用户程序<strong>访问非法地址，没有权限读取的内存地址</strong>时，会进入该模式，linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。</p></li><li><p><strong>未定义模式(UND)</strong></p><p>未定义模式用于支持硬件协处理器的软件仿真，CPU在指令的译码阶段不能识别该指令操作时，会进入未定义模式。</p></li></ol><p><strong>注意：</strong></p><ol><li><p><strong>除了用户模式外</strong>，其它6种模式称为特权模式。所谓特权模式，即具有如下权利：</p><p>a.MRS（把状态寄存器的内容放到通用寄存器）；</p><p>b.MSR（把通用寄存器的内容放到状态寄存器中）。</p><p>由于状态寄存器中的内容不能够改变，因此，要先把内容复制到通用寄存器中，然后修改通用寄存器中的内容，再把通用寄存器中的内容复制给状态寄存器中，即可完成“修改状态寄存器”的任务。</p></li><li><p>剩下的六种模式中<strong>除去系统模式</strong>外，统称为异常模式。</p></li></ol><h3 id="2-4-Arm有多少32位寄存器？">2.4 Arm有多少32位寄存器？</h3><p>ARM处理器共有37个寄存器。它包含<strong>31个通用寄存器和6个状态寄存器</strong>。</p><h3 id="2-5-ARM指令集分为几类？">2.5 ARM指令集分为几类？</h3><p>2类，分别为Thumb指令集，ARM指令集。<strong>ARM指令长度为32位，Thumb指令长度为16位</strong>。这种特点<br>使得ARM既能执行16位指令，又能执行32位指令，从而增强了ARM内核的功能。</p><h3 id="2-6-通用寄存器包括R0～R15，可以分为具体哪三类？">2.6 通用寄存器包括R0～R15，可以分为具体哪三类？</h3><p>通用寄存器包括R0-R15，可以分为3类：</p><ol><li><p><strong>未分组寄存器R0-R7</strong></p><p>在所有运行模式下，未分组寄存器都指向<strong>同一个物理寄存器</strong>，他们未被系统用作特殊的用途。因此在中断或<strong>异常处理</strong>进行异常模式转换时，由于不同的处理器运行模式均使用相同的物理寄存器，所以<strong>可能造成寄存器中数据的破坏</strong>。</p></li><li><p><strong>分组寄存器R8-R14</strong></p><p>对于分组寄存器，他们每次所访问的物理寄存器都<strong>与当前的处理器运行模式相关</strong>。R13常用作存放堆栈指针，用户也可以使用其他寄存器存放堆栈指针，但在Thumb指令集下，某些指令强制要求使用R13存放堆栈指针。R14称为链接寄存器（LR，Link Register），当执行子程序时，R14可得到R15（PC）的备份，执行完子程序后，又将R14的值复制回PC，即使用R14保存返回地址。</p></li><li><p><strong>程序计数器PC（R15）</strong></p><p>寄存器R15用作程序计数器（PC），在ARM状态下，位[1:0]为0，位[31:2]用于保存PC；在Thumb状态下,位[0]为0，位[31:1]用于保存PC。</p></li></ol><p>ARM系统中，在函数调用的时候，参数是通过哪种方式传递的？</p><p>当参数小于等于4的时候是通过<strong>r0-r3</strong>寄存器来进行传递的，当参数大于4的时候是通过<strong>压栈</strong>的方式进行传递。</p><h3 id="2-7-ARM处理器有几种工作状态？">2.7 ARM处理器有几种工作状态？</h3><p>从编程的角度来看，ARM微处理器的工作状态一般ARM和Thumb有两种，并可在两种状态之间切换。</p><ol><li>ARM状态：此时处理器执行32位的字对齐ARM指令，绝大部分工作在此状态。</li><li>Thumb状态：此时处理器执行16位的半字对齐的Thumb指令。</li></ol><h3 id="2-8-ARM协处理器指令包括哪3类，请描述它们的功能？">2.8 ARM协处理器指令包括哪3类，请描述它们的功能？</h3><ol><li>用于ARM处理器<strong>初始化</strong>ARM协处理器的数据处理操作。</li><li>用于ARM处理器的<strong>寄存器和ARM协处理器</strong>的寄存器间的<strong>数据传送</strong>操作。</li><li>用于在ARM协处理器的<strong>寄存器和内存单元</strong>之间传送数据。</li></ol><h3 id="2-9-什么是PLL（锁相环）？">2.9 什么是PLL（锁相环）？</h3><p>简单来说，输入时钟的存在是作为“参考源”。锁相环<strong>不是为了单纯产生同频同相信号，而是一般集成进某种“频率综合电路”，产生一个不同频，但锁相的信号</strong>。有点绕，打个比方：某参考晶振10Mhz，频率综合器A使用该参考源产生了900Mhz时钟，而频率综合器B产生了1Ghz时钟。虽然两路频率不同，但<strong>由于使用的通一个参考源，他们俩仍然是同源信号</strong>。相反，如果不同源，那么即便同频他们也不可能一致，因为世界上没有两个钟能做到完全一样，总有微弱的频差，导致相位飘移。在很多现实应用中有要求同源时钟的场合，所以，锁相环被广泛应用。锁相环的另外一项衍生应用是<strong>相干解调</strong>。</p><h2 id="3-中断与异常">3.中断与异常</h2><h3 id="3-1-中断与异常有何区别？">3.1 中断与异常有何区别？</h3><p><strong>中断</strong>是指<strong>外部硬件</strong>产生的一个电信号从CPU的中断引脚进入，打断CPU的运行。</p><p><strong>异常</strong>是指软件运行过程中发生了一些<strong>必须作出处理</strong>的事件，CPU自动产生一个陷入来打断CPU的运行。异常在处理的时候必须考虑与处理器的<strong>时钟同步</strong>，实际上异常也称为同步中断，在处理器执行到因编译错误而导致的错误指令时，或者在执行期间出现特殊错误，<strong>必须靠内核处理</strong>的时候，处理器就会产生一个异常。</p><h3 id="3-2-中断与DMA有何区别？">3.2 中断与DMA有何区别？</h3><p><strong>DMA</strong></p><p>是一种<strong>无须CPU参与</strong>，就可以让<strong>外设与系统内存</strong>之间进行双向数据传输的硬件机制，使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来，从而<strong>大大提高系统的吞吐率</strong>。</p><p><strong>中断</strong></p><p>是指CPU在执行程序的过程中，出现了某些突发事件时，CPU<strong>必须暂停执行当前的程序</strong>，转去处理突发事件，处理完毕后CPU又返回源程序被中断的位置并继续执行。</p><p>区别：<strong>DMA不需CPU参与，而中断需要CPU参与</strong>。</p><h3 id="3-3-中断能不能睡眠，为什么？下半部能不能睡眠？">3.3 中断能不能睡眠，为什么？下半部能不能睡眠？</h3><ol><li><p>中断处理的时候，不应该发生进程切换。因为在中断上下文中，唯一能打断当前中断handler的<strong>只有更高优先级的中断，它不会被进程打断</strong>。如果在中断上下文中休眠，则没有办法唤醒它，因为所有的wake_up_xxx都是针对某个进程而言的，而在中断上下文中，没有进程的概念，没有一个task_struct（这点对于softirq和tasklet一样）。因此真的休眠了，比如调用了会导致阻塞的例程，<strong>内核几乎肯定会死</strong>。</p></li><li><p>schedule()在切换进程时，保存当前的进程上下文（CPU寄存器的值、进程的状态以及堆栈中的内容），以便以后恢复此进程运行。中断发生后，内核会先保存当前被中断的进程上下文（在调用中断处理程序后恢复）。但<strong>在中断处理程序里，CPU寄存器的值肯定已经变化了</strong>（最重要的程序计数器PC、堆栈SP等）。如果此时因为睡眠或阻塞操作调用了schedule()，则保存的进程上下文就不是当前的进程上下文了。所以，<strong>不可以在中断处理程序中调用schedule()</strong>。</p></li><li><p>2.4内核中schedule()函数本身在<strong>进来的时候判断是否处于中断上下文</strong>。因此，强行调用schedule()的结果就是内核BUG，但看2.6.18的内核schedule()的实现却没有这句，改掉了。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span>(unlikely(in_interrupt()))</span><br><span class="line">BUG();</span><br></pre></td></tr></table></figure></li><li><p>中断handler会使用被中断的进程内核堆栈，但不会对它有任何影响，因为handler使用完后会<strong>完全清除它使用的那部分堆栈</strong>，恢复被中断前的原貌。</p></li><li><p>处于中断上下文时候，<strong>内核是不可抢占</strong>的。因此，如果休眠，则内核一定挂起。</p></li></ol><h3 id="3-4-中断的响应执行流程是什么？">3.4 中断的响应执行流程是什么？</h3><p>中断的响应流程：<strong>cpu接受中断-&gt;保存中断上下文跳转到中断处理历程-&gt;执行中断上半部-&gt;执行中断下半部-&gt;恢复中断上下文</strong>。</p><h3 id="3-5-当一个异常出现以后，ARM微处理器会执行哪几步操作？">3.5 当一个异常出现以后，ARM微处理器会执行哪几步操作？</h3><ol><li>将下一条指令的地址存入相应<strong>连接寄存器LR</strong>，以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从<strong>ARM状态</strong>进入，则LR寄存器中保存的是<strong>下一条指令的地址</strong>（当前PC＋4或PC＋8，与异常的类型有关）；若异常是从<strong>Thumb状态</strong>进入，则在LR寄存器中保存<strong>当前PC的偏移量</strong>，这样，异常处理程序就不需要确定异常是从何种状态进入的。例如：在软件中断异常SWI，指令MOVPC，R14_svc总是返回到下一条指令，不管SWI是在ARM状态执行，还是在Thumb状态执行。</li><li>将CPSR(程序状态寄存器 current program status register)<strong>复制</strong>到相应的SPSR中。</li><li>根据异常类型，强制<strong>设置CPSR的运行模式位</strong>。</li><li>强制PC从相关的异常向量地址取下一条指令执行，从而<strong>跳转到相应的异常处理程序</strong>处。</li></ol><h3 id="3-6-写一个中断服务需要注意哪些？如果中断产生之后要做比较多的事情你是怎么做的？">3.6 写一个中断服务需要注意哪些？如果中断产生之后要做比较多的事情你是怎么做的？</h3><ol><li>写一个中断服务程序要注意<strong>快进快出</strong>，在中断服务程序里面尽量<strong>快速采集信息</strong>，包括硬件信息，然后退出中断，要做其它事情可以使用<strong>工作队列</strong>或者<strong>tasklet</strong>方式。也就是中断上半部和下半部。</li><li>中断服务程序中<strong>不能有阻塞操作</strong>。应为中断期间是完全占用CPU的（即不存在内核调度），中断被阻塞住，其他进程将无法操作。</li><li>中断服务程序<strong>注意返回值</strong>，要用操作系统定义的宏做为返回值，而不是自己定义的。</li><li>如果要做的事情较多，应将这些任务放在<strong>后半段</strong>(tasklet，等待队列等)处理。</li></ol><h3 id="3-7-为什么FIQ比IRQ要快？">3.7 为什么FIQ比IRQ要快？</h3><ol><li>ARM的FIQ模式提供了<strong>更多的banked寄存器</strong>，r8到r14还有SPSR，而IRQ模式就没有那么多，R8,R9,R10,R11,R12对应的banked的寄存器就没有，这就意味着在ARM的IRQ模式下，中断处理程序<strong>自己要保存R8到R12这几个寄存器</strong>，然后退出中断处理时程序要<strong>恢复这几个寄存器</strong>，而FIQ模式由于这几个寄存器都有banked寄存器，模式切换时CPU<strong>自动保存</strong>这些值到banked寄存器，退出FIQ模式时<strong>自动恢复</strong>，所以这个过程FIQ比IRQ快.不要小看这几个寄存器，ARM在编译的时候，如果你FIQ中断处理程序足够用这几个独立的寄存器来运作，它就不<strong>会进行通用寄存器的压栈</strong>，这样也省了一些时间。</li><li>FIQ比IRQ有<strong>更高优先级</strong>，如果FIQ和IRQ同时产生，那么FIQ先处理。</li><li>在symbian系统里，当CPU处于FIQ模式处理FIQ中断的过程中，预取指令异常，未定义指令异常，软件中断全被禁止，所有的中断被屏蔽。所以FIQ就会很快执行，<strong>不会被其他异常或者中断打断</strong>，所以它又比IRQ快了。而IRQ不一样，当ARM处理IRQ模式处理IRQ中断时，如果来了一个FIQ中断请求，那正在执行的IRQ中断处理程序会被抢断，ARM切换到FIQ模式去执行这个FIQ，所以FIQ比IRQ快多了。</li><li>另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。写过完整汇编系统的都比较明白这点的差别，18只能放一条指令，为了不与1C处的FIQ冲突，这个地方只能跳转，而FIQ不一样，1C以后<strong>没有任何中断向量表</strong>了，这样可以直接在1C处放FIQ的中断处理程序，由于跳转的范围限制，至少<strong>少了一条跳转指令</strong>。</li></ol><h3 id="3-8-中断和轮询哪个效率高？怎样决定是采用中断方式还是采用轮询方式去实现驱动？">3.8 中断和轮询哪个效率高？怎样决定是采用中断方式还是采用轮询方式去实现驱动？</h3><ol><li>中断是CPU处于<strong>被动</strong>状态下来接受设备的信号，而轮询是CPU<strong>主动</strong>去查询该设备是否有请求。</li><li>凡事都是两面性，所以，看效率不能简单的说那个效率高。如果是请求设备是一个<strong>频繁请求cpu</strong>的设备，或者有<strong>大量数据</strong>请求的网络设备，那么<strong>轮询的效率是比中断高</strong>。如果是一般设备，并且该设备请求cpu的频率比较低，则用<strong>中断效率要高一些</strong>。主要是看<strong>请求频率</strong>。</li></ol><h2 id="4-通信协议">4.通信协议</h2><h3 id="4-1-什么是异步传输和同步传输？">4.1 什么是异步传输和同步传输？</h3><p><strong>异步传输</strong>：是一种典型的基于字节的输入输出，数据按每次<strong>一个字节</strong>进行传输，其传输<strong>速度低</strong>。</p><p><strong>同步传输</strong>：需要外界的<strong>时钟信号</strong>进行通信，是把数据字节组合起来一起发送，这种组合称之为帧，其传输速度比异步传输<strong>快</strong>。</p><h3 id="4-2-RS232和RS485通讯接口有什么区别？">4.2 RS232和RS485通讯接口有什么区别？</h3><ol><li><strong>传输方式不同</strong>。RS232采取不平衡传输方式，即所谓<strong>单端通讯</strong>。而RS485则采用平衡传输，即<strong>差分传输</strong>方式。</li><li><strong>传输距离不同</strong>。RS232适合本地设备之间的通信，传输距离一般<strong>不超过20m</strong>。而RS485的传输距离为<strong>几十米到上千米</strong>。</li><li><strong>设备数量</strong>。RS232只允许<strong>一对一</strong>通信，而RS485接口在总线上是允许连接<strong>多达128个收发器</strong>。</li><li><strong>连接方式</strong>。RS232，规定用<strong>电平</strong>表示数据，因此线路就是单线路的，用<strong>两根线才能达到全双工</strong>的目的；而RS485，使用<strong>差分电平</strong>表示数据，因此，必须用<strong>两根线</strong>才能达到传输数据的基本要求，要实现<strong>全双工</strong>，必需用<strong>4根线</strong>。</li></ol><p><strong>总结</strong>：从某种意义上，可以说，线路上存在的仅仅是电流，<strong>RS232/RS485规定了这些电流在什么样的线路上流动和流动的样式</strong>。</p><h3 id="4-3-SPI协议">4.3 SPI协议</h3><p>SPI的应用</p><p>SPI(Serial Peripheral Interface)协议是由摩托罗拉公司提出的通讯协议，即<strong>串行外围设备接口</strong>，是一种<strong>高速全双工</strong>的通信总线。SPI总线系统是一种同步串行外设接口，它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI总线可直接与各个厂家生产的多种标准外围器件相连，包括FLASH、RAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。</p><h3 id="4-4-接口">4.4 接口</h3><ol><li><p><strong>MOSI(MasterOutput，SlaveInput)</strong></p><p>主设备输出/从设备输入引脚。主机的数据从这条信号线输出，从机由这条信号线读入主机发送的数据，即这条线上数据的方向为主机到从机。</p></li><li><p><strong>MISO(MasterInput,，SlaveOutput)</strong></p><p>主设备输入/从设备输出引脚。主机从这条信号线读入数据，从机的数据由这条信号线输出到主机，即在这条线上数据的方向为从机到主机。</p></li><li><p><strong>SCLK(SerialClock)</strong></p><p>时钟信号线，用于通讯数据同步。它由通讯主机产生，决定了通讯的速率，不同的设备支持的最高时钟频率不一样，如STM32的SPI时钟频率最大为fpclk/2，两个设备之间通讯时，通讯速率受限于低速设备。</p></li><li><p><strong>SS(SlaveSelect)</strong></p><p>从设备选择信号线，常称为片选信号线，也称为NSS、CS，以下用NSS表示。当有多个SPI从设备与SPI主机相连时，设备的其它信号线SCK、MOSI及MISO同时并联到相同的SPI总线上，即无论有多少个从设备，都共同只使用这3条总线；而每个从设备都有独立的这一条NSS信号线，本信号线独占主机的一个引脚，即有多少个从设备，就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯；而SPI协议中没有设备地址，它使用NSS信号线来寻址，当主机要选择从设备时，把该从设备的NSS信号线设置为低电平，该从设备即被选中，即片选有效，接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号，以NSS线被拉高作为结束信号。</p></li></ol><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_.png" alt=""></p><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_21f31a802aea8fa8.png" alt=""></p><ol><li><p><strong>通讯的起始和停止信号</strong></p><p>在图中的标号1处，NSS信号线<strong>由高变低，是SPI通讯的起始信号</strong>。NSS是每个从机各自独占的信号线，当从机检在自己的NSS线检测到起始信号后，就知道自己被主机选中了，开始准备与主机通讯。在图中的标号处，<strong>NSS信号由低变高，是SPI通讯的停止信号</strong>，表示本次通讯结束，从机的选中状态被取消。</p></li><li><p><strong>数据有效性</strong></p><p>SPI使用MOSI及MISO信号线来传输数据，使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据，且数据输入输出是同时进行的。数据传输时，MSB先行（高位先行）或LSB（低位先行）先行并没有作硬性规定，但要保证两个SPI通讯设备之间使用同样的协定，一般都会采用上图中的MSB先行（高位先行）模式。观察图中的2345标号处，<strong>MOSI及MISO的数据在SCK的上升沿期间变化输出，在SCK的下降沿时被采样</strong>。即在<strong>SCK的下降沿时刻，MOSI及MISO的数据有效</strong>，高电平时表示数据“1”，为低电平时表示数据“0”。在其它时刻，数据无效，MOSI及MISO为下一次表示数据做准备。SPI每次数据传输可以8位或16位为单位，每次传输的单位数不受限制。</p></li><li><p><strong>CPOL（时钟极性）/CPHA（时钟相位）及通讯模式</strong></p><p>上面讲述的图中的时序只是SPI中的其中一种通讯模式，SPI一共有四种通讯模式，它们的主要区别是：总线空闲时SCK的时钟状态以及数据采样时刻。为方便说明，在此引入“时钟极性CPOL”和“时钟相位CPHA”的概念。</p><blockquote><p>时钟极性CPOL是指SPI通讯设备处于空闲状态时，SCK信号线的电平信号(即SPI通讯开始前、NSS线为高电平时SCK的状态)。CPOL=0时，SCK在空闲状态时为低电平，CPOL=1时，则相反。</p><p>时钟相位CPHA是指数据的采样的时刻，当CPHA=0时，MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时，数据线在SCK的“偶数边沿”采样。</p></blockquote></li></ol><h3 id="4-4-IIC协议">4.4 IIC协议</h3><p><strong>简介</strong></p><ol><li><p>IIC协议是由<strong>数据线SDA和时钟SCL</strong>构成的串行总线，可发送和接收数据,是一个多主机的<strong>半双工</strong>通信方式</p></li><li><p>每个挂接在总线上的器件都有个<strong>唯一的地址</strong>。位速在标准模式下可达 100kbit/s，在快速模式下可达400kbit/s，在高速模式下可待3.4Mbit/s。</p></li><li><p>I2C总线系统结构,如下所示:</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_0e8765696e41629a.png" alt=""></p></li></ol><p><strong>时序介绍</strong></p><ol><li>空闲状态<br>当总线上的SDA和SCL<strong>两条信号线同时处于高电平，便是空闲状态</strong>，如上面的硬件图所示，当我们不传输数据时，SDA和SCL被上拉电阻拉高，即进入空闲状态</li><li>起始信号<br>当<strong>时钟线SCL为高期间，数据线SDA由高到低(下降沿)<strong>的跳变；便是总线的</strong>启动</strong>信号，只能由<strong>主机</strong>发起，且在空闲状态下才能启动该信号，如下图所示：</li></ol><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_02de16c30bdfa26e.png" alt=""></p><p><strong>停止信号</strong></p><ul><li>当<strong>SCL为高期间，SDA由低到高(上升沿)<strong>的跳变；便是总线的</strong>停止</strong>信号,表示数据已传输完成，如下图所示：</li></ul><blockquote><p>总结：时钟线SCL与数据线SDA、半双工、空闲时两线高电平、起始与停止SCL均为高电平(SDa下降沿开始、上升沿结束)</p></blockquote><p><strong>传输数据格式</strong><br>当发了起始信号后,就开始传输数据,传输的数据格式如下图所示：</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_d78c7db3a8a0f5d7.png" alt=""></p><ol><li>当<strong>SCL为高电平时，便会获取SDA数据</strong>，其中SDA数据必须是<strong>稳定</strong>的(若SDA不稳定就会变成起始/停止信<br>号)。</li><li>当SCL为<strong>低电平</strong>时，便是SDA的电平<strong>变化</strong>状态。</li><li>若主从机在传输数据期间，需要完成其它功能(例如一个<strong>中断</strong>)，可以<strong>主动拉低SCL</strong>，使I2C进入<strong>等待</strong>(不读取)状态，直到处理结束再释放SCL，数据传输会继续。</li></ol><p><strong>应答信号ACK</strong></p><ul><li>I2C总线上的数据都是以<strong>8位数据(一个字节</strong>)进行的，当发送了8个数据后，发送方会在<strong>第9个时钟脉冲期间</strong>释放SDA数据，当接收方接收该字节成功，便会输出一个ACK应答信号，当SDA为高电平，表示为非应答信号NACK，当<strong>SDA为低电平，表示为有效应答信号ACK</strong>(记住是接收方发送ACK信号)</li><li>PS:当主机为接收方时，收到<strong>最后</strong>一个字节后，主机可以不发送ACK，直接发送<strong>停止信号</strong>来结束传输。</li><li>当从机为接收方时，没有发送ACK，则表示从机可能在忙其它事、或者不匹配地址信号和不支持多主机发送，主机可以发送停止信号，再次发送起始信号<strong>启动新的传输</strong>。</li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_632beb8c0c138d38.png" alt=""></p><p><strong>完整的数据传输</strong></p><ul><li>如下图所示，发送起始信号后，便发送一个<strong>8位的设备地址</strong>，其中<strong>第8位是对设备的读写标志</strong>，后面紧跟着的就是数据了，直到发送停止信号终止。</li><li>PS:当我们第一次是读操作，然后想换成写操作时，可以<strong>再次发送一个起始信号</strong>，然后发送读的设备地址，不需要停止信号便能实现<strong>不同的地址转换</strong>。</li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_0c443cec30276300.png" alt=""></p><p><strong>IIC传输数据的格式</strong></p><ul><li><p><strong>写操作</strong></p><p>刚开始主芯片要发出一个<strong>start信号</strong>，然后发出一个(用来确定是往哪一个芯片写数据，即器件地址)，<strong>方向</strong>(读/写，0表示写，1表示读)。回应(用来确定这个设备是否存在)，然后就可以传输数据，传输数据之后，要有一个<strong>回应</strong>信号（确定数据是否接受完成)，然后再传输下一个数据。<strong>每传输一个数据，接受方都会有一个回应信号</strong>，数据发送完之后，主芯片就会发送一个停止信号。<br>白色：主→从 | 灰色：从→主。</p></li></ul><p>​<img src="https://tuchuang.voooe.cn/images/2023/03/18/_7b444066e8987422.png" alt=""></p><ul><li><strong>读操作</strong><br>刚开始主芯片要发出一个<strong>start信号</strong>，然后发出一个<strong>设备地址</strong>(用来确定是从哪一个芯片读取数据)，方向(读/写，0表示写，1表示读)。回应(用来确定这个设备是否存在)，然后就可以传输数据，传输数据之后，要有一个回应信号（确定数据是否接受完成)，然后在传输下一个数据。<strong>每传输一个数据，接受方都会有一个回应信号</strong>，数据发送完之后，主芯片就会发送一个停止信号。<br>白色：主→从 | 灰色：从→主</li></ul><p><img src="https://tuchuang.voooe.cn/images/2023/03/18/_fad840b315ab024c.png" alt=""></p><blockquote><p>注意灰色与白色的不同，其实搞清楚读那个就是只要发送开始信号和回应即可</p></blockquote><h2 id="5-编程">5.编程</h2><p><strong>嵌人式编程中，什么是大端？什么是小端？</strong><br>大端模式：低位字节存在高地址上，高位字节存在低地址上。<br>小端模式：高位字节存在高地址上，低位字节存在低地址上。</p><p><img src="https://tuchuang.voooe.cn/images/2023/03/19/_.png" alt=""></p><p>STM32属于小端模式，简单的说，比如<code>u32 temp=0X12345678</code>；假设temp地址在0X2000 0010。那么内存里面,存放就变成了：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">地址         |            HEX     |</span><br><span class="line">0X2000 0010  |  78   56   43  12  |</span><br></pre></td></tr></table></figure><p>因为是16进制的，一个数为0.5字节，所以 12 代表一个字节 34 代表一个字节。<br>釆用小端模式的CPU对操作数的存放方式是从低字节到高字节，而大端模式对操作数的存放方式是从高字节到低字节。例如，16位宽的数<code>0x1234</code>在小端模式CPU内存中的存放方式（假设从地址<code>0x4000</code>开始存放）见表1，而在大端模式CPU内存中的存放方式见表2。</p><p>表1：0x1234在小端CPU内存中的存放方式</p><table><thead><tr><th style="text-align:center">内存地址</th><th style="text-align:center">存放内容</th></tr></thead><tbody><tr><td style="text-align:center">0x4000</td><td style="text-align:center">0x34</td></tr><tr><td style="text-align:center">0x4001</td><td style="text-align:center">0x12</td></tr></tbody></table><p>表2：0x1234在大端CPU内存中的存放方式</p><table><thead><tr><th style="text-align:center">内存地址</th><th style="text-align:center">存放内容</th></tr></thead><tbody><tr><td style="text-align:center">0x4000</td><td style="text-align:center">0x12</td></tr><tr><td style="text-align:center">0x4001</td><td style="text-align:center">0x34</td></tr></tbody></table><p>32位宽的数<code>0x12345678</code>在小端模式CPU内存中的存放方式（假设从地址0x4000开始存放）见表3，而在大端模式CPU内存中的存放方式见表4。</p><p>表3：0x12345678在小端CPU内存中的存放方式</p><table><thead><tr><th style="text-align:center">内存地址</th><th style="text-align:center">存放内容</th></tr></thead><tbody><tr><td style="text-align:center">0x4000</td><td style="text-align:center">0x78</td></tr><tr><td style="text-align:center">0x4001</td><td style="text-align:center">0x56</td></tr><tr><td style="text-align:center">0x4002</td><td style="text-align:center">0x34</td></tr><tr><td style="text-align:center">0x4003</td><td style="text-align:center">0x12</td></tr></tbody></table><p>表4：0x12345678在大端CPU内存中的存放方式</p><table><thead><tr><th style="text-align:center">内存地址</th><th style="text-align:center">存放内容</th></tr></thead><tbody><tr><td style="text-align:center">0x4000</td><td style="text-align:center">0x12</td></tr><tr><td style="text-align:center">0x4001</td><td style="text-align:center">0x34</td></tr><tr><td style="text-align:center">0x4002</td><td style="text-align:center">0x56</td></tr><tr><td style="text-align:center">0x4003</td><td style="text-align:center">0x78</td></tr></tbody></table><p>以下程序为例：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">mybitfields</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="type">unsigned</span> <span class="type">short</span> a:<span class="number">4</span>;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">short</span> b:<span class="number">5</span>;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">short</span> c:<span class="number">7</span>;</span><br><span class="line">&#125;test;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> i;</span><br><span class="line">    test.a = <span class="number">2</span>;</span><br><span class="line">    test.b = <span class="number">3</span>;</span><br><span class="line">    test.c = <span class="number">0</span>;</span><br><span class="line">    i =*((<span class="type">short</span>*)&amp;test</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>,i</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>程序的输出结果为 50。<br>上例中，<code>sizeof(test)=2</code>，上例的声明方式是把一个 short（也就是一块16位内存）分成3部分，各部分的大小分别是4位、5位、7位，赋值语句<code>i*(short*)&amp;test）</code>就是把上面的16位内存转换成 short类型进行解释。<br>变量a的二进制表示为0000000000000010，取其低四位是<code>0010</code>.变量b的二进制表示为0000000000000011，取其低五位是<code>00011</code>。变量c的二进制表示为0000000000000000，取其低七位是<code>0000000</code>。<br><strong>80x86机是小端（修改分区表时要注意）模式，单片机一般为大端模式</strong>。小端一般是低位字节在高位字节的前面，也就是低位在内存地址低的一端，可以这样记（小端→低位→在前→与正常逻辑顺序相反），所以合成后得到<code>0000000000110010</code>，即十进制的50。<br>下面给出另外一个例子</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">int</span> uiVal_1 = <span class="number">0x12345678</span>;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">int</span> uiVal_2 = <span class="number">0</span>;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">char</span> aucVal[<span class="number">4</span>] = &#123;<span class="number">0x12</span>,<span class="number">0x34</span>,<span class="number">0x56</span>,<span class="number">0x78</span>&#125;;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">short</span> usVal_1 = <span class="number">0</span>;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">short</span> usVal_2 = <span class="number">0</span>;</span><br><span class="line">    <span class="built_in">memcpy</span>(&amp;uiVal_2,aucVal,<span class="keyword">sizeof</span>(uiVal_2));</span><br><span class="line">    usVal_1 = (<span class="type">unsigned</span> <span class="type">short</span>)uiVal_1;<span class="comment">//在这里截断，都取得的是低位</span></span><br><span class="line">    usVal_2 = (<span class="type">unsigned</span> <span class="type">short</span>)uiVal_2;<span class="comment">//在这里截断</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;usVal_1:%x\n&quot;</span>,usVal_1);<span class="comment">//在这里又转化回来</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;usVal_2:%x\n&quot;</span>,usVal_2);<span class="comment">//在这里又转化回来</span></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>小端模式是低地址存放低字节，高地址存放高字节，结构如下所示：</p><p>78//低地址<br>56<br>34<br>12//高地址</p><p>在内存里面测试机是小端，地址由小到大。</p><p>val1:78563412<br>val2:12345678</p><p>结果如下：</p><p>7856<br>3412</p><p><strong>如何判断计算机处理器是大端，还是小端？</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">checkCPU</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="class"><span class="keyword">union</span> <span class="title">w</span></span></span><br><span class="line"><span class="class">        &#123;</span></span><br><span class="line">            <span class="type">int</span> a;</span><br><span class="line">            <span class="type">char</span> b;</span><br><span class="line">        &#125;c;</span><br><span class="line">        c.a =<span class="number">1</span>;</span><br><span class="line">        <span class="keyword">return</span>(c.b == <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span>(checkCPU())</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;小端\n&quot;</span>);</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;大端\n&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>编者的处理器为Intel处理器，因为Intel处理器一般都是小端模式，所以此时程序的输出结果为：小端<br>上述代码中，如果处理器是大端，则返回0；如果处理器是小端，则返回1。联合体 union的存放顺序是所有成员都从低地址开始存放，如果能够通过改代码知道CPU对内存是采用小端模式读写，还是采用大端模式读写，一定会令面试官刮目相看。<br>还可以通过指针地址来判断，由于在32位计算机系统中， short占两个字节，char占1个字节，所以可以采用如下做法实现该判断。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">checkCPU</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">short</span> usData = <span class="number">0x1122</span>;</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">char</span>*pucData = (<span class="type">unsigned</span> <span class="type">char</span>*)&amp;usData;</span><br><span class="line">    <span class="keyword">return</span> (*pucData == <span class="number">0x22</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span>(checkCPU())</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;小端\n&quot;</span>);</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;大端\n&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>char类型转换会截取低位地址的值，因此如果低位存放的是22，那么说明低位地址存放低位数据，因此说明就是小端存储，即程序输出的结果为：小端</p><p><strong>如何进行大小端的转换？</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">swapInt32</span><span class="params">(<span class="type">int</span> intValue)</span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> temp = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    temp = ((intValue &amp; <span class="number">0x000000FF</span>) &lt;&lt;<span class="number">24</span>)|</span><br><span class="line"></span><br><span class="line">           ((intValue &amp; <span class="number">0x0000FF00</span>) &lt;&lt;<span class="number">8</span>) |</span><br><span class="line"></span><br><span class="line">           ((intValue &amp; <span class="number">0x00FF0000</span>) &gt;&gt;<span class="number">8</span>) |</span><br><span class="line"></span><br><span class="line">           ((intValue &amp; <span class="number">0xFF000000</span>) &gt;&gt;<span class="number">24</span>);</span><br><span class="line">    <span class="keyword">return</span> temp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*short型：*/</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">short</span> <span class="title function_">swapShort16</span><span class="params">(<span class="type">unsigned</span> <span class="type">short</span> shortValue)</span>&#123;</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> ((shortValue &amp; <span class="number">0x00FF</span> ) &lt;&lt;<span class="number">8</span>) | ((shortValue &amp; <span class="number">0xFF00</span>)&gt;&gt;<span class="number">8</span>);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*float型:*/</span></span><br><span class="line"><span class="type">float</span> <span class="title function_">swapFloat32</span><span class="params">(<span class="type">float</span> floatValue)</span>&#123;</span><br><span class="line"></span><br><span class="line">         <span class="keyword">typedef</span> <span class="class"><span class="keyword">union</span> <span class="title">SWAP_UNION</span>&#123;</span></span><br><span class="line"></span><br><span class="line">         <span class="type">float</span> unionFloat;</span><br><span class="line"></span><br><span class="line">         <span class="type">int</span>   unionInt;</span><br><span class="line"></span><br><span class="line">         &#125;SWAP_UNION;</span><br><span class="line">         </span><br><span class="line">         SWAP_UNION swapUnion;</span><br><span class="line">         swapUnion.unionFloat = floatValue;</span><br><span class="line">         swapUnion.unionInt = swapInt32(  swapUnion.unionInt);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span>     swapUnion.unionFloat;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*double型换一种写法，用一下指针，不然移位移死了……*/</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">swapDouble64</span><span class="params">(<span class="type">unsigned</span> <span class="type">char</span> *pIn, <span class="type">unsigned</span> <span class="type">char</span> *pOut)</span>&#123;</span><br><span class="line"><span class="keyword">for</span>( <span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++)&#123;</span><br><span class="line">pOut[<span class="number">7</span>-i] = pIn[i];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> x = <span class="number">0x12345678</span>;</span><br><span class="line">    <span class="type">int</span> y = swapInt32(x);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%x\r\n&quot;</span>,y);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如何对绝对地址0x100000赋值？</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*(<span class="type">unsigned</span> <span class="type">int</span>*)<span class="number">0x100000</span> = <span class="number">1234</span>;</span><br></pre></td></tr></table></figure><p>那么要是想让程序跳转到绝对地址是0x100000去执行，应该怎么做？</p><p>首先要将0x100000强制转换成函数指针,即：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(<span class="type">void</span> (*)())<span class="number">0x100000</span></span><br></pre></td></tr></table></figure><p>然后再调用它：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*((<span class="type">void</span> (*)())<span class="number">0x100000</span>)();·</span><br></pre></td></tr></table></figure><p>用typedef可以看得更直观些：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="title function_">void</span><span class="params">(*)</span><span class="params">()</span> voidFuncPtr;</span><br><span class="line">*((voidFuncPtr)<span class="number">0x100000</span>)();</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">🌌本文将总结ARM体系架构相关基础知识</summary>
    
    
    
    <category term="嵌入式知识点总结" scheme="https://www.fomal.cc/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="ARM架构" scheme="https://www.fomal.cc/tags/ARM%E6%9E%B6%E6%9E%84/"/>
    
    <category term="嵌入式" scheme="https://www.fomal.cc/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
  </entry>
  
  <entry>
    <title>网站开源文档</title>
    <link href="https://www.fomal.cc/posts/76815704.html"/>
    <id>https://www.fomal.cc/posts/76815704.html</id>
    <published>2023-03-05T16:00:00.000Z</published>
    <updated>2023-03-20T23:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><center><font size="5px" color=red><b>！！！安装前必读！！！</b></font></center><ol><li><p>本网站目前已经开源啦！！！暂定名为<code>hexo-theme-Fomalhaut</code>，开源地址：<a href="https://github.com/fomalhaut1998/hexo-theme-Fomalhaut">hexo-theme-Fomalhaut</a>，如果你喜欢的话可以帮我点一个<strong>免费的 Star🌟</strong>哦！</p></li><li><p>本开源项目并不适合纯小白，需要一定的前端基础和魔改经验，因此安装之前务必对 <code>Hexo框架命令和 Butterfly主题</code>比较熟悉，以及掌握最基础的 HTML5、CSS3、JavaScript 知识，不熟悉的朋友建议提前熟悉<a href="https://hexo.bootcss.com/docs/configuration.html">Hexo 中文文档</a>和<a href="https://butterfly.js.org/">Butterfly 主题文档</a>，以及熟悉本站魔改教程，别上来就问文章怎么写！！！避免各种不必要的麻烦！！！望周知！！！</p></li><li><p>本源码是基于<code>Butterfly 4.3.1</code>的二次开发，暂时没做完全的主题分离，因此安装方法是整个博客的替换，建议另起一个文件夹进行安装，或备份好原来的资料再搬过来。当然你也可以不直接搬走，而是借鉴里面的部分代码写法。</p></li></ol></div><img src="https://cdn.staticaly.com/gh/fomalhaut1998/hexo-theme-Fomalhaut@main/repoPic/cover.jpg" style="zoom: 33%;" /><h3 id="📅3-5-更新">📅3.5 更新</h3><ul><li>微调部分样式，修复手机端无法加载 css 样式</li><li>问题在<code>fomal.js</code>的 1340 行附近，切换至手机端时候导致空指针异常，这部分代码注释掉即可！</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 搜索框修复 start */</span></span><br><span class="line"><span class="comment">// searchSize();</span></span><br><span class="line"><span class="comment">// window.addEventListener(&#x27;resize&#x27;, searchSize)</span></span><br><span class="line"><span class="comment">// // 搜索窗口自适应</span></span><br><span class="line"><span class="comment">// function searchSize() &#123;</span></span><br><span class="line"><span class="comment">//   // 只需要适应手机端</span></span><br><span class="line"><span class="comment">//   if (document.body.clientWidth &gt; 768) return</span></span><br><span class="line"><span class="comment">//   let div = document.querySelector(&#x27;#algolia-hits&#x27;)</span></span><br><span class="line"><span class="comment">//   // 监听插入，如果有插入则根据可视高度动态设置最大高度</span></span><br><span class="line"><span class="comment">//   div.addEventListener(&#x27;DOMNodeInserted&#x27;, () =&gt; &#123;</span></span><br><span class="line"><span class="comment">//     div.children[0].style.maxHeight = (document.documentElement.clientHeight - 210) + &#x27;px&#x27;</span></span><br><span class="line"><span class="comment">//   &#125;)</span></span><br><span class="line"><span class="comment">// &#125;</span></span><br><span class="line"><span class="comment">/* 搜索框修复 end */</span></span><br></pre></td></tr></table></figure><p>大家如果还遇到什么问题欢迎给作者留言，作者看到会第一时间修复哦，感谢您的支持！</p><h3 id="🍡-安装教程">🍡 安装教程</h3><p>注意：作者演示的是 <code>NodeJS v16.14.0</code> + <code>Hexo 6.3.0</code></p><ol><li><p>安装 NodeJs、Hexo、Git、注册并连接 Github，此部分可参考<a href="https://www.fomal.cc/posts/e593433d.html">Hexo 博客搭建基础教程(一)</a>。<br>PS：相当于链接教程的第 1-7 步，第 8 步就不要做了，不然会清空源码的！！！（不是新手请跳过这条）</p></li><li><p>把源码打包下载到自己的电脑，然后解压缩到一个你喜欢的文件夹中</p></li><li><p>在 git bash 命令中切换到下载的博客根目录，使用以下命令进行模块安装。这里绝不能使用<code>hexo init</code>初始化，若不慎用了，则站点的配置文件<code>_config.yml</code>内容会被重置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i</span><br></pre></td></tr></table></figure></li><li><p>执行以下命令清空并启动项目，启动成功后再浏览器地址栏输入<code>localhost:4000</code>进行验证</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo g; hexo s</span><br></pre></td></tr></table></figure></li><li><p>到这里一般是没啥问题的了，当本地能成功启动后，改一下站点配置文件的<code>_config.yml</code>的<code>deploy</code>配置项，然后用以下命令部署到 Github（这一步出问题的，请删除站点配置文件的<code>deploy</code>配置项与<code>baidu_url_submitter</code>的信息）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo d</span><br></pre></td></tr></table></figure></li></ol><h3 id="🌈-简要说明">🌈 简要说明</h3><ul><li><p>js 的主体在<code>source/js/fomal.js</code>里面，做了基本分块逻辑的标注，后期整合的，以<code>... start</code>和<code>... end</code> 包裹</p></li><li><p>css 主体在<code>themes\butterfly\source\css\_custom\custom.css</code>里，与 Butterfly 的自带样式联合编译为一个 index.css，有基本的注释</p></li><li><p>因为兼顾了白天夜间模式不同壁纸和用户自定义壁纸，背景的切换做在了<code>fomal.js</code>的第 3190 行附近，美化模块代码逻辑在<code>fomal.js</code>的第 2894-3596 行，四个背景分别为 PC 端白天、PC 端黑夜、手机端白天、手机端黑夜；美化模块起点为第 3356 行，可以自定义任何 DOM，例如按钮、滑块、开关按钮、图片框和外挂标签等（注意：外挂标签必须要被<code>&lt;div id=&quot;article-container&quot;&gt;</code>包裹才会被渲染）</p><img src="https://cdn.staticaly.com/gh/fomalhaut1998/hexo-theme-Fomalhaut@main/repoPic/meihua.png" style="zoom: 40%;" /><br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 美化模块 start */</span></span><br><span class="line">...</span><br><span class="line"><span class="comment">// 雪花开关(这里就是默认关雪花，如果你想默认开就将none改为block)</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;snow&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;snow&quot;</span>, <span class="string">&quot;none&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">...</span><br><span class="line"><span class="comment">// 背景图(约3190行) 下面链接换成你自己的图片链接</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;defineBg&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;</span></span><br><span class="line"><span class="string">  --default-bg: url(https://lskypro.acozycotage.net/Fomalhaut/img/dm14.webp);</span></span><br><span class="line"><span class="string">  --darkmode-bg:url(https://lskypro.acozycotage.net/Fomalhaut/img/yuanshen1.webp);</span></span><br><span class="line"><span class="string">  --mobileday-bg: url(https://lskypro.acozycotage.net/Fomalhaut/img/snow.webp);</span></span><br><span class="line"><span class="string">  --mobilenight-bg: url(https://lskypro.acozycotage.net/Fomalhaut/img/mb8.webp);</span></span><br><span class="line"><span class="string">&#125;`</span>;</span><br><span class="line">...</span><br><span class="line"><span class="comment">// 美化模块主体DOM(约3356行)</span></span><br><span class="line">  winbox.<span class="property">body</span>.<span class="property">innerHTML</span> = <span class="string">`</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    ...</span></span><br><span class="line"><span class="string">    &lt;h3&gt;1. 二次元&lt;/h3&gt;</span></span><br><span class="line"><span class="string">    &#123;% folding cyan, 查看二次元背景 %&#125;</span></span><br><span class="line"><span class="string">    &lt;div class=&quot;bgbox&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;a href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; style=&quot;background-image:url(https://lskypro.acozycotage.net/Fomalhaut/img/home_bg.webp)&quot; class=&quot;imgbox&quot; onclick=&quot;changeBg(&#x27;url(https://lskypro.acozycotage.net/Fomalhaut/img/home_bg.webp)&#x27;)&quot;&gt;&lt;/a&gt;</span></span><br><span class="line"><span class="string">    // 这里自己加图片</span></span><br><span class="line"><span class="string">    &lt;/div&gt;</span></span><br><span class="line"><span class="string">    &#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string">    ...</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  `</span></span><br><span class="line">...</span><br><span class="line"><span class="comment">/* 美化模块 end */</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>页脚部分请见<code>themes\butterfly\layout\includes\footer.pug</code>，包括页脚计时器、徽标、文字、布局等</p></li><li><p>封面图在主题配置文件<code>_config.butterfly.yml</code>的<code>default_cover</code>配置项，建议配置多项后随机刷出封面图</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">cover:</span></span><br><span class="line">  <span class="comment"># display the cover or not (是否顯示文章封面)</span></span><br><span class="line">  <span class="attr">index_enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">aside_enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">archives_enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># the position of cover in home page (封面顯示的位置)</span></span><br><span class="line">  <span class="comment"># left/right/both</span></span><br><span class="line">  <span class="attr">position:</span> <span class="string">both</span></span><br><span class="line">  <span class="comment"># When cover is not set, the default cover is displayed (當沒有設置cover時，默認的封面顯示)</span></span><br><span class="line">  <span class="attr">default_cover:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">https://source.fomal.cc/img/default_cover_14.webp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">https://source.fomal.cc/img/default_cover_15.webp</span></span><br><span class="line">    <span class="comment"># ......</span></span><br></pre></td></tr></table></figure></li><li><p>网站图标为根目录的<code>favicon.ico</code>，替换为你自己的图标即可</p></li><li><p>加载页面时中间的头像在<code>custom.css</code>约 1300 行附近，直接搜索替换成你自己的头像即可</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* heo 加载动画头像 */</span></span><br><span class="line"><span class="selector-class">.loading-img</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">https://lskypro.acozycotage.net/LightPicture/2022/12/60e5d4e39da7c077.webp</span>)</span><br><span class="line">    no-repeat center center;</span><br><span class="line">  <span class="attribute">background-size</span>: cover;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>页脚时间由<code>fomal.js</code>控制，搜索以下代码，将网站诞生时间改为你自己的即可(示例：<code>2022-08-09</code>)</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 页脚计时器 start */</span></span><br><span class="line"><span class="keyword">var</span> now = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createtime</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="comment">// 当前时间</span></span><br><span class="line">  now.<span class="title function_">setTime</span>(now.<span class="title function_">getTime</span>() + <span class="number">1000</span>);</span><br><span class="line">  <span class="keyword">var</span> start = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&quot;08/01/2022 00:00:00&quot;</span>); <span class="comment">// 旅行者1号开始计算的时间</span></span><br><span class="line">  <span class="keyword">var</span> dis = <span class="title class_">Math</span>.<span class="title function_">trunc</span>(<span class="number">23400000000</span> + ((now - start) / <span class="number">1000</span>) * <span class="number">17</span>); <span class="comment">// 距离=秒数*速度 记住转换毫秒</span></span><br><span class="line">  <span class="keyword">var</span> unit = (dis / <span class="number">149600000</span>).<span class="title function_">toFixed</span>(<span class="number">6</span>);  <span class="comment">// 天文单位</span></span><br><span class="line">  <span class="comment">// 网站诞生时间</span></span><br><span class="line">  <span class="keyword">var</span> grt = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&quot;08/09/2022 00:00:00&quot;</span>);</span><br><span class="line">...</span><br><span class="line">  <span class="keyword">let</span> currentTimeHtml = <span class="string">&quot;&quot;</span>;</span><br><span class="line">  (currentTimeHtml =</span><br><span class="line">    hnum &lt; <span class="number">18</span> &amp;&amp; hnum &gt;= <span class="number">9</span></span><br><span class="line">      ? <span class="string">`&lt;img class=&#x27;boardsign&#x27; src=&#x27;https://lskypro.acozycotage.net/Fomalhaut/badge/F小屋-科研摸鱼中.svg&#x27; title=&#x27;什么时候能够实现财富自由呀~&#x27;&gt;&lt;br&gt; &lt;div style=&quot;font-size:13px;font-weight:bold&quot;&gt;本站居然运行了 <span class="subst">$&#123;dnum&#125;</span> 天 <span class="subst">$&#123;hnum&#125;</span> 小时 <span class="subst">$&#123;mnum&#125;</span> 分 <span class="subst">$&#123;snum&#125;</span> 秒 &lt;i id=&quot;heartbeat&quot; class=&#x27;fas fa-heartbeat&#x27;&gt;&lt;/i&gt; &lt;br&gt; 旅行者 1 号当前距离地球 <span class="subst">$&#123;dis&#125;</span> 千米，约为 <span class="subst">$&#123;unit&#125;</span> 个天文单位 🚀&lt;/div&gt;`</span></span><br><span class="line">      : <span class="string">`&lt;img class=&#x27;boardsign&#x27; src=&#x27;https://lskypro.acozycotage.net/Fomalhaut/badge/F小屋-下班休息啦.svg&#x27; title=&#x27;下班了就该开开心心地玩耍~&#x27;&gt;&lt;br&gt; &lt;div style=&quot;font-size:13px;font-weight:bold&quot;&gt;本站居然运行了 <span class="subst">$&#123;dnum&#125;</span> 天 <span class="subst">$&#123;hnum&#125;</span> 小时 <span class="subst">$&#123;mnum&#125;</span> 分 <span class="subst">$&#123;snum&#125;</span> 秒 &lt;i id=&quot;heartbeat&quot; class=&#x27;fas fa-heartbeat&#x27;&gt;&lt;/i&gt; &lt;br&gt; 旅行者 1 号当前距离地球 <span class="subst">$&#123;dis&#125;</span> 千米，约为 <span class="subst">$&#123;unit&#125;</span> 个天文单位 🚀&lt;/div&gt;`</span>),</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;workboard&quot;</span>) &amp;&amp;</span><br><span class="line">    (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;workboard&quot;</span>).<span class="property">innerHTML</span> = currentTimeHtml);</span><br><span class="line">&#125;</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="comment">/*页脚计时器 end */</span></span><br></pre></td></tr></table></figure></li><li><p>控制台字符画，在<code>fomal.js</code>找到以下代码，并进行相应的替换，字符画可以到：<a href="https://patorjk.com/software/taag/#p=display&amp;f=Graffiti&amp;t=Type%20Something%20">Text to ASCII Art Generator (TAAG)</a>生成</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 控制台输出字符画 start */</span></span><br><span class="line"><span class="keyword">var</span> now1 = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createtime1</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> grt = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&quot;08/09/2022 00:00:00&quot;</span>); <span class="comment">//此处修改你的建站时间或者网站上线时间</span></span><br><span class="line">  now1.<span class="title function_">setTime</span>(now1.<span class="title function_">getTime</span>() + <span class="number">250</span>);</span><br><span class="line">  <span class="keyword">var</span> days = (now1 - grt) / <span class="number">1000</span> / <span class="number">60</span> / <span class="number">60</span> / <span class="number">24</span>;</span><br><span class="line">  <span class="keyword">var</span> dnum = <span class="title class_">Math</span>.<span class="title function_">floor</span>(days);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> ascll = [</span><br><span class="line">    <span class="string">`欢迎来到Fomalhaut🥝の小家!`</span>,</span><br><span class="line">    <span class="string">`Future is now 🍭🍭🍭`</span>,</span><br><span class="line">    <span class="string">`</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">███████  ██████  ███    ███  █████  ██      ██   ██  █████  ██    ██ ████████</span></span><br><span class="line"><span class="string">██      ██    ██ ████  ████ ██   ██ ██      ██   ██ ██   ██ ██    ██    ██</span></span><br><span class="line"><span class="string">█████   ██    ██ ██ ████ ██ ███████ ██      ███████ ███████ ██    ██    ██</span></span><br><span class="line"><span class="string">██      ██    ██ ██  ██  ██ ██   ██ ██      ██   ██ ██   ██ ██    ██    ██</span></span><br><span class="line"><span class="string">██       ██████  ██      ██ ██   ██ ███████ ██   ██ ██   ██  ██████     ██</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">`</span>,</span><br><span class="line">    <span class="string">&quot;小站已经苟活&quot;</span>,</span><br><span class="line">    dnum,</span><br><span class="line">    <span class="string">&quot;天啦!&quot;</span>,</span><br><span class="line">    <span class="string">&quot;©2022 By Fomalhaut&quot;</span>,</span><br><span class="line">  ];</span><br><span class="line"></span><br><span class="line">  <span class="built_in">setTimeout</span>(</span><br><span class="line">    <span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(</span><br><span class="line">      <span class="variable language_">console</span>,</span><br><span class="line">      <span class="string">`\n%c<span class="subst">$&#123;ascll[<span class="number">0</span>]&#125;</span> %c <span class="subst">$&#123;ascll[<span class="number">1</span>]&#125;</span> %c <span class="subst">$&#123;ascll[<span class="number">2</span>]&#125;</span> %c<span class="subst">$&#123;ascll[<span class="number">3</span>]&#125;</span>%c <span class="subst">$&#123;ascll[<span class="number">4</span>]&#125;</span>%c <span class="subst">$&#123;ascll[<span class="number">5</span>]&#125;</span>\n\n%c <span class="subst">$&#123;ascll[<span class="number">6</span>]&#125;</span>\n`</span>,</span><br><span class="line">      <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">      <span class="string">&quot;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">      <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">      <span class="string">&quot;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">      <span class="string">&quot;&quot;</span></span><br><span class="line">    )</span><br><span class="line">  );</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">createtime1</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createtime2</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> ascll2 = [<span class="string">`NCC2-036`</span>, <span class="string">`调用前置摄像头拍照成功，识别为「大聪明」`</span>, <span class="string">`Photo captured: `</span>, <span class="string">` 🤪 `</span>];</span><br><span class="line"></span><br><span class="line">  <span class="built_in">setTimeout</span>(</span><br><span class="line">    <span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(</span><br><span class="line">      <span class="variable language_">console</span>,</span><br><span class="line">      <span class="string">`%c <span class="subst">$&#123;ascll2[<span class="number">0</span>]&#125;</span> %c <span class="subst">$&#123;ascll2[<span class="number">1</span>]&#125;</span> %c \n<span class="subst">$&#123;ascll2[<span class="number">2</span>]&#125;</span> %c\n<span class="subst">$&#123;ascll2[<span class="number">3</span>]&#125;</span>`</span>,</span><br><span class="line">      <span class="string">&quot;color:white; background-color:#10bcc0&quot;</span>,</span><br><span class="line">      <span class="string">&quot;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;&quot;</span>,</span><br><span class="line">      <span class="string">&#x27;background:url(&quot;https://unpkg.zhimg.com/anzhiyu-assets@latest/image/common/tinggge.gif&quot;) no-repeat;font-size:450%&#x27;</span></span><br><span class="line">    )</span><br><span class="line">  );</span><br><span class="line"></span><br><span class="line">  <span class="built_in">setTimeout</span>(<span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(<span class="variable language_">console</span>, <span class="string">&quot;%c WELCOME %c 欢迎光临，大聪明&quot;</span>, <span class="string">&quot;color:white; background-color:#23c682&quot;</span>, <span class="string">&quot;&quot;</span>));</span><br><span class="line"></span><br><span class="line">  <span class="built_in">setTimeout</span>(</span><br><span class="line">    <span class="variable language_">console</span>.<span class="property">warn</span>.<span class="title function_">bind</span>(</span><br><span class="line">      <span class="variable language_">console</span>,</span><br><span class="line">      <span class="string">&quot;%c ⚡ Powered by Fomalhaut🥝 %c 你正在访问Fomalhaut🥝の小家&quot;</span>,</span><br><span class="line">      <span class="string">&quot;color:white; background-color:#f0ad4e&quot;</span>,</span><br><span class="line">      <span class="string">&quot;&quot;</span></span><br><span class="line">    )</span><br><span class="line">  );</span><br><span class="line"></span><br><span class="line">  <span class="built_in">setTimeout</span>(<span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(<span class="variable language_">console</span>, <span class="string">&quot;%c W23-12 %c 系统监测到你已打开控制台&quot;</span>, <span class="string">&quot;color:white; background-color:#4f90d9&quot;</span>, <span class="string">&quot;&quot;</span>));</span><br><span class="line">  <span class="built_in">setTimeout</span>(</span><br><span class="line">    <span class="variable language_">console</span>.<span class="property">warn</span>.<span class="title function_">bind</span>(<span class="variable language_">console</span>, <span class="string">&quot;%c S013-782 %c 你现在正处于监控中&quot;</span>, <span class="string">&quot;color:white; background-color:#d9534f&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br><span class="line">  );</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">createtime2</span>();</span><br><span class="line">...</span><br><span class="line"><span class="comment">/* 控制台输出字符画 end */</span></span><br></pre></td></tr></table></figure></li><li><p>加载头像见<code>themes\butterfly\source\css\_custom\custom.css</code>下的：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.loading-img</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">https://lskypro.acozycotage.net/LightPicture/2022/12/60e5d4e39da7c077.webp</span>)</span><br><span class="line">    no-repeat center center;</span><br><span class="line">  <span class="attribute">background-size</span>: cover;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>文章打赏彩蛋，见主题配置文件：<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Sponsor/reward</span></span><br><span class="line"><span class="attr">reward:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">coinAudio:</span> <span class="string">https://npm.elemecdn.com/akilar-candyassets@1.0.36/audio/aowu.m4a</span></span><br><span class="line">  <span class="attr">QR_code:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">img:</span> <span class="string">https://tuchuang.voooe.cn/images/2023/01/04/2.webp</span></span><br><span class="line">      <span class="attr">link:</span></span><br><span class="line">      <span class="attr">text:</span> <span class="string">微信</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">img:</span> <span class="string">https://tuchuang.voooe.cn/images/2023/01/04/20f8e49805975b8f8.webp</span></span><br><span class="line">      <span class="attr">link:</span></span><br><span class="line">      <span class="attr">text:</span> <span class="string">支付宝</span></span><br></pre></td></tr></table></figure></li><li><p>哔哔页面样式部分：见<code>source\personal\bb\index.md</code>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 唠叨</span><br><span class="line">date: 2022-09-08 23:08:13</span><br><span class="line"><span class="section">comments: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span></span><br><span class="line">/* 哔哔页面 <span class="emphasis">*/</span></span><br><span class="line"><span class="emphasis">#bibi button &#123;</span></span><br><span class="line"><span class="emphasis">  color: #fff;</span></span><br><span class="line"><span class="emphasis">  border: 0;</span></span><br><span class="line"><span class="emphasis">  margin: 20px auto;</span></span><br><span class="line"><span class="emphasis">  border-radius: 0.3125rem;</span></span><br><span class="line"><span class="emphasis">  display: block;</span></span><br><span class="line"><span class="emphasis">  padding: 0 1rem;</span></span><br><span class="line"><span class="emphasis">  height: 40px;</span></span><br><span class="line"><span class="emphasis">  font-weight: 500;</span></span><br><span class="line"><span class="emphasis">  text-align: center;</span></span><br><span class="line"><span class="emphasis">  transition: all 0.5s ease-out;</span></span><br><span class="line"><span class="emphasis">  background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);</span></span><br><span class="line"><span class="emphasis">  background-size: 1000% 1000%;</span></span><br><span class="line"><span class="emphasis">  animation: Gradient 60s linear infinite;</span></span><br><span class="line"><span class="emphasis">  outline: 0;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .bb-info &#123;</span></span><br><span class="line"><span class="emphasis">  font-weight: 700;</span></span><br><span class="line"><span class="emphasis">  font-size: 22px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .bb-card &#123;</span></span><br><span class="line"><span class="emphasis">  padding: 15px;</span></span><br><span class="line"><span class="emphasis">  border-radius: 10px;</span></span><br><span class="line"><span class="emphasis">  background: rgba(255, 255, 255, 0.1);</span></span><br><span class="line"><span class="emphasis">  border: 1px solid #a5a5a5ee;</span></span><br><span class="line"><span class="emphasis">  margin-top: 20px;</span></span><br><span class="line"><span class="emphasis">  transition: all 0.25s;</span></span><br><span class="line"><span class="emphasis">  user-select: none;</span></span><br><span class="line"><span class="emphasis">  width: calc(48% - 7px);</span></span><br><span class="line"><span class="emphasis">  margin: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">@media screen and (max-width: 800px) &#123;</span></span><br><span class="line"><span class="emphasis">  #bibi .bb-card &#123;</span></span><br><span class="line"><span class="emphasis">  width: 100%;</span></span><br><span class="line"><span class="emphasis">  &#125;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .bb-card:hover &#123;</span></span><br><span class="line"><span class="emphasis">  box-shadow: 0 5px 10px 8px #07111b29;</span></span><br><span class="line"><span class="emphasis">  transform: translateY(-3px);</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header &#123;</span></span><br><span class="line"><span class="emphasis">  display: flex;</span></span><br><span class="line"><span class="emphasis">  align-items: center;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header .avatar &#123;</span></span><br><span class="line"><span class="emphasis">  width: 32px;</span></span><br><span class="line"><span class="emphasis">  height: 32px;</span></span><br><span class="line"><span class="emphasis">  border-radius: 50%;</span></span><br><span class="line"><span class="emphasis">  margin-right: 10px;</span></span><br><span class="line"><span class="emphasis">  border-radius: 20px;</span></span><br><span class="line"><span class="emphasis">  overflow: hidden;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header svg &#123;</span></span><br><span class="line"><span class="emphasis">  height: 20px;</span></span><br><span class="line"><span class="emphasis">  width: 20px;</span></span><br><span class="line"><span class="emphasis">  margin-left: 5px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header .card-time &#123;</span></span><br><span class="line"><span class="emphasis">  font-size: 12px;</span></span><br><span class="line"><span class="emphasis">  text-shadow: #d9d9d9 0 0 1px, #fffffb 0 0 1px, #fffffb 0 0 2px;</span></span><br><span class="line"><span class="emphasis">  margin-left: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-content &#123;</span></span><br><span class="line"><span class="emphasis">  padding: 10px 0;</span></span><br><span class="line"><span class="emphasis">  white-space: pre-wrap;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-footer &#123;</span></span><br><span class="line"><span class="emphasis">  display: flex;</span></span><br><span class="line"><span class="emphasis">  padding-bottom: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-footer .card-label &#123;</span></span><br><span class="line"><span class="emphasis">  border-radius: 5px;</span></span><br><span class="line"><span class="emphasis">  padding: 0 5px;</span></span><br><span class="line"><span class="emphasis">  font-weight: 550;</span></span><br><span class="line"><span class="emphasis">  border-radius: 5px;</span></span><br><span class="line"><span class="emphasis">  box-shadow: inset 0 -1px 0 rgb(27 31 35 / 12%);</span></span><br><span class="line"><span class="emphasis">  font-size: 14px;</span></span><br><span class="line"><span class="emphasis">  user-select: none;</span></span><br><span class="line"><span class="emphasis">  margin-right: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">div#bb_loading img&#123;</span></span><br><span class="line"><span class="emphasis">  border-radius: 15px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bb-main &#123;</span></span><br><span class="line"><span class="emphasis">  display: flex;</span></span><br><span class="line"><span class="emphasis">  flex-direction: row;</span></span><br><span class="line"><span class="emphasis">  flex-wrap: wrap;</span></span><br><span class="line"><span class="emphasis">  justify-content: flex-start;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;/js/bibi.js&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;bibi&quot;</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;bb-info&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;bb-main&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"></span></span><br></pre></td></tr></table></figure></li><li><p>哔哔的API请见<code>source\js\bibi.js</code>，部署教程：<a href="https://www.fomal.cc/posts/d1927166.html#%E5%93%94%E5%93%94%E9%83%A8%E7%BD%B2">哔哔部署</a></p></li><li><p>欢迎信息地理位置显示，这个需要配置自己的 key，类似的还有 bibi 的配置、朋友圈等配置均需要参考相关文档改成自己的 API</p></li><li><p>个人信息卡片的图标和菜单栏等图标，参考<a href="https://www.fomal.cc/posts/5389e93f.html">博客魔改教程总结(二)</a>中的第 4-7 项</p></li><li><p>其余配置项基本与 Butterfly 兼容，参考<a href="https://butterfly.js.org/">Butterfly 官方文档</a>即可</p></li><li><p>遇到问题请多看相关文档(Hexo 主题文档、Butterfly 主题文档、店长的教程)和本站教程，若有其他疑问请加 Q 群：<code>691942826</code> 验证回答：<code>🥝开源项目</code></p></li></ul><h3 id="🌟Star概况">🌟Star概况</h3><p><a href="https://star-history.com/#fomalhaut1998/hexo-theme-Fomalhaut&amp;Timeline"><img src="https://api.star-history.com/svg?repos=fomalhaut1998/hexo-theme-Fomalhaut&type=Timeline" alt="Star History Chart" style="zoom: 80%;" /></a></p>]]></content>
    
    
    <summary type="html">🍠网站的源码详细参考文档，本文章会长期更新</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>博客魔改教程总结(六)</title>
    <link href="https://www.fomal.cc/posts/489d3914.html"/>
    <id>https://www.fomal.cc/posts/489d3914.html</id>
    <published>2023-01-05T18:00:00.000Z</published>
    <updated>2023-01-05T18:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>魔改前必看（我当你们都懂了，太细节的就不写在教程中了🤣🤣🤣）</b></font></p><ol><li>博客魔改有风险，如果博客魔改出问题了又没有备份，可通过此项目查看基础源码进行<strong>回滚</strong>：<a href="https://github.com/jerryc127/hexo-theme-butterfly">jerryc127/hexo-theme-butterfly</a>、<a href="https://github.com/ccknbc-actions/blog-butterfly">ccknbc-actions/blog-butterfly</a>。</li><li>这部分魔改基本上都是大佬们造好的轮子，我按照大佬们的轮子结合自己的喜好进行魔改的，具体见我友人帐第一个栏目大佬们的网站，本处仅做一个总结，如有侵权请联系删除。</li><li>鉴于每个人的根目录名称都不一样，本帖<strong>博客根目录</strong>一律以<code>[BlogRoot]</code>指代。</li><li>本帖涉及魔改源码的内容，会使用<strong>diff代码块</strong>标识，复制时请<strong>不要忘记删除</strong>前面的<code>+、-</code>符号。</li><li>因为<code>.pug</code>和<code>.styl</code>以及<code>.yml</code>等对缩进要求较为严格，请尽量<strong>不要使用记事本等无法提供语法高亮的文本编辑器</strong>进行修改。</li><li>本帖基于<code>Butterfly主题</code>进行魔改方案编写，因此请读者优先掌握<a href="https://butterfly.js.org/">Butterfly主题官方文档</a>的内容后再来进行魔改。</li><li>魔改会过程常常引入<strong>自定义的css与js文件</strong>，方法见<a href="https://b.leonus.cn/2022/custom.html">Hexo博客添加自定义css和js文件</a>(太懒了不想自己写)</li></ol><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a> ⇦当前位置🪂</li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="图片、字体压缩">图片、字体压缩</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>见本站教程：<a href="/posts/b48804d5.html">网站性能优化的一些小技巧</a>的<code>优化小技巧实操</code>，里面有说各种资源的压缩方法</p>              </div>            </details><h2 id="图片、字体资源分享">图片、字体资源分享</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>鉴于很多同学问我能不能分享一下字体和图片，肯定可以！</p><p>到下面这个Github仓库里面就能找到啦（可能得挂梯子），可以的话给一个star哦，图片和字体资源均经过了压缩！</p><p><a href="https://github.com/fomalhaut1998/PicGoDemo">fomalhaut1998/PicGoDemo</a></p>              </div>            </details><h2 id="公告栏文字样式">公告栏文字样式</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>很多同学问我首页的公告样式怎么做的，其实就是普通的html而已~</p><p>在主题配置文件<code>_config.butterfly.yml</code>中写入如下配置：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">aside:</span></span><br><span class="line">  <span class="attr">card_announcement:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">content:</span> <span class="string">&lt;center&gt;&lt;b&gt;---</span> <span class="string">主域名</span> <span class="string">---&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://www.fomal.cc&quot;</span> <span class="string">title=&quot;此线路部署于Vercel&quot;</span> <span class="string">class=&quot;anno_content&quot;&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;fomal.cc&lt;/font&gt;&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a</span> <span class="string">href=&quot;https://www.fomal.cn&quot;</span> <span class="string">title=&quot;此线路部署于Vercel&quot;</span> <span class="string">class=&quot;anno_content&quot;&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;fomal.cn&lt;/font&gt;&lt;/a&gt;&lt;br&gt;---</span> <span class="string">备用域名</span> <span class="string">---&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://netlify.fomal.cc&quot;</span> <span class="string">title=&quot;此线路部署于Netlify&quot;</span> <span class="string">class=&quot;anno_content&quot;&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;netlify.fomal.cc&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://cloudflare.fomal.cc&quot;</span> <span class="string">title=&quot;此线路部署于Cloudflare&quot;</span> <span class="string">class=&quot;anno_content&quot;&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;cloudflare.fomal.cc&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://railway.fomal.cc&quot;</span> <span class="string">title=&quot;此线路部署于Railway&quot;</span> <span class="string">class=&quot;anno_content&quot;&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;railway.fomal.cc&lt;/font&gt;&lt;/a&gt;&lt;br&gt;---</span> <span class="string">网站安卓APP</span> <span class="string">---&lt;br&gt;🍧&lt;a</span> <span class="string">href=&quot;https://sourcebucket.s3.ladydaily.com/Fomalhaut.apk&quot;</span> <span class="string">title=&quot;点这里可以下载网站的安卓APP&quot;</span> <span class="string">class=&quot;anno_content&quot;&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;点此下载&lt;/font&gt;&lt;/a&gt;🍧&lt;/b&gt;&lt;/center&gt;</span></span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="Hexo博客部署到云服务器">Hexo博客部署到云服务器</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程，我觉得下面两篇写得比较好：</p><ul><li><a href="https://blog.csdn.net/qq_41467882/article/details/124861190">将 Hexo 部署/迁移到腾讯云轻量服务器</a></li><li><a href="https://blog.csdn.net/qq_44706030/article/details/112759634?spm=1001.2014.3001.5506">将 Hexo 部署到阿里云轻量服务器</a></li></ul>              </div>            </details><h2 id="字数统计显示w而不是k">字数统计显示w而不是k</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-16.webp" alt="image-16.webp" style="zoom:50%;" /></div></div><p>今天有人问我这个怎么弄，其实就是改了一下插件而已，默认插件是1000字以下直接显示子树，然后1000字以上显示多少k，但是例如127k，感觉不是很直观，于是改了一下统计字数的逻辑，改动之后的逻辑是：10000字以下直接显示字数，10000字以上显示多少w</p><p>开启字数统计之后，在博客根目录终端依次运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 卸载旧的依赖</span></span><br><span class="line">npm un hexo-wordcount --save</span><br><span class="line"><span class="comment"># 安装新的依赖</span></span><br><span class="line">npm i hexo-wordcount-fomal --save</span><br></pre></td></tr></table></figure><p>然后重启就可以看到显示w了(PS：这也能水一个教程🤣)</p>              </div>            </details><h2 id="随机壁纸API汇总">随机壁纸API汇总</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>网上可以查到很多随机壁纸的API，但是很多都用不了或者是图片质量比较低，于是今天汇总了一些目前可以用的随机壁纸API，其中列出来的图片质量都是比较高的，可以放心食用，本站随机壁纸API模块用的都是这部分API。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 必应每日壁纸</span></span><br><span class="line"><span class="keyword">let</span> bingDayBg = screen.<span class="property">width</span> &lt;= <span class="number">768</span> ? <span class="string">&quot;url(https://bing.img.run/m.php)&quot;</span> : <span class="string">&quot;url(https://bing.img.run/1920x1080.php)&quot;</span>;</span><br><span class="line"><span class="comment">// 必应历史壁纸</span></span><br><span class="line"><span class="keyword">let</span> bingHistoryBg = screen.<span class="property">width</span> &lt;= <span class="number">768</span> ? <span class="string">&quot;url(https://bing.img.run/rand_m.php)&quot;</span> : <span class="string">&quot;url(https://bing.img.run/rand.php)&quot;</span>;</span><br><span class="line"><span class="comment">// EEE.DOG动漫壁纸</span></span><br><span class="line"><span class="keyword">let</span> <span class="title class_">EEEDog</span> = <span class="string">&quot;url(https://api.yimian.xyz/img?type=moe&amp;size=1920x1080)&quot;</span>;</span><br><span class="line"><span class="comment">// seovx随机美图</span></span><br><span class="line"><span class="keyword">let</span> seovx = <span class="string">&quot;url(https://cdn.seovx.com/?mom=302)&quot;</span>;</span><br><span class="line"><span class="comment">// picsum随机壁纸</span></span><br><span class="line"><span class="keyword">let</span> picsum = <span class="string">&quot;url(https://picsum.photos/1920/1080.webp)&quot;</span>;</span><br><span class="line"><span class="comment">// 小歪二次元壁纸</span></span><br><span class="line"><span class="keyword">let</span> waiDongman = <span class="string">&quot;url(https://api.ixiaowai.cn/api/api.php)&quot;</span>;</span><br><span class="line"><span class="comment">//  小歪高清壁纸</span></span><br><span class="line"><span class="keyword">let</span> waiBizhi = <span class="string">&quot;url(https://api.ixiaowai.cn/gqapi/gqapi.php)&quot;</span>;</span><br><span class="line"><span class="comment">// 博天随机壁纸</span></span><br><span class="line"><span class="keyword">let</span> btstu = <span class="string">&quot;url(http://api.btstu.cn/sjbz/?lx=suiji)&quot;</span>;</span><br><span class="line"><span class="comment">// tuapi动漫壁纸</span></span><br><span class="line"><span class="keyword">let</span> tuapi = <span class="string">&quot;url(https://tuapi.eees.cc/api.php?category=dongman)&quot;</span>;</span><br><span class="line"><span class="comment">// unsplash随机壁纸 https://source.unsplash.com/random/1920x1080/daily (weekly)</span></span><br><span class="line"><span class="keyword">let</span> unsplash = <span class="string">&quot;url(https://source.unsplash.com/random/1920x1080/)&quot;</span>;</span><br></pre></td></tr></table></figure><p>API链接就是引号引着的部分，具体的参数可以到相应官网查看API文档，这部分已经通过测试，到目前为止都是可用的，并且壁纸质量比较高；尤其是<code>必应</code>、<code>unsplash</code>、<code>picsum</code>这几个API的图片质量十分高，赶紧给你的网站换上随机壁纸吧！</p>              </div>            </details><h2 id="CSS与JS整合和优化方案">CSS与JS整合和优化方案</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：</p><ul><li><a href="https://akilar.top/posts/615d5ede/">店长:Hexo异步加载方案</a></li><li><a href="https://kmar.top/posts/7d9fb37e/">空梦:网站加载速度优化方案总结</a></li></ul>              </div>            </details><h2 id="🍕🍕🍕写在最后">🍕🍕🍕写在最后</h2><ul><li><p>大家有啥教程想看的可以在评论区留言，如果搭建或者魔改过程中遇到不懂的可以加下面的群讨论，同时本人在B站有空也会做一些魔改系列的视频教程，点这里可以进入我的B站账号个人空间<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a></p><img src="https://s1.vika.cn/space/2022/11/04/0bd8a1a7e8f64d6a8248d1d872c5a178" alt="二维码" style="zoom:50%;" /></li></ul>]]></content>
    
    
    <summary type="html">🧄这是博客魔改教程总结的第六期</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>综合美化模块教程</title>
    <link href="https://www.fomal.cc/posts/9ac969bb.html"/>
    <id>https://www.fomal.cc/posts/9ac969bb.html</id>
    <published>2022-12-31T22:00:00.000Z</published>
    <updated>2022-12-31T22:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>魔改前必看（我当你们都懂了，太细节的就不写在教程中了🤣🤣🤣）</b></font></p><ol><li>博客魔改有风险，如果博客魔改出问题了又没有备份，可通过此项目查看基础源码进行<strong>回滚</strong>：<a href="https://github.com/jerryc127/hexo-theme-butterfly">jerryc127/hexo-theme-butterfly</a>、<a href="https://github.com/ccknbc-actions/blog-butterfly">ccknbc-actions/blog-butterfly</a>。</li><li>这部分魔改基本上都是大佬们造好的轮子，我按照大佬们的轮子结合自己的喜好进行魔改的，具体见我友人帐第一个栏目大佬们的网站，本处仅做一个总结，如有侵权请联系删除。</li><li>鉴于每个人的根目录名称都不一样，本帖<strong>博客根目录</strong>一律以<code>[BlogRoot]</code>指代。</li><li>本帖涉及魔改源码的内容，会使用<strong>diff代码块</strong>标识，复制时请<strong>不要忘记删除</strong>前面的<code>+、-</code>符号。</li><li>因为<code>.pug</code>和<code>.styl</code>以及<code>.yml</code>等对缩进要求较为严格，请尽量<strong>不要使用记事本等无法提供语法高亮的文本编辑器</strong>进行修改。</li><li>本帖基于<code>Butterfly主题</code>进行魔改方案编写，因此请读者优先掌握<a href="https://butterfly.js.org/">Butterfly主题官方文档</a>的内容后再来进行魔改。</li><li>魔改会过程常常引入<strong>自定义的css与js文件</strong>，方法见<a href="https://b.leonus.cn/2022/custom.html">Hexo博客添加自定义css和js文件</a>(太懒了不想自己写)</li></ol><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a> ⇦当前位置🪂</li></ol></div><h2 id="1-介绍">1.介绍</h2><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>参考：<a href="https://blog.leonus.cn/2022/bg2.html">Leonus：切换博客背景2.0版本——弹窗切换</a></p>            </div><p>本教程是在Leonus大佬的基础上做自己的二次开发，加上了很多功能。为什么要单独开一篇文章讲这个教程？因为这个教程可能长期会更新，后面可能会加功能、改动功能之类的；而且这个魔改的耦合程度比较高，代码量也比较大，魔改失败的概率会比较大，我第一次写也没有运行过，只是凭印象写的，所以专门开一篇文章供大家讨论吧。（毕竟我也只是个非科班的，不是专门搞前端这方面的，比我厉害的大佬多了去了🤣）大家有什么好的创意也可以在评论区提出来，或者在这个基础上继续进行二次开发，创造出更有意思的功能！</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-13.webp" alt="image-13.webp" style="zoom:50%;" /></div></div><div class="note warning modern"><p>此魔改耦合程度较高，需要完成的前置教程比较多，稍微不小心就会改错，建议一定要备份好自己的代码再来改动，改废了不赔偿！前置教程与知识：星空背景、霓虹灯、页面css参数化、帧率监测、鼠标魔改、按键防抖、自定义字体引入、vue样式弹窗的的引入、开启Pjax、外挂标签、白天黑夜手机电脑不同背景、熟悉Leonus的原教程以及会引入css与js文件、有最基础的html、pug、css、js知识</p></div><h2 id="2-教程正文">2.教程正文</h2><ol><li><p>在<code>[BlogRoot]\themes\butterfly\layout\includes\header\nav.pug</code>适当的位置加入如下代码，这是<code>winbox</code>的入口按钮。我是在导航栏引入的，如果在右边按钮引入请参考leonus的代码，差不多：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="addition">+      //- 美化设置</span></span><br><span class="line"><span class="addition">+      a.meihua.faa-parent.animated-hover(onclick=&quot;toggleWinbox()&quot; title=&quot;美化设置-自定义你的风格&quot; id=&quot;meihua-button&quot;)</span></span><br><span class="line"><span class="addition">+        svg.faa-tada.icon(style=&quot;height:26px;width:26px;fill:currentColor;position:relative;top:8px&quot; aria-hidden=&quot;true&quot;)</span></span><br><span class="line"><span class="addition">+          use(xlink:href=&#x27;#icon-tupian1&#x27;)</span></span><br></pre></td></tr></table></figure><p>如果之前按着我的导航栏修改，那就可以直接用了，不用加，贴一份修改好后的<code>nav.pug</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">nav#nav</span><br><span class="line">  span#blog_name</span><br><span class="line">    a#site-name(href=url_for(&#x27;/&#x27;)) #[=config.title]</span><br><span class="line">    </span><br><span class="line">  #menus</span><br><span class="line">    !=partial(&#x27;includes/header/menu_item&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    //- 这两行是导航栏显示标题用的</span><br><span class="line">    center(id=&quot;name-container&quot;)</span><br><span class="line">      a(id=&quot;page-name&quot; href=&quot;javascript:scrollToTop()&quot;) PAGE_NAME</span><br><span class="line">      </span><br><span class="line">    #nav-right</span><br><span class="line">      if (theme.algolia_search.enable || theme.local_search.enable)</span><br><span class="line">        #search-button</span><br><span class="line">          //- a.site-page.social-icon.search</span><br><span class="line">          //-   i.fas.fa-search.fa-fw</span><br><span class="line">          a.search.faa-parent.animated-hover(title=&quot;检索站内任何你想要的信息&quot;)</span><br><span class="line">            svg.faa-tada.icon(style=&quot;height:24px;width:24px;fill:currentColor;position:relative;top:6px&quot; aria-hidden=&quot;true&quot;)</span><br><span class="line">              use(xlink:href=&#x27;#icon-valentine_-search-love-find-heart&#x27;)</span><br><span class="line">            span=&#x27; &#x27;+_p(&#x27;search.title&#x27;)    </span><br><span class="line"></span><br><span class="line">      //- 美化设置</span><br><span class="line">      a.meihua.faa-parent.animated-hover(onclick=&quot;toggleWinbox()&quot; title=&quot;美化设置-自定义你的风格&quot; id=&quot;meihua-button&quot;)</span><br><span class="line">        svg.faa-tada.icon(style=&quot;height:26px;width:26px;fill:currentColor;position:relative;top:8px&quot; aria-hidden=&quot;true&quot;)</span><br><span class="line">          use(xlink:href=&#x27;#icon-tupian1&#x27;)</span><br><span class="line"></span><br><span class="line">      //- 暗黑模式按钮</span><br><span class="line">      a.sun_moon.faa-parent.animated-hover(onclick=&#x27;switchNightMode()&#x27;,  title=_p(&#x27;rightside.night_mode_title&#x27;) id=&quot;nightmode-button&quot;)</span><br><span class="line">        svg.faa-tada(style=&quot;height:25px;width:25px;fill:currentColor;position:relative;top:7px&quot;, viewBox=&#x27;0 0 1024 1024&#x27;)</span><br><span class="line">          use#modeicon(xlink:href=&#x27;#icon-moon&#x27;)        </span><br><span class="line">        </span><br><span class="line">      #toggle-menu</span><br><span class="line">        a</span><br><span class="line">          i.fas.fa-bars.fa-fw</span><br></pre></td></tr></table></figure></li><li><p>新建<code>[BlogRoot]\source\js\meihua.js</code>，这是该模块的主体函数，比较长，主要是分为3部分：<code>加载页面逻辑</code>、<code>窗口绘制</code>、<code>窗口内部逻辑</code>，里面的壁纸可以自己进行替换（记住不要直接用我的），<code>默认背景</code>、<code>默认字体</code>需要你自己修改（代码中有<code>xxx</code>的地方），另外模块内部有什么东西就在<code>winbox.body.innerHTML</code>里面加就行：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 更新版本需要每个用户都恢复一次默认设置</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;reset_2&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;reset_2&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&quot;reset_1&quot;</span>);</span><br><span class="line">  <span class="title function_">clearItem</span>();</span><br><span class="line">  <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">      <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">          <span class="attr">title</span>: <span class="string">&quot;提示🍒&quot;</span>,</span><br><span class="line">          <span class="attr">message</span>: <span class="string">&quot; (｡･∀･)ﾉﾞ由于网站部分设置项更新，当前已为您重置所有设置，祝您愉快！&quot;</span>,</span><br><span class="line">          <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">          <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">          <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">          <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">          <span class="attr">duration</span>: <span class="number">8000</span></span><br><span class="line">        &#125;);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;, <span class="number">1500</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 清除localStorage配置项</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">clearItem</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;blogbg&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;universe&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;blur&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;fpson&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;transNum&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;bing&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;blurRad&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;font&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;themeColor&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;rs&#x27;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;mouse&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置字体</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;font&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;font&quot;</span>, <span class="string">&quot;xxx&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">setFont</span>(<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;font&quot;</span>));</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setFont</span>(<span class="params">n</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;font&quot;</span>, n)</span><br><span class="line">  <span class="keyword">if</span> (n == <span class="string">&quot;default&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--global-font&#x27;</span>, <span class="string">&#x27;-apple-system&#x27;</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">style</span>.<span class="property">fontFamily</span> = <span class="string">&quot;-apple-system, Consolas_1, BlinkMacSystemFont, &#x27;Segoe UI&#x27; , &#x27;Helvetica Neue&#x27; , Lato, Roboto, &#x27;PingFang SC&#x27; , &#x27;Microsoft JhengHei&#x27; , &#x27;Microsoft YaHei&#x27; , sans-serif&quot;</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--global-font&#x27;</span>, n);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">style</span>.<span class="property">fontFamily</span> = <span class="string">&quot;var(--global-font),-apple-system, IBM Plex Mono ,monosapce,&#x27;微软雅黑&#x27;, sans-serif&quot;</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">try</span> &#123; <span class="title function_">setFontBorder</span>(); &#125; <span class="keyword">catch</span> (err) &#123; &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置字体选择框边界</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setFontBorder</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> curFont = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;font&quot;</span>);</span><br><span class="line">  <span class="keyword">var</span> swfId = <span class="string">&quot;swf_&quot;</span> + curFont;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(swfId).<span class="property">style</span>.<span class="property">border</span> = <span class="string">&quot;2px solid var(--theme-color)&quot;</span>;</span><br><span class="line">  <span class="title class_">Array</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">forEach</span>.<span class="title function_">call</span>(<span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;swf&quot;</span>), <span class="keyword">function</span> (<span class="params">ee</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (ee.<span class="property">id</span> != swfId) ee.<span class="property">style</span>.<span class="property">border</span> = <span class="string">&quot;2px solid var(--border-color)&quot;</span>;</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置主题色</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;themeColor&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;themeColor&quot;</span>, <span class="string">&quot;green&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">setColor</span>(<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;themeColor&quot;</span>));</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setColor</span>(<span class="params">c</span>) &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;themeColor&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--theme-color:`</span> + map.<span class="title function_">get</span>(c) + <span class="string">` !important&#125;`</span>;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;themeColor&quot;</span>, c);</span><br><span class="line">  <span class="comment">// 刷新鼠标颜色</span></span><br><span class="line">  <span class="variable constant_">CURSOR</span>.<span class="title function_">refresh</span>();</span><br><span class="line">  <span class="comment">// 设置一个带有透明度的主题色，用于菜单栏的悬浮颜色</span></span><br><span class="line">  <span class="keyword">var</span> theme_color = map.<span class="title function_">get</span>(c);</span><br><span class="line">  <span class="keyword">var</span> trans_theme_color = <span class="string">&quot;rgba&quot;</span> + theme_color.<span class="title function_">substring</span>(<span class="number">3</span>, theme_color.<span class="property">length</span> - <span class="number">1</span>) + <span class="string">&quot;, 0.7)&quot;</span>;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&quot;--text-bg-hover&quot;</span>, trans_theme_color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 控制星空背景特效开关</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;universe&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;universe&quot;</span>, <span class="string">&quot;block&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">setUniverse2</span>(<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;universe&quot;</span>));</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setUniverse2</span>(<span class="params">c</span>) &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;universe&quot;</span>).<span class="property">style</span>.<span class="property">display</span> = c;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;universe&quot;</span>, c);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setUniverse</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;universeSet&quot;</span>).<span class="property">checked</span>) &#123;</span><br><span class="line">    <span class="title function_">setUniverse2</span>(<span class="string">&quot;block&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="title function_">setUniverse2</span>(<span class="string">&quot;none&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 帧率监测开关</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;fpson&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;fpson&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fpssw</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;fpson&quot;</span>).<span class="property">checked</span>) &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;fpson&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;fpson&quot;</span>, <span class="string">&quot;0&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">setTimeout</span>(reload, <span class="number">600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 刷新窗口</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">reload</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">window</span>.<span class="property">location</span>.<span class="title function_">reload</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 侧边栏开关</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;rs&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;rs&quot;</span>, <span class="string">&quot;block&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;rs&quot;</span>) == <span class="string">&quot;block&quot;</span>) &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightSide&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--rightside-display: block&#125;`</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightSide&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--rightside-display: none&#125;`</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">toggleRightside</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="comment">// 先设置localStorage变量</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightSideSet&quot;</span>).<span class="property">checked</span>) &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;rs&quot;</span>, <span class="string">&quot;block&quot;</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightSide&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--rightside-display: block&#125;`</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;rs&quot;</span>, <span class="string">&quot;none&quot;</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightSide&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--rightside-display: none&#125;`</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 透明度调节滑块</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;transNum&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;transNum&quot;</span>, <span class="number">95</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> curTransNum = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;transNum&quot;</span>);</span><br><span class="line"><span class="keyword">var</span> curTransMini = curTransNum * <span class="number">0.95</span>;</span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;transPercent&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--trans-light: rgba(253, 253, 253, <span class="subst">$&#123;curTransNum&#125;</span>%) !important; --trans-dark: rgba(25, 25, 25, <span class="subst">$&#123;curTransNum&#125;</span>%) !important&#125; `</span>;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setTrans</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> elem = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;transSet&quot;</span>);</span><br><span class="line">  <span class="keyword">var</span> newTransNum = elem.<span class="property">value</span>;</span><br><span class="line">  <span class="keyword">var</span> target = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;.transValue&#x27;</span>);</span><br><span class="line">  target.<span class="property">innerHTML</span> = <span class="string">&quot;透明度 (0%-100%): &quot;</span> + newTransNum + <span class="string">&quot;%&quot;</span>;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;transNum&quot;</span>, newTransNum);</span><br><span class="line">  curTransMini = newTransNum * <span class="number">0.95</span>;</span><br><span class="line">  curTransNum = newTransNum;  <span class="comment">// 更新当前透明度</span></span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#rang_trans&#x27;</span>).<span class="property">style</span>.<span class="property">width</span> = curTransMini + <span class="string">&quot;%&quot;</span>;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;transPercent&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--trans-light: rgba(253, 253, 253, <span class="subst">$&#123;newTransNum&#125;</span>%) !important; --trans-dark: rgba(25, 25, 25, <span class="subst">$&#123;newTransNum&#125;</span>%) !important&#125; `</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 模糊度调节滑块</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blurRad&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;blurRad&quot;</span>, <span class="number">20</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> curBlur = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blurRad&quot;</span>); <span class="comment">// 当前模糊半径</span></span><br><span class="line"><span class="keyword">var</span> miniBlur = curBlur * <span class="number">0.95</span>;</span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;blurNum&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--blur-num: blur(<span class="subst">$&#123;curBlur&#125;</span>px) saturate(120%) !important`</span>;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setBlurNum</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> elem = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;blurSet&quot;</span>);</span><br><span class="line">  <span class="keyword">var</span> newBlur = elem.<span class="property">value</span>;</span><br><span class="line">  <span class="keyword">var</span> target = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;.blurValue&#x27;</span>);</span><br><span class="line">  target.<span class="property">innerHTML</span> = <span class="string">&quot;模糊半径 (开启模糊生效 0px-100px): &quot;</span> + newBlur + <span class="string">&quot;px&quot;</span>;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;blurRad&quot;</span>, newBlur);</span><br><span class="line">  curBlur = newBlur;</span><br><span class="line">  miniBlur = curBlur * <span class="number">0.95</span>;</span><br><span class="line">  <span class="comment">// var max = elem.getAttribute(&quot;max&quot;);</span></span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#rang_blur&#x27;</span>).<span class="property">style</span>.<span class="property">width</span> = miniBlur + <span class="string">&quot;%&quot;</span>;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;blurNum&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--blur-num: blur(<span class="subst">$&#123;curBlur&#125;</span>px) saturate(120%) !important`</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 模糊效果开关</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blur&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;blur&quot;</span>, <span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blur&quot;</span>) == <span class="number">0</span>) &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;settingStyle&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--backdrop-filter: none&#125;`</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;settingStyle&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--backdrop-filter: var(--blur-num)&#125;`</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setBlur</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;blur&quot;</span>).<span class="property">checked</span>) &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;blur&quot;</span>, <span class="number">1</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;settingStyle&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--backdrop-filter: var(--blur-num)&#125;`</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;blur&quot;</span>, <span class="number">0</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;settingStyle&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;--backdrop-filter: none&#125;`</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 切换自定义颜色</span></span><br><span class="line"><span class="keyword">var</span> defineColor = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blogbg&quot;</span>) &amp;&amp; <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blogbg&quot;</span>).<span class="title function_">charAt</span>(<span class="number">0</span>) == <span class="string">&#x27;#&#x27;</span> ? <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blogbg&quot;</span>) : <span class="string">&#x27;#F4D88A&#x27;</span>;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">changeBgColor</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="title function_">changeBg</span>(<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;#colors&quot;</span>).<span class="property">value</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 更换背景(自己的代码)</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blogbg&quot;</span>) != <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="keyword">let</span> curBg = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blogbg&quot;</span>);</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;defineBg&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;</span></span><br><span class="line"><span class="string">    --default-bg: <span class="subst">$&#123;curBg&#125;</span>;</span></span><br><span class="line"><span class="string">    --darkmode-bg: <span class="subst">$&#123;curBg&#125;</span>;</span></span><br><span class="line"><span class="string">    --mobileday-bg: <span class="subst">$&#123;curBg&#125;</span>;</span></span><br><span class="line"><span class="string">    --mobilenight-bg: <span class="subst">$&#123;curBg&#125;</span>;</span></span><br><span class="line"><span class="string">  &#125;`</span>;</span><br><span class="line">  <span class="title function_">changeBg</span>(curBg);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="comment">// 替换你自己的默认背景</span></span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;defineBg&quot;</span>).<span class="property">innerText</span> = <span class="string">`:root&#123;</span></span><br><span class="line"><span class="string">    --default-bg: url(xxx);</span></span><br><span class="line"><span class="string">    --darkmode-bg:url(xxx);</span></span><br><span class="line"><span class="string">    --mobileday-bg: url(xxx);</span></span><br><span class="line"><span class="string">    --mobilenight-bg: url(xxx);</span></span><br><span class="line"><span class="string">  &#125;`</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">changeBg</span>(<span class="params">s</span>) &#123;</span><br><span class="line">  <span class="keyword">let</span> bg = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;web_bg&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (s.<span class="title function_">charAt</span>(<span class="number">0</span>) == <span class="string">&quot;#&quot;</span>) &#123;</span><br><span class="line">    bg.<span class="property">style</span>.<span class="property">backgroundColor</span> = s;</span><br><span class="line">    bg.<span class="property">style</span>.<span class="property">backgroundImage</span> = <span class="string">&quot;none&quot;</span>;</span><br><span class="line">    defineColor = s;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    bg.<span class="property">style</span>.<span class="property">backgroundImage</span> = s</span><br><span class="line">    defineColor = <span class="string">&#x27;#F4D88A&#x27;</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;blogbg&quot;</span>, s);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;bing&quot;</span>, <span class="string">&quot;false&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;bingSet&quot;</span>)) <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;bingSet&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 切换链接对应的背景(加入了链接检验与防抖)</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getPicture</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="title function_">debounce</span>(getPicture_, <span class="number">300</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getPicture_</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">let</span> bg = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;web_bg&quot;</span>);</span><br><span class="line">  <span class="title function_">checkImgExists</span>(<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;pic-link&quot;</span>).<span class="property">value</span>).<span class="title function_">then</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">// 有效的图片链接</span></span><br><span class="line">    <span class="keyword">var</span> link = <span class="string">&quot;url(&quot;</span> + <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;pic-link&quot;</span>).<span class="property">value</span> + <span class="string">&quot;)&quot;</span>;</span><br><span class="line">    bg.<span class="property">style</span>.<span class="property">backgroundImage</span> = link;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;blogbg&quot;</span>, link);</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;bing&quot;</span>, <span class="string">&quot;false&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;bingSet&quot;</span>)) <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;bingSet&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">    <span class="comment">// 提示切换成功</span></span><br><span class="line">    <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">      <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">          <span class="attr">title</span>: <span class="string">&quot;可以啦🍨&quot;</span>,</span><br><span class="line">          <span class="attr">message</span>: <span class="string">&quot;切换自定义背景成功！&quot;</span>,</span><br><span class="line">          <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">          <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">          <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">          <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">          <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">        &#125;);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;).<span class="title function_">catch</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">// 无效的图片链接，提示无效</span></span><br><span class="line">    <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">      <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">          <span class="attr">title</span>: <span class="string">&quot;链接不对🤣&quot;</span>,</span><br><span class="line">          <span class="attr">message</span>: <span class="string">&quot;请输入有效的图片链接！&quot;</span>,</span><br><span class="line">          <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">          <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">          <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">          <span class="attr">type</span>: <span class="string">&quot;warning&quot;</span>,</span><br><span class="line">          <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">        &#125;);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 判断图片链接是否可用</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">checkImgExists</span>(<span class="params">imgurl</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="keyword">function</span> (<span class="params">resolve, reject</span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> <span class="title class_">ImgObj</span> = <span class="keyword">new</span> <span class="title class_">Image</span>();</span><br><span class="line">    <span class="title class_">ImgObj</span>.<span class="property">src</span> = imgurl;</span><br><span class="line">    <span class="title class_">ImgObj</span>.<span class="property">onload</span> = <span class="keyword">function</span> (<span class="params">res</span>) &#123;</span><br><span class="line">      <span class="title function_">resolve</span>(res);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title class_">ImgObj</span>.<span class="property">onerror</span> = <span class="keyword">function</span> (<span class="params">err</span>) &#123;</span><br><span class="line">      <span class="title function_">reject</span>(err);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 必应每日图片</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;bing&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;bing&quot;</span>, <span class="string">&quot;false&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;bing&quot;</span>) == <span class="string">&quot;true&quot;</span>) &#123;</span><br><span class="line">  <span class="keyword">let</span> bg = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;web_bg&quot;</span>);</span><br><span class="line">  <span class="comment">// 手机电脑分开</span></span><br><span class="line">  <span class="keyword">let</span> curUrl = screen.<span class="property">width</span> &lt;= <span class="number">768</span> ? <span class="string">&quot;url(https://bing.img.run/m.php)&quot;</span> : <span class="string">&quot;url(https://bing.img.run/1920x1080.php)&quot;</span>;</span><br><span class="line">  bg.<span class="property">style</span>.<span class="property">backgroundImage</span> = curUrl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setBing</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="comment">// 打开就设置</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;bingSet&quot;</span>).<span class="property">checked</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> bg = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;web_bg&quot;</span>);</span><br><span class="line">    <span class="comment">// 手机电脑分开</span></span><br><span class="line">    <span class="keyword">let</span> curUrl = screen.<span class="property">width</span> &lt;= <span class="number">768</span> ? <span class="string">&quot;url(https://bing.img.run/m.php)&quot;</span> : <span class="string">&quot;url(https://bing.img.run/1920x1080.php)&quot;</span>;</span><br><span class="line">    bg.<span class="property">style</span>.<span class="property">backgroundImage</span> = curUrl;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;bing&quot;</span>, <span class="string">&quot;true&quot;</span>);</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&quot;blogbg&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="comment">// 关闭就移除并恢复默认壁纸</span></span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;bing&quot;</span>, <span class="string">&quot;false&quot;</span>);</span><br><span class="line">    <span class="built_in">setTimeout</span>(reload, <span class="number">600</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 霓虹灯开关</span></span><br><span class="line"><span class="keyword">var</span> clk;  <span class="comment">// 定时器对象</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;light&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;light&quot;</span>, <span class="literal">true</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;light&quot;</span>) == <span class="string">&quot;true&quot;</span>) &#123;</span><br><span class="line">  <span class="built_in">clearInterval</span>(clk);</span><br><span class="line">  clk = <span class="built_in">setInterval</span>(changeLightColor, <span class="number">1200</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setLight</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;lightSet&quot;</span>).<span class="property">checked</span>) &#123;</span><br><span class="line">    <span class="built_in">clearInterval</span>(clk);</span><br><span class="line">    clk = <span class="built_in">setInterval</span>(changeLightColor, <span class="number">1200</span>);</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;light&quot;</span>, <span class="string">&quot;true&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="built_in">clearInterval</span>(clk);</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;light&quot;</span>, <span class="string">&quot;false&quot;</span>);</span><br><span class="line">    <span class="comment">// 恢复默认</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;site-name&quot;</span>))</span><br><span class="line">      <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;site-name&quot;</span>).<span class="property">style</span>.<span class="property">textShadow</span> = <span class="string">&quot;#1e1e1ee0 1px 1px 1px&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;site-title&quot;</span>))</span><br><span class="line">      <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;site-title&quot;</span>).<span class="property">style</span>.<span class="property">textShadow</span> = <span class="string">&quot;#1e1e1ee0 1px 1px 1px&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;site-subtitle&quot;</span>))</span><br><span class="line">      <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;site-subtitle&quot;</span>).<span class="property">style</span>.<span class="property">textShadow</span> = <span class="string">&quot;#1e1e1ee0 1px 1px 1px&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;post-info&quot;</span>))</span><br><span class="line">      <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;post-info&quot;</span>).<span class="property">style</span>.<span class="property">textShadow</span> = <span class="string">&quot;#1e1e1ee0 1px 1px 1px&quot;</span>;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;author-info__name&quot;</span>)[<span class="number">0</span>].<span class="property">style</span>.<span class="property">textShadow</span> = <span class="string">&quot;&quot;</span>;</span><br><span class="line">      <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;author-info__description&quot;</span>)[<span class="number">0</span>].<span class="property">style</span>.<span class="property">textShadow</span> = <span class="string">&quot;&quot;</span>;</span><br><span class="line">    &#125; <span class="keyword">catch</span> &#123;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建窗口</span></span><br><span class="line"><span class="keyword">var</span> winbox = <span class="string">&quot;&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createWinbox</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">let</span> div = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;div&quot;</span>);</span><br><span class="line">  <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(div);</span><br><span class="line">  winbox = <span class="title class_">WinBox</span>(&#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="string">&quot;meihuaBox&quot;</span>,</span><br><span class="line">    <span class="attr">index</span>: <span class="number">99</span>,</span><br><span class="line">    <span class="attr">title</span>: <span class="string">&quot;美化设置&quot;</span>,</span><br><span class="line">    <span class="attr">x</span>: <span class="string">&quot;left&quot;</span>,</span><br><span class="line">    <span class="attr">y</span>: <span class="string">&quot;center&quot;</span>,</span><br><span class="line">    <span class="attr">minwidth</span>: <span class="string">&quot;300px&quot;</span>,</span><br><span class="line">    <span class="attr">height</span>: <span class="string">&quot;60%&quot;</span>,</span><br><span class="line">    <span class="attr">background</span>: <span class="string">&#x27;var(--theme-color)&#x27;</span>,</span><br><span class="line">    <span class="attr">onmaximize</span>: <span class="function">() =&gt;</span> &#123;</span><br><span class="line">      div.<span class="property">innerHTML</span> = <span class="string">`&lt;style&gt;body::-webkit-scrollbar &#123;display: none;&#125; div#meihuaBox &#123;width: 100% !important;&#125;&lt;/style&gt;`</span>;</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">onrestore</span>: <span class="function">() =&gt;</span> &#123;</span><br><span class="line">      div.<span class="property">innerHTML</span> = <span class="string">&quot;&quot;</span>;</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;);</span><br><span class="line">  <span class="title function_">winResize</span>();</span><br><span class="line">  <span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;resize&quot;</span>, winResize);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 每一类我放了一个演示，直接往下复制粘贴 a标签 就可以，需要注意的是 函数里面的链接 冒号前面需要添加反斜杠\进行转义</span></span><br><span class="line">  winbox.<span class="property">body</span>.<span class="property">innerHTML</span> = <span class="string">`</span></span><br><span class="line"><span class="string">&lt;div class=&quot;settings&quot; style=&quot;display: block;&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;div id=&quot;article-container&quot; style=&quot;padding:12px;&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;br&gt;</span></span><br><span class="line"><span class="string">&lt;center&gt;&lt;p&gt;&lt;button onclick=&quot;reset()&quot; style=&quot;background:linear-gradient(to right, #fc354c, #0abfbc);display:block;width:40%;padding:15px 0;border-radius:30px;color:white;font-size:1.1em;&quot;&gt;&lt;i class=&quot;fa-solid fa-arrows-rotate&quot;&gt;&lt;/i&gt;&amp;nbsp;恢复默认设置&lt;/button&gt;&lt;/p&gt;&lt;/center&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h2&gt;一、显示偏好&lt;/h2&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;div class=&quot;transValue&quot; style=&quot;font-weight:bold;padding-left:10px&quot;&gt;透明度 (0%-100%): <span class="subst">$&#123;curTransNum&#125;</span>%&lt;/div&gt;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;range&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;input id=&quot;transSet&quot; type=&quot;range&quot; min=&quot;0&quot; max=&quot;100&quot; step=&quot;1&quot; value=<span class="subst">$&#123;curTransNum&#125;</span> oninput=&quot;setTrans()&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;p class=&quot;rang_width&quot; id=&quot;rang_trans&quot; style=&quot;width:<span class="subst">$&#123;curTransMini&#125;</span>%&quot;&gt;&lt;/p&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;div class=&quot;blurValue&quot; style=&quot;font-weight:bold;padding-left:10px&quot;&gt;模糊半径 (开启模糊生效 0px-100px): <span class="subst">$&#123;curBlur&#125;</span> px&lt;/div&gt;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;range&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;input id=&quot;blurSet&quot; type=&quot;range&quot; min=&quot;0&quot; max=&quot;100&quot; step=&quot;1&quot; value=&quot;<span class="subst">$&#123;curBlur&#125;</span>&quot; oninput=&quot;setBlurNum()&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;p class=&quot;rang_width&quot; id=&quot;rang_blur&quot; style=&quot;width:<span class="subst">$&#123;miniBlur&#125;</span>%&quot;&gt;&lt;/p&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;div class=&quot;content&quot; style=&quot;display:flex&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;div class=&quot;content-text&quot; style=&quot;font-weight:bold; padding-left:10px&quot;&gt; 星空特效 (夜间模式) &lt;/div&gt;&lt;input type=&quot;checkbox&quot; id=&quot;universeSet&quot; onclick=&quot;setUniverse()&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;div class=&quot;content-text&quot; style=&quot;font-weight:bold; padding-left:20px&quot;&gt; 霓虹灯 (夜间模式) &lt;/div&gt;&lt;input type=&quot;checkbox&quot; id=&quot;lightSet&quot; onclick=&quot;setLight()&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;div class=&quot;content&quot; style=&quot;display:flex&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;div class=&quot;content-text&quot; style=&quot;font-weight:bold; padding-left:10px&quot;&gt; 模糊效果 (消耗性能) &lt;/div&gt;&lt;input type=&quot;checkbox&quot; id=&quot;blur&quot; onclick=&quot;setBlur()&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;div class=&quot;content-text&quot; style=&quot;font-weight:bold; padding-left:20px&quot;&gt; 侧边栏 (默认开) &lt;/div&gt;&lt;input type=&quot;checkbox&quot; id=&quot;rightSideSet&quot; onclick=&quot;toggleRightside()&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;div class=&quot;content&quot; style=&quot;display:flex&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;div class=&quot;content-text&quot; style=&quot;font-weight:bold; padding-left:10px&quot;&gt; 帧率监测 (刷新生效) &lt;/div&gt;&lt;input type=&quot;checkbox&quot; id=&quot;fpson&quot; onclick=&quot;fpssw()&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;div class=&quot;content-text&quot; style=&quot;font-weight:bold; padding-left:20px&quot;&gt; 必应每日壁纸 &lt;/div&gt;&lt;input type=&quot;checkbox&quot; id=&quot;bingSet&quot; onclick=&quot;setBing()&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h2&gt;二、字体设置&lt;/h2&gt;</span></span><br><span class="line"><span class="string">&#123;% note warning modern %&#125;非商免字体未经授权只能个人使用。本站为完全非商业、非盈利性质的网站，平时用于个人学习交流，如有侵权请联系站长删除，谢谢！ —— 致版权方&#123;% endnote %&#125;</span></span><br><span class="line"><span class="string">&lt;p id=&quot;swfs&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;a class=&quot;swf&quot; id=&quot;swf_ZhuZiAWan&quot; href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; style=&quot;font-family:&#x27;ZhuZiAWan&#x27;!important;color:black&quot; onclick=&quot;setFont(&#x27;ZhuZiAWan&#x27;)&quot;&gt;筑紫A丸标准体2.0&lt;/a&gt;</span></span><br><span class="line"><span class="string">&lt;a class=&quot;swf&quot; id=&quot;swf_default&quot; href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; style=&quot;font-family:-apple-system, IBM Plex Mono ,monosapce,&#x27;微软雅黑&#x27;, sans-serif;!important;color:black&quot; onclick=&quot;setFont(&#x27;default&#x27;)&quot;&gt;系统默认&lt;/a&gt;</span></span><br><span class="line"><span class="string">&lt;/p&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h2&gt;三、主题色设置&lt;/h2&gt;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;content&quot; style=&quot;display:flex&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;red&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;red&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;orange&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;orange&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;yellow&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;yellow&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;green&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;green&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;blue&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;blue&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;heoblue&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;heoblue&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;darkblue&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;darkblue&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;purple&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;purple&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;pink&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;pink&#x27;)&quot; checked=&quot;checked&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;black&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;black&#x27;)&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;blackgray&quot; name=&quot;colors&quot; value=&quot; &quot;</span></span><br><span class="line"><span class="string">        onclick=&quot;setColor(&#x27;blackgray&#x27;)&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h2&gt;四、背景设置&lt;/h2&gt;</span></span><br><span class="line"><span class="string">&lt;center&gt;&lt;button onclick=&quot;resetBg()&quot; style=&quot;background:var(--theme-color);display:block;width:35%;padding:15px 0;border-radius:30px;color:white;&quot;&gt;&lt;i class=&quot;fa-solid fa-arrows-rotate&quot;&gt;&lt;/i&gt;&amp;nbsp;恢复默认背景&lt;/button&gt;&lt;/center&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h3&gt;1. 二次元&lt;/h3&gt;</span></span><br><span class="line"><span class="string">&#123;% folding cyan, 查看二次元背景 %&#125;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;bgbox&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;a href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; style=&quot;background-image:url(https://sourcebucket.s3.ladydaily.com/img/home_bg.webp)&quot; class=&quot;imgbox&quot; onclick=&quot;changeBg(&#x27;url(https\://sourcebucket.s3.ladydaily.com/img/home_bg.webp)&#x27;)&quot;&gt;&lt;/a&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string">&#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h3&gt;2. 风景&lt;/h3&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&#123;% folding cyan, 查看风景背景 %&#125;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;bgbox&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;a href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; style=&quot;background-image:url(https://sourcebucket.s3.ladydaily.com/img/fj1.webp)&quot; class=&quot;imgbox&quot; onclick=&quot;changeBg(&#x27;url(https://sourcebucket.s3.ladydaily.com/img/fj1.webp)&#x27;)&quot;&gt;&lt;/a&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string">&#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h3&gt;3. 萌宠&lt;/h3&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&#123;% folding cyan, 查看萌宠背景 %&#125;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;bgbox&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;a href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; style=&quot;background-image:url(https://sourcebucket.s3.ladydaily.com/img/mc1.webp)&quot; class=&quot;imgbox&quot; onclick=&quot;changeBg(&#x27;url(https://sourcebucket.s3.ladydaily.com/img/mc1.webp)&#x27;)&quot;&gt;&lt;/a&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string">&#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h3&gt;4. 渐变色&lt;/h3&gt;</span></span><br><span class="line"><span class="string">&#123;% folding cyan, 查看渐变色背景 %&#125;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;bgbox&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;a href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; class=&quot;box&quot; style=&quot;background: linear-gradient(to top, #355c7d, #6c5b7b, #c06c84)&quot; onclick=&quot;changeBg(&#x27;linear-gradient(to top, #355c7d, #6c5b7b, #c06c84)&#x27;)&quot;&gt;&lt;/a&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string">&#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h3&gt;5. 纯色&lt;/h3&gt;</span></span><br><span class="line"><span class="string">&#123;% folding cyan, 查看纯色背景 %&#125;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;bgbox&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;a href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; class=&quot;box&quot; style=&quot;background: #f7eff5&quot; onclick=&quot;changeBg(&#x27;#f7eff5&#x27;)&quot;&gt;&lt;/a&gt;  </span></span><br><span class="line"><span class="string">&lt;input type=&quot;color&quot; id=&quot;colors&quot; href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; class=&quot;box&quot; autocomplete=&quot;on&quot; value=&quot;<span class="subst">$&#123;defineColor&#125;</span>&quot; oninput=&quot;changeBgColor()&quot;&gt;&lt;/input&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string">&#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h3&gt;6. 适配手机&lt;/h3&gt;</span></span><br><span class="line"><span class="string">&#123;% folding cyan, 查看适配手机的背景 %&#125;</span></span><br><span class="line"><span class="string">&lt;div class=&quot;bgbox&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;a href=&quot;javascript:;&quot; rel=&quot;noopener external nofollow&quot; style=&quot;background-image:url(https://sourcebucket.s3.ladydaily.com/img/mb4.webp)&quot; class=&quot;pimgbox&quot; onclick=&quot;changeBg(&#x27;url(https\://sourcebucket.s3.ladydaily.com/img/mb4.webp)&#x27;)&quot;&gt;&lt;/a&gt;</span></span><br><span class="line"><span class="string">&#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;h3&gt;7. 自定义背景&lt;/h3&gt;</span></span><br><span class="line"><span class="string">&#123;% folding cyan, 设置自定义背景 %&#125;</span></span><br><span class="line"><span class="string">&lt;p&gt;&lt;center&gt;</span></span><br><span class="line"><span class="string">&lt;input type=&quot;text&quot; id=&quot;pic-link&quot; size=&quot;70%&quot; maxlength=&quot;1000&quot; placeholder=&quot;请输入有效的图片链接，如 https://source.fomal.cc/img/home_bg.webp&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;/center&gt;&lt;/p&gt;</span></span><br><span class="line"><span class="string">&lt;p&gt;&lt;center&gt;</span></span><br><span class="line"><span class="string">&lt;button type=&quot;button&quot; onclick=&quot;getPicture()&quot; style=&quot;background:var(--theme-color);width:35%;padding: 5px 0px 7px 0px;border-radius:30px;color:white;line-height:2;&quot;&gt;🌈切换背景🌈&lt;/button&gt;</span></span><br><span class="line"><span class="string">&lt;/center&gt;&lt;/p&gt;</span></span><br><span class="line"><span class="string">&#123;% endfolding %&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;br&gt;</span></span><br><span class="line"><span class="string">&lt;center&gt;&lt;div style=&quot;font-size:1.2em;color:var(--theme-color);font-weight:bold;&quot;&gt;------ ( •̀ ω •́ )y 到底啦 ------&lt;/div&gt;&lt;/center&gt;</span></span><br><span class="line"><span class="string">&lt;br&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">`</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 打开小窗时候初始化</span></span><br><span class="line">  $(<span class="string">&quot;#&quot;</span> + <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;themeColor&quot;</span>)).<span class="title function_">attr</span>(<span class="string">&quot;checked&quot;</span>, <span class="literal">true</span>);</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;blur&quot;</span>) == <span class="number">1</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;blur&quot;</span>).<span class="property">checked</span> = <span class="literal">true</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;blur&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;universe&quot;</span>) == <span class="string">&quot;block&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;universeSet&quot;</span>).<span class="property">checked</span> = <span class="literal">true</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;universe&quot;</span>) == <span class="string">&quot;none&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;universeSet&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;fpson&quot;</span>) == <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;fpson&quot;</span>).<span class="property">checked</span> = <span class="literal">true</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;fpson&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;rs&quot;</span>) == <span class="string">&quot;block&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightSideSet&quot;</span>).<span class="property">checked</span> = <span class="literal">true</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;rs&quot;</span>) == <span class="string">&quot;none&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightSideSet&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;bing&quot;</span>) == <span class="string">&quot;true&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;bingSet&quot;</span>).<span class="property">checked</span> = <span class="literal">true</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;bingSet&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;light&quot;</span>) == <span class="string">&quot;true&quot;</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;lightSet&quot;</span>).<span class="property">checked</span> = <span class="literal">true</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;lightSet&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="title function_">setFontBorder</span>();</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 恢复默认背景</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">resetBg</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&#x27;blogbg&#x27;</span>);</span><br><span class="line">  <span class="title function_">reload</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 恢复默认设置并刷新页面</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">reset</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="title function_">clearItem</span>();</span><br><span class="line">  <span class="title function_">reload</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 适应窗口大小</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">winResize</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">var</span> offsetWid = <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">clientWidth</span>;</span><br><span class="line">    <span class="keyword">if</span> (offsetWid &lt;= <span class="number">768</span>) &#123;</span><br><span class="line">      winbox.<span class="title function_">resize</span>(offsetWid * <span class="number">0.95</span> + <span class="string">&quot;px&quot;</span>, <span class="string">&quot;90%&quot;</span>).<span class="title function_">move</span>(<span class="string">&quot;center&quot;</span>, <span class="string">&quot;center&quot;</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      winbox.<span class="title function_">resize</span>(offsetWid * <span class="number">0.6</span> + <span class="string">&quot;px&quot;</span>, <span class="string">&quot;70%&quot;</span>).<span class="title function_">move</span>(<span class="string">&quot;center&quot;</span>, <span class="string">&quot;center&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">    <span class="comment">// console.log(&quot;Pjax毒瘤抽风运行winResize方法🙄🙄🙄&quot;);</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 切换状态，窗口已创建则控制窗口显示和隐藏，没窗口则创建窗口</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">toggleWinbox</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;#meihuaBox&quot;</span>)) &#123;</span><br><span class="line">    winbox.<span class="title function_">toggleClass</span>(<span class="string">&quot;hide&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="title function_">createWinbox</span>();</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>做如下修改，注意：主体js文件最后才引入，因为要依赖其他js，当然也可以整合在一起：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 背景由js指定</span></span><br><span class="line"><span class="attr">background:</span></span><br><span class="line">  <span class="attr">default:</span> <span class="string">var(--default-bg)</span></span><br><span class="line">  <span class="attr">darkmode:</span> <span class="string">var(--darkmode-bg)</span></span><br><span class="line">  <span class="attr">mobileday:</span> <span class="string">var(--mobileday-bg)</span></span><br><span class="line">  <span class="attr">mobilenight:</span> <span class="string">var(--mobilenight-bg)</span></span><br><span class="line">  </span><br><span class="line"><span class="comment"># 字体由js指定  </span></span><br><span class="line"><span class="attr">font:</span></span><br><span class="line">  <span class="attr">global-font-size:</span> <span class="string">&quot;15px&quot;</span></span><br><span class="line">  <span class="attr">code-font-size:</span> <span class="string">&quot;14px&quot;</span></span><br><span class="line">  <span class="attr">font-family:</span> <span class="string">var(--global-font),</span> <span class="string">-apple-system,</span> <span class="string">&#x27;Quicksand&#x27;</span><span class="string">,</span> <span class="string">&#x27;Nimbus Roman No9 L&#x27;</span><span class="string">,</span> <span class="string">&#x27;PingFang SC&#x27;</span><span class="string">,</span> <span class="string">&#x27;Hiragino Sans GB&#x27;</span><span class="string">,</span> <span class="string">&#x27;Noto Serif SC&#x27;</span><span class="string">,</span> <span class="string">&#x27;Microsoft Yahei&#x27;</span><span class="string">,</span> <span class="string">&#x27;WenQuanYi Micro Hei&#x27;</span><span class="string">,</span> <span class="string">&#x27;ST Heiti&#x27;</span><span class="string">,</span> <span class="string">sans-serif;</span></span><br><span class="line">  <span class="attr">code-font-family:</span> <span class="string">Consolas_1,</span> <span class="string">var(--global-font),</span> <span class="string">&quot;Microsoft YaHei&quot;</span><span class="string">,</span> <span class="string">Menlo,</span> <span class="string">&quot;PingFang SC&quot;</span><span class="string">,</span> <span class="string">&quot;Microsoft JhengHei&quot;</span><span class="string">,</span> <span class="string">sans-serif</span></span><br><span class="line"></span><br><span class="line"><span class="attr">blog_title_font:</span></span><br><span class="line">  <span class="attr">font_link:</span></span><br><span class="line">  <span class="attr">font-family:</span> <span class="string">var(--global-font)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 主题色由js指定，因此部分需要留空，避免冗余加载  </span></span><br><span class="line"><span class="attr">theme_color:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">main:</span> </span><br><span class="line">  <span class="attr">paginator:</span> </span><br><span class="line">  <span class="attr">button_hover:</span> </span><br><span class="line">  <span class="attr">text_selection:</span> </span><br><span class="line">  <span class="attr">link_color:</span> <span class="string">&quot;#a591e0&quot;</span></span><br><span class="line">  <span class="attr">meta_color:</span> <span class="string">&quot;#858585&quot;</span></span><br><span class="line">  <span class="attr">hr_color:</span> <span class="string">&quot;#A4D8FA&quot;</span></span><br><span class="line">  <span class="attr">code_foreground:</span> </span><br><span class="line">  <span class="attr">code_background:</span> </span><br><span class="line">  <span class="attr">toc_color:</span> </span><br><span class="line">  <span class="attr">blockquote_padding_color:</span> </span><br><span class="line">  <span class="attr">blockquote_background_color:</span> </span><br><span class="line">  <span class="attr">scrollbar_color:</span> </span><br><span class="line">  <span class="attr">meta_theme_color_light:</span> <span class="string">&quot;ffffff&quot;</span></span><br><span class="line">  <span class="attr">meta_theme_color_dark:</span> <span class="string">&quot;#0d0d0d&quot;</span>  </span><br><span class="line"></span><br><span class="line"><span class="comment"># 引入部分样式与依赖</span></span><br><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span> </span><br><span class="line">  <span class="string">...</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;style</span> <span class="string">id=&quot;themeColor&quot;&gt;&lt;/style&gt;</span> <span class="comment"># 主题色</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;style</span> <span class="string">id=&quot;rightSide&quot;&gt;&lt;/style&gt;</span> <span class="comment"># 侧边栏</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;style</span> <span class="string">id=&quot;transPercent&quot;&gt;&lt;/style&gt;</span> <span class="comment"># 透明度调节</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;style</span> <span class="string">id=&quot;blurNum&quot;&gt;&lt;/style&gt;</span> <span class="comment"># 模糊半径调节</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;style</span> <span class="string">id=&quot;settingStyle&quot;&gt;&lt;/style&gt;</span> <span class="comment"># 模糊效果开关</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;span</span> <span class="string">id=&quot;fps&quot;&gt;&lt;/span&gt;</span> <span class="comment"># 帧率检测</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;style</span> <span class="string">id=&quot;defineBg&quot;&gt;&lt;/style&gt;</span> <span class="comment"># 自定义背景选项</span></span><br><span class="line">  <span class="attr">bottom:</span> </span><br><span class="line">  <span class="string">...</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">src=&quot;https://cdn1.tianli0.top/gh/nextapps-de/winbox/dist/winbox.bundle.min.js&quot;&gt;&lt;/script&gt;</span> <span class="comment"># winbox支持</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">data-pjax</span> <span class="string">src=&quot;/static/js/meihua.js&quot;&gt;&lt;/script&gt;</span> <span class="comment"># 美化模块    </span></span><br></pre></td></tr></table></figure></li><li><p>在自定义的<code>custom.css</code>中加入如下代码，注意部分需要自己修改(字体引入与前面的js文件的逻辑对应，可以1设置多个字体，那你的js的<code>winbox.body.innerHTML</code>就要写上多个选项)，这里的css基本做好了分区，细节的自行研究一下：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* root伪类指定全局颜色(照抄) */</span></span><br><span class="line"><span class="selector-pseudo">:root</span> &#123;</span><br><span class="line">  <span class="attr">--blue-custom</span>: <span class="number">#5ea6e5</span>;</span><br><span class="line">  <span class="attr">--loading-color</span>: <span class="built_in">rgba</span>(<span class="number">207</span>, <span class="number">246</span>, <span class="number">247</span>, <span class="number">0.92</span>);</span><br><span class="line">  <span class="attr">--border-color</span>: <span class="number">#c9c9c9</span>;</span><br><span class="line">  <span class="attr">--color-red</span>: <span class="built_in">rgb</span>(<span class="number">241</span>, <span class="number">71</span>, <span class="number">71</span>);</span><br><span class="line">  <span class="attr">--color-orange</span>: <span class="built_in">rgb</span>(<span class="number">241</span>, <span class="number">162</span>, <span class="number">71</span>);</span><br><span class="line">  <span class="attr">--color-yellow</span>: <span class="built_in">rgb</span>(<span class="number">241</span>, <span class="number">238</span>, <span class="number">71</span>);</span><br><span class="line">  <span class="attr">--color-purple</span>: <span class="built_in">rgb</span>(<span class="number">179</span>, <span class="number">71</span>, <span class="number">241</span>);</span><br><span class="line">  <span class="attr">--color-blue</span>: <span class="built_in">rgb</span>(<span class="number">102</span>, <span class="number">204</span>, <span class="number">255</span>);</span><br><span class="line">  <span class="attr">--color-gray</span>: <span class="built_in">rgb</span>(<span class="number">226</span>, <span class="number">226</span>, <span class="number">226</span>);</span><br><span class="line">  <span class="attr">--color-green</span>: <span class="built_in">rgb</span>(<span class="number">57</span>, <span class="number">197</span>, <span class="number">187</span>);</span><br><span class="line">  <span class="attr">--color-whitegray</span>: <span class="built_in">rgb</span>(<span class="number">241</span>, <span class="number">241</span>, <span class="number">241</span>);</span><br><span class="line">  <span class="attr">--color-pink</span>: <span class="built_in">rgb</span>(<span class="number">237</span>, <span class="number">112</span>, <span class="number">155</span>);</span><br><span class="line">  <span class="attr">--color-black</span>: <span class="built_in">rgb</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">  <span class="attr">--color-darkblue</span>: <span class="built_in">rgb</span>(<span class="number">97</span>, <span class="number">100</span>, <span class="number">159</span>);</span><br><span class="line">  <span class="attr">--color-heoblue</span>: <span class="built_in">rgb</span>(<span class="number">66</span>, <span class="number">90</span>, <span class="number">239</span>);</span><br><span class="line">  <span class="attr">--btn-bg</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attr">--scrollbar-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attr">--border-style</span>: <span class="number">1px</span> solid <span class="built_in">rgba</span>(<span class="number">169</span>, <span class="number">169</span>, <span class="number">169</span>, <span class="number">0.7</span>);</span><br><span class="line">  <span class="comment">/* 菜单栏悬浮带透明度的颜色 初始为rgba(73, 205, 245, 0.7) 已由js设置*/</span></span><br><span class="line">  <span class="comment">/* 代码框行数背景色 */</span></span><br><span class="line">  <span class="attr">--hlnumber-bg</span>: <span class="number">#282c34</span>;</span><br><span class="line">  <span class="comment">/* 代码框顶部背景色 */</span></span><br><span class="line">  <span class="attr">--hltools-bg</span>: <span class="number">#1c1c1c</span>;</span><br><span class="line">  <span class="comment">/* 代码框背景色 */</span></span><br><span class="line">  <span class="attr">--hl-bg</span>: <span class="number">#282c34</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 字体引入（这里需要根据你自己想要待选的字体进行引入） */</span></span><br><span class="line"><span class="keyword">@font-face</span> &#123;</span><br><span class="line">  <span class="attribute">font-family</span>: xxx;</span><br><span class="line">  <span class="attribute">src</span>: <span class="built_in">url</span>(<span class="string">xxx</span>);</span><br><span class="line">  <span class="attribute">font-display</span>: swap;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* winbox样式(这块照抄即可) */</span></span><br><span class="line"><span class="selector-class">.winbox</span> &#123;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.wb-body</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#e5f1f5</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.wb-full</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.wb-min</span> &#123;</span><br><span class="line">  <span class="attribute">background-position</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.wb-body</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#changeBgBox</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#333</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.bgbox</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">flex-wrap</span>: wrap;</span><br><span class="line">  <span class="attribute">justify-content</span>: space-between;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.pimgbox</span>,</span><br><span class="line"><span class="selector-class">.imgbox</span>,</span><br><span class="line"><span class="selector-class">.box</span> &#123;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100px</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">166px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">10px</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">background-size</span>: cover;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.pimgbox</span>,</span><br><span class="line"><span class="selector-class">.imgbox</span> &#123;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.imgbox</span><span class="selector-pseudo">:hover</span>,</span><br><span class="line"><span class="selector-class">.pimgbox</span><span class="selector-pseudo">:hover</span>,</span><br><span class="line"><span class="selector-class">.box</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--text-bg-hover);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.pimgbox</span> &#123;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">240px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.imgbox</span> &#123;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">95px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line">  <span class="comment">/* 背景 */</span></span><br><span class="line">  <span class="selector-class">.pimgbox</span>,</span><br><span class="line">  <span class="selector-class">.imgbox</span>,</span><br><span class="line">  <span class="selector-class">.box</span> &#123;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">73px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">135px</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.pimgbox</span> &#123;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">205px</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* 2.0新增内容 */</span></span><br><span class="line">  <span class="selector-class">.wb-min</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-id">#changeBgBox</span> <span class="selector-class">.wb-body</span>::-webkit-scrollbar &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 主题色适配覆盖区域 */</span></span><br><span class="line"><span class="selector-class">.category-lists</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">0.215em</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-tag">blockquote</span> &#123;</span><br><span class="line">  <span class="attribute">border-left</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-class">.highlight-tools</span> <span class="selector-class">.copy-button</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.error404</span> <span class="selector-id">#error-wrap</span> <span class="selector-class">.error-content</span> <span class="selector-class">.error-img</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.article-sort-title</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">order</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-class">.year</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">border-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.article-sort-item-title</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.category-lists</span> <span class="selector-class">.category-list</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#recent-posts</span> &gt; <span class="selector-class">.recent-post-item</span> &gt; <span class="selector-class">.recent-post-info</span> &gt; <span class="selector-class">.article-title</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#recent-posts</span></span><br><span class="line">  &gt; <span class="selector-class">.recent-post-item</span></span><br><span class="line">  &gt; <span class="selector-class">.recent-post-info</span></span><br><span class="line">  &gt; <span class="selector-class">.article-meta-wrap</span></span><br><span class="line">  <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tag-cloud-list</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#aside-content</span> <span class="selector-class">.card-tag-cloud</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#aside-content</span> <span class="selector-class">.aside-list</span> &gt; <span class="selector-class">.aside-list-item</span> <span class="selector-class">.content</span> &gt; <span class="selector-class">.comment</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#aside-content</span> <span class="selector-id">#card-toc</span> <span class="selector-class">.toc-content</span> <span class="selector-class">.toc-link</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  scale: <span class="number">1.03</span>;</span><br><span class="line">&#125;</span><br><span class="line">*<span class="selector-pseudo">::selection</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#aside-content</span> <span class="selector-id">#card-toc</span> <span class="selector-class">.toc-content</span> <span class="selector-class">.toc-link</span><span class="selector-class">.active</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#aside-content</span> <span class="selector-id">#card-toc</span> <span class="selector-class">.toc-content</span> <span class="selector-class">.toc-link</span><span class="selector-class">.active</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#fefefe</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.site-data</span> &gt; <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> <span class="selector-tag">div</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#post-comment</span> <span class="selector-class">.comment-head</span> <span class="selector-id">#comment-switch</span> <span class="selector-class">.first-comment</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#post-comment</span> <span class="selector-class">.comment-head</span> <span class="selector-id">#comment-switch</span> <span class="selector-class">.switch-btn</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#page-header</span><span class="selector-class">.nav-fixed</span> <span class="selector-id">#nav</span> <span class="selector-id">#toggle-menu</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#post-info</span> <span class="selector-id">#post-meta</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#pagination</span> <span class="selector-class">.page-number</span><span class="selector-class">.current</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">h1</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span>,</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">h2</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span>,</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">h3</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span>,</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">h4</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span>,</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">h5</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span>,</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">h6</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-tag">li</span><span class="selector-pseudo">::marker</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#post</span> <span class="selector-class">.tag_share</span> <span class="selector-class">.post-meta__tags</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#post</span> <span class="selector-class">.tag_share</span> <span class="selector-class">.post-meta__tags</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#post</span> <span class="selector-class">.post-copyright</span> <span class="selector-class">.post-copyright-meta</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#post</span> <span class="selector-class">.post-copyright-cc-info</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#waline-wrap</span> &#123;</span><br><span class="line">  <span class="attr">--waline-theme-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.hide-inline</span> &gt; <span class="selector-class">.hide-button</span>,</span><br><span class="line"><span class="selector-class">.hide-block</span> &gt; <span class="selector-class">.hide-button</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-class">.tabs</span> &gt; <span class="selector-class">.nav-tabs</span> &gt; <span class="selector-class">.tab</span><span class="selector-class">.active</span> <span class="selector-tag">button</span> &#123;</span><br><span class="line">  <span class="attribute">border-top</span>: <span class="number">2px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-class">.timeline</span> &#123;</span><br><span class="line">  <span class="attribute">border-left</span>: <span class="number">2px</span> solid <span class="built_in">var</span>(--timeline-color, <span class="built_in">var</span>(--theme-color));</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#article-container</span> <span class="selector-class">.timeline</span> <span class="selector-class">.timeline-item</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.item-circle</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">border-color</span>: <span class="built_in">var</span>(--timeline-color, <span class="built_in">var</span>(--theme-color));</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#article-container</span></span><br><span class="line">  <span class="selector-class">.timeline</span></span><br><span class="line">  <span class="selector-class">.timeline-item</span><span class="selector-class">.headline</span></span><br><span class="line">  <span class="selector-class">.timeline-item-title</span></span><br><span class="line">  <span class="selector-class">.item-circle</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">4px</span> solid <span class="built_in">var</span>(--timeline-color, <span class="built_in">var</span>(--theme-color));</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.search-dialog</span> <span class="selector-class">.search-nav</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.search-dialog</span> <span class="selector-class">.search-nav</span> <span class="selector-class">.search-close-button</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#local-search</span> <span class="selector-class">.search-dialog</span> <span class="selector-class">.local-search-box</span> <span class="selector-tag">input</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">2px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#local-search</span> <span class="selector-class">.search-dialog</span> <span class="selector-class">.local-search__hit-item</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#local-search</span> <span class="selector-class">.search-dialog</span> <span class="selector-class">.local-search__hit-item</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#nav</span> *<span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort</span> &#123;</span><br><span class="line">  <span class="attribute">border-left</span>: <span class="number">2px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-title</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 背景图片链接输入框placeholder*/</span></span><br><span class="line"><span class="selector-tag">input</span><span class="selector-id">#pic-link</span>::-webkit-input-placeholder &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">150</span>, <span class="number">150</span>, <span class="number">150</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">input</span><span class="selector-id">#pic-link</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">82%</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">5px</span> <span class="number">10px</span> <span class="number">5px</span> <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">2</span>;</span><br><span class="line">  <span class="attribute">outline</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 开关按钮 */</span></span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">37px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#000000</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#fdfdfd</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span><br><span class="line">  <span class="attribute">background-clip</span>: content-box;</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  -webkit-appearance: none;</span><br><span class="line">  user-select: none;</span><br><span class="line">  <span class="attribute">outline</span>: none;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">5px</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">14px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">14px</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">2px</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">3px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#000</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">border-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:checked</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">19px</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: white <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span> &#123;</span><br><span class="line">  <span class="attribute">transition</span>: border background-color box-shadow;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">transition</span>: left <span class="number">0.2s</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:checked</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">transition</span>: left <span class="number">0.2s</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:checked</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0.8</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:active</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#666666</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">border-color</span>: <span class="number">#666666</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.settings</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;checkbox&quot;</span>]</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: white <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.content-text</span> &#123;</span><br><span class="line">  <span class="attribute">margin-right</span>: <span class="number">5px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 透明度和模糊半径滑块 */</span></span><br><span class="line"><span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;range&quot;</span>]</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  -webkit-appearance: none;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#bdc3c7</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">5px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">3px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span> auto;</span><br><span class="line">  <span class="attribute">outline</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;range&quot;</span>]</span>::-webkit-slider-thumb &#123;</span><br><span class="line">  -webkit-appearance: none;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">15px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">100</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.range</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">300px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">20px</span> <span class="number">0px</span> <span class="number">32px</span> <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rang_width</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0px</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0px</span>;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">5px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 首页文章卡片 */</span></span><br><span class="line"><span class="selector-id">#recent-posts</span> &gt; <span class="selector-class">.recent-post-item</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-light);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">25px</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="built_in">var</span>(--border-style);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 首页侧栏卡片 */</span></span><br><span class="line"><span class="selector-id">#aside-content</span> <span class="selector-class">.card-widget</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-light);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">18px</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="built_in">var</span>(--border-style);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 文章页、归档页、普通页面 */</span></span><br><span class="line"><span class="selector-tag">div</span><span class="selector-id">#post</span>,</span><br><span class="line"><span class="selector-tag">div</span><span class="selector-id">#page</span>,</span><br><span class="line"><span class="selector-tag">div</span><span class="selector-id">#archive</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-light);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">border</span>: <span class="built_in">var</span>(--border-style);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 导航栏颜色 */</span></span><br><span class="line"><span class="selector-id">#page-header</span><span class="selector-class">.nav-fixed</span> <span class="selector-id">#nav</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">linear-gradient</span>(<span class="number">60deg</span>, <span class="number">#ffd7e4</span> <span class="number">0</span>, <span class="number">#c8f1ff</span> <span class="number">93%</span>);</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0.95</span>;</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#page-header</span><span class="selector-class">.nav-fixed</span> <span class="selector-id">#nav</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.95</span>) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 夜间模式遮罩 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#recent-posts</span> &gt; <span class="selector-class">.recent-post-item</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#aside-content</span> <span class="selector-class">.card-widget</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-tag">div</span><span class="selector-id">#post</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-tag">div</span><span class="selector-id">#archive</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-tag">div</span><span class="selector-id">#page</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-dark);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 调节字体显示栏目 */</span></span><br><span class="line"><span class="selector-id">#swfs</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">flex-wrap</span>: wrap;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.swf</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: white;</span><br><span class="line">  <span class="comment">/* 字体选择框边界由js指定 */</span></span><br><span class="line">  <span class="comment">/* border: 2px solid var(--border-color); */</span></span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">10px</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.swf</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--text-bg-hover);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 主题色选择按钮 */</span></span><br><span class="line"><span class="selector-tag">input</span><span class="selector-attr">[name=<span class="string">&quot;colors&quot;</span>]</span> &#123;</span><br><span class="line">  <span class="attribute">margin-right</span>: <span class="number">15px</span>;</span><br><span class="line">  <span class="attribute">min-width</span>: <span class="number">1rem</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">1rem</span>;</span><br><span class="line">  appearance: none;</span><br><span class="line">  -webkit-appearance: none;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#red</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-red);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#orange</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-orange);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#yellow</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-yellow);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#green</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-green);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#blue</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-blue);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#purple</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-purple);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#pink</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-pink);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#heoblue</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-heoblue);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#darkblue</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-darkblue);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#black</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-black);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#blackgray</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-blackgray);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#purple</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-purple);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-purple);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#red</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-red);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-red);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#orange</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-orange);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-orange);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#yellow</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-yellow);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-yellow);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#green</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-green);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-green);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#blue</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-blue);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-blue);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#pink</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-pink);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-pink);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#heoblue</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-heoblue);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-heoblue);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#darkblue</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-darkblue);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-darkblue);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#black</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-black);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-black);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#blackgray</span><span class="selector-pseudo">:checked</span> &#123;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span> <span class="number">#fff</span> inset;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--color-blackgray);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--color-blackgray);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>要注意的是：现在给了美化模块最高的操作优先级，因此其他的默认设置可以去掉</p><p>星空背景的逻辑由js指定，因此<code>#universe</code>的<code>display</code>属性需要空着：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#universe</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>霓虹灯的计时器也要删除，修改<code>cursor.js</code>，删掉启动计时器的部分逻辑：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">// 开启计时器</span><br><span class="line"><span class="deletion">-window.onload = setInterval(changeColor, 1200);</span></span><br></pre></td></tr></table></figure><p>同时为了适配主题色，拖尾鼠标的<code>cursor.js</code>修改为以下的代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> <span class="variable constant_">CURSOR</span>;</span><br><span class="line"></span><br><span class="line"><span class="title class_">Math</span>.<span class="property">lerp</span> = <span class="function">(<span class="params">a, b, n</span>) =&gt;</span> (<span class="number">1</span> - n) * a + n * b;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getStyle2</span> = (<span class="params">el, attr</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">window</span>.<span class="property">getComputedStyle</span></span><br><span class="line">            ? <span class="variable language_">window</span>.<span class="title function_">getComputedStyle</span>(el)[attr]</span><br><span class="line">            : el.<span class="property">currentStyle</span>[attr];</span><br><span class="line">    &#125; <span class="keyword">catch</span> (e) &#123;&#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 为了屏蔽异步加载导致无法读取颜色值，这里统一用哈希表预处理</span></span><br><span class="line"><span class="keyword">const</span> map = <span class="keyword">new</span> <span class="title class_">Map</span>();</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;red&#x27;</span>, <span class="string">&quot;rgb(241, 71, 71)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;orange&#x27;</span>, <span class="string">&quot;rgb(241, 162, 71)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;yellow&#x27;</span>, <span class="string">&quot;rgb(241, 238, 71)&quot;</span>)</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;purple&#x27;</span>, <span class="string">&quot;rgb(179, 71, 241)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;blue&#x27;</span>, <span class="string">&quot;rgb(102, 204, 255)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;gray&#x27;</span>, <span class="string">&quot;rgb(226, 226, 226)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;green&#x27;</span>, <span class="string">&quot;rgb(57, 197, 187)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;whitegray&#x27;</span>, <span class="string">&quot;rgb(241, 241, 241)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;pink&#x27;</span>, <span class="string">&quot;rgb(237, 112, 155)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;black&#x27;</span>, <span class="string">&quot;rgb(0, 0, 0)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;darkblue&#x27;</span>, <span class="string">&quot;rgb(97, 100, 159)&quot;</span>);</span><br><span class="line">map.<span class="title function_">set</span>(<span class="string">&#x27;heoblue&#x27;</span>, <span class="string">&quot;rgb(66, 90, 239)&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Cursor</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pos</span> = &#123;<span class="attr">curr</span>: <span class="literal">null</span>, <span class="attr">prev</span>: <span class="literal">null</span>&#125;;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pt</span> = [];</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">create</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">init</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">render</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">move</span>(<span class="params">left, top</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">style</span>[<span class="string">&quot;left&quot;</span>] = <span class="string">`<span class="subst">$&#123;left&#125;</span>px`</span>;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">style</span>[<span class="string">&quot;top&quot;</span>] = <span class="string">`<span class="subst">$&#123;top&#125;</span>px`</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">create</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="variable language_">this</span>.<span class="property">cursor</span>) &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">cursor</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;div&quot;</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">id</span> = <span class="string">&quot;cursor&quot;</span>;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;hidden&quot;</span>);</span><br><span class="line">            <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">append</span>(<span class="variable language_">this</span>.<span class="property">cursor</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> el = <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&#x27;*&#x27;</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; el.<span class="property">length</span>; i++)</span><br><span class="line">            <span class="keyword">if</span> (<span class="title function_">getStyle2</span>(el[i], <span class="string">&quot;cursor&quot;</span>) == <span class="string">&quot;pointer&quot;</span>)</span><br><span class="line">                <span class="variable language_">this</span>.<span class="property">pt</span>.<span class="title function_">push</span>(el[i].<span class="property">outerHTML</span>);</span><br><span class="line">        <span class="comment">// 为了防止出现黑色鼠标的情况，优先在这里对主题色进行赋值</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;themeColor&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">            <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;themeColor&quot;</span>, <span class="string">&quot;green&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">var</span> colorVal = map.<span class="title function_">get</span>(<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;themeColor&quot;</span>));</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>((<span class="variable language_">this</span>.<span class="property">scr</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;style&quot;</span>)));</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">scr</span>.<span class="property">innerHTML</span> = <span class="string">`* &#123;cursor: url(&quot;data:image/svg+xml,&lt;svg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 8 8&#x27; width=&#x27;8px&#x27; height=&#x27;8px&#x27;&gt;&lt;circle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;4&#x27; opacity=&#x27;1.0&#x27; fill=&#x27;`</span>+ colorVal + <span class="string">`&#x27;/&gt;&lt;/svg&gt;&quot;) 4 4, auto&#125;`</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">refresh</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">scr</span>.<span class="title function_">remove</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hover&quot;</span>);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;active&quot;</span>);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pos</span> = &#123;<span class="attr">curr</span>: <span class="literal">null</span>, <span class="attr">prev</span>: <span class="literal">null</span>&#125;;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pt</span> = [];</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">create</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">init</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">render</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">init</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseover</span>  = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">pt</span>.<span class="title function_">includes</span>(e.<span class="property">target</span>.<span class="property">outerHTML</span>) &amp;&amp; <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;hover&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseout</span>   = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">pt</span>.<span class="title function_">includes</span>(e.<span class="property">target</span>.<span class="property">outerHTML</span>) &amp;&amp; <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hover&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmousemove</span>  = <span class="function"><span class="params">e</span> =&gt;</span> &#123;(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span> == <span class="literal">null</span>) &amp;&amp; <span class="variable language_">this</span>.<span class="title function_">move</span>(e.<span class="property">clientX</span> - <span class="number">8</span>, e.<span class="property">clientY</span> - <span class="number">8</span>); <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span> = &#123;<span class="attr">x</span>: e.<span class="property">clientX</span> - <span class="number">8</span>, <span class="attr">y</span>: e.<span class="property">clientY</span> - <span class="number">8</span>&#125;; <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hidden&quot;</span>);&#125;;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseenter</span> = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hidden&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseleave</span> = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;hidden&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmousedown</span>  = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;active&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseup</span>    = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;active&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">render</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>) &#123;</span><br><span class="line">            <span class="comment">// 跟踪速度调节</span></span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">x</span> = <span class="title class_">Math</span>.<span class="title function_">lerp</span>(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">x</span>, <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span>.<span class="property">x</span>, <span class="number">0.15</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">y</span> = <span class="title class_">Math</span>.<span class="title function_">lerp</span>(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">y</span>, <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span>.<span class="property">y</span>, <span class="number">0.15</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="title function_">move</span>(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">x</span>, <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">y</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span> = <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title function_">requestAnimationFrame</span>(<span class="function">() =&gt;</span> <span class="variable language_">this</span>.<span class="title function_">render</span>());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="variable constant_">CURSOR</span> = <span class="keyword">new</span> <span class="title class_">Cursor</span>();</span><br><span class="line">    <span class="comment">// 需要重新获取列表时，使用 CURSOR.refresh()</span></span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure></li><li><p>到了这里你应该就有50%的概率成功了，重启项目试试：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure><p>不行怎么办？评论区留言吧！</p></li></ol><h2 id="3-后记">3.后记</h2><p>2022年的最后两天，基本上都在写博客文章，把之前魔改的坑基本上填上了。这篇文章可能也是最后一篇关于博客魔改方面的文章啦，毕竟站长不是搞这方面的，后面去搞Linux驱动开发的东西了，有什么疑问可以到评论区留言哈，祝大家新年快乐！——2022.12.31</p>]]></content>
    
    
    <summary type="html">🎨基于winbox的二次开发——综合美化模块教程</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>博客魔改教程总结(五)</title>
    <link href="https://www.fomal.cc/posts/d1927166.html"/>
    <id>https://www.fomal.cc/posts/d1927166.html</id>
    <published>2022-12-31T18:00:00.000Z</published>
    <updated>2023-01-03T13:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>魔改前必看（我当你们都懂了，太细节的就不写在教程中了🤣🤣🤣）</b></font></p><ol><li>博客魔改有风险，如果博客魔改出问题了又没有备份，可通过此项目查看基础源码进行<strong>回滚</strong>：<a href="https://github.com/jerryc127/hexo-theme-butterfly">jerryc127/hexo-theme-butterfly</a>、<a href="https://github.com/ccknbc-actions/blog-butterfly">ccknbc-actions/blog-butterfly</a>。</li><li>这部分魔改基本上都是大佬们造好的轮子，我按照大佬们的轮子结合自己的喜好进行魔改的，具体见我友人帐第一个栏目大佬们的网站，本处仅做一个总结，如有侵权请联系删除。</li><li>鉴于每个人的根目录名称都不一样，本帖<strong>博客根目录</strong>一律以<code>[BlogRoot]</code>指代。</li><li>本帖涉及魔改源码的内容，会使用<strong>diff代码块</strong>标识，复制时请<strong>不要忘记删除</strong>前面的<code>+、-</code>符号。</li><li>因为<code>.pug</code>和<code>.styl</code>以及<code>.yml</code>等对缩进要求较为严格，请尽量<strong>不要使用记事本等无法提供语法高亮的文本编辑器</strong>进行修改。</li><li>本帖基于<code>Butterfly主题</code>进行魔改方案编写，因此请读者优先掌握<a href="https://butterfly.js.org/">Butterfly主题官方文档</a>的内容后再来进行魔改。</li><li>魔改会过程常常引入<strong>自定义的css与js文件</strong>，方法见<a href="https://b.leonus.cn/2022/custom.html">Hexo博客添加自定义css和js文件</a>(太懒了不想自己写)</li></ol><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a> ⇦当前位置🪂</li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="网站恶搞标题">网站恶搞标题</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-10.webp" alt="image-10.webp"></p></div></div><ol><li><p>新建文件<code>[BlogRoot]\source\js\title.js</code>，写入以下内容：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//动态标题</span></span><br><span class="line"><span class="keyword">var</span> <span class="title class_">OriginTitile</span> = <span class="variable language_">document</span>.<span class="property">title</span>;</span><br><span class="line"><span class="keyword">var</span> titleTime;</span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;visibilitychange&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">hidden</span>) &#123;</span><br><span class="line">    <span class="comment">//离开当前页面时标签显示内容</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">title</span> = <span class="string">&#x27;👀跑哪里去了~&#x27;</span>;</span><br><span class="line">    <span class="built_in">clearTimeout</span>(titleTime);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="comment">//返回当前页面时标签显示内容</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">title</span> = <span class="string">&#x27;🐖抓到你啦～&#x27;</span>;</span><br><span class="line">    <span class="comment">//两秒后变回正常标题</span></span><br><span class="line">    titleTime = <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">      <span class="variable language_">document</span>.<span class="property">title</span> = <span class="title class_">OriginTitile</span>;</span><br><span class="line">    &#125;, <span class="number">2000</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>引入该文件：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script async src=&quot;/js/title.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="导航栏魔改增强版-LYX">导航栏魔改增强版(LYX)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考：<a href="https://yisous.xyz/posts/895003b5/">关于Butterfly的导航栏的一些教程</a></p><p>PS：修复了滚动后显示标题不居中的问题</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-11.webp" alt="image-11.webp"></p></div></div><ol><li><p>重构导航栏：修改<code>[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug</code>，替换成下面的代码，其中图标啥的自己改一下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">nav#nav</span><br><span class="line">  span#blog_name</span><br><span class="line">    a#site-name(href=url_for(&#x27;/&#x27;)) #[=config.title]</span><br><span class="line">    </span><br><span class="line">  #menus</span><br><span class="line">    !=partial(&#x27;includes/header/menu_item&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    //- 这两行是导航栏显示标题用的</span><br><span class="line">    center(id=&quot;name-container&quot;)</span><br><span class="line">      a(id=&quot;page-name&quot; href=&quot;javascript:scrollToTop()&quot;) PAGE_NAME</span><br><span class="line">      </span><br><span class="line">    #nav-right</span><br><span class="line">      if (theme.algolia_search.enable || theme.local_search.enable)</span><br><span class="line">        #search-button</span><br><span class="line">          a.search.faa-parent.animated-hover(title=&quot;检索站内任何你想要的信息&quot;)</span><br><span class="line">            svg.faa-tada.icon(style=&quot;height:24px;width:24px;fill:currentColor;position:relative;top:6px&quot; aria-hidden=&quot;true&quot;)</span><br><span class="line">              use(xlink:href=&#x27;#icon-valentine_-search-love-find-heart&#x27;)</span><br><span class="line">            span=&#x27; &#x27;+_p(&#x27;search.title&#x27;)    </span><br><span class="line"></span><br><span class="line">      //- 美化设置</span><br><span class="line">      a.meihua.faa-parent.animated-hover(onclick=&quot;toggleWinbox()&quot; title=&quot;美化设置-自定义你的风格&quot; id=&quot;meihua-button&quot;)</span><br><span class="line">        svg.faa-tada.icon(style=&quot;height:26px;width:26px;fill:currentColor;position:relative;top:8px&quot; aria-hidden=&quot;true&quot;)</span><br><span class="line">          use(xlink:href=&#x27;#icon-tupian1&#x27;)</span><br><span class="line"></span><br><span class="line">      //- 暗黑模式按钮</span><br><span class="line">      a.sun_moon.faa-parent.animated-hover(onclick=&#x27;switchNightMode()&#x27;,  title=_p(&#x27;rightside.night_mode_title&#x27;) id=&quot;nightmode-button&quot;)</span><br><span class="line">        svg.faa-tada(style=&quot;height:25px;width:25px;fill:currentColor;position:relative;top:7px&quot;, viewBox=&#x27;0 0 1024 1024&#x27;)</span><br><span class="line">          use#modeicon(xlink:href=&#x27;#icon-moon&#x27;)        </span><br><span class="line">        </span><br><span class="line">      #toggle-menu</span><br><span class="line">        a</span><br><span class="line">          i.fas.fa-bars.fa-fw</span><br></pre></td></tr></table></figure></li><li><p>标题增强：在<code>custom.css</code>加入如下代码，其中<code>var(--theme-color)</code>替换成你自己的主题色：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 标题增强 */</span></span><br><span class="line"><span class="selector-id">#site-name</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  -webkit-<span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  -moz-<span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  -ms-<span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  -o-<span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">transition</span>: <span class="number">0.3s</span>;</span><br><span class="line">  -webkit-<span class="attribute">transition</span>: <span class="number">0.3s</span>;</span><br><span class="line">  -moz-<span class="attribute">transition</span>: <span class="number">0.3s</span>;</span><br><span class="line">  -ms-<span class="attribute">transition</span>: <span class="number">0.3s</span>;</span><br><span class="line">  -o-<span class="attribute">transition</span>: <span class="number">0.3s</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">right</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&quot;\f015&quot;</span>;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">5px</span> <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">font-family</span>: <span class="string">&quot;Font Awesome 6 Free&quot;</span>;</span><br><span class="line">  <span class="attribute">text-align</span>: center;</span><br><span class="line">  <span class="attribute">color</span>: white;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">34px</span>; <span class="comment">/*如果有溢出或者垂直不居中的现象微调一下这个参数*/</span></span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">18px</span>; <span class="comment">/*根据个人喜好*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#site-name</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">  scale: <span class="number">1.03</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#site-name</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">24px</span>; <span class="comment">/*一定要把字体调大点，否则效果惨不忍睹！*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>顶栏常驻：在<code>custom.css</code>加入如下代码：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.nav-fixed</span> <span class="selector-id">#nav</span>&#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">58px</span>)<span class="meta">!important</span>;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">58px</span>)<span class="meta">!important</span>;</span><br><span class="line">    -moz-<span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">58px</span>)<span class="meta">!important</span>;</span><br><span class="line">    -ms-<span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">58px</span>)<span class="meta">!important</span>;</span><br><span class="line">    -o-<span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">58px</span>)<span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#nav</span>&#123;</span><br><span class="line">    <span class="attribute">transition</span>: none<span class="meta">!important</span>;</span><br><span class="line">    -webkit-<span class="attribute">transition</span>: none<span class="meta">!important</span>;</span><br><span class="line">    -moz-<span class="attribute">transition</span>: none<span class="meta">!important</span>;</span><br><span class="line">    -ms-<span class="attribute">transition</span>: none<span class="meta">!important</span>;</span><br><span class="line">    -o-<span class="attribute">transition</span>: none<span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>显示标题：新建<code>[BlogRoot]\source\js\nav.js</code>，并写入如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, tonav);</span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, tonav);</span><br><span class="line"><span class="comment">//响应pjax</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">tonav</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;name-container&quot;</span>).<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;display:none&quot;</span>);</span><br><span class="line">    <span class="keyword">var</span> position = $(<span class="variable language_">window</span>).<span class="title function_">scrollTop</span>();</span><br><span class="line">    $(<span class="variable language_">window</span>).<span class="title function_">scroll</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">var</span> scroll = $(<span class="variable language_">window</span>).<span class="title function_">scrollTop</span>();</span><br><span class="line">        <span class="keyword">if</span> (scroll &gt; position) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;name-container&quot;</span>).<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;&quot;</span>);</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;menus_items&quot;</span>)[<span class="number">1</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;display:none!important&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;menus_items&quot;</span>)[<span class="number">1</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;&quot;</span>);</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;name-container&quot;</span>).<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;display:none&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        position = scroll;</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="comment">//修复没有弄右键菜单的童鞋无法回顶部的问题</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;page-name&quot;</span>).<span class="property">innerText</span> = <span class="variable language_">document</span>.<span class="property">title</span>.<span class="title function_">split</span>(<span class="string">&quot; | Fomalhaut🥝&quot;</span>)[<span class="number">0</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">scrollToTop</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;menus_items&quot;</span>)[<span class="number">1</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;&quot;</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;name-container&quot;</span>).<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;display:none&quot;</span>);</span><br><span class="line">    btf.<span class="title function_">scrollToDest</span>(<span class="number">0</span>, <span class="number">500</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后还要在<code>custom.css</code>添加以下css，其中<code>--theme-color</code>换为你自己的主题色：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 导航栏显示标题 */</span></span><br><span class="line"><span class="selector-id">#page-name</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">18px</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">color</span>: white <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&quot;回到顶部&quot;</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -webkit-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -moz-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -ms-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -o-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">3px</span> <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">45px</span>; <span class="comment">/*如果垂直位置不居中可以微调此值，也可以删了*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#page-name</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#name-container</span> &#123;</span><br><span class="line">  <span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -webkit-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -moz-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -ms-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">  -o-<span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#name-container</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  scale: <span class="number">1.03</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#page-name</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">10px</span> <span class="number">30px</span>; <span class="comment">/*如果文字间隔不合理可以微调修改，第二个是水平方向的padding，第一个是垂直的*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#nav</span>&#123;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 修复滚动显示标题居中 */</span></span><br><span class="line">center<span class="selector-id">#name-container</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">width</span>: fit-content <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">42%</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line">  center<span class="selector-id">#name-container</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重启项目：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="配置文件CDN替换">配置文件CDN替换</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>主题默认的CDN有：local、cdnjs、jsdelivr、unpkg等，但是速度偶读比较一般，要想提高部分标准静态资源的响应速度，走CDN是最好的办法，最好是在国内的CDN。</p><p>参考教程：</p><ol><li><a href="https://blog.csdn.net/VariatioZbw/article/details/107822562">CSDN：Web前端常用CDN网站汇总</a></li><li><a href="https://blog.zhheo.com/p/790087d9.html">洪哥：Butterfly CDN链接更改指南，替换jsdelivr提升访问速度</a></li><li><a href="https://anzhiy.cn/posts/fe76.html">安知鱼：目前可用cdn整理</a></li></ol><p>修改教程，我分享一下我目前在用的方案：</p><p>修改主题配置文件<code>_config.butterfly.yml</code>的<code>CDN</code>配置项：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># CDN</span></span><br><span class="line"><span class="comment"># Don&#x27;t modify the following settings unless you know how they work</span></span><br><span class="line"><span class="comment"># 非必要請不要修改</span></span><br><span class="line"><span class="attr">CDN:</span></span><br><span class="line">  <span class="comment"># The CDN provider of internal scripts (主題內部 js 的 cdn 配置)</span></span><br><span class="line">  <span class="comment"># option: local/jsdelivr/unpkg/cdnjs/custom</span></span><br><span class="line">  <span class="comment"># Dev version can only choose. ( dev版的主題只能設置為 local )</span></span><br><span class="line">  <span class="attr">internal_provider:</span> <span class="string">local</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># The CDN provider of third party scripts (第三方 js 的 cdn 配置)</span></span><br><span class="line">  <span class="comment"># option: local/jsdelivr/unpkg/cdnjs/custom</span></span><br><span class="line">  <span class="comment"># when set it to local, you need to install hexo-butterfly-extjs</span></span><br><span class="line">  <span class="attr">third_party_provider:</span> <span class="string">cdnjs</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Add version number to CDN, true or false</span></span><br><span class="line">  <span class="attr">version:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Custom format</span></span><br><span class="line">  <span class="comment"># For example: https://cdn.staticfile.org/$&#123;cdnjs_name&#125;/$&#123;version&#125;/$&#123;min_cdnjs_file&#125;</span></span><br><span class="line">  <span class="attr">custom_format:</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">option:</span></span><br><span class="line">    <span class="comment"># main_css:</span></span><br><span class="line">    <span class="comment"># main:</span></span><br><span class="line">    <span class="comment"># utils:</span></span><br><span class="line">    <span class="comment"># translate: https://cdn1.tianli0.top/npm/js-heo@1.0.6/translate/tw_cn.js</span></span><br><span class="line">    <span class="comment"># local_search:</span></span><br><span class="line">    <span class="comment"># algolia_js: </span></span><br><span class="line">    <span class="attr">algolia_search_v4:</span> <span class="string">https://cdn.staticfile.org/algoliasearch/4.14.3/algoliasearch-lite.umd.min.js</span></span><br><span class="line">    <span class="attr">instantsearch_v4:</span> <span class="string">https://cdn.staticfile.org/instantsearch.js/4.49.2/instantsearch.production.min.js</span></span><br><span class="line">    <span class="attr">pjax:</span> <span class="string">https://lib.baomitu.com/pjax/0.2.8/pjax.min.js</span></span><br><span class="line">    <span class="comment"># gitalk: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/gitalk/1.7.2/gitalk.min.js</span></span><br><span class="line">    <span class="comment"># gitalk_css: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/gitalk/1.7.2/gitalk.min.css</span></span><br><span class="line">    <span class="comment"># blueimp_md5:</span></span><br><span class="line">    <span class="comment"># valine: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/valine/1.4.16/Valine.min.js</span></span><br><span class="line">    <span class="comment"># disqusjs: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/disqusjs/1.3.0/disqus.js</span></span><br><span class="line">    <span class="comment"># disqusjs_css: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/disqusjs/1.3.0/disqusjs.css</span></span><br><span class="line">    <span class="attr">twikoo:</span> <span class="string">https://cdn.staticfile.org/twikoo/1.6.8/twikoo.all.min.js</span></span><br><span class="line">    <span class="comment"># waline_js: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/waline/1.5.4/Waline.min.js</span></span><br><span class="line">    <span class="comment"># waline_css:</span></span><br><span class="line">    <span class="attr">sharejs:</span> <span class="string">https://lib.baomitu.com/social-share.js/1.0.16/js/social-share.min.js</span></span><br><span class="line">    <span class="attr">sharejs_css:</span> <span class="string">https://lib.baomitu.com/social-share.js/1.0.16/css/share.min.css</span></span><br><span class="line">    <span class="comment"># mathjax: https://cdn.staticfile.org/mathjax/3.2.2/es5/mml-chtml.min.js</span></span><br><span class="line">    <span class="comment"># katex: https://lib.baomitu.com/KaTeX/latest/katex.min.css</span></span><br><span class="line">    <span class="comment"># katex_copytex:</span></span><br><span class="line">    <span class="comment"># mermaid:</span></span><br><span class="line">    <span class="comment"># canvas_ribbon:</span></span><br><span class="line">    <span class="comment"># canvas_fluttering_ribbon:</span></span><br><span class="line">    <span class="comment"># canvas_nest:</span></span><br><span class="line">    <span class="attr">lazyload:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vanilla-lazyload/17.3.1/lazyload.iife.min.js</span></span><br><span class="line">    <span class="attr">instantpage:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/instant.page/5.1.0/instantpage.min.js</span></span><br><span class="line">    <span class="attr">typed:</span> <span class="string">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/typed.js/2.0.12/typed.min.js</span></span><br><span class="line">    <span class="comment"># pangu:</span></span><br><span class="line">    <span class="attr">fancybox_css_v4:</span> <span class="string">https://cdn.staticfile.org/fancyapps-ui/4.0.31/fancybox.min.css</span></span><br><span class="line">    <span class="attr">fancybox_v4:</span> <span class="string">https://cdn.staticfile.org/fancyapps-ui/4.0.31/fancybox.umd.min.js</span></span><br><span class="line">    <span class="comment"># medium_zoom: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/medium-zoom/1.0.6/medium-zoom.min.js</span></span><br><span class="line">    <span class="comment"># snackbar_css: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.css</span></span><br><span class="line">    <span class="comment"># snackbar: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.js</span></span><br><span class="line">    <span class="comment"># activate_power_mode:</span></span><br><span class="line">    <span class="comment"># fireworks:</span></span><br><span class="line">    <span class="comment"># click_heart:</span></span><br><span class="line">    <span class="comment"># ClickShowText:</span></span><br><span class="line">    <span class="attr">fontawesomeV6:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/6.0.0/css/all.min.css</span></span><br><span class="line">    <span class="comment"># flickr_justified_gallery_js: https://cdn.staticfile.org/flickr-justified-gallery/2.1.2/fjGallery.min.js</span></span><br><span class="line">    <span class="comment"># flickr_justified_gallery_css: https://cdn.staticfile.org/flickr-justified-gallery/2.1.2/fjGallery.min.css</span></span><br><span class="line">    <span class="attr">aplayer_css:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/aplayer/1.10.1/APlayer.min.css</span></span><br><span class="line">    <span class="attr">aplayer_js:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/aplayer/1.10.1/APlayer.min.js</span></span><br><span class="line">    <span class="attr">meting_js:</span> <span class="string">https://cdn1.tianli0.top/npm/js-heo@1.0.12/metingjs/Meting.min.js</span></span><br><span class="line">    <span class="comment"># prismjs_js: https://cdn1.tianli0.top/npm/prismjs@1.1.0/prism.js</span></span><br><span class="line">    <span class="comment"># prismjs_lineNumber_js: https://cdn1.tianli0.top/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js</span></span><br><span class="line">    <span class="comment"># prismjs_autoloader: https://cdn1.tianli0.top/npm/prismjs/plugins/autoloader/prism-autoloader.min.js</span></span><br></pre></td></tr></table></figure><p>修改完成后可以 <code>f12</code>-&gt;<code>源代码</code>-&gt;<code>网页</code> 看看是否已经加载到对应的资源</p>              </div>            </details><h2 id="右边滚动栏样式">右边滚动栏样式</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-12.webp" alt="image-12.webp" style="zoom:50%;" /></div></div><ol><li><p>在<code>custom.css</code>中加入以下代码，其中<code>var(--theme-color)</code>换成你自己的主题色：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 滚动条样式 */</span></span><br><span class="line">::-webkit-scrollbar &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">8px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">73</span>, <span class="number">177</span>, <span class="number">245</span>, <span class="number">0.2</span>);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">2em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">background-image</span>: <span class="built_in">-webkit-linear-gradient</span>(</span><br><span class="line">    <span class="number">45deg</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.4</span>) <span class="number">25%</span>,</span><br><span class="line">    transparent <span class="number">25%</span>,</span><br><span class="line">    transparent <span class="number">50%</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.4</span>) <span class="number">50%</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.4</span>) <span class="number">75%</span>,</span><br><span class="line">    transparent <span class="number">75%</span>,</span><br><span class="line">    transparent</span><br><span class="line">  );</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">2em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-corner &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-moz-selection &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="哔哔部署">哔哔部署</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：</p><p><a href="https://blog.leonus.cn/2022/bb.html">Leonus:Hexo博客哔哔更换记录</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-14.webp" alt="image-14.webp"></p></div></div><p>你可以完全按照leonus的来，但是我没有在首页加上轮播的哔哔条，仅仅在哔哔页有，在其基础上又自己加了一些样式，都是些前端的东西，替换掉原来的<code>bb.js</code></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">let svg = &#x27;&lt;svg  viewBox=&quot;<span class="number">0</span> <span class="number">0</span> <span class="number">512</span> <span class="number">512</span>&quot; xmlns=&quot;http://www.w3.org/<span class="number">2000</span>/svg<span class="string">&quot; class=&quot;</span>is-badge<span class="string">&quot;&gt;&lt;path  d=&quot;</span>m512 <span class="number">268</span>c0 <span class="number">17.9</span>-<span class="number">4.3</span> <span class="number">34.5</span>-<span class="number">12.9</span> <span class="number">49.7s</span>-<span class="number">20.1</span> <span class="number">27.1</span>-<span class="number">34.6</span> <span class="number">35.4</span>c.<span class="number">4</span> <span class="number">2.7</span>.<span class="number">6</span> <span class="number">6.9</span>.<span class="number">6</span> <span class="number">12.6</span> <span class="number">0</span> <span class="number">27.1</span>-<span class="number">9.1</span> <span class="number">50.1</span>-<span class="number">27.1</span> <span class="number">69.1</span>-<span class="number">18.1</span> <span class="number">19.1</span>-<span class="number">39.9</span> <span class="number">28.6</span>-<span class="number">65.4</span> <span class="number">28.6</span>-<span class="number">11.4</span> <span class="number">0</span>-<span class="number">22.3</span>-<span class="number">2.1</span>-<span class="number">32.6</span>-<span class="number">6.3</span>-<span class="number">8</span> <span class="number">16.4</span>-<span class="number">19.5</span> <span class="number">29.6</span>-<span class="number">34.6</span> <span class="number">39.7</span>-<span class="number">15</span> <span class="number">10.2</span>-<span class="number">31.5</span> <span class="number">15.2</span>-<span class="number">49.4</span> <span class="number">15.2</span>-<span class="number">18.3</span> <span class="number">0</span>-<span class="number">34.9</span>-<span class="number">4.9</span>-<span class="number">49.7</span>-<span class="number">14.9</span>-<span class="number">14.9</span>-<span class="number">9.9</span>-<span class="number">26.3</span>-<span class="number">23.2</span>-<span class="number">34.3</span>-<span class="number">40</span>-<span class="number">10.3</span> <span class="number">4.2</span>-<span class="number">21.1</span> <span class="number">6.3</span>-<span class="number">32.6</span> <span class="number">6.3</span>-<span class="number">25.5</span> <span class="number">0</span>-<span class="number">47.4</span>-<span class="number">9.5</span>-<span class="number">65.7</span>-<span class="number">28.6</span>-<span class="number">18.3</span>-<span class="number">19</span>-<span class="number">27.4</span>-<span class="number">42.1</span>-<span class="number">27.4</span>-<span class="number">69.1</span> <span class="number">0</span>-<span class="number">3</span> .<span class="number">4</span>-<span class="number">7.2</span> <span class="number">1.1</span>-<span class="number">12.6</span>-<span class="number">14.5</span>-<span class="number">8.4</span>-<span class="number">26</span>-<span class="number">20.2</span>-<span class="number">34.6</span>-<span class="number">35.4</span>-<span class="number">8.5</span>-<span class="number">15.2</span>-<span class="number">12.8</span>-<span class="number">31.8</span>-<span class="number">12.8</span>-<span class="number">49.7</span> <span class="number">0</span>-<span class="number">19</span> <span class="number">4.8</span>-<span class="number">36.5</span> <span class="number">14.3</span>-<span class="number">52.3s</span>22.<span class="number">3</span>-<span class="number">27.5</span> <span class="number">38.3</span>-<span class="number">35.1</span>c-<span class="number">4.2</span>-<span class="number">11.4</span>-<span class="number">6.3</span>-<span class="number">22.9</span>-<span class="number">6.3</span>-<span class="number">34.3</span> <span class="number">0</span>-<span class="number">27</span> <span class="number">9.1</span>-<span class="number">50.1</span> <span class="number">27.4</span>-<span class="number">69.1s</span>40.<span class="number">2</span>-<span class="number">28.6</span> <span class="number">65.7</span>-<span class="number">28.6</span>c11.<span class="number">4</span> <span class="number">0</span> <span class="number">22.3</span> <span class="number">2.1</span> <span class="number">32.6</span> <span class="number">6.3</span> <span class="number">8</span>-<span class="number">16.4</span> <span class="number">19.5</span>-<span class="number">29.6</span> <span class="number">34.6</span>-<span class="number">39.7</span> <span class="number">15</span>-<span class="number">10.1</span> <span class="number">31.5</span>-<span class="number">15.2</span> <span class="number">49.4</span>-<span class="number">15.2s</span>34.<span class="number">4</span> <span class="number">5.1</span> <span class="number">49.4</span> <span class="number">15.1</span>c15 <span class="number">10.1</span> <span class="number">26.6</span> <span class="number">23.3</span> <span class="number">34.6</span> <span class="number">39.7</span> <span class="number">10.3</span>-<span class="number">4.2</span> <span class="number">21.1</span>-<span class="number">6.3</span> <span class="number">32.6</span>-<span class="number">6.3</span> <span class="number">25.5</span> <span class="number">0</span> <span class="number">47.3</span> <span class="number">9.5</span> <span class="number">65.4</span> <span class="number">28.6s</span>27.<span class="number">1</span> <span class="number">42.1</span> <span class="number">27.1</span> <span class="number">69.1</span>c0 <span class="number">12.6</span>-<span class="number">1.9</span> <span class="number">24</span>-<span class="number">5.7</span> <span class="number">34.3</span> <span class="number">16</span> <span class="number">7.6</span> <span class="number">28.8</span> <span class="number">19.3</span> <span class="number">38.3</span> <span class="number">35.1</span> <span class="number">9.5</span> <span class="number">15.9</span> <span class="number">14.3</span> <span class="number">33.4</span> <span class="number">14.3</span> <span class="number">52.4</span>zm-<span class="number">266.9</span> <span class="number">77.1</span> <span class="number">105.7</span>-<span class="number">158.3</span>c2.<span class="number">7</span>-<span class="number">4.2</span> <span class="number">3.5</span>-<span class="number">8.8</span> <span class="number">2.6</span>-<span class="number">13.7</span>-<span class="number">1</span>-<span class="number">4.9</span>-<span class="number">3.5</span>-<span class="number">8.8</span>-<span class="number">7.7</span>-<span class="number">11.4</span>-<span class="number">4.2</span>-<span class="number">2.7</span>-<span class="number">8.8</span>-<span class="number">3.6</span>-<span class="number">13.7</span>-<span class="number">2.9</span>-<span class="number">5</span> .<span class="number">8</span>-<span class="number">9</span> <span class="number">3.2</span>-<span class="number">12</span> <span class="number">7.4</span>l-<span class="number">93.1</span> <span class="number">140</span>-<span class="number">42.9</span>-<span class="number">42.8</span>c-<span class="number">3.8</span>-<span class="number">3.8</span>-<span class="number">8.2</span>-<span class="number">5.6</span>-<span class="number">13.1</span>-<span class="number">5.4</span>-<span class="number">5</span> .<span class="number">2</span>-<span class="number">9.3</span> <span class="number">2</span>-<span class="number">13.1</span> <span class="number">5.4</span>-<span class="number">3.4</span> <span class="number">3.4</span>-<span class="number">5.1</span> <span class="number">7.7</span>-<span class="number">5.1</span> <span class="number">12.9</span> <span class="number">0</span> <span class="number">5.1</span> <span class="number">1.7</span> <span class="number">9.4</span> <span class="number">5.1</span> <span class="number">12.9</span>l58.<span class="number">9</span> <span class="number">58.9</span> <span class="number">2.9</span> <span class="number">2.3</span>c3.<span class="number">4</span> <span class="number">2.3</span> <span class="number">6.9</span> <span class="number">3.4</span> <span class="number">10.3</span> <span class="number">3.4</span> <span class="number">6.7</span>-.<span class="number">1</span> <span class="number">11.8</span>-<span class="number">2.9</span> <span class="number">15.2</span>-<span class="number">8.7</span>z<span class="string">&quot; fill=&quot;</span><span class="number">#1da1f2</span><span class="string">&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&#x27;</span></span><br><span class="line"><span class="string">let total = 0</span></span><br><span class="line"><span class="string">let nowNum = 0</span></span><br><span class="line"><span class="string">let items = []</span></span><br><span class="line"><span class="string">let page = 1</span></span><br><span class="line"><span class="string">let Url = &#x27;&#x27; // 修改api，记得带参数page</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">window.addEventListener(&#x27;DOMContentLoaded&#x27;, () =&gt; &#123;</span></span><br><span class="line"><span class="string">    getNew();</span></span><br><span class="line"><span class="string">&#125;);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">// 获取数据</span></span><br><span class="line"><span class="string">function getNew() &#123;</span></span><br><span class="line"><span class="string">    let bibi = document.getElementById(&#x27;bibi&#x27;);</span></span><br><span class="line"><span class="string">    try &#123;</span></span><br><span class="line"><span class="string">        bibi.removeChild(document.getElementById(&#x27;more&#x27;))</span></span><br><span class="line"><span class="string">    &#125; catch (error) &#123; &#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    bibi.innerHTML += &#x27;&lt;div id=&quot;</span>bb_loading<span class="string">&quot;&gt;&lt;img src=&quot;</span>/assets/loading3.gif<span class="string">&quot; alt=&quot;</span>bb_loading<span class="string">&quot;&gt;&lt;/div&gt;&#x27; // bb_loading图片可以f12在我网站源码下载，也可以使用其他图片。</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    fetch(Url + page).then(res =&gt; res.json()).then((res) =&gt; &#123;</span></span><br><span class="line"><span class="string">        total = res.data.total</span></span><br><span class="line"><span class="string">        items = res.data.items</span></span><br><span class="line"><span class="string">        nowNum += items.length</span></span><br><span class="line"><span class="string">        if (page == 1) &#123;</span></span><br><span class="line"><span class="string">            document.querySelector(&#x27;.bb-info&#x27;).innerHTML = &#x27;&lt;svg style=&quot;</span>width:<span class="number">1.20em</span>;<span class="attribute">height</span>:<span class="number">1.20em</span>;<span class="attribute">top</span>:<span class="number">5px</span>;fill<span class="selector-pseudo">:current</span>Color;<span class="attribute">overflow</span>:hidden;<span class="attribute">position</span>:relative<span class="string">&quot;&gt;&lt;use xlink:href=&quot;</span>#icon-chat<span class="string">&quot;&gt;&lt;/svg&gt; 站长的唠叨(&#x27; + total + &#x27;)&#x27;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        page += 1</span></span><br><span class="line"><span class="string">    &#125;).then(() =&gt; &#123;</span></span><br><span class="line"><span class="string">        bb();</span></span><br><span class="line"><span class="string">        if (nowNum &lt; total) &#123;</span></span><br><span class="line"><span class="string">            document.getElementById(&#x27;bibi&#x27;).innerHTML += &#x27;&lt;button id=&quot;</span>more<span class="string">&quot; onclick=&quot;</span><span class="built_in">getNew</span>()<span class="string">&quot;&gt;再翻翻&lt;/button&gt;&#x27;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        document.getElementById(&#x27;bibi&#x27;).removeChild(document.getElementById(&#x27;bb_loading&#x27;))</span></span><br><span class="line"><span class="string">    &#125;)</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">// 渲染数据</span></span><br><span class="line"><span class="string">function bb() &#123;</span></span><br><span class="line"><span class="string">    let bb = document.getElementById(&#x27;bb-main&#x27;)</span></span><br><span class="line"><span class="string">    items.forEach((item) =&gt; &#123;</span></span><br><span class="line"><span class="string">        let time = item.createdAt.substring(0, 10);</span></span><br><span class="line"><span class="string">        let div = document.createElement(&#x27;div&#x27;)</span></span><br><span class="line"><span class="string">        item.content = contentFormat(item.content)</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        div.className = &#x27;bb-card&#x27;</span></span><br><span class="line"><span class="string">        div.innerHTML = &#x27;&lt;div class=&quot;</span>card-header<span class="string">&quot;&gt;&lt;div class=&quot;</span>avatar<span class="string">&quot;&gt;&lt;img class=&quot;</span>nofancybox<span class="string">&quot;src=&quot;</span><span class="string">&#x27; + item.author.avatar + &#x27;</span><span class="string">&quot;&gt;&lt;/div&gt;&lt;div class=&quot;</span>name<span class="string">&quot;&gt;&#x27; + item.author.nickName + &#x27;&lt;/div&gt;&#x27; + svg + &#x27;&lt;div class=&quot;</span>card-time<span class="string">&quot;&gt;&#x27; + time + &#x27;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;</span>card-content<span class="string">&quot;&gt;&#x27; + item.content + &#x27;&lt;/div&gt;&lt;div class=&quot;</span>card-footer<span class="string">&quot;&gt;&lt;div data-v-185689ea=&quot;</span><span class="string">&quot;class=&quot;</span>card-label<span class="string">&quot;style=&quot;</span>background: <span class="string">&#x27; + item.tag.bgColor + &#x27;</span>; <span class="attribute">color</span>: white;&quot;&gt;&#x27; + item<span class="selector-class">.tag</span><span class="selector-class">.name</span> + &#x27;&lt;/<span class="selector-tag">div</span>&gt;&lt;/<span class="selector-tag">div</span>&gt;&#x27;</span><br><span class="line">        bb<span class="selector-class">.appendChild</span>(<span class="selector-tag">div</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">// <span class="attribute">content</span>格式化</span><br><span class="line">function contentFormat(s) &#123;</span><br><span class="line">    let br = /^<span class="selector-attr">[\s\uFEFF\xA0]</span>+|<span class="selector-attr">[\s\uFEFF\xA0]</span>+$/g;</span><br><span class="line">    let re_forimg = /&lt;<span class="selector-tag">img</span>(.*?)<span class="attribute">src</span>=<span class="selector-attr">[\<span class="string">&quot;|\&#x27;]?(.*?)[\&quot;|\&#x27;]?(.*?)&gt;|!\[(.*?)\]\((.*?)\)/g;</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    let getImgUrl = /(http(.*).[jpg|png|gif])/g;</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    let ls = s.match(getImgUrl)</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    s = s.replace(re_forimg, &#x27;&#x27;)</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    s = s.replace(br, &#x27;&#x27;)</span></span></span><br><span class="line"><span class="string"><span class="selector-attr"></span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    let html = &#x27;&lt;br&gt;&#x27;</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    if (ls) &#123;</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">        ls.forEach((e) =&gt; &#123;</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">            html += &#x27;&lt;a href=&quot;</span><span class="string">&#x27; + e + &#x27;</span><span class="string">&quot; target=&quot;</span>_blank<span class="string">&quot; data-fancybox=&quot;</span>group<span class="string">&quot; class=&quot;</span>fancybox<span class="string">&quot;&gt;&lt;img src=&quot;</span><span class="string">&#x27; + e + &#x27;</span><span class="string">&quot;&gt;&lt;/a&gt;&#x27;</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">        &#125;)</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    &#125;</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    s += html</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">    return s</span></span></span><br><span class="line"><span class="string"><span class="selector-attr">&#125;</span></span></span><br></pre></td></tr></table></figure><p>然后直接在bb页面的md文件写上如下的样式：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span></span><br><span class="line">/* 哔哔页面 <span class="emphasis">*/</span></span><br><span class="line"><span class="emphasis">#bibi button &#123;</span></span><br><span class="line"><span class="emphasis">  color: #fff;</span></span><br><span class="line"><span class="emphasis">  border: 0;</span></span><br><span class="line"><span class="emphasis">  margin: 20px auto;</span></span><br><span class="line"><span class="emphasis">  border-radius: 0.3125rem;</span></span><br><span class="line"><span class="emphasis">  display: block;</span></span><br><span class="line"><span class="emphasis">  padding: 0 1rem;</span></span><br><span class="line"><span class="emphasis">  height: 40px;</span></span><br><span class="line"><span class="emphasis">  font-weight: 500;</span></span><br><span class="line"><span class="emphasis">  text-align: center;</span></span><br><span class="line"><span class="emphasis">  transition: all 0.5s ease-out;</span></span><br><span class="line"><span class="emphasis">  background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);</span></span><br><span class="line"><span class="emphasis">  background-size: 1000% 1000%;</span></span><br><span class="line"><span class="emphasis">  animation: Gradient 60s linear infinite;</span></span><br><span class="line"><span class="emphasis">  outline: 0;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .bb-info &#123;</span></span><br><span class="line"><span class="emphasis">  font-weight: 700;</span></span><br><span class="line"><span class="emphasis">  font-size: 22px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .bb-card &#123;</span></span><br><span class="line"><span class="emphasis">  padding: 15px;</span></span><br><span class="line"><span class="emphasis">  border-radius: 10px;</span></span><br><span class="line"><span class="emphasis">  background: rgba(255, 255, 255, 0.1);</span></span><br><span class="line"><span class="emphasis">  border: 1px solid #a5a5a5ee;</span></span><br><span class="line"><span class="emphasis">  margin-top: 20px;</span></span><br><span class="line"><span class="emphasis">  transition: all 0.25s;</span></span><br><span class="line"><span class="emphasis">  user-select: none;</span></span><br><span class="line"><span class="emphasis">  width: calc(48% - 7px);</span></span><br><span class="line"><span class="emphasis">  margin: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">@media screen and (max-width: 800px) &#123;</span></span><br><span class="line"><span class="emphasis">  #bibi .bb-card &#123;</span></span><br><span class="line"><span class="emphasis">  width: 100%;</span></span><br><span class="line"><span class="emphasis">  &#125;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .bb-card:hover &#123;</span></span><br><span class="line"><span class="emphasis">  box-shadow: 0 5px 10px 8px #07111b29;</span></span><br><span class="line"><span class="emphasis">  transform: translateY(-3px);</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header &#123;</span></span><br><span class="line"><span class="emphasis">  display: flex;</span></span><br><span class="line"><span class="emphasis">  align-items: center;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header .avatar &#123;</span></span><br><span class="line"><span class="emphasis">  width: 32px;</span></span><br><span class="line"><span class="emphasis">  height: 32px;</span></span><br><span class="line"><span class="emphasis">  border-radius: 50%;</span></span><br><span class="line"><span class="emphasis">  margin-right: 10px;</span></span><br><span class="line"><span class="emphasis">  border-radius: 20px;</span></span><br><span class="line"><span class="emphasis">  overflow: hidden;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header svg &#123;</span></span><br><span class="line"><span class="emphasis">  height: 20px;</span></span><br><span class="line"><span class="emphasis">  width: 20px;</span></span><br><span class="line"><span class="emphasis">  margin-left: 5px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-header .card-time &#123;</span></span><br><span class="line"><span class="emphasis">  font-size: 12px;</span></span><br><span class="line"><span class="emphasis">  text-shadow: #d9d9d9 0 0 1px, #fffffb 0 0 1px, #fffffb 0 0 2px;</span></span><br><span class="line"><span class="emphasis">  margin-left: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-content &#123;</span></span><br><span class="line"><span class="emphasis">  padding: 10px 0;</span></span><br><span class="line"><span class="emphasis">  white-space: pre-wrap;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-footer &#123;</span></span><br><span class="line"><span class="emphasis">  display: flex;</span></span><br><span class="line"><span class="emphasis">  padding-bottom: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bibi .card-footer .card-label &#123;</span></span><br><span class="line"><span class="emphasis">  border-radius: 5px;</span></span><br><span class="line"><span class="emphasis">  padding: 0 5px;</span></span><br><span class="line"><span class="emphasis">  font-weight: 550;</span></span><br><span class="line"><span class="emphasis">  border-radius: 5px;</span></span><br><span class="line"><span class="emphasis">  box-shadow: inset 0 -1px 0 rgb(27 31 35 / 12%);</span></span><br><span class="line"><span class="emphasis">  font-size: 14px;</span></span><br><span class="line"><span class="emphasis">  user-select: none;</span></span><br><span class="line"><span class="emphasis">  margin-right: 10px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">div#bb_loading img&#123;</span></span><br><span class="line"><span class="emphasis">  border-radius: 15px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">#bb-main &#123;</span></span><br><span class="line"><span class="emphasis">  display: flex;</span></span><br><span class="line"><span class="emphasis">  flex-direction: row;</span></span><br><span class="line"><span class="emphasis">  flex-wrap: wrap;</span></span><br><span class="line"><span class="emphasis">  justify-content: flex-start;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span></span></span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="朋友圈配置">朋友圈配置</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://hexo-circle-of-friends-doc.vercel.app/#/?id=%E5%8F%8B%E9%93%BE%E6%9C%8B%E5%8F%8B%E5%9C%88">友链朋友圈</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-15.webp" alt="image-15.webp" style="zoom:50%;" /></div></div><p>后端部署都是固定的了，请看上面的参考教程。前端部署我比较喜欢Heo的样式，见 <a href="https://blog.zhheo.com/p/4e18a507.html">友链朋友圈5 - 我的部署历程与主题样式分享</a></p><p>在Heo样式的基础上，重新换了一些CDN以及一些细节微调，看完Heo的教程并配置好前端后，可以将<code>fcircle.md</code>文件的内容覆写为以下形式，记住填上你的<code>API</code>以及<code>error_img</code>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span></span><br><span class="line">  #cf-container &#123;</span><br><span class="line"><span class="code">    background: transparent !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  .cf-article .cf-article-title:hover &#123;</span></span><br><span class="line"><span class="code">    color: #f4f4f4 !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  .cf-img-avatar &#123;</span></span><br><span class="line"><span class="code">    opacity: .4 !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  .cf-article-author:hover &#123;</span></span><br><span class="line"><span class="code">    background: var(--theme-color) !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  #cf-more:hover &#123;</span></span><br><span class="line"><span class="code">    background: var(--theme-color) !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  .cf-overshow p a:hover &#123;</span></span><br><span class="line"><span class="code">    color: #f4f4f4 !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  .cf-article &#123;</span></span><br><span class="line"><span class="code">    transition: transform linear 0.3s;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  .cf-article:hover &#123;</span></span><br><span class="line"><span class="code">    transform: scale(1.05);</span></span><br><span class="line"><span class="code">    box-shadow: 0 5px 10px 8px #07111b29;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  .cf-article &#123;</span></span><br><span class="line"><span class="code">    border-radius: 15px !important;</span></span><br><span class="line"><span class="code">    border: 1px solid #a5a5a5ee !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">  ::selection &#123;</span></span><br><span class="line"><span class="code">  background: var(--theme-color) !important;</span></span><br><span class="line"><span class="code">  color: #f4f4f4 !important;</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">&lt;/style&gt;</span></span><br><span class="line"><span class="code"></span></span><br><span class="line"><span class="language-xml"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;hexo-circle-of-friends-root&quot;</span>&gt;</span></span></span><span class="language-xml"><span class="language-css">&lt;/<span class="selector-tag">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span>&gt;</span></span></span></span><br><span class="line"><span class="code">    let UserConfig = &#123;</span></span><br><span class="line"><span class="code">        // 填写你的api地址</span></span><br><span class="line"><span class="code">        private_api_url: &#x27;&#x27;,</span></span><br><span class="line"><span class="code">        // 点击加载更多时，一次最多加载几篇文章，默认10</span></span><br><span class="line"><span class="code">        page_turning_number: 12,</span></span><br><span class="line"><span class="code">        // 头像加载失败时，默认头像地址</span></span><br><span class="line"><span class="code">        error_img: &#x27;&#x27;,</span></span><br><span class="line"><span class="code">        // 进入页面时第一次的排序规则</span></span><br><span class="line"><span class="code">        sort_rule: &#x27;created&#x27;</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">&lt;/script&gt;</span></span><br><span class="line"><span class="code">&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn1.tianli0.top/gh/zhheo/JS-Heo@master/mainColor/heoMainColor.css&quot;&gt;</span></span><br><span class="line"><span class="code">&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn1.tianli0.top/gh/zhheo/JS-Heo@master/moments5/app.min.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="code">&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn1.tianli0.top/gh/zhheo/JS-Heo@master/moments5/bundle.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="雪花飘落特效">雪花飘落特效</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>逛别人的博客看见有款雪花特效挺不错的，和我的冬日主题很搭配，于是就f12过来了。</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/01/imageda64264993a545e7.webp" alt="imageda64264993a545e7.webp" style="zoom:50%;" /></div></div><ol><li><p>新建<code>[BlogRoot]\source\js\snow.js</code>，并写入以下代码，其中雪花的参数是可以自行调节的：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> ((navigator.<span class="property">userAgent</span>.<span class="title function_">match</span>(<span class="regexp">/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i</span>))) &#123;</span><br><span class="line">    <span class="comment">// 移动端不显示</span></span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="comment">// document.write(&#x27;&lt;canvas id=&quot;snow&quot; style=&quot;position:fixed;top:0;left:0;width:100%;height:100%;z-index:-2;pointer-events:none&quot;&gt;&lt;/canvas&gt;&#x27;);</span></span><br><span class="line"></span><br><span class="line">    <span class="variable language_">window</span> &amp;&amp; (<span class="function">() =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">let</span> e = &#123;</span><br><span class="line">            <span class="attr">flakeCount</span>: <span class="number">50</span>, <span class="comment">// 雪花数目</span></span><br><span class="line">            <span class="attr">minDist</span>: <span class="number">150</span>,   <span class="comment">// 最小距离</span></span><br><span class="line">            <span class="attr">color</span>: <span class="string">&quot;255, 255, 255&quot;</span>, <span class="comment">// 雪花颜色</span></span><br><span class="line">            <span class="attr">size</span>: <span class="number">1.5</span>,  <span class="comment">// 雪花大小</span></span><br><span class="line">            <span class="attr">speed</span>: <span class="number">.5</span>,  <span class="comment">// 雪花速度</span></span><br><span class="line">            <span class="attr">opacity</span>: <span class="number">.7</span>,    <span class="comment">// 雪花透明度</span></span><br><span class="line">            <span class="attr">stepsize</span>: <span class="number">.5</span>    <span class="comment">// 步距</span></span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">const</span> t = <span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span> || <span class="variable language_">window</span>.<span class="property">mozRequestAnimationFrame</span> || <span class="variable language_">window</span>.<span class="property">webkitRequestAnimationFrame</span> || <span class="variable language_">window</span>.<span class="property">msRequestAnimationFrame</span> || <span class="keyword">function</span> (<span class="params">e</span>) &#123;</span><br><span class="line">            <span class="variable language_">window</span>.<span class="built_in">setTimeout</span>(e, <span class="number">1e3</span> / <span class="number">60</span>)</span><br><span class="line">        &#125;</span><br><span class="line">            ;</span><br><span class="line">        <span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span> = t;</span><br><span class="line">        <span class="keyword">const</span> i = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;snow&quot;</span>),</span><br><span class="line">            n = i.<span class="title function_">getContext</span>(<span class="string">&quot;2d&quot;</span>),</span><br><span class="line">            o = e.<span class="property">flakeCount</span>;</span><br><span class="line">        <span class="keyword">let</span> a = -<span class="number">100</span>,</span><br><span class="line">            d = -<span class="number">100</span>,</span><br><span class="line">            s = [];</span><br><span class="line">        i.<span class="property">width</span> = <span class="variable language_">window</span>.<span class="property">innerWidth</span>,</span><br><span class="line">            i.<span class="property">height</span> = <span class="variable language_">window</span>.<span class="property">innerHeight</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title function_">h</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">            n.<span class="title function_">clearRect</span>(<span class="number">0</span>, <span class="number">0</span>, i.<span class="property">width</span>, i.<span class="property">height</span>);</span><br><span class="line">            <span class="keyword">const</span> r = e.<span class="property">minDist</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> t = <span class="number">0</span>; t &lt; o; t++) &#123;</span><br><span class="line">                <span class="keyword">let</span> o = s[t];</span><br><span class="line">                <span class="keyword">const</span> h = a,</span><br><span class="line">                    w = d,</span><br><span class="line">                    m = o.<span class="property">x</span>,</span><br><span class="line">                    c = o.<span class="property">y</span>,</span><br><span class="line">                    p = <span class="title class_">Math</span>.<span class="title function_">sqrt</span>((h - m) * (h - m) + (w - c) * (w - c));</span><br><span class="line">                <span class="keyword">if</span> (p &lt; r) &#123;</span><br><span class="line">                    <span class="keyword">const</span> e = (h - m) / p,</span><br><span class="line">                        t = (w - c) / p,</span><br><span class="line">                        i = r / (p * p) / <span class="number">2</span>;</span><br><span class="line">                    o.<span class="property">velX</span> -= i * e,</span><br><span class="line">                        o.<span class="property">velY</span> -= i * t</span><br><span class="line">                &#125; <span class="keyword">else</span></span><br><span class="line">                    o.<span class="property">velX</span> *= <span class="number">.98</span>,</span><br><span class="line">                        o.<span class="property">velY</span> &lt; o.<span class="property">speed</span> &amp;&amp; o.<span class="property">speed</span> - o.<span class="property">velY</span> &gt; <span class="number">.01</span> &amp;&amp; (o.<span class="property">velY</span> += <span class="number">.01</span> * (o.<span class="property">speed</span> - o.<span class="property">velY</span>)),</span><br><span class="line">                        o.<span class="property">velX</span> += <span class="title class_">Math</span>.<span class="title function_">cos</span>(o.<span class="property">step</span> += <span class="number">.05</span>) * o.<span class="property">stepSize</span>;</span><br><span class="line">                n.<span class="property">fillStyle</span> = <span class="string">&quot;rgba(&quot;</span> + e.<span class="property">color</span> + <span class="string">&quot;, &quot;</span> + o.<span class="property">opacity</span> + <span class="string">&quot;)&quot;</span>,</span><br><span class="line">                    o.<span class="property">y</span> += o.<span class="property">velY</span>,</span><br><span class="line">                    o.<span class="property">x</span> += o.<span class="property">velX</span>,</span><br><span class="line">                    (o.<span class="property">y</span> &gt;= i.<span class="property">height</span> || o.<span class="property">y</span> &lt;= <span class="number">0</span>) &amp;&amp; <span class="title function_">l</span>(o),</span><br><span class="line">                    (o.<span class="property">x</span> &gt;= i.<span class="property">width</span> || o.<span class="property">x</span> &lt;= <span class="number">0</span>) &amp;&amp; <span class="title function_">l</span>(o),</span><br><span class="line">                    n.<span class="title function_">beginPath</span>(),</span><br><span class="line">                    n.<span class="title function_">arc</span>(o.<span class="property">x</span>, o.<span class="property">y</span>, o.<span class="property">size</span>, <span class="number">0</span>, <span class="number">2</span> * <span class="title class_">Math</span>.<span class="property">PI</span>),</span><br><span class="line">                    n.<span class="title function_">fill</span>()</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="title function_">t</span>(h)</span><br><span class="line">        &#125;</span><br><span class="line">            , l = <span class="function"><span class="params">e</span> =&gt;</span> &#123;</span><br><span class="line">                e.<span class="property">x</span> = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * i.<span class="property">width</span>),</span><br><span class="line">                    e.<span class="property">y</span> = <span class="number">0</span>,</span><br><span class="line">                    e.<span class="property">size</span> = <span class="number">3</span> * <span class="title class_">Math</span>.<span class="title function_">random</span>() + <span class="number">2</span>,</span><br><span class="line">                    e.<span class="property">speed</span> = <span class="number">1</span> * <span class="title class_">Math</span>.<span class="title function_">random</span>() + <span class="number">.5</span>,</span><br><span class="line">                    e.<span class="property">velY</span> = e.<span class="property">speed</span>,</span><br><span class="line">                    e.<span class="property">velX</span> = <span class="number">0</span>,</span><br><span class="line">                    e.<span class="property">opacity</span> = <span class="number">.5</span> * <span class="title class_">Math</span>.<span class="title function_">random</span>() + <span class="number">.3</span></span><br><span class="line">            &#125;</span><br><span class="line">            ;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;mousemove&quot;</span>, (<span class="function"><span class="params">e</span> =&gt;</span> &#123;</span><br><span class="line">            a = e.<span class="property">clientX</span>,</span><br><span class="line">                d = e.<span class="property">clientY</span></span><br><span class="line">        &#125;</span><br><span class="line">        )),</span><br><span class="line">            <span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;resize&quot;</span>, (<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                i.<span class="property">width</span> = <span class="variable language_">window</span>.<span class="property">innerWidth</span>,</span><br><span class="line">                    i.<span class="property">height</span> = <span class="variable language_">window</span>.<span class="property">innerHeight</span></span><br><span class="line">            &#125;</span><br><span class="line">            )),</span><br><span class="line">            (<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">let</span> t = <span class="number">0</span>; t &lt; o; t++) &#123;</span><br><span class="line">                    <span class="keyword">const</span> t = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * i.<span class="property">width</span>)</span><br><span class="line">                        , n = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * i.<span class="property">height</span>)</span><br><span class="line">                        , o = <span class="number">3</span> * <span class="title class_">Math</span>.<span class="title function_">random</span>() + e.<span class="property">size</span></span><br><span class="line">                        , a = <span class="number">1</span> * <span class="title class_">Math</span>.<span class="title function_">random</span>() + e.<span class="property">speed</span></span><br><span class="line">                        , d = <span class="number">.5</span> * <span class="title class_">Math</span>.<span class="title function_">random</span>() + e.<span class="property">opacity</span>;</span><br><span class="line">                    s.<span class="title function_">push</span>(&#123;</span><br><span class="line">                        <span class="attr">speed</span>: a,</span><br><span class="line">                        <span class="attr">velX</span>: <span class="number">0</span>,</span><br><span class="line">                        <span class="attr">velY</span>: a,</span><br><span class="line">                        <span class="attr">x</span>: t,</span><br><span class="line">                        <span class="attr">y</span>: n,</span><br><span class="line">                        <span class="attr">size</span>: o,</span><br><span class="line">                        <span class="attr">stepSize</span>: <span class="title class_">Math</span>.<span class="title function_">random</span>() / <span class="number">30</span> * e.<span class="property">stepsize</span>,</span><br><span class="line">                        <span class="attr">step</span>: <span class="number">0</span>,</span><br><span class="line">                        <span class="attr">angle</span>: <span class="number">180</span>,</span><br><span class="line">                        <span class="attr">opacity</span>: d</span><br><span class="line">                    &#125;)</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="title function_">h</span>()</span><br><span class="line">            &#125;</span><br><span class="line">            )()</span><br><span class="line">    &#125;</span><br><span class="line">    )();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在自定义css文件<code>custom.css</code>写入如下代码，我这里设置只在白天模式显示，你可以自行设置，这里比较简单，本质就是调节画布的显示参数：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 雪花特效 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;light&quot;</span>]</span> <span class="selector-id">#snow</span>&#123;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">position</span>: fixed;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">pointer-events</span>: none;</span><br><span class="line">  <span class="attribute">z-index</span>: -<span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 雪花黑夜模式不显示 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#snow</span>&#123;</span><br><span class="line">  <span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>引入画布元素：在主题配置文件<code>_config.butterfly.yml</code>文件的引入js文件和一个<code>canvas</code>画布：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;canvas id=&quot;snow&quot;&gt;&lt;/canvas&gt; # 雪花画布</span></span><br><span class="line"><span class="addition">+    - &lt;script async src=&quot;/js/snow.js&quot;&gt;&lt;/script&gt; # 雪花特效</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到效果，注意：我的设置只在白天模式显示：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="导航栏和风天气">导航栏和风天气</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://cnhuazhu.top/butterfly/2021/02/24/Hexo%E9%AD%94%E6%94%B9/Hexo%E5%9C%A8%E9%A1%B6%E9%83%A8%E5%A2%9E%E5%8A%A0%E5%A4%A9%E6%B0%94%E5%B0%8F%E9%83%A8%E4%BB%B6/">Hexo在顶部增加天气小部件</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/01/image-1.webp" alt="image-1.webp" style="zoom:50%;" /></div></div><ol><li><p>在<a href="https://widget.qweather.com/create-simple">和风天气插件</a>中创建一个模板，点击生成代码：</p><p><img src="https://tuchuang.voooe.cn/images/2023/01/01/image-2.webp" alt="image-2.webp"></p></li><li><p>创建文件<code>[BlogRoot]\source\js\weather.js</code>，将生成的代码写入，例如：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable constant_">WIDGET</span> = &#123;</span><br><span class="line">  <span class="string">&quot;CONFIG&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;modules&quot;</span>: <span class="string">&quot;01234&quot;</span>,</span><br><span class="line">    <span class="string">&quot;background&quot;</span>: <span class="string">&quot;5&quot;</span>,</span><br><span class="line">    <span class="string">&quot;tmpColor&quot;</span>: <span class="string">&quot;FF9900&quot;</span>,</span><br><span class="line">    <span class="string">&quot;tmpSize&quot;</span>: <span class="string">&quot;16&quot;</span>,</span><br><span class="line">    <span class="string">&quot;cityColor&quot;</span>: <span class="string">&quot;CCCCCC&quot;</span>,</span><br><span class="line">    <span class="string">&quot;citySize&quot;</span>: <span class="string">&quot;16&quot;</span>,</span><br><span class="line">    <span class="string">&quot;aqiColor&quot;</span>: <span class="string">&quot;D9D9D9&quot;</span>,</span><br><span class="line">    <span class="string">&quot;aqiSize&quot;</span>: <span class="string">&quot;16&quot;</span>,</span><br><span class="line">    <span class="string">&quot;weatherIconSize&quot;</span>: <span class="string">&quot;24&quot;</span>,</span><br><span class="line">    <span class="string">&quot;alertIconSize&quot;</span>: <span class="string">&quot;18&quot;</span>,</span><br><span class="line">    <span class="string">&quot;padding&quot;</span>: <span class="string">&quot;15px 10px 10px 20px&quot;</span>,</span><br><span class="line">    <span class="string">&quot;shadow&quot;</span>: <span class="string">&quot;0&quot;</span>,</span><br><span class="line">    <span class="string">&quot;language&quot;</span>: <span class="string">&quot;auto&quot;</span>,</span><br><span class="line">    <span class="string">&quot;borderRadius&quot;</span>: <span class="string">&quot;5&quot;</span>,</span><br><span class="line">    <span class="string">&quot;fixed&quot;</span>: <span class="string">&quot;false&quot;</span>,</span><br><span class="line">    <span class="string">&quot;vertical&quot;</span>: <span class="string">&quot;top&quot;</span>,</span><br><span class="line">    <span class="string">&quot;horizontal&quot;</span>: <span class="string">&quot;left&quot;</span>,</span><br><span class="line">    <span class="string">&quot;key&quot;</span>: <span class="string">&quot;....&quot;</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>的<code>inject</code>的<code>bottom</code>处引入：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script src=&quot;https://widget.qweather.net/simple/static/js/he-simple-common.js?v=2.0&quot;&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="addition">+    - &lt;script src=&quot;/js/weather.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>接下来要挂载到导航栏：在<code>[BlogRoot]\themes\butterfly\layout\includes\header\nav.pug</code>中加入一个元素，这个元素就是用来放天气组件的：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">nav#nav</span><br><span class="line">  span#blog_name</span><br><span class="line">    a#site-name(href=url_for(&#x27;/&#x27;)) #[=config.title]</span><br><span class="line"><span class="addition">+  #he-plugin-simple</span></span><br></pre></td></tr></table></figure></li><li><p>上述操作可以将天气组件成功展示在导航栏中间，如果想要调整该组件位置到<code>blog_name旁</code>，可以直接修改<code>weather.js</code>中的<code>padding</code>项（不推荐），当然推荐在<code>nav.pug</code>中添加一个占位组件：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">nav#nav</span><br><span class="line">  span#blog_name</span><br><span class="line">    a#site-name(href=url_for(&#x27;/&#x27;)) #[=config.title]</span><br><span class="line">  #he-plugin-simple</span><br><span class="line"><span class="addition">+  #none_space</span></span><br></pre></td></tr></table></figure></li><li><p>然后在<code>[BlogRoot]\themes\butterfly\source\css\_layout\head.styl</code>中将<code>#blog_name</code>替换为<code>#none_space</code>：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">-  #blog_name</span></span><br><span class="line"><span class="addition">+  #none_space</span></span><br><span class="line">    flex: 1</span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到效果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="侧边栏新年倒计时-Leonus">侧边栏新年倒计时(Leonus)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://blog.leonus.cn/2023/newYearCard.html">Leonus:博客新年倒计时卡片</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/02/image.webp" alt="image.webp" style="zoom: 67%;" /></div></div><ol><li><p>添加侧边栏：新建文件<code>[BlogRoot]\source\_data\widget.yml</code>，建议查看butterfly官方文档：<a href="https://butterfly.js.org/posts/ea33ab97/#%E8%87%AA%E5%AE%9A%E7%BE%A9-widget">自定义侧边栏</a></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># top: 创建的 widget 会出现在非 sticky 区域（即所有页面都会显示)</span></span><br><span class="line"><span class="comment"># bottom: 创建的 widget 会出现在 sticky 区域（除了文章页都会显示)</span></span><br><span class="line"><span class="attr">top:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">class_name:</span></span><br><span class="line">    <span class="attr">id_name:</span> <span class="string">newYear</span></span><br><span class="line">    <span class="attr">name:</span></span><br><span class="line">    <span class="attr">icon:</span></span><br><span class="line">    <span class="attr">order:</span> <span class="number">1</span></span><br><span class="line">    <span class="attr">html:</span> <span class="string">&#x27;&lt;div id=&quot;newYear-main&quot;&gt;&lt;div class=&quot;mask&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;p class=&quot;title&quot;&gt;&lt;/p&gt;</span></span><br><span class="line"><span class="string">      &lt;div class=&quot;newYear-time&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;p class=&quot;today&quot; style=&quot;text-align: right;&quot;&gt;&lt;/p&gt;</span></span><br><span class="line"><span class="string">      &lt;/div&gt;&#x27;</span></span><br></pre></td></tr></table></figure></li><li><p>在<code>custom.css</code>中添加如下代码：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 新年侧边栏 */</span></span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: white;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear</span> <span class="selector-tag">p</span>,</span><br><span class="line"><span class="selector-id">#newYear</span> <span class="selector-tag">h3</span> &#123;</span><br><span class="line">    <span class="attribute">font-weight</span>: normal;</span><br><span class="line">    <span class="attribute">color</span>: inherit;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear</span> <span class="selector-class">.item-headline</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear-main</span> &#123;</span><br><span class="line">    <span class="attribute">min-height</span>: <span class="number">160px</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">1rem</span>;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">https://tuchuang.voooe.cn/images/2023/01/02/tunian.webp</span>);</span><br><span class="line">    <span class="attribute">background-size</span>: cover;</span><br><span class="line">    <span class="attribute">background-position</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear-main</span> * &#123;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">1.3</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear-main</span> <span class="selector-class">.newYear-time</span> &#123;</span><br><span class="line">    <span class="attribute">font-weight</span>: bold;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear-main</span> <span class="selector-class">.time</span>,</span><br><span class="line"><span class="selector-id">#newYear-main</span> <span class="selector-class">.happyNewYear</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">3.5rem</span>;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">1rem</span> <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear-main</span> <span class="selector-class">.day</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">5rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear-main</span> <span class="selector-class">.day</span> <span class="selector-class">.unit</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">1rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#newYear-main</span> <span class="selector-class">.mask</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, .<span class="number">1</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>新建文件<code>[BlogRoot]\source\js\newYear.js</code>，并写入如下代码，注意最后的Pjax适配，如果没开Pjax直接是<code>newYear()</code>即可，如果是开启了Pjax就用我的即可：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> newYearTimer = <span class="literal">null</span>;</span><br><span class="line"><span class="keyword">var</span> <span class="title function_">newYear</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="built_in">clearTimeout</span>(newYearTimer);</span><br><span class="line">    <span class="keyword">if</span> (!<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#newYear&#x27;</span>)) <span class="keyword">return</span>;</span><br><span class="line">    <span class="comment">// 新年时间戳 and 星期对象</span></span><br><span class="line">    <span class="keyword">let</span> newYear = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&#x27;2023-01-22 00:00:00&#x27;</span>).<span class="title function_">getTime</span>() / <span class="number">1000</span>,</span><br><span class="line">        week = &#123; <span class="number">0</span>: <span class="string">&#x27;周日&#x27;</span>, <span class="number">1</span>: <span class="string">&#x27;周一&#x27;</span>, <span class="number">2</span>: <span class="string">&#x27;周二&#x27;</span>, <span class="number">3</span>: <span class="string">&#x27;周三&#x27;</span>, <span class="number">4</span>: <span class="string">&#x27;周四&#x27;</span>, <span class="number">5</span>: <span class="string">&#x27;周五&#x27;</span>, <span class="number">6</span>: <span class="string">&#x27;周六&#x27;</span> &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">time</span>();</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 补零函数</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">nol</span>(<span class="params">h</span>) &#123; <span class="keyword">return</span> h &gt; <span class="number">9</span> ? h : <span class="string">&#x27;0&#x27;</span> + h; &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">time</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="comment">// 现在 时间对象</span></span><br><span class="line">        <span class="keyword">let</span> now = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 右下角 今天</span></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#newYear .today&#x27;</span>).<span class="property">innerHTML</span> = now.<span class="title function_">getFullYear</span>() + <span class="string">&#x27;-&#x27;</span> + (now.<span class="title function_">getMonth</span>() + <span class="number">1</span>) + <span class="string">&#x27;-&#x27;</span> + now.<span class="title function_">getDate</span>() + <span class="string">&#x27; &#x27;</span> + week[now.<span class="title function_">getDay</span>()]</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 现在与新年相差秒数</span></span><br><span class="line">        <span class="keyword">let</span> second = newYear - <span class="title class_">Math</span>.<span class="title function_">round</span>(now.<span class="title function_">getTime</span>() / <span class="number">1000</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 小于0则表示已经过年</span></span><br><span class="line">        <span class="keyword">if</span> (second &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#newYear .title&#x27;</span>).<span class="property">innerHTML</span> = <span class="string">&#x27;Happy New Year!&#x27;</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#newYear .newYear-time&#x27;</span>).<span class="property">innerHTML</span> = <span class="string">&#x27;&lt;span class=&quot;happyNewYear&quot;&gt;新年快乐&lt;/p&gt;&#x27;</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="comment">// 大于0则还未过年</span></span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#newYear .title&#x27;</span>).<span class="property">innerHTML</span> = <span class="string">&#x27;距离2023年春节：&#x27;</span></span><br><span class="line"></span><br><span class="line">            <span class="comment">// 大于一天则直接渲染天数</span></span><br><span class="line">            <span class="keyword">if</span> (second &gt; <span class="number">86400</span>) &#123;</span><br><span class="line">                <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#newYear .newYear-time&#x27;</span>).<span class="property">innerHTML</span> = <span class="string">`&lt;span class=&quot;day&quot;&gt;<span class="subst">$&#123;<span class="built_in">Math</span>.ceil(second / <span class="number">86400</span>)&#125;</span>&lt;span class=&quot;unit&quot;&gt;天&lt;/span&gt;&lt;/span&gt;`</span></span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="comment">// 小于一天则使用时分秒计时。</span></span><br><span class="line">                <span class="keyword">let</span> h = <span class="title function_">nol</span>(<span class="built_in">parseInt</span>(second / <span class="number">3600</span>));</span><br><span class="line">                second %= <span class="number">3600</span>;</span><br><span class="line">                <span class="keyword">let</span> m = <span class="title function_">nol</span>(<span class="built_in">parseInt</span>(second / <span class="number">60</span>));</span><br><span class="line">                second %= <span class="number">60</span>;</span><br><span class="line">                <span class="keyword">let</span> s = <span class="title function_">nol</span>(second);</span><br><span class="line">                <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#newYear .newYear-time&#x27;</span>).<span class="property">innerHTML</span> = <span class="string">`&lt;span class=&quot;time&quot;&gt;<span class="subst">$&#123;h&#125;</span>:<span class="subst">$&#123;m&#125;</span>:<span class="subst">$&#123;s&#125;</span>&lt;/span&gt;&lt;/span&gt;`</span>;</span><br><span class="line">                <span class="comment">// 计时</span></span><br><span class="line">                newYearTimer = <span class="built_in">setTimeout</span>(time, <span class="number">1000</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 元宝飘落</span></span><br><span class="line">    <span class="title function_">jQuery</span>(<span class="variable language_">document</span>).<span class="title function_">ready</span>(<span class="keyword">function</span> (<span class="params">$</span>) &#123;</span><br><span class="line">        $(<span class="string">&#x27;#newYear&#x27;</span>).<span class="title function_">wpSuperSnow</span>(&#123;</span><br><span class="line">            <span class="attr">flakes</span>: [<span class="string">&#x27;https://tuchuang.voooe.cn/images/2023/01/02/yb1.webp&#x27;</span>, <span class="string">&#x27;https://tuchuang.voooe.cn/images/2023/01/02/yb2.webp&#x27;</span>, <span class="string">&#x27;https://tuchuang.voooe.cn/images/2023/01/02/yb3.webp&#x27;</span>],</span><br><span class="line">            <span class="attr">totalFlakes</span>: <span class="string">&#x27;100&#x27;</span>,</span><br><span class="line">            <span class="attr">zIndex</span>: <span class="string">&#x27;999999&#x27;</span>,</span><br><span class="line">            <span class="attr">maxSize</span>: <span class="string">&#x27;30&#x27;</span>,</span><br><span class="line">            <span class="attr">maxDuration</span>: <span class="string">&#x27;20&#x27;</span>,</span><br><span class="line">            <span class="attr">useFlakeTrans</span>: <span class="literal">false</span></span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// Pjax适配：若没有开启Pjax这里直接是newYear()即可</span></span><br><span class="line"><span class="comment">// 开了Pjax的用以下两句</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, newYear);</span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, newYear);</span><br></pre></td></tr></table></figure></li><li><p>引入依赖：在主题配置文件<code>_config.butterfly.yml</code>中添加如下代码：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script src=&quot;https://cdn.staticfile.org/jquery/3.6.3/jquery.min.js&quot;&gt;&lt;/script&gt; # jQuery</span></span><br><span class="line"><span class="addition">+    - &lt;script async data-pjax src=&quot;https://cdn.wpon.cn/2022-sucai/Gold-ingot.js&quot;&gt;&lt;/script&gt;  # 新年元宝</span></span><br><span class="line"><span class="addition">+    - &lt;script async data-pjax src=&quot;/js/newYear.js&quot;&gt;&lt;/script&gt;  # 新年倒计时</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="Twikoo评论系统部署-Vercel方式">Twikoo评论系统部署(Vercel方式)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考文字教程：</p><ul><li><a href="https://twikoo.js.org/quick-start.html#%E9%92%88%E5%AF%B9-vercel-%E9%83%A8%E7%BD%B2%E7%9A%84%E6%9B%B4%E6%96%B0%E6%96%B9%E5%BC%8F">官方：Twikoo文档-针对Vercel的部署</a></li><li><a href="https://tzy1997.com/articles/hexo1611/">TZY：基于 Hexo 键入评论功能</a></li></ul><p>视频教程：</p><ul><li><a href="https://www.bilibili.com/video/BV1Fh411e7ZH/">Twikoo Vercel 部署教程</a></li><li><a href="https://www.bilibili.com/video/BV1Re4y1H7g8/">安知鱼：23.butterfly配置twikoo评论系统</a></li></ul>              </div>            </details><h2 id="Twikoo自定义表情与适配">Twikoo自定义表情与适配</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="note warning modern"><p>该教程需要你配置完Twikoo评论系统并能进管理界面！</p></div><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/02/1672657401454.webp" alt="1672657401454.webp" style="zoom: 50%;" /><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-3.webp" alt="image-3.webp" style="zoom:67%;" /><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-4.webp" alt="image-4.webp" style="zoom:50%;" /></div></div><ol><li><p>输入暗号进入评论系统管理界面</p><p><img src="https://tuchuang.voooe.cn/images/2023/01/02/image864a9e0e18a3c9f7.webp" alt="image864a9e0e18a3c9f7.webp"></p></li><li><p>选择<code>配置管理</code>-&gt;<code>插件</code>-&gt;<code>EMOTION_CDN</code>，这里就是填自定义表情的json文件，我们看到json文件的结构是一个花括号然后中间填入多组表情数据，我们只需要将中间的的改成我们的表情数据即可：</p><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-1.webp" alt="image-1.webp" style="zoom:50%;" /><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-2.webp" alt="image-2.webp" style="zoom:50%;" /></li><li><p>进入<a href="https://github.com/2X-ercha/Twikoo-Magic">Github:Twikoo-Magic</a>或者<a href="https://emotion.xiaokang.me/#/">小康表情速查</a>，按照下图的方法即可获取对应表情的json信息，要复制的信息我已经标记出来，这些就相当于步骤2中的红框信息，替换或者增添上你们喜欢的表情信息即可：</p><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-5.webp" alt="image-5.webp" style="zoom:50%;" /><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-6.webp" alt="image-6.webp" style="zoom:67%;" /><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-7.webp" alt="image-7.webp" style="zoom:50%;" /></li><li><p>然后将改完的json命名为<code>owo.json</code>（最好是这个名字），然后托管到静态部署网站，例如对象存储或者Cloudflare这种托管，把对应的文件链接写到<code>EMOTION_CDN</code>，保存后刷新页面即可看到新的表情！</p></li><li><p>如果你不想麻烦或者直接用我的可不可以？当然可以！这里直接贴出我的CDN：<code>https://source.fomal.cc/json/owo.json</code>，写到<code>EMOTION_CDN</code>即可，到这里就有了表情了，为了让表情显示更加好看，我还做了大小和响应式布局的优化，在<code>custom.css</code>中写入以下代码（注意：该代码仅适用于我的表情数据，你的表情不一定适用！）：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* twikoo评论美化 */</span></span><br><span class="line"><span class="comment">/* 自定义twikoo评论输入框高度 */</span></span><br><span class="line"><span class="selector-id">#twikoo</span> <span class="selector-class">.el-textarea</span> <span class="selector-tag">textarea</span> &#123;</span><br><span class="line">  <span class="attribute">min-height</span>: <span class="number">120px</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">background-size</span>: <span class="number">90px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 自定义表情优化 */</span></span><br><span class="line"><span class="selector-id">#twikoo</span> <span class="selector-class">.OwO-body</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 选择某个框 #twikoo .OwO .OwO-body .OwO-items:nth-child(1) */</span></span><br><span class="line"><span class="selector-id">#twikoo</span> <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items</span> &#123;</span><br><span class="line">  <span class="attribute">max-height</span>: <span class="number">250px</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="built_in">calc</span>(<span class="number">9%</span> - <span class="number">10px</span>);</span><br><span class="line">  <span class="attribute">box-sizing</span>: content-box;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title|=<span class="string">&quot;Heybox&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title|=<span class="string">&quot;Tieba&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-show</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;bilibili&quot;</span>]</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="built_in">calc</span>(<span class="number">7%</span> - <span class="number">10px</span>) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">box-sizing</span>: content-box;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#twikoo</span> <span class="selector-class">.OwO-items</span> <span class="selector-tag">li</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Menhera&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Menhera&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Snow&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Snow&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Sweetie&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Sweetie&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Tsuri&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Tsuri&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Yurui&quot;</span>]</span>,</span><br><span class="line"><span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Yurui&quot;</span>]</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="number">120px</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">max-height</span>: <span class="number">120px</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">120px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">8px</span> <span class="number">1px</span>;</span><br><span class="line">  <span class="attribute">display</span>: block <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 手机端适配 */</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Menhera&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Menhera&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Snow&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Snow&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Sweetie&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Sweetie&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Tsuri&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Tsuri&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.vemoji</span><span class="selector-attr">[alt|=<span class="string">&quot;Yurui&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.tk-comment</span> <span class="selector-class">.tk-owo-emotion</span><span class="selector-attr">[alt*=<span class="string">&quot;Yurui&quot;</span>]</span> &#123;</span><br><span class="line">    <span class="attribute">max-width</span>: <span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">30px</span>) <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">max-height</span>: <span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">30px</span>) <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;Menhera&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;Snow&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;Sweetie&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;Tsuri&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;Yurui&quot;</span>]</span> &#123;</span><br><span class="line">    <span class="attribute">max-width</span>: <span class="built_in">calc</span>(<span class="number">33%</span> - <span class="number">10px</span>);</span><br><span class="line">    <span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;Heybox&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;bilibili&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;Tieba&quot;</span>]</span>,</span><br><span class="line">  <span class="selector-class">.OwO</span> <span class="selector-class">.OwO-body</span> <span class="selector-class">.OwO-items-image</span> <span class="selector-class">.OwO-item</span><span class="selector-attr">[title*=<span class="string">&quot;QQ&quot;</span>]</span> &#123;</span><br><span class="line">    <span class="attribute">max-width</span>: <span class="built_in">calc</span>(<span class="number">18%</span> - <span class="number">10px</span>) <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">box-sizing</span>: content-box;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 右下角闭眼 */</span></span><br><span class="line"><span class="selector-class">.el-textarea__inner</span> &#123;</span><br><span class="line">  <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">https://tuchuang.voooe.cn/images/2023/01/02/open.webp</span>) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.el-textarea__inner</span><span class="selector-pseudo">:focus</span> &#123;</span><br><span class="line">  <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">https://tuchuang.voooe.cn/images/2023/01/02/close.webp</span>) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到效果</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="Twikoo邮件回复模板-绿野仙踪款">Twikoo邮件回复模板(绿野仙踪款)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://guole.fun/posts/62740/">Guole:自定义 Twikoo 访客通知邮件模板</a></p><p>我的邮件模板是基于Guole大佬的模板改的，一些细节改成自己喜欢的样子了</p><p>当然你还可以参考Heo的回复模板，也挺好看的：<a href="https://blog.zhheo.com/p/169a1abb.html">HEO:Twikoo评论回复邮件模板：Acrylic Mail 粉</a></p><div class="note warning modern"><p>该模板的使用基于你已经完成Twikoo评论邮件通知！如果还不知道怎么配置邮件通知，参考这篇文章：<a href="https://blog.csdn.net/weixin_58068682/article/details/122770936">CSDN:部署Twikoo评论系统及其邮件推送(Vercel)</a></p></div><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-11.webp" alt="image-11.webp" style="zoom:50%;" /></div></div><ol><li><p>进入Twikoo评论系统的管理界面，<code>配置管理</code>-&gt;<code>邮件通知</code>-&gt;<code>MAIL_SUBJECT_ADMIN</code>和<code>MAIL_TEMPLATE_ADMIN</code>，这两个分别是通知博主和通知访客的模板：</p><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-8.webp" alt="image-8.webp" style="zoom:67%;" /><img src="https://tuchuang.voooe.cn/images/2023/01/02/image-9.webp" alt="image-9.webp" style="zoom: 67%;" /></li><li><p>然后替换成以下代码即可：</p><div class="tabs" id="邮件模板"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#邮件模板-1">回复通知模板</button></li><li class="tab"><button type="button" data-href="#邮件模板-2">管理员通知模板</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="邮件模板-1"><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;isForwardContent&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;content&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;background: white;width: 95%;max-width: 800px;margin: auto auto;         border-radius: 15px;         border: #39c5bb 1px solid;         overflow: hidden;         -webkit-box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.12);         box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.18);       &quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">header</span> <span class="attr">style</span>=<span class="string">&quot;overflow: hidden&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;https://tuchuang.voooe.cn/images/2023/01/02/violet.webp&quot;</span> <span class="attr">style</span>=<span class="string">&quot;width: 100%; z-index: 666&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">header</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;padding: 5px 20px;background-color: #46e1c60d&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;dear&quot;</span> <span class="attr">style</span>=<span class="string">&quot;  border-radius: 30px;           position: relative;             color: white;             float: left;             z-index: 999;             background: #39c5bb;             padding: 10px 30px;             margin: -25px auto 0;             box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);           &quot;</span>&gt;</span>亲爱的 $&#123;PARENT_NICK&#125; 同学：<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">center</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">h3</span>&gt;</span>来自 <span class="tag">&lt;<span class="name">strong</span>&gt;</span>$&#123;NICK&#125;<span class="tag">&lt;/<span class="name">strong</span>&gt;</span> 的回复<span class="tag">&lt;/<span class="name">h3</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">center</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">hr</span> <span class="attr">style</span>=<span class="string">&quot;width:200px;border:0;border-bottom:1px solid #e5e5e5;margin:12px auto;&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span> /&gt;</span><span class="tag">&lt;<span class="name">p</span>&gt;</span>您好！您在 <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;$&#123;POST_URL&#125;&quot;</span> <span class="attr">style</span>=<span class="string">&quot;text-decoration: none; color: #39c5bb&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span><span class="symbol">&amp;nbsp;</span>$&#123;SITE_NAME&#125;<span class="symbol">&amp;nbsp;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span>上发表的评论：<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;tk-content&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px;border: 1px solid #ddd; padding-bottom: 20px; background-color: #f5f5f5; margin: 15px 0px; padding-left: 20px; padding-right: 20px; padding-top: 20px;&quot;</span>&gt;</span>$&#123;PARENT_COMMENT&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">strong</span>&gt;</span>$&#123;NICK&#125;<span class="tag">&lt;/<span class="name">strong</span>&gt;</span> 给您回复啦：</span><br><span class="line"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;tk-content&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px;border: 1px solid #ddd; padding-bottom: 20px; background-color: #f5f5f5;  margin: 15px 0px;  padding-left: 20px; padding-right: 20px; padding-top: 20px; &quot;</span>&gt;</span>$&#123;COMMENT&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span>欢迎再次光临小站： <span class="tag">&lt;<span class="name">a</span> <span class="attr">style</span>=<span class="string">&quot;text-decoration:none; color:#39c5bb&quot;</span> <span class="attr">href</span>=<span class="string">&quot;$&#123;SITE_URL&#125;&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>$&#123;SITE_NAME&#125;<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span>(此邮件由Twikoo系统发出，支持直接回复)<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;chakan&quot;</span> <span class="attr">style</span>=<span class="string">&quot;text-align: center;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;$&#123;POST_URL&#125;&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#ffffff;text-decoration:none;display:inline-block;min-height:28px;line-height:28px;padding:0 13px;outline:0;background:#39c5bb;font-size:13px;text-align: center;font-weight:400;border:0;border-radius:999em&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>点击去原文查看<span class="symbol">&amp;gt;</span><span class="symbol">&amp;gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span> <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;footer-p&quot;</span> <span class="attr">style</span>=<span class="string">&quot;text-align: center; margin-top: 3rem; display:block;color:#b3b3b1;text-decoration:none;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;https://tuchuang.voooe.cn/images/2023/01/02/avatar.webp&quot;</span> <span class="attr">style</span>=<span class="string">&quot;width:5rem; margin:0 auto;border-radius: 5px;&quot;</span> /&gt;</span><span class="symbol">&amp;nbsp;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">hr</span> <span class="attr">style</span>=<span class="string">&quot;width:165px;border:0;border-bottom:1px solid #e5e5e5;margin:5px auto;&quot;</span> /&gt;</span>©<span class="symbol">&amp;nbsp;</span>2022-2023<span class="symbol">&amp;nbsp;</span>By <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;https://www.fomal.cc/&quot;</span> <span class="attr">style</span>=<span class="string">&quot;text-align:center; color: #39c5bb;text-decoration: none;font-weight: bold&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>Fomalhaut🥝<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span> <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> ::-webkit-scrollbar &#123; <span class="attribute">display</span>: none; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">id</span>=<span class="string">&quot;cloudAttachStyle&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-id">#divNeteaseBigAttach</span>, <span class="selector-class">.qmbox</span> <span class="selector-id">#divNeteaseBigAttach_bak</span> &#123; <span class="attribute">display</span>: none; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">id</span>=<span class="string">&quot;blockquoteStyle&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-tag">blockquote</span> &#123; <span class="attribute">display</span>: none; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-tag">body</span> &#123; <span class="attribute">font-size</span>: <span class="number">14px</span>; <span class="attribute">font-family</span>: arial, verdana, sans-serif; <span class="attribute">line-height</span>: <span class="number">1.666</span>; <span class="attribute">padding</span>: <span class="number">0</span>; <span class="attribute">margin</span>: <span class="number">0</span>; <span class="attribute">overflow</span>: auto; <span class="attribute">white-space</span>: normal; <span class="attribute">word-wrap</span>: break-word; <span class="attribute">min-height</span>: <span class="number">100px</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">td</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">input</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">button</span>, <span class="selector-class">.qmbox</span> select, <span class="selector-class">.qmbox</span> <span class="selector-tag">body</span> &#123; <span class="attribute">font-family</span>: Helvetica, <span class="string">&#x27;Microsoft Yahei&#x27;</span>, verdana; &#125; <span class="selector-class">.qmbox</span> pre &#123; <span class="attribute">white-space</span>: pre-wrap; <span class="attribute">white-space</span>: -moz-pre-wrap; <span class="attribute">white-space</span>: -pre-wrap; <span class="attribute">white-space</span>: -o-pre-wrap; <span class="attribute">word-wrap</span>: break-word; <span class="attribute">width</span>: <span class="number">95%</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">th</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">td</span> &#123; <span class="attribute">font-family</span>: arial, verdana, sans-serif; <span class="attribute">line-height</span>: <span class="number">1.666</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">img</span> &#123; <span class="attribute">border</span>: <span class="number">0</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">header</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">footer</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">section</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">aside</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">article</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">nav</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">hgroup</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">figure</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">figcaption</span> &#123; <span class="attribute">display</span>: block; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">blockquote</span> &#123; <span class="attribute">margin-right</span>: <span class="number">0px</span>; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">1100px</span>) &#123;<span class="selector-id">#content</span> <span class="selector-tag">p</span> &#123;<span class="attribute">font-size</span>: <span class="number">10px</span>;&#125; <span class="selector-id">#content</span> <span class="selector-tag">h3</span> &#123;<span class="attribute">font-size</span>: <span class="number">14px</span>;&#125; <span class="selector-class">.footer-p</span> &#123;<span class="attribute">font-size</span>: <span class="number">9px</span>;&#125; <span class="selector-class">.dear</span> &#123;<span class="attribute">font-size</span>: <span class="number">12px</span>;&#125;&#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">id</span>=<span class="string">&quot;ntes_link_color&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-tag">a</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">td</span> <span class="selector-tag">a</span> &#123; <span class="attribute">color</span>: <span class="number">#236da1</span>; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="邮件模板-2"><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;isForwardContent&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;content&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;background: white;width: 95%;max-width: 800px;margin: auto auto;         border-radius: 15px;         border: #39c5bb 1px solid;         overflow: hidden;         -webkit-box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.12);         box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.18);       &quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">header</span> <span class="attr">style</span>=<span class="string">&quot;overflow: hidden&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;https://tuchuang.voooe.cn/images/2023/01/02/violet.webp&quot;</span> <span class="attr">style</span>=<span class="string">&quot;width: 100%; z-index: 666&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">header</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;padding: 5px 20px;background-color: #46e1c60d&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;dear&quot;</span> <span class="attr">style</span>=<span class="string">&quot;  border-radius: 30px;           position: relative;             color: white;             float: left;             z-index: 999;             background: #39c5bb;             padding: 10px 30px;             margin: -25px auto 0;             box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);           &quot;</span>&gt;</span>亲爱的猕猴桃站长：<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">center</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">h3</span>&gt;</span>来自 <span class="tag">&lt;<span class="name">strong</span>&gt;</span>$&#123;NICK&#125;<span class="tag">&lt;/<span class="name">strong</span>&gt;</span> 的评论<span class="tag">&lt;/<span class="name">h3</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">center</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">hr</span> <span class="attr">style</span>=<span class="string">&quot;width:200px;border:0;border-bottom:1px solid #e5e5e5;margin:12px auto;&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span></span><br><span class="line">您好！系统得知 <span class="tag">&lt;<span class="name">strong</span>&gt;</span>$&#123;NICK&#125;<span class="tag">&lt;/<span class="name">strong</span>&gt;</span> 刚刚在您的网站发表评论：</span><br><span class="line"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;tk-content&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px;border: 1px solid #ddd; padding-bottom: 20px; background-color: #f5f5f5;  margin: 15px 0px;  padding-left: 20px; padding-right: 20px; padding-top: 20px; &quot;</span>&gt;</span>$&#123;COMMENT&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span>特地通知您，快去看看吧！<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;chakan&quot;</span> <span class="attr">style</span>=<span class="string">&quot;text-align: center;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;$&#123;POST_URL&#125;&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#ffffff;text-decoration:none;display:inline-block;min-height:28px;line-height:28px;padding:0 13px;outline:0;background:#39c5bb;font-size:13px;text-align: center;font-weight:400;border:0;border-radius:999em&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>点击去原文查看<span class="symbol">&amp;gt;</span><span class="symbol">&amp;gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span> <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;footer-p&quot;</span> <span class="attr">style</span>=<span class="string">&quot;text-align: center; margin-top: 3rem; display:block;color:#b3b3b1;text-decoration:none;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;https://tuchuang.voooe.cn/images/2023/01/02/avatar.webp&quot;</span> <span class="attr">style</span>=<span class="string">&quot;width:5rem; margin:0 auto;border-radius: 5px;&quot;</span> /&gt;</span><span class="symbol">&amp;nbsp;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">hr</span> <span class="attr">style</span>=<span class="string">&quot;width:165px;border:0;border-bottom:1px solid #e5e5e5;margin:5px auto;&quot;</span> /&gt;</span>©<span class="symbol">&amp;nbsp;</span>2022-2023<span class="symbol">&amp;nbsp;</span>By <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;https://www.fomal.cc/&quot;</span> <span class="attr">style</span>=<span class="string">&quot;text-align:center; color: #39c5bb;text-decoration: none;font-weight: bold&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>Fomalhaut🥝<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span> <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> ::-webkit-scrollbar &#123; <span class="attribute">display</span>: none; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">id</span>=<span class="string">&quot;cloudAttachStyle&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-id">#divNeteaseBigAttach</span>, <span class="selector-class">.qmbox</span> <span class="selector-id">#divNeteaseBigAttach_bak</span> &#123; <span class="attribute">display</span>: none; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">id</span>=<span class="string">&quot;blockquoteStyle&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-tag">blockquote</span> &#123; <span class="attribute">display</span>: none; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-tag">body</span> &#123; <span class="attribute">font-size</span>: <span class="number">14px</span>; <span class="attribute">font-family</span>: arial, verdana, sans-serif; <span class="attribute">line-height</span>: <span class="number">1.666</span>; <span class="attribute">padding</span>: <span class="number">0</span>; <span class="attribute">margin</span>: <span class="number">0</span>; <span class="attribute">overflow</span>: auto; <span class="attribute">white-space</span>: normal; <span class="attribute">word-wrap</span>: break-word; <span class="attribute">min-height</span>: <span class="number">100px</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">td</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">input</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">button</span>, <span class="selector-class">.qmbox</span> select, <span class="selector-class">.qmbox</span> <span class="selector-tag">body</span> &#123; <span class="attribute">font-family</span>: Helvetica, <span class="string">&#x27;Microsoft Yahei&#x27;</span>, verdana; &#125; <span class="selector-class">.qmbox</span> pre &#123; <span class="attribute">white-space</span>: pre-wrap; <span class="attribute">white-space</span>: -moz-pre-wrap; <span class="attribute">white-space</span>: -pre-wrap; <span class="attribute">white-space</span>: -o-pre-wrap; <span class="attribute">word-wrap</span>: break-word; <span class="attribute">width</span>: <span class="number">95%</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">th</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">td</span> &#123; <span class="attribute">font-family</span>: arial, verdana, sans-serif; <span class="attribute">line-height</span>: <span class="number">1.666</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">img</span> &#123; <span class="attribute">border</span>: <span class="number">0</span>; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">header</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">footer</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">section</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">aside</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">article</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">nav</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">hgroup</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">figure</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">figcaption</span> &#123; <span class="attribute">display</span>: block; &#125; <span class="selector-class">.qmbox</span> <span class="selector-tag">blockquote</span> &#123; <span class="attribute">margin-right</span>: <span class="number">0px</span>; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">1100px</span>) &#123;<span class="selector-id">#content</span> <span class="selector-tag">p</span> &#123;<span class="attribute">font-size</span>: <span class="number">10px</span>;&#125; <span class="selector-id">#content</span> <span class="selector-tag">h3</span> &#123;<span class="attribute">font-size</span>: <span class="number">14px</span>;&#125; <span class="selector-class">.footer-p</span> &#123;<span class="attribute">font-size</span>: <span class="number">9px</span>;&#125; <span class="selector-class">.dear</span> &#123;<span class="attribute">font-size</span>: <span class="number">12px</span>;&#125;&#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">id</span>=<span class="string">&quot;ntes_link_color&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.qmbox</span> <span class="selector-tag">a</span>, <span class="selector-class">.qmbox</span> <span class="selector-tag">td</span> <span class="selector-tag">a</span> &#123; <span class="attribute">color</span>: <span class="number">#236da1</span>; &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><p>这两段代码分别填入步骤1的两个红框当中，一个是站长回复别人评论时别人看到的，另一个是网站有评论通知站长的，里面的信息和样式可以根据自己的实际情况微调，改完了之后可以在这里<a href="http://www.wetools.com/html-minify">HTML代码压缩工具</a>进行压缩，然后再复制进去步骤1的两个红框里，保存即可生效！</p></li><li><p>自定义字段见下表，在生成实际回复邮件时会替换成对应的值：</p><table><thead><tr><th style="text-align:center">参数</th><th style="text-align:center">含义</th></tr></thead><tbody><tr><td style="text-align:center">${SITE_URL}</td><td style="text-align:center">网站链接</td></tr><tr><td style="text-align:center">${SITE_NAME}</td><td style="text-align:center">网站名字</td></tr><tr><td style="text-align:center">${PARENT_NICK}</td><td style="text-align:center">被回复人昵称</td></tr><tr><td style="text-align:center">${PARENT_COMMENT}</td><td style="text-align:center">被回复人的评论内容</td></tr><tr><td style="text-align:center">${NICK}</td><td style="text-align:center">回复人昵称</td></tr><tr><td style="text-align:center">${COMMENT}</td><td style="text-align:center">回复人评论内容</td></tr><tr><td style="text-align:center">${POST_URL}</td><td style="text-align:center">文章链接</td></tr><tr><td style="text-align:center">${IMG}</td><td style="text-align:center">回复人头像</td></tr><tr><td style="text-align:center">${PARENT_IMG}</td><td style="text-align:center">被回复人头像</td></tr><tr><td style="text-align:center">${MAIL}</td><td style="text-align:center">回复人邮件</td></tr><tr><td style="text-align:center">${MAIL}</td><td style="text-align:center">回复人 IP 地址</td></tr></tbody></table></li><li><p>到这步就基本完成了，现在随便用另一个邮箱发表评论测试一下，看看模板是否能正常工作吧！</p></li></ol>              </div>            </details><h2 id="Hexo博客如何迁移到新电脑">Hexo博客如何迁移到新电脑</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://blog.csdn.net/qq_43698421/article/details/120407042">CSDN:Hexo博客迁移到新电脑</a></p><ol><li><p>在新电脑行进行环境准备工作，具体的步骤和<a href="/posts/e593433d.html">Hexo博客搭建基础教程(一)</a>的第1-7步一模一样，大家在新电脑上跟着做即可（注意千万不要做第8步，<code>hexo init blog-demo</code>这一步会覆盖并还原你原本的的源码文件）</p></li><li><p>这时候新建一个文件夹<code>new-blog</code>，用来装你的新博客源码的，进入这个文件夹，准备复制我们旧的博客源码进来，我们可以看到旧的博客项目结构是如下样子的：</p><img src="https://tuchuang.voooe.cn/images/2023/01/03/image.webp" alt="image.webp" style="zoom: 50%;" /><p>这里红框内的都是需要复制迁移到新的博客的，具体的要不要保留见下表：</p><table><thead><tr><th style="text-align:center">需要复制的</th><th style="text-align:center">需要删除的</th></tr></thead><tbody><tr><td style="text-align:center">_config.yml：站点配置文件</td><td style="text-align:center">.git：无论是在站点根目录下，还是主题目录下的.git文件，都可以删掉</td></tr><tr><td style="text-align:center">_config.butterfly.yml：主题配置文件，为了方便主题升级剥离出来的配置文件</td><td style="text-align:center">node_modules：<code>npm install</code>会根据package.json生成</td></tr><tr><td style="text-align:center">package.json：说明使用哪些依赖包</td><td style="text-align:center">public：<code>hexo g</code>会重新编译生成</td></tr><tr><td style="text-align:center">scaffolds：文章的模板</td><td style="text-align:center">.deploy_git：在使用<code>hexo d</code>时也会重新生成</td></tr><tr><td style="text-align:center">source：自己写的博客源码</td><td style="text-align:center">db.json文件：<code>hexo s</code>快速启动所需的数据库</td></tr><tr><td style="text-align:center">themes：主题文件夹（魔改都在里面啦）</td><td style="text-align:center">package-lock.json：记录依赖之间的内部依赖关系，可以根据<code>package.json</code>重新生成</td></tr><tr><td style="text-align:center">.gitignore：说明在提交时哪些文件可以忽略</td><td style="text-align:center"></td></tr></tbody></table></li><li><p>复制所需的文件到新电脑的文件夹之后，在<code>git bash</code>中切换目录到新拷贝的文件夹里，使用<code>npm install</code> 命令，进行模块安装。这里绝对不能使用<code>hexo init</code>初始化，因为有的文件我们已经拷贝生成过来了，所以不必用<code>hexo init</code>去整体初始化，如果不慎用了，则站点的配置文件<code>_config.yml</code>里面内容会被重置，所以这一步一定要慎重：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i</span><br></pre></td></tr></table></figure></li><li><p>执行以下命令情况并启动项目，进入<code>localhost:4000</code>进行验证：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo g; hexo s</span><br></pre></td></tr></table></figure></li><li><p>当本地能成功启动，之后就可以部署到Github，执行以下代码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo d</span><br></pre></td></tr></table></figure><p>如果出现<code>Deploy done</code>，则说明部署成功，稍等两分钟，打开浏览器访问之前的域名就可以看到之前的博客，以后你可以在这台新电脑上魔改和写文章了~</p></li></ol>              </div>            </details><h2 id="打赏按钮菜单-店长微调">打赏按钮菜单(店长微调)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://akilar.top/posts/23fdf850/">糖果屋微调合集</a></p><p>教程参考自店长的糖果屋微调集合，但是做完之后发现有些bug，悬浮鼠标显示的二维码是竖向的，于是做了一些调整，还有更换了一些旧的CDN等，可以放心食用。</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/04/68ac575e8fc65e8578fde0af6b3be25a.gif" alt="68ac575e8fc65e8578fde0af6b3be25a.gif" style="zoom: 67%;" /></div></div><ol><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\post\reward.pug</code>,整体替换为以下内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">link(rel=&#x27;stylesheet&#x27; href=url_for(theme.CDN.option.coin_css) media=&quot;defer&quot; onload=&quot;this.media=&#x27;all&#x27;&quot;)</span><br><span class="line">.post-reward</span><br><span class="line">  button.tip-button.reward-button</span><br><span class="line">    span.tip-button__text= _p(&#x27;donate&#x27;)</span><br><span class="line">    .coin-wrapper</span><br><span class="line">      .coin</span><br><span class="line">        .coin__middle</span><br><span class="line">        .coin__back</span><br><span class="line">        .coin__front</span><br><span class="line">    .reward-main</span><br><span class="line">      ul.reward-all</span><br><span class="line">        each item in theme.reward.QR_code</span><br><span class="line">          - var clickTo = (item.itemlist||item).link ? (item.itemlist||item).link : (item.itemlist||item).img</span><br><span class="line">          li.reward-item</span><br><span class="line">            a(href=clickTo target=&#x27;_blank&#x27;)</span><br><span class="line">              img.post-qr-code-img(src=url_for((item.itemlist||item).img) alt=(item.itemlist||item).text)</span><br><span class="line">            .post-qr-code-desc=(item.itemlist||item).text</span><br><span class="line">if theme.reward.coinAudio</span><br><span class="line">  - var coinAudio = theme.reward.coinAudio ? url_for(theme.reward.coinAudio) : &#x27;https://cdn.cbd.int/akilar-candyassets@1.0.36/audio/coin.mp3&#x27;</span><br><span class="line">  audio#coinAudio(src=coinAudio)</span><br><span class="line">script(defer src=url_for(theme.CDN.option.coin_js))</span><br></pre></td></tr></table></figure></li><li><p>新建<code>[BlogRoot]\themes\butterfly\source\css\coin.css</code>，并写入如下代码：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.tip-button</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">0.25rem</span>;</span><br><span class="line">  <span class="attribute">cursor</span>: pointer;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">font-weight</span>: <span class="number">600</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">2.6rem</span>;</span><br><span class="line">  <span class="attribute">margin-bottom</span>: -<span class="number">4rem</span>;</span><br><span class="line">  <span class="attribute">outline</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">transform-origin</span>: <span class="number">0%</span> <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">transition</span>: transform <span class="number">50ms</span> ease-in-out;</span><br><span class="line">  <span class="attribute">width</span>: auto;</span><br><span class="line">  -webkit-tap-highlight-<span class="attribute">color</span>: transparent;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-pseudo">:active</span> &#123;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">4deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-class">.clicked</span> &#123;</span><br><span class="line">  <span class="attribute">animation</span>: <span class="number">150ms</span> ease-in-out <span class="number">1</span> shake;</span><br><span class="line">  <span class="attribute">pointer-events</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-class">.clicked</span> <span class="selector-class">.tip-button__text</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">transition</span>: opacity <span class="number">100ms</span> linear <span class="number">200ms</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-class">.clicked</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">0.5rem</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">60%</span>;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(button-hover-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-class">.clicked</span> <span class="selector-class">.coin</span> &#123;</span><br><span class="line">  <span class="attribute">transition</span>: margin-bottom <span class="number">1s</span> linear <span class="number">200ms</span>;</span><br><span class="line">  <span class="attribute">margin-bottom</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-class">.shrink-landing</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">transition</span>: width <span class="number">200ms</span> ease-in;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-class">.coin-landed</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>);</span><br><span class="line">  <span class="attribute">transform-origin</span>: <span class="number">50%</span> <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-class">.coin-landed</span> <span class="selector-class">.coin-wrapper</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">radial-gradient</span>(circle at <span class="number">35%</span> <span class="number">97%</span>, <span class="built_in">rgba</span>(<span class="number">3</span>, <span class="number">16</span>, <span class="number">50</span>, <span class="number">0.4</span>) <span class="number">0.04rem</span>, transparent <span class="number">0.04rem</span>), <span class="built_in">radial-gradient</span>(circle at <span class="number">45%</span> <span class="number">92%</span>, <span class="built_in">rgba</span>(<span class="number">3</span>, <span class="number">16</span>, <span class="number">50</span>, <span class="number">0.4</span>) <span class="number">0.04rem</span>, transparent <span class="number">0.02rem</span>), <span class="built_in">radial-gradient</span>(circle at <span class="number">55%</span> <span class="number">98%</span>, <span class="built_in">rgba</span>(<span class="number">3</span>, <span class="number">16</span>, <span class="number">50</span>, <span class="number">0.4</span>) <span class="number">0.04rem</span>, transparent <span class="number">0.04rem</span>), <span class="built_in">radial-gradient</span>(circle at <span class="number">65%</span> <span class="number">96%</span>, <span class="built_in">rgba</span>(<span class="number">3</span>, <span class="number">16</span>, <span class="number">50</span>, <span class="number">0.4</span>) <span class="number">0.06rem</span>, transparent <span class="number">0.06rem</span>);</span><br><span class="line">  <span class="attribute">background-position</span>: center bottom;</span><br><span class="line">  <span class="attribute">background-size</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">bottom</span>: -<span class="number">1rem</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">2</span>) <span class="built_in">translateY</span>(-<span class="number">10px</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button__text</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">  <span class="attribute">margin-right</span>: <span class="number">1.8rem</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">transition</span>: opacity <span class="number">100ms</span> linear <span class="number">500ms</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">3</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">0.25rem</span>;</span><br><span class="line">  <span class="attribute">bottom</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateX</span>(-<span class="number">50%</span>);</span><br><span class="line">  <span class="attribute">transition</span>: height <span class="number">250ms</span> ease-in-out <span class="number">400ms</span>, width <span class="number">250ms</span> ease-in-out <span class="number">300ms</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tip-button</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">bottom</span>: -<span class="number">1rem</span>;</span><br><span class="line">  <span class="attribute">color</span>: white;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&#x27;ヾ(≧O≦)〃嗷~&#x27;</span>; <span class="comment">/*点击后显示的内容*/</span></span><br><span class="line">  <span class="attribute">height</span>: <span class="number">110%</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">pointer-events</span>: none;</span><br><span class="line">  <span class="attribute">text-align</span>: center;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0</span>);</span><br><span class="line">  <span class="attribute">transform-origin</span>: <span class="number">50%</span> <span class="number">20%</span>;</span><br><span class="line">  <span class="attribute">transition</span>: transform <span class="number">200ms</span> <span class="built_in">cubic-bezier</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0.35</span>, <span class="number">1.43</span>);</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.coin-wrapper</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: none;</span><br><span class="line">  <span class="attribute">bottom</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">18rem</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">  <span class="attribute">pointer-events</span>: none;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">transform</span>: none;</span><br><span class="line">  <span class="attribute">transform-origin</span>: <span class="number">50%</span> <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">transition</span>: opacity <span class="number">200ms</span> linear <span class="number">100ms</span>, transform <span class="number">300ms</span> ease-out;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.coin</span> &#123;</span><br><span class="line">  <span class="attr">--front-y-multiplier</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attr">--back-y-multiplier</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attr">--coin-y-multiplier</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attr">--coin-x-multiplier</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attr">--coin-scale-multiplier</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attr">--coin-rotation-multiplier</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attr">--shine-opacity-multiplier</span>: <span class="number">0.4</span>;</span><br><span class="line">  <span class="attr">--shine-bg-multiplier</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">bottom</span>: <span class="built_in">calc</span>(<span class="built_in">var</span>(--coin-y-multiplier) * <span class="number">1rem</span> - <span class="number">3.5rem</span>);</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">3.5rem</span>;</span><br><span class="line">  <span class="attribute">margin-bottom</span>: <span class="number">3.05rem</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">right</span>: <span class="built_in">calc</span>(<span class="built_in">var</span>(--coin-x-multiplier) * <span class="number">34%</span> + <span class="number">16%</span>);</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">50%</span>) <span class="built_in">scale</span>(<span class="built_in">calc</span>(<span class="number">0.4</span> + <span class="built_in">var</span>(--coin-scale-multiplier))) <span class="built_in">rotate</span>(<span class="built_in">calc</span>(<span class="built_in">var</span>(--coin-rotation-multiplier) * -<span class="number">1deg</span>));</span><br><span class="line">  <span class="attribute">transition</span>: opacity <span class="number">100ms</span> linear <span class="number">200ms</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">3.5rem</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">3</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin__front</span>, <span class="selector-class">.coin__middle</span>, <span class="selector-class">.coin__back</span>, <span class="selector-class">.coin</span><span class="selector-pseudo">::before</span>, <span class="selector-class">.coin__front</span><span class="selector-pseudo">::after</span>, <span class="selector-class">.coin__back</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">3</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin__front</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">radial-gradient</span>(circle at <span class="number">50%</span> <span class="number">50%</span>, transparent <span class="number">50%</span>, <span class="built_in">rgba</span>(<span class="number">115</span>, <span class="number">124</span>, <span class="number">153</span>, <span class="number">0.4</span>) <span class="number">54%</span>, <span class="number">#c2cadf</span> <span class="number">54%</span>), <span class="built_in">linear-gradient</span>(<span class="number">210deg</span>, <span class="number">#8590b3</span> <span class="number">32%</span>, transparent <span class="number">32%</span>), <span class="built_in">linear-gradient</span>(<span class="number">150deg</span>, <span class="number">#8590b3</span> <span class="number">32%</span>, transparent <span class="number">32%</span>), <span class="built_in">linear-gradient</span>(to right, <span class="number">#8590b3</span> <span class="number">22%</span>, transparent <span class="number">22%</span>, transparent <span class="number">78%</span>, <span class="number">#8590b3</span> <span class="number">78%</span>), <span class="built_in">linear-gradient</span>(to bottom, <span class="number">#fcfaf9</span> <span class="number">44%</span>, transparent <span class="number">44%</span>, transparent <span class="number">65%</span>, <span class="number">#fcfaf9</span> <span class="number">65%</span>, <span class="number">#fcfaf9</span> <span class="number">71%</span>, <span class="number">#8590b3</span> <span class="number">71%</span>), <span class="built_in">linear-gradient</span>(to right, transparent <span class="number">28%</span>, <span class="number">#fcfaf9</span> <span class="number">28%</span>, <span class="number">#fcfaf9</span> <span class="number">34%</span>, <span class="number">#8590b3</span> <span class="number">34%</span>, <span class="number">#8590b3</span> <span class="number">40%</span>, <span class="number">#fcfaf9</span> <span class="number">40%</span>, <span class="number">#fcfaf9</span> <span class="number">47%</span>, <span class="number">#8590b3</span> <span class="number">47%</span>, <span class="number">#8590b3</span> <span class="number">53%</span>, <span class="number">#fcfaf9</span> <span class="number">53%</span>, <span class="number">#fcfaf9</span> <span class="number">60%</span>, <span class="number">#8590b3</span> <span class="number">60%</span>, <span class="number">#8590b3</span> <span class="number">66%</span>, <span class="number">#fcfaf9</span> <span class="number">66%</span>, <span class="number">#fcfaf9</span> <span class="number">72%</span>, transparent <span class="number">72%</span>);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#8590b3</span>;</span><br><span class="line">  <span class="attribute">background-size</span>: <span class="number">100%</span> <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="built_in">calc</span>(<span class="built_in">var</span>(--front-y-multiplier) * <span class="number">0.3181818182rem</span> / <span class="number">2</span>)) <span class="built_in">scaleY</span>(<span class="built_in">var</span>(--front-scale-multiplier));</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin__front</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.2</span>);</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="built_in">var</span>(--front-y-multiplier);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin__middle</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#737c99</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="built_in">calc</span>(<span class="built_in">var</span>(--middle-y-multiplier) * <span class="number">0.3181818182rem</span> / <span class="number">2</span>)) <span class="built_in">scaleY</span>(<span class="built_in">var</span>(--middle-scale-multiplier));</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin__back</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">radial-gradient</span>(circle at <span class="number">50%</span> <span class="number">50%</span>, transparent <span class="number">50%</span>, <span class="built_in">rgba</span>(<span class="number">115</span>, <span class="number">124</span>, <span class="number">153</span>, <span class="number">0.4</span>) <span class="number">54%</span>, <span class="number">#c2cadf</span> <span class="number">54%</span>), <span class="built_in">radial-gradient</span>(circle at <span class="number">50%</span> <span class="number">40%</span>, <span class="number">#fcfaf9</span> <span class="number">23%</span>, transparent <span class="number">23%</span>), <span class="built_in">radial-gradient</span>(circle at <span class="number">50%</span> <span class="number">100%</span>, <span class="number">#fcfaf9</span> <span class="number">35%</span>, transparent <span class="number">35%</span>);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#8590b3</span>;</span><br><span class="line">  <span class="attribute">background-size</span>: <span class="number">100%</span> <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="built_in">calc</span>(<span class="built_in">var</span>(--back-y-multiplier) * <span class="number">0.3181818182rem</span> / <span class="number">2</span>)) <span class="built_in">scaleY</span>(<span class="built_in">var</span>(--back-scale-multiplier));</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin__back</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.2</span>);</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="built_in">var</span>(--back-y-multiplier);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">radial-gradient</span>(circle at <span class="number">25%</span> <span class="number">65%</span>, transparent <span class="number">50%</span>, <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.9</span>) <span class="number">90%</span>), <span class="built_in">linear-gradient</span>(<span class="number">55deg</span>, transparent <span class="built_in">calc</span>(<span class="built_in">var</span>(--shine-bg-multiplier) + <span class="number">0%</span>), <span class="number">#e9f4ff</span> <span class="built_in">calc</span>(<span class="built_in">var</span>(--shine-bg-multiplier) + <span class="number">0%</span>), transparent <span class="built_in">calc</span>(<span class="built_in">var</span>(--shine-bg-multiplier) + <span class="number">50%</span>));</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="built_in">var</span>(--shine-opacity-multiplier);</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="built_in">calc</span>(<span class="built_in">var</span>(--middle-y-multiplier) * <span class="number">0.3181818182rem</span> / -<span class="number">2</span>)) <span class="built_in">scaleY</span>(<span class="built_in">var</span>(--middle-scale-multiplier)) <span class="built_in">rotate</span>(<span class="built_in">calc</span>(<span class="built_in">var</span>(--coin-rotation-multiplier) * <span class="number">1deg</span>));</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">10</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.coin</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#737c99</span>;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">0.3181818182rem</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">50%</span>);</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> shake &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">4deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">66%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">4deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>();</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>新建<code>[BlogRoot]\themes\butterfly\source\js\coin.js</code>，并写入如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> tipButtons = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;.tip-button&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">coinAudio</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> coinAudio = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;coinAudio&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (coinAudio) &#123;</span><br><span class="line">        coinAudio.<span class="title function_">play</span>();<span class="comment">//有音频时播放</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// Loop through all buttons (allows for multiple buttons on page)</span></span><br><span class="line">tipButtons.<span class="title function_">forEach</span>(<span class="function">(<span class="params">button</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">var</span> coin = button.<span class="title function_">querySelector</span>(<span class="string">&#x27;.coin&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// The larger the number, the slower the animation</span></span><br><span class="line">    coin.<span class="property">maxMoveLoopCount</span> = <span class="number">90</span></span><br><span class="line"></span><br><span class="line">    button.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="regexp">/Android|webOS|BlackBerry/i</span>.<span class="title function_">test</span>(navigator.<span class="property">userAgent</span>)) <span class="keyword">return</span> <span class="literal">true</span>; <span class="comment">//媒体选择</span></span><br><span class="line">        <span class="keyword">if</span> (button.<span class="property">clicked</span>) <span class="keyword">return</span></span><br><span class="line">        button.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;clicked&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Wait to start flipping th coin because of the button tilt animation</span></span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            <span class="comment">// Randomize the flipping speeds just for fun</span></span><br><span class="line">            coin.<span class="property">sideRotationCount</span> = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="number">5</span>) * <span class="number">90</span></span><br><span class="line">            coin.<span class="property">maxFlipAngle</span> = (<span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="number">4</span>) + <span class="number">3</span>) * <span class="title class_">Math</span>.<span class="property">PI</span></span><br><span class="line">            button.<span class="property">clicked</span> = <span class="literal">true</span></span><br><span class="line">            <span class="title function_">flipCoin</span>()</span><br><span class="line">            <span class="title function_">coinAudio</span>()</span><br><span class="line">        &#125;, <span class="number">50</span>)</span><br><span class="line">    &#125;)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> <span class="title function_">flipCoin</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">        coin.<span class="property">moveLoopCount</span> = <span class="number">0</span></span><br><span class="line">        <span class="title function_">flipCoinLoop</span>()</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> <span class="title function_">resetCoin</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--coin-x-multiplier&#x27;</span>, <span class="number">0</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--coin-scale-multiplier&#x27;</span>, <span class="number">0</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--coin-rotation-multiplier&#x27;</span>, <span class="number">0</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--shine-opacity-multiplier&#x27;</span>, <span class="number">0.4</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--shine-bg-multiplier&#x27;</span>, <span class="string">&#x27;50%&#x27;</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;opacity&#x27;</span>, <span class="number">1</span>)</span><br><span class="line">        <span class="comment">// Delay to give the reset animation some time before you can click again</span></span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            button.<span class="property">clicked</span> = <span class="literal">false</span></span><br><span class="line">        &#125;, <span class="number">300</span>)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> <span class="title function_">flipCoinLoop</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">        coin.<span class="property">moveLoopCount</span>++</span><br><span class="line">        <span class="keyword">var</span> percentageCompleted = coin.<span class="property">moveLoopCount</span> / coin.<span class="property">maxMoveLoopCount</span></span><br><span class="line">        coin.<span class="property">angle</span> = -coin.<span class="property">maxFlipAngle</span> * <span class="title class_">Math</span>.<span class="title function_">pow</span>((percentageCompleted - <span class="number">1</span>), <span class="number">2</span>) + coin.<span class="property">maxFlipAngle</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// Calculate the scale and position of the coin moving through the air</span></span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--coin-y-multiplier&#x27;</span>, -<span class="number">11</span> * <span class="title class_">Math</span>.<span class="title function_">pow</span>(percentageCompleted * <span class="number">2</span> - <span class="number">1</span>, <span class="number">4</span>) + <span class="number">11</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--coin-x-multiplier&#x27;</span>, percentageCompleted)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--coin-scale-multiplier&#x27;</span>, percentageCompleted * <span class="number">0.6</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--coin-rotation-multiplier&#x27;</span>, percentageCompleted * coin.<span class="property">sideRotationCount</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Calculate the scale and position values for the different coin faces</span></span><br><span class="line">        <span class="comment">// The math uses sin/cos wave functions to similate the circular motion of 3D spin</span></span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--front-scale-multiplier&#x27;</span>, <span class="title class_">Math</span>.<span class="title function_">max</span>(<span class="title class_">Math</span>.<span class="title function_">cos</span>(coin.<span class="property">angle</span>), <span class="number">0</span>))</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--front-y-multiplier&#x27;</span>, <span class="title class_">Math</span>.<span class="title function_">sin</span>(coin.<span class="property">angle</span>))</span><br><span class="line"></span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--middle-scale-multiplier&#x27;</span>, <span class="title class_">Math</span>.<span class="title function_">abs</span>(<span class="title class_">Math</span>.<span class="title function_">cos</span>(coin.<span class="property">angle</span>), <span class="number">0</span>))</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--middle-y-multiplier&#x27;</span>, <span class="title class_">Math</span>.<span class="title function_">cos</span>((coin.<span class="property">angle</span> + <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">2</span>) % <span class="title class_">Math</span>.<span class="property">PI</span>))</span><br><span class="line"></span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--back-scale-multiplier&#x27;</span>, <span class="title class_">Math</span>.<span class="title function_">max</span>(<span class="title class_">Math</span>.<span class="title function_">cos</span>(coin.<span class="property">angle</span> - <span class="title class_">Math</span>.<span class="property">PI</span>), <span class="number">0</span>))</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--back-y-multiplier&#x27;</span>, <span class="title class_">Math</span>.<span class="title function_">sin</span>(coin.<span class="property">angle</span> - <span class="title class_">Math</span>.<span class="property">PI</span>))</span><br><span class="line"></span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--shine-opacity-multiplier&#x27;</span>, <span class="number">4</span> * <span class="title class_">Math</span>.<span class="title function_">sin</span>((coin.<span class="property">angle</span> + <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">2</span>) % <span class="title class_">Math</span>.<span class="property">PI</span>) - <span class="number">3.2</span>)</span><br><span class="line">        coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--shine-bg-multiplier&#x27;</span>, -<span class="number">40</span> * (<span class="title class_">Math</span>.<span class="title function_">cos</span>((coin.<span class="property">angle</span> + <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">2</span>) % <span class="title class_">Math</span>.<span class="property">PI</span>) - <span class="number">0.5</span>) + <span class="string">&#x27;%&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Repeat animation loop</span></span><br><span class="line">        <span class="keyword">if</span> (coin.<span class="property">moveLoopCount</span> &lt; coin.<span class="property">maxMoveLoopCount</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (coin.<span class="property">moveLoopCount</span> === coin.<span class="property">maxMoveLoopCount</span> - <span class="number">6</span>) button.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;shrink-landing&#x27;</span>)</span><br><span class="line">            <span class="variable language_">window</span>.<span class="title function_">requestAnimationFrame</span>(flipCoinLoop)</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            button.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;coin-landed&#x27;</span>)</span><br><span class="line">            coin.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;opacity&#x27;</span>, <span class="number">0</span>)</span><br><span class="line">            <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                button.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&#x27;clicked&#x27;</span>, <span class="string">&#x27;shrink-landing&#x27;</span>, <span class="string">&#x27;coin-landed&#x27;</span>)</span><br><span class="line">                <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                    <span class="title function_">resetCoin</span>()</span><br><span class="line">                &#125;, <span class="number">300</span>)</span><br><span class="line">            &#125;, <span class="number">1500</span>)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li><li><p>修改主题配置文件<code>_config.butterfly.yml</code>,添加音频文件配置项以及CDN配置项：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">  # Sponsor/reward</span><br><span class="line">  reward:</span><br><span class="line">    enable: true</span><br><span class="line"><span class="addition">+   coinAudio: https://npm.elemecdn.com/akilar-candyassets@1.0.36/audio/aowu.m4a</span></span><br><span class="line">    QR_code:</span><br><span class="line">...</span><br><span class="line">  CDN:</span><br><span class="line">    # main</span><br><span class="line">    main_css: /css/index.css</span><br><span class="line">    jquery: https://npm.elemecdn.com/jquery@latest/dist/jquery.min.js</span><br><span class="line">    main: /js/main.js</span><br><span class="line">    utils:/js/utils.js</span><br><span class="line"><span class="addition">+    # 打赏按钮投币效果</span></span><br><span class="line"><span class="addition">+   coin_js: /js/coin.js</span></span><br><span class="line"><span class="addition">+   coin_css: /css/coin.css</span></span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\themes\butterfly\source\css\_layout\reward.styl</code>，整体替换为以下内容：</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.post-reward</span></span><br><span class="line">  <span class="attribute">position</span>: relative</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">3rem</span></span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span></span><br><span class="line">  <span class="attribute">text-align</span>: center</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.reward-button</span></span><br><span class="line">    <span class="attribute">display</span>: inline-block</span><br><span class="line">    <span class="attribute">padding</span>: .<span class="number">2rem</span> <span class="number">1.2rem</span></span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">var</span>(--btn-bg)</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--btn-color)</span><br><span class="line">    <span class="attribute">transition</span>: all .<span class="number">4s</span></span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">30px</span></span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">      <span class="attribute">box-shadow</span>: inset <span class="number">20em</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="built_in">var</span>(--btn-hover-color)</span><br><span class="line"></span><br><span class="line">      <span class="selector-class">.reward-main</span></span><br><span class="line">        <span class="attribute">display</span>: flex</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.reward-main</span></span><br><span class="line">      <span class="attribute">position</span>: absolute</span><br><span class="line">      <span class="attribute">bottom</span>: <span class="number">40px</span></span><br><span class="line">      <span class="attribute">left</span>: -<span class="number">55%</span></span><br><span class="line">      <span class="attribute">z-index</span>: <span class="number">100</span></span><br><span class="line">      <span class="attribute">display</span>: none</span><br><span class="line">      <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">15px</span></span><br><span class="line">      <span class="attribute">width</span>: <span class="number">150%</span></span><br><span class="line"></span><br><span class="line">      <span class="selector-class">.reward-all</span></span><br><span class="line">        <span class="attribute">display</span>: flex</span><br><span class="line">        <span class="attribute">margin</span>: <span class="number">0</span></span><br><span class="line">        <span class="attribute">padding</span>: <span class="number">1rem</span> .<span class="number">5rem</span></span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">12px</span></span><br><span class="line">        <span class="attribute">background</span>: <span class="built_in">var</span>(--reward-pop)</span><br><span class="line"></span><br><span class="line">        <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">          <span class="attribute">position</span>: absolute</span><br><span class="line">          <span class="attribute">bottom</span>: -<span class="number">10px</span></span><br><span class="line">          <span class="attribute">left</span>: <span class="number">0</span></span><br><span class="line">          <span class="attribute">width</span>: <span class="number">100%</span></span><br><span class="line">          <span class="attribute">height</span>: <span class="number">20px</span></span><br><span class="line">          <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line">        <span class="selector-pseudo">&amp;:after</span></span><br><span class="line">          <span class="attribute">position</span>: absolute</span><br><span class="line">          <span class="attribute">right</span>: <span class="number">0</span></span><br><span class="line">          <span class="attribute">bottom</span>: <span class="number">2px</span></span><br><span class="line">          <span class="attribute">left</span>: <span class="number">0</span></span><br><span class="line">          <span class="attribute">margin</span>: <span class="number">0</span> auto</span><br><span class="line">          <span class="attribute">width</span>: <span class="number">0</span></span><br><span class="line">          <span class="attribute">height</span>: <span class="number">0</span></span><br><span class="line">          <span class="attribute">border-top</span>: <span class="number">13px</span> solid <span class="built_in">var</span>(--reward-pop)</span><br><span class="line">          <span class="attribute">border-right</span>: <span class="number">13px</span> solid transparent</span><br><span class="line">          <span class="attribute">border-left</span>: <span class="number">13px</span> solid transparent</span><br><span class="line">          <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line">        <span class="selector-class">.reward-item</span></span><br><span class="line">          <span class="attribute">display</span>: inline-block</span><br><span class="line">          <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">8px</span></span><br><span class="line">          <span class="attribute">list-style-type</span>: none</span><br><span class="line">          <span class="attribute">vertical-align</span>: top</span><br><span class="line"></span><br><span class="line">          <span class="selector-tag">img</span></span><br><span class="line">            <span class="attribute">width</span>: <span class="number">130px</span></span><br><span class="line">            <span class="attribute">height</span>: <span class="number">130px</span></span><br><span class="line"></span><br><span class="line">          <span class="selector-class">.post-qr-code-desc</span></span><br><span class="line">            <span class="attribute">padding-top</span>: .<span class="number">4rem</span></span><br><span class="line">            <span class="attribute">width</span>: <span class="number">130px</span></span><br><span class="line">            <span class="attribute">color</span>: <span class="variable">$reward</span>-pop-up-color</span><br></pre></td></tr></table></figure></li><li><p>到这里基本就完成了，这里需要微调的是步骤5中的第16、24和28行，根据自己的二维码宽度进行调节，然后重启项目：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="gulp压缩全局资源-店长">gulp压缩全局资源(店长)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://akilar.top/posts/49b73b87/">使用gulp压缩博客静态资源</a></p>              </div>            </details><h2 id="Github-Action自动部署（店长）">Github Action自动部署（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://akilar.top/posts/f752c86d/">使用Github Action实现全自动部署</a></p>              </div>            </details><h2 id="新版Aplayer-安知鱼">新版Aplayer(安知鱼)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://anzhiy.cn/posts/6c69.html">butterfly魔改aplayer音乐</a></p>              </div>            </details><h2 id="首页飞只因-tzy">首页飞只因(tzy)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://tzy1997.com/articles/hexo1615/">飞只因太美，给你的首页装上吧！</a></p>              </div>            </details><h2 id="Hexo-Butterfly-一些常见问题-tzy">Hexo + Butterfly 一些常见问题(tzy)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://tzy1997.com/articles/hexo1612/">Hexo + Butterfly 一些常见问题</a></p>              </div>            </details><h2 id="Vercel被墙导致Twikoo评论失败的解决方案-tzy">Vercel被墙导致Twikoo评论失败的解决方案(tzy)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://tzy1997.com/articles/hexo1614/">关于Vercel被墙导致获取Twikoo评论失败的解决方案</a></p>              </div>            </details><h2 id="Algolia搜索系统">Algolia搜索系统</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>当网站数据多了，建议用搜索系统，会使得网站加载速度更快！</p><p>参考教程：</p><p><a href="https://tzy1997.com/articles/hexo1607/">TZY：基于 Hexo 键入搜索功能</a></p><p>搜索显示内容一定要装 <code>hexo-algoliasearch</code>，并且卸载<code> hexo-algolia</code>，两者会冲突，还要指定一个插件项：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 新版的搜索插件</span></span><br><span class="line"><span class="attr">plugins:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo-algoliasearch</span></span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="🍕🍕🍕写在最后">🍕🍕🍕写在最后</h2><ul><li><p>大家有啥教程想看的可以在评论区留言，如果搭建或者魔改过程中遇到不懂的可以加下面的群讨论，同时本人在B站有空也会做一些魔改系列的视频教程，点这里可以进入我的B站账号个人空间<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a></p><img src="https://s1.vika.cn/space/2022/11/04/0bd8a1a7e8f64d6a8248d1d872c5a178" alt="二维码" style="zoom:50%;" /></li></ul>]]></content>
    
    
    <summary type="html">🍊这是博客魔改教程总结的第五期</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>博客魔改教程总结(四)</title>
    <link href="https://www.fomal.cc/posts/d739261b.html"/>
    <id>https://www.fomal.cc/posts/d739261b.html</id>
    <published>2022-12-31T00:00:00.000Z</published>
    <updated>2023-01-07T11:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>魔改前必看（我当你们都懂了，太细节的就不写在教程中了🤣🤣🤣）</b></font></p><ol><li>博客魔改有风险，如果博客魔改出问题了又没有备份，可通过此项目查看基础源码进行<strong>回滚</strong>：<a href="https://github.com/jerryc127/hexo-theme-butterfly">jerryc127/hexo-theme-butterfly</a>、<a href="https://github.com/ccknbc-actions/blog-butterfly">ccknbc-actions/blog-butterfly</a>。</li><li>这部分魔改基本上都是大佬们造好的轮子，我按照大佬们的轮子结合自己的喜好进行魔改的，具体见我友人帐第一个栏目大佬们的网站，本处仅做一个总结，如有侵权请联系删除。</li><li>鉴于每个人的根目录名称都不一样，本帖<strong>博客根目录</strong>一律以<code>[BlogRoot]</code>指代。</li><li>本帖涉及魔改源码的内容，会使用<strong>diff代码块</strong>标识，复制时请<strong>不要忘记删除</strong>前面的<code>+、-</code>符号。</li><li>因为<code>.pug</code>和<code>.styl</code>以及<code>.yml</code>等对缩进要求较为严格，请尽量<strong>不要使用记事本等无法提供语法高亮的文本编辑器</strong>进行修改。</li><li>本帖基于<code>Butterfly主题</code>进行魔改方案编写，因此请读者优先掌握<a href="https://butterfly.js.org/">Butterfly主题官方文档</a>的内容后再来进行魔改。</li><li>魔改会过程常常引入<strong>自定义的css与js文件</strong>，方法见<a href="https://b.leonus.cn/2022/custom.html">Hexo博客添加自定义css和js文件</a>(太懒了不想自己写)</li></ol><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a> ⇦当前位置🪂</li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="夜间模式动画-店长">夜间模式动画(店长)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/d9550c81/">添加白天夜间模式转换动画</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p>见本站切换样式😋😋😋</p></div></div><ol><li><p>新建<code>[BlogRoot]\themes\butterfly\layout\includes\custom\sun_moon.pug</code>,这部分其实实质上就是一个svg文件，通过js操作它的旋转显隐，淡入淡出实现动画效果。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">svg(aria-hidden=&#x27;true&#x27;, style=&#x27;position:absolute; overflow:hidden; width:0; height:0&#x27;)</span><br><span class="line">  symbol#icon-sun(viewBox=&#x27;0 0 1024 1024&#x27;)</span><br><span class="line">    path(d=&#x27;M960 512l-128 128v192h-192l-128 128-128-128H192v-192l-128-128 128-128V192h192l128-128 128 128h192v192z&#x27;, fill=&#x27;#FFD878&#x27;, p-id=&#x27;8420&#x27;)</span><br><span class="line">    path(d=&#x27;M736 512a224 224 0 1 0-448 0 224 224 0 1 0 448 0z&#x27;, fill=&#x27;#FFE4A9&#x27;, p-id=&#x27;8421&#x27;)</span><br><span class="line">    path(d=&#x27;M512 109.248L626.752 224H800v173.248L914.752 512 800 626.752V800h-173.248L512 914.752 397.248 800H224v-173.248L109.248 512 224 397.248V224h173.248L512 109.248M512 64l-128 128H192v192l-128 128 128 128v192h192l128 128 128-128h192v-192l128-128-128-128V192h-192l-128-128z&#x27;, fill=&#x27;#4D5152&#x27;, p-id=&#x27;8422&#x27;)</span><br><span class="line">    path(d=&#x27;M512 320c105.888 0 192 86.112 192 192s-86.112 192-192 192-192-86.112-192-192 86.112-192 192-192m0-32a224 224 0 1 0 0 448 224 224 0 0 0 0-448z&#x27;, fill=&#x27;#4D5152&#x27;, p-id=&#x27;8423&#x27;)</span><br><span class="line">  symbol#icon-moon(viewBox=&#x27;0 0 1024 1024&#x27;)</span><br><span class="line">    path(d=&#x27;M611.370667 167.082667a445.013333 445.013333 0 0 1-38.4 161.834666 477.824 477.824 0 0 1-244.736 244.394667 445.141333 445.141333 0 0 1-161.109334 38.058667 85.077333 85.077333 0 0 0-65.066666 135.722666A462.08 462.08 0 1 0 747.093333 102.058667a85.077333 85.077333 0 0 0-135.722666 65.024z&#x27;, fill=&#x27;#FFB531&#x27;, p-id=&#x27;11345&#x27;)</span><br><span class="line">    path(d=&#x27;M329.728 274.133333l35.157333-35.157333a21.333333 21.333333 0 1 0-30.165333-30.165333l-35.157333 35.157333-35.114667-35.157333a21.333333 21.333333 0 0 0-30.165333 30.165333l35.114666 35.157333-35.114666 35.157334a21.333333 21.333333 0 1 0 30.165333 30.165333l35.114667-35.157333 35.157333 35.157333a21.333333 21.333333 0 1 0 30.165333-30.165333z&#x27;, fill=&#x27;#030835&#x27;, p-id=&#x27;11346&#x27;)</span><br></pre></td></tr></table></figure></li><li><p>新建<code>[BlogRoot]\themes\butterfly\source\css\_layout\sun_moon.styl</code></p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.Cuteen_DarkSky</span>,</span><br><span class="line"><span class="selector-class">.Cuteen_DarkSky</span><span class="selector-pseudo">:before</span></span><br><span class="line">  <span class="attribute">content</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">  <span class="attribute">position</span> fixed</span><br><span class="line">  <span class="attribute">left</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">right</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">top</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">bottom</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">z-index</span> <span class="number">88888888</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.Cuteen_DarkSky</span></span><br><span class="line">  <span class="attribute">background</span> <span class="built_in">linear-gradient</span>(<span class="number">#feb8b0</span>, <span class="number">#fef9db</span>)</span><br><span class="line">  <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">    <span class="attribute">transition</span> <span class="number">2s</span> ease all</span><br><span class="line">    <span class="attribute">opacity</span> <span class="number">0</span></span><br><span class="line">    <span class="attribute">background</span> <span class="built_in">linear-gradient</span>(<span class="number">#4c3f6d</span>, <span class="number">#6c62bb</span>, <span class="number">#93b1ed</span>)</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.DarkMode</span></span><br><span class="line">  <span class="selector-class">.Cuteen_DarkSky</span></span><br><span class="line">    <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">      <span class="attribute">opacity</span> <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.Cuteen_DarkPlanet</span></span><br><span class="line">  <span class="attribute">z-index</span> <span class="number">99999999</span></span><br><span class="line">  <span class="attribute">position</span> fixed</span><br><span class="line">  <span class="attribute">left</span> -<span class="number">50%</span></span><br><span class="line">  <span class="attribute">top</span> -<span class="number">50%</span></span><br><span class="line">  <span class="attribute">width</span> <span class="number">200%</span></span><br><span class="line">  <span class="attribute">height</span> <span class="number">200%</span></span><br><span class="line">  -webkit-<span class="attribute">animation</span> CuteenPlanetMove <span class="number">2s</span> <span class="built_in">cubic-bezier</span>(<span class="number">0.7</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">  <span class="attribute">animation</span> CuteenPlanetMove <span class="number">2s</span> <span class="built_in">cubic-bezier</span>(<span class="number">0.7</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">  <span class="attribute">transform-origin</span> center bottom</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> CuteenPlanetMove &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  to &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> CuteenPlanetMove &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  to &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.Cuteen_DarkPlanet</span></span><br><span class="line">  <span class="selector-pseudo">&amp;:after</span></span><br><span class="line">    <span class="attribute">position</span> absolute</span><br><span class="line">    <span class="attribute">left</span> <span class="number">35%</span></span><br><span class="line">    <span class="attribute">top</span> <span class="number">40%</span></span><br><span class="line">    <span class="attribute">width</span> <span class="number">9.375rem</span></span><br><span class="line">    <span class="attribute">height</span> <span class="number">9.375rem</span></span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">50%</span></span><br><span class="line">    <span class="attribute">content</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="attribute">background</span> <span class="built_in">linear-gradient</span>(<span class="number">#fefefe</span>, <span class="number">#fffbe8</span>)</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.search</span></span><br><span class="line">  <span class="selector-tag">span</span></span><br><span class="line">    <span class="attribute">display</span> none</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.menus_item</span></span><br><span class="line">  <span class="selector-tag">a</span></span><br><span class="line">    <span class="attribute">text-decoration</span> none<span class="meta">!important</span></span><br><span class="line"><span class="comment">//按钮相关，对侧栏按钮做过魔改的可以调整这里的数值</span></span><br><span class="line"><span class="selector-class">.icon-V</span></span><br><span class="line">  <span class="attribute">padding</span> <span class="number">5px</span></span><br></pre></td></tr></table></figure></li><li><p>新建<code>[BlogRoot]\themes\butterfly\source\js\sun_moon.js</code>,去除了冗余代码，去jquery</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">switchNightMode</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="title function_">insertAdjacentHTML</span>(<span class="string">&#x27;beforeend&#x27;</span>, <span class="string">&#x27;&lt;div class=&quot;Cuteen_DarkSky&quot;&gt;&lt;div class=&quot;Cuteen_DarkPlanet&quot;&gt;&lt;/div&gt;&lt;/div&gt;&#x27;</span>),</span><br><span class="line">    <span class="built_in">setTimeout</span>(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">      <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">contains</span>(<span class="string">&#x27;DarkMode&#x27;</span>) ? (<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&#x27;DarkMode&#x27;</span>), <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;isDark&#x27;</span>, <span class="string">&#x27;0&#x27;</span>), <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-moon&#x27;</span>)) : (<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;DarkMode&#x27;</span>), <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;isDark&#x27;</span>, <span class="string">&#x27;1&#x27;</span>), <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-sun&#x27;</span>)),</span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">          <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&#x27;Cuteen_DarkSky&#x27;</span>)[<span class="number">0</span>].<span class="property">style</span>.<span class="property">transition</span> = <span class="string">&#x27;opacity 3s&#x27;</span>;</span><br><span class="line">          <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&#x27;Cuteen_DarkSky&#x27;</span>)[<span class="number">0</span>].<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">          <span class="built_in">setTimeout</span>(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&#x27;Cuteen_DarkSky&#x27;</span>)[<span class="number">0</span>].<span class="title function_">remove</span>();</span><br><span class="line">          &#125;, <span class="number">1e3</span>);</span><br><span class="line">        &#125;, <span class="number">2e3</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">  <span class="keyword">const</span> nowMode = <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="title function_">getAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>) === <span class="string">&#x27;dark&#x27;</span> ? <span class="string">&#x27;dark&#x27;</span> : <span class="string">&#x27;light&#x27;</span></span><br><span class="line">  <span class="keyword">if</span> (nowMode === <span class="string">&#x27;light&#x27;</span>) &#123;</span><br><span class="line">    <span class="title function_">activateDarkMode</span>()</span><br><span class="line">    saveToLocal.<span class="title function_">set</span>(<span class="string">&#x27;theme&#x27;</span>, <span class="string">&#x27;dark&#x27;</span>, <span class="number">2</span>)</span><br><span class="line">    <span class="variable constant_">GLOBAL_CONFIG</span>.<span class="property">Snackbar</span> !== <span class="literal">undefined</span> &amp;&amp; btf.<span class="title function_">snackbarShow</span>(<span class="variable constant_">GLOBAL_CONFIG</span>.<span class="property">Snackbar</span>.<span class="property">day_to_night</span>)</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-sun&#x27;</span>)</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="title function_">activateLightMode</span>()</span><br><span class="line">    saveToLocal.<span class="title function_">set</span>(<span class="string">&#x27;theme&#x27;</span>, <span class="string">&#x27;light&#x27;</span>, <span class="number">2</span>)</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;DarkMode&#x27;</span>), <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-moon&#x27;</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">// handle some cases</span></span><br><span class="line">  <span class="keyword">typeof</span> utterancesTheme === <span class="string">&#x27;function&#x27;</span> &amp;&amp; <span class="title function_">utterancesTheme</span>()</span><br><span class="line">  <span class="keyword">typeof</span> <span class="variable constant_">FB</span> === <span class="string">&#x27;object&#x27;</span> &amp;&amp; <span class="variable language_">window</span>.<span class="title function_">loadFBComment</span>()</span><br><span class="line">  <span class="variable language_">window</span>.<span class="property">DISQUS</span> &amp;&amp; <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;disqus_thread&#x27;</span>).<span class="property">children</span>.<span class="property">length</span> &amp;&amp; <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> <span class="variable language_">window</span>.<span class="title function_">disqusReset</span>(), <span class="number">200</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\head.pug</code>,在文件末位加上一行</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">  //- global config</span><br><span class="line">  !=partial(&#x27;includes/head/config&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">  include ./head/config_site.pug</span><br><span class="line">  include ./head/noscript.pug</span><br><span class="line"></span><br><span class="line">  !=fragment_cache(&#x27;injectHeadJs&#x27;, function()&#123;return inject_head_js()&#125;)</span><br><span class="line"></span><br><span class="line">  !=fragment_cache(&#x27;injectHead&#x27;, function()&#123;return injectHtml(theme.inject.head)&#125;)</span><br><span class="line"><span class="addition">+ include ./custom/sun_moon.pug</span></span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\rightside.pug</code>,把原本的昼夜切换按钮替换掉</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">  when &#x27;translate&#x27;</span><br><span class="line">    if translate.enable</span><br><span class="line">      button#translateLink(type=&quot;button&quot; title=_p(&#x27;rightside.translate_title&#x27;))= translate.default</span><br><span class="line">  when &#x27;darkmode&#x27;</span><br><span class="line">    if darkmode.enable &amp;&amp; darkmode.button</span><br><span class="line"><span class="deletion">-     button#darkmode(type=&quot;button&quot; title=_p(&#x27;rightside.night_mode_title&#x27;))</span></span><br><span class="line"><span class="deletion">-       i.fas.fa-adjust</span></span><br><span class="line"><span class="addition">+     a.icon-V.hidden(onclick=&#x27;switchNightMode()&#x27;,  title=_p(&#x27;rightside.night_mode_title&#x27;))</span></span><br><span class="line"><span class="addition">+       svg(width=&#x27;25&#x27;, height=&#x27;25&#x27;, viewBox=&#x27;0 0 1024 1024&#x27;)</span></span><br><span class="line"><span class="addition">+         use#modeicon(xlink:href=&#x27;#icon-moon&#x27;)</span></span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\_config.butterfly.yml</code>,引入一下js</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  bottom:</span><br><span class="line"><span class="addition">+    - &lt;script src=&quot;/js/sun_moon.js&quot; async&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目并切换夜间模式即可看见效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="夜间模式切换动画2-0">夜间模式切换动画2.0</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="note info modern"><p>逛博客看见别人的切换动画有月亮，而且颜色也很好看，于是一顿f12操作下大概看懂原理，再结合现在的动画改进一下就是了。(注意：在做本魔改前，请先完成店长的夜间模式切换动画，同时最好也要有引入Vue+Element弹窗。本动画是基于店长的样式改进的，加入了弯月，切换到夜间模式是太阳变月亮，切换到白天模式是月亮变太阳，同时背景颜色也改为了我喜欢的。)</p></div><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/03/5a4b75c6dc17c5938188e86c1523e3b6.gif" alt="5a4b75c6dc17c5938188e86c1523e3b6.gif" style="zoom: 67%;" /></div></div><ol><li><p>替换原来的<code>[BlogRoot]\source\js\sun_moon.js</code>为以下代码，这里主要改进是由原来的<code>after</code>遮罩换为两个元素，再通过定时器来控制各自元素的透明度达到绘制太阳和月亮的目的：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">switchNightMode</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="title function_">insertAdjacentHTML</span>(<span class="string">&#x27;beforeend&#x27;</span>, <span class="string">&#x27;&lt;div class=&quot;Cuteen_DarkSky&quot;&gt;&lt;div class=&quot;Cuteen_DarkPlanet&quot;&gt;&lt;div id=&quot;sun&quot;&gt;&lt;/div&gt;&lt;div id=&quot;moon&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#x27;</span>),</span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">contains</span>(<span class="string">&#x27;DarkMode&#x27;</span>) ? (<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&#x27;DarkMode&#x27;</span>), <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;isDark&#x27;</span>, <span class="string">&#x27;0&#x27;</span>), <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-moon&#x27;</span>)) : (<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;DarkMode&#x27;</span>), <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;isDark&#x27;</span>, <span class="string">&#x27;1&#x27;</span>), <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-sun&#x27;</span>)),</span><br><span class="line">                <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&#x27;Cuteen_DarkSky&#x27;</span>)[<span class="number">0</span>].<span class="property">style</span>.<span class="property">transition</span> = <span class="string">&#x27;opacity 3s&#x27;</span>;</span><br><span class="line">                    <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&#x27;Cuteen_DarkSky&#x27;</span>)[<span class="number">0</span>].<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">                    <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                        <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&#x27;Cuteen_DarkSky&#x27;</span>)[<span class="number">0</span>].<span class="title function_">remove</span>();</span><br><span class="line">                    &#125;, <span class="number">1e3</span>);</span><br><span class="line">                &#125;, <span class="number">2e3</span>)</span><br><span class="line">        &#125;)</span><br><span class="line">    <span class="keyword">const</span> nowMode = <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="title function_">getAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>) === <span class="string">&#x27;dark&#x27;</span> ? <span class="string">&#x27;dark&#x27;</span> : <span class="string">&#x27;light&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> (nowMode === <span class="string">&#x27;light&#x27;</span>) &#123;</span><br><span class="line">        <span class="comment">// 先设置太阳月亮透明度</span></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;sun&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;1&quot;</span>;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;moon&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;0&quot;</span>;</span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;sun&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;0&quot;</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;moon&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;1&quot;</span>;</span><br><span class="line">        &#125;, <span class="number">1000</span>);</span><br><span class="line"></span><br><span class="line">        <span class="title function_">activateDarkMode</span>()</span><br><span class="line">        saveToLocal.<span class="title function_">set</span>(<span class="string">&#x27;theme&#x27;</span>, <span class="string">&#x27;dark&#x27;</span>, <span class="number">2</span>)</span><br><span class="line">        <span class="comment">// GLOBAL_CONFIG.Snackbar !== undefined &amp;&amp; btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night)</span></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-sun&#x27;</span>)</span><br><span class="line">        <span class="comment">// 延时弹窗提醒</span></span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">                <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">                        <span class="attr">title</span>: <span class="string">&quot;关灯啦🌙&quot;</span>,</span><br><span class="line">                        <span class="attr">message</span>: <span class="string">&quot;当前已成功切换至夜间模式！&quot;</span>,</span><br><span class="line">                        <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">                        <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">                        <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">                        <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">                        <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;, <span class="number">2000</span>)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="comment">// 先设置太阳月亮透明度</span></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;sun&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;0&quot;</span>;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;moon&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;1&quot;</span>;</span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;sun&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;1&quot;</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;moon&quot;</span>).<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&quot;0&quot;</span>;</span><br><span class="line">        &#125;, <span class="number">1000</span>);</span><br><span class="line">        </span><br><span class="line">        <span class="title function_">activateLightMode</span>()</span><br><span class="line">        saveToLocal.<span class="title function_">set</span>(<span class="string">&#x27;theme&#x27;</span>, <span class="string">&#x27;light&#x27;</span>, <span class="number">2</span>)</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>).<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;DarkMode&#x27;</span>), <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;modeicon&#x27;</span>).<span class="title function_">setAttribute</span>(<span class="string">&#x27;xlink:href&#x27;</span>, <span class="string">&#x27;#icon-moon&#x27;</span>)</span><br><span class="line">        <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">                <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">                        <span class="attr">title</span>: <span class="string">&quot;开灯啦🌞&quot;</span>,</span><br><span class="line">                        <span class="attr">message</span>: <span class="string">&quot;当前已成功切换至白天模式！&quot;</span>,</span><br><span class="line">                        <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">                        <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">                        <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">                        <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">                        <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;, <span class="number">2000</span>)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// handle some cases</span></span><br><span class="line">    <span class="keyword">typeof</span> utterancesTheme === <span class="string">&#x27;function&#x27;</span> &amp;&amp; <span class="title function_">utterancesTheme</span>()</span><br><span class="line">    <span class="keyword">typeof</span> <span class="variable constant_">FB</span> === <span class="string">&#x27;object&#x27;</span> &amp;&amp; <span class="variable language_">window</span>.<span class="title function_">loadFBComment</span>()</span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">DISQUS</span> &amp;&amp; <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;disqus_thread&#x27;</span>).<span class="property">children</span>.<span class="property">length</span> &amp;&amp; <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> <span class="variable language_">window</span>.<span class="title function_">disqusReset</span>(), <span class="number">200</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>替换原来的<code>[BlogRoot]\themes\butterfly\source\css\_layout\sun_moon.styl</code>为以下代码，主要改变是的绘制太阳和月亮的矢量信息，还有背景颜色改进：</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.Cuteen_DarkSky</span>,</span><br><span class="line"><span class="selector-class">.Cuteen_DarkSky</span><span class="selector-pseudo">:before</span></span><br><span class="line">  <span class="attribute">content</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">  <span class="attribute">position</span> fixed</span><br><span class="line">  <span class="attribute">left</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">right</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">top</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">bottom</span> <span class="number">0</span></span><br><span class="line">  <span class="attribute">z-index</span> <span class="number">88888888</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.Cuteen_DarkSky</span></span><br><span class="line">  <span class="attribute">background</span> <span class="built_in">linear-gradient</span>(to top, <span class="number">#f8cd71</span> <span class="number">0</span>, <span class="number">#5bfde9</span> <span class="number">80%</span>)</span><br><span class="line">  <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">    <span class="attribute">transition</span> <span class="number">2s</span> ease all</span><br><span class="line">    <span class="attribute">opacity</span> <span class="number">0</span></span><br><span class="line">    <span class="attribute">background</span> <span class="built_in">linear-gradient</span>(to top, <span class="number">#30cfd0</span> <span class="number">0</span>, <span class="number">#330867</span> <span class="number">100%</span>)</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.DarkMode</span></span><br><span class="line">  <span class="selector-class">.Cuteen_DarkSky</span></span><br><span class="line">    <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">      <span class="attribute">opacity</span> <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.Cuteen_DarkPlanet</span></span><br><span class="line">  <span class="attribute">z-index</span> <span class="number">99999999</span></span><br><span class="line">  <span class="attribute">position</span> fixed</span><br><span class="line">  <span class="attribute">left</span> -<span class="number">50%</span></span><br><span class="line">  <span class="attribute">top</span> -<span class="number">50%</span></span><br><span class="line">  <span class="attribute">width</span> <span class="number">200%</span></span><br><span class="line">  <span class="attribute">height</span> <span class="number">200%</span></span><br><span class="line">  -webkit-<span class="attribute">animation</span> CuteenPlanetMove <span class="number">2s</span> <span class="built_in">cubic-bezier</span>(<span class="number">0.7</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">  <span class="attribute">animation</span> CuteenPlanetMove <span class="number">2s</span> <span class="built_in">cubic-bezier</span>(<span class="number">0.7</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">  <span class="attribute">transform-origin</span> center bottom</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> CuteenPlanetMove &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  to &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> CuteenPlanetMove &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  to &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.Cuteen_DarkPlanet</span></span><br><span class="line">  <span class="selector-id">#sun</span></span><br><span class="line">    <span class="attribute">position</span> absolute</span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">100%</span></span><br><span class="line">    <span class="attribute">left</span> <span class="number">44%</span></span><br><span class="line">    <span class="attribute">top</span> <span class="number">30%</span></span><br><span class="line">    <span class="attribute">height</span> <span class="number">6rem</span></span><br><span class="line">    <span class="attribute">width</span> <span class="number">6rem</span></span><br><span class="line">    <span class="attribute">background</span> <span class="number">#ffee94</span></span><br><span class="line">    <span class="attribute">box-shadow</span> <span class="number">0</span> <span class="number">0</span> <span class="number">40px</span> <span class="number">#ffee94</span></span><br><span class="line">    <span class="comment">// opacity 0</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-id">#moon</span></span><br><span class="line">    <span class="attribute">position</span> absolute</span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">100%</span></span><br><span class="line">    <span class="attribute">left</span> <span class="number">44%</span></span><br><span class="line">    <span class="attribute">top</span> <span class="number">30%</span></span><br><span class="line">    <span class="attribute">position</span> absolute</span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">100%</span></span><br><span class="line">    <span class="attribute">height</span> <span class="number">6rem</span></span><br><span class="line">    <span class="attribute">width</span> <span class="number">6rem</span></span><br><span class="line">    <span class="attribute">box-shadow</span> -<span class="number">1.8em</span> <span class="number">1.8em</span> <span class="number">0</span> <span class="number">0.2em</span> <span class="number">#fff</span></span><br><span class="line">    <span class="comment">// opacity 1</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">// &amp;:after</span></span><br><span class="line">  <span class="comment">//   position absolute</span></span><br><span class="line">  <span class="comment">//   left 42%</span></span><br><span class="line">  <span class="comment">//   top 30%</span></span><br><span class="line">  <span class="comment">//   width 6rem</span></span><br><span class="line">  <span class="comment">//   height 6rem</span></span><br><span class="line">  <span class="comment">//   border-radius 50%</span></span><br><span class="line">  <span class="comment">//   content &#x27;&#x27;</span></span><br><span class="line">  <span class="comment">//   background #ffef9e</span></span><br><span class="line">  <span class="comment">//   box-shadow 0 0 30px #ffef9e</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.search</span></span><br><span class="line">  <span class="selector-tag">span</span></span><br><span class="line">    <span class="attribute">display</span> none</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.menus_item</span></span><br><span class="line">  <span class="selector-tag">a</span></span><br><span class="line">    <span class="attribute">text-decoration</span> none<span class="meta">!important</span></span><br><span class="line"><span class="comment">//按钮相关，对侧栏按钮做过魔改的可以调整这里的数值</span></span><br><span class="line"><span class="comment">// .icon-V</span></span><br><span class="line"><span class="comment">//   padding 5px</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目并切换夜间模式即可看到效果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="欢迎信息显示地理位置">欢迎信息显示地理位置</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://ichika.cc/Article/beautiful_IPLocation/">给博客添加腾讯地图定位并制作个性欢迎</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-9a05b1f06a1cfad05.webp" alt="image-9a05b1f06a1cfad05.webp" style="zoom:50%;" /></div></div><ol><li><p>获取<code>API Key</code>：进入<a href="https://lbs.qq.com/dev/console/application/mine">腾讯位置服务</a>应用管理界面，点击创建应用，应用名称和类型随便填。在新创建的应用中点击添加<code>key</code>，产品选择<code>WebServiceAPI</code>，域名白名单填自己的域名或不填。把得到的key记下。如果开启白名单记得把localhost也加上</p><img src="https://cdn.ichika.cc/typora/image-20221014103726639.png!towebp" style="zoom: 67%;" /></li><li><p>新建<code>[BlogRoot]\source\js\txmap.js</code>，并写入如下代码，记住替换key的内容：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//get请求</span></span><br><span class="line">$.<span class="title function_">ajax</span>(&#123;</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&#x27;get&#x27;</span>,</span><br><span class="line">    <span class="attr">url</span>: <span class="string">&#x27;https://apis.map.qq.com/ws/location/v1/ip&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">key</span>: <span class="string">&#x27;你的key&#x27;</span>,</span><br><span class="line">        <span class="attr">output</span>: <span class="string">&#x27;jsonp&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">dataType</span>: <span class="string">&#x27;jsonp&#x27;</span>,</span><br><span class="line">    <span class="attr">success</span>: <span class="keyword">function</span> (<span class="params">res</span>) &#123;</span><br><span class="line">        ipLoacation = res;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getDistance</span>(<span class="params">e1, n1, e2, n2</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> R = <span class="number">6371</span></span><br><span class="line">    <span class="keyword">const</span> &#123; sin, cos, asin, <span class="variable constant_">PI</span>, hypot &#125; = <span class="title class_">Math</span></span><br><span class="line">    <span class="keyword">let</span> <span class="title function_">getPoint</span> = (<span class="params">e, n</span>) =&gt; &#123;</span><br><span class="line">        e *= <span class="variable constant_">PI</span> / <span class="number">180</span></span><br><span class="line">        n *= <span class="variable constant_">PI</span> / <span class="number">180</span></span><br><span class="line">        <span class="keyword">return</span> &#123; <span class="attr">x</span>: <span class="title function_">cos</span>(n) * <span class="title function_">cos</span>(e), <span class="attr">y</span>: <span class="title function_">cos</span>(n) * <span class="title function_">sin</span>(e), <span class="attr">z</span>: <span class="title function_">sin</span>(n) &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> a = <span class="title function_">getPoint</span>(e1, n1)</span><br><span class="line">    <span class="keyword">let</span> b = <span class="title function_">getPoint</span>(e2, n2)</span><br><span class="line">    <span class="keyword">let</span> c = <span class="title function_">hypot</span>(a.<span class="property">x</span> - b.<span class="property">x</span>, a.<span class="property">y</span> - b.<span class="property">y</span>, a.<span class="property">z</span> - b.<span class="property">z</span>)</span><br><span class="line">    <span class="keyword">let</span> r = <span class="title function_">asin</span>(c / <span class="number">2</span>) * <span class="number">2</span> * R</span><br><span class="line">    <span class="keyword">return</span> <span class="title class_">Math</span>.<span class="title function_">round</span>(r);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">showWelcome</span>(<span class="params"></span>) &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> dist = <span class="title function_">getDistance</span>(<span class="number">113.34499552</span>, <span class="number">23.15537143</span>, ipLoacation.<span class="property">result</span>.<span class="property">location</span>.<span class="property">lng</span>, ipLoacation.<span class="property">result</span>.<span class="property">location</span>.<span class="property">lat</span>); <span class="comment">//这里换成自己的经纬度</span></span><br><span class="line">    <span class="keyword">let</span> pos = ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">nation</span>;</span><br><span class="line">    <span class="keyword">let</span> ip;</span><br><span class="line">    <span class="keyword">let</span> posdesc;</span><br><span class="line">    <span class="comment">//根据国家、省份、城市信息自定义欢迎语</span></span><br><span class="line">    <span class="keyword">switch</span> (ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">nation</span>) &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;日本&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;よろしく，一起去看樱花吗&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;美国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;Let us live in peace!&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;英国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;想同你一起夜乘伦敦眼&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;俄罗斯&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;干了这瓶伏特加！&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;法国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;C&#x27;est La Vie&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;德国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;Die Zeit verging im Fluge.&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;澳大利亚&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;一起去大堡礁吧！&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;加拿大&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;拾起一片枫叶赠予你&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;中国&quot;</span>:</span><br><span class="line">            pos = ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">province</span> + <span class="string">&quot; &quot;</span> + ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">city</span> + <span class="string">&quot; &quot;</span> + ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">district</span>;</span><br><span class="line">            ip = ipLoacation.<span class="property">result</span>.<span class="property">ip</span>;</span><br><span class="line">            <span class="keyword">switch</span> (ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">province</span>) &#123;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;北京市&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;北——京——欢迎你~~~&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;天津市&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;讲段相声吧。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;河北省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;山势巍巍成壁垒，天下雄关。铁马金戈由此向，无限江山。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;山西省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;展开坐具长三尺，已占山河五百余。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;内蒙古自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;天苍苍，野茫茫，风吹草低见牛羊。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;辽宁省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;我想吃烤鸡架！&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;吉林省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;状元阁就是东北烧烤之王。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;黑龙江省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;很喜欢哈尔滨大剧院。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;上海市&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;众所周知，中国只有两个城市。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;江苏省&quot;</span>:</span><br><span class="line">                    <span class="keyword">switch</span> (ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">city</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;南京市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;这是我挺想去的城市啦。&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;苏州市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;上有天堂，下有苏杭。&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;散装是必须要散装的。&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;浙江省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;东风渐绿西湖柳，雁已还人未南归。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;河南省&quot;</span>:</span><br><span class="line">                    <span class="keyword">switch</span> (ipLoacation.<span class="property">result</span>.<span class="property">ad_info</span>.<span class="property">city</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;郑州市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;豫州之域，天地之中。&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;南阳市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;臣本布衣，躬耕于南阳。此南阳非彼南阳！&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;驻马店市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;峰峰有奇石，石石挟仙气。嵖岈山的花很美哦！&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;开封市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;刚正不阿包青天。&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;洛阳市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;洛阳牡丹甲天下。&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;可否带我品尝河南烩面啦？&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;安徽省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;蚌埠住了，芜湖起飞。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;福建省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;井邑白云间，岩城远带山。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;江西省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;落霞与孤鹜齐飞，秋水共长天一色。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;山东省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;遥望齐州九点烟，一泓海水杯中泻。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;湖北省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;来碗热干面！&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;湖南省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;74751，长沙斯塔克。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;广东省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;老板来两斤福建人。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;广西壮族自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;桂林山水甲天下。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;海南省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;朝观日出逐白浪，夕看云起收霞光。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;四川省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;康康川妹子。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;贵州省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;茅台，学生，再塞200。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;云南省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;玉龙飞舞云缠绕，万仞冰川直耸天。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;西藏自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;躺在茫茫草原上，仰望蓝天。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;陕西省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;来份臊子面加馍。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;甘肃省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;羌笛何须怨杨柳，春风不度玉门关。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;青海省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;牛肉干和老酸奶都好好吃。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;宁夏回族自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;大漠孤烟直，长河落日圆。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;新疆维吾尔自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;驼铃古道丝绸路，胡马犹闻唐汉风。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;台湾省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;我在这头，大陆在那头。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;香港特别行政区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;永定贼有残留地鬼嚎，迎击光非岁玉。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;澳门特别行政区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;性感荷官，在线发牌。&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="attr">default</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;带我去你的城市逛逛吧！&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="attr">default</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;带我去你的国家逛逛吧。&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//根据本地时间切换欢迎语</span></span><br><span class="line">    <span class="keyword">let</span> timeChange;</span><br><span class="line">    <span class="keyword">let</span> date = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">    <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">5</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">11</span>) timeChange = <span class="string">&quot;&lt;span&gt;上午好&lt;/span&gt;，一日之计在于晨！&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">11</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">13</span>) timeChange = <span class="string">&quot;&lt;span&gt;中午好&lt;/span&gt;，该摸鱼吃午饭了。&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">13</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">15</span>) timeChange = <span class="string">&quot;&lt;span&gt;下午好&lt;/span&gt;，懒懒地睡个午觉吧！&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">15</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">16</span>) timeChange = <span class="string">&quot;&lt;span&gt;三点几啦&lt;/span&gt;，一起饮茶呀！&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">16</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">19</span>) timeChange = <span class="string">&quot;&lt;span&gt;夕阳无限好！&lt;/span&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">19</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">24</span>) timeChange = <span class="string">&quot;&lt;span&gt;晚上好&lt;/span&gt;，夜生活嗨起来！&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> timeChange = <span class="string">&quot;夜深了，早点休息，少熬夜。&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="comment">//自定义文本和需要放的位置</span></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;welcome-info&quot;</span>).<span class="property">innerHTML</span> =</span><br><span class="line">            <span class="string">`&lt;b&gt;&lt;center&gt;🎉 欢迎信息 🎉&lt;/center&gt;&amp;emsp;&amp;emsp;欢迎来自 &lt;span style=&quot;color:var(--theme-color)&quot;&gt;<span class="subst">$&#123;pos&#125;</span>&lt;/span&gt; 的小伙伴，<span class="subst">$&#123;timeChange&#125;</span>您现在距离站长约 &lt;span style=&quot;color:var(--theme-color)&quot;&gt;<span class="subst">$&#123;dist&#125;</span>&lt;/span&gt; 公里，当前的IP地址为： &lt;span style=&quot;color:var(--theme-color)&quot;&gt;<span class="subst">$&#123;ip&#125;</span>&lt;/span&gt;， <span class="subst">$&#123;posdesc&#125;</span>&lt;/b&gt;`</span>;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">        <span class="comment">// console.log(&quot;Pjax无法获取#welcome-info元素🙄🙄🙄&quot;)</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable language_">window</span>.<span class="property">onload</span> = showWelcome;</span><br><span class="line"><span class="comment">// 如果使用了pjax在加上下面这行代码</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, showWelcome);</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>[BlogRoot]\_config.butterfly.yml</code>中引入jQuery依赖和刚刚的js文件：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script src=&quot;https://cdn.staticfile.org/jquery/3.6.3/jquery.min.js&quot;&gt;&lt;/script&gt; # jQuery</span></span><br><span class="line"><span class="addition">+    - &lt;script async data-pjax src=&quot;/js/txmap.js&quot;&gt;&lt;/script&gt; # 腾讯位置API</span></span><br></pre></td></tr></table></figure></li><li><p>在需要展示文本的容器上添加相应id（welcome-info）就可以了，例如我想添加在网站公告栏信息的下方，于是就在<code>[BlogRoot]\themes\butterfly\layout\includes\widget\card_announcement.pug</code>的最后一行加上这个，缩进与上一行相同即可</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">    .announcement_content!= theme.aside.card_announcement.content</span><br><span class="line">    //- 添加欢迎访客的信息</span><br><span class="line"><span class="addition">+    #welcome-info</span></span><br></pre></td></tr></table></figure></li><li><p>在<code>custom.css</code>自定义样式里添加如下代码，可以根据你自己的喜好去改</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 欢迎信息 */</span></span><br><span class="line"><span class="selector-id">#welcome-info</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">linear-gradient</span>(<span class="number">45deg</span>, <span class="number">#b9f4f3</span>, <span class="number">#e3fbf9</span>);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">18px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">8px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#welcome-info</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#212121</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>hexo二连即可看到效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="Heo同款加载动画（安知鱼）">Heo同款加载动画（安知鱼）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>懒得搬过来了，详见：<a href="https://anzhiy.cn/posts/52d8.html">Heo同款loading动画</a></p>              </div>            </details><h2 id="自定义右键菜单（自用）">自定义右键菜单（自用）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考：</p><ul><li><a href="https://yisous.xyz/posts/11eb4aac/">LYX:butterfly博客自定义右键菜单升级版</a></li><li><a href="https://tzy1997.com/articles/hexo1608/">TZY:Hexo + Butterfly 自定义右键菜单</a></li><li><a href="https://blog.dorakika.cn/p/20220118.html">Dorakika:自定义右键菜单</a></li></ul><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-12.webp" alt="image-12.webp"></p></div></div><div class="note warning modern"><p>右键菜单前置教程：昼夜切换动画(本站有)、<a href="https://blog.leonus.cn/2022/randomPost.html">随即文章实现</a>，请完成这两个前置教程再来做这个，或者可以注释掉pug文件中对应的功能就不会出发相应不存在的函数了。</p></div><ol><li><p>新建 <code>[BlogRoot]\themes\butterfly\layout\includes\rightmenu.pug</code>，编写以下内容：</p><p>我这里统一采用<code>font-Awesome</code>的图标，因为颜色比较统一，就没用iconfont的图标了</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line">#rightMenu.js-pjax</span><br><span class="line">    .rightMenu-group.rightMenu-small</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:window.history.back();&quot;)</span><br><span class="line">            i.fa.fa-arrow-left</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:window.history.forward();&quot;)</span><br><span class="line">            i.fa.fa-arrow-right</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:window.location.reload();&quot;)</span><br><span class="line">            i.fa.fa-refresh</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.scrollToTop();&quot;)</span><br><span class="line">            i.fa.fa-arrow-up</span><br><span class="line">    .rightMenu-group.rightMenu-line.hide#menu-text</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.copySelect();&quot;)</span><br><span class="line">            i.fa.fa-copy</span><br><span class="line">            span=&#x27;复制&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:window.open(\&quot;https://www.baidu.com/s?wd=\&quot;+window.getSelection().toString());window.location.reload();&quot;)</span><br><span class="line">            i.fa.fa-search</span><br><span class="line">            span=&#x27;百度搜索&#x27;</span><br><span class="line">    .rightMenu-group.rightMenu-line.hide#menu-too</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:window.open(window.getSelection().toString());window.location.reload();&quot;)</span><br><span class="line">            i.fa.fa-link</span><br><span class="line">            span=&#x27;转到链接&#x27;</span><br><span class="line">    .rightMenu-group.rightMenu-line.hide#menu-paste</span><br><span class="line">        a.rightMenu-item(href=&#x27;javascript:rmf.paste()&#x27;)</span><br><span class="line">            i.fa.fa-copy</span><br><span class="line">            span=&#x27;粘贴&#x27;</span><br><span class="line">    .rightMenu-group.rightMenu-line.hide#menu-post</span><br><span class="line">        a.rightMenu-item(href=&quot;#post-comment&quot;)</span><br><span class="line">            i.fas.fa-comment</span><br><span class="line">            span=&#x27;空降评论&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.copyWordsLink()&quot;)</span><br><span class="line">            i.fa.fa-link</span><br><span class="line">            span=&#x27;复制本文地址&#x27;</span><br><span class="line">    .rightMenu-group.rightMenu-line.hide#menu-to</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.openWithNewTab()&quot;)</span><br><span class="line">            i.fa.fa-window-restore</span><br><span class="line">            span=&#x27;新窗口打开&#x27;</span><br><span class="line">        a.rightMenu-item#menu-too(href=&quot;javascript:rmf.open()&quot;)</span><br><span class="line">            i.fa.fa-link</span><br><span class="line">            span=&#x27;转到链接&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.copyLink()&quot;)</span><br><span class="line">            i.fa.fa-copy</span><br><span class="line">            span=&#x27;复制链接&#x27;</span><br><span class="line">    .rightMenu-group.rightMenu-line.hide#menu-img</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.saveAs()&quot;)</span><br><span class="line">            i.fa.fa-download</span><br><span class="line">            span=&#x27;保存图片&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.openWithNewTab()&quot;)</span><br><span class="line">            i.fa.fa-window-restore</span><br><span class="line">            span=&#x27;在新窗口打开&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.copyLink()&quot;)</span><br><span class="line">            i.fa.fa-copy</span><br><span class="line">            span=&#x27;复制图片链接&#x27;</span><br><span class="line">    .rightMenu-group.rightMenu-line</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:randomPost()&quot;)</span><br><span class="line">            i.fa.fa-paper-plane</span><br><span class="line">            span=&#x27;随便逛逛&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:switchNightMode();&quot;)</span><br><span class="line">            i.fa.fa-moon</span><br><span class="line">            span=&#x27;昼夜切换&#x27;</span><br><span class="line">        if is_post()||is_page()</span><br><span class="line">            a.rightMenu-item(href=&quot;javascript:rmf.switchReadMode();&quot;)</span><br><span class="line">                i.fa.fa-book</span><br><span class="line">                span=&#x27;阅读模式&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;/personal/about/&quot;)</span><br><span class="line">            i.fa.fa-info-circle</span><br><span class="line">            span=&#x27;关于博客&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:toggleWinbox();&quot;)</span><br><span class="line">            i.fas.fa-cog</span><br><span class="line">            span=&#x27;美化设置&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:rmf.fullScreen();&quot;)</span><br><span class="line">            i.fas.fa-expand</span><br><span class="line">            span=&#x27;切换全屏&#x27;</span><br><span class="line">        a.rightMenu-item(href=&quot;javascript:window.print();&quot;)</span><br><span class="line">            i.fa-solid.fa-print</span><br><span class="line">            span=&#x27;打印页面&#x27;</span><br></pre></td></tr></table></figure></li><li><p>然后在 <code>[BlogRoot]/themes/butterfly/layout/includes/layout.pug</code>中引入（注意缩进，去掉+）</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">doctype html</span><br><span class="line">html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside)</span><br><span class="line">  head</span><br><span class="line">    include ./head.pug</span><br><span class="line">  body</span><br><span class="line">    ...</span><br><span class="line"></span><br><span class="line">    else</span><br><span class="line">      include ./404.pug</span><br><span class="line"></span><br><span class="line">    include ./rightside.pug</span><br><span class="line">    !=partial(&#x27;includes/third-party/search/index&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"><span class="addition">+    !=partial(&#x27;includes/rightmenu&#x27;,&#123;&#125;, &#123;cache:true&#125;)</span></span><br><span class="line">    include ./additional-js.pug</span><br></pre></td></tr></table></figure></li><li><p>在自定义的<code>custom.css</code>中加入以下样式描述菜单，其中重要的颜色我都做了备注，根据自己的需要修改</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 右键菜单 */</span></span><br><span class="line"><span class="selector-id">#rightMenu</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: none;</span><br><span class="line">  <span class="attribute">position</span>: fixed;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">160px</span>;</span><br><span class="line">  <span class="attribute">height</span>: fit-content;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">10%</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">10%</span>;</span><br><span class="line">    <span class="comment">/* 菜单面板背景色 */</span></span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--card-bg);</span><br><span class="line">    <span class="comment">/* 菜单面板文字颜色 */</span></span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--font-color);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">100</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">7px</span> <span class="number">6px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span><span class="selector-pseudo">:not</span>(<span class="selector-pseudo">:nth-last-child</span>(<span class="number">1</span>)) &#123;</span><br><span class="line">  <span class="attribute">border-bottom</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--font-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span><span class="selector-class">.rightMenu-small</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">justify-content</span>: space-between;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span> <span class="selector-class">.rightMenu-item</span> &#123;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">transition</span>: <span class="number">0.3s</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--font-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span><span class="selector-class">.rightMenu-line</span> <span class="selector-class">.rightMenu-item</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">40px</span>;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">40px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">4px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span> <span class="selector-class">.rightMenu-item</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">    <span class="comment">/* 鼠标悬浮选项颜色 */</span></span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--text-bg-hover);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span> <span class="selector-class">.rightMenu-item</span> <span class="selector-tag">i</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">text-align</span>: center;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">5px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span> <span class="selector-class">.rightMenu-item</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">30px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#rightMenu</span> <span class="selector-class">.rightMenu-group</span><span class="selector-class">.rightMenu-line</span> <span class="selector-class">.rightMenu-item</span> * &#123;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">40px</span>;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">40px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rightMenu-group</span><span class="selector-class">.hide</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>创建 <code>[BlogRoot]/themes/butterfly/source/js/rightmenu.js</code>，并写入如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">setMask</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">//设置遮罩</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;rmMask&quot;</span>)[<span class="number">0</span>] != <span class="literal">undefined</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;rmMask&quot;</span>)[<span class="number">0</span>];</span><br><span class="line">    mask = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;div&#x27;</span>);</span><br><span class="line">    mask.<span class="property">className</span> = <span class="string">&quot;rmMask&quot;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">width</span> = <span class="variable language_">window</span>.<span class="property">innerWidth</span> + <span class="string">&#x27;px&#x27;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">height</span> = <span class="variable language_">window</span>.<span class="property">innerHeight</span> + <span class="string">&#x27;px&#x27;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">background</span> = <span class="string">&#x27;#fff&#x27;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;.0&#x27;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">position</span> = <span class="string">&#x27;fixed&#x27;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">top</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">left</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    mask.<span class="property">style</span>.<span class="property">zIndex</span> = <span class="number">998</span>;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(mask);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightMenu&quot;</span>).<span class="property">style</span>.<span class="property">zIndex</span> = <span class="number">19198</span>;</span><br><span class="line">    <span class="keyword">return</span> mask;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">insertAtCursor</span>(<span class="params">myField, myValue</span>) &#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//IE 浏览器</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">selection</span>) &#123;</span><br><span class="line">        myField.<span class="title function_">focus</span>();</span><br><span class="line">        sel = <span class="variable language_">document</span>.<span class="property">selection</span>.<span class="title function_">createRange</span>();</span><br><span class="line">        sel.<span class="property">text</span> = myValue;</span><br><span class="line">        sel.<span class="title function_">select</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//FireFox、Chrome等</span></span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (myField.<span class="property">selectionStart</span> || myField.<span class="property">selectionStart</span> == <span class="string">&#x27;0&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">var</span> startPos = myField.<span class="property">selectionStart</span>;</span><br><span class="line">        <span class="keyword">var</span> endPos = myField.<span class="property">selectionEnd</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 保存滚动条</span></span><br><span class="line">        <span class="keyword">var</span> restoreTop = myField.<span class="property">scrollTop</span>;</span><br><span class="line">        myField.<span class="property">value</span> = myField.<span class="property">value</span>.<span class="title function_">substring</span>(<span class="number">0</span>, startPos) + myValue + myField.<span class="property">value</span>.<span class="title function_">substring</span>(endPos, myField.<span class="property">value</span>.<span class="property">length</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (restoreTop &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            myField.<span class="property">scrollTop</span> = restoreTop;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        myField.<span class="title function_">focus</span>();</span><br><span class="line">        myField.<span class="property">selectionStart</span> = startPos + myValue.<span class="property">length</span>;</span><br><span class="line">        myField.<span class="property">selectionEnd</span> = startPos + myValue.<span class="property">length</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        myField.<span class="property">value</span> += myValue;</span><br><span class="line">        myField.<span class="title function_">focus</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> rmf = &#123;&#125;;</span><br><span class="line">rmf.<span class="property">showRightMenu</span> = <span class="keyword">function</span> (<span class="params">isTrue, x = <span class="number">0</span>, y = <span class="number">0</span></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> $rightMenu = $(<span class="string">&#x27;#rightMenu&#x27;</span>);</span><br><span class="line">    $rightMenu.<span class="title function_">css</span>(<span class="string">&#x27;top&#x27;</span>, x + <span class="string">&#x27;px&#x27;</span>).<span class="title function_">css</span>(<span class="string">&#x27;left&#x27;</span>, y + <span class="string">&#x27;px&#x27;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (isTrue) &#123;</span><br><span class="line">        $rightMenu.<span class="title function_">show</span>();</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        $rightMenu.<span class="title function_">hide</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">rmf.<span class="property">copyWordsLink</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> url = <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">href</span></span><br><span class="line">    <span class="keyword">let</span> txa = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;textarea&quot;</span>);</span><br><span class="line">    txa.<span class="property">value</span> = url;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(txa)</span><br><span class="line">    txa.<span class="title function_">select</span>();</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">execCommand</span>(<span class="string">&quot;Copy&quot;</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">removeChild</span>(txa);</span><br><span class="line">&#125;</span><br><span class="line">rmf.<span class="property">switchReadMode</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> $body = <span class="variable language_">document</span>.<span class="property">body</span></span><br><span class="line">    $body.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;read-mode&#x27;</span>)</span><br><span class="line">    <span class="keyword">const</span> newEle = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;button&#x27;</span>)</span><br><span class="line">    newEle.<span class="property">type</span> = <span class="string">&#x27;button&#x27;</span></span><br><span class="line">    newEle.<span class="property">className</span> = <span class="string">&#x27;fas fa-sign-out-alt exit-readmode&#x27;</span></span><br><span class="line">    $body.<span class="title function_">appendChild</span>(newEle)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">clickFn</span>(<span class="params"></span>) &#123;</span><br><span class="line">        $body.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&#x27;read-mode&#x27;</span>)</span><br><span class="line">        newEle.<span class="title function_">remove</span>()</span><br><span class="line">        newEle.<span class="title function_">removeEventListener</span>(<span class="string">&#x27;click&#x27;</span>, clickFn)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    newEle.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, clickFn)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//复制选中文字</span></span><br><span class="line">rmf.<span class="property">copySelect</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">execCommand</span>(<span class="string">&#x27;Copy&#x27;</span>, <span class="literal">false</span>, <span class="literal">null</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//回到顶部</span></span><br><span class="line">rmf.<span class="property">scrollToTop</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;menus_items&quot;</span>)[<span class="number">1</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;&quot;</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;name-container&quot;</span>).<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;display:none&quot;</span>);</span><br><span class="line">    btf.<span class="title function_">scrollToDest</span>(<span class="number">0</span>, <span class="number">500</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;touchmove&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line"></span><br><span class="line">&#125;, &#123; <span class="attr">passive</span>: <span class="literal">false</span> &#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">popupMenu</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">oncontextmenu</span> = <span class="keyword">function</span> (<span class="params">event</span>) &#123;</span><br><span class="line">        <span class="comment">// if (event.ctrlKey) return true;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// 当关掉自定义右键时候直接返回</span></span><br><span class="line">        <span class="keyword">if</span> (mouseMode == <span class="string">&quot;off&quot;</span>) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">        $(<span class="string">&#x27;.rightMenu-group.hide&#x27;</span>).<span class="title function_">hide</span>();</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getSelection</span>().<span class="title function_">toString</span>()) &#123;</span><br><span class="line">            $(<span class="string">&#x27;#menu-text&#x27;</span>).<span class="title function_">show</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;post&#x27;</span>)) &#123;</span><br><span class="line">            $(<span class="string">&#x27;#menu-post&#x27;</span>).<span class="title function_">show</span>();</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;page&#x27;</span>)) &#123;</span><br><span class="line">                $(<span class="string">&#x27;#menu-post&#x27;</span>).<span class="title function_">show</span>();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">var</span> el = <span class="variable language_">window</span>.<span class="property">document</span>.<span class="property">body</span>;</span><br><span class="line">        el = event.<span class="property">target</span>;</span><br><span class="line">        <span class="keyword">var</span> a = <span class="regexp">/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&amp;&#x27;\*\+,;=.]+$/</span></span><br><span class="line">        <span class="keyword">if</span> (a.<span class="title function_">test</span>(<span class="variable language_">window</span>.<span class="title function_">getSelection</span>().<span class="title function_">toString</span>()) &amp;&amp; el.<span class="property">tagName</span> != <span class="string">&quot;A&quot;</span>) &#123;</span><br><span class="line">            $(<span class="string">&#x27;#menu-too&#x27;</span>).<span class="title function_">show</span>()</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (el.<span class="property">tagName</span> == <span class="string">&#x27;A&#x27;</span>) &#123;</span><br><span class="line">            $(<span class="string">&#x27;#menu-to&#x27;</span>).<span class="title function_">show</span>()</span><br><span class="line">            rmf.<span class="property">open</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (el.<span class="property">href</span>.<span class="title function_">indexOf</span>(<span class="string">&quot;http://&quot;</span>) == -<span class="number">1</span> &amp;&amp; el.<span class="property">href</span>.<span class="title function_">indexOf</span>(<span class="string">&quot;https://&quot;</span>) == -<span class="number">1</span> || el.<span class="property">href</span>.<span class="title function_">indexOf</span>(<span class="string">&quot;yisous.xyz&quot;</span>) != -<span class="number">1</span>) &#123;</span><br><span class="line">                    pjax.<span class="title function_">loadUrl</span>(el.<span class="property">href</span>)</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">else</span> &#123;</span><br><span class="line">                    location.<span class="property">href</span> = el.<span class="property">href</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            rmf.<span class="property">openWithNewTab</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="variable language_">window</span>.<span class="title function_">open</span>(el.<span class="property">href</span>);</span><br><span class="line">                <span class="comment">// window.location.reload();</span></span><br><span class="line">            &#125;</span><br><span class="line">            rmf.<span class="property">copyLink</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="keyword">let</span> url = el.<span class="property">href</span></span><br><span class="line">                <span class="keyword">let</span> txa = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;textarea&quot;</span>);</span><br><span class="line">                txa.<span class="property">value</span> = url;</span><br><span class="line">                <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(txa)</span><br><span class="line">                txa.<span class="title function_">select</span>();</span><br><span class="line">                <span class="variable language_">document</span>.<span class="title function_">execCommand</span>(<span class="string">&quot;Copy&quot;</span>);</span><br><span class="line">                <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">removeChild</span>(txa);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (el.<span class="property">tagName</span> == <span class="string">&#x27;IMG&#x27;</span>) &#123;</span><br><span class="line">            $(<span class="string">&#x27;#menu-img&#x27;</span>).<span class="title function_">show</span>()</span><br><span class="line">            rmf.<span class="property">openWithNewTab</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="variable language_">window</span>.<span class="title function_">open</span>(el.<span class="property">src</span>);</span><br><span class="line">                <span class="comment">// window.location.reload();</span></span><br><span class="line">            &#125;</span><br><span class="line">            rmf.<span class="property">click</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                el.<span class="title function_">click</span>()</span><br><span class="line">            &#125;</span><br><span class="line">            rmf.<span class="property">copyLink</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="keyword">let</span> url = el.<span class="property">src</span></span><br><span class="line">                <span class="keyword">let</span> txa = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;textarea&quot;</span>);</span><br><span class="line">                txa.<span class="property">value</span> = url;</span><br><span class="line">                <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(txa)</span><br><span class="line">                txa.<span class="title function_">select</span>();</span><br><span class="line">                <span class="variable language_">document</span>.<span class="title function_">execCommand</span>(<span class="string">&quot;Copy&quot;</span>);</span><br><span class="line">                <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">removeChild</span>(txa);</span><br><span class="line">            &#125;</span><br><span class="line">            rmf.<span class="property">saveAs</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="keyword">var</span> a = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;a&#x27;</span>);</span><br><span class="line">                <span class="keyword">var</span> url = el.<span class="property">src</span>;</span><br><span class="line">                <span class="keyword">var</span> filename = url.<span class="title function_">split</span>(<span class="string">&quot;/&quot;</span>)[-<span class="number">1</span>];</span><br><span class="line">                a.<span class="property">href</span> = url;</span><br><span class="line">                a.<span class="property">download</span> = filename;</span><br><span class="line">                a.<span class="title function_">click</span>();</span><br><span class="line">                <span class="variable language_">window</span>.<span class="property">URL</span>.<span class="title function_">revokeObjectURL</span>(url);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (el.<span class="property">tagName</span> == <span class="string">&quot;TEXTAREA&quot;</span> || el.<span class="property">tagName</span> == <span class="string">&quot;INPUT&quot;</span>) &#123;</span><br><span class="line">            $(<span class="string">&#x27;#menu-paste&#x27;</span>).<span class="title function_">show</span>();</span><br><span class="line">            rmf.<span class="property">paste</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                navigator.<span class="property">permissions</span></span><br><span class="line">                    .<span class="title function_">query</span>(&#123;</span><br><span class="line">                        <span class="attr">name</span>: <span class="string">&#x27;clipboard-read&#x27;</span></span><br><span class="line">                    &#125;)</span><br><span class="line">                    .<span class="title function_">then</span>(<span class="function"><span class="params">result</span> =&gt;</span> &#123;</span><br><span class="line">                        <span class="keyword">if</span> (result.<span class="property">state</span> == <span class="string">&#x27;granted&#x27;</span> || result.<span class="property">state</span> == <span class="string">&#x27;prompt&#x27;</span>) &#123;</span><br><span class="line">                            <span class="comment">//读取剪贴板</span></span><br><span class="line">                            navigator.<span class="property">clipboard</span>.<span class="title function_">readText</span>().<span class="title function_">then</span>(<span class="function"><span class="params">text</span> =&gt;</span> &#123;</span><br><span class="line">                                <span class="variable language_">console</span>.<span class="title function_">log</span>(text)</span><br><span class="line">                                <span class="title function_">insertAtCursor</span>(el, text)</span><br><span class="line">                            &#125;)</span><br><span class="line">                        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                            <span class="title class_">Snackbar</span>.<span class="title function_">show</span>(&#123;</span><br><span class="line">                                <span class="attr">text</span>: <span class="string">&#x27;请允许读取剪贴板！&#x27;</span>,</span><br><span class="line">                                <span class="attr">pos</span>: <span class="string">&#x27;top-center&#x27;</span>,</span><br><span class="line">                                <span class="attr">showAction</span>: <span class="literal">false</span>,</span><br><span class="line">                            &#125;)</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;)</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">let</span> pageX = event.<span class="property">clientX</span> + <span class="number">10</span>;</span><br><span class="line">        <span class="keyword">let</span> pageY = event.<span class="property">clientY</span>;</span><br><span class="line">        <span class="keyword">let</span> rmWidth = $(<span class="string">&#x27;#rightMenu&#x27;</span>).<span class="title function_">width</span>();</span><br><span class="line">        <span class="keyword">let</span> rmHeight = $(<span class="string">&#x27;#rightMenu&#x27;</span>).<span class="title function_">height</span>();</span><br><span class="line">        <span class="keyword">if</span> (pageX + rmWidth &gt; <span class="variable language_">window</span>.<span class="property">innerWidth</span>) &#123;</span><br><span class="line">            pageX -= rmWidth + <span class="number">10</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (pageY + rmHeight &gt; <span class="variable language_">window</span>.<span class="property">innerHeight</span>) &#123;</span><br><span class="line">            pageY -= pageY + rmHeight - <span class="variable language_">window</span>.<span class="property">innerHeight</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        mask = <span class="title function_">setMask</span>();</span><br><span class="line">        <span class="comment">// 滚动消失的代码和阅读进度有冲突，因此放到readPercent.js里面了</span></span><br><span class="line">        $(<span class="string">&quot;.rightMenu-item&quot;</span>).<span class="title function_">click</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            $(<span class="string">&#x27;.rmMask&#x27;</span>).<span class="title function_">attr</span>(<span class="string">&#x27;style&#x27;</span>, <span class="string">&#x27;display: none&#x27;</span>);</span><br><span class="line">        &#125;)</span><br><span class="line">        $(<span class="variable language_">window</span>).<span class="title function_">resize</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            rmf.<span class="title function_">showRightMenu</span>(<span class="literal">false</span>);</span><br><span class="line">            $(<span class="string">&#x27;.rmMask&#x27;</span>).<span class="title function_">attr</span>(<span class="string">&#x27;style&#x27;</span>, <span class="string">&#x27;display: none&#x27;</span>);</span><br><span class="line">        &#125;)</span><br><span class="line">        mask.<span class="property">onclick</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">            $(<span class="string">&#x27;.rmMask&#x27;</span>).<span class="title function_">attr</span>(<span class="string">&#x27;style&#x27;</span>, <span class="string">&#x27;display: none&#x27;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        rmf.<span class="title function_">showRightMenu</span>(<span class="literal">true</span>, pageY, pageX);</span><br><span class="line">        $(<span class="string">&#x27;.rmMask&#x27;</span>).<span class="title function_">attr</span>(<span class="string">&#x27;style&#x27;</span>, <span class="string">&#x27;display: flex&#x27;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        rmf.<span class="title function_">showRightMenu</span>(<span class="literal">false</span>);</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (!(navigator.<span class="property">userAgent</span>.<span class="title function_">match</span>(<span class="regexp">/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i</span>))) &#123;</span><br><span class="line">    <span class="title function_">popupMenu</span>()</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> box = <span class="variable language_">document</span>.<span class="property">documentElement</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">addLongtabListener</span>(<span class="params">target, callback</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> timer = <span class="number">0</span> <span class="comment">// 初始化timer</span></span><br><span class="line"></span><br><span class="line">    target.<span class="property">ontouchstart</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">        timer = <span class="number">0</span> <span class="comment">// 重置timer</span></span><br><span class="line">        timer = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            <span class="title function_">callback</span>();</span><br><span class="line">            timer = <span class="number">0</span></span><br><span class="line">        &#125;, <span class="number">380</span>) <span class="comment">// 超时器能成功执行，说明是长按</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    target.<span class="property">ontouchmove</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">        <span class="built_in">clearTimeout</span>(timer) <span class="comment">// 如果来到这里，说明是滑动</span></span><br><span class="line">        timer = <span class="number">0</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    target.<span class="property">ontouchend</span> = <span class="function">() =&gt;</span> &#123; <span class="comment">// 到这里如果timer有值，说明此触摸时间不足380ms，是点击</span></span><br><span class="line">        <span class="keyword">if</span> (timer) &#123;</span><br><span class="line">            <span class="built_in">clearTimeout</span>(timer)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">addLongtabListener</span>(box, popupMenu)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 全屏</span></span><br><span class="line">rmf.<span class="property">fullScreen</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">fullscreenElement</span>) <span class="variable language_">document</span>.<span class="title function_">exitFullscreen</span>();</span><br><span class="line">    <span class="keyword">else</span> <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="title function_">requestFullscreen</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 右键开关</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;mouse&quot;</span>) == <span class="literal">undefined</span>) &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;mouse&quot;</span>, <span class="string">&quot;on&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> mouseMode = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;mouse&quot;</span>);</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">changeMouseMode</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;mouse&quot;</span>) == <span class="string">&quot;on&quot;</span>) &#123;</span><br><span class="line">        mouseMode = <span class="string">&quot;off&quot;</span>;</span><br><span class="line">        <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;mouse&quot;</span>, <span class="string">&quot;off&quot;</span>);</span><br><span class="line">        <span class="title function_">debounce</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">                <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">                        <span class="attr">title</span>: <span class="string">&quot;切换右键模式成功🍔&quot;</span>,</span><br><span class="line">                        <span class="attr">message</span>: <span class="string">&quot;当前鼠标右键已恢复为系统默认！&quot;</span>,</span><br><span class="line">                        <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">                        <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">                        <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">                        <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">                        <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;, <span class="number">300</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        mouseMode = <span class="string">&quot;on&quot;</span>;</span><br><span class="line">        <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;mouse&quot;</span>, <span class="string">&quot;on&quot;</span>);</span><br><span class="line">        <span class="title function_">debounce</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">                <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">                        <span class="attr">title</span>: <span class="string">&quot;切换右键模式成功🍔&quot;</span>,</span><br><span class="line">                        <span class="attr">message</span>: <span class="string">&quot;当前鼠标右键已更换为网站指定样式！&quot;</span>,</span><br><span class="line">                        <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">                        <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">                        <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">                        <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">                        <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;, <span class="number">300</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>引入jQuery依赖以及上述的css和js文件(<code>custom.css</code>默认已经引入了就不重复引用了)</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  bottom:</span><br><span class="line"><span class="addition">+    - &lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn1.tianli0.top/npm/jquery@latest/dist/jquery.min.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="addition">+    - &lt;script type=&quot;text/javascript&quot; src=&quot;/js/rightmenu.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>本来到这里重启项目就可以见效了，我这里还加了一个右键开关，取消了原来ctrl复合的右键开关策略。因此还需要加一个右键开关的按钮，在<code>[BlogRoot]\themes\butterfly\layout\includes\rightside.pug</code>中做如下的修改，目的就是把鼠标开关放到右边栏的设置隐藏项里面，这样我们就能随时随地开关右键功能了</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">      when &#x27;share&#x27;</span><br><span class="line">        button.share(type=&quot;button&quot; title=&#x27;分享链接&#x27; onclick=&quot;share()&quot;)</span><br><span class="line">          i.fas.fa-share-nodes</span><br><span class="line"></span><br><span class="line"><span class="addition">+      when &#x27;mouse&#x27;</span></span><br><span class="line"><span class="addition">+        button.share(type=&quot;button&quot; title=&#x27;右键模式&#x27; onclick=&quot;changeMouseMode()&quot;)</span></span><br><span class="line"><span class="addition">+          i.fas.fa-mouse</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#rightside</span><br><span class="line">  - const &#123; enable, hide, show &#125; = theme.rightside_item_order</span><br><span class="line"><span class="deletion">-  - const hideArray = enable ? hide &amp;&amp; hide.split(&#x27;,&#x27;) : [&#x27;readmode&#x27;,&#x27;translate&#x27;,&#x27;darkmode&#x27;]</span></span><br><span class="line"><span class="addition">+  - const hideArray = enable ? hide &amp;&amp; hide.split(&#x27;,&#x27;) : [&#x27;readmode&#x27;,&#x27;translate&#x27;,&#x27;darkmode&#x27;,&#x27;hideAside&#x27;, &#x27;mouse&#x27;]</span></span><br><span class="line">  - const showArray = enable ? show &amp;&amp; show.split(&#x27;,&#x27;) : [&#x27;toc&#x27;,&#x27;chat&#x27;,&#x27;share&#x27;,&#x27;comment&#x27;]</span><br></pre></td></tr></table></figure></li><li><p>重启项目看看效果（可能会有问题，因为这个还是比较复杂的，有问题在评论区留言吧！）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="友链样式魔改（店长）">友链样式魔改（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>懒得搬过来了，详见：<a href="https://akilar.top/posts/57291286/">Friend Link Card Beautify</a></p><p>我博客用到的是<code>Volantis</code>样式，因为做了宽屏适配，所以有些css跟店长原版不太一样，例如我默认一行是显示5个的，如果做了宽屏适配的可以加入以下css：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 友链一行显示更多 */</span></span><br><span class="line"><span class="selector-class">.site-card</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="built_in">calc</span>(<span class="number">100%</span> / <span class="number">5</span> - <span class="number">16px</span>) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">18px</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.site-card</span> <span class="selector-class">.img</span> &#123;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">165px</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">18px</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 适应宽度不同的设备 */</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">1200px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.site-card</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="built_in">calc</span>(<span class="number">100%</span> / <span class="number">4</span> - <span class="number">16px</span>) <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">900px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.site-card</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="built_in">calc</span>(<span class="number">100%</span> / <span class="number">3</span> - <span class="number">16px</span>) <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">600px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.site-card</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="built_in">calc</span>(<span class="number">100%</span> / <span class="number">2</span> - <span class="number">16px</span>) <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="博客宽屏适配（自用）">博客宽屏适配（自用）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考：<a href="https://yisous.xyz/posts/d1fc759/">Hexo Butterfly宽屏适配指北</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-2.webp" alt="image-2.webp" style="zoom:50%;" /></div></div><ol><li><p>在<code>custom.css</code>中加入以下样式：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 全局宽度 */</span></span><br><span class="line"><span class="selector-class">.layout</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="number">1400px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 侧边卡片栏宽度 */</span></span><br><span class="line"><span class="selector-class">.aside-content</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="number">318px</span>;</span><br><span class="line">  <span class="attribute">min-width</span>: <span class="number">300px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 平板尺寸自适应(不启用侧边栏宽度限制) */</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">900px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.aside-content</span> &#123;</span><br><span class="line">    <span class="attribute">max-width</span>: none <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">5px</span> <span class="number">0</span> <span class="number">5px</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>不想再非首页的地方显示侧边栏，那就需要给非首页的页面加上标记，<code>修改 [BlogRoot]\themes\butterfly\layout\includes\layout.pug</code>为以下内容：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"> - var htmlClassHideAside = theme.aside.enable &amp;&amp; theme.aside.hide ? &#x27;hide-aside&#x27; : &#x27;&#x27;</span><br><span class="line"> - page.aside = is_archive() ? theme.aside.display.archive: is_category() ? theme.aside.display.category : is_tag() ? theme.aside.display.tag : page.aside</span><br><span class="line"> - var hideAside = !theme.aside.enable || page.aside <span class="comment">=== false ? &#x27;hide-aside&#x27; : &#x27;&#x27;</span></span><br><span class="line"><span class="deletion">- - var pageType = is_post() ? &#x27;post&#x27; : &#x27;page&#x27;</span></span><br><span class="line"><span class="addition">+ - var pageType = is_home() ? &#x27;page home&#x27; : is_post() ? &#x27;post&#x27; : &#x27;page&#x27;</span></span><br><span class="line"></span><br><span class="line">doctype html</span><br><span class="line">html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside)</span><br><span class="line">  ...</span><br></pre></td></tr></table></figure><p>或者直接用改好的pug（4.3.1可以食用）</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line">- var htmlClassHideAside = theme.aside.enable &amp;&amp; theme.aside.hide ? &#x27;hide-aside&#x27; : &#x27;&#x27;</span><br><span class="line">- page.aside = is_archive() ? theme.aside.display.archive: is_category() ? theme.aside.display.category : is_tag() ? theme.aside.display.tag : page.aside</span><br><span class="line">- var hideAside = !theme.aside.enable || page.aside === false ? &#x27;hide-aside&#x27; : &#x27;&#x27;</span><br><span class="line">- var pageType = is_home() ? &#x27;page home&#x27; : is_post() ? &#x27;post&#x27; : &#x27;page&#x27;</span><br><span class="line"></span><br><span class="line">doctype html</span><br><span class="line">html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside) </span><br><span class="line">  head</span><br><span class="line">    include ./head.pug</span><br><span class="line">  body</span><br><span class="line">    if theme.preloader.enable</span><br><span class="line">      !=partial(&#x27;includes/loading/loading&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">    - var DefaultBg = page.defaultbg ? page.defaultbg : theme.background.default</span><br><span class="line">    - var DDMBg = theme.background.darkmode ? theme.background.darkmode : DefaultBg</span><br><span class="line">    - var DarkmodeBg = page.darkmodebg ? page.darkmodebg : DDMBg</span><br><span class="line">    if theme.background</span><br><span class="line">      if page.background</span><br><span class="line">        #web_bg(style=`background:`+ page.background + `;background-attachment: local;background-position: center;background-size: cover;background-repeat: no-repeat;`)</span><br><span class="line">      else</span><br><span class="line">        #web_bg</span><br><span class="line"></span><br><span class="line">        if page.defaultbg || page.darkmodebg</span><br><span class="line">          style.</span><br><span class="line">            #web_bg&#123;</span><br><span class="line">              background: #&#123;DefaultBg&#125; !important;</span><br><span class="line">              background-attachment: local!important;</span><br><span class="line">              background-position: center!important;</span><br><span class="line">              background-size: cover!important;</span><br><span class="line">              background-repeat: no-repeat!important;</span><br><span class="line">            &#125;</span><br><span class="line">            [data-theme=&quot;dark&quot;]</span><br><span class="line">              #web_bg&#123;</span><br><span class="line">                background: #&#123;DarkmodeBg&#125; !important;</span><br><span class="line">                background-attachment: local!important;</span><br><span class="line">                background-position: center!important;</span><br><span class="line">                background-size: cover!important;</span><br><span class="line">                background-repeat: no-repeat!important;</span><br><span class="line">              &#125;      </span><br><span class="line"></span><br><span class="line">    !=partial(&#x27;includes/sidebar&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">    if page.type !== &#x27;404&#x27;</span><br><span class="line">      #body-wrap(class=pageType)</span><br><span class="line">        include ./header/index.pug</span><br><span class="line"></span><br><span class="line">        main#content-inner.layout(class=hideAside)</span><br><span class="line">          if body</span><br><span class="line">            div!= body</span><br><span class="line">          else</span><br><span class="line">            block content</span><br><span class="line">            if theme.aside.enable &amp;&amp; page.aside !== false</span><br><span class="line">              include widget/index.pug</span><br><span class="line"></span><br><span class="line">        - var footerBg = theme.footer_bg</span><br><span class="line">        if !is_post()</span><br><span class="line">          if (footerBg === true)</span><br><span class="line">            - var footer_bg = &#x27;background-color: transparent;&#x27;</span><br><span class="line">          else</span><br><span class="line">            - var footer_bg = &#x27;background-color: transparent;&#x27;</span><br><span class="line">        else</span><br><span class="line">          - var footer_bg = &#x27;background-color: transparent;&#x27;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        footer#footer(style=footer_bg)</span><br><span class="line">          !=partial(&#x27;includes/footer&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">    else</span><br><span class="line">      include ./404.pug</span><br><span class="line"></span><br><span class="line">    include ./rightside.pug</span><br><span class="line">    !=partial(&#x27;includes/third-party/search/index&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/rightmenu&#x27;,&#123;&#125;, &#123;cache:true&#125;)</span><br><span class="line">    include ./additional-js.pug</span><br></pre></td></tr></table></figure><p>现在主页的class就变成<code>page home</code>了，我们再在<code>custom.css</code>加入如下css，主题就能智能区分主页和分页了，可以自动选择卡片显示：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 除了首页以外其他页面隐藏卡片，并采用宽屏显示 */</span></span><br><span class="line"><span class="selector-id">#archive</span>,</span><br><span class="line"><span class="selector-id">#page</span>,</span><br><span class="line"><span class="selector-id">#category</span>,</span><br><span class="line"><span class="selector-id">#tag</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.page</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.page</span><span class="selector-class">.home</span>) <span class="selector-class">.aside-content</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到变更：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="樱花、落叶特效">樱花、落叶特效</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://bu.dusays.com/2022/06/06/629ce3b40d3aa.jpg" style="zoom: 33%;" /></div></div><ol><li><p>樱花特效：在主题配置文件<code>_config.butterfly.yml</code>的<code>inject</code>配置项中<code>bottom</code>下引入<code>sakura.js</code>即可(如果你想在某个页面引入，直接在对应页面写上<code>&lt;script async src=&quot;https://npm.elemecdn.com/tzy-blog/lib/js/other/sakura.js&quot;&gt;&lt;/script&gt;</code>即可)</p> <figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  bottom:</span><br><span class="line">   # 樱花飘落效果</span><br><span class="line">   # - &lt;script async src=&quot;https://npm.elemecdn.com/tzy-blog/lib/js/other/sakura.js&quot;&gt;&lt;/script&gt;</span><br></pre></td></tr></table></figure></li><li><p>落叶特效：在主题配置文件<code>_config.butterfly.yml</code>的<code>inject</code>配置项中<code>bottom</code>下引入<code>sakura.js</code>即可</p> <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> stop, staticx;</span><br><span class="line"><span class="keyword">var</span> img = <span class="keyword">new</span> <span class="title class_">Image</span>();</span><br><span class="line"><span class="comment">// 将引入的图片文件替换为你想要的即可</span></span><br><span class="line">img.<span class="property">src</span> = <span class="string">&quot;https://img.cdn.nesxc.com/upload/wordpress/202202251325420webp&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">Sakura</span>(<span class="params">x, y, s, r, fn</span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">x</span> = x;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">y</span> = y;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">s</span> = s;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">r</span> = r;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">fn</span> = fn</span><br><span class="line">&#125;</span><br><span class="line"><span class="title class_">Sakura</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">draw</span> = <span class="keyword">function</span> (<span class="params">cxt</span>) &#123;</span><br><span class="line">    cxt.<span class="title function_">save</span>();</span><br><span class="line">    <span class="keyword">var</span> xc = <span class="number">20</span> * <span class="variable language_">this</span>.<span class="property">s</span> / <span class="number">2</span>;</span><br><span class="line">    cxt.<span class="title function_">translate</span>(<span class="variable language_">this</span>.<span class="property">x</span>, <span class="variable language_">this</span>.<span class="property">y</span>);</span><br><span class="line">    cxt.<span class="title function_">rotate</span>(<span class="variable language_">this</span>.<span class="property">r</span>);</span><br><span class="line">    cxt.<span class="title function_">drawImage</span>(img, <span class="number">0</span>, <span class="number">0</span>, <span class="number">20</span> * <span class="variable language_">this</span>.<span class="property">s</span>, <span class="number">20</span> * <span class="variable language_">this</span>.<span class="property">s</span>);</span><br><span class="line">    cxt.<span class="title function_">restore</span>()</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title class_">Sakura</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">update</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">x</span> = <span class="variable language_">this</span>.<span class="property">fn</span>.<span class="title function_">x</span>(<span class="variable language_">this</span>.<span class="property">x</span>, <span class="variable language_">this</span>.<span class="property">y</span>);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">y</span> = <span class="variable language_">this</span>.<span class="property">fn</span>.<span class="title function_">y</span>(<span class="variable language_">this</span>.<span class="property">y</span>, <span class="variable language_">this</span>.<span class="property">y</span>);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">r</span> = <span class="variable language_">this</span>.<span class="property">fn</span>.<span class="title function_">r</span>(<span class="variable language_">this</span>.<span class="property">r</span>);</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">x</span> &gt; <span class="variable language_">window</span>.<span class="property">innerWidth</span> || <span class="variable language_">this</span>.<span class="property">x</span> &lt; <span class="number">0</span> || <span class="variable language_">this</span>.<span class="property">y</span> &gt; <span class="variable language_">window</span>.<span class="property">innerHeight</span> || <span class="variable language_">this</span>.<span class="property">y</span> &lt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">r</span> = <span class="title function_">getRandom</span>(<span class="string">&quot;fnr&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Math</span>.<span class="title function_">random</span>() &gt; <span class="number">0.4</span>) &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">x</span> = <span class="title function_">getRandom</span>(<span class="string">&quot;x&quot;</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">y</span> = <span class="number">0</span>;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">s</span> = <span class="title function_">getRandom</span>(<span class="string">&quot;s&quot;</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">r</span> = <span class="title function_">getRandom</span>(<span class="string">&quot;r&quot;</span>)</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">x</span> = <span class="variable language_">window</span>.<span class="property">innerWidth</span>;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">y</span> = <span class="title function_">getRandom</span>(<span class="string">&quot;y&quot;</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">s</span> = <span class="title function_">getRandom</span>(<span class="string">&quot;s&quot;</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">r</span> = <span class="title function_">getRandom</span>(<span class="string">&quot;r&quot;</span>)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title class_">SakuraList</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">list</span> = []</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title class_">SakuraList</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">push</span> = <span class="keyword">function</span> (<span class="params">sakura</span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">list</span>.<span class="title function_">push</span>(sakura)</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title class_">SakuraList</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">update</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, len = <span class="variable language_">this</span>.<span class="property">list</span>.<span class="property">length</span>; i &lt; len; i++) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">list</span>[i].<span class="title function_">update</span>()</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title class_">SakuraList</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">draw</span> = <span class="keyword">function</span> (<span class="params">cxt</span>) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, len = <span class="variable language_">this</span>.<span class="property">list</span>.<span class="property">length</span>; i &lt; len; i++) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">list</span>[i].<span class="title function_">draw</span>(cxt)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title class_">SakuraList</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">get</span> = <span class="keyword">function</span> (<span class="params">i</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">list</span>[i]</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title class_">SakuraList</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">size</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">list</span>.<span class="property">length</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getRandom</span>(<span class="params">option</span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> ret, random;</span><br><span class="line">    <span class="keyword">switch</span> (option) &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;x&quot;</span>:</span><br><span class="line">            ret = <span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="variable language_">window</span>.<span class="property">innerWidth</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;y&quot;</span>:</span><br><span class="line">            ret = <span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="variable language_">window</span>.<span class="property">innerHeight</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;s&quot;</span>:</span><br><span class="line">            ret = <span class="title class_">Math</span>.<span class="title function_">random</span>();</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;r&quot;</span>:</span><br><span class="line">            ret = <span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="number">4</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;fnx&quot;</span>:</span><br><span class="line">            random = -<span class="number">0.5</span> + <span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="number">1</span>;</span><br><span class="line">            ret = <span class="keyword">function</span> (<span class="params">x, y</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> x + <span class="number">0.5</span> * random - <span class="number">1.7</span></span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;fny&quot;</span>:</span><br><span class="line">            random = <span class="number">1.5</span> + <span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="number">0.7</span>;</span><br><span class="line">            ret = <span class="keyword">function</span> (<span class="params">x, y</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> y + random</span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;fnr&quot;</span>:</span><br><span class="line">            random = <span class="title class_">Math</span>.<span class="title function_">random</span>() * <span class="number">0.03</span>;</span><br><span class="line">            ret = <span class="keyword">function</span> (<span class="params">r</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> r + random</span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ret</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">startSakura</span>(<span class="params"></span>) &#123;</span><br><span class="line">    requestAnimationFrame = <span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span> || <span class="variable language_">window</span>.<span class="property">mozRequestAnimationFrame</span> || <span class="variable language_">window</span>.<span class="property">webkitRequestAnimationFrame</span> || <span class="variable language_">window</span>.<span class="property">msRequestAnimationFrame</span> || <span class="variable language_">window</span>.<span class="property">oRequestAnimationFrame</span>;</span><br><span class="line">    <span class="keyword">var</span> canvas = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;canvas&quot;</span>),</span><br><span class="line">        cxt;</span><br><span class="line">    staticx = <span class="literal">true</span>;</span><br><span class="line">    canvas.<span class="property">height</span> = <span class="variable language_">window</span>.<span class="property">innerHeight</span>;</span><br><span class="line">    canvas.<span class="property">width</span> = <span class="variable language_">window</span>.<span class="property">innerWidth</span>;</span><br><span class="line">    canvas.<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;position: fixed;left: 0;top: 0;pointer-events: none;&quot;</span>);</span><br><span class="line">    canvas.<span class="title function_">setAttribute</span>(<span class="string">&quot;id&quot;</span>, <span class="string">&quot;canvas_sakura&quot;</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&quot;body&quot;</span>)[<span class="number">0</span>].<span class="title function_">appendChild</span>(canvas);</span><br><span class="line">    cxt = canvas.<span class="title function_">getContext</span>(<span class="string">&quot;2d&quot;</span>);</span><br><span class="line">    <span class="keyword">var</span> sakuraList = <span class="keyword">new</span> <span class="title class_">SakuraList</span>();</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; <span class="number">50</span>; i++) &#123;</span><br><span class="line">        <span class="keyword">var</span> sakura, randomX, randomY, randomS, randomR, randomFnx, randomFny;</span><br><span class="line">        randomX = <span class="title function_">getRandom</span>(<span class="string">&quot;x&quot;</span>);</span><br><span class="line">        randomY = <span class="title function_">getRandom</span>(<span class="string">&quot;y&quot;</span>);</span><br><span class="line">        randomR = <span class="title function_">getRandom</span>(<span class="string">&quot;r&quot;</span>);</span><br><span class="line">        randomS = <span class="title function_">getRandom</span>(<span class="string">&quot;s&quot;</span>);</span><br><span class="line">        randomFnx = <span class="title function_">getRandom</span>(<span class="string">&quot;fnx&quot;</span>);</span><br><span class="line">        randomFny = <span class="title function_">getRandom</span>(<span class="string">&quot;fny&quot;</span>);</span><br><span class="line">        randomFnR = <span class="title function_">getRandom</span>(<span class="string">&quot;fnr&quot;</span>);</span><br><span class="line">        sakura = <span class="keyword">new</span> <span class="title class_">Sakura</span>(randomX, randomY, randomS, randomR, &#123;</span><br><span class="line">            <span class="attr">x</span>: randomFnx,</span><br><span class="line">            <span class="attr">y</span>: randomFny,</span><br><span class="line">            <span class="attr">r</span>: randomFnR</span><br><span class="line">        &#125;);</span><br><span class="line">        sakura.<span class="title function_">draw</span>(cxt);</span><br><span class="line">        sakuraList.<span class="title function_">push</span>(sakura)</span><br><span class="line">    &#125;</span><br><span class="line">    stop = <span class="title function_">requestAnimationFrame</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        cxt.<span class="title function_">clearRect</span>(<span class="number">0</span>, <span class="number">0</span>, canvas.<span class="property">width</span>, canvas.<span class="property">height</span>);</span><br><span class="line">        sakuraList.<span class="title function_">update</span>();</span><br><span class="line">        sakuraList.<span class="title function_">draw</span>(cxt);</span><br><span class="line">        stop = <span class="title function_">requestAnimationFrame</span>(<span class="variable language_">arguments</span>.<span class="property">callee</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable language_">window</span>.<span class="property">onresize</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> canvasSnow = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;canvas_snow&quot;</span>)</span><br><span class="line">&#125;;</span><br><span class="line">img.<span class="property">onload</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="title function_">startSakura</span>()</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">stopp</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (staticx) &#123;</span><br><span class="line">        <span class="keyword">var</span> child = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;canvas_sakura&quot;</span>);</span><br><span class="line">        child.<span class="property">parentNode</span>.<span class="title function_">removeChild</span>(child);</span><br><span class="line">        <span class="variable language_">window</span>.<span class="title function_">cancelAnimationFrame</span>(stop);</span><br><span class="line">        staticx = <span class="literal">false</span></span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="title function_">startSakura</span>()</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>重启项目：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="文章三栏（店长-微调）">文章三栏（店长+微调）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考：<a href="https://akilar.top/posts/d6b69c49/">双栏布局首页卡片魔改教程</a></p><p>本网站采用的是三栏+响应式布局的方案，也就是slidecard的方案，但是为了可拓展性，我还是把两种都搬了过来，方便大家阅读！</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-3.webp" alt="image-3.webp" style="zoom:50%;" /></div></div><ol><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\mixins\post-ui.pug</code>,整个替换为下面的代码，注意，我这里用的是彩色的图标，每个<code>//- i.fas</code>那里表示我注释了黑白的额图标并换上彩色图标，彩色图标引入的具体方法见之前的教程，这里只需要替换成你自己的<code>图标名字</code>和调节相应的<code>大小</code>即可：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br></pre></td><td class="code"><pre><span class="line">mixin postUI(posts)</span><br><span class="line">  each article , index in page.posts.data</span><br><span class="line">    .recent-post-item</span><br><span class="line">      -</span><br><span class="line">        let link = article.link || article.path</span><br><span class="line">        let title = article.title || _p(&#x27;no_title&#x27;)</span><br><span class="line">        const position = theme.cover.position</span><br><span class="line">        let leftOrRight = position === &#x27;both&#x27;</span><br><span class="line">          ? index%2 == 0 ? &#x27;left&#x27; : &#x27;right&#x27;</span><br><span class="line">          : position === &#x27;left&#x27; ? &#x27;left&#x27; : &#x27;right&#x27;</span><br><span class="line">        let post_cover = article.cover</span><br><span class="line">        let no_cover = article.cover === false || !theme.cover.index_enable ? &#x27;no-cover&#x27; : &#x27;&#x27;</span><br><span class="line">      -</span><br><span class="line">      .recent-post-content(class=leftOrRight)</span><br><span class="line">        .recent-post-cover</span><br><span class="line">          img.article-cover(src=url_for(post_cover) onerror=`this.onerror=null;this.src=&#x27;`+ url_for(theme.error_img.post_page) + `&#x27;` alt=title)</span><br><span class="line">        .recent-post-info</span><br><span class="line">          a.article-title(href=url_for(link) title=title)</span><br><span class="line">            .article-title-link= title</span><br><span class="line">          .recent-post-meta                </span><br><span class="line">            .article-meta-wrap</span><br><span class="line">              if (is_home() &amp;&amp; (article.top || article.sticky &gt; 0))</span><br><span class="line">                span.article-meta</span><br><span class="line">                  //- i.fas.fa-thumbtack.sticky</span><br><span class="line">                  svg.meta_icon(style=&quot;width:16px;height:16px;position:relative;top:3px&quot;).post-ui-icon</span><br><span class="line">                    use(xlink:href=&#x27;#icon-tuding&#x27;)</span><br><span class="line">                  span.sticky= _p(&#x27;sticky&#x27;)</span><br><span class="line">                  span.article-meta-separator  | </span><br><span class="line">              if (theme.post_meta.page.date_type)</span><br><span class="line">                span.post-meta-date</span><br><span class="line">                  if (theme.post_meta.page.date_type === &#x27;both&#x27;)</span><br><span class="line">                    //- i.far.fa-calendar-alt</span><br><span class="line">                    svg.meta_icon(style=&quot;width:21px;height:21px;position:relative;top:6px&quot;).post-ui-icon</span><br><span class="line">                      use(xlink:href=&#x27;#icon-rili&#x27;)</span><br><span class="line">                    span.article-meta-label=_p(&#x27;post.created&#x27;)</span><br><span class="line">                    time.post-meta-date-created(datetime=date_xml(article.date) title=_p(&#x27;post.created&#x27;) + &#x27; &#x27; + full_date(article.date))=date(article.date, config.date_format)</span><br><span class="line">                    span.article-meta-separator  | </span><br><span class="line">                    //- i.fas.fa-history</span><br><span class="line">                    svg.meta_icon(style=&quot;width:13px;height:13px;position:relative;top:2px&quot;).post-ui-icon</span><br><span class="line">                      use(xlink:href=&#x27;#icon-gengxin1&#x27;)                    </span><br><span class="line">                    span.article-meta-label=_p(&#x27;post.updated&#x27;) + &quot; &quot;</span><br><span class="line">                    time.post-meta-date-updated(datetime=date_xml(article.updated) title=_p(&#x27;post.updated&#x27;) + &#x27; &#x27; + full_date(article.updated))=date(article.updated, config.date_format)</span><br><span class="line">                  else</span><br><span class="line">                    - let data_type_updated = theme.post_meta.page.date_type === &#x27;updated&#x27;</span><br><span class="line">                    - let date_type = data_type_updated ? &#x27;updated&#x27; : &#x27;date&#x27;</span><br><span class="line">                    - let date_icon = data_type_updated ? &#x27;fas fa-history&#x27; :&#x27;far fa-calendar-alt&#x27;</span><br><span class="line">                    - let date_title = data_type_updated ? _p(&#x27;post.updated&#x27;) : _p(&#x27;post.created&#x27;)</span><br><span class="line">                    i(class=date_icon)</span><br><span class="line">                    span.article-meta-label=date_title</span><br><span class="line">                    time(datetime=date_xml(article[date_type]) title=date_title + &#x27; &#x27; + full_date(article[date_type]))=date(article[date_type], config.date_format)</span><br><span class="line">              if (theme.post_meta.page.categories &amp;&amp; article.categories.data.length &gt; 0)</span><br><span class="line">                span.article-meta</span><br><span class="line">                  span.article-meta-separator  | </span><br><span class="line">                  //- i.fas.fa-inbox</span><br><span class="line">                  svg.meta_icon(style=&quot;width:12px;height:12px;position:relative;top:1px&quot;).post-ui-icon</span><br><span class="line">                    use(xlink:href=&#x27;#icon-fenlei&#x27;)</span><br><span class="line">                  each item, index in article.categories.data</span><br><span class="line">                    a(href=url_for(item.path)).article-meta__categories #[=item.name]</span><br><span class="line">                    if (index &lt; article.categories.data.length - 1)</span><br><span class="line">                      i.fas.fa-angle-right.article-meta-link</span><br><span class="line">              if (theme.post_meta.page.tags &amp;&amp; article.tags.data.length &gt; 0)</span><br><span class="line">                span.article-meta.tags</span><br><span class="line">                  span.article-meta-separator  | </span><br><span class="line">                  //- i.fas.fa-tag</span><br><span class="line">                  svg.meta_icon(style=&quot;width:13px;height:13px;position:relative;top:2px&quot;).post-ui-icon</span><br><span class="line">                    use(xlink:href=&#x27;#icon-biaoqian&#x27;)</span><br><span class="line">                  each item, index in article.tags.data</span><br><span class="line">                    a(href=url_for(item.path)).article-meta__tags #[=item.name]</span><br><span class="line">                    if (index &lt; article.tags.data.length - 1)</span><br><span class="line">                      span.article-meta-link #[=&#x27; • &#x27;]</span><br><span class="line">              </span><br><span class="line">              mixin countBlockInIndex</span><br><span class="line">                - needLoadCountJs = true</span><br><span class="line">                span.article-meta</span><br><span class="line">                  span.article-meta-separator  | </span><br><span class="line">                  //- i.fas.fa-comments</span><br><span class="line">                  svg.meta_icon(style=&quot;width:13px;height:13px;position:relative;top:2px&quot;).post-ui-icon</span><br><span class="line">                    use(xlink:href=&#x27;#icon-pinglun1&#x27;)</span><br><span class="line">                  if block</span><br><span class="line">                    block</span><br><span class="line">                  span.article-meta-label= &#x27; &#x27; + _p(&#x27;card_post_count&#x27;)</span><br><span class="line">              </span><br><span class="line">              if theme.comments.card_post_count</span><br><span class="line">                case theme.comments.use[0]</span><br><span class="line">                  when &#x27;Disqus&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=full_url_for(link) + &#x27;#disqus_thread&#x27;)</span><br><span class="line">                        i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Disqusjs&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=full_url_for(link) + &#x27;#disqusjs&#x27;)</span><br><span class="line">                        span.disqus-comment-count(data-disqus-url=full_url_for(link))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Valine&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=url_for(link) + &#x27;#post-comment&#x27;)</span><br><span class="line">                        span.valine-comment-count(data-xid=url_for(link))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Waline&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=url_for(link) + &#x27;#post-comment&#x27;)</span><br><span class="line">                        span.waline-comment-count(id=url_for(link))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Twikoo&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a.twikoo-count(href=url_for(link) + &#x27;#post-comment&#x27;)</span><br><span class="line">                        i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Facebook Comments&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=url_for(link) + &#x27;#post-comment&#x27;)</span><br><span class="line">                        span.fb-comments-count(data-href=urlNoIndex(article.permalink))</span><br><span class="line">                  when &#x27;Remark42&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=url_for(link) + &#x27;#post-comment&#x27;)</span><br><span class="line">                        span.remark42__counter(data-url=urlNoIndex(article.permalink))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Artalk&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=url_for(link) + &#x27;#post-comment&#x27;)</span><br><span class="line">                        span.artalk-count(data-page-key=url_for(link))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin      </span><br><span class="line">        a.article-content(href=url_for(link) title=title)</span><br><span class="line">          //- Display the article introduction on homepage</span><br><span class="line">          case theme.index_post_content.method</span><br><span class="line">            when false</span><br><span class="line">              - break</span><br><span class="line">            when 1</span><br><span class="line">              .article-content-text!= article.description</span><br><span class="line">            when 2</span><br><span class="line">              if article.description</span><br><span class="line">                .article-content-text!= article.description</span><br><span class="line">              else</span><br><span class="line">                - const content = strip_html(article.content)</span><br><span class="line">                - let expert = content.substring(0, theme.index_post_content.length) </span><br><span class="line">                - content.length &gt; theme.index_post_content.length ? expert += &#x27; ...&#x27; : &#x27;&#x27;</span><br><span class="line">                .article-content-text!= expert</span><br><span class="line">            default</span><br><span class="line">              - const content = strip_html(article.content)</span><br><span class="line">              - let expert = content.substring(0, theme.index_post_content.length) </span><br><span class="line">              - content.length &gt; theme.index_post_content.length ? expert += &#x27; ...&#x27; : &#x27;&#x27;</span><br><span class="line">              .article-content-text!= expert      </span><br><span class="line">        .recent-post-arrow</span><br><span class="line"></span><br><span class="line">    if theme.ad &amp;&amp; theme.ad.index</span><br><span class="line">      if (index + 1) % 3 == 0</span><br><span class="line">        .recent-post-item.ads-wrap!=theme.ad.index</span><br></pre></td></tr></table></figure></li><li><p>样式方案提供两种：</p><ul><li>样式一：电脑端宽屏采用滑动卡片，平板宽度采用双栏布局，手机宽度采用单栏卡片</li><li>样式二：移除滑动卡片，按屏幕宽度依次应用三栏、双栏、单栏</li></ul><p>新建目录<code>[BlogRoot]\themes\butterfly\source\css\_index_card_style\</code>,并在下面新建对应的文件<code>slidecard.styl</code>和<code>multicard.styl</code>并分别填入以下内容，第一个滑动卡片的是店长原版的，我微调一下第二个的样式，大家可以根据自己的选择进行修改：</p><div class="tabs" id="分栏样式"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏样式-1">样式一:slidecard</button></li><li class="tab"><button type="button" data-href="#分栏样式-2">样式二:multicard(微调)</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏样式-1"><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//default color:</span></span><br><span class="line"><span class="selector-pseudo">:root</span></span><br><span class="line">  <span class="attr">--recent-post-bgcolor</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.9</span>)  <span class="comment">//默认背景</span></span><br><span class="line">  <span class="attr">--article-content-bgcolor</span>: <span class="number">#49b1f5</span> <span class="comment">//描述版块背景</span></span><br><span class="line">  <span class="attr">--recent-post-arrow</span>: <span class="number">#ffffff</span> <span class="comment">//箭头配色</span></span><br><span class="line">  <span class="attr">--recent-post-cover-shadow</span>: <span class="number">#ffffff</span> <span class="comment">//封面遮罩层配色，建议和默认值的颜色相对应。</span></span><br><span class="line">  <span class="attr">--recent-post-transition</span>: <span class="attribute">all</span> <span class="number">0.5s</span> <span class="built_in">cubic-bezier</span>(<span class="number">0.59</span>, <span class="number">0.01</span>, <span class="number">0.48</span>, <span class="number">1.17</span>)  //动画效果。不了解的不要改动</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span></span><br><span class="line">  <span class="attr">--recent-post-bgcolor</span>: <span class="built_in">rgba</span>(<span class="number">35</span>,<span class="number">35</span>,<span class="number">35</span>,<span class="number">0.5</span>)</span><br><span class="line">  <span class="attr">--article-content-bgcolor</span>: <span class="number">#99999a</span></span><br><span class="line">  <span class="attr">--recent-post-arrow</span>: <span class="number">#37e2dd</span></span><br><span class="line">  <span class="attr">--recent-post-cover-shadow</span>: <span class="number">#232323</span></span><br><span class="line"><span class="comment">// 默认的首页卡片容器布局</span></span><br><span class="line"><span class="selector-class">.recent-posts</span></span><br><span class="line">  <span class="attribute">padding</span> <span class="number">0</span> <span class="number">15px</span> <span class="number">0</span> <span class="number">15px</span></span><br><span class="line">  <span class="attribute">height</span> fit-content</span><br><span class="line">  <span class="selector-class">.recent-post-item</span></span><br><span class="line">    <span class="attribute">margin-bottom</span> <span class="number">15px</span></span><br><span class="line">    <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">    <span class="attribute">background</span> <span class="built_in">var</span>(--recent-post-bgcolor)</span><br><span class="line">    <span class="attribute">overflow</span> hidden</span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">15px</span></span><br><span class="line">    <span class="selector-class">.recent-post-content</span></span><br><span class="line">      <span class="attribute">display</span> flex</span><br><span class="line">      <span class="attribute">background</span> <span class="built_in">var</span>(--recent-post-bgcolor)</span><br><span class="line">      <span class="attribute">position</span> relative</span><br><span class="line">      <span class="selector-class">.recent-post-cover</span></span><br><span class="line">        <span class="attribute">display</span> flex</span><br><span class="line">        <span class="attribute">background</span> transparent</span><br><span class="line">      <span class="selector-class">.recent-post-info</span></span><br><span class="line">        <span class="attribute">display</span> flex</span><br><span class="line">        <span class="attribute">background</span> transparent</span><br><span class="line">        <span class="attribute">flex-direction</span> column</span><br><span class="line">        <span class="attribute">justify-content</span> center</span><br><span class="line">        <span class="attribute">align-items</span> center</span><br><span class="line">        <span class="selector-class">.article-title</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">50%</span></span><br><span class="line">          <span class="attribute">display</span>: flex</span><br><span class="line">          <span class="attribute">text-align</span>: center</span><br><span class="line">          <span class="attribute">align-items</span>: center</span><br><span class="line">          <span class="attribute">justify-content</span>: flex-end</span><br><span class="line">          <span class="attribute">flex-direction</span>: column</span><br><span class="line">          <span class="selector-class">.article-title-link</span></span><br><span class="line">            <span class="attribute">color</span>: <span class="built_in">var</span>(--text-highlight-color)</span><br><span class="line">            <span class="attribute">transition</span>: all .<span class="number">2s</span> ease-in-out</span><br><span class="line">            <span class="attribute">display</span>: -webkit-box;</span><br><span class="line">            -webkit-box-orient: vertical;</span><br><span class="line">            <span class="attribute">overflow</span>: hidden;</span><br><span class="line">            <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">              <span class="attribute">color</span>: <span class="variable">$text</span>-hover</span><br><span class="line">        <span class="selector-class">.recent-post-meta</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">50%</span></span><br><span class="line">          <span class="attribute">display</span>: flex</span><br><span class="line">          <span class="attribute">text-align</span>: center</span><br><span class="line">          <span class="attribute">align-items</span>: center</span><br><span class="line">          <span class="attribute">justify-content</span>: flex-start</span><br><span class="line">          <span class="attribute">flex-direction</span>: column</span><br><span class="line">          <span class="selector-class">.article-meta-wrap</span></span><br><span class="line">            <span class="attribute">color</span> <span class="number">#969797</span></span><br><span class="line">            <span class="attribute">display</span>: -webkit-box;</span><br><span class="line">            -webkit-box-orient: vertical;</span><br><span class="line">            <span class="attribute">overflow</span>: hidden;</span><br><span class="line">            <span class="selector-tag">a</span></span><br><span class="line">              <span class="attribute">color</span>: <span class="built_in">var</span>(--text-highlight-color)</span><br><span class="line">              <span class="attribute">transition</span>: all .<span class="number">2s</span> ease-in-out</span><br><span class="line">              <span class="attribute">color</span> <span class="number">#969797</span></span><br><span class="line">              <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">                <span class="attribute">color</span>: <span class="variable">$text</span>-hover</span><br><span class="line">      <span class="selector-class">.article-content</span></span><br><span class="line">        <span class="attribute">display</span> flex</span><br><span class="line">        <span class="attribute">text-align</span>: center</span><br><span class="line">        <span class="attribute">flex-direction</span> row</span><br><span class="line">        <span class="attribute">align-items</span> center</span><br><span class="line">        <span class="attribute">justify-content</span> center</span><br><span class="line">        <span class="selector-class">.article-content-text</span></span><br><span class="line">          <span class="attribute">display</span> -webkit-box</span><br><span class="line">          -webkit-box-orient vertical</span><br><span class="line">          <span class="attribute">text-overflow</span>: ellipsis</span><br><span class="line">          <span class="attribute">overflow</span> hidden</span><br><span class="line">          <span class="attribute">color</span> <span class="number">#fff</span></span><br><span class="line">          <span class="attribute">text-shadow</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">3px</span> <span class="number">#000</span></span><br><span class="line">          <span class="selector-pseudo">&amp;::before</span></span><br><span class="line">            <span class="attribute">content</span> <span class="string">&quot;❝&quot;</span></span><br><span class="line">            <span class="attribute">font-size</span> <span class="number">20px</span></span><br><span class="line">          <span class="selector-pseudo">&amp;::after</span></span><br><span class="line">            <span class="attribute">content</span> <span class="string">&quot;❞&quot;</span></span><br><span class="line">            <span class="attribute">font-size</span> <span class="number">20px</span></span><br><span class="line">    &amp;<span class="selector-class">.ads-wrap</span></span><br><span class="line">      <span class="attribute">display</span>: block <span class="meta">!important</span></span><br><span class="line">      <span class="attribute">height</span>: auto <span class="meta">!important</span></span><br><span class="line"><span class="comment">// PC端滑动卡片样式</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">min-width</span>:<span class="number">1069px</span>)</span><br><span class="line">  .recent-posts</span><br><span class="line">    padding <span class="number">0</span> <span class="number">15px</span> <span class="number">0</span> <span class="number">15px</span></span><br><span class="line">    .recent-post-item</span><br><span class="line">      .recent-post-content</span><br><span class="line">        position relative</span><br><span class="line">        <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">        transition var(--recent-post-transition)</span><br><span class="line">        &amp;:<span class="attribute">hover</span></span><br><span class="line">          .recent-post-cover-shadow</span><br><span class="line">            <span class="attribute">width</span> <span class="number">10.1%</span></span><br><span class="line">            transition var(--recent-post-transition)</span><br><span class="line">          .recent-post-cover</span><br><span class="line">            <span class="attribute">width</span> <span class="number">10%</span></span><br><span class="line">            transition var(--recent-post-transition)</span><br><span class="line">          .article-content</span><br><span class="line">            <span class="attribute">width</span> calc(<span class="number">30%</span> + <span class="number">80px</span>)</span><br><span class="line">            transition var(--recent-post-transition)</span><br><span class="line">            .article-content-text</span><br><span class="line">              opacity <span class="number">1</span></span><br><span class="line">          .recent-post-arrow</span><br><span class="line">            transition var(--recent-post-transition)</span><br><span class="line">        .recent-post-cover-shadow</span><br><span class="line">          z-index: <span class="number">1</span></span><br><span class="line">          transition var(--recent-post-transition)</span><br><span class="line">          position: absolute</span><br><span class="line">          <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">40%</span></span><br><span class="line">        .recent-post-cover</span><br><span class="line">          <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">40%</span></span><br><span class="line">          transition var(--recent-post-transition)</span><br><span class="line">          img</span><br><span class="line">            <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">            <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">            object-fit cover</span><br><span class="line"></span><br><span class="line">        .recent-post-info</span><br><span class="line">          <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">          <span class="attribute">width</span> calc(<span class="number">60%</span> - <span class="number">80px</span>)</span><br><span class="line">          .article-title</span><br><span class="line">            margin: <span class="number">0px</span> <span class="number">40px</span></span><br><span class="line">            font-size <span class="number">24px</span></span><br><span class="line">            .article-title-link</span><br><span class="line">              -webkit-line-clamp: <span class="number">2</span>;</span><br><span class="line">          <span class="selector-class">.recent-post-meta</span></span><br><span class="line">            <span class="attribute">margin</span>: <span class="number">0px</span> <span class="number">20px</span></span><br><span class="line">            <span class="selector-class">.article-meta-wrap</span></span><br><span class="line">              <span class="attribute">font-size</span> <span class="number">12px</span></span><br><span class="line">              -webkit-line-clamp: <span class="number">3</span>;</span><br><span class="line">        <span class="selector-class">.article-content</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">90px</span></span><br><span class="line">          <span class="attribute">background</span> <span class="built_in">var</span>(--article-content-bgcolor)</span><br><span class="line">          <span class="attribute">transition</span> <span class="built_in">var</span>(--recent-post-transition)</span><br><span class="line">          <span class="selector-class">.article-content-text</span></span><br><span class="line">            -webkit-line-clamp <span class="number">4</span></span><br><span class="line">            <span class="attribute">transition</span>: <span class="built_in">var</span>(--recent-post-transition)</span><br><span class="line">            <span class="attribute">opacity</span> <span class="number">0</span></span><br><span class="line">        <span class="selector-class">.recent-post-arrow</span></span><br><span class="line">          <span class="attribute">transition</span> <span class="built_in">var</span>(--recent-post-transition)</span><br><span class="line">          <span class="attribute">display</span> block</span><br><span class="line">          <span class="attribute">position</span> absolute</span><br><span class="line">          <span class="attribute">height</span> <span class="number">20px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">8px</span></span><br><span class="line">          <span class="attribute">background</span> <span class="built_in">var</span>(--recent-post-arrow)</span><br><span class="line">        &amp;<span class="selector-class">.both</span>,</span><br><span class="line">        &amp;<span class="selector-class">.right</span></span><br><span class="line">          <span class="selector-class">.recent-post-cover-shadow</span></span><br><span class="line">            <span class="attribute">left</span> <span class="number">0</span></span><br><span class="line">            <span class="attribute">background</span> <span class="built_in">linear-gradient</span>(to left, <span class="built_in">var</span>(--recent-post-cover-shadow), transparent)</span><br><span class="line">          <span class="selector-class">.recent-post-cover</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">1</span></span><br><span class="line">          <span class="selector-class">.recent-post-info</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">2</span></span><br><span class="line">          <span class="selector-class">.article-content</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">3</span></span><br><span class="line">            <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">50%</span>, <span class="number">80px</span> <span class="number">0</span>, <span class="number">100%</span> <span class="number">0</span>, <span class="number">100%</span> <span class="number">100%</span>, <span class="number">80px</span> <span class="number">100%</span>)</span><br><span class="line">            <span class="selector-class">.article-content-text</span></span><br><span class="line">              <span class="attribute">margin</span> <span class="number">20px</span> <span class="number">40px</span> <span class="number">20px</span> <span class="number">80px</span></span><br><span class="line">          <span class="selector-class">.recent-post-arrow</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">4</span></span><br><span class="line">            <span class="attribute">left</span> <span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">80px</span>)</span><br><span class="line">            <span class="attribute">top</span> <span class="built_in">calc</span>(<span class="number">50%</span> - <span class="number">10px</span>)</span><br><span class="line">            <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">10px</span>, <span class="number">8px</span> <span class="number">0</span>, <span class="number">8px</span> <span class="number">20px</span>)</span><br><span class="line">          <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">            <span class="selector-class">.recent-post-arrow</span></span><br><span class="line">              <span class="attribute">left</span> <span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">40px</span>)</span><br><span class="line">        &amp;<span class="selector-class">.left</span></span><br><span class="line">          <span class="selector-class">.recent-post-cover-shadow</span></span><br><span class="line">            <span class="attribute">right</span> <span class="number">0</span></span><br><span class="line">            <span class="attribute">background</span> <span class="built_in">linear-gradient</span>(to right, <span class="built_in">var</span>(--recent-post-cover-shadow), transparent)</span><br><span class="line">          <span class="selector-class">.recent-post-cover</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">4</span></span><br><span class="line">          <span class="selector-class">.recent-post-info</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">3</span></span><br><span class="line">          <span class="selector-class">.article-content</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">2</span></span><br><span class="line">            <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">100%</span> <span class="number">50%</span>,<span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">80px</span>) <span class="number">100%</span>,<span class="number">0</span> <span class="number">100%</span>,<span class="number">0</span> <span class="number">0</span>,<span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">80px</span>) <span class="number">0</span>)</span><br><span class="line">            <span class="selector-class">.article-content-text</span></span><br><span class="line">              <span class="attribute">margin</span> <span class="number">20px</span> <span class="number">80px</span> <span class="number">20px</span> <span class="number">40px</span></span><br><span class="line">          <span class="selector-class">.recent-post-arrow</span></span><br><span class="line">            <span class="attribute">order</span>: <span class="number">1</span></span><br><span class="line">            <span class="attribute">left</span> <span class="number">72px</span></span><br><span class="line">            <span class="attribute">top</span> <span class="built_in">calc</span>(<span class="number">50%</span> - <span class="number">10px</span>)</span><br><span class="line">            <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">0</span>, <span class="number">8px</span> <span class="number">10px</span>, <span class="number">0</span> <span class="number">20px</span>)</span><br><span class="line">          <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">            <span class="selector-class">.recent-post-arrow</span></span><br><span class="line">              <span class="attribute">left</span> <span class="number">32px</span></span><br><span class="line"><span class="comment">// 双栏布局卡片自适应适配</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">min-width</span>:<span class="number">572px</span>) <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">1068px</span>)</span><br><span class="line">  .recent-posts</span><br><span class="line">    padding <span class="number">0</span> <span class="number">15px</span> <span class="number">0</span> <span class="number">15px</span></span><br><span class="line">    display flex</span><br><span class="line">    flex-direction row</span><br><span class="line">    flex-wrap wrap</span><br><span class="line">    .recent-post-item</span><br><span class="line">      border-radius <span class="number">15px</span></span><br><span class="line">      overflow hidden</span><br><span class="line">      <span class="attribute">width</span> <span class="number">47%</span></span><br><span class="line">      margin <span class="number">0px</span> <span class="number">3%</span> <span class="number">20px</span> <span class="number">0px</span></span><br><span class="line">    nav#pagination</span><br><span class="line">      <span class="attribute">width</span>: <span class="number">100%</span></span><br><span class="line">// 手机端单栏布局自适应适配</span><br><span class="line">@media screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">572px</span>)</span><br><span class="line">  .recent-posts</span><br><span class="line">    padding <span class="number">0</span> <span class="number">15px</span> <span class="number">0</span> <span class="number">15px</span></span><br><span class="line">    .recent-post-item</span><br><span class="line">      border-radius <span class="number">15px</span></span><br><span class="line">      overflow hidden</span><br><span class="line">        </span><br><span class="line">// 手机端及双栏卡片样式</span><br><span class="line">@media screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">1068px</span>)</span><br><span class="line">  .recent-posts</span><br><span class="line">    .recent-post-item</span><br><span class="line">      .recent-post-content</span><br><span class="line">        flex-direction column</span><br><span class="line">        flex-wrap nowrap</span><br><span class="line">        align-items center</span><br><span class="line">        <span class="attribute">max-height</span> <span class="number">350px</span></span><br><span class="line">        <span class="attribute">height</span>: auto </span><br><span class="line">        <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">        .recent-post-cover</span><br><span class="line">          <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">          clip-path polygon(<span class="number">0</span> <span class="number">130px</span>,<span class="number">0</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">130px</span>,<span class="number">50%</span> <span class="number">100%</span>)</span><br><span class="line">          img</span><br><span class="line">            <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">            <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">            object-fit cover</span><br><span class="line">        .recent-post-info</span><br><span class="line">          <span class="attribute">height</span> <span class="number">150px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">          padding <span class="number">0px</span> <span class="number">25px</span> <span class="number">5px</span> <span class="number">25px</span></span><br><span class="line">          .article-title</span><br><span class="line">            margin: <span class="number">0px</span> <span class="number">40px</span></span><br><span class="line">            font-size <span class="number">18px</span></span><br><span class="line">            .article-title-link</span><br><span class="line">              -webkit-line-clamp: <span class="number">2</span>;</span><br><span class="line">          <span class="selector-class">.recent-post-meta</span></span><br><span class="line">            <span class="attribute">margin</span>: <span class="number">0px</span> <span class="number">20px</span></span><br><span class="line">            <span class="selector-class">.article-meta-wrap</span></span><br><span class="line">              <span class="attribute">font-size</span> <span class="number">12px</span></span><br><span class="line">              -webkit-line-clamp: <span class="number">3</span>;</span><br><span class="line">        <span class="selector-class">.article-content</span></span><br><span class="line">          <span class="attribute">position</span> absolute</span><br><span class="line">          <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">          <span class="attribute">background</span> <span class="built_in">rgba</span>(<span class="number">25</span>,<span class="number">25</span>,<span class="number">25</span>,<span class="number">0.5</span>)</span><br><span class="line">          <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">130px</span>,<span class="number">0</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">130px</span>,<span class="number">50%</span> <span class="number">100%</span>)</span><br><span class="line">          <span class="selector-class">.article-content-text</span></span><br><span class="line">            -webkit-line-clamp <span class="number">3</span></span><br><span class="line">            <span class="attribute">font-size</span> <span class="number">16px</span></span><br><span class="line">            <span class="attribute">margin</span> <span class="number">0px</span> <span class="number">25px</span> <span class="number">30px</span> <span class="number">25px</span></span><br><span class="line">        <span class="selector-class">.recent-post-arrow</span></span><br><span class="line">          <span class="attribute">display</span> block</span><br><span class="line">          <span class="attribute">background</span> <span class="built_in">var</span>(--article-content-bgcolor)</span><br><span class="line">          <span class="attribute">position</span> absolute</span><br><span class="line">          <span class="attribute">height</span> <span class="number">10px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">20px</span></span><br><span class="line">          <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">0</span>,<span class="number">50%</span> <span class="number">100%</span>)</span><br><span class="line">          <span class="attribute">top</span> <span class="number">20px</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏样式-2"><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-pseudo">:root</span></span><br><span class="line">  <span class="attr">--theme-color</span>:<span class="built_in">rgb</span>(<span class="number">57</span>, <span class="number">197</span>, <span class="number">187</span>)</span><br><span class="line">  <span class="attr">--text-bg-hover</span>:<span class="built_in">rgba</span>(<span class="number">57</span>, <span class="number">197</span>, <span class="number">187</span>, <span class="number">0.7</span>)</span><br><span class="line">  </span><br><span class="line"><span class="selector-class">.recent-posts</span></span><br><span class="line">  <span class="attribute">padding</span> <span class="number">0</span> <span class="number">5px</span> <span class="number">0</span> <span class="number">5px</span></span><br><span class="line">  <span class="attribute">height</span> fit-content</span><br><span class="line">  <span class="selector-class">.recent-post-item</span></span><br><span class="line">    <span class="attribute">margin-bottom</span> <span class="number">15px</span></span><br><span class="line">    <span class="attribute">overflow</span> hidden</span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">15px</span></span><br><span class="line">    <span class="selector-class">.recent-post-content</span></span><br><span class="line">      <span class="attribute">display</span> flex</span><br><span class="line">      <span class="attribute">position</span> relative</span><br><span class="line">      <span class="selector-class">.recent-post-cover</span></span><br><span class="line">        <span class="attribute">display</span> flex</span><br><span class="line">        <span class="attribute">background</span> transparent</span><br><span class="line">      <span class="selector-class">.recent-post-info</span></span><br><span class="line">        <span class="attribute">display</span> flex</span><br><span class="line">        <span class="attribute">background</span> transparent</span><br><span class="line">        <span class="attribute">flex-direction</span> column</span><br><span class="line">        <span class="attribute">justify-content</span> center</span><br><span class="line">        <span class="attribute">align-items</span> center</span><br><span class="line">        <span class="selector-class">.article-title</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">50%</span></span><br><span class="line">          <span class="attribute">display</span>: flex</span><br><span class="line">          <span class="attribute">text-align</span>: center</span><br><span class="line">          <span class="attribute">align-items</span>: center</span><br><span class="line">          <span class="attribute">justify-content</span>: flex-end</span><br><span class="line">          <span class="attribute">flex-direction</span>: column</span><br><span class="line">          <span class="selector-class">.article-title-link</span></span><br><span class="line">            <span class="attribute">color</span>: <span class="built_in">var</span>(--text-highlight-color)</span><br><span class="line">            <span class="attribute">transition</span>: all .<span class="number">2s</span> ease-in-out</span><br><span class="line">            <span class="attribute">display</span>: -webkit-box;</span><br><span class="line">            -webkit-box-orient: vertical;</span><br><span class="line">            <span class="attribute">overflow</span>: hidden;</span><br><span class="line">            <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">              <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color)</span><br><span class="line">        <span class="selector-class">.recent-post-meta</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">50%</span></span><br><span class="line">          <span class="attribute">display</span>: flex</span><br><span class="line">          <span class="attribute">text-align</span>: center</span><br><span class="line">          <span class="attribute">align-items</span>: center</span><br><span class="line">          <span class="attribute">justify-content</span>: flex-start</span><br><span class="line">          <span class="attribute">flex-direction</span>: column</span><br><span class="line">          <span class="selector-class">.article-meta-wrap</span></span><br><span class="line">            <span class="attribute">color</span> <span class="number">#969797</span></span><br><span class="line">            <span class="attribute">display</span>: -webkit-box;</span><br><span class="line">            -webkit-box-orient: vertical;</span><br><span class="line">            <span class="attribute">overflow</span>: hidden;</span><br><span class="line">            <span class="selector-tag">a</span></span><br><span class="line">              <span class="attribute">color</span>: <span class="built_in">var</span>(--text-highlight-color)</span><br><span class="line">              <span class="attribute">transition</span>: all .<span class="number">2s</span> ease-in-out</span><br><span class="line">              <span class="attribute">color</span> <span class="number">#969797</span></span><br><span class="line">              <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">                <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color)</span><br><span class="line">      <span class="selector-class">.article-content</span></span><br><span class="line">        <span class="attribute">display</span> flex</span><br><span class="line">        <span class="attribute">text-align</span>: center</span><br><span class="line">        <span class="attribute">flex-direction</span> row</span><br><span class="line">        <span class="attribute">align-items</span> center</span><br><span class="line">        <span class="attribute">justify-content</span> center</span><br><span class="line">        <span class="selector-class">.article-content-text</span></span><br><span class="line">          <span class="attribute">display</span> -webkit-box</span><br><span class="line">          -webkit-box-orient vertical</span><br><span class="line">          <span class="attribute">text-overflow</span>: ellipsis</span><br><span class="line">          <span class="attribute">overflow</span> hidden</span><br><span class="line">          <span class="attribute">color</span> <span class="number">#fff</span></span><br><span class="line">          <span class="attribute">text-shadow</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">3px</span> <span class="number">#000</span></span><br><span class="line">          <span class="attribute">transition</span> transform <span class="number">0.6s</span>;</span><br><span class="line">          <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">            <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">    &amp;<span class="selector-class">.ads-wrap</span></span><br><span class="line">      <span class="attribute">display</span>: block <span class="meta">!important</span></span><br><span class="line">      <span class="attribute">height</span>: auto <span class="meta">!important</span></span><br><span class="line">  nav<span class="selector-id">#pagination</span></span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span></span><br><span class="line"><span class="comment">// 卡片单元布局样式</span></span><br><span class="line"><span class="selector-class">.recent-posts</span></span><br><span class="line">  <span class="attribute">padding</span> <span class="number">0</span> <span class="number">5px</span> <span class="number">0</span> <span class="number">5px</span></span><br><span class="line">  <span class="attribute">display</span> flex</span><br><span class="line">  <span class="attribute">flex-direction</span> row</span><br><span class="line">  <span class="attribute">flex-wrap</span> wrap</span><br><span class="line">  <span class="selector-class">.recent-post-item</span></span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">15px</span></span><br><span class="line">    <span class="attribute">overflow</span> hidden</span><br><span class="line">    <span class="selector-class">.recent-post-content</span></span><br><span class="line">      <span class="attribute">flex-direction</span> column</span><br><span class="line">      <span class="attribute">flex-wrap</span> nowrap</span><br><span class="line">      <span class="attribute">align-items</span> center</span><br><span class="line">      <span class="attribute">max-height</span> <span class="number">350px</span></span><br><span class="line">      <span class="attribute">height</span>: auto</span><br><span class="line">      <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">      <span class="selector-class">.recent-post-cover</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">        <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">        <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">130px</span>,<span class="number">0</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">130px</span>,<span class="number">50%</span> <span class="number">100%</span>)</span><br><span class="line">        <span class="selector-tag">img</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">          <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">          <span class="attribute">object-fit</span> cover</span><br><span class="line">      <span class="selector-class">.recent-post-info</span></span><br><span class="line">        <span class="attribute">height</span> <span class="number">145px</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">        <span class="attribute">padding</span> <span class="number">0px</span> <span class="number">25px</span> <span class="number">5px</span> <span class="number">25px</span></span><br><span class="line">        <span class="selector-class">.article-title</span></span><br><span class="line">          <span class="attribute">margin</span>: <span class="number">0px</span> <span class="number">40px</span></span><br><span class="line">          <span class="attribute">font-size</span> <span class="number">19px</span></span><br><span class="line">          <span class="selector-class">.article-title-link</span></span><br><span class="line">            -webkit-line-clamp: <span class="number">2</span>;</span><br><span class="line">        <span class="selector-class">.recent-post-meta</span></span><br><span class="line">          <span class="attribute">margin</span>: <span class="number">0px</span> <span class="number">20px</span></span><br><span class="line">          <span class="selector-class">.article-meta-wrap</span></span><br><span class="line">            <span class="attribute">font-size</span> <span class="number">13px</span></span><br><span class="line">            -webkit-line-clamp: <span class="number">3</span>;</span><br><span class="line">      <span class="selector-class">.article-content</span></span><br><span class="line">        <span class="attribute">position</span> absolute</span><br><span class="line">        <span class="attribute">height</span> <span class="number">200px</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">        <span class="attribute">background</span> <span class="built_in">rgba</span>(<span class="number">25</span>,<span class="number">25</span>,<span class="number">25</span>,<span class="number">0.4</span>)</span><br><span class="line">        <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">130px</span>,<span class="number">0</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">130px</span>,<span class="number">50%</span> <span class="number">100%</span>)</span><br><span class="line">        <span class="selector-class">.article-content-text</span></span><br><span class="line">          -webkit-line-clamp <span class="number">3</span></span><br><span class="line">          <span class="attribute">font-size</span> <span class="number">16px</span></span><br><span class="line">          <span class="attribute">margin</span> <span class="number">0px</span> <span class="number">25px</span> <span class="number">30px</span> <span class="number">25px</span></span><br><span class="line">          <span class="selector-pseudo">&amp;::before</span></span><br><span class="line">            <span class="attribute">content</span> <span class="string">&quot;「&quot;</span></span><br><span class="line">            <span class="attribute">font-size</span> <span class="number">20px</span></span><br><span class="line">          <span class="selector-pseudo">&amp;::after</span></span><br><span class="line">            <span class="attribute">content</span> <span class="string">&quot;」&quot;</span></span><br><span class="line">            <span class="attribute">font-size</span> <span class="number">20px</span></span><br><span class="line">      <span class="selector-class">.recent-post-arrow</span></span><br><span class="line">        <span class="attribute">display</span> block</span><br><span class="line">        <span class="attribute">background</span> <span class="built_in">var</span>(--text-bg-hover)</span><br><span class="line">        <span class="attribute">position</span> absolute</span><br><span class="line">        <span class="attribute">height</span> <span class="number">10px</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">20px</span></span><br><span class="line">        <span class="attribute">clip-path</span> <span class="built_in">polygon</span>(<span class="number">0</span> <span class="number">0</span>,<span class="number">100%</span> <span class="number">0</span>,<span class="number">50%</span> <span class="number">100%</span>)</span><br><span class="line"><span class="comment">// 三栏布局滑动卡片样式</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">min-width</span>:<span class="number">1069px</span>)</span><br><span class="line">  .recent-posts</span><br><span class="line">    .recent-post-item</span><br><span class="line">      <span class="attribute">width</span> <span class="number">32.3%</span></span><br><span class="line">      margin <span class="number">0px</span> <span class="number">1%</span> <span class="number">20px</span> <span class="number">0px</span></span><br><span class="line">      .recent-post-content</span><br><span class="line">        .recent-post-info</span><br><span class="line">          .article-title</span><br><span class="line">            margin: <span class="number">0px</span> <span class="number">5px</span></span><br><span class="line">            .article-title-link</span><br><span class="line">              -webkit-line-clamp: <span class="number">1</span>;</span><br><span class="line">          <span class="selector-class">.recent-post-meta</span></span><br><span class="line">            <span class="attribute">margin</span>: <span class="number">0px</span> <span class="number">5px</span></span><br><span class="line">            <span class="selector-class">.article-meta-wrap</span></span><br><span class="line">              -webkit-line-clamp: <span class="number">2</span>;</span><br><span class="line"><span class="comment">// 双栏布局卡片自适应适配</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">min-width</span>:<span class="number">572px</span>) <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">1068px</span>)</span><br><span class="line">  .recent-posts</span><br><span class="line">    .recent-post-item</span><br><span class="line">      <span class="attribute">width</span> <span class="number">47%</span></span><br><span class="line">      margin <span class="number">0px</span> <span class="number">3%</span> <span class="number">20px</span> <span class="number">0px</span></span><br><span class="line">// 单栏布局卡片自适应适配</span><br><span class="line">@media screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">572px</span>)</span><br><span class="line">  .recent-posts</span><br><span class="line">    .recent-post-item</span><br><span class="line">      <span class="attribute">width</span> <span class="number">100%</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div></li><li><p>修改<code>[BlogRoot]\themes\butterfly\source\css\_page\homepage.styl</code>,将整文件内容替换为以下代码：</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;index_card_style&#x27;</span>) == <span class="string">&#x27;slidecard&#x27;</span></span><br><span class="line">  <span class="keyword">@import</span> <span class="string">&#x27;./_index_card_style/slidecard&#x27;</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;index_card_style&#x27;</span>) == <span class="string">&#x27;multicard&#x27;</span></span><br><span class="line">  <span class="keyword">@import</span> <span class="string">&#x27;./_index_card_style/multicard&#x27;</span></span><br></pre></td></tr></table></figure></li><li><p>然后在主题配置文件<code>[BlogRoot]\_config.butterfly.yml</code>里新增配置项，这样我们就可以通过配置项自由切换使用哪款了：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 主页卡片样式</span></span><br><span class="line"><span class="comment"># Docs: https://akilar.top/posts/d6b69c49/</span></span><br><span class="line"><span class="attr">index_card_style:</span> <span class="string">multicard</span> <span class="comment"># slidecard | multicard</span></span><br></pre></td></tr></table></figure></li><li><p>考虑到不管是样式一还是样式二都存在一个布局突变的情况。为了不至于让首页的文章出现空缺，建议将首页生成的文章数量控制为1,2,3的公倍数。修改站点配置文件<code>[BlogRoot]\_config.yml</code>。找到以下配置项进行调整，注意这是站点配置文件本就有的配置项，不是新增配置项。建议是调整为12篇。如果你的侧边栏魔改内容特别多，那么建议改成18、24、30。务必确保文章卡片栏比侧栏完全展开要长，这样展示效果最好</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Home page setting</span></span><br><span class="line"><span class="comment"># path: Root path for your blogs index page. (default = &#x27;&#x27;)</span></span><br><span class="line"><span class="comment"># per_page: Posts displayed per page. (0 = disable pagination)</span></span><br><span class="line"><span class="comment"># order_by: Posts order. (Order by date descending by default)</span></span><br><span class="line"><span class="attr">index_generator:</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">  <span class="attr">per_page:</span> <span class="number">12</span></span><br><span class="line">  <span class="attr">order_by:</span> <span class="string">-date</span></span><br></pre></td></tr></table></figure></li><li><p>本教程讨论的卡片都是考虑有封面和有描述的。所以需要保证你已经开启了相应的配置，查看主题配置文件<code>[BlogRoot]\_config.butterfly.yml</code>,找到配置项开启描述栏，建议选择2模式</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Display the article introduction on homepage</span></span><br><span class="line"><span class="comment"># 1: description</span></span><br><span class="line"><span class="comment"># 2: both (if the description exists, it will show description, or show the auto_excerpt)</span></span><br><span class="line"><span class="comment"># 3: auto_excerpt (default)</span></span><br><span class="line"><span class="comment"># false: do not show the article introduction</span></span><br><span class="line"><span class="attr">index_post_content:</span></span><br><span class="line">  <span class="attr">method:</span> <span class="number">2</span></span><br><span class="line">  <span class="attr">length:</span> <span class="number">500</span> <span class="comment"># if you set method to 2 or 3, the length need to config</span></span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="Pjax适配">Pjax适配</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>这个bug多的很，不过加了Pjax确实快很多，参考教程：</p><ol><li><a href="https://akilar.top/posts/3b78b69a/">店长：Butterfly的Pjax适配方案</a></li><li><a href="https://yisous.xyz/posts/30bce1d1/">LYX：我是怎么适配PJAX的</a></li><li><a href="https://blog.leonus.cn/2023/pjax.html">Leonus：我是这么适配pjax的</a></li><li><a href="https://blog.zhheo.com/p/3e567fa7.html">张洪：pjax无法生效解决办法，butterfly主题维护你的pjax</a></li></ol>              </div>            </details><h2 id="本站同款页脚-tzy大佬-微调">本站同款页脚(tzy大佬+微调)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考：<a href="https://tzy1997.com/articles/hexo1617/">Hexo + Butterfly 自定义页脚</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-1.webp" alt="image-1.webp"></p></div></div><ol><li><p>首先要卸载店长的<code>hexo-butterfly-footer-beautify</code>插件，因为我将页脚直接写成一个pug，个人觉得插件很多冗余的地方用不到，因此卸载了，否则会冲突：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm un hexo-butterfly-footer-beautify --save</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>或者站点配置文件<code>_config.yml</code>删除插件相关的配置项：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">-footer_beautify:</span></span><br><span class="line"><span class="deletion">-  enable:</span></span><br><span class="line"><span class="deletion">-    timer: true # 计时器开关</span></span><br><span class="line"><span class="deletion">-    bdage: true # 徽标开关</span></span><br><span class="line"><span class="deletion">-  priority: 5 #过滤器优先权</span></span><br><span class="line"><span class="deletion">-  enable_page: all # 应用页面</span></span><br><span class="line"><span class="deletion">-  exclude: #屏蔽页面</span></span><br><span class="line"><span class="deletion">-    # - /posts/</span></span><br><span class="line"><span class="deletion">-    # - /about/</span></span><br><span class="line"><span class="deletion">-  layout: # 挂载容器类型</span></span><br><span class="line"><span class="deletion">-    type: id</span></span><br><span class="line"><span class="deletion">-    name: footer-wrap</span></span><br><span class="line"><span class="deletion">-    index: 0</span></span><br><span class="line"><span class="deletion">-  runtime_js: https://npm.elemecdn.com/hexo-butterfly-footer-beautify@1.0.0/lib/runtime.js</span></span><br><span class="line"><span class="deletion">-  runtime_css: https://npm.elemecdn.com/hexo-butterfly-footer-beautify@1.0.0/lib/runtime.css</span></span><br><span class="line"><span class="deletion">-  # 徽标部分配置项</span></span><br><span class="line"><span class="deletion">-  swiperpara: 0 #若非0，则开启轮播功能，每行徽标个数</span></span><br><span class="line"><span class="deletion">-  bdageitem:</span></span><br><span class="line"><span class="deletion">-    - link: https://hexo.io/ #徽标指向网站链接</span></span><br><span class="line"><span class="deletion">-      shields: https://img.shields.io/badge/Frame-Hexo-blue?style=flat&amp;logo=hexo #徽标API</span></span><br><span class="line"><span class="deletion">-      message: 博客框架为Hexo_v6.2.0 #徽标提示语</span></span><br><span class="line"><span class="deletion">-    - link: https://butterfly.js.org/</span></span><br><span class="line"><span class="deletion">-      shields: https://img.shields.io/badge/Theme-Butterfly-6513df?style=flat&amp;logo=bitdefender</span></span><br><span class="line"><span class="deletion">-      message: 主题版本Butterfly_v4.3.1</span></span><br><span class="line"><span class="deletion">-    - link: https://vercel.com/</span></span><br><span class="line"><span class="deletion">-      shields: https://img.shields.io/badge/Hosted-Vercel-brightgreen?style=flat&amp;logo=Vercel</span></span><br><span class="line"><span class="deletion">-      message: 本站采用多线部署，主线路托管于Vercel</span></span><br><span class="line"><span class="deletion">-    - link: https://dashboard.4everland.org/</span></span><br><span class="line"><span class="deletion">-    # https://img.shields.io/badge/Hosted-4EVERLAND-3FE2C1?style=flat&amp;logo=IPFS</span></span><br><span class="line"><span class="deletion">-      shields: https://img.shields.io/badge/Hosted-4EVERLAND-22DDDD?style=flat&amp;logo=IPFS</span></span><br><span class="line"><span class="deletion">-      message: 本站采用多线部署，备用线路托管于4EVERLAND</span></span><br><span class="line"><span class="deletion">-    - link: https://github.com/</span></span><br><span class="line"><span class="deletion">-      shields: https://img.shields.io/badge/Source-Github-d021d6?style=flat&amp;logo=GitHub</span></span><br><span class="line"><span class="deletion">-      message: 本站项目由Github托管</span></span><br><span class="line"><span class="deletion">-    - link: http://creativecommons.org/licenses/by-nc-sa/4.0/</span></span><br><span class="line"><span class="deletion">-      shields: https://img.shields.io/badge/Copyright-BY--NC--SA%204.0-d42328?style=flat&amp;logo=Claris</span></span><br><span class="line"><span class="deletion">-      message: 本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可</span></span><br><span class="line"><span class="deletion">-  swiper_css: https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.css</span></span><br><span class="line"><span class="deletion">-  swiper_js: https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.js</span></span><br><span class="line"><span class="deletion">-  swiperbdage_init_js: https://npm.elemecdn.com/hexo-butterfly-footer-beautify/lib/swiperbdage_init.min.js</span></span><br></pre></td></tr></table></figure></li><li><p>将<code>[BlogRoot]/themes/butterfly/layout/includes/footer.pug</code>替换成如下代码这块东西分为几个部分，一个是以<code>#ft</code>为块的DOM，其中分为了<code>格言</code>、<code>猜你想看</code>、<code>推荐友链</code>三部分，参考图中的位置结合自己的喜好进行修改即可，图像、文字和链接均替换成你自己的（记住不要用我的链接！！！）；<code>if theme.footer.owner.enable</code>起这一块是主题指定的信息版权信息，我把主题配置项的<code>copyright</code>和<code>custom_text</code>这两项留空了，因此只会显示<code>©2022 By Fomalhaut🥝</code>；再然后就是<code>#workboard</code>这块，这块的信息由js逻辑写入与更新，可以自定义；最后是<code>p#ghbdages</code>这块，是徽标显示，大家可以到<a href="https://shields.io/">shields.io</a>按照自己的信息生成（不要用我的！！！）:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br></pre></td><td class="code"><pre><span class="line">#footer-wrap</span><br><span class="line">  #ft</span><br><span class="line">    .ft-item-1</span><br><span class="line">      .t-top</span><br><span class="line">        .t-t-l</span><br><span class="line">          p.ft-t.t-l-t 格言🧬</span><br><span class="line">          .bg-ad</span><br><span class="line">            div</span><br><span class="line">              | 再看看那个光点，它就在这里，这是家园，这是我们 —— 你所爱的每一个人，你认识的一个人，你听说过的每一个人，曾经有过的每一个人，都在它上面度过他们的一生✨</span><br><span class="line">            .btn-xz-box</span><br><span class="line">              a.btn-xz(href=&#x27;https://stellarium.org/&#x27;) 点击开启星辰之旅</span><br><span class="line">        .t-t-r</span><br><span class="line">          p.ft-t.t-l-t 猜你想看💡</span><br><span class="line">          ul.ft-links</span><br><span class="line">            li</span><br><span class="line">              a(href=&#x27;/posts/eec9786.html&#x27;) 魔改指南</span><br><span class="line">              a(href=&#x27;/box/nav/&#x27;) 网址导航</span><br><span class="line">            li</span><br><span class="line">              a(href=&#x27;/social/link/&#x27;) 我的朋友</span><br><span class="line">              a(href=&#x27;/comments/&#x27;) 留点什么</span><br><span class="line">            li</span><br><span class="line">              a(href=&#x27;/personal/about/&#x27;) 关于作者</span><br><span class="line">              a(href=&#x27;/archives/&#x27;) 文章归档</span><br><span class="line">            li</span><br><span class="line">              a(href=&#x27;/categories/&#x27;) 文章分类</span><br><span class="line">              a(href=&#x27;/tags/&#x27;) 文章标签</span><br><span class="line">            li</span><br><span class="line">              a(href=&#x27;/box/Gallery/&#x27;) 我的画廊</span><br><span class="line">              a(href=&#x27;/personal/bb/&#x27;) 我的唠叨</span><br><span class="line">            li</span><br><span class="line">              a(href=&#x27;/site/time/&#x27;) 建设进程</span><br><span class="line">              a(href=&#x27;/site/census/&#x27;) 网站统计</span><br><span class="line">    .ft-item-2</span><br><span class="line">      p.ft-t 推荐友链⌛</span><br><span class="line">      .ft-img-group</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;https://www.fomal.cc/&#x27; title=&#x27;Fomalhaut🥝&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/60e5d4e39da7c077.webp&#x27; alt=&#x27;&#x27;)</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;https://tzy1997.com/&#x27; title=&#x27;唐志远の博客&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/4ab83cdce942463b.jpg&#x27; alt=&#x27;&#x27;)</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;https://akilar.top/&#x27; title=&#x27;Akilarの糖果屋&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/6bf1ed05796db59c.jpg&#x27; alt=&#x27;&#x27;)</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;https://butterfly.js.org/&#x27; title=&#x27;Butterfly&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/64cc6a7d508026e1.png&#x27; alt=&#x27;&#x27;)</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;https://anzhiy.cn/&#x27; title=&#x27;安知鱼&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/1b33fef8f5fb7e63.jpg&#x27; alt=&#x27;&#x27;)</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;https://www.acozycotage.net/&#x27; title=&#x27;Acozycotage&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/6a6fe6ebfd19c465.jpg&#x27; alt=&#x27;&#x27;)</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;https://cdn.netdun.net/&#x27; title=&#x27;网盾星球&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/70dee3f9d1ca10f3.webp&#x27; alt=&#x27;&#x27;)</span><br><span class="line">        .img-group-item</span><br><span class="line">          a(href=&#x27;javascript:void(0)&#x27; title=&#x27;广告位招租&#x27;)</span><br><span class="line">            img(src=&#x27;https://lskypro.acozycotage.net/LightPicture/2022/12/65307a5828af6790.webp&#x27; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">  if theme.footer.owner.enable</span><br><span class="line">    - var now = new Date()</span><br><span class="line">    - var nowYear = now.getFullYear()</span><br><span class="line">    if theme.footer.owner.since &amp;&amp; theme.footer.owner.since != nowYear</span><br><span class="line">      .copyright</span><br><span class="line">        span!= `&lt;b&gt;&amp;copy;$&#123;theme.footer.owner.since&#125; - $&#123;nowYear&#125;&lt;/b&gt;`</span><br><span class="line">        span!= `&lt;b&gt;&amp;nbsp;&amp;nbsp;By $&#123;config.author&#125;&lt;/b&gt;`</span><br><span class="line">    else</span><br><span class="line">       .copyright</span><br><span class="line">         span!= `&lt;b&gt;&amp;copy;$&#123;nowYear&#125;&lt;/b&gt;`</span><br><span class="line">         span!= `&lt;b&gt;&amp;nbsp;&amp;nbsp;By $&#123;config.author&#125;&lt;/b&gt;`</span><br><span class="line">  if theme.footer.copyright</span><br><span class="line">    .framework-info</span><br><span class="line">      span= _p(&#x27;footer.framework&#x27;) + &#x27; &#x27;</span><br><span class="line">      a(href=&#x27;https://hexo.io&#x27;)= &#x27;Hexo&#x27;</span><br><span class="line">      span.footer-separator |</span><br><span class="line">      span= _p(&#x27;footer.theme&#x27;) + &#x27; &#x27;</span><br><span class="line">      a(href=&#x27;https://github.com/jerryc127/hexo-theme-butterfly&#x27;)= &#x27;Butterfly&#x27;</span><br><span class="line">  if theme.footer.custom_text</span><br><span class="line">    .footer_custom_text!=`$&#123;theme.footer.custom_text&#125;`</span><br><span class="line">    </span><br><span class="line">  #workboard</span><br><span class="line">  </span><br><span class="line">  p#ghbdages</span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://hexo.io/&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;博客框架为Hexo_v6.3.0&quot;)</span><br><span class="line">      img(src=&quot;https://sourcebucket.s3.ladydaily.com/badge/Frame-Hexo-blue.svg&quot; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://butterfly.js.org/&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;主题版本Butterfly_v4.3.1&quot;)</span><br><span class="line">      img(src=&quot;https://sourcebucket.s3.ladydaily.com/badge/Theme-Butterfly-6513df.svg&quot; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://vercel.com/&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;本站采用多线部署，主线路托管于Vercel&quot;)</span><br><span class="line">      img(src=&quot;https://sourcebucket.s3.ladydaily.com/badge/Hosted-Vercel-brightgreen.svg&quot; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://user.51.la/&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;本站数据分析得益于51la技术支持&quot;)</span><br><span class="line">      img(src=&quot;https://sourcebucket.s3.ladydaily.com/badge/Analytics-51la-3db1eb.svg&quot; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://icp.gov.moe/?keyword=20226665&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;本站已加入萌ICP豪华套餐，萌ICP备20226665号&quot;)</span><br><span class="line">      img(src=&quot;https://sourcebucket.s3.ladydaily.com/badge/萌ICP备-20226665-fe1384.svg&quot; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://bitiful.dogecast.com/buckets&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;本网站经Service Worker分流至缤纷云对象存储&quot;)</span><br><span class="line">      img(src=&quot; https://sourcebucket.s3.ladydaily.com/badge/Bucket-缤纷云-9c62da.svg&quot; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://www.netdun.net/&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;本站使用网盾星球提供CDN加速与防护&quot;)</span><br><span class="line">      img(src=&quot;https://sourcebucket.s3.ladydaily.com/badge/CDN-网盾星球-fff2cc.svg&quot; alt=&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    a.github-badge(target=&#x27;_blank&#x27; href=&quot;https://github.com/&quot; style=&#x27;margin-inline:5px&#x27; title=&quot;本网站源码由Github提供存储仓库&quot;)</span><br><span class="line">      img(src=&quot; https://sourcebucket.s3.ladydaily.com/badge/Source-Github-d021d6.svg&quot; alt=&#x27;&#x27;)</span><br></pre></td></tr></table></figure></li><li><p>将以下代码复制到自定义的<code>custom.css</code>中，其中颜色、圆角等可以根据你自己的喜好进行修改:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* tzy页脚样式 */</span></span><br><span class="line"><span class="selector-id">#ft</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="number">1200px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span> auto <span class="number">12px</span>;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">255</span> <span class="number">255</span> <span class="number">255</span> / <span class="number">80%</span>) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">text-align</span>: left;</span><br><span class="line">  <span class="attribute">flex-wrap</span>: wrap;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-item-1</span>,</span><br><span class="line"><span class="selector-class">.ft-item-2</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">2px</span> <span class="number">14px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-item-1</span> &#123;</span><br><span class="line">  <span class="attribute">flex-direction</span>: column;</span><br><span class="line">  <span class="attribute">flex</span>: <span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-item-2</span> &#123;</span><br><span class="line">  <span class="attribute">flex</span>: <span class="number">1</span>;</span><br><span class="line">  <span class="attribute">flex-direction</span>: column;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.t-top</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.t-top</span> <span class="selector-class">.t-t-l</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">flex-direction</span>: column;</span><br><span class="line">  <span class="attribute">flex</span>: <span class="number">1.4</span>;</span><br><span class="line">  <span class="attribute">margin-right</span>: <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.t-top</span> <span class="selector-class">.t-t-l</span> <span class="selector-class">.bg-ad</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">85%</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.btn-xz-box</span> &#123;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 按钮背景颜色等 */</span></span><br><span class="line"><span class="selector-class">.btn-xz</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--btn-bg);</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--btn-color);</span><br><span class="line">  <span class="attribute">text-align</span>: center;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">2.4</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">8px</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.btn-xz</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 按钮悬浮颜色 */</span></span><br><span class="line"><span class="selector-class">.btn-xz-box</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.btn-xz</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--text-bg-hover);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.t-top</span> <span class="selector-class">.t-t-r</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">flex-direction</span>: column;</span><br><span class="line">  <span class="attribute">flex</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-links</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">14px</span>;</span><br><span class="line">  <span class="attribute">list-style</span>: none;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-links</span> <span class="selector-tag">li</span> <span class="selector-tag">a</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: inline-block <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">50%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 链接悬浮颜色 */</span></span><br><span class="line"><span class="selector-class">.ft-links</span> <span class="selector-tag">li</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-item-2</span> <span class="selector-class">.ft-img-group</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-t</span> &#123;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1.1rem</span>;</span><br><span class="line">  <span class="attribute">margin-bottom</span>: <span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">1</span>;</span><br><span class="line">  <span class="attribute">font-weight</span>: <span class="number">600</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.t-l-t</span> &#123;</span><br><span class="line">  <span class="attribute">padding-left</span>: <span class="number">14px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-item-2</span> <span class="selector-class">.ft-img-group</span> <span class="selector-class">.img-group-item</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">18.4%</span>;</span><br><span class="line">  <span class="attribute">margin-right</span>: <span class="number">14px</span>;</span><br><span class="line">  <span class="attribute">margin-bottom</span>: <span class="number">6px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-item-2</span> <span class="selector-class">.ft-img-group</span> <span class="selector-class">.img-group-item</span> <span class="selector-tag">a</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.ft-item-2</span> <span class="selector-class">.ft-img-group</span> <span class="selector-class">.img-group-item</span> <span class="selector-tag">a</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">max-height</span>: <span class="number">80px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 头像悬浮颜色框 */</span></span><br><span class="line"><span class="selector-class">.ft-item-2</span> <span class="selector-class">.ft-img-group</span> <span class="selector-class">.img-group-item</span> <span class="selector-tag">a</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">2px</span> solid <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.ft-item-1</span> &#123;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.ft-item-2</span> &#123;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.t-top</span> <span class="selector-class">.t-t-l</span> <span class="selector-class">.bg-ad</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">576px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.t-top</span> &#123;</span><br><span class="line">    <span class="attribute">flex-wrap</span>: wrap;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.t-top</span> <span class="selector-class">.t-t-l</span> &#123;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.t-top</span> <span class="selector-class">.t-t-r</span> &#123;</span><br><span class="line">    <span class="attribute">margin-top</span>: <span class="number">16px</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#footer-wrap</span> <span class="selector-tag">a</span> &#123;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">30px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#footer-wrap</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">20px</span> <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 页脚心跳动画 */</span></span><br><span class="line"><span class="selector-id">#heartbeat</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: red;</span><br><span class="line">  <span class="attribute">animation</span>: iconAnimate <span class="number">1s</span> ease-in-out infinite;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@-moz-keyframes</span> iconAnimate &#123;</span><br><span class="line">  <span class="number">0%</span>,</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">10%</span>,</span><br><span class="line">  <span class="number">30%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.9</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">20%</span>,</span><br><span class="line">  <span class="number">40%</span>,</span><br><span class="line">  <span class="number">60%</span>,</span><br><span class="line">  <span class="number">80%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">50%</span>,</span><br><span class="line">  <span class="number">70%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> iconAnimate &#123;</span><br><span class="line">  <span class="number">0%</span>,</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">10%</span>,</span><br><span class="line">  <span class="number">30%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.9</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">20%</span>,</span><br><span class="line">  <span class="number">40%</span>,</span><br><span class="line">  <span class="number">60%</span>,</span><br><span class="line">  <span class="number">80%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">50%</span>,</span><br><span class="line">  <span class="number">70%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@-o-keyframes</span> iconAnimate &#123;</span><br><span class="line">  <span class="number">0%</span>,</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">10%</span>,</span><br><span class="line">  <span class="number">30%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.9</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">20%</span>,</span><br><span class="line">  <span class="number">40%</span>,</span><br><span class="line">  <span class="number">60%</span>,</span><br><span class="line">  <span class="number">80%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">50%</span>,</span><br><span class="line">  <span class="number">70%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> iconAnimate &#123;</span><br><span class="line">  <span class="number">0%</span>,</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">10%</span>,</span><br><span class="line">  <span class="number">30%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.9</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">20%</span>,</span><br><span class="line">  <span class="number">40%</span>,</span><br><span class="line">  <span class="number">60%</span>,</span><br><span class="line">  <span class="number">80%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">50%</span>,</span><br><span class="line">  <span class="number">70%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>然后计时器还要往<code>#footer-wrap</code>这块元素上面写入网站运行时间等信息，新建文件<code>[BlogRoot]\source\js\runtime.js</code>，写入如下代码。这里要修改的几块东西是：<code>网站诞生时间</code>、<code>currentTimeHtml</code>这块东西；其中<code>currentTimeHtml</code>分为了两种模式，对应两个不同的图标，自行研究一下就懂！</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> now = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createtime</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="comment">// 当前时间</span></span><br><span class="line">  now.<span class="title function_">setTime</span>(now.<span class="title function_">getTime</span>() + <span class="number">1000</span>);</span><br><span class="line">  <span class="keyword">var</span> start = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&quot;08/01/2022 00:00:00&quot;</span>); <span class="comment">// 旅行者1号开始计算的时间</span></span><br><span class="line">  <span class="keyword">var</span> dis = <span class="title class_">Math</span>.<span class="title function_">trunc</span>(<span class="number">23400000000</span> + ((now - start) / <span class="number">1000</span>) * <span class="number">17</span>); <span class="comment">// 距离=秒数*速度 记住转换毫秒</span></span><br><span class="line">  <span class="keyword">var</span> unit = (dis / <span class="number">149600000</span>).<span class="title function_">toFixed</span>(<span class="number">6</span>);  <span class="comment">// 天文单位</span></span><br><span class="line">  <span class="keyword">var</span> grt = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&quot;08/09/2022 00:00:00&quot;</span>);<span class="comment">// 网站诞生时间</span></span><br><span class="line">  <span class="keyword">var</span> days = (now - grt) / <span class="number">1e3</span> / <span class="number">60</span> / <span class="number">60</span> / <span class="number">24</span>,</span><br><span class="line">    dnum = <span class="title class_">Math</span>.<span class="title function_">floor</span>(days),</span><br><span class="line">    hours = (now - grt) / <span class="number">1e3</span> / <span class="number">60</span> / <span class="number">60</span> - <span class="number">24</span> * dnum,</span><br><span class="line">    hnum = <span class="title class_">Math</span>.<span class="title function_">floor</span>(hours);</span><br><span class="line">  <span class="number">1</span> == <span class="title class_">String</span>(hnum).<span class="property">length</span> &amp;&amp; (hnum = <span class="string">&quot;0&quot;</span> + hnum);</span><br><span class="line">  <span class="keyword">var</span> minutes = (now - grt) / <span class="number">1e3</span> / <span class="number">60</span> - <span class="number">1440</span> * dnum - <span class="number">60</span> * hnum,</span><br><span class="line">    mnum = <span class="title class_">Math</span>.<span class="title function_">floor</span>(minutes);</span><br><span class="line">  <span class="number">1</span> == <span class="title class_">String</span>(mnum).<span class="property">length</span> &amp;&amp; (mnum = <span class="string">&quot;0&quot;</span> + mnum);</span><br><span class="line">  <span class="keyword">var</span> seconds = (now - grt) / <span class="number">1e3</span> - <span class="number">86400</span> * dnum - <span class="number">3600</span> * hnum - <span class="number">60</span> * mnum,</span><br><span class="line">    snum = <span class="title class_">Math</span>.<span class="title function_">round</span>(seconds);</span><br><span class="line">  <span class="number">1</span> == <span class="title class_">String</span>(snum).<span class="property">length</span> &amp;&amp; (snum = <span class="string">&quot;0&quot;</span> + snum);</span><br><span class="line">  <span class="keyword">let</span> currentTimeHtml = <span class="string">&quot;&quot;</span>;</span><br><span class="line">  (currentTimeHtml =</span><br><span class="line">    hnum &lt; <span class="number">18</span> &amp;&amp; hnum &gt;= <span class="number">9</span></span><br><span class="line">    ? <span class="string">`&lt;img class=&#x27;boardsign&#x27; src=&#x27;https://sourcebucket.s3.ladydaily.com/badge/F小屋-科研摸鱼中.svg&#x27; title=&#x27;什么时候能够实现财富自由呀~&#x27;&gt;&lt;br&gt; &lt;div style=&quot;font-size:13px;font-weight:bold&quot;&gt;本站居然运行了 <span class="subst">$&#123;dnum&#125;</span> 天 <span class="subst">$&#123;hnum&#125;</span> 小时 <span class="subst">$&#123;mnum&#125;</span> 分 <span class="subst">$&#123;snum&#125;</span> 秒 &lt;i id=&quot;heartbeat&quot; class=&#x27;fas fa-heartbeat&#x27;&gt;&lt;/i&gt; &lt;br&gt; 旅行者 1 号当前距离地球 <span class="subst">$&#123;dis&#125;</span> 千米，约为 <span class="subst">$&#123;unit&#125;</span> 个天文单位 🚀&lt;/div&gt;`</span></span><br><span class="line">    : <span class="string">`&lt;img class=&#x27;boardsign&#x27; src=&#x27;https://sourcebucket.s3.ladydaily.com/badge/F小屋-下班休息啦.svg&#x27; title=&#x27;下班了就该开开心心地玩耍~&#x27;&gt;&lt;br&gt; &lt;div style=&quot;font-size:13px;font-weight:bold&quot;&gt;本站居然运行了 <span class="subst">$&#123;dnum&#125;</span> 天 <span class="subst">$&#123;hnum&#125;</span> 小时 <span class="subst">$&#123;mnum&#125;</span> 分 <span class="subst">$&#123;snum&#125;</span> 秒 &lt;i id=&quot;heartbeat&quot; class=&#x27;fas fa-heartbeat&#x27;&gt;&lt;/i&gt; &lt;br&gt; 旅行者 1 号当前距离地球 <span class="subst">$&#123;dis&#125;</span> 千米，约为 <span class="subst">$&#123;unit&#125;</span> 个天文单位 🚀&lt;/div&gt;`</span>),</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;workboard&quot;</span>) &amp;&amp;</span><br><span class="line">    (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;workboard&quot;</span>).<span class="property">innerHTML</span> = currentTimeHtml);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 设置重复执行函数，周期1000ms</span></span><br><span class="line"><span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="title function_">createtime</span>();</span><br><span class="line">&#125;, <span class="number">1000</span>);</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>引入该<code>runtime.js</code>文件：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script defer src=&quot;/js/runtime.js&quot;&gt;&lt;/script&gt; # 页脚计时器</span></span><br></pre></td></tr></table></figure></li><li><p>到这里你已经成功了 99.99%，最后重新编译运行即可看见效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="侧边栏友链通讯录（店长）">侧边栏友链通讯录（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/e7d99b48/">侧栏友链通讯录卡片</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image.webp" alt="image.webp" style="zoom:50%;" /></div></div><ol><li><p>新建<code>[BlogRoot]\themes\butterfly\layout\includes\widget\card_friend_link.pug</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">if theme.aside.card_friend_link.enable</span><br><span class="line">  .card-widget.card-friend-link</span><br><span class="line">    .item-headline</span><br><span class="line">      i.far.fa-address-book</span><br><span class="line">      span= _p(&#x27;aside.card_friend_link&#x27;)</span><br><span class="line">    .card-friend-link-container</span><br><span class="line">      if site.data.link</span><br><span class="line">        each i in site.data.link</span><br><span class="line">          if i.class_name</span><br><span class="line">            details.card-friend-class-name</span><br><span class="line">              summary.card-friend-class-desc(title=i.class_desc)</span><br><span class="line">                sapn!=i.class_name</span><br><span class="line">                span.online-friend-number</span><br><span class="line">                sapn!=i.link_list.length</span><br><span class="line">              each item in i.link_list</span><br><span class="line">                if !(item.offline)</span><br><span class="line">                  a.card-friend-item.online-friend-link(href=url_for(item.link)  title=item.name target=&quot;_blank&quot;)</span><br><span class="line">                    img.no-lightbox.card-friend-avatar(src=url_for(item.avatar) onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.flink) + `&#x27;` alt=item.name )</span><br><span class="line">                    .card-friend-details</span><br><span class="line">                      .card-friend-name= item.name</span><br><span class="line">                      .card-friend-descr(title=item.descr)= item.descr</span><br><span class="line">              each item in i.link_list</span><br><span class="line">                if item.offline</span><br><span class="line">                  a.card-friend-item.offline-friend-link(href=url_for(item.link)  title=item.name target=&quot;_blank&quot;)</span><br><span class="line">                    img.no-lightbox.card-friend-avatar(src=url_for(item.avatar) onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.flink) + `&#x27;` alt=item.name )</span><br><span class="line">                    .card-friend-details</span><br><span class="line">                      .card-friend-name= item.name</span><br><span class="line">                      .card-friend-descr(title=item.descr)= item.descr</span><br><span class="line">    .js-pjax</span><br><span class="line">      script.</span><br><span class="line">        var addressbook = document.getElementsByClassName(&quot;card-friend-class-name&quot;);</span><br><span class="line">        for (var i=0; i&lt;addressbook.length; i++)&#123;</span><br><span class="line">          var online = addressbook[i].getElementsByClassName(&quot;online-friend-link&quot;).length;</span><br><span class="line">          addressbook[i].getElementsByClassName(&quot;online-friend-number&quot;)[0].innerHTML = &quot;  &quot;+online+&quot;/&quot;;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure></li><li><p>新建<code>[BlogRoot]\themes\butterfly\source\css\_layout\card_friend_link.styl</code>，其中<code>var(--text-bg-hover)</code>为悬浮选项背景色，可以根据你的喜好进行设置</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;aside.card_friend_link.enable&#x27;</span>)</span><br><span class="line">  <span class="selector-pseudo">:root</span></span><br><span class="line">    <span class="attr">--card-friend-class-desc-bgcolor</span>: <span class="number">#e7e7e7</span></span><br><span class="line">    <span class="attr">--card-friend-name-color</span>: <span class="number">#000</span></span><br><span class="line">    <span class="attr">--card-friend-item-hover</span>: <span class="selector-tag">var</span>(<span class="attr">--text-bg-hover</span>)</span><br><span class="line">    <span class="attr">--card-friend-descr-color</span>: <span class="number">#797979</span></span><br><span class="line">  <span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span></span><br><span class="line">    <span class="attr">--card-friend-class-desc-bgcolor</span>: <span class="number">#111111</span></span><br><span class="line">    <span class="attr">--card-friend-name-color</span>: <span class="number">#fff</span></span><br><span class="line">    <span class="attr">--card-friend-item-hover</span>: <span class="selector-tag">var</span>(<span class="attr">--text-bg-hover</span>)</span><br><span class="line">    <span class="attr">--card-friend-descr-color</span>: <span class="number">#797979</span></span><br><span class="line">  <span class="selector-id">#aside-content</span></span><br><span class="line">    <span class="selector-class">.card-widget</span><span class="selector-class">.card-friend-link</span></span><br><span class="line">      <span class="attribute">padding</span>: <span class="number">20px</span></span><br><span class="line">  <span class="selector-class">.card-widget</span><span class="selector-class">.card-friend-link</span></span><br><span class="line">    <span class="selector-class">.card-friend-link-container</span></span><br><span class="line">      <span class="attribute">max-height</span> <span class="number">460px</span></span><br><span class="line">      <span class="attribute">overflow</span> scroll</span><br><span class="line">      &amp;::-webkit-scrollbar</span><br><span class="line">        <span class="attribute">display</span>: none</span><br><span class="line">    <span class="selector-tag">summary</span><span class="selector-class">.card-friend-class-desc</span></span><br><span class="line">      <span class="attribute">padding</span> <span class="number">0px</span> <span class="number">15px</span></span><br><span class="line">    <span class="selector-tag">details</span><span class="selector-class">.card-friend-class-name</span><span class="selector-attr">[open]</span></span><br><span class="line">      <span class="selector-tag">summary</span><span class="selector-class">.card-friend-class-desc</span></span><br><span class="line">        <span class="attribute">position</span>: sticky;</span><br><span class="line">        <span class="attribute">top</span>: <span class="number">0px</span>;</span><br><span class="line">        <span class="attribute">background</span>: <span class="built_in">var</span>(--card-friend-class-desc-bgcolor);</span><br><span class="line">        <span class="attribute">z-index</span>: <span class="number">1</span></span><br><span class="line">    <span class="selector-tag">a</span></span><br><span class="line">      &amp;<span class="selector-class">.card-friend-item</span></span><br><span class="line">        <span class="attribute">padding</span> <span class="number">0px</span> <span class="number">15px</span></span><br><span class="line">        <span class="attribute">height</span> <span class="number">60px</span></span><br><span class="line">        <span class="attribute">width</span> auto</span><br><span class="line">        <span class="attribute">display</span> flex</span><br><span class="line">        <span class="attribute">align-items</span> center</span><br><span class="line">        <span class="attribute">flex-wrap</span> nowrap</span><br><span class="line">        <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">          <span class="attribute">background-color</span> <span class="built_in">var</span>(--card-friend-item-hover)</span><br><span class="line">          <span class="attribute">border-radius</span>: <span class="number">12px</span></span><br><span class="line">          <span class="attribute">transition</span>: all <span class="number">0.3s</span> ease-in-out</span><br><span class="line"></span><br><span class="line">    <span class="selector-tag">img</span></span><br><span class="line">      &amp;<span class="selector-class">.card-friend-avatar</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">40px</span></span><br><span class="line">        <span class="attribute">height</span> <span class="number">40px</span></span><br><span class="line">        <span class="attribute">border-radius</span> <span class="number">50%</span></span><br><span class="line">        <span class="attribute">margin</span> <span class="number">10px</span> <span class="number">10px</span></span><br><span class="line">    <span class="selector-class">.offline-friend-link</span></span><br><span class="line">      <span class="selector-tag">img</span></span><br><span class="line">        &amp;<span class="selector-class">.card-friend-avatar</span></span><br><span class="line">          <span class="attribute">filter</span>: <span class="built_in">grayscale</span>(<span class="number">100%</span>)</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.card-friend-details</span></span><br><span class="line">      <span class="attribute">width</span> auto</span><br><span class="line">      <span class="attribute">height</span> <span class="number">60px</span></span><br><span class="line">      <span class="attribute">display</span> flex</span><br><span class="line">      <span class="attribute">flex-wrap</span> nowrap</span><br><span class="line">      <span class="attribute">flex-direction</span> column</span><br><span class="line">      <span class="attribute">justify-content</span> center</span><br><span class="line">      <span class="attribute">align-items</span> flex-start</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.card-friend-name</span></span><br><span class="line">      <span class="attribute">color</span> <span class="built_in">var</span>(--card-friend-name-color)</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.card-friend-descr</span></span><br><span class="line">      <span class="attribute">font-size</span> <span class="number">12px</span></span><br><span class="line">      <span class="attribute">white-space</span> nowrap</span><br><span class="line">      <span class="attribute">overflow</span> hidden</span><br><span class="line">      <span class="attribute">text-overflow</span> ellipsis</span><br><span class="line">      <span class="attribute">width</span> <span class="number">12em</span></span><br><span class="line">      <span class="attribute">color</span> <span class="built_in">var</span>(--card-friend-descr-color)</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\widget\index.pug</code>,视版本不同，此文件会有所出入，请读者参考以前的侧栏类魔改教程自行观察规律进行调整。我非常不建议你们在post页面添加友链通讯录版块。这会让你每页的dom数量爆表。我之前这么做，导致我在运行gulp时压缩html时直接内存溢出。</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">  #aside-content.aside-content</span><br><span class="line">    //- post</span><br><span class="line">    if is_post()</span><br><span class="line">      - const tocStyle = page.toc_style_simple</span><br><span class="line">      - const tocStyleVal = tocStyle <span class="comment">=== true || tocStyle === false ? tocStyle : theme.toc.style_simple</span></span><br><span class="line">      if showToc &amp;&amp; tocStyleVal</span><br><span class="line">        .sticky_layout</span><br><span class="line">          include ./card_post_toc.pug</span><br><span class="line">      else</span><br><span class="line">        !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_announcement&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_top_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        .sticky_layout</span><br><span class="line">          if showToc</span><br><span class="line">            include ./card_post_toc.pug</span><br><span class="line">          !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">          !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    else</span><br><span class="line">      //- page</span><br><span class="line">      !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_announcement&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_top_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)      </span><br><span class="line"></span><br><span class="line">      .sticky_layout</span><br><span class="line">        if showToc</span><br><span class="line">          include ./card_post_toc.pug</span><br><span class="line"><span class="addition">+       !=partial(&#x27;includes/widget/card_friend_link&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span></span><br><span class="line">        !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_newest_comment&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_categories&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_tags&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_archives&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_webinfo&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_bottom_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\themes\butterfly\languages\zh-CN.yml</code>,新增内容。非简中用户自行修改对应的language文件</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">  aside:</span><br><span class="line">    articles: 文章</span><br><span class="line">    tags: 标签</span><br><span class="line">    categories: 分类</span><br><span class="line">    card_announcement: 公告</span><br><span class="line">    card_categories: 分类</span><br><span class="line">    card_tags: 标签</span><br><span class="line">    card_archives: 归档</span><br><span class="line">    card_recent_post: 最新文章</span><br><span class="line"><span class="addition">+   card_friend_link: 通讯录</span></span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\_config.butterfly.yml</code>,新增配置项：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">  aside:</span><br><span class="line">    enable: true</span><br><span class="line">    hide: true</span><br><span class="line">    button: true</span><br><span class="line">    mobile: false # display on mobile</span><br><span class="line">    position: right # left or right</span><br><span class="line">    card_author:</span><br><span class="line">      enable: true</span><br><span class="line">      description:</span><br><span class="line">      button:</span><br><span class="line">        icon: fa fa-paper-plane faa-tada</span><br><span class="line">        text: 加入糖果屋群聊</span><br><span class="line">        link: https://jq.qq.com/?_wv=1027&amp;k=tNuEdliQ</span><br><span class="line">        enable: true</span><br><span class="line">    card_announcement:</span><br><span class="line">      enable: false</span><br><span class="line">      content:</span><br><span class="line"><span class="addition">+   card_friend_link: #友链通讯录</span></span><br><span class="line"><span class="addition">+     enable: true</span></span><br><span class="line"><span class="addition">+     sort_order: # Don&#x27;t modify the setting unless you know</span></span><br></pre></td></tr></table></figure></li><li><p>对需要显示离线状态的友链，可以在<code>[BlogRoot]\source\_data\link.yml</code>中给他添加一个离线的标签,例如：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">  name: 🧊小冰博客 #152</span><br><span class="line"><span class="addition">+ offline: true</span></span><br><span class="line">  link: https://zfe.space/</span><br><span class="line">  avatar: https://npm.elemecdn.com/akilar-friends@latest/avatar/zfe.space.jpg</span><br><span class="line">  descr: 做个有梦想的人！</span><br><span class="line">  siteshot: https://npm.elemecdn.com/akilar-friends@latest/siteshot/zfe.space.jpg</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="信息卡片头像状态">信息卡片头像状态</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>PS：看见<a href="https://anzhiy.cn/">安知鱼</a>的博客头像有个当前的状态，模仿Github的个人状态，觉得挺有意思的，但是奈何没写教程，于是就f12大法直接搬过来了！！！哈哈哈</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-4.webp" alt="image-4.webp" style="zoom: 67%;" /></div></div><ol><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\widget\card_author.pug</code></p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">if theme.aside.card_author.enable</span><br><span class="line">  .card-widget.card-info</span><br><span class="line">    .is-center</span><br><span class="line"><span class="deletion">-      .avatar-img</span></span><br><span class="line"><span class="deletion">-        img(src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.flink) + `&#x27;` alt=&quot;avatar&quot;)</span></span><br><span class="line"><span class="addition">+      div.card-info-avatar</span></span><br><span class="line"><span class="addition">+        .avatar-img</span></span><br><span class="line"><span class="addition">+          img(src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.flink) + `&#x27;` alt=&quot;avatar&quot;)</span></span><br><span class="line"><span class="addition">+        div.author-status-box</span></span><br><span class="line"><span class="addition">+          div.author-status</span></span><br><span class="line"><span class="addition">+            g-emoji.g-emoji(alias=&quot;palm_tree&quot; fallback-src=&quot;https://lskypro.acozycotage.net/LightPicture/2022/12/fe1dc0402e623096.jpg&quot;) 🐟</span></span><br><span class="line"><span class="addition">+            span 认真摸鱼中</span></span><br></pre></td></tr></table></figure><p>其实原理很简单，就是创建了一个新的容器把头像和容器都包住，再用css调节样式就行。<code>🐟</code>那里可以换成任意一个emoji，在win10下只要<code>win</code>+<code>.</code>就可以输入emoji，<code>认真摸鱼中</code>就是对这个状态的描述，建议长度和这个接近，<code>fallback-src</code>是备用链接，当有设备不支持这个emoji时候就用那个图，可以是该emoji的小截图</p></li><li><p>在<code>custom.css</code>中引入以下样式，可以自己进行微调：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.card-info-avatar</span> <span class="selector-class">.author-status-box</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">bottom</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">28px</span>);</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">28px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">28px</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#d0d7de</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">2em</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#f8f8f8f8</span>;</span><br><span class="line">  <span class="attribute">transition</span>: <span class="number">0.4s</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.card-info-avatar</span> <span class="selector-class">.author-status-box</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#222222f2</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#5c6060</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-info-avatar</span> <span class="selector-class">.author-status-box</span> <span class="selector-class">.author-status</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">align-items</span>: center;</span><br><span class="line">  <span class="attribute">justify-content</span>: center;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">28px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">5px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-info-avatar</span> <span class="selector-class">.author-status-box</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">105px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-info-avatar</span> <span class="selector-class">.author-status-box</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.author-status</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">105px</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: <span class="number">4px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-info-avatar</span> <span class="selector-class">.author-status-box</span> <span class="selector-class">.author-status</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">12px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">  <span class="attribute">text-overflow</span>: ellipsis;</span><br><span class="line">  <span class="attribute">white-space</span>: nowrap;</span><br><span class="line">  <span class="attribute">transition</span>: <span class="number">0.4s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span> <span class="selector-class">.card-info-avatar</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重启项目</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="信息卡片鼠标悬浮彩带效果">信息卡片鼠标悬浮彩带效果</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>PS：逛别人的博客看见的，觉得挺有意思，于是…嘻嘻你懂的</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2023/01/02/image64de595f8e02e649.webp" alt="image64de595f8e02e649.webp" style="zoom: 67%;" /></div></div><ol><li><p>首先我们要改造一下元素构成，修改<code>[BlogRoot]\themes\butterfly\layout\includes\widget\card_author.pug</code>，这样我们这块区域就有了独一无二的标记了：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">if theme.aside.card_author.enable</span><br><span class="line">  .card-widget.card-info</span><br><span class="line"><span class="deletion">-    .is-center</span></span><br><span class="line"><span class="addition">+    .author_top.is-center</span></span><br><span class="line">      div.card-info-avatar</span><br></pre></td></tr></table></figure></li><li><p>在自定义的<code>custom.css</code>中加入以下代码：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 信息卡片彩带 */</span></span><br><span class="line"><span class="selector-class">.author_top</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">https://tuchuang.voooe.cn/images/2023/01/02/snow.gif</span>);</span><br><span class="line">  <span class="attribute">background-size</span>: cover;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重启项目，然后将鼠标停留在截图区域就会触发彩带，鼠标离开彩带也会消失：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="信息卡片背景图">信息卡片背景图</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>PS：渐变色的个人信息背景卡片我觉得不太好看，于是就换成了这种蒙版渐变的背景，现在手把手教大家怎么换上这个自定义背景图！</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-5.webp" alt="image-5.webp" style="zoom:50%;" /></div></div><ol><li><p>在<code>custom.css</code>中加入以下样式：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 个人信息卡片背景图 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;light&quot;</span>]</span> <span class="selector-id">#aside-content</span> &gt; <span class="selector-class">.card-widget</span><span class="selector-class">.card-info</span> &#123;</span><br><span class="line">  <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">https://sourcebucket.s3.ladydaily.com/img/snowflower.webp</span>);</span><br><span class="line">  <span class="attribute">background-repeat</span>: no-repeat;</span><br><span class="line">  <span class="attribute">background-attachment</span>: inherit;</span><br><span class="line">  <span class="attribute">background-size</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#aside-content</span> &gt; <span class="selector-class">.card-widget</span><span class="selector-class">.card-info</span> &#123;</span><br><span class="line">  <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">https://sourcebucket.s3.ladydaily.com/img/aurora.webp</span>);</span><br><span class="line">  <span class="attribute">background-repeat</span>: no-repeat;</span><br><span class="line">  <span class="attribute">background-attachment</span>: inherit;</span><br><span class="line">  <span class="attribute">background-size</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里一个是白天模式，一个是夜间模式，可以根据自己的喜好选择图片，我的图片你可以下载下来，但是不能直接引用，因为开了防盗链。图片最好是下边透明，上边不透明的透明度连续渐变的形式，可以用PS制作。</p></li><li><p>制作这样的图片也不难，首先下载<code>PS</code>，以及准备好一张尺寸大概在<code>700*1000</code>的图片，用<code>PS</code>打开图片，按照以下步骤给图片添加一个渐变遮罩就可以，然后将图片另存为<code>PNG</code>格式的，然后将图片用软件压缩一下，压缩图片具体方法见<a href="https://www.fomal.cc/posts/b48804d5.html">网站性能优化的一些小技巧</a>，最后只要不是太大就可以！</p><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-6.webp" alt="image-6.webp" style="zoom:67%;" /><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-7.webp" alt="image-7.webp" style="zoom:50%;" /><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-8.webp" alt="image-8.webp" style="zoom:33%;" /></li></ol>              </div>            </details><h2 id="头像呼吸灯-会动的小车车">头像呼吸灯+会动的小车车</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>PS：博客的背景图加上呼吸灯还是挺搭配的，至于这个小车车是有次逛别人博客看见的，直接f12过来了🤣</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/31/image-9.webp" alt="image-9.webp" style="zoom:50%;" /></div></div><div class="note warning modern"><p>前置教程：已经熟悉iconfont图标引入，因为小车要替换成你自己的图标！！！</p></div><ol><li><p>先说呼吸灯，这个可以用js实现，也可以用纯css的关键帧实现，貌似css的性能会高点，在<code>custom.css</code>添加如下代码，颜色和时间啥的大家可以根据自己的喜好调节，其实就是关键帧之间通过某个插值方法连续变样式而已，会这一个你就会DIY各种高大上的动画啦</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 头像呼吸灯 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;light&quot;</span>]</span> <span class="selector-class">.avatar-img</span> &#123;</span><br><span class="line">  <span class="attribute">animation</span>: huxi_light <span class="number">4s</span> ease-in-out infinite;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.avatar-img</span> &#123;</span><br><span class="line">  <span class="attribute">animation</span>: huxi_dark <span class="number">4s</span> ease-in-out infinite;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> huxi_light &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0px</span> <span class="number">0px</span> <span class="number">1px</span> <span class="number">1px</span> <span class="number">#e9f5fa</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">50%</span> &#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0px</span> <span class="number">0px</span> <span class="number">5px</span> <span class="number">5px</span> <span class="number">#e9f5fa</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0px</span> <span class="number">0px</span> <span class="number">1px</span> <span class="number">1px</span> <span class="number">#e9f5fa</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> huxi_dark &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0px</span> <span class="number">0px</span> <span class="number">1px</span> <span class="number">1px</span> <span class="number">#39c5bb</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">50%</span> &#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0px</span> <span class="number">0px</span> <span class="number">5px</span> <span class="number">5px</span> <span class="number">#39c5bb</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0px</span> <span class="number">0px</span> <span class="number">1px</span> <span class="number">1px</span> <span class="number">#39c5bb</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>这个小车车的实现方法就是在文字后面接一个图标，然后给这个图标自定义一个动画样式，修改<code>[BlogRoot]\themes\butterfly\layout\includes\widget\card_author.pug</code>，图标自行引入。这里起作用的是<code>faa-passing</code>这个附加的类，因为装了<code>font-awesome</code>动画的话，只要带有这个类的元素的变动都会有这个动画，因此这个小车自然会动了，还有别的动画请参考：<a href="https://l-lin.github.io/font-awesome-animation/">font-awesome-animation</a>，当然你自己也可以对动画关键帧进行重写</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">    if theme.aside.card_author.button.enable</span><br><span class="line">      a#card-info-btn(href=theme.aside.card_author.button.link)</span><br><span class="line">        i(class=theme.aside.card_author.button.icon)</span><br><span class="line">        span=theme.aside.card_author.button.text</span><br><span class="line"><span class="addition">+        i.faa-passing.animated(style=&quot;padding-left:20px;display:inline-block;vertical-align:middle;&quot;)</span></span><br><span class="line"><span class="addition">+          svg.icon(style=&quot;height:28px;width:28px;fill:currentColor;position:relative;top:5px&quot;)</span></span><br><span class="line"><span class="addition">+            use(xlink:href=&#x27;#icon-xiaoqiche&#x27;)</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="控制台样式自定义（安知鱼）">控制台样式自定义（安知鱼）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://anzhiy.cn/posts/3444.html">console的高级用法</a></p><p>ASCII字符画生成器见这篇文章：<a href="https://blog.csdn.net/qq_31708763/article/details/119712041">CSDN:在线生成ascii字符画网站字符图案在线生成工具</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-1042947f3b101a6d1a.webp" alt="image-1042947f3b101a6d1a.webp" style="zoom:67%;" /></div></div><ol><li><p>新建js文件<code>[BlogRoot]\source\js\console.js</code>，并写入如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> now1 = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createtime1</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> grt = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&quot;08/09/2022 00:00:00&quot;</span>); <span class="comment">//此处修改你的建站时间或者网站上线时间</span></span><br><span class="line">    now1.<span class="title function_">setTime</span>(now1.<span class="title function_">getTime</span>() + <span class="number">250</span>);</span><br><span class="line">    <span class="keyword">var</span> days = (now1 - grt) / <span class="number">1000</span> / <span class="number">60</span> / <span class="number">60</span> / <span class="number">24</span>;</span><br><span class="line">    <span class="keyword">var</span> dnum = <span class="title class_">Math</span>.<span class="title function_">floor</span>(days);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> ascll = [</span><br><span class="line">        <span class="string">`欢迎来到Fomalhaut🥝の小家!`</span>,</span><br><span class="line">        <span class="string">`Future is now 🍭🍭🍭`</span>,</span><br><span class="line">        <span class="string">`</span></span><br><span class="line"><span class="string">        </span></span><br><span class="line"><span class="string">███████  ██████  ███    ███  █████  ██      ██   ██  █████  ██    ██ ████████ </span></span><br><span class="line"><span class="string">██      ██    ██ ████  ████ ██   ██ ██      ██   ██ ██   ██ ██    ██    ██    </span></span><br><span class="line"><span class="string">█████   ██    ██ ██ ████ ██ ███████ ██      ███████ ███████ ██    ██    ██    </span></span><br><span class="line"><span class="string">██      ██    ██ ██  ██  ██ ██   ██ ██      ██   ██ ██   ██ ██    ██    ██    </span></span><br><span class="line"><span class="string">██       ██████  ██      ██ ██   ██ ███████ ██   ██ ██   ██  ██████     ██   </span></span><br><span class="line"><span class="string">                                              </span></span><br><span class="line"><span class="string">`</span>,</span><br><span class="line">        <span class="string">&quot;小站已经苟活&quot;</span>,</span><br><span class="line">        dnum,</span><br><span class="line">        <span class="string">&quot;天啦!&quot;</span>,</span><br><span class="line">        <span class="string">&quot;©2022 By Fomalhaut&quot;</span>,</span><br><span class="line">    ];</span><br><span class="line"></span><br><span class="line">    <span class="built_in">setTimeout</span>(</span><br><span class="line">        <span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(</span><br><span class="line">            <span class="variable language_">console</span>,</span><br><span class="line">            <span class="string">`\n%c<span class="subst">$&#123;ascll[<span class="number">0</span>]&#125;</span> %c <span class="subst">$&#123;ascll[<span class="number">1</span>]&#125;</span> %c <span class="subst">$&#123;ascll[<span class="number">2</span>]&#125;</span> %c<span class="subst">$&#123;ascll[<span class="number">3</span>]&#125;</span>%c <span class="subst">$&#123;ascll[<span class="number">4</span>]&#125;</span>%c <span class="subst">$&#123;ascll[<span class="number">5</span>]&#125;</span>\n\n%c <span class="subst">$&#123;ascll[<span class="number">6</span>]&#125;</span>\n`</span>,</span><br><span class="line">            <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">            <span class="string">&quot;&quot;</span>,</span><br><span class="line">            <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">            <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">            <span class="string">&quot;&quot;</span>,</span><br><span class="line">            <span class="string">&quot;color:#39c5bb&quot;</span>,</span><br><span class="line">            <span class="string">&quot;&quot;</span></span><br><span class="line">        )</span><br><span class="line">    );</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">createtime1</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createtime2</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> ascll2 = [<span class="string">`NCC2-036`</span>, <span class="string">`调用前置摄像头拍照成功，识别为「大聪明」`</span>, <span class="string">`Photo captured: `</span>, <span class="string">` 🤪 `</span>];</span><br><span class="line"></span><br><span class="line">    <span class="built_in">setTimeout</span>(</span><br><span class="line">        <span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(</span><br><span class="line">            <span class="variable language_">console</span>,</span><br><span class="line">            <span class="string">`%c <span class="subst">$&#123;ascll2[<span class="number">0</span>]&#125;</span> %c <span class="subst">$&#123;ascll2[<span class="number">1</span>]&#125;</span> %c \n<span class="subst">$&#123;ascll2[<span class="number">2</span>]&#125;</span> %c\n<span class="subst">$&#123;ascll2[<span class="number">3</span>]&#125;</span>`</span>,</span><br><span class="line">            <span class="string">&quot;color:white; background-color:#10bcc0&quot;</span>,</span><br><span class="line">            <span class="string">&quot;&quot;</span>,</span><br><span class="line">            <span class="string">&quot;&quot;</span>,</span><br><span class="line">            <span class="string">&#x27;background:url(&quot;https://unpkg.zhimg.com/anzhiyu-assets@latest/image/common/tinggge.gif&quot;) no-repeat;font-size:450%&#x27;</span></span><br><span class="line">        )</span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    <span class="built_in">setTimeout</span>(<span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(<span class="variable language_">console</span>, <span class="string">&quot;%c WELCOME %c 欢迎光临，大聪明&quot;</span>, <span class="string">&quot;color:white; background-color:#23c682&quot;</span>, <span class="string">&quot;&quot;</span>));</span><br><span class="line"></span><br><span class="line">    <span class="built_in">setTimeout</span>(</span><br><span class="line">        <span class="variable language_">console</span>.<span class="property">warn</span>.<span class="title function_">bind</span>(</span><br><span class="line">            <span class="variable language_">console</span>,</span><br><span class="line">            <span class="string">&quot;%c ⚡ Powered by Fomalhaut🥝 %c 你正在访问Fomalhaut🥝の小家&quot;</span>,</span><br><span class="line">            <span class="string">&quot;color:white; background-color:#f0ad4e&quot;</span>,</span><br><span class="line">            <span class="string">&quot;&quot;</span></span><br><span class="line">        )</span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    <span class="built_in">setTimeout</span>(<span class="variable language_">console</span>.<span class="property">log</span>.<span class="title function_">bind</span>(<span class="variable language_">console</span>, <span class="string">&quot;%c W23-12 %c 系统监测到你已打开控制台&quot;</span>, <span class="string">&quot;color:white; background-color:#4f90d9&quot;</span>, <span class="string">&quot;&quot;</span>));</span><br><span class="line">    <span class="built_in">setTimeout</span>(</span><br><span class="line">        <span class="variable language_">console</span>.<span class="property">warn</span>.<span class="title function_">bind</span>(<span class="variable language_">console</span>, <span class="string">&quot;%c S013-782 %c 你现在正处于监控中&quot;</span>, <span class="string">&quot;color:white; background-color:#d9534f&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br><span class="line">    );</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">createtime2</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 重写console方法</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="property">log</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123; &#125;;</span><br><span class="line"><span class="variable language_">console</span>.<span class="property">error</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123; &#125;;</span><br><span class="line"><span class="variable language_">console</span>.<span class="property">warn</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123; &#125;;</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>[BlogRoot]\_config.butterfly.yml</code>中引入该js文件</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script async src=&quot;/js/console.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目并按f12，看看控制台那一栏就可以看见效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="项目启动自定义字符画">项目启动自定义字符画</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>ASCII字符画生成器见这篇文章：<a href="https://blog.csdn.net/qq_31708763/article/details/119712041">CSDN:在线生成ascii字符画网站字符图案在线生成工具</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image.png" alt="image.png" style="zoom:50%;" /></div></div><ol><li><p>替换主题源码：<code>[BlogRoot]\themes\butterfly\scripts\events\welcome.js</code>为以下代码即可：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> logger = <span class="built_in">require</span>(<span class="string">&#x27;hexo-log&#x27;</span>)()</span><br><span class="line"></span><br><span class="line">hexo.<span class="title function_">on</span>(<span class="string">&#x27;ready&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> &#123; version &#125; = <span class="built_in">require</span>(<span class="string">&#x27;../../package.json&#x27;</span>)</span><br><span class="line">  logger.<span class="title function_">info</span>(<span class="string">`</span></span><br><span class="line"><span class="string">  ======================================================================</span></span><br><span class="line"><span class="string">                                                                     </span></span><br><span class="line"><span class="string">██████  ██    ██ ████████ ████████ ███████ ██████  ███████ ██      ██    ██ </span></span><br><span class="line"><span class="string">██   ██ ██    ██    ██       ██    ██      ██   ██ ██      ██       ██  ██  </span></span><br><span class="line"><span class="string">██████  ██    ██    ██       ██    █████   ██████  █████   ██        ████   </span></span><br><span class="line"><span class="string">██   ██ ██    ██    ██       ██    ██      ██   ██ ██      ██         ██    </span></span><br><span class="line"><span class="string">██████   ██████     ██       ██    ███████ ██   ██ ██      ███████    ██    </span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                            主题版本：<span class="subst">$&#123;version&#125;</span></span></span><br><span class="line"><span class="string">  ======================================================================`</span>)</span><br><span class="line">&#125;)</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>重启项目在输出窗口里即可看见效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="文章页顶波浪线（安知鱼）">文章页顶波浪线（安知鱼）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://anzhiy.cn/posts/98c4.html">butterfly文章顶部添加波浪效果</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-11.webp" alt="image-11.webp"></p></div></div><ol><li><p>修改 <code>[BlogRoor]\themes/butterfly/layout/includes/header/index.pug</code> 大概第 33 行左右</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">if top_img !== false</span><br><span class="line">  if is_post()</span><br><span class="line">    include ./post-info.pug</span><br><span class="line"><span class="addition">+   section.main-hero-waves-area.waves-area</span></span><br><span class="line"><span class="addition">+     svg.waves-svg(xmlns=&#x27;http://www.w3.org/2000/svg&#x27;, xlink=&#x27;http://www.w3.org/1999/xlink&#x27;, viewBox=&#x27;0 24 150 28&#x27;, preserveAspectRatio=&#x27;none&#x27;, shape-rendering=&#x27;auto&#x27;)</span></span><br><span class="line"><span class="addition">+       defs</span></span><br><span class="line"><span class="addition">+         path#gentle-wave(d=&#x27;M -160 44 c 30 0 58 -18 88 -18 s 58 18 88 18 s 58 -18 88 -18 s 58 18 88 18 v 44 h -352 Z&#x27;)</span></span><br><span class="line"><span class="addition">+       g.parallax</span></span><br><span class="line"><span class="addition">+         use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;0&#x27;)</span></span><br><span class="line"><span class="addition">+         use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;3&#x27;)</span></span><br><span class="line"><span class="addition">+         use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;5&#x27;)</span></span><br><span class="line"><span class="addition">+         use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;7&#x27;)</span></span><br><span class="line">    #post-top-cover</span><br><span class="line">      img#post-top-bg(class=&#x27;nolazyload&#x27; src=bg_img)</span><br><span class="line">  else if is_home()</span><br><span class="line">    #site-info</span><br><span class="line">      h1#site-title=site_title</span><br><span class="line">      if theme.subtitle.enable</span><br></pre></td></tr></table></figure><p>为了方便复制，提供一份需要修改的部分:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">section.main-hero-waves-area.waves-area</span><br><span class="line">  svg.waves-svg(xmlns=&#x27;http://www.w3.org/2000/svg&#x27;, xlink=&#x27;http://www.w3.org/1999/xlink&#x27;, viewBox=&#x27;0 24 150 28&#x27;, preserveAspectRatio=&#x27;none&#x27;, shape-rendering=&#x27;auto&#x27;)</span><br><span class="line">    defs</span><br><span class="line">      path#gentle-wave(d=&#x27;M -160 44 c 30 0 58 -18 88 -18 s 58 18 88 18 s 58 -18 88 -18 s 58 18 88 18 v 44 h -352 Z&#x27;)</span><br><span class="line">    g.parallax</span><br><span class="line">      use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;0&#x27;)</span><br><span class="line">      use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;3&#x27;)</span><br><span class="line">      use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;5&#x27;)</span><br><span class="line">      use(href=&#x27;#gentle-wave&#x27;, x=&#x27;48&#x27;, y=&#x27;7&#x27;)</span><br></pre></td></tr></table></figure></li><li><p>然后在<code>_config.butterfly.yml</code>的 <code>[inject.head]</code> 或者自定义 css 中 引入以下 css</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 波浪css */</span></span><br><span class="line"><span class="selector-class">.main-hero-waves-area</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">bottom</span>: -<span class="number">11px</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">5</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.waves-area</span> <span class="selector-class">.waves-svg</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">5rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Animation */</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.parallax</span> &gt; use &#123;</span><br><span class="line">  <span class="attribute">animation</span>: move-forever <span class="number">25s</span> <span class="built_in">cubic-bezier</span>(<span class="number">0.55</span>, <span class="number">0.5</span>, <span class="number">0.45</span>, <span class="number">0.5</span>) infinite;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">1</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">2s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">7s</span>;</span><br><span class="line">  fill: <span class="number">#f7f9febd</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">2</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">3s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">10s</span>;</span><br><span class="line">  fill: <span class="number">#f7f9fe82</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">3</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">4s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">13s</span>;</span><br><span class="line">  fill: <span class="number">#f7f9fe36</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">4</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">5s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">20s</span>;</span><br><span class="line">  fill: <span class="number">#f7f9fe</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 黑色模式背景 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">1</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">2s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">7s</span>;</span><br><span class="line">  fill: <span class="number">#18171dc8</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">2</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">3s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">10s</span>;</span><br><span class="line">  fill: <span class="number">#18171d80</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">3</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">4s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">13s</span>;</span><br><span class="line">  fill: <span class="number">#18171d3e</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.parallax</span> &gt; use<span class="selector-pseudo">:nth-child</span>(<span class="number">4</span>) &#123;</span><br><span class="line">  <span class="attribute">animation-delay</span>: -<span class="number">5s</span>;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">20s</span>;</span><br><span class="line">  fill: <span class="number">#18171d</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> move-forever &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translate3d</span>(-<span class="number">90px</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translate3d</span>(<span class="number">85px</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*Shrinking for mobile*/</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.waves-area</span> <span class="selector-class">.waves-svg</span> &#123;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">40px</span>;</span><br><span class="line">    <span class="attribute">min-height</span>: <span class="number">40px</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>需要注意的是 css 中<code>fill属性</code>可以控制波浪颜色，最好使其中一个颜色与背景颜色一致，否则会显的有点奇怪，然后就是重启项目</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="添加fps显示-LYX">添加fps显示(LYX)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://yisous.xyz/posts/670e47f/">博客魔改日记（3）</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-13.webp" alt="image-13.webp" style="zoom:67%;" /></div></div><ol><li><p>新建文件<code>[BlogRoot]\source\js\fps.js</code>并写入如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable language_">window</span>.<span class="property">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;fpson&quot;</span>) == <span class="literal">undefined</span> || <span class="variable language_">window</span>.<span class="property">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;fpson&quot;</span>) == <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> rAF = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> (</span><br><span class="line">            <span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span> ||</span><br><span class="line">            <span class="variable language_">window</span>.<span class="property">webkitRequestAnimationFrame</span> ||</span><br><span class="line">            <span class="keyword">function</span> (<span class="params">callback</span>) &#123;</span><br><span class="line">                <span class="variable language_">window</span>.<span class="built_in">setTimeout</span>(callback, <span class="number">1000</span> / <span class="number">60</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        );</span><br><span class="line">    &#125;();</span><br><span class="line">    <span class="keyword">var</span> frame = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">var</span> allFrameCount = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">var</span> lastTime = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line">    <span class="keyword">var</span> lastFameTime = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line">    <span class="keyword">var</span> loop = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">var</span> now = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line">        <span class="keyword">var</span> fs = (now - lastFameTime);</span><br><span class="line">        <span class="keyword">var</span> fps = <span class="title class_">Math</span>.<span class="title function_">round</span>(<span class="number">1000</span> / fs);</span><br><span class="line"></span><br><span class="line">        lastFameTime = now;</span><br><span class="line">        <span class="comment">// 不置 0，在动画的开头及结尾记录此值的差值算出 FPS</span></span><br><span class="line">        allFrameCount++;</span><br><span class="line">        frame++;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (now &gt; <span class="number">1000</span> + lastTime) &#123;</span><br><span class="line">            <span class="keyword">var</span> fps = <span class="title class_">Math</span>.<span class="title function_">round</span>((frame * <span class="number">1000</span>) / (now - lastTime));</span><br><span class="line">            <span class="keyword">if</span> (fps &lt;= <span class="number">5</span>) &#123;</span><br><span class="line">                <span class="keyword">var</span> kd = <span class="string">`&lt;span style=&quot;color:#bd0000&quot;&gt;卡成ppt🤢&lt;/span&gt;`</span></span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (fps &lt;= <span class="number">15</span>) &#123;</span><br><span class="line">                <span class="keyword">var</span> kd = <span class="string">`&lt;span style=&quot;color:red&quot;&gt;电竞级帧率😖&lt;/span&gt;`</span></span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (fps &lt;= <span class="number">25</span>) &#123;</span><br><span class="line">                <span class="keyword">var</span> kd = <span class="string">`&lt;span style=&quot;color:orange&quot;&gt;有点难受😨&lt;/span&gt;`</span></span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (fps &lt; <span class="number">35</span>) &#123;</span><br><span class="line">                <span class="keyword">var</span> kd = <span class="string">`&lt;span style=&quot;color:#9338e6&quot;&gt;不太流畅🙄&lt;/span&gt;`</span></span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (fps &lt;= <span class="number">45</span>) &#123;</span><br><span class="line">                <span class="keyword">var</span> kd = <span class="string">`&lt;span style=&quot;color:#08b7e4&quot;&gt;还不错哦😁&lt;/span&gt;`</span></span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">var</span> kd = <span class="string">`&lt;span style=&quot;color:#39c5bb&quot;&gt;十分流畅🤣&lt;/span&gt;`</span></span><br><span class="line">            &#125;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;fps&quot;</span>).<span class="property">innerHTML</span> = <span class="string">`FPS:<span class="subst">$&#123;fps&#125;</span> <span class="subst">$&#123;kd&#125;</span>`</span>;</span><br><span class="line">            frame = <span class="number">0</span>;</span><br><span class="line">            lastTime = now;</span><br><span class="line">        &#125;;</span><br><span class="line"></span><br><span class="line">        <span class="title function_">rAF</span>(loop);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">loop</span>();</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;fps&quot;</span>).<span class="property">style</span> = <span class="string">&quot;display:none!important&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在自定义样式文件<code>custom.css</code>中加入如下代码，我这里让这块东西在左下角，你可以自己指定位置，其中<code>backdrop-filter</code>过滤器也可以自己指定，也可以不要：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 帧率检测 */</span></span><br><span class="line"><span class="selector-id">#fps</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: fixed;</span><br><span class="line">  <span class="comment">/* 指定位置 */</span></span><br><span class="line">  <span class="attribute">left</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">bottom</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">1919810</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;light&quot;</span>]</span> <span class="selector-id">#fps</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.85</span>);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">4px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">4px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#fps</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.72</span>);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">4px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">4px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>文件中加入以下代码：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  head: </span><br><span class="line"><span class="addition">+    - &lt;span id=&quot;fps&quot;&gt;&lt;/span&gt; # 帧率检测</span></span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script async src=&quot;/js/fps.js&quot;&gt;&lt;/script&gt; # 帧率检测</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目看看角落有没有出现帧率块</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="🍕🍕🍕写在最后">🍕🍕🍕写在最后</h2><ul><li><p>大家有啥教程想看的可以在评论区留言，如果搭建或者魔改过程中遇到不懂的可以加下面的群讨论，同时本人在B站有空也会做一些魔改系列的视频教程，点这里可以进入我的B站账号个人空间<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a></p><img src="https://s1.vika.cn/space/2022/11/04/0bd8a1a7e8f64d6a8248d1d872c5a178" alt="二维码" style="zoom:50%;" /></li></ul>]]></content>
    
    
    <summary type="html">🥕这是博客魔改教程总结的第四期</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>博客魔改教程总结(三)</title>
    <link href="https://www.fomal.cc/posts/2d7ac914.html"/>
    <id>https://www.fomal.cc/posts/2d7ac914.html</id>
    <published>2022-12-30T18:00:00.000Z</published>
    <updated>2023-01-03T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>魔改前必看（我当你们都懂了，太细节的就不写在教程中了🤣🤣🤣）</b></font></p><ol><li>博客魔改有风险，如果博客魔改出问题了又没有备份，可通过此项目查看基础源码进行<strong>回滚</strong>：<a href="https://github.com/jerryc127/hexo-theme-butterfly">jerryc127/hexo-theme-butterfly</a>、<a href="https://github.com/ccknbc-actions/blog-butterfly">ccknbc-actions/blog-butterfly</a>。</li><li>这部分魔改基本上都是大佬们造好的轮子，我按照大佬们的轮子结合自己的喜好进行魔改的，具体见我友人帐第一个栏目大佬们的网站，本处仅做一个总结，如有侵权请联系删除。</li><li>鉴于每个人的根目录名称都不一样，本帖<strong>博客根目录</strong>一律以<code>[BlogRoot]</code>指代。</li><li>本帖涉及魔改源码的内容，会使用<strong>diff代码块</strong>标识，复制时请<strong>不要忘记删除</strong>前面的<code>+、-</code>符号。</li><li>因为<code>.pug</code>和<code>.styl</code>以及<code>.yml</code>等对缩进要求较为严格，请尽量<strong>不要使用记事本等无法提供语法高亮的文本编辑器</strong>进行修改。</li><li>本帖基于<code>Butterfly主题</code>进行魔改方案编写，因此请读者优先掌握<a href="https://butterfly.js.org/">Butterfly主题官方文档</a>的内容后再来进行魔改。</li><li>魔改会过程常常引入<strong>自定义的css与js文件</strong>，方法见<a href="https://b.leonus.cn/2022/custom.html">Hexo博客添加自定义css和js文件</a>(太懒了不想自己写)</li></ol><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a> ⇦当前位置🪂</li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="右边按钮阅读进度（Leonus）">右边按钮阅读进度（Leonus）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://blog.leonus.cn/2022/percent.html">返回顶部显示网页阅读进度</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-2e9fc04ed826ebbf2.webp" alt="image-2e9fc04ed826ebbf2.webp" style="zoom:50%;" /></div></div><div class="note info modern"><p>实现原理其实很简单，我们只需要使用 <code>被顶部卷去的高度 / (页面总高度 - 可视高度)</code> ，既可算出百分比。<br>之所以减去可视高度，是因为当我们在滑到最底部的时候，可以看出 <strong>页面高度 = 被卷去的高度 + 可视高度</strong></p></div><ol><li><p>修改文件<code>[BlogRoot]\themes\butterfly\layout\includes\rightside.pug</code>，在最下面插入如下两行代码（注意去掉前面的<code>+</code>号，别傻呼呼的直接复制粘贴）</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">button#go-up(type=&quot;button&quot; title=_p(&quot;rightside.back_to_top&quot;))</span><br><span class="line">  i.fas.fa-arrow-up</span><br><span class="line"><span class="addition">+  span#percent 0</span></span><br><span class="line"><span class="addition">+    span %</span></span><br></pre></td></tr></table></figure></li><li><p>新建文件<code>[BlogRoot]\source\js\readPercent.js</code>，在自定义js文件中加入如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">onscroll</span> = percent;<span class="comment">// 执行函数</span></span><br><span class="line"><span class="comment">// 页面百分比</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">percent</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> a = <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">scrollTop</span> || <span class="variable language_">window</span>.<span class="property">pageYOffset</span>, <span class="comment">// 卷去高度</span></span><br><span class="line">        b = <span class="title class_">Math</span>.<span class="title function_">max</span>(<span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">scrollHeight</span>, <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">scrollHeight</span>, <span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">offsetHeight</span>, <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">offsetHeight</span>, <span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">clientHeight</span>, <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">clientHeight</span>) - <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">clientHeight</span>, <span class="comment">// 整个网页高度</span></span><br><span class="line">        result = <span class="title class_">Math</span>.<span class="title function_">round</span>(a / b * <span class="number">100</span>), <span class="comment">// 计算百分比</span></span><br><span class="line">        up = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;#go-up&quot;</span>) <span class="comment">// 获取按钮</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (result &lt;= <span class="number">95</span>) &#123;</span><br><span class="line">        up.<span class="property">childNodes</span>[<span class="number">0</span>].<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span></span><br><span class="line">        up.<span class="property">childNodes</span>[<span class="number">1</span>].<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;block&#x27;</span></span><br><span class="line">        up.<span class="property">childNodes</span>[<span class="number">1</span>].<span class="property">innerHTML</span> = result;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        up.<span class="property">childNodes</span>[<span class="number">1</span>].<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span></span><br><span class="line">        up.<span class="property">childNodes</span>[<span class="number">0</span>].<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;block&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>创建css文件<code>[BlogRoot]\source\css\readPercent.css</code>写入如下代码：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 返回顶部 */</span></span><br><span class="line"></span><br><span class="line"><span class="selector-tag">button</span><span class="selector-id">#go-up</span> <span class="selector-id">#percent</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">    <span class="attribute">font-weight</span>: bold;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">15px</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">button</span><span class="selector-id">#go-up</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">12px</span><span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">margin-right</span>: -<span class="number">1px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 鼠标滑动到按钮上时显示返回顶部图标 */</span></span><br><span class="line"><span class="selector-tag">button</span><span class="selector-id">#go-up</span><span class="selector-pseudo">:hover</span> <span class="selector-tag">i</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: block <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">button</span><span class="selector-id">#go-up</span><span class="selector-pseudo">:hover</span> <span class="selector-id">#percent</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>引入js文件与css文件</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  head:</span><br><span class="line"><span class="addition">+    - &lt;link rel=&quot;stylesheet&quot; href=&quot;/css/readPercent.css&quot;&gt;</span></span><br><span class="line">  bottom:</span><br><span class="line"><span class="addition">+    - &lt;script defer data-pjax src=&quot;/js/readPercent.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="评论表情包放大（Leonus）">评论表情包放大（Leonus）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://blog.leonus.cn/2022/owo-big.html">评论表情包放大功能，超实用</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-3dc79a96f4fd5a098.webp" alt="image-3dc79a96f4fd5a098.webp" style="zoom: 67%;" /></div></div><div class="note info modern"><p>其实实现的原理很简单，就是创建一个盒子，将表情包的内容放在盒子里面，然后控制盒子位置和显示隐藏即可。</p></div><ol><li><p>新建文件<code>[BlogRoot]\source\js\emoji.js</code>，写入如下内容：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 如果当前页有评论就执行函数</span></span><br><span class="line"><span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;post-comment&#x27;</span>)) <span class="title function_">owoBig</span>();</span><br><span class="line"><span class="comment">// 表情放大</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">owoBig</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> flag = <span class="number">1</span>, <span class="comment">// 设置节流阀</span></span><br><span class="line">        owo_time = <span class="string">&#x27;&#x27;</span>, <span class="comment">// 设置计时器</span></span><br><span class="line">        m = <span class="number">3</span>; <span class="comment">// 设置放大倍数</span></span><br><span class="line">    <span class="comment">// 创建盒子</span></span><br><span class="line">    <span class="keyword">let</span> div = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;div&#x27;</span>),</span><br><span class="line">        body = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;body&#x27;</span>);</span><br><span class="line">    <span class="comment">// 设置ID</span></span><br><span class="line">    div.<span class="property">id</span> = <span class="string">&#x27;owo-big&#x27;</span>;</span><br><span class="line">    <span class="comment">// 插入盒子</span></span><br><span class="line">    body.<span class="title function_">appendChild</span>(div)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 构造observer</span></span><br><span class="line">    <span class="keyword">let</span> observer = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="function"><span class="params">mutations</span> =&gt;</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; mutations.<span class="property">length</span>; i++) &#123;</span><br><span class="line">            <span class="keyword">let</span> dom = mutations[i].<span class="property">addedNodes</span>,</span><br><span class="line">                owo_body = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">            <span class="keyword">if</span> (dom.<span class="property">length</span> == <span class="number">2</span> &amp;&amp; dom[<span class="number">1</span>].<span class="property">className</span> == <span class="string">&#x27;OwO-body&#x27;</span>) owo_body = dom[<span class="number">1</span>];</span><br><span class="line">            <span class="comment">// 如果需要在评论内容中启用此功能请解除下面的注释</span></span><br><span class="line">            <span class="comment">// else if (dom.length == 1 &amp;&amp; dom[0].className == &#x27;tk-comment&#x27;) owo_body = dom[0];</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">continue</span>;</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 禁用右键（手机端长按会出现右键菜单，为了体验给禁用掉）</span></span><br><span class="line">            <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">clientWidth</span> &lt;= <span class="number">768</span>) owo_body.<span class="title function_">addEventListener</span>(<span class="string">&#x27;contextmenu&#x27;</span>, <span class="function"><span class="params">e</span> =&gt;</span> e.<span class="title function_">preventDefault</span>());</span><br><span class="line">            <span class="comment">// 鼠标移入</span></span><br><span class="line">            owo_body.<span class="property">onmouseover</span> = <span class="function">(<span class="params">e</span>) =&gt;</span> &#123;</span><br><span class="line">                    <span class="keyword">if</span> (flag &amp;&amp; e.<span class="property">target</span>.<span class="property">tagName</span> == <span class="string">&#x27;IMG&#x27;</span>) &#123;</span><br><span class="line">                        flag = <span class="number">0</span>;</span><br><span class="line">                        <span class="comment">// 移入300毫秒后显示盒子</span></span><br><span class="line">                        owo_time = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                            <span class="keyword">let</span> height = e.<span class="property">path</span>[<span class="number">0</span>].<span class="property">clientHeight</span> * m, <span class="comment">// 盒子高</span></span><br><span class="line">                                width = e.<span class="property">path</span>[<span class="number">0</span>].<span class="property">clientWidth</span> * m, <span class="comment">// 盒子宽</span></span><br><span class="line">                                left = (e.<span class="property">x</span> - e.<span class="property">offsetX</span>) - (width - e.<span class="property">path</span>[<span class="number">0</span>].<span class="property">clientWidth</span>) / <span class="number">2</span>, <span class="comment">// 盒子与屏幕左边距离</span></span><br><span class="line">                                top = e.<span class="property">y</span> - e.<span class="property">offsetY</span>; <span class="comment">// 盒子与屏幕顶部距离</span></span><br><span class="line"></span><br><span class="line">                            <span class="keyword">if</span> ((left + width) &gt; body.<span class="property">clientWidth</span>) left -= ((left + width) - body.<span class="property">clientWidth</span> + <span class="number">10</span>); <span class="comment">// 右边缘检测，防止超出屏幕</span></span><br><span class="line">                            <span class="keyword">if</span> (left &lt; <span class="number">0</span>) left = <span class="number">10</span>; <span class="comment">// 左边缘检测，防止超出屏幕</span></span><br><span class="line">                            <span class="comment">// 设置盒子样式</span></span><br><span class="line">                            div.<span class="property">style</span>.<span class="property">cssText</span> = <span class="string">`display:flex; height:<span class="subst">$&#123;height&#125;</span>px; width:<span class="subst">$&#123;width&#125;</span>px; left:<span class="subst">$&#123;left&#125;</span>px; top:<span class="subst">$&#123;top&#125;</span>px;`</span>;</span><br><span class="line">                            <span class="comment">// 在盒子中插入图片</span></span><br><span class="line">                            div.<span class="property">innerHTML</span> = <span class="string">`&lt;img src=&quot;<span class="subst">$&#123;e.target.src&#125;</span>&quot;&gt;`</span></span><br><span class="line">                        &#125;, <span class="number">300</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;;</span><br><span class="line">            <span class="comment">// 鼠标移出隐藏盒子</span></span><br><span class="line">            owo_body.<span class="property">onmouseout</span> = <span class="function">() =&gt;</span> &#123; div.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>, flag = <span class="number">1</span>, <span class="built_in">clearTimeout</span>(owo_time); &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;)</span><br><span class="line">    observer.<span class="title function_">observe</span>(<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;post-comment&#x27;</span>), &#123; <span class="attr">subtree</span>: <span class="literal">true</span>, <span class="attr">childList</span>: <span class="literal">true</span> &#125;) <span class="comment">// 监听的 元素 和 配置项</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>新建文件<code>[BlogRoot]\source\js\emoji.css</code>，写入如下内容（更推荐全部写在<code>custom.css</code>）：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#owo-big</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: fixed;</span><br><span class="line">    <span class="attribute">align-items</span>: center;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="built_in">rgb</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>);</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">1px</span> <span class="number">#aaa</span> solid;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">9999</span>;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">0</span>, -<span class="number">105%</span>);</span><br><span class="line">    <span class="attribute">overflow</span>: hidden;</span><br><span class="line">    <span class="attribute">animation</span>: owoIn <span class="number">0.3s</span> <span class="built_in">cubic-bezier</span>(<span class="number">0.42</span>, <span class="number">0</span>, <span class="number">0.3</span>, <span class="number">1.11</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=dark]</span> <span class="selector-id">#owo-big</span> &#123;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#4a4a4a</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#owo-big</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 动画效果代码由 Heo：https://blog.zhheo.com/ 提供 */</span></span><br><span class="line"><span class="keyword">@keyframes</span> owoIn &#123;</span><br><span class="line">    <span class="number">0%</span> &#123;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">0</span>, -<span class="number">95%</span>);</span><br><span class="line">        <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="number">100%</span> &#123;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">0</span>, -<span class="number">105%</span>);</span><br><span class="line">        <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>引入<code>css</code>和<code>js</code>文件，略</p></li><li><p>重启项目，略</p></li></ol>              </div>            </details><h2 id="评论输入提醒（Leonus）">评论输入提醒（Leonus）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://blog.leonus.cn/2022/inputAlert.html">给你的评论添加一个输入提醒吧</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-43dc0a27b24956ff4.webp" alt="image-43dc0a27b24956ff4.webp"></p></div></div><p>实现很简单，纯css实现，在<code>custom.css</code>内添加如下样式：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 设置文字内容 :nth-child(1)的作用是选择第几个 */</span></span><br><span class="line"><span class="selector-class">.el-input</span><span class="selector-class">.el-input--small</span><span class="selector-class">.el-input-group</span><span class="selector-class">.el-input-group--prepend</span><span class="selector-pseudo">:nth-child</span>(<span class="number">1</span>)<span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;输入QQ号会自动获取昵称和头像🐧&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.el-input</span><span class="selector-class">.el-input--small</span><span class="selector-class">.el-input-group</span><span class="selector-class">.el-input-group--prepend</span><span class="selector-pseudo">:nth-child</span>(<span class="number">2</span>)<span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;收到回复将会发送到您的邮箱📧&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.el-input</span><span class="selector-class">.el-input--small</span><span class="selector-class">.el-input-group</span><span class="selector-class">.el-input-group--prepend</span><span class="selector-pseudo">:nth-child</span>(<span class="number">3</span>)<span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;可以通过昵称访问您的网站🔗&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 当用户点击输入框时显示 */</span></span><br><span class="line"><span class="selector-class">.el-input</span><span class="selector-class">.el-input--small</span><span class="selector-class">.el-input-group</span><span class="selector-class">.el-input-group--prepend</span><span class="selector-pseudo">:focus</span>-within<span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-class">.el-input</span><span class="selector-class">.el-input--small</span><span class="selector-class">.el-input-group</span><span class="selector-class">.el-input-group--prepend</span><span class="selector-pseudo">:focus</span>-within<span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 主内容区 */</span></span><br><span class="line"><span class="selector-class">.el-input</span><span class="selector-class">.el-input--small</span><span class="selector-class">.el-input-group</span><span class="selector-class">.el-input-group--prepend</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="comment">/* 先隐藏起来 */</span></span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">    <span class="comment">/* 绝对定位 */</span></span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="comment">/* 向上移动60像素 */</span></span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">60px</span>;</span><br><span class="line">    <span class="comment">/* 文字强制不换行，防止left:50%导致的文字换行 */</span></span><br><span class="line">    <span class="attribute">white-space</span>: nowrap;</span><br><span class="line">    <span class="comment">/* 圆角 */</span></span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span><br><span class="line">    <span class="comment">/* 距离左边50% */</span></span><br><span class="line">    <span class="attribute">left</span>: <span class="number">50%</span>;</span><br><span class="line">    <span class="comment">/* 然后再向左边挪动自身的一半，即可实现居中 */</span></span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">50%</span>);</span><br><span class="line">    <span class="comment">/* 填充 */</span></span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">14px</span> <span class="number">18px</span>;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">#444</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 小角标 */</span></span><br><span class="line"><span class="selector-class">.el-input</span><span class="selector-class">.el-input--small</span><span class="selector-class">.el-input-group</span><span class="selector-class">.el-input-group--prepend</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="comment">/* 内容大小（宽高）为0且边框大小不为0的情况下，每一条边（4个边）都是一个三角形，组成一个正方形。</span></span><br><span class="line"><span class="comment">    我们先将所有边框透明，再给其中的一条边添加颜色就可以实现小三角图标 */</span></span><br><span class="line">    <span class="attribute">border</span>: <span class="number">12px</span> solid transparent;</span><br><span class="line">    <span class="attribute">border-top-color</span>: <span class="number">#444</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">50%</span>;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">50%</span>, -<span class="number">48px</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="快速添加友链">快速添加友链</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>参考教程：<a href="https://blog.4t.pw/posts/80adb334.html">怕冷爱上雪：友情链接快速添加</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2023/01/02/image3affe342fda89d2e.webp" alt="image3affe342fda89d2e.webp"></p></div></div><ol><li><p>新建文件<code>[BlogRoot]\source\js\kslink.js</code>，并写入如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> leonus = &#123;</span><br><span class="line">    <span class="attr">linkCom</span>: <span class="function"><span class="params">e</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">var</span> t = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;.el-textarea__inner&quot;</span>);</span><br><span class="line">        <span class="string">&quot;bf&quot;</span> == e ? (t.<span class="property">value</span> = <span class="string">&quot;```yml\n&quot;</span>, t.<span class="property">value</span> += <span class="string">&quot;- name: \n  link: \n  avatar: \n  descr: \n  siteshot: &quot;</span>, t.<span class="property">value</span> += <span class="string">&quot;\n```&quot;</span>, t.<span class="title function_">setSelectionRange</span>(<span class="number">15</span>, <span class="number">15</span>)) : (t.<span class="property">value</span> = <span class="string">&quot;站点名称：\n站点地址：\n头像链接：\n站点描述：\n站点截图：&quot;</span>, t.<span class="title function_">setSelectionRange</span>(<span class="number">5</span>, <span class="number">5</span>)), t.<span class="title function_">focus</span>()</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">owoBig</span>: <span class="function">() =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;post-comment&quot;</span>) || <span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">clientWidth</span> &lt; <span class="number">768</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">let</span> e = <span class="number">1</span>,</span><br><span class="line">            t = <span class="string">&quot;&quot;</span>,</span><br><span class="line">            o = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;div&quot;</span>),</span><br><span class="line">            n = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;body&quot;</span>);</span><br><span class="line">        o.<span class="property">id</span> = <span class="string">&quot;owo-big&quot;</span>, n.<span class="title function_">appendChild</span>(o), <span class="keyword">new</span> <span class="title class_">MutationObserver</span>((<span class="function"><span class="params">l</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> a = <span class="number">0</span>; a &lt; l.<span class="property">length</span>; a++) &#123;</span><br><span class="line">                <span class="keyword">let</span> i = l[a].<span class="property">addedNodes</span>,</span><br><span class="line">                    s = <span class="string">&quot;&quot;</span>;</span><br><span class="line">                <span class="keyword">if</span> (<span class="number">2</span> == i.<span class="property">length</span> &amp;&amp; <span class="string">&quot;OwO-body&quot;</span> == i[<span class="number">1</span>].<span class="property">className</span>) s = i[<span class="number">1</span>];</span><br><span class="line">                <span class="keyword">else</span> &#123;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="number">1</span> != i.<span class="property">length</span> || <span class="string">&quot;tk-comment&quot;</span> != i[<span class="number">0</span>].<span class="property">className</span>) <span class="keyword">continue</span>;</span><br><span class="line">                    s = i[<span class="number">0</span>]</span><br><span class="line">                &#125;</span><br><span class="line">                s.<span class="property">onmouseover</span> = <span class="function"><span class="params">l</span> =&gt;</span> &#123;</span><br><span class="line">                    e &amp;&amp; (<span class="string">&quot;OwO-body&quot;</span> == s.<span class="property">className</span> &amp;&amp; <span class="string">&quot;IMG&quot;</span> == l.<span class="property">target</span>.<span class="property">tagName</span> || <span class="string">&quot;tk-owo-emotion&quot;</span> == l.<span class="property">target</span>.<span class="property">className</span>) &amp;&amp; (e = <span class="number">0</span>, t = <span class="built_in">setTimeout</span>((<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                        <span class="keyword">let</span> e = <span class="number">3</span> * l.<span class="property">path</span>[<span class="number">0</span>].<span class="property">clientHeight</span>,</span><br><span class="line">                            t = <span class="number">3</span> * l.<span class="property">path</span>[<span class="number">0</span>].<span class="property">clientWidth</span>,</span><br><span class="line">                            a = l.<span class="property">x</span> - l.<span class="property">offsetX</span> - (t - l.<span class="property">path</span>[<span class="number">0</span>].<span class="property">clientWidth</span>) / <span class="number">2</span>,</span><br><span class="line">                            i = l.<span class="property">y</span> - l.<span class="property">offsetY</span>;</span><br><span class="line">                        a + t &gt; n.<span class="property">clientWidth</span> &amp;&amp; (a -= a + t - n.<span class="property">clientWidth</span> + <span class="number">10</span>), a &lt; <span class="number">0</span> &amp;&amp; (a = <span class="number">10</span>), o.<span class="property">style</span>.<span class="property">cssText</span> = <span class="string">`display:flex; height:<span class="subst">$&#123;e&#125;</span>px; width:<span class="subst">$&#123;t&#125;</span>px; left:<span class="subst">$&#123;a&#125;</span>px; top:<span class="subst">$&#123;i&#125;</span>px;`</span>, o.<span class="property">innerHTML</span> = <span class="string">`&lt;img src=&quot;<span class="subst">$&#123;l.target.src&#125;</span>&quot;&gt;`</span></span><br><span class="line">                    &#125;), <span class="number">300</span>))</span><br><span class="line">                &#125;, s.<span class="property">onmouseout</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">                    o.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;none&quot;</span>, e = <span class="number">1</span>, <span class="built_in">clearTimeout</span>(t)</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;)).<span class="title function_">observe</span>(<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;post-comment&quot;</span>), &#123;</span><br><span class="line">            <span class="attr">subtree</span>: !<span class="number">0</span>,</span><br><span class="line">            <span class="attr">childList</span>: !<span class="number">0</span></span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>新建文件<code>[BlogRoot]\source\css\kslink.css</code>，并写入如下代码，颜色可以换成你自己喜欢的：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 添加友链按钮 */</span></span><br><span class="line"><span class="comment">/* 快速填写格式 */</span></span><br><span class="line"><span class="selector-class">.addBtn</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">justify-content</span>: center;</span><br><span class="line">    <span class="attribute">flex-wrap</span>: wrap;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.addBtn</span> <span class="selector-tag">button</span> &#123;</span><br><span class="line">    <span class="attribute">transition</span>: .<span class="number">2s</span>;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">5px</span> auto;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--global-bg);</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">15px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">40px</span>;</span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">var</span>(--search-result-title);</span><br><span class="line">    <span class="attribute">align-items</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">button</span> &#123;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">outline</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">border</span>: none;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">cursor</span>: pointer;</span><br><span class="line">    touch-action: manipulation;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.fa-solid</span>, <span class="selector-class">.fas</span> &#123;</span><br><span class="line">    <span class="attribute">font-family</span>: <span class="string">&quot;Font Awesome 6 Free&quot;</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">900</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.addBtn</span> <span class="selector-tag">i</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">1.3rem</span>;</span><br><span class="line">    <span class="attribute">margin-right</span>: <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.addBtn</span> <span class="selector-tag">button</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>为了节省DOM规模，仅在你的友链页面(例如<code>[BlogRoot]\source\link\index.md</code>)对应的md文件最后，引入以上两个文件以及定义按钮元素：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;addBtn&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;leonus.linkCom()&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-solid fa-circle-plus&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span>快速申请 (默认样式)<span class="language-xml"><span class="tag">&lt;/<span class="name">button</span>&gt;</span></span> <span class="language-xml"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;leonus.linkCom(<span class="symbol">&amp;quot;</span>bf<span class="symbol">&amp;quot;</span>)&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-solid fa-circle-plus&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span>快速申请 (Butterfly)<span class="language-xml"><span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/css/kslink.css&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;/js/kslink.js&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span><br></pre></td></tr></table></figure></li><li><p>重启项目并进入友链页面底部，看看效果吧：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="Vue-Element样式弹窗">Vue+Element样式弹窗</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-5f331069caefff572.webp" alt="image-5f331069caefff572.webp" style="zoom:67%;" /></div></div><ol><li><p>在主题配置文件<code>[BlogRoot]\_config.butterfly.yml</code>中 引入<code>Vue</code>和<code>Element</code>相关依赖：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  head:</span><br><span class="line"><span class="addition">+    - &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn1.tianli0.top/npm/element-ui@2.15.6/packages/theme-chalk/lib/index.css&quot;&gt; # 引入组件库(f12)</span></span><br><span class="line">  bottom:    </span><br><span class="line"><span class="addition">+    - &lt;script async src=&quot;https://cdn1.tianli0.top/npm/vue@2.6.14/dist/vue.min.js&quot;&gt;&lt;/script&gt; # 引入VUE(f12)</span></span><br><span class="line"><span class="addition">+    - &lt;script async src=&quot;https://cdn1.tianli0.top/npm/element-ui@2.15.6/lib/index.js&quot;&gt;&lt;/script&gt; # 引入ElementUI(f12)</span></span><br></pre></td></tr></table></figure></li><li><p>在你想要弹出弹窗的js代码中加入如下代码即可触发弹窗：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">    <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">            <span class="attr">title</span>: <span class="string">&quot;你已被发现😜&quot;</span>,</span><br><span class="line">            <span class="attr">message</span>: <span class="string">&quot;小伙子，扒源记住要遵循GPL协议！&quot;</span>,</span><br><span class="line">            <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">            <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">            <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">            <span class="attr">type</span>: <span class="string">&quot;warning&quot;</span>,</span><br><span class="line">            <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><ul><li><p><code>notify</code>：弹窗类型，可以替换为<code>message</code>（信息提示）和<code>confirm</code>（二次确认提示）</p></li><li><p><code>title</code>：弹窗标题，可以改为自定义标题</p></li><li><p><code>message</code>:弹窗信息，可以改为自定义内容</p></li><li><p><code>position</code>：弹出位置，bottom、top和left、right两两组合</p></li><li><p><code>offset</code>：偏移量，简单可以理解为与边界的距离</p></li><li><p><code>showClose</code>：是否显示关闭按钮</p></li><li><p><code>type</code>：提示类型，可选success/warning/info/error等</p></li><li><p><code>duration</code>：停留时间，弹出停留至消失的时间，单位ms</p><p>详见：<a href="https://blog.csdn.net/weixin_53791978/article/details/124169067">Vue中常用的提示信息</a></p></li></ul></li></ol>              </div>            </details><h2 id="按键防抖">按键防抖</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="note info modern"><p>我们的博客按钮非常多，可能你平时并不在意，如果你为f12按钮绑定了一个弹窗，那当你长按f12可能会无限触发弹窗，这就是没有做按键防抖的后果，我们的是静态博客，所以只消耗本地的资源，如果是有后端服务的，频繁触发某个逻辑可能会消耗服务器资源，因此我们必须在前端过滤这些非法操作，不能让其跑到后端！我这里用的是最初等的计时器对象来防抖，原理就是延迟某个时间再触发逻辑(例如300ms)，如果这段时间内按键再次按下直接忽略。</p></div><ol><li><p>在任意一个js文件引入以下代码，这个js文件的引入最好在前面，否则可能不能及时生效</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 防抖全局计时器</span></span><br><span class="line"><span class="keyword">let</span> <span class="variable constant_">TT</span> = <span class="literal">null</span>;    <span class="comment">//time用来控制事件的触发</span></span><br><span class="line"><span class="comment">// 防抖函数:fn-&gt;逻辑 time-&gt;防抖时间</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">debounce</span>(<span class="params">fn, time</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable constant_">TT</span> !== <span class="literal">null</span>) <span class="built_in">clearTimeout</span>(<span class="variable constant_">TT</span>);</span><br><span class="line">    <span class="variable constant_">TT</span> = <span class="built_in">setTimeout</span>(fn, time);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>将你需要防抖的函数<code>fn()</code>用<code>debounce(fn, 300)</code>替代，防抖时间可以自定义，单位为ms，下面就是一个例子</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 复制提醒</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;copy&quot;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="title function_">debounce</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">            <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">                    <span class="attr">title</span>: <span class="string">&quot;哎嘿！复制成功🍬&quot;</span>,</span><br><span class="line">                    <span class="attr">message</span>: <span class="string">&quot;若要转载最好保留原文链接哦，给你一个大大的赞！&quot;</span>,</span><br><span class="line">                    <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">                    <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">                    <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">                    <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line">                    <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">                &#125;);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;, <span class="number">300</span>);</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件引入以上js文件，具体过程略。这样写全局都是用一个计时器，考虑到我们的博客较为简单，这样做实测是没啥问题了，再也不怕手抖了！</p></li></ol>              </div>            </details><h2 id="分享链接按钮">分享链接按钮</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-64dcd215a51cb105f.webp" alt="image-64dcd215a51cb105f.webp" style="zoom:50%;" /></div></div><div class="note info modern"><p>注意：分享按钮提醒依赖Vue弹窗和防抖计时器，请完成前面的前置教程！</p></div><ol><li><p>引入<code>ClipboardJS</code>依赖：在主题配置文件<code>[BlogRoot]\_config.butterfly.yml</code>中</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  bottom:</span><br><span class="line"><span class="addition">+    - &lt;script src=&quot;https://cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.11/clipboard.min.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>添加分享按钮，在<code>[BlogRoot]\themes\butterfly\layout\includes\rightside.pug</code>做以下修改：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="addition">+      when &#x27;share&#x27;</span></span><br><span class="line"><span class="addition">+        button.share(type=&quot;button&quot; title=&#x27;分享链接&#x27; onclick=&quot;share()&quot;)</span></span><br><span class="line"><span class="addition">+          i.fas.fa-share-nodes</span></span><br><span class="line"></span><br><span class="line">#rightside</span><br><span class="line">  - const &#123; enable, hide, show &#125; = theme.rightside_item_order</span><br><span class="line">  - const hideArray = enable ? hide &amp;&amp; hide.split(&#x27;,&#x27;) : [&#x27;readmode&#x27;,&#x27;translate&#x27;,&#x27;darkmode&#x27;]</span><br><span class="line"><span class="deletion">-  - const showArray = enable ? show &amp;&amp; show.split(&#x27;,&#x27;) : [&#x27;chat&#x27;,&#x27;comment&#x27;,&#x27;hideAside&#x27;,&#x27;toc&#x27;]</span></span><br><span class="line"><span class="addition">+  - const showArray = enable ? show &amp;&amp; show.split(&#x27;,&#x27;) : [&#x27;chat&#x27;,&#x27;share&#x27;,&#x27;comment&#x27;,&#x27;hideAside&#x27;,&#x27;toc&#x27;]</span></span><br></pre></td></tr></table></figure></li><li><p>新建文件<code>[BlogRoot]\source\js\share.js</code>，写入如下代码（再说一次，记住完成前置教程！！！）：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 分享本页</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">share_</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> url = <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">origin</span> + <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">pathname</span></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="comment">// 截取标题</span></span><br><span class="line">        <span class="keyword">var</span> title = <span class="variable language_">document</span>.<span class="property">title</span>;</span><br><span class="line">        <span class="keyword">var</span> subTitle = title.<span class="title function_">endsWith</span>(<span class="string">&quot;| Fomalhaut🥝&quot;</span>) ? title.<span class="title function_">substring</span>(<span class="number">0</span>, title.<span class="property">length</span> - <span class="number">14</span>) : title;</span><br><span class="line">        navigator.<span class="property">clipboard</span>.<span class="title function_">writeText</span>(<span class="string">&#x27;Fomalhaut🥝的站内分享\n标题：&#x27;</span> + subTitle + <span class="string">&#x27;\n链接：&#x27;</span> + url + <span class="string">&#x27;\n欢迎来访！🍭🍭🍭&#x27;</span>);</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">Vue</span>(&#123;</span><br><span class="line">            <span class="attr">data</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="variable language_">this</span>.$notify(&#123;</span><br><span class="line">                    <span class="attr">title</span>: <span class="string">&quot;成功复制分享信息🎉&quot;</span>,</span><br><span class="line">                    <span class="attr">message</span>: <span class="string">&quot;您现在可以通过粘贴直接跟小伙伴分享了！&quot;</span>,</span><br><span class="line">                    <span class="attr">position</span>: <span class="string">&#x27;top-left&#x27;</span>,</span><br><span class="line">                    <span class="attr">offset</span>: <span class="number">50</span>,</span><br><span class="line">                    <span class="attr">showClose</span>: <span class="literal">true</span>,</span><br><span class="line">                    <span class="attr">type</span>: <span class="string">&quot;success&quot;</span>, </span><br><span class="line">                    <span class="attr">duration</span>: <span class="number">5000</span></span><br><span class="line">                &#125;);</span><br><span class="line">                <span class="comment">// return &#123; visible: false &#125;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;复制失败！&#x27;</span>, err);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// new ClipboardJS(&quot;.share&quot;, &#123; text: function () &#123; return &#x27;标题：&#x27; + document.title + &#x27;\n链接：&#x27; + url &#125; &#125;);</span></span><br><span class="line">    <span class="comment">// btf.snackbarShow(&quot;本页链接已复制到剪切板，快去分享吧~&quot;)</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 防抖</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">share</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="title function_">debounce</span>(share_, <span class="number">300</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里我的页面名字截取了后面的重复段，你要截取的话就将<code>| Fomalhaut🥝</code>换成<code>| 你的网站名字</code>，或者保留也行，就是直接复制！</p></li><li><p>在主题配置文件<code>[BlogRoot]\_config.butterfly.yml</code>中引入该js文件</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">inject:</span><br><span class="line">  bottom:</span><br><span class="line"><span class="addition">+    - &lt;script src=&quot;/js/share.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>清理并重启项目即可看到变更</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="直达底部按钮">直达底部按钮</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>在<code>[BlogRoot]\themes\butterfly\layout\includes\rightside.pug</code>做以下修改:</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">button#go-up(type=&quot;button&quot; title=_p(&quot;rightside.back_to_top&quot;))</span><br><span class="line">  i.fas.fa-arrow-up</span><br><span class="line"></span><br><span class="line"><span class="addition">+button#go-down(type=&quot;button&quot; title=&quot;直达底部&quot; onclick=&quot;btf.scrollToDest(document.body.scrollHeight, 500)&quot;)</span></span><br><span class="line"><span class="addition">+  i.fas.fa-arrow-down</span></span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="文章统计-Eurkon">文章统计(Eurkon)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>懒得搬过来了，详见：<a href="https://blog.eurkon.com/post/1213ef82.html">Hexo 博客文章统计图</a></p>              </div>            </details><h2 id="侧边栏微博热搜（Eurkon）">侧边栏微博热搜（Eurkon）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>懒得搬过来了，详见：<a href="https://blog.eurkon.com/post/38b005e1.html">Butterfly 微博热搜侧边栏</a></p>              </div>            </details><h2 id="博客实时访问统计图（Eurkon）">博客实时访问统计图（Eurkon）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>懒得搬过来了，详见：<a href="https://blog.eurkon.com/post/61763977.html">Hexo 博客实时访问统计图</a></p>              </div>            </details><h2 id="兔年灯笼（tzy大佬-微调）">兔年灯笼（tzy大佬+微调）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://tzy1997.com/articles/Ha5487ng/">Hexo-悬挂灯笼</a></p><p>本教程基于唐大佬的灯笼，改成了兔年的，并且把开关写进了配置文件；本来想判断春节日期然后自动决定是否加载，但是考虑到每一年灯笼都不一样，也减少不了工作量，干脆把开关放到配置文件吧！</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><div class="tabs" id="灯笼"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#灯笼-1">PC</button></li><li class="tab"><button type="button" data-href="#灯笼-2">Mobile</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="灯笼-1"><img src="https://tuchuang.voooe.cn/images/2023/01/01/image.png" alt="image.png" style="zoom: 33%;" /><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="灯笼-2"><img src="https://tuchuang.voooe.cn/images/2023/01/01/image604c219bfc6f3360.webp" alt="image604c219bfc6f3360.webp" style="zoom: 50%;" /><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div></div></div><ol><li><p>新建CSS样式：在<code>[BlogRoot]\themes\butterfly\source\css</code>文件下新建 CSS 文件，并命名为 lantern.css，将以下代码复制到新建的lantern.css中：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 灯笼 Start */</span></span><br><span class="line"></span><br><span class="line">* &#123;</span><br><span class="line">    <span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 移动端显示/隐藏 /none/block，可自定义显示一个 */</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">970px</span>) &#123;</span><br><span class="line">    <span class="selector-class">.d-box1</span> &#123;</span><br><span class="line">        <span class="attribute">display</span>: none;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="selector-class">.dengl</span> <span class="selector-class">.d-box</span> &#123;</span><br><span class="line">        <span class="attribute">right</span>: <span class="number">0px</span>;</span><br><span class="line">        <span class="attribute">top</span>: -<span class="number">40px</span>;</span><br><span class="line">        <span class="comment">/* 自定义灯笼大小 */</span></span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.4</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.dengl</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: fixed;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">9</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* .d-box,.d-box1&#123;</span></span><br><span class="line"><span class="comment">    z-index: 9;</span></span><br><span class="line"><span class="comment">  &#125; */</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d-box</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: fixed;</span><br><span class="line">    <span class="comment">/* 自定义灯笼的位置 */</span></span><br><span class="line">    <span class="attribute">right</span>: <span class="number">85px</span>;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="comment">/* 自定义灯笼大小 */</span></span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.8</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d-box1</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: fixed;</span><br><span class="line">    <span class="comment">/* 自定义灯笼的位置 */</span></span><br><span class="line">    <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="comment">/* 自定义灯笼大小 */</span></span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.8</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 修改灯笼的字体 */</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d-box</span> <span class="selector-class">.d1</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;兔年大吉&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d1</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;心想事成&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d1</span>,</span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d2</span>,</span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d1</span><span class="selector-pseudo">::after</span>,</span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d1</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d2</span><span class="selector-pseudo">::after</span>,</span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d2</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d2</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span> <span class="selector-tag">span</span>,</span><br><span class="line"><span class="selector-class">.d-box1</span> <span class="selector-class">.d1</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#f01f1a</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">    <span class="comment">/* 自定义灯笼的阴影 */</span></span><br><span class="line">    <span class="comment">/* box-shadow: 0 5px 61px rgba(255, 240, 29, 0.88); */</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span>,</span><br><span class="line"><span class="selector-class">.d2</span>,</span><br><span class="line"><span class="selector-class">.d1</span><span class="selector-pseudo">::after</span>,</span><br><span class="line"><span class="selector-class">.d1</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-class">.d2</span><span class="selector-pseudo">::after</span>,</span><br><span class="line"><span class="selector-class">.d2</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span> <span class="selector-tag">span</span>,</span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#f01f1a</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">    <span class="comment">/* 自定义灯笼的阴影 */</span></span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">5px</span> <span class="number">61px</span> <span class="number">#ff1d1d</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span><span class="selector-pseudo">::after</span>,</span><br><span class="line"><span class="selector-class">.d1</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">82px</span>;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">17px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span>,</span><br><span class="line"><span class="selector-class">.d2</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">animation</span>: swing <span class="number">4s</span> linear infinite;</span><br><span class="line">    <span class="attribute">transform-origin</span>: top center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">160px</span>;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">100px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">90px</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">80px</span>/<span class="number">49px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">7px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">123px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">62px</span>/<span class="number">52px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">90px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#ffe31d</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">600</span>;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">35px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">69px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">41px</span>/<span class="number">49px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">84px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">49px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">50px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">16px</span>;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">2</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#ffe31d</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">span</span><span class="selector-pseudo">:nth-child</span>(<span class="number">2</span>) &#123;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">17px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">10px</span> <span class="number">10px</span> <span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">p</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">31px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">25px</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">    <span class="attribute">border-bottom</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">ul</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">80px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">54px</span>;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">li</span> &#123;</span><br><span class="line">    <span class="attribute">flex</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">list-style</span>: none;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">24px</span>;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0px</span> <span class="number">2.5px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">border-right</span>: <span class="number">3.5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-pseudo">:nth-child</span>(<span class="number">3</span>) &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">50px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-pseudo">:nth-child</span>(<span class="number">3</span>)<span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">47px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">54px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">5px</span> <span class="number">5px</span> <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#ffe31d</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d1</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">55px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">19px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">14px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span><span class="selector-pseudo">::after</span>,</span><br><span class="line"><span class="selector-class">.d2</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">128px</span>;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">3px</span>;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">199px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">128px</span>;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">61px</span>;</span><br><span class="line">    <span class="attribute">right</span>: -<span class="number">122px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">98px</span>/<span class="number">70px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">8px</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">18px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">143px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">69px</span>/<span class="number">67px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 自定义背景图片 */</span></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">8px</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">51px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">75px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">57px</span>/<span class="number">89px</span>;</span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">https://tuchuang.voooe.cn/images/2023/01/01/e6f0b2a0d44bbfb2de864b7d25cfe0ff.webp</span>) no-repeat;</span><br><span class="line">    <span class="attribute">background-position</span>: center;</span><br><span class="line">    <span class="attribute">background-size</span>: <span class="number">105px</span> auto;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">123px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">68px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">55px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">14px</span>;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">2</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#ffe31d</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">span</span><span class="selector-pseudo">:nth-child</span>(<span class="number">2</span>) &#123;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">16px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">10px</span> <span class="number">10px</span> <span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">p</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">32px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">19px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">25px</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">    <span class="attribute">border-bottom</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">ul</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">121px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">32px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">53px</span>;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">li</span> &#123;</span><br><span class="line">    <span class="attribute">flex</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">list-style</span>: none;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">24px</span>;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0px</span> <span class="number">3px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">7px</span>;</span><br><span class="line">    <span class="attribute">border-right</span>: <span class="number">3px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-pseudo">:nth-child</span>(<span class="number">3</span>) &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">60px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-pseudo">:nth-child</span>(<span class="number">3</span>)<span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">59px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">53px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">9px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">6px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">5px</span> <span class="number">5px</span> <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#ffe31d</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">5px</span> solid <span class="number">#5c1713</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.d2</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">21px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">54px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">18px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">17px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> swing &#123;</span><br><span class="line">    <span class="number">0%</span> &#123;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="number">25%</span> &#123;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">13deg</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="number">50%</span> &#123;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="number">75%</span> &#123;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">13deg</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="number">100%</span> &#123;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 灯笼 END */</span></span><br></pre></td></tr></table></figure></li><li><p>在<code>[BlogRoot]\themes\butterfly\source\css\index.styl</code>文件最后加入如下代码：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">// search</span><br><span class="line">if hexo-config(&#x27;algolia_search.enable&#x27;)</span><br><span class="line">  @import &#x27;_search/index&#x27;</span><br><span class="line">  @import &#x27;_search/algolia&#x27;</span><br><span class="line"></span><br><span class="line">if hexo-config(&#x27;local_search&#x27;) &amp;&amp; hexo-config(&#x27;local_search.enable&#x27;)</span><br><span class="line">  @import &#x27;_search/index&#x27;</span><br><span class="line">  @import &#x27;_search/local-search&#x27;</span><br><span class="line"></span><br><span class="line"><span class="addition">+// 灯笼</span></span><br><span class="line"><span class="addition">+if hexo-config(&#x27;lantern&#x27;) &amp;&amp; hexo-config(&#x27;lantern.enable&#x27;)</span></span><br><span class="line"><span class="addition">+  @import &#x27;./lantern.css&#x27;</span></span><br></pre></td></tr></table></figure></li><li><p>新建PUG：在<code>[BlogRoot]\themes\butterfly\layout\includes</code>文件夹下新建<code>lantern.pug</code>，文件内容如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">.dengl</span><br><span class="line">  .d-box</span><br><span class="line">    .d1</span><br><span class="line">      span</span><br><span class="line">      span</span><br><span class="line">        p</span><br><span class="line">      ul</span><br><span class="line">        li</span><br><span class="line">        li  </span><br><span class="line">        li</span><br><span class="line">          span</span><br><span class="line">        li  </span><br><span class="line">        li  </span><br><span class="line">    .d2</span><br><span class="line">      span</span><br><span class="line">      span</span><br><span class="line">        p</span><br><span class="line">      ul</span><br><span class="line">        li</span><br><span class="line">        li  </span><br><span class="line">        li</span><br><span class="line">          span</span><br><span class="line">        li  </span><br><span class="line">        li  </span><br><span class="line">  .d-box1</span><br><span class="line">    .d1</span><br><span class="line">      span</span><br><span class="line">      span</span><br><span class="line">        p</span><br><span class="line">      ul</span><br><span class="line">        li</span><br><span class="line">        li  </span><br><span class="line">        li</span><br><span class="line">          span</span><br><span class="line">        li  </span><br><span class="line">        li  </span><br><span class="line">    .d2</span><br><span class="line">      span</span><br><span class="line">      span</span><br><span class="line">        p</span><br><span class="line">      ul</span><br><span class="line">        li</span><br><span class="line">        li  </span><br><span class="line">        li</span><br><span class="line">          span</span><br><span class="line">        li  </span><br><span class="line">        li   </span><br></pre></td></tr></table></figure></li><li><p>在<code>[BlogRoot]\themes\butterfly\layout\includes\layout.pug</code>中引入<code>lantern.pug</code>，加在<code>head</code>的后面即可，缩进层级为直接删掉加号即可：</p><p>具体位置请参考下图：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">  head</span><br><span class="line">    include ./head.pug</span><br><span class="line"><span class="addition">+    //- 灯笼</span></span><br><span class="line"><span class="addition">+    if(theme.lantern.enable)</span></span><br><span class="line"><span class="addition">+      include ./lantern.pug</span></span><br><span class="line">  body</span><br><span class="line">    //- if theme.preloader</span><br><span class="line">    if theme.preloader.enable</span><br><span class="line">      !=partial(&#x27;includes/loading/loading&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br></pre></td></tr></table></figure></li><li><p>最后在主题配置文件<code>_config.butterfly.yml</code>加入如下配置项，灯笼开关是在这里决定的：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 灯笼开关 建议只在过年期间开启</span></span><br><span class="line"><span class="attr">lantern:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure></li><li><p>重新编译文件再运行，即可看到效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="禁用f12（tzy大佬）">禁用f12（tzy大佬）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://tzy1997.com/articles/hexo1606/#%E7%A6%81%E6%AD%A2%E5%8F%B3%E9%94%AE%E5%8F%8AF12%E7%AD%89%E4%BA%8B%E4%BB%B6">禁止右键及F12等事件</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://bu.dusays.com/2021/12/07/e9a2228cf4291.jpg" alt=""></p></div></div><ol><li><p>修改<code>[BlogRoot]/node_modules/hexo-theme-butterfly/layout/includes/layout.pug</code>，根据图中位置添加以下 pug 代码（跟 <code>head</code>、<code>body</code>同级）</p><p><img src="https://bu.dusays.com/2022/11/10/636d109016294.jpg" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">script.</span><br><span class="line">  ((function() &#123;var callbacks = [],timeLimit = 50,open = false;setInterval(loop, 1);return &#123;addListener: function(fn) &#123;callbacks.push(fn);&#125;,cancleListenr: function(fn) &#123;callbacks = callbacks.filter(function(v) &#123;return v !== fn;&#125;);&#125;&#125;</span><br><span class="line">  function loop() &#123;var startTime = new Date();debugger;if (new Date() - startTime &gt; timeLimit) &#123;if (!open) &#123;callbacks.forEach(function(fn) &#123;fn.call(null);&#125;);&#125;open = true;window.stop();alert(&#x27;你真坏，请关闭控制台！&#x27;);document.body.innerHTML = &quot;&quot;;&#125; else &#123;open = false;&#125;&#125;&#125;)()).addListener(function() &#123;window.location.reload();&#125;);</span><br><span class="line">script.</span><br><span class="line">  function toDevtools()&#123;</span><br><span class="line">    let num = 0; </span><br><span class="line">    let devtools = new Date();</span><br><span class="line">    devtools.toString = function() &#123;</span><br><span class="line">      num++;</span><br><span class="line">      if (num &gt; 1) &#123;</span><br><span class="line">          alert(&#x27;你真坏，请关闭控制台！&#x27;)</span><br><span class="line">          window.location.href = &quot;about:blank&quot;</span><br><span class="line">          blast();</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    console.log(&#x27;&#x27;, devtools);</span><br><span class="line">  &#125;</span><br><span class="line">  toDevtools();</span><br></pre></td></tr></table></figure></li><li><p>将以下代码复制到自定义的<code>f12.js</code>，随后在主题配置文件的<code>inject</code>-&gt;<code>bottom</code>中引入该js文件</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="property">onkeydown</span> = <span class="keyword">function</span> (<span class="params">e</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="number">123</span> == e.<span class="property">keyCode</span> || (e.<span class="property">ctrlKey</span> &amp;&amp; e.<span class="property">shiftKey</span> &amp;&amp; (<span class="number">74</span> === e.<span class="property">keyCode</span> || <span class="number">73</span> === e.<span class="property">keyCode</span> || <span class="number">67</span> === e.<span class="property">keyCode</span>)) || (e.<span class="property">ctrlKey</span> &amp;&amp; <span class="number">85</span> === e.<span class="property">keyCode</span>)) <span class="keyword">return</span> btf.<span class="title function_">snackbarShow</span>(<span class="string">&quot;你真坏，不能打开控制台喔!&quot;</span>), event.<span class="property">keyCode</span> = <span class="number">0</span>, event.<span class="property">returnValue</span> = !<span class="number">1</span>, !<span class="number">1</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>重新编译运行，即可看到效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li><li><p>注意: 如果自己调试阶段，可注释第一步和第二步中的代码，再进行编译，就可以打开控制台了。部署时放开注释，编译好再丢上去就OK了</p></li></ol>              </div>            </details><h2 id="节日弹窗与公祭日变灰">节日弹窗与公祭日变灰</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-71353b76d09784133.webp" alt="image-71353b76d09784133.webp"></p></div></div><div class="note info modern"><p>本质就是用的<code>sessionStorage</code>这个本地存储对象去确定是不是同一个会话，如果是同一个的话，就弹窗一次，如果下次进来了就不是同一个会话了，又会弹窗一次</p></div><ol><li><p>新建<code>[BlogRoot]\source\js\day.js</code>，并写入以下代码，这里公祭日灰度我设置的为<code>60%</code>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> d = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">m = d.<span class="title function_">getMonth</span>() + <span class="number">1</span>;</span><br><span class="line">dd = d.<span class="title function_">getDate</span>();</span><br><span class="line">y = d.<span class="title function_">getFullYear</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 公祭日</span></span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">9</span> &amp;&amp; dd == <span class="number">18</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&quot;html&quot;</span>)[<span class="number">0</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;filter: grayscale(60%);&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;今天是九一八事变&quot;</span> + (y - <span class="number">1931</span>).<span class="title function_">toString</span>() + <span class="string">&quot;周年纪念日\n🪔勿忘国耻，振兴中华🪔&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">7</span> &amp;&amp; dd == <span class="number">7</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&quot;html&quot;</span>)[<span class="number">0</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;filter: grayscale(60%);&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;今天是卢沟桥事变&quot;</span> + (y - <span class="number">1937</span>).<span class="title function_">toString</span>() + <span class="string">&quot;周年纪念日\n🪔勿忘国耻，振兴中华🪔&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">12</span> &amp;&amp; dd == <span class="number">13</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&quot;html&quot;</span>)[<span class="number">0</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;filter: grayscale(60%);&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;今天是南京大屠杀&quot;</span> + (y - <span class="number">1937</span>).<span class="title function_">toString</span>() + <span class="string">&quot;周年纪念日\n🪔勿忘国耻，振兴中华🪔&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">8</span> &amp;&amp; dd == <span class="number">14</span>) &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&quot;html&quot;</span>)[<span class="number">0</span>].<span class="title function_">setAttribute</span>(<span class="string">&quot;style&quot;</span>, <span class="string">&quot;filter: grayscale(60%);&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;今天是世界慰安妇纪念日\n🪔勿忘国耻，振兴中华🪔&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 节假日</span></span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">10</span> &amp;&amp; dd &lt;= <span class="number">3</span>) &#123;<span class="comment">//国庆节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;祝祖国&quot;</span> + (y - <span class="number">1949</span>).<span class="title function_">toString</span>() + <span class="string">&quot;岁生日快乐！&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">8</span> &amp;&amp; dd == <span class="number">15</span>) &#123;<span class="comment">//搞来玩的，小日子投降</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;小日子已经投降&quot;</span> + (y - <span class="number">1945</span>).<span class="title function_">toString</span>() + <span class="string">&quot;年了😃&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">1</span> &amp;&amp; dd == <span class="number">1</span>) &#123;<span class="comment">//元旦节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(y.<span class="title function_">toString</span>() + <span class="string">&quot;年元旦快乐！🎉&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">3</span> &amp;&amp; dd == <span class="number">8</span>) &#123;<span class="comment">//妇女节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;各位女神们，妇女节快乐！👩&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">l = [<span class="string">&quot;非常抱歉，因为不可控原因，博客将于明天停止运营！&quot;</span>, <span class="string">&quot;好消息，日本没了！&quot;</span>, <span class="string">&quot;美国垮了，原因竟然是川普！&quot;</span>, <span class="string">&quot;微软垮了！&quot;</span>, <span class="string">&quot;你的电脑已经过载，建议立即关机！&quot;</span>, <span class="string">&quot;你知道吗？站长很喜欢你哦！&quot;</span>, <span class="string">&quot;一分钟有61秒哦&quot;</span>, <span class="string">&quot;你喜欢的人跟别人跑了！&quot;</span>]</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">4</span> &amp;&amp; dd == <span class="number">1</span>) &#123;<span class="comment">//愚人节，随机谎话</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(l[<span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * l.<span class="property">length</span>)]);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">5</span> &amp;&amp; dd == <span class="number">1</span>) &#123;<span class="comment">//劳动节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;劳动节快乐\n为各行各业辛勤工作的人们致敬！&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">5</span> &amp;&amp; dd == <span class="number">4</span>) &#123;<span class="comment">//青年节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;青年节快乐\n青春不是回忆逝去,而是把握现在！&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">5</span> &amp;&amp; dd == <span class="number">20</span>) &#123;<span class="comment">//520</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;今年是520情人节\n快和你喜欢的人一起过吧！💑&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">7</span> &amp;&amp; dd == <span class="number">1</span>) &#123;<span class="comment">//建党节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;祝中国共产党&quot;</span> + (y - <span class="number">1921</span>).<span class="title function_">toString</span>() + <span class="string">&quot;岁生日快乐！&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">9</span> &amp;&amp; dd == <span class="number">10</span>) &#123;<span class="comment">//教师节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;各位老师们教师节快乐！👩‍🏫&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (m == <span class="number">12</span> &amp;&amp; dd == <span class="number">25</span>) &#123;<span class="comment">//圣诞节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;圣诞节快乐！🎄&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//传统节日部分</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((y == <span class="number">2023</span> &amp;&amp; m == <span class="number">4</span> &amp;&amp; dd == <span class="number">5</span>) || (y == <span class="number">2024</span> &amp;&amp; m == <span class="number">4</span> &amp;&amp; dd == <span class="number">4</span>) || (y == <span class="number">2025</span> &amp;&amp; m == <span class="number">4</span> &amp;&amp; dd == <span class="number">4</span>)) &#123;<span class="comment">//清明节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;清明时节雨纷纷,一束鲜花祭故人💐&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> ((y == <span class="number">2023</span> &amp;&amp; m == <span class="number">12</span> &amp;&amp; dd == <span class="number">22</span>) || (y == <span class="number">2024</span> &amp;&amp; m == <span class="number">12</span> &amp;&amp; dd == <span class="number">21</span>) || (y == <span class="number">2025</span> &amp;&amp; m == <span class="number">12</span> &amp;&amp; dd == <span class="number">21</span>)) &#123;<span class="comment">//冬至</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;冬至快乐\n快吃上一碗热热的汤圆和饺子吧🧆&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> lunar = calendarFormatter.<span class="title function_">solar2lunar</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">//农历采用汉字计算，防止出现闰月导致问题</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;正月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初六&quot;</span>) || (lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;正月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初五&quot;</span>) || (lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;正月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初四&quot;</span>) || (lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;正月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初三&quot;</span>) || (lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;正月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初二&quot;</span>) || (lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;正月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初一&quot;</span>) || (lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;腊月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;三十&quot;</span>) || (lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;腊月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;廿九&quot;</span>)) &#123;</span><br><span class="line">    <span class="comment">//春节，本来只有大年三十到初六，但是有时候除夕是大年二十九，所以也加上了</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(y.<span class="title function_">toString</span>() + <span class="string">&quot;年新年快乐\n🎊祝你心想事成，诸事顺利🎊&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> ((lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;正月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;十五&quot;</span>)) &#123;</span><br><span class="line">    <span class="comment">//元宵节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;元宵节快乐\n送你一个大大的灯笼🧅&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> ((lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;五月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初五&quot;</span>)) &#123;</span><br><span class="line">    <span class="comment">//端午节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;端午节快乐\n请你吃一条粽子🍙&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> ((lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;七月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初七&quot;</span>)) &#123;</span><br><span class="line">    <span class="comment">//七夕节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;七夕节快乐\n黄昏后,柳梢头,牛郎织女来碰头&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> ((lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;八月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;十五&quot;</span>)) &#123;</span><br><span class="line">    <span class="comment">//中秋节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;中秋节快乐\n请你吃一块月饼🍪&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> ((lunar[<span class="string">&quot;IMonthCn&quot;</span>] == <span class="string">&quot;九月&quot;</span> &amp;&amp; lunar[<span class="string">&quot;IDayCn&quot;</span>] == <span class="string">&quot;初九&quot;</span>)) &#123;</span><br><span class="line">    <span class="comment">//重阳节</span></span><br><span class="line">    <span class="keyword">if</span> (sessionStorage.<span class="title function_">getItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>) != <span class="string">&quot;1&quot;</span>) &#123;</span><br><span class="line">        <span class="title class_">Swal</span>.<span class="title function_">fire</span>(<span class="string">&quot;重阳节快乐\n独在异乡为异客，每逢佳节倍思亲&quot;</span>);</span><br><span class="line">        sessionStorage.<span class="title function_">setItem</span>(<span class="string">&quot;isPopupWindow&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 切换主题提醒</span></span><br><span class="line"><span class="comment">// if (y == 2022 &amp;&amp; m == 12 &amp;&amp; (dd &gt;= 18 &amp;&amp; dd &lt;= 20)) &#123;</span></span><br><span class="line"><span class="comment">//     if (sessionStorage.getItem(&quot;isPopupWindow&quot;) != &quot;1&quot;) &#123;</span></span><br><span class="line"><span class="comment">//         Swal.fire(&quot;网站换成冬日限定主题啦⛄&quot;);</span></span><br><span class="line"><span class="comment">//         sessionStorage.setItem(&quot;isPopupWindow&quot;, &quot;1&quot;);</span></span><br><span class="line"><span class="comment">//     &#125;</span></span><br><span class="line"><span class="comment">// &#125;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>由于有的节日是农历的，因此还要引入一个计算农历的代码，新建<code>[BlogRoot]\source\js\lunar.js</code>，并写入以下代码，太长了压缩了一下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> lunarInfo=[<span class="number">19416</span>,<span class="number">19168</span>,<span class="number">42352</span>,<span class="number">21717</span>,<span class="number">53856</span>,<span class="number">55632</span>,<span class="number">91476</span>,<span class="number">22176</span>,<span class="number">39632</span>,<span class="number">21970</span>,<span class="number">19168</span>,<span class="number">42422</span>,<span class="number">42192</span>,<span class="number">53840</span>,<span class="number">119381</span>,<span class="number">46400</span>,<span class="number">54944</span>,<span class="number">44450</span>,<span class="number">38320</span>,<span class="number">84343</span>,<span class="number">18800</span>,<span class="number">42160</span>,<span class="number">46261</span>,<span class="number">27216</span>,<span class="number">27968</span>,<span class="number">109396</span>,<span class="number">11104</span>,<span class="number">38256</span>,<span class="number">21234</span>,<span class="number">18800</span>,<span class="number">25958</span>,<span class="number">54432</span>,<span class="number">59984</span>,<span class="number">28309</span>,<span class="number">23248</span>,<span class="number">11104</span>,<span class="number">100067</span>,<span class="number">37600</span>,<span class="number">116951</span>,<span class="number">51536</span>,<span class="number">54432</span>,<span class="number">120998</span>,<span class="number">46416</span>,<span class="number">22176</span>,<span class="number">107956</span>,<span class="number">9680</span>,<span class="number">37584</span>,<span class="number">53938</span>,<span class="number">43344</span>,<span class="number">46423</span>,<span class="number">27808</span>,<span class="number">46416</span>,<span class="number">86869</span>,<span class="number">19872</span>,<span class="number">42416</span>,<span class="number">83315</span>,<span class="number">21168</span>,<span class="number">43432</span>,<span class="number">59728</span>,<span class="number">27296</span>,<span class="number">44710</span>,<span class="number">43856</span>,<span class="number">19296</span>,<span class="number">43748</span>,<span class="number">42352</span>,<span class="number">21088</span>,<span class="number">62051</span>,<span class="number">55632</span>,<span class="number">23383</span>,<span class="number">22176</span>,<span class="number">38608</span>,<span class="number">19925</span>,<span class="number">19152</span>,<span class="number">42192</span>,<span class="number">54484</span>,<span class="number">53840</span>,<span class="number">54616</span>,<span class="number">46400</span>,<span class="number">46752</span>,<span class="number">103846</span>,<span class="number">38320</span>,<span class="number">18864</span>,<span class="number">43380</span>,<span class="number">42160</span>,<span class="number">45690</span>,<span class="number">27216</span>,<span class="number">27968</span>,<span class="number">44870</span>,<span class="number">43872</span>,<span class="number">38256</span>,<span class="number">19189</span>,<span class="number">18800</span>,<span class="number">25776</span>,<span class="number">29859</span>,<span class="number">59984</span>,<span class="number">27480</span>,<span class="number">23232</span>,<span class="number">43872</span>,<span class="number">38613</span>,<span class="number">37600</span>,<span class="number">51552</span>,<span class="number">55636</span>,<span class="number">54432</span>,<span class="number">55888</span>,<span class="number">30034</span>,<span class="number">22176</span>,<span class="number">43959</span>,<span class="number">9680</span>,<span class="number">37584</span>,<span class="number">51893</span>,<span class="number">43344</span>,<span class="number">46240</span>,<span class="number">47780</span>,<span class="number">44368</span>,<span class="number">21977</span>,<span class="number">19360</span>,<span class="number">42416</span>,<span class="number">86390</span>,<span class="number">21168</span>,<span class="number">43312</span>,<span class="number">31060</span>,<span class="number">27296</span>,<span class="number">44368</span>,<span class="number">23378</span>,<span class="number">19296</span>,<span class="number">42726</span>,<span class="number">42208</span>,<span class="number">53856</span>,<span class="number">60005</span>,<span class="number">54576</span>,<span class="number">23200</span>,<span class="number">30371</span>,<span class="number">38608</span>,<span class="number">19195</span>,<span class="number">19152</span>,<span class="number">42192</span>,<span class="number">118966</span>,<span class="number">53840</span>,<span class="number">54560</span>,<span class="number">56645</span>,<span class="number">46496</span>,<span class="number">22224</span>,<span class="number">21938</span>,<span class="number">18864</span>,<span class="number">42359</span>,<span class="number">42160</span>,<span class="number">43600</span>,<span class="number">111189</span>,<span class="number">27936</span>,<span class="number">44448</span>,<span class="number">84835</span>,<span class="number">37744</span>,<span class="number">18936</span>,<span class="number">18800</span>,<span class="number">25776</span>,<span class="number">92326</span>,<span class="number">59984</span>,<span class="number">27424</span>,<span class="number">108228</span>,<span class="number">43744</span>,<span class="number">41696</span>,<span class="number">53987</span>,<span class="number">51552</span>,<span class="number">54615</span>,<span class="number">54432</span>,<span class="number">55888</span>,<span class="number">23893</span>,<span class="number">22176</span>,<span class="number">42704</span>,<span class="number">21972</span>,<span class="number">21200</span>,<span class="number">43448</span>,<span class="number">43344</span>,<span class="number">46240</span>,<span class="number">46758</span>,<span class="number">44368</span>,<span class="number">21920</span>,<span class="number">43940</span>,<span class="number">42416</span>,<span class="number">21168</span>,<span class="number">45683</span>,<span class="number">26928</span>,<span class="number">29495</span>,<span class="number">27296</span>,<span class="number">44368</span>,<span class="number">84821</span>,<span class="number">19296</span>,<span class="number">42352</span>,<span class="number">21732</span>,<span class="number">53600</span>,<span class="number">59752</span>,<span class="number">54560</span>,<span class="number">55968</span>,<span class="number">92838</span>,<span class="number">22224</span>,<span class="number">19168</span>,<span class="number">43476</span>,<span class="number">41680</span>,<span class="number">53584</span>,<span class="number">62034</span>,<span class="number">54560</span>],solarMonth=[<span class="number">31</span>,<span class="number">28</span>,<span class="number">31</span>,<span class="number">30</span>,<span class="number">31</span>,<span class="number">30</span>,<span class="number">31</span>,<span class="number">31</span>,<span class="number">30</span>,<span class="number">31</span>,<span class="number">30</span>,<span class="number">31</span>],<span class="title class_">Gan</span>=[<span class="string">&quot;甲&quot;</span>,<span class="string">&quot;乙&quot;</span>,<span class="string">&quot;丙&quot;</span>,<span class="string">&quot;丁&quot;</span>,<span class="string">&quot;戊&quot;</span>,<span class="string">&quot;己&quot;</span>,<span class="string">&quot;庚&quot;</span>,<span class="string">&quot;辛&quot;</span>,<span class="string">&quot;壬&quot;</span>,<span class="string">&quot;癸&quot;</span>],<span class="title class_">Zhi</span>=[<span class="string">&quot;子&quot;</span>,<span class="string">&quot;丑&quot;</span>,<span class="string">&quot;寅&quot;</span>,<span class="string">&quot;卯&quot;</span>,<span class="string">&quot;辰&quot;</span>,<span class="string">&quot;巳&quot;</span>,<span class="string">&quot;午&quot;</span>,<span class="string">&quot;未&quot;</span>,<span class="string">&quot;申&quot;</span>,<span class="string">&quot;酉&quot;</span>,<span class="string">&quot;戌&quot;</span>,<span class="string">&quot;亥&quot;</span>],<span class="title class_">Animals</span>=[<span class="string">&quot;鼠&quot;</span>,<span class="string">&quot;牛&quot;</span>,<span class="string">&quot;虎&quot;</span>,<span class="string">&quot;兔&quot;</span>,<span class="string">&quot;龙&quot;</span>,<span class="string">&quot;蛇&quot;</span>,<span class="string">&quot;马&quot;</span>,<span class="string">&quot;羊&quot;</span>,<span class="string">&quot;猴&quot;</span>,<span class="string">&quot;鸡&quot;</span>,<span class="string">&quot;狗&quot;</span>,<span class="string">&quot;猪&quot;</span>],solarTerm=[<span class="string">&quot;小寒&quot;</span>,<span class="string">&quot;大寒&quot;</span>,<span class="string">&quot;立春&quot;</span>,<span class="string">&quot;雨水&quot;</span>,<span class="string">&quot;惊蛰&quot;</span>,<span class="string">&quot;春分&quot;</span>,<span class="string">&quot;清明&quot;</span>,<span class="string">&quot;谷雨&quot;</span>,<span class="string">&quot;立夏&quot;</span>,<span class="string">&quot;小满&quot;</span>,<span class="string">&quot;芒种&quot;</span>,<span class="string">&quot;夏至&quot;</span>,<span class="string">&quot;小暑&quot;</span>,<span class="string">&quot;大暑&quot;</span>,<span class="string">&quot;立秋&quot;</span>,<span class="string">&quot;处暑&quot;</span>,<span class="string">&quot;白露&quot;</span>,<span class="string">&quot;秋分&quot;</span>,<span class="string">&quot;寒露&quot;</span>,<span class="string">&quot;霜降&quot;</span>,<span class="string">&quot;立冬&quot;</span>,<span class="string">&quot;小雪&quot;</span>,<span class="string">&quot;大雪&quot;</span>,<span class="string">&quot;冬至&quot;</span>],sTermInfo=[<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c3598082c95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd0b06bdb0722c965ce1cfcc920f&quot;</span>,<span class="string">&quot;b027097bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c359801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd0b06bdb0722c965ce1cfcc920f&quot;</span>,<span class="string">&quot;b027097bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c359801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd0b06bdb0722c965ce1cfcc920f&quot;</span>,<span class="string">&quot;b027097bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;9778397bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97b6b97bd19801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd09801d98082c95f8e1cfcc920f&quot;</span>,<span class="string">&quot;97bd097bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd197c36c9210c9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec95f8c965cc920e&quot;</span>,<span class="string">&quot;97bd09801d98082c95f8e1cfcc920f&quot;</span>,<span class="string">&quot;97bd097bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36c9210c9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec95f8c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c3598082c95f8e1cfcc920f&quot;</span>,<span class="string">&quot;97bd097bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36c9210c9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c3598082c95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd097bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c3598082c95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd097bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c359801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd097bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c359801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd097bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf97c359801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd097bd07f595b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd19801ec9210c9274c920e&quot;</span>,<span class="string">&quot;97b6b97bd19801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd07f5307f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36c9210c9274c920e&quot;</span>,<span class="string">&quot;97b6b97bd19801ec95f8c965cc920f&quot;</span>,<span class="string">&quot;97bd07f5307f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36c9210c9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bd07f1487f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf7f1487f595b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf7f1487f595b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf7f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c965cc920e&quot;</span>,<span class="string">&quot;97bcf7f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b97bd19801ec9210c9274c920e&quot;</span>,<span class="string">&quot;97bcf7f0e47f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9210c91aa&quot;</span>,<span class="string">&quot;97b6b97bd197c36c9210c9274c920e&quot;</span>,<span class="string">&quot;97bcf7f0e47f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36c9210c9274c920e&quot;</span>,<span class="string">&quot;97b6b7f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f5307f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36b0b70c9274c91aa&quot;</span>,<span class="string">&quot;97b6b7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e37f1487f595b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f595b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9274c91aa&quot;</span>,<span class="string">&quot;97b6b7f0e47f531b0723b0787b0721&quot;</span>,<span class="string">&quot;7f0e27f0e47f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9210c91aa&quot;</span>,<span class="string">&quot;97b6b7f0e47f149b0723b0787b0721&quot;</span>,<span class="string">&quot;7f0e27f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;9778397bd097c36b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;977837f0e37f149b0723b0787b0721&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f5307f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;977837f0e37f14998082b0787b0721&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e37f1487f595b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc9210c8dc2&quot;</span>,<span class="string">&quot;977837f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;977837f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd097c35b0b6fc920fb0722&quot;</span>,<span class="string">&quot;977837f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;977837f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;977837f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f149b0723b0787b0721&quot;</span>,<span class="string">&quot;7f0e27f0e47f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;977837f0e37f14998082b0723b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e37f149b0723b0787b0721&quot;</span>,<span class="string">&quot;7f0e27f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e397bd07f595b0b0bc920fb0722&quot;</span>,<span class="string">&quot;977837f0e37f14898082b0723b02d5&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b0721&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f1487f595b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e37f14898082b0723b02d5&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b0721&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e37f14898082b0723b02d5&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e37f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e37f14898082b072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e37f14898082b072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e366aa89801eb072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f149b0723b0787b0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e366aa89801eb072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0723b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f149b0723b0787b0721&quot;</span>,<span class="string">&quot;7f0e27f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e366aa89801eb072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0723b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e37f14998083b0787b0721&quot;</span>,<span class="string">&quot;7f0e27f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e37f0e366aa89801eb072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14898082b0723b02d5&quot;</span>,<span class="string">&quot;7f07e7f0e37f14998082b0787b0721&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e36665b66aa89801e9808297c35&quot;</span>,<span class="string">&quot;665f67f0e37f14898082b0723b02d5&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b0721&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0722&quot;</span>,<span class="string">&quot;7f0e36665b66a449801e9808297c35&quot;</span>,<span class="string">&quot;665f67f0e37f14898082b0723b02d5&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e36665b66a449801e9808297c35&quot;</span>,<span class="string">&quot;665f67f0e37f14898082b072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e26665b66a449801e9808297c35&quot;</span>,<span class="string">&quot;665f67f0e37f1489801eb072297c35&quot;</span>,<span class="string">&quot;7ec967f0e37f14998082b0787b06bd&quot;</span>,<span class="string">&quot;7f07e7f0e47f531b0723b0b6fb0721&quot;</span>,<span class="string">&quot;7f0e27f1487f531b0b0bb0b6fb0722&quot;</span>],nStr1=[<span class="string">&quot;日&quot;</span>,<span class="string">&quot;一&quot;</span>,<span class="string">&quot;二&quot;</span>,<span class="string">&quot;三&quot;</span>,<span class="string">&quot;四&quot;</span>,<span class="string">&quot;五&quot;</span>,<span class="string">&quot;六&quot;</span>,<span class="string">&quot;七&quot;</span>,<span class="string">&quot;八&quot;</span>,<span class="string">&quot;九&quot;</span>,<span class="string">&quot;十&quot;</span>],nStr2=[<span class="string">&quot;初&quot;</span>,<span class="string">&quot;十&quot;</span>,<span class="string">&quot;廿&quot;</span>,<span class="string">&quot;卅&quot;</span>],nStr3=[<span class="string">&quot;正&quot;</span>,<span class="string">&quot;二&quot;</span>,<span class="string">&quot;三&quot;</span>,<span class="string">&quot;四&quot;</span>,<span class="string">&quot;五&quot;</span>,<span class="string">&quot;六&quot;</span>,<span class="string">&quot;七&quot;</span>,<span class="string">&quot;八&quot;</span>,<span class="string">&quot;九&quot;</span>,<span class="string">&quot;十&quot;</span>,<span class="string">&quot;冬&quot;</span>,<span class="string">&quot;腊&quot;</span>];<span class="keyword">function</span> <span class="title function_">lYearDays</span>(<span class="params">b</span>)&#123;<span class="keyword">var</span> f,c=<span class="number">348</span>;<span class="keyword">for</span>(f=<span class="number">32768</span>;f&gt;<span class="number">8</span>;f&gt;&gt;=<span class="number">1</span>)c+=lunarInfo[b-<span class="number">1900</span>]&amp;f?<span class="number">1</span>:<span class="number">0</span>;<span class="keyword">return</span> c+<span class="title function_">leapDays</span>(b)&#125;<span class="keyword">function</span> <span class="title function_">leapMonth</span>(<span class="params">b</span>)&#123;<span class="keyword">return</span> <span class="number">15</span>&amp;lunarInfo[b-<span class="number">1900</span>]&#125;<span class="keyword">function</span> <span class="title function_">leapDays</span>(<span class="params">b</span>)&#123;<span class="keyword">return</span> <span class="title function_">leapMonth</span>(b)?<span class="number">65536</span>&amp;lunarInfo[b-<span class="number">1900</span>]?<span class="number">30</span>:<span class="number">29</span>:<span class="number">0</span>&#125;<span class="keyword">function</span> <span class="title function_">monthDays</span>(<span class="params">b,f</span>)&#123;<span class="keyword">return</span> f&gt;<span class="number">12</span>||f&lt;<span class="number">1</span>?-<span class="number">1</span>:lunarInfo[b-<span class="number">1900</span>]&amp;<span class="number">65536</span>&gt;&gt;f?<span class="number">30</span>:<span class="number">29</span>&#125;<span class="keyword">function</span> <span class="title function_">solarDays</span>(<span class="params">b,f</span>)&#123;<span class="keyword">if</span>(f&gt;<span class="number">12</span>||f&lt;<span class="number">1</span>)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">var</span> c=f-<span class="number">1</span>;<span class="keyword">return</span> <span class="number">1</span>===c?b%<span class="number">4</span>==<span class="number">0</span>&amp;&amp;b%<span class="number">100</span>!=<span class="number">0</span>||b%<span class="number">400</span>==<span class="number">0</span>?<span class="number">29</span>:<span class="number">28</span>:solarMonth[c]&#125;<span class="keyword">function</span> <span class="title function_">toGanZhiYear</span>(<span class="params">b</span>)&#123;<span class="keyword">var</span> f=(b-<span class="number">3</span>)%<span class="number">10</span>,c=(b-<span class="number">3</span>)%<span class="number">12</span>;<span class="keyword">return</span> <span class="number">0</span>===f&amp;&amp;(f=<span class="number">10</span>),<span class="number">0</span>===c&amp;&amp;(c=<span class="number">12</span>),<span class="title class_">Gan</span>[f-<span class="number">1</span>]+<span class="title class_">Zhi</span>[c-<span class="number">1</span>]&#125;<span class="keyword">function</span> <span class="title function_">toAstro</span>(<span class="params">b,f</span>)&#123;<span class="keyword">return</span><span class="string">&quot;魔羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手魔羯&quot;</span>.<span class="title function_">substr</span>(<span class="number">2</span>*b-(f&lt;[<span class="number">20</span>,<span class="number">19</span>,<span class="number">21</span>,<span class="number">21</span>,<span class="number">21</span>,<span class="number">22</span>,<span class="number">23</span>,<span class="number">23</span>,<span class="number">23</span>,<span class="number">23</span>,<span class="number">22</span>,<span class="number">22</span>][b-<span class="number">1</span>]?<span class="number">2</span>:<span class="number">0</span>),<span class="number">2</span>)+<span class="string">&quot;座&quot;</span>&#125;<span class="keyword">function</span> <span class="title function_">toGanZhi</span>(<span class="params">b</span>)&#123;<span class="keyword">return</span> <span class="title class_">Gan</span>[b%<span class="number">10</span>]+<span class="title class_">Zhi</span>[b%<span class="number">12</span>]&#125;<span class="keyword">function</span> <span class="title function_">getTerm</span>(<span class="params">b,f</span>)&#123;<span class="keyword">if</span>(b&lt;<span class="number">1900</span>||b&gt;<span class="number">2100</span>)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">if</span>(f&lt;<span class="number">1</span>||f&gt;<span class="number">24</span>)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">var</span> c=sTermInfo[b-<span class="number">1900</span>],e=[<span class="built_in">parseInt</span>(<span class="string">&quot;0x&quot;</span>+c.<span class="title function_">substr</span>(<span class="number">0</span>,<span class="number">5</span>)).<span class="title function_">toString</span>(),<span class="built_in">parseInt</span>(<span class="string">&quot;0x&quot;</span>+c.<span class="title function_">substr</span>(<span class="number">5</span>,<span class="number">5</span>)).<span class="title function_">toString</span>(),<span class="built_in">parseInt</span>(<span class="string">&quot;0x&quot;</span>+c.<span class="title function_">substr</span>(<span class="number">10</span>,<span class="number">5</span>)).<span class="title function_">toString</span>(),<span class="built_in">parseInt</span>(<span class="string">&quot;0x&quot;</span>+c.<span class="title function_">substr</span>(<span class="number">15</span>,<span class="number">5</span>)).<span class="title function_">toString</span>(),<span class="built_in">parseInt</span>(<span class="string">&quot;0x&quot;</span>+c.<span class="title function_">substr</span>(<span class="number">20</span>,<span class="number">5</span>)).<span class="title function_">toString</span>(),<span class="built_in">parseInt</span>(<span class="string">&quot;0x&quot;</span>+c.<span class="title function_">substr</span>(<span class="number">25</span>,<span class="number">5</span>)).<span class="title function_">toString</span>()],a=[e[<span class="number">0</span>].<span class="title function_">substr</span>(<span class="number">0</span>,<span class="number">1</span>),e[<span class="number">0</span>].<span class="title function_">substr</span>(<span class="number">1</span>,<span class="number">2</span>),e[<span class="number">0</span>].<span class="title function_">substr</span>(<span class="number">3</span>,<span class="number">1</span>),e[<span class="number">0</span>].<span class="title function_">substr</span>(<span class="number">4</span>,<span class="number">2</span>),e[<span class="number">1</span>].<span class="title function_">substr</span>(<span class="number">0</span>,<span class="number">1</span>),e[<span class="number">1</span>].<span class="title function_">substr</span>(<span class="number">1</span>,<span class="number">2</span>),e[<span class="number">1</span>].<span class="title function_">substr</span>(<span class="number">3</span>,<span class="number">1</span>),e[<span class="number">1</span>].<span class="title function_">substr</span>(<span class="number">4</span>,<span class="number">2</span>),e[<span class="number">2</span>].<span class="title function_">substr</span>(<span class="number">0</span>,<span class="number">1</span>),e[<span class="number">2</span>].<span class="title function_">substr</span>(<span class="number">1</span>,<span class="number">2</span>),e[<span class="number">2</span>].<span class="title function_">substr</span>(<span class="number">3</span>,<span class="number">1</span>),e[<span class="number">2</span>].<span class="title function_">substr</span>(<span class="number">4</span>,<span class="number">2</span>),e[<span class="number">3</span>].<span class="title function_">substr</span>(<span class="number">0</span>,<span class="number">1</span>),e[<span class="number">3</span>].<span class="title function_">substr</span>(<span class="number">1</span>,<span class="number">2</span>),e[<span class="number">3</span>].<span class="title function_">substr</span>(<span class="number">3</span>,<span class="number">1</span>),e[<span class="number">3</span>].<span class="title function_">substr</span>(<span class="number">4</span>,<span class="number">2</span>),e[<span class="number">4</span>].<span class="title function_">substr</span>(<span class="number">0</span>,<span class="number">1</span>),e[<span class="number">4</span>].<span class="title function_">substr</span>(<span class="number">1</span>,<span class="number">2</span>),e[<span class="number">4</span>].<span class="title function_">substr</span>(<span class="number">3</span>,<span class="number">1</span>),e[<span class="number">4</span>].<span class="title function_">substr</span>(<span class="number">4</span>,<span class="number">2</span>),e[<span class="number">5</span>].<span class="title function_">substr</span>(<span class="number">0</span>,<span class="number">1</span>),e[<span class="number">5</span>].<span class="title function_">substr</span>(<span class="number">1</span>,<span class="number">2</span>),e[<span class="number">5</span>].<span class="title function_">substr</span>(<span class="number">3</span>,<span class="number">1</span>),e[<span class="number">5</span>].<span class="title function_">substr</span>(<span class="number">4</span>,<span class="number">2</span>)];<span class="keyword">return</span> <span class="built_in">parseInt</span>(a[f-<span class="number">1</span>])&#125;<span class="keyword">function</span> <span class="title function_">toChinaMonth</span>(<span class="params">b</span>)&#123;<span class="keyword">if</span>(b&gt;<span class="number">12</span>||b&lt;<span class="number">1</span>)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">var</span> f=nStr3[b-<span class="number">1</span>];<span class="keyword">return</span> f+=<span class="string">&quot;月&quot;</span>&#125;<span class="keyword">function</span> <span class="title function_">toChinaDay</span>(<span class="params">b</span>)&#123;<span class="keyword">var</span> f;<span class="keyword">switch</span>(b)&#123;<span class="keyword">case</span> <span class="number">10</span>:f=<span class="string">&quot;初十&quot;</span>;<span class="keyword">break</span>;<span class="keyword">case</span> <span class="number">20</span>:f=<span class="string">&quot;二十&quot;</span>;<span class="keyword">break</span>;<span class="keyword">case</span> <span class="number">30</span>:f=<span class="string">&quot;三十&quot;</span>;<span class="keyword">break</span>;<span class="attr">default</span>:f=nStr2[<span class="title class_">Math</span>.<span class="title function_">floor</span>(b/<span class="number">10</span>)],f+=nStr1[b%<span class="number">10</span>]&#125;<span class="keyword">return</span> f&#125;<span class="keyword">function</span> <span class="title function_">getAnimal</span>(<span class="params">b</span>)&#123;<span class="keyword">return</span> <span class="title class_">Animals</span>[(b-<span class="number">4</span>)%<span class="number">12</span>]&#125;<span class="keyword">function</span> <span class="title function_">solar2lunar</span>(<span class="params">b,f,c</span>)&#123;<span class="keyword">if</span>(b&lt;<span class="number">1900</span>||b&gt;<span class="number">2100</span>)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">if</span>(<span class="number">1900</span>===b&amp;&amp;<span class="number">1</span>===f&amp;&amp;c&lt;<span class="number">31</span>)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">var</span> e,a,r=<span class="literal">null</span>,t=<span class="number">0</span>;b=(r=b?<span class="keyword">new</span> <span class="title class_">Date</span>(b,<span class="built_in">parseInt</span>(f)-<span class="number">1</span>,c):<span class="keyword">new</span> <span class="title class_">Date</span>).<span class="title function_">getFullYear</span>(),f=r.<span class="title function_">getMonth</span>()+<span class="number">1</span>,c=r.<span class="title function_">getDate</span>();<span class="keyword">var</span> d=(<span class="title class_">Date</span>.<span class="title function_">UTC</span>(r.<span class="title function_">getFullYear</span>(),r.<span class="title function_">getMonth</span>(),r.<span class="title function_">getDate</span>())-<span class="title class_">Date</span>.<span class="title function_">UTC</span>(<span class="number">1900</span>,<span class="number">0</span>,<span class="number">31</span>))/<span class="number">864e5</span>;<span class="keyword">for</span>(e=<span class="number">1900</span>;e&lt;<span class="number">2101</span>&amp;&amp;d&gt;<span class="number">0</span>;e++)d-=t=<span class="title function_">lYearDays</span>(e);d&lt;<span class="number">0</span>&amp;&amp;(d+=t,e--);<span class="keyword">var</span> n=<span class="keyword">new</span> <span class="title class_">Date</span>,s=!<span class="number">1</span>;n.<span class="title function_">getFullYear</span>()===b&amp;&amp;n.<span class="title function_">getMonth</span>()+<span class="number">1</span>===f&amp;&amp;n.<span class="title function_">getDate</span>()===c&amp;&amp;(s=!<span class="number">0</span>);<span class="keyword">var</span> u=r.<span class="title function_">getDay</span>(),o=nStr1[u];<span class="number">0</span>===u&amp;&amp;(u=<span class="number">7</span>);<span class="keyword">var</span> l=e;a=<span class="title function_">leapMonth</span>(e);<span class="keyword">var</span> i=!<span class="number">1</span>;<span class="keyword">for</span>(e=<span class="number">1</span>;e&lt;<span class="number">13</span>&amp;&amp;d&gt;<span class="number">0</span>;e++)a&gt;<span class="number">0</span>&amp;&amp;e===a+<span class="number">1</span>&amp;&amp;!<span class="number">1</span>===i?(--e,i=!<span class="number">0</span>,t=<span class="title function_">leapDays</span>(l)):t=<span class="title function_">monthDays</span>(l,e),!<span class="number">0</span>===i&amp;&amp;e===a+<span class="number">1</span>&amp;&amp;(i=!<span class="number">1</span>),d-=t;<span class="number">0</span>===d&amp;&amp;a&gt;<span class="number">0</span>&amp;&amp;e===a+<span class="number">1</span>&amp;&amp;(i?i=!<span class="number">1</span>:(i=!<span class="number">0</span>,--e)),d&lt;<span class="number">0</span>&amp;&amp;(d+=t,--e);<span class="keyword">var</span> h=e,D=d+<span class="number">1</span>,g=f-<span class="number">1</span>,v=<span class="title function_">toGanZhiYear</span>(l),y=<span class="title function_">getTerm</span>(b,<span class="number">2</span>*f-<span class="number">1</span>),m=<span class="title function_">getTerm</span>(b,<span class="number">2</span>*f),p=<span class="title function_">toGanZhi</span>(<span class="number">12</span>*(b-<span class="number">1900</span>)+f+<span class="number">11</span>);c&gt;=y&amp;&amp;(p=<span class="title function_">toGanZhi</span>(<span class="number">12</span>*(b-<span class="number">1900</span>)+f+<span class="number">12</span>));<span class="keyword">var</span> M=!<span class="number">1</span>,T=<span class="literal">null</span>;y===c&amp;&amp;(M=!<span class="number">0</span>,T=solarTerm[<span class="number">2</span>*f-<span class="number">2</span>]),m===c&amp;&amp;(M=!<span class="number">0</span>,T=solarTerm[<span class="number">2</span>*f-<span class="number">1</span>]);<span class="keyword">var</span> I=<span class="title function_">toGanZhi</span>(<span class="title class_">Date</span>.<span class="title function_">UTC</span>(b,g,<span class="number">1</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>)/<span class="number">864e5</span>+<span class="number">25567</span>+<span class="number">10</span>+c-<span class="number">1</span>),C=<span class="title function_">toAstro</span>(f,c);<span class="keyword">return</span>&#123;<span class="attr">lYear</span>:l,<span class="attr">lMonth</span>:h,<span class="attr">lDay</span>:D,<span class="title class_">Animal</span>:<span class="title function_">getAnimal</span>(l),<span class="title class_">IMonthCn</span>:(i?<span class="string">&quot;闰&quot;</span>:<span class="string">&quot;&quot;</span>)+<span class="title function_">toChinaMonth</span>(h),<span class="title class_">IDayCn</span>:<span class="title function_">toChinaDay</span>(D),<span class="attr">cYear</span>:b,<span class="attr">cMonth</span>:f,<span class="attr">cDay</span>:c,<span class="attr">gzYear</span>:v,<span class="attr">gzMonth</span>:p,<span class="attr">gzDay</span>:I,<span class="attr">isToday</span>:s,<span class="attr">isLeap</span>:i,<span class="attr">nWeek</span>:u,<span class="attr">ncWeek</span>:<span class="string">&quot;星期&quot;</span>+o,<span class="attr">isTerm</span>:M,<span class="title class_">Term</span>:T,<span class="attr">astro</span>:C&#125;&#125;<span class="keyword">var</span> calendarFormatter=&#123;<span class="attr">solar2lunar</span>:<span class="keyword">function</span>(<span class="params">b,f,c</span>)&#123;<span class="keyword">return</span> <span class="title function_">solar2lunar</span>(b,f,c)&#125;,<span class="attr">lunar2solar</span>:<span class="keyword">function</span>(<span class="params">b,f,c,e</span>)&#123;<span class="keyword">if</span>((e=!!e)&amp;&amp;leapMonth!==f)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">if</span>(<span class="number">2100</span>===b&amp;&amp;<span class="number">12</span>===f&amp;&amp;c&gt;<span class="number">1</span>||<span class="number">1900</span>===b&amp;&amp;<span class="number">1</span>===f&amp;&amp;c&lt;<span class="number">31</span>)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">var</span> a=<span class="title function_">monthDays</span>(b,f),r=a;<span class="keyword">if</span>(e&amp;&amp;(r=<span class="title function_">leapDays</span>(b,f)),b&lt;<span class="number">1900</span>||b&gt;<span class="number">2100</span>||c&gt;r)<span class="keyword">return</span>-<span class="number">1</span>;<span class="keyword">for</span>(<span class="keyword">var</span> t=<span class="number">0</span>,d=<span class="number">1900</span>;d&lt;b;d++)t+=<span class="title function_">lYearDays</span>(d);<span class="keyword">var</span> n=<span class="number">0</span>,s=!<span class="number">1</span>;<span class="keyword">for</span>(d=<span class="number">1</span>;d&lt;f;d++)n=<span class="title function_">leapMonth</span>(b),s||n&lt;=d&amp;&amp;n&gt;<span class="number">0</span>&amp;&amp;(t+=<span class="title function_">leapDays</span>(b),s=!<span class="number">0</span>),t+=<span class="title function_">monthDays</span>(b,d);e&amp;&amp;(t+=a);<span class="keyword">var</span> u=<span class="title class_">Date</span>.<span class="title function_">UTC</span>(<span class="number">1900</span>,<span class="number">1</span>,<span class="number">30</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>),o=<span class="keyword">new</span> <span class="title class_">Date</span>(<span class="number">864e5</span>*(t+c-<span class="number">31</span>)+u);<span class="keyword">return</span> <span class="title function_">solar2lunar</span>(o.<span class="title function_">getUTCFullYear</span>(),o.<span class="title function_">getUTCMonth</span>()+<span class="number">1</span>,o.<span class="title function_">getUTCDate</span>())&#125;&#125;;</span><br></pre></td></tr></table></figure></li><li><p>引入以下以上两个js文件和一个弹窗依赖（注意顺序不能颠倒）：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  bottom: </span><br><span class="line"><span class="addition">+    - &lt;script defer type=&quot;text/javascript&quot; src=&quot;https://cdn1.tianli0.top/npm/sweetalert2@8.19.0/dist/sweetalert2.all.js&quot;&gt;&lt;/script&gt; # 节日弹窗依赖</span></span><br><span class="line"><span class="addition">+    - &lt;script defer src=&quot;/js/lunar.js&quot;&gt;&lt;/script&gt; # 农历计算</span></span><br><span class="line"><span class="addition">+    - &lt;script defer src=&quot;/js/day.js&quot;&gt;&lt;/script&gt; # 节日弹窗</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目，如果是日子对了自动会有弹窗的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="地图插件-Guo-Le’s-Blog">地图插件(Guo Le’s Blog)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>懒得搬过来了，详见：<a href="https://guole.fun/posts/41887/">使用 Hexo-tag-map 插件，给文章插入高德百度谷歌等 5 类 9 种地图</a></p>              </div>            </details><h2 id="文章加密插件">文章加密插件</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见开源地址：<a href="https://github.com/D0n9X1n/hexo-blog-encrypt">hexo-blog-encrypt</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-876244d52a05587e3.webp" alt="image-876244d52a05587e3.webp"></p></div></div><ol><li><p>在根目录执行以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install --save hexo-blog-encrypt</span><br></pre></td></tr></table></figure></li><li><p>Front matter配置方法</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Hello World</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet">-</span> 作为日记加密</span><br><span class="line">date: 2016-03-30 21:12:21</span><br><span class="line">password: mikemessi</span><br><span class="line">abstract: 有东西被加密了, 请输入密码查看.</span><br><span class="line">message: 您好, 这里需要密码.</span><br><span class="line">theme: xray</span><br><span class="line">wrong<span class="emphasis">_pass_</span>message: 抱歉, 这个密码看着不太对, 请再试试.</span><br><span class="line"><span class="section">wrong<span class="emphasis">_hash_</span>message: 抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure></li><li><p>配置文件<code>[BlogRoot]\_config.yml</code>中针对tags的加密</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Security</span></span><br><span class="line"><span class="attr">encrypt:</span> <span class="comment"># hexo-blog-encrypt</span></span><br><span class="line">  <span class="attr">abstract:</span> <span class="string">有东西被加密了,</span> <span class="string">请输入密码查看.</span></span><br><span class="line">  <span class="attr">message:</span> <span class="string">您好,</span> <span class="string">这里需要密码.</span></span><br><span class="line">  <span class="attr">tags:</span></span><br><span class="line">  <span class="bullet">-</span> &#123;<span class="attr">name:</span> <span class="string">tagName</span>, <span class="attr">password:</span> <span class="string">密码A</span>&#125;</span><br><span class="line">  <span class="bullet">-</span> &#123;<span class="attr">name:</span> <span class="string">tagName</span>, <span class="attr">password:</span> <span class="string">密码B</span>&#125;</span><br><span class="line">  <span class="attr">theme:</span> <span class="string">xray</span></span><br><span class="line">  <span class="attr">wrong_pass_message:</span> <span class="string">抱歉,</span> <span class="string">这个密码看着不太对,</span> <span class="string">请再试试.</span></span><br><span class="line">  <span class="attr">wrong_hash_message:</span> <span class="string">抱歉,</span> <span class="string">这个文章不能被校验,</span> <span class="string">不过您还是能看看解密后的内容.</span></span><br></pre></td></tr></table></figure></li><li><p>你可以在线挑选你喜欢的主题,并应用到你的博客中:</p><ul><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Default/">default</a></li><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Blink/">blink</a></li><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Shrink/">shrink</a></li><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Flip/">flip</a></li><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Up/">up</a></li><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Surge/">surge</a></li><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Wave/">wave</a></li><li><a href="https://mhexo.github.io/2020/12/23/Theme-Test-Xray/">xray</a></li></ul></li><li><p>重启项目进入对应的文章页面即可看到加密效果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="PDF插件">PDF插件</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见开源地址：<a href="https://github.com/superalsrk/hexo-pdf">hexo-pdf</a></p><ol><li><p>安装hexo-pdf插件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-pdf --save</span><br></pre></td></tr></table></figure></li><li><p>外挂标签的引用格式如下：</p><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">参数配置</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% pdf 文件路径 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><p><code>文件路径</code>: 可以是相对路径或者是在线链接</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 1.本地文件:在md文件路径下创建一个同名文件夹，其内放pdf文件名为xxx.pdf的文件</span></span><br><span class="line">&#123;% pdf xxx.pdf %&#125;</span><br><span class="line"><span class="section"># 2.在线链接</span></span><br><span class="line">&#123;% pdf https://cdn.jsdelivr.net/gh/Justlovesmile/CDN/pdf/小作文讲义.pdf %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div></li><li><p>重启项目即可看到变更</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="🍕🍕🍕写在最后">🍕🍕🍕写在最后</h2><ul><li><p>大家有啥教程想看的可以在评论区留言，如果搭建或者魔改过程中遇到不懂的可以加下面的群讨论，同时本人在B站有空也会做一些魔改系列的视频教程，点这里可以进入我的B站账号个人空间<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a></p><img src="https://s1.vika.cn/space/2022/11/04/0bd8a1a7e8f64d6a8248d1d872c5a178" alt="二维码" style="zoom:50%;" /></li></ul>]]></content>
    
    
    <summary type="html">🎋这是博客魔改教程总结的第三期</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>免费图床综合教程</title>
    <link href="https://www.fomal.cc/posts/d7fb1ba1.html"/>
    <id>https://www.fomal.cc/posts/d7fb1ba1.html</id>
    <published>2022-12-03T17:41:06.000Z</published>
    <updated>2022-12-30T17:41:06.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-基于Github仓库的图床">1.基于Github仓库的图床</h2><div class="note info modern"><p><b>优点：</b></p><ol><li>很稳定不会跑路，用的是自己的仓库和公共托管平台</li><li>图片可以增量快速更新和跨设备管理</li><li>可以进行版本管理和查看之前的版本</li><li>有公共CDN，速度还是不错的</li><li>资源格式可以任意都行，包括<code>css</code>、<code>js</code>等</li></ol><p><b>缺点：</b></p><ol><li>每个仓库限制1G，超过要新建另一个仓库</li><li>git管理可能偶尔会遇到网络和公钥失效问题</li></ol></div><h3 id="1-1-建立Github仓库">1.1 建立Github仓库</h3><ol><li><p>进入<a href="https://github.com/">Github官网</a>注册并登录自己的账号，到自己的个人主页，点击右上角的<code>+</code>，并选择<code>New Repository</code>创建自己的仓库。</p><img src="https://s1.vika.cn/space/2022/12/03/304f38e77839471a87abbcad039116a4" alt="image-20221203180349042" style="zoom:50%;" /></li><li><p>仓库名字随意，描述也可以自由发挥，可见性最好选<code>public</code>，<code>Readme</code>文件可以创建，然后点击<code>Create Repository</code>创建仓库。</p><img src="https://cos.mengxiangzhicheng.cn/LightPicture/2022/12/7620619f8401a707.png" alt="7620619f8401a707.png" style="zoom: 80%;" /></li><li><p>让你的计算机与Github建立通信，这部分可以参考<a href="https://www.fomal.cc/posts/e593433d.html">Hexo 博客搭建基础教程 (一)</a>的第7点，主要是<code>创建公钥</code>、<code>上传公钥</code>、<code>检查通信</code>这几步，确保计算机有权限访问远程仓库，所述教程是用的<code>RSA公钥</code>，目前更推荐<code>ed25519公钥</code>，该数字签名算法的签名和验证的性能都极⾼，具体教程百度这里不再赘述。</p><img src="https://pic.imgdb.cn/item/638b237216f2c2beb1ce8b7e.jpg" style="zoom:50%;" /></li><li><p>先在本地创建一个文件夹，文件夹位置和名字随意就可以，进入该文件夹后右键打开<code>Git Bash</code>，然后输入以下代码把之前创建的仓库拷贝下来，其中<code>git clone</code>后面的东西要替换成自己的仓库信息，可以通过自己仓库的ssh链接来获取。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> git@github.com:fomalhaut1998/pic_bed.git</span><br></pre></td></tr></table></figure><img src="https://pic.imgdb.cn/item/638b255b16f2c2beb1d0d1fc.jpg" style="zoom:50%;" /><img src="https://pic.imgdb.cn/item/638b260716f2c2beb1d21741.jpg" style="zoom:50%;" /><p>看到上图的信息就代表成功把整个仓库拷贝到当前文件夹了，此时我们可以看见自己的文件夹多了个<code>.git</code>文件夹和<code>Readme.md</code>文件，这就代表成功了。</p><img src="https://pic.imgdb.cn/item/638b26f516f2c2beb1d324a9.jpg" style="zoom:50%;" /></li><li><p>此时我们最好在这个文件夹里面创建创建一个<code>img</code>文件夹专门存放图片，如果有存放其他类型资源的可以创建别的文件夹，比如现在想往仓库里加两张图，直接就把图片复制到<code>img</code>文件夹里面即可。</p><img src="https://pic.imgdb.cn/item/638b277216f2c2beb1d3ba52.jpg" style="zoom: 50%;" /><p>然后在带有<code>Readme.md</code>文件的那个文件夹内，右键打开<code>Git Bash</code>（注意看清楚是什么文件夹），然后依次输入以下命令把更改推送到远程仓库，最后一步不成功可能要多试几次。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将更改提交</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;更新图片&quot;</span></span><br><span class="line"><span class="comment"># 推送至github仓库</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>最后看见如下信息就代表推送成功了</p><p><img src="https://pic.imgdb.cn/item/638b28bf16f2c2beb1d5b49b.jpg" style="zoom:50%;" />仓库此时应该也有了刚刚上传的资源了</p><img src="https://pic.imgdb.cn/item/638b28d516f2c2beb1d5ceba.jpg" style="zoom:50%;" /><p>下次增删图片或者其他东西，就这样照猫画虎就可以推上来更新仓库！</p></li></ol><h3 id="1-2-Staticaly-CDN加速">1.2 Staticaly CDN加速</h3><p>直接访问Github仓库的资源是非常慢的！因此我们要用一些免费的CDN进行加速，<code>Staticaly CDN</code>是目前免费CDN中比较好用的啦，他的应用规则如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 格式 其中 user是用户名  repo是仓库名  version代表版本(tag或者分支 默认为main)  flie是文件路径 </span><br><span class="line">https://cdn.staticaly.com/gh/user/repo@version/file</span><br><span class="line"></span><br><span class="line"># 比如我的示例仓库就是加速地址就是这个大家可以参考参考</span><br><span class="line">https://cdn.staticaly.com/gh/fomalhaut1998/pic_bed@main/img/p2.webp</span><br></pre></td></tr></table></figure><h3 id="1-3-Vercel-部署">1.3 Vercel 部署</h3><div class="note info modern"><p>此方法加载速度较快，但是需要域名自定义绑定，其优点也是可以绑定自定义域了，目前Vercel每个月限制流量100GB</p></div><ol><li><p>进入<a href="https://vercel.com/dashboard">Vercel控制面板</a>新建项目，并<code>通过Github继续</code>，选择导入刚刚创建的仓库，然后直接部署即可</p><img src="https://pic.imgdb.cn/item/638b735916f2c2beb1637950.jpg" style="zoom: 50%;" /><img src="https://pic.imgdb.cn/item/638b739716f2c2beb16457e3.jpg" style="zoom:50%;" /></li><li><p>进入该项目控制台后，选择右上角的<code>View Domains</code>添加新的域名，添加一个自己域名的二级域名，然后在你对应的域名解析控制台添加对应解析，等待生效。</p><img src="https://pic.imgdb.cn/item/638b749216f2c2beb167070c.jpg" style="zoom:50%;" /><img src="https://pic.imgdb.cn/item/638b745716f2c2beb1665262.jpg" style="zoom:50%;" /><img src="https://pic.imgdb.cn/item/638b74c316f2c2beb1679c5a.jpg" style="zoom:50%;" /></li><li><p>通过<code>自定义域名+资源路径</code>即可访问到对应的资源，例如我这里为<code>https://picbed.fomal.cc/img/p1.webp</code></p></li><li><p>要更新图片怎么办？只要将资源复制到对应的文件夹，然后再执行一次下面的命令即可：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将更改提交</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;更新图片&quot;</span></span><br><span class="line"><span class="comment"># 推送至github仓库</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>这个命令默认是更新到仓库的<code>main</code>分支上，Vercel一旦检测到main分支发送变化就会触发新一轮部署，我们稍候片刻即可通过新的路径访问到新的资源。</p></li></ol><h3 id="1-4-Cloudflare-部署">1.4 Cloudflare 部署</h3><div class="note info modern"><p>此方法速度比Vercel稍慢，但是可以不需要域名，目前我就在用这个，而且CloudFlare对于普通用户来说几乎不限量了</p></div><ol><li><p>进入<a href="https://www.cloudflare.com/">Cloudflare官网</a>注册并登录自己的账号，然后进入控制台后选择左边的<code>Pages</code>，再创建一个新项目并通过Git进行连接，所有参数默认直接部署。</p><img src="https://pic.imgdb.cn/item/638b75f316f2c2beb16a446e.jpg" style="zoom:50%;" /><img src="https://pic.imgdb.cn/item/638b766b16f2c2beb16ae188.jpg" style="zoom:50%;" /></li><li><p>通过给出的<code>初始域名+资源路径</code>即可访问到的对应资源，例如我这个就是<code>pic-bed-c6s.pages.dev/img/p1.webp</code>，当然你也可以绑定自定义域名使用。</p><img src="https://pic.imgdb.cn/item/638b76e116f2c2beb16b7f79.jpg" style="zoom:50%;" /></li></ol><h2 id="2-免费图床推荐">2.免费图床推荐</h2><div class="note info modern"><ol><li><p>这部分免费图床就太多了，我会把我目前发现的可以免费白嫖一定额度的图床做一个总结列在下面</p></li><li><p>这部分图床的搭建门槛较低，所以速度和稳定性良莠不齐，大家自行选择使用哪个</p></li><li><p>我这里只给大家演示一种的使用方法，其他图床使用方法也类似</p></li><li><p>大家可以看看哪个比较好用的或者自己知道的好用的这里没有，可以留言我会进行补充</p></li></ol></div><table><thead><tr><th style="text-align:center">🍕</th><th style="text-align:center">🥗</th><th style="text-align:center">🍤</th></tr></thead><tbody><tr><td style="text-align:center"><a href="https://smms.app/">SMMS</a></td><td style="text-align:center"><a href="https://www.superbed.cn/">聚合图床</a></td><td style="text-align:center"><a href="https://www.hualigs.cn/">遇见图床</a></td></tr><tr><td style="text-align:center"><a href="https://postimages.org/">PostImage</a></td><td style="text-align:center"><a href="https://imgse.com/">路过图床</a></td><td style="text-align:center"><a href="https://www.imgurl.org/">imgURL</a></td></tr><tr><td style="text-align:center"><a href="https://imgbox.com/">imgbox</a></td><td style="text-align:center"><a href="https://pic.iqy.ink/upload">Lsky Pro</a></td><td style="text-align:center"><a href="https://upload.cc/">Upload.cc</a></td></tr><tr><td style="text-align:center"><a href="https://imagelol.com/">imagelol</a></td><td style="text-align:center"><a href="https://imgtp.com/">imgtp</a></td><td style="text-align:center"><a href="https://cloudimge.com/">云图床</a></td></tr><tr><td style="text-align:center"><a href="https://mcecy.com/">载涂图床</a></td><td style="text-align:center"><a href="https://tuchuang.voooe.cn/">Sky Chart Bed</a></td><td style="text-align:center"><a href="https://www.imgbed.link/">风筝图床</a></td></tr><tr><td style="text-align:center"><a href="https://pz.al/">喷子图床</a></td><td style="text-align:center"><a href="https://imgkb.com/">imgkb</a></td><td style="text-align:center"></td></tr></tbody></table><ul><li><p>使用方法：直接进入官网，上传图片然后粘贴地址即可，地址的样式有多样，自行选择。</p></li><li><p>选择要点：</p><ol><li>速度：大家可以到<a href="https://ping.cn">Ping.cn</a>进行测试</li><li>稳定性与安全性：看看图床创建时间，网上评价等</li><li>可适用性：支持的格式越多肯定是越好的，有部分支持<code>webp</code>和其他格式的，可以当资源床</li></ol></li></ul><h2 id="3-PicGo结合Markdown实时上传图片">3.PicGo结合Markdown实时上传图片</h2><ul><li><p>Picgo究竟是什么？这是一个开源软件，开源地址：<a href="https://github.com/Molunerfinn/PicGo">Molunerfinn/PicGo</a></p></li><li><p>引用项目的介绍：这是一个用于快速上传图片并获取图片 URL 链接的工具，关键是他可以与Typora配套一起使用，在粘贴图片的同时上传图片，十分方便！</p></li><li><p>最新版我这里实测没办法安装一些插件，因此推荐大家安装<a href="https://github.com/Molunerfinn/PicGo/releases/tag/v2.3.1-beta.5">v2.3.1-beta.5</a>这个版本</p>  <img src="https://tuchuang.voooe.cn/images/2022/12/30/image.webp" style="zoom: 50%;" /></li><li><p>下载软件后直接一路安装下去就行，建议装在非C盘的任意一个盘。</p></li></ul><h3 id="3-1-Github图床">3.1 Github图床</h3><ol><li><p>进入软件之后，一路到设置里面取消勾选其他图床，只留下Github图床一项，因为我们的现在要弄Github图床。</p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/image-1.webp" style="zoom: 50%;" /></li><li><p>然后到Github新建一个仓库，创建仓库的教程前面有讲，这里就不赘述了，<code>仓库名字</code>和<code>描述</code>随意，最重要的是权限一定要选<code>public</code>，这样你的图片才可以随时随地访问到。在图床设置的Github配置处，按照下图填入对应的信息：</p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/image-2.webp" style="zoom:50%;" /><p>自定义域名的格式为：<code>https://cdn.staticaly.com/gh/用户名/仓库名@main</code>，比如我的就是<code>https://cdn.staticaly.com/gh/fomalhaut1998/markdown_pic@main</code>，对应的<code>用户名</code>和<code>仓库名</code>记住要换成自己名字，不能有空格！！！</p><p>Token的获取方式为：<code>右上角头像</code>-&gt;<code>Setting</code>-&gt;<code>左边栏Developer Settings</code>-&gt;<code>左栏Personal access tokens</code>-&gt;<code>左栏tokens(classic)</code></p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/image-3.webp" style="zoom: 40%;" /><p>创建Token时，<code>Note</code>随意；<code>Exporation</code>选<code>No expiration</code>，<code>Select scopes</code>必须把<code>repo</code>这一项勾上，然后点击生成就行</p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/image-4.webp" style="zoom:40%;" /><p>这个时候必须马上复制出现的token，不然后面就看不到了，复制了填进去刚刚的Token选项，随后点击确定保存</p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/image-5.webp" style="zoom:50%;" /></li><li><p>随便拖拽一张图片进来上传区域这里，应该就可以上传成功，随后把生成的链接复制就可以，此时打开仓库可以发现图片上传到了指定的文件夹。注意：每个仓库大小限制是1G！！！</p></li></ol><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-6.webp" style="zoom:50%;" /><h3 id="3-2-Vika图床">3.2 Vika图床</h3><p>Vika图床的服务器在国内，速度是比较快的</p><ol><li><p>首先在Picgo里面安装Vikadata的插件</p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/image-7.webp" style="zoom:50%;" /></li><li><p>我们要填的信息有下面这几项：</p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/1672391987585.webp" style="zoom:50%;" /></li><li><p>进入<a href="https://vika.cn/">维格表官网</a>，注册自己的账号并登录，新建一个空白的维格表</p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/1672392200825.webp" style="zoom:50%;" /></li><li><p>随后点击左下角头像的个人设置，绑定自己的邮箱后，获取<code>API Token</code></p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/1672392200835.webp" style="zoom:50%;" /> <img src="https://tuchuang.voooe.cn/images/2022/12/30/1672392200842.webp" style="zoom:50%;" /></li><li><p>进入刚刚创建的表格后，点击上边的<code>API</code>，进入API界面后，依次点击<code>显示API Token</code>-&gt;<code>Get 获取</code>，然后图中框起来的就是我们需要的<code>维格表ID</code>和<code>API Token</code></p> <img src="https://tuchuang.voooe.cn/images/2022/12/30/1672392201560.webp" style="zoom:50%;" /> <img src="https://tuchuang.voooe.cn/images/2022/12/30/1672392249317.webp" style="zoom:50%;" /></li><li><p>填进去对应位置后，到上传区域，把图床换成维格表，试试拖拽图片能不能上传！</p></li></ol><h3 id="3-3-Bilibili图床">3.3 Bilibili图床</h3><ul><li>由于这个图床用在博客里存在跨域问题，因此不再推荐使用了，开源地址：<a href="https://github.com/xlzy520/typora-plugin-bilibili">typora-plugin-bilibili</a></li><li>如需了解使用教程，见视频教程<a href="https://www.bilibili.com/video/BV1ZG411N7LS/">第12期：免费图床综合教程（二）</a></li></ul><h3 id="3-4-imgtp图床">3.4 imgtp图床</h3><ul><li>开源地址：<a href="https://github.com/Redns/picgo-plugin-imgtp">picgo-plugin-imgtp</a></li></ul><ol><li><p>在Picg插件商店搜索并安装该插件</p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-8.webp" style="zoom:50%;" /></li><li><p>进入<a href="https://imgtp.com/">imgtp</a>注册并登录自己的账号，记住账号密码，待会儿要用到</p></li><li><p>进入控制台，然后进入<code>设置</code>，就可以看到右边有<code>Token</code>这一项，这些就是我们要的全部信息</p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-9.webp" style="zoom:50%;" /></li><li><p>随后在imgtp的配置信息里面填上<code>账号</code>、<code>密码</code>、<code>Token</code>这几项即可</p><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-10.webp" style="zoom:50%;" /></li><li><p>填进去对应位置后，到上传区域，把图床换成维格表，试试拖拽图片能不能上传！</p></li></ol>]]></content>
    
    
    <summary type="html">🍝本教程汇总了本人所知道和使用过的免费图床详细使用方法</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>博客魔改教程总结(二)</title>
    <link href="https://www.fomal.cc/posts/5389e93f.html"/>
    <id>https://www.fomal.cc/posts/5389e93f.html</id>
    <published>2022-10-30T15:41:03.000Z</published>
    <updated>2023-01-03T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>魔改前必看（我当你们都懂了，太细节的就不写在教程中了🤣🤣🤣）</b></font></p><ol><li>博客魔改有风险，如果博客魔改出问题了又没有备份，可通过此项目查看基础源码进行<strong>回滚</strong>：<a href="https://github.com/jerryc127/hexo-theme-butterfly">jerryc127/hexo-theme-butterfly</a>、<a href="https://github.com/ccknbc-actions/blog-butterfly">ccknbc-actions/blog-butterfly</a>。</li><li>这部分魔改基本上都是大佬们造好的轮子，我按照大佬们的轮子结合自己的喜好进行魔改的，具体见我友人帐第一个栏目大佬们的网站，本处仅做一个总结，如有侵权请联系删除。</li><li>鉴于每个人的根目录名称都不一样，本帖<strong>博客根目录</strong>一律以<code>[BlogRoot]</code>指代。</li><li>本帖涉及魔改源码的内容，会使用<strong>diff代码块</strong>标识，复制时请<strong>不要忘记删除</strong>前面的<code>+、-</code>符号。</li><li>因为<code>.pug</code>和<code>.styl</code>以及<code>.yml</code>等对缩进要求较为严格，请尽量<strong>不要使用记事本等无法提供语法高亮的文本编辑器</strong>进行修改。</li><li>本帖基于<code>Butterfly主题</code>进行魔改方案编写，因此请读者优先掌握<a href="https://butterfly.js.org/">Butterfly主题官方文档</a>的内容后再来进行魔改。</li><li>魔改会过程常常引入<strong>自定义的css与js文件</strong>，方法见<a href="https://b.leonus.cn/2022/custom.html">Hexo博客添加自定义css和js文件</a>(太懒了不想自己写)</li></ol><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a> ⇦当前位置🪂</li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="外挂标签的引入（店长）">外挂标签的引入（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/615e2dec/">Tag Plugins Plus</a></p><ol><li><p>安装插件,在博客根目录<code>[BlogRoot]</code>下打开终端，运行以下指令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-butterfly-tag-plugins-plus --save</span><br></pre></td></tr></table></figure><p>考虑到hexo自带的markdown渲染插件<code>hexo-renderer-marked</code>与外挂标签语法的兼容性较差，建议您将其替换成<a href="https://www.npmjs.com/package/hexo-renderer-kramed">hexo-renderer-kramed</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm uninstall hexo-renderer-marked --save</span><br><span class="line">npm install hexo-renderer-kramed --save</span><br></pre></td></tr></table></figure></li><li><p>添加配置信息，以下为写法示例<br>在站点配置文件<code>_config.yml</code>或者主题配置文件<code>_config.butterfly.yml</code>中添加</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># tag-plugins-plus</span></span><br><span class="line"><span class="comment"># see https://akilar.top/posts/615e2dec/</span></span><br><span class="line"><span class="attr">tag_plugins:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># 开关</span></span><br><span class="line">  <span class="attr">priority:</span> <span class="number">5</span> <span class="comment">#过滤器优先权</span></span><br><span class="line">  <span class="attr">issues:</span> <span class="literal">false</span> <span class="comment">#issues标签依赖注入开关</span></span><br><span class="line">  <span class="attr">link:</span></span><br><span class="line">    <span class="attr">placeholder:</span> <span class="string">/img/link.png</span> <span class="comment">#link_card标签默认的图标图片</span></span><br><span class="line">  <span class="attr">CDN:</span></span><br><span class="line">    <span class="attr">anima:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-tag-plugins-plus@latest/lib/assets/font-awesome-animation.min.css</span> <span class="comment">#动画标签anima的依赖</span></span><br><span class="line">    <span class="attr">jquery:</span> <span class="string">https://npm.elemecdn.com/jquery@latest/dist/jquery.min.js</span> <span class="comment">#issues标签依赖</span></span><br><span class="line">    <span class="attr">issues:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-tag-plugins-plus@latest/lib/assets/issues.js</span> <span class="comment">#issues标签依赖</span></span><br><span class="line">    <span class="attr">iconfont:</span> <span class="string">//at.alicdn.com/t/font_2032782_8d5kxvn09md.js</span> <span class="comment">#参看https://akilar.top/posts/d2ebecef/</span></span><br><span class="line">    <span class="attr">carousel:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-tag-plugins-plus@latest/lib/assets/carousel-touch.js</span></span><br><span class="line">    <span class="attr">tag_plugins_css:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-tag-plugins-plus@latest/lib/tag_plugins.css</span></span><br></pre></td></tr></table></figure></li><li><p>参数释义</p></li></ol><table><thead><tr><th style="text-align:left">参数</th><th style="text-align:left">备选值/类型</th><th style="text-align:left">释义</th></tr></thead><tbody><tr><td style="text-align:left">enable</td><td style="text-align:left">true/false</td><td style="text-align:left">【必选】控制开关</td></tr><tr><td style="text-align:left">priority</td><td style="text-align:left">number</td><td style="text-align:left">【可选】过滤器优先级，数值越小，执行越早，默认为10，选填</td></tr><tr><td style="text-align:left">issues</td><td style="text-align:left">true/false</td><td style="text-align:left">【可选】issues标签控制开关，默认为false</td></tr><tr><td style="text-align:left">link.placeholder</td><td style="text-align:left">【必选】link卡片外挂标签的默认图标</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">CDN.anima</td><td style="text-align:left">URL</td><td style="text-align:left">【可选】动画标签anima的依赖</td></tr><tr><td style="text-align:left">CDN.jquery</td><td style="text-align:left">URL</td><td style="text-align:left">【可选】issues标签依赖</td></tr><tr><td style="text-align:left">CDN.issues</td><td style="text-align:left">URL</td><td style="text-align:left">【可选】issues标签依赖</td></tr><tr><td style="text-align:left">CDN.iconfont</td><td style="text-align:left">URL</td><td style="text-align:left">【可选】iconfont标签symbol样式引入，如果不想引入，则设为false</td></tr><tr><td style="text-align:left">CDN.carousel</td><td style="text-align:left">URL</td><td style="text-align:left">【可选】carousel旋转相册标签鼠标拖动依赖，如果不想引入则设为false</td></tr><tr><td style="text-align:left">CDN.tag_plugins_css</td><td style="text-align:left">URL</td><td style="text-align:left">【可选】外挂标签样式的CSS依赖，为避免CDN缓存延迟，建议将@latest改为具体版本号</td></tr></tbody></table><p>具体样式和写法可见：<a href="https://www.fomal.cc/posts/2013454d.html">Markdown语法与外挂标签写法汇总</a></p>              </div>            </details><h2 id="听话的鼠标魔改">听话的鼠标魔改</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://s1.vika.cn/space/2022/11/25/7b84e20eee214a5b956f2c96bcc115f4" alt="动画" style="zoom:67%;" /></div></div><ol><li><p>新建文件<code>[BlogRoot]\source\js\cursor.js</code>，在里面写上如下代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> <span class="variable constant_">CURSOR</span>;</span><br><span class="line"></span><br><span class="line"><span class="title class_">Math</span>.<span class="property">lerp</span> = <span class="function">(<span class="params">a, b, n</span>) =&gt;</span> (<span class="number">1</span> - n) * a + n * b;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getStyle</span> = (<span class="params">el, attr</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">window</span>.<span class="property">getComputedStyle</span></span><br><span class="line">            ? <span class="variable language_">window</span>.<span class="title function_">getComputedStyle</span>(el)[attr]</span><br><span class="line">            : el.<span class="property">currentStyle</span>[attr];</span><br><span class="line">    &#125; <span class="keyword">catch</span> (e) &#123;&#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Cursor</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pos</span> = &#123;<span class="attr">curr</span>: <span class="literal">null</span>, <span class="attr">prev</span>: <span class="literal">null</span>&#125;;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pt</span> = [];</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">create</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">init</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">render</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">move</span>(<span class="params">left, top</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">style</span>[<span class="string">&quot;left&quot;</span>] = <span class="string">`<span class="subst">$&#123;left&#125;</span>px`</span>;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">style</span>[<span class="string">&quot;top&quot;</span>] = <span class="string">`<span class="subst">$&#123;top&#125;</span>px`</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">create</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="variable language_">this</span>.<span class="property">cursor</span>) &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">cursor</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;div&quot;</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">id</span> = <span class="string">&quot;cursor&quot;</span>;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;hidden&quot;</span>);</span><br><span class="line">            <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">append</span>(<span class="variable language_">this</span>.<span class="property">cursor</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> el = <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&#x27;*&#x27;</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; el.<span class="property">length</span>; i++)</span><br><span class="line">            <span class="keyword">if</span> (<span class="title function_">getStyle</span>(el[i], <span class="string">&quot;cursor&quot;</span>) == <span class="string">&quot;pointer&quot;</span>)</span><br><span class="line">                <span class="variable language_">this</span>.<span class="property">pt</span>.<span class="title function_">push</span>(el[i].<span class="property">outerHTML</span>);</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>((<span class="variable language_">this</span>.<span class="property">scr</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;style&quot;</span>)));</span><br><span class="line">        <span class="comment">// 这里改变鼠标指针的颜色 由svg生成</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">scr</span>.<span class="property">innerHTML</span> = <span class="string">`* &#123;cursor: url(&quot;data:image/svg+xml,&lt;svg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 8 8&#x27; width=&#x27;8px&#x27; height=&#x27;8px&#x27;&gt;&lt;circle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;4&#x27; opacity=&#x27;.5&#x27;/&gt;&lt;/svg&gt;&quot;) 4 4, auto&#125;`</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">refresh</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">scr</span>.<span class="title function_">remove</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hover&quot;</span>);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;active&quot;</span>);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pos</span> = &#123;<span class="attr">curr</span>: <span class="literal">null</span>, <span class="attr">prev</span>: <span class="literal">null</span>&#125;;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">pt</span> = [];</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">create</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">init</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">render</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">init</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseover</span>  = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">pt</span>.<span class="title function_">includes</span>(e.<span class="property">target</span>.<span class="property">outerHTML</span>) &amp;&amp; <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;hover&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseout</span>   = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">pt</span>.<span class="title function_">includes</span>(e.<span class="property">target</span>.<span class="property">outerHTML</span>) &amp;&amp; <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hover&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmousemove</span>  = <span class="function"><span class="params">e</span> =&gt;</span> &#123;(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span> == <span class="literal">null</span>) &amp;&amp; <span class="variable language_">this</span>.<span class="title function_">move</span>(e.<span class="property">clientX</span> - <span class="number">8</span>, e.<span class="property">clientY</span> - <span class="number">8</span>); <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span> = &#123;<span class="attr">x</span>: e.<span class="property">clientX</span> - <span class="number">8</span>, <span class="attr">y</span>: e.<span class="property">clientY</span> - <span class="number">8</span>&#125;; <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hidden&quot;</span>);&#125;;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseenter</span> = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;hidden&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseleave</span> = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;hidden&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmousedown</span>  = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&quot;active&quot;</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">onmouseup</span>    = <span class="function"><span class="params">e</span> =&gt;</span> <span class="variable language_">this</span>.<span class="property">cursor</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&quot;active&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">render</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>) &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">x</span> = <span class="title class_">Math</span>.<span class="title function_">lerp</span>(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">x</span>, <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span>.<span class="property">x</span>, <span class="number">0.15</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">y</span> = <span class="title class_">Math</span>.<span class="title function_">lerp</span>(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">y</span>, <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span>.<span class="property">y</span>, <span class="number">0.15</span>);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="title function_">move</span>(<span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">x</span>, <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span>.<span class="property">y</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">prev</span> = <span class="variable language_">this</span>.<span class="property">pos</span>.<span class="property">curr</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title function_">requestAnimationFrame</span>(<span class="function">() =&gt;</span> <span class="variable language_">this</span>.<span class="title function_">render</span>());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="variable constant_">CURSOR</span> = <span class="keyword">new</span> <span class="title class_">Cursor</span>();</span><br><span class="line">    <span class="comment">// 需要重新获取列表时，使用 CURSOR.refresh()</span></span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure><p>其中比较重要的参数就是鼠标的尺寸和颜色，已经在上图中标出，目前发现颜色只支持RGB写法和固有名称写法（例如red这种），其他参数也可以自行摸索：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">* &#123;cursor: url(&quot;data:image/svg+xml,&lt;svg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 8 8&#x27; width=&#x27;8px&#x27; height=&#x27;8px&#x27;&gt;&lt;circle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;4&#x27; opacity=&#x27;1.0&#x27; fill=&#x27;rgb(57, 197, 187)&#x27;/&gt;&lt;/svg&gt;&quot;) 4 4, auto&#125;`</span><br></pre></td></tr></table></figure></li><li><p>在<code>[BlogRoot]\source\css\custom.css</code>添加如下代码：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 鼠标样式 */</span></span><br><span class="line"><span class="selector-id">#cursor</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: fixed;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="comment">/* 这里改变跟随的底色 */</span></span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0.25</span>;</span><br><span class="line">  <span class="attribute">z-index</span>: <span class="number">10086</span>;</span><br><span class="line">  <span class="attribute">pointer-events</span>: none;</span><br><span class="line">  <span class="attribute">transition</span>: <span class="number">0.2s</span> ease-in-out;</span><br><span class="line">  <span class="attribute">transition-property</span>: background, opacity, transform;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#cursor</span><span class="selector-class">.hidden</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#cursor</span><span class="selector-class">.hover</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0.1</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">2.5</span>);</span><br><span class="line">  -webkit-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">2.5</span>);</span><br><span class="line">  -moz-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">2.5</span>);</span><br><span class="line">  -ms-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">2.5</span>);</span><br><span class="line">  -o-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">2.5</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#cursor</span><span class="selector-class">.active</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0.5</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.5</span>);</span><br><span class="line">  -webkit-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.5</span>);</span><br><span class="line">  -moz-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.5</span>);</span><br><span class="line">  -ms-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.5</span>);</span><br><span class="line">  -o-<span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.5</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里比较重要的参数就是鼠标跟随的圆形颜色，可以根据自己的喜好进行更改：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#cursor</span> &#123;</span><br><span class="line">  <span class="comment">/* 这里改变跟随的底色 */</span></span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgb</span>(<span class="number">57</span>, <span class="number">197</span>, <span class="number">187</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>文件的<code>inject</code>配置项引入刚刚创建的<code>css</code>文件和<code>js</code>文件：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  head: </span><br><span class="line"><span class="addition">+    - &lt;link rel=&quot;stylesheet&quot; href=&quot;/css/custom.css&quot;&gt;</span></span><br><span class="line">  bottom:</span><br><span class="line"><span class="addition">+    - &lt;script defer src=&quot;/js/cursor.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看见效果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="页面样式调节">页面样式调节</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>这个教程是通过css样式调节各个页面透明度、模糊度（亚克力效果）、圆角、边框样式等，看起来会更加舒适。</p><ol><li><p>复制以下代码进去自定义的<code>custom.css</code>文件</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-pseudo">:root</span> &#123;</span><br><span class="line">  <span class="attr">--trans-light</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.88</span>);</span><br><span class="line">  <span class="attr">--trans-dark</span>: <span class="built_in">rgba</span>(<span class="number">25</span>, <span class="number">25</span>, <span class="number">25</span>, <span class="number">0.88</span>);</span><br><span class="line">  <span class="attr">--border-style</span>: <span class="number">1px</span> solid <span class="built_in">rgb</span>(<span class="number">169</span>, <span class="number">169</span>, <span class="number">169</span>);</span><br><span class="line">  <span class="attr">--backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">5px</span>) <span class="built_in">saturate</span>(<span class="number">150%</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 首页文章卡片 */</span></span><br><span class="line"><span class="selector-id">#recent-posts</span> &gt; <span class="selector-class">.recent-post-item</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-light);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">25px</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="built_in">var</span>(--border-style);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 首页侧栏卡片 */</span></span><br><span class="line"><span class="selector-id">#aside-content</span> <span class="selector-class">.card-widget</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-light);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">18px</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="built_in">var</span>(--border-style);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 文章页、归档页、普通页面 */</span></span><br><span class="line"><span class="selector-tag">div</span><span class="selector-id">#post</span>,</span><br><span class="line"><span class="selector-tag">div</span><span class="selector-id">#page</span>,</span><br><span class="line"><span class="selector-tag">div</span><span class="selector-id">#archive</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-light);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">  <span class="attribute">border</span>: <span class="built_in">var</span>(--border-style);</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 导航栏 */</span></span><br><span class="line"><span class="selector-id">#page-header</span><span class="selector-class">.nav-fixed</span> <span class="selector-id">#nav</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.75</span>);</span><br><span class="line">  backdrop-<span class="attribute">filter</span>: <span class="built_in">var</span>(--backdrop-filter);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#page-header</span><span class="selector-class">.nav-fixed</span> <span class="selector-id">#nav</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.7</span>) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 夜间模式遮罩 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#recent-posts</span> &gt; <span class="selector-class">.recent-post-item</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#aside-content</span> <span class="selector-class">.card-widget</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-tag">div</span><span class="selector-id">#post</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-tag">div</span><span class="selector-id">#archive</span>,</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-tag">div</span><span class="selector-id">#page</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--trans-dark);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 夜间模式页脚页头遮罩透明 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#footer</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: transparent <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#page-header</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: transparent <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 阅读模式 */</span></span><br><span class="line"><span class="selector-class">.read-mode</span> <span class="selector-id">#aside-content</span> <span class="selector-class">.card-widget</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">158</span>, <span class="number">204</span>, <span class="number">171</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.read-mode</span> <span class="selector-tag">div</span><span class="selector-id">#post</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">158</span>, <span class="number">204</span>, <span class="number">171</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 夜间模式下的阅读模式 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.read-mode</span> <span class="selector-id">#aside-content</span> <span class="selector-class">.card-widget</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">25</span>, <span class="number">25</span>, <span class="number">25</span>, <span class="number">0.9</span>) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#ffffff</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-class">.read-mode</span> <span class="selector-tag">div</span><span class="selector-id">#post</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">25</span>, <span class="number">25</span>, <span class="number">25</span>, <span class="number">0.9</span>) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#ffffff</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>参数说明：</p><ul><li><p><code>--trans-light</code>：白天模式带透明度的背景色，如<code>rgba(255, 255, 255, 0.88)</code>底色是纯白色，其中0.88就透明度，在0-1之间调节，值越大越不透明；</p></li><li><p><code>--trans-dark</code>: 夜间模式带透明度的背景色，如<code>rgba(25, 25, 25, 0.88)</code>底色是柔和黑色，其中0.88就透明度，在0-1之间调节，值越大越不透明;</p></li><li><p><code>--border-style</code>: 边框样式，<code>1px solid rgb(169, 169, 169)</code>指宽度为1px的灰色实体边框;</p></li><li><p><code>--backdrop-filter</code>: 背景过滤器，如<code>blur(5px) saturate(150%)</code>表示饱和度为150%的、高斯模糊半径为5px的过滤器，这是亚克力效果的一种实现方法;</p></li><li><p>大家可以根据自己喜好进行调节，不用拘泥于我的样式！</p></li></ul></li><li><p>记住在主题配置文件<code>_config.butterfly.yml</code>的<code>inject</code>配置项中引入该css文件：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">inject: </span><br><span class="line">  head: </span><br><span class="line"><span class="addition">+    - &lt;link rel=&quot;stylesheet&quot; href=&quot;/css/custom.css&quot;&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看见效果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="引入iconfont自定义图标（店长）">引入iconfont自定义图标（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/d2ebecef/">Iconfont Inject</a></p><h3 id="新建图标项目">新建图标项目</h3><ol><li><p>访问<a href="https://www.iconfont.cn/">阿里巴巴矢量图标库</a>,注册登录。</p></li><li><p>搜索自己心仪的图标，然后选择<strong>添加入库</strong>，加到购物车。</p></li><li><p>选择完毕后点击右上角的购物车图标，打开侧栏，选择添加到项目，如果没有项目就新建一个。</p><img src="https://s1.vika.cn/space/2022/10/29/91ec7f6432274b42b50698ef554a2b91" alt="p4" style="zoom: 50%;" /></li><li><p>可以通过上方顶栏菜单-&gt;资源管理-&gt;我的项目，找到之前添加的图标项目。(现在的iconfont可以在图标库的项目设置里直接打开彩色设置，然后采用fontclass的引用方式即可使用多彩图标。但是<strong>单一项目彩色图标上限是40个图标</strong>，酌情采用。)</p><img src="https://s1.vika.cn/space/2022/10/29/ed3f516f1162418faec46808103d3840" alt="image-20221029212836645" style="zoom:50%;" /><img src="https://s1.vika.cn/space/2022/10/29/a1984c415cb7442ba088e7a489cb2d8a" alt="image-20221029212857202" style="zoom:50%;" /></li></ol><h3 id="引入图标">引入图标</h3><p>线上引入方案，我使用的是官方文档中最便捷的<code>font-class</code>方案。这一方案偶尔会出现图标加载不出的情况。但是便于随时对图标库进行升级，换一下在线链接即可，适合新手使用。最新版本的iconfont支持直接在项目设置中开启彩色图标，从而实现直接用class添加多彩色图标。（推荐直接用这个即可）</p><ol><li><p>在<code>[BlogRoot]\themes\butterfly\source\css\custom.css</code>中填写如下内容，引入Unicode和Font-class的线上资源：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@import</span> <span class="string">&quot;//at.alicdn.com/t/font_2264842_b004iy0kk2b.css&quot;</span>;</span><br></pre></td></tr></table></figure><p>更推荐在在主题配置文件<code>inject</code>配置项进行全局引入：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;//at.alicdn.com/t/font_2264842_b004iy0kk2b.css&quot;</span> <span class="string">media=&quot;defer&quot;</span> <span class="string">onload=&quot;this.media=&#x27;all&#x27;&quot;&gt;</span></span><br><span class="line">  <span class="attr">bottom:</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">async</span> <span class="string">src=&quot;//at.alicdn.com/t/font_2264842_b004iy0kk2b.js&quot;&gt;&lt;/script&gt;</span> </span><br></pre></td></tr></table></figure></li><li><p>同时可以在自定义<code>CSS</code>中添加如下样式来控制图标默认大小和颜色等属性（<strong>若已经在项目设置中勾选了彩色选项，则无需再定义图标颜色</strong>），写法与字体样式类似，这恐怕也是它被称为<code>iconfont</code>（图标字体）的原因:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.iconfont</span> &#123;</span><br><span class="line">  <span class="attribute">font-family</span>: <span class="string">&quot;iconfont&quot;</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="comment">/* 这里可以自定义图标大小 */</span></span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">3em</span>;</span><br><span class="line">  <span class="attribute">font-style</span>: normal;</span><br><span class="line">  -webkit-<span class="attribute">font-smoothing</span>: antialiased;</span><br><span class="line">  -moz-osx-<span class="attribute">font-smoothing</span>: grayscale;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>可以通过自己的阿里图标库的font-class方案查询复制相应的<code>icon-xxxx</code>。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-rat&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-ox&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-tiger&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-rabbit&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-dragon&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-snake&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-horse&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-goat&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-monkey&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-rooster&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-dog&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;iconfont icon-boar&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="菜单栏多色动态图标（店长）">菜单栏多色动态图标（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/23fdf850/">糖果屋微调合集</a></p><div class="note info modern"><p>相比于静态的图标，个人更喜欢动态的，因此一步到位！</p></div><p>效果预览：</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://s1.vika.cn/space/2022/11/25/94c7dc47c48b4895b4e27e5ef53c15b2" alt="动画" style="zoom:50%;" /></div></div><div class="note warning modern"><p>前置教程：<a href="https://akilar.top/posts/d2ebecef/">Hexo引入阿里矢量图标库-iconfont inject</a>和<a href="https://akilar.top/posts/615e2dec/#%E5%8A%A8%E6%80%81%E6%A0%87%E7%AD%BE-anima">基于Butterfly的外挂标签引入-Tag Plugins Plus</a>中关于<code>动态标签anima</code>的内容。请确保您已经完成了前置教程，并实现了在文章中使用<code>symbol</code>写法来引入<code>iconfont</code>图标。同时引入了<code>fontawesome_animation</code>的前置依赖。<br>主要检查您的<code>inject</code>配置项中是否有这两个依赖</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="comment">#动画标签anima的依赖</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;https://cdn.jsdelivr.net/gh/l-lin/font-awesome-animation/dist/font-awesome-animation.min.css&quot;</span>  <span class="string">media=&quot;defer&quot;</span> <span class="string">onload=&quot;this.media=&#x27;all&#x27;&quot;&gt;</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="comment"># 阿里矢量图标,这串是我的图标库，你的链接会有所不同。</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">async</span> <span class="string">src=&quot;//at.alicdn.com/t/font_2032782_ev6ytrh30f.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></div><ol><li><p>替换<code>[BlogRoot]\themes\butterfly\layout\includes\header\menu_item.pug</code>为以下代码，本方案默认使用观感最佳的悬停父元素触发子元素动画效果，默认动画为<code>faa-tada</code>。注意：可以把之前的代码注释掉，再在后面加上如下代码，以便于回滚，此代码在<code>butterfly 4.3.1</code> 上可以运行并保留hide字段隐藏子菜单的功能，其他版本自行测试。代码的本质并不复杂，就是扫描配置文件对应的配置项，然后根据<code>||</code>的分割标志筛选出对应的图标名称、对应链接等，从而渲染出html页面。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">if theme.menu</span><br><span class="line">  .menus_items</span><br><span class="line">    each value, label in theme.menu</span><br><span class="line">      if typeof value !== &#x27;object&#x27;</span><br><span class="line">        .menus_item</span><br><span class="line">          - const valueArray = value.split(&#x27;||&#x27;)</span><br><span class="line">          a.site-page.faa-parent.animated-hover(href=url_for(trim(value.split(&#x27;||&#x27;)[0])))</span><br><span class="line">            if valueArray[1]</span><br><span class="line">              i.fa-fw(class=trim(valueArray[1]))</span><br><span class="line">              - var icon_value = trim(value.split(&#x27;||&#x27;)[1])</span><br><span class="line">              - var anima_value = value.split(&#x27;||&#x27;)[2] ? trim(value.split(&#x27;||&#x27;)[2]) : &#x27;faa-tada&#x27;</span><br><span class="line">              if icon_value.substring(0,2)==&quot;fa&quot;      </span><br><span class="line">                i.fa-fw(class=icon_value + &#x27; &#x27; + anima_value)</span><br><span class="line">              else if icon_value.substring(0,4)==&quot;icon&quot;          </span><br><span class="line">                svg.icon(aria-hidden=&quot;true&quot; class=anima_value)</span><br><span class="line">                  use(xlink:href=`#`+ icon_value)</span><br><span class="line">            span=&#x27; &#x27;+label</span><br><span class="line">      else</span><br><span class="line">        .menus_item</span><br><span class="line">          - const labelArray = label.split(&#x27;||&#x27;)</span><br><span class="line">          - const hideClass = labelArray[3] &amp;&amp; trim(labelArray[3]) === &#x27;hide&#x27; ? &#x27;hide&#x27; : &#x27;&#x27;</span><br><span class="line">          a.site-page.group.faa-parent.animated-hover(class=`$&#123;hideClass&#125;` href=&#x27;javascript:void(0);&#x27;)</span><br><span class="line">            if labelArray[1]</span><br><span class="line">              - var icon_label = trim(label.split(&#x27;||&#x27;)[1])</span><br><span class="line">              - var anima_label = label.split(&#x27;||&#x27;)[2] ? trim(label.split(&#x27;||&#x27;)[2]) : &#x27;faa-tada&#x27;</span><br><span class="line">              if icon_label.substring(0,2)==&quot;fa&quot;      </span><br><span class="line">                i.fa-fw(class=icon_label + &#x27; &#x27; + anima_label)</span><br><span class="line">              else if icon_label.substring(0,4)==&quot;icon&quot;    </span><br><span class="line">                svg.icon(aria-hidden=&quot;true&quot; class=anima_label)</span><br><span class="line">                  use(xlink:href=`#`+ icon_label)</span><br><span class="line">            span=&#x27; &#x27;+ trim(labelArray[0])</span><br><span class="line">            i.fas.fa-chevron-down</span><br><span class="line">          ul.menus_item_child</span><br><span class="line">            each val,lab in value </span><br><span class="line">              - const valArray = val.split(&#x27;||&#x27;)</span><br><span class="line">              li</span><br><span class="line">                a.site-page.child.faa-parent.animated-hover(href=url_for(trim(val.split(&#x27;||&#x27;)[0])))</span><br><span class="line">                  if valArray[1]</span><br><span class="line">                    - var icon_val = trim(val.split(&#x27;||&#x27;)[1])</span><br><span class="line">                    - var anima_val = val.split(&#x27;||&#x27;)[2] ? trim(val.split(&#x27;||&#x27;)[2]) : &#x27;faa-tada&#x27;</span><br><span class="line">                    if icon_val.substring(0,2)==&quot;fa&quot;      </span><br><span class="line">                      i.fa-fw(class=icon_val + &#x27; &#x27; + anima_val)</span><br><span class="line">                    else if icon_val.substring(0,4)==&quot;icon&quot;</span><br><span class="line">                      svg.icon(aria-hidden=&quot;true&quot; class=anima_val)</span><br><span class="line">                        use(xlink:href=`#`+ icon_val)                    </span><br><span class="line">                  span=&#x27; &#x27;+ lab</span><br></pre></td></tr></table></figure></li><li><p>以下是填写示例，在<code>[BlogRoot]\_config.butterfly.yml</code>中修改。<code>icon-xxx</code>字样的为<code>iconfont</code>的<code>symbol</code>引入方案的<code>id</code>值，可以在你的<code>iconfont</code>图标库内查询，其中hide属性也是可以用的。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">menu:</span></span><br><span class="line">  <span class="string">首页:</span> <span class="string">/</span> <span class="string">||</span> <span class="string">icon-home</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">  <span class="string">文章</span> <span class="string">||</span> <span class="string">icon--article</span> <span class="string">||</span> <span class="string">faa-tada</span> <span class="string">||</span> <span class="attr">hide:</span></span><br><span class="line">    <span class="string">归档:</span> <span class="string">/archives/</span> <span class="string">||</span> <span class="string">icon-guidang1</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">    <span class="string">标签:</span> <span class="string">/tags/</span> <span class="string">||</span> <span class="string">icon-sekuaibiaoqian</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">    <span class="string">分类:</span> <span class="string">/categories/</span> <span class="string">||</span> <span class="string">icon-fenlei</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">    <span class="string">随便逛逛:</span> <span class="string">javascript:randomPost();</span> <span class="string">||</span> <span class="string">icon-zuji1</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br></pre></td></tr></table></figure></li><li><p>要注意的是，这里的动态图标是<code>svg.icon</code>的标签，因此上面调节<code>.iconfont</code>的css并不使用，我们需要在自定义样式文件<code>custom.css</code>里加上一些样式来限制图标的大小和颜色等，具体大小自行调节。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">svg<span class="selector-class">.icon</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">1.28em</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">1.28em</span>;</span><br><span class="line">  <span class="attribute">vertical-align</span>: -<span class="number">0.15em</span>;</span><br><span class="line">  fill: currentColor;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到效果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="Social卡片彩色图标引入（店长）">Social卡片彩色图标引入（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/23fdf850/">糖果屋微调合集</a></p><p>效果预览：</p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://s1.vika.cn/space/2022/11/25/112e7ddb81734069a3ea92d909e663e2" alt="动画" style="zoom:50%;" /></div></div><div class="note info modern"><p>代码原理和上面的菜单栏基本一致，所以各个前置教程都不再重复，这里只提供代码魔改内容和配置项编写方案。（记住要引入了自己的图标再来看这个教程！！！）</p></div><ol><li><p>重写<code>[BlogRoot]\themes\butterfly\layout\includes\header\social.pug</code>,替换为以下代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">each value, title in theme.social</span><br><span class="line">  a.social-icon.faa-parent.animated-hover(href=url_for(trim(value.split(&#x27;||&#x27;)[0])) target=&quot;_blank&quot; title=title === undefined ? &#x27;&#x27; : trim(title))</span><br><span class="line">    if value.split(&#x27;||&#x27;)[1]</span><br><span class="line">      - var icon_value = trim(value.split(&#x27;||&#x27;)[1])</span><br><span class="line">      - var anima_value = value.split(&#x27;||&#x27;)[2] ? trim(value.split(&#x27;||&#x27;)[2]) : &#x27;faa-tada&#x27;</span><br><span class="line">      if icon_value.substring(0,2)==&quot;fa&quot;      </span><br><span class="line">        i.fa-fw(class=icon_value + &#x27; &#x27; + anima_value)</span><br><span class="line">      else if icon_value.substring(0,4)==&quot;icon&quot;          </span><br><span class="line">        svg.icon(aria-hidden=&quot;true&quot; class=anima_value)</span><br><span class="line">          use(xlink:href=`#`+ icon_value)</span><br></pre></td></tr></table></figure></li><li><p>以下为对应的<code>social</code>配置项。写法沿用<code>menu_item</code>的写法示例，修改<code>[BlogRoot]\_config.butterfly.yml</code>的<code>social</code>配置项，具体的链接改为自己的。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">social:</span></span><br><span class="line">  <span class="string">微信:</span> <span class="string">/assets/QRCode.jpg</span> <span class="string">||</span> <span class="string">icon-weixin</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">  <span class="attr">QQ:</span> <span class="string">https://res.abeim.cn/api/qq/?qq=1174008660</span> <span class="string">||</span> <span class="string">icon-QQ</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">  <span class="string">B站:</span> <span class="string">https://space.bilibili.com/220757832</span> <span class="string">||</span> <span class="string">icon-bilibili</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">  <span class="string">QQ邮箱:</span> <span class="string">mailto:1174008660@qq.com</span> <span class="string">||</span> <span class="string">icon-youxiang</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br><span class="line">  <span class="string">力扣:</span> <span class="string">https://leetcode.cn/u/fomalhaut1998</span> <span class="string">||</span> <span class="string">icon-leetcode</span> <span class="string">||</span> <span class="string">faa-tada</span></span><br></pre></td></tr></table></figure></li><li><p>要注意的是，这里的动态图标是<code>svg.icon</code>的标签，因此上面调节<code>.iconfont</code>的css并不使用，我们需要在自定义样式文件<code>custom.css</code>里加上一些样式来限制图标的大小和颜色等，具体大小自行调节（如果上面弄过菜单栏的图标大小，这里也就不需要再重复写了）。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">svg<span class="selector-class">.icon</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">1.28em</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">1.28em</span>;</span><br><span class="line">  <span class="attribute">vertical-align</span>: -<span class="number">0.15em</span>;</span><br><span class="line">  fill: currentColor;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>进阶操作：不知道大家发现没有，这个css对菜单栏的图标和对社交图标同时生效，但是有时候我们想这两者有不一样的大小，怎么办？其实很简单，只要我们给这两部分的图标元素贴上不同的“标签”就可以，这个标签可以是<code>id</code>，也可以是<code>class</code>，但是众所周知html中的id是唯一的，我们这里有多个图标，因此贴上不通的<code>class</code>比较合适，因此我们改造一下<code>[BlogRoot]\themes\butterfly\layout\includes\header\social.pug</code>这个文件</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">each value, title in theme.social</span><br><span class="line">  a.social-icon.faa-parent.animated-hover(href=url_for(trim(value.split(&#x27;||&#x27;)[0])) target=&quot;_blank&quot; title=title <span class="comment">=== undefined ? &#x27;&#x27; : trim(title))</span></span><br><span class="line">    if value.split(&#x27;||&#x27;)[1]</span><br><span class="line">      - var icon_value = trim(value.split(&#x27;||&#x27;)[1])</span><br><span class="line">      - var anima_value = value.split(&#x27;||&#x27;)[2] ? trim(value.split(&#x27;||&#x27;)[2]) : &#x27;faa-tada&#x27;</span><br><span class="line">      if icon_value.substring(0,2)==&quot;fa&quot;      </span><br><span class="line">        i.fa-fw(class=icon_value + &#x27; &#x27; + anima_value)</span><br><span class="line">      else if icon_value.substring(0,4)==&quot;icon&quot;          </span><br><span class="line"><span class="deletion">-        svg.icon(aria-hidden=&quot;true&quot; class=anima_value)</span></span><br><span class="line"><span class="addition">+        svg.social_icon(aria-hidden=&quot;true&quot; class=anima_value)</span></span><br><span class="line">          use(xlink:href=`#`+ icon_value)</span><br></pre></td></tr></table></figure><p>上面的改动会将图标渲染成<code>class=social_icon</code>的标签，现在我们可以区分菜单栏还是社交的图标的，如果想调节社交图标的大小就用以下的css</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">svg<span class="selector-class">.social_icon</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">1.20em</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">1.20em</span>;</span><br><span class="line">  <span class="attribute">vertical-align</span>: -<span class="number">0.15em</span>;</span><br><span class="line">  fill: currentColor;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>举一反三，要想专门用css改动菜单栏图标大小，只需要将<code>[BlogRoot]\themes\butterfly\layout\includes\header\menu_item.pug</code>文件中的<code>svg.icon</code>替换成<code>svg.menu_icon</code>，然后用以下的css</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">svg<span class="selector-class">.menu_icon</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">1.28em</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">1.28em</span>;</span><br><span class="line">  <span class="attribute">vertical-align</span>: -<span class="number">0.15em</span>;</span><br><span class="line">  fill: currentColor;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重启项目即可看到效果：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="侧边栏图标和文字自定义">侧边栏图标和文字自定义</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/image-12afd4c93c88c753e.webp" alt="image-12afd4c93c88c753e.webp" style="zoom:50%;" /></div></div><div class="note info modern"><p>这里的图标也是用的iconfont的，请完成前面的图标引入教程！由于侧边栏比较多，这里就演示改网站信息，剩下的侧边栏改法几乎一样的！（记住要引入了自己的图标再来看这个教程！！！）</p></div><ol><li><p>进入<code>[BlogRoot]\themes\butterfly\layout\includes\widget\card_webinfo.pug</code>，进行以下修改，因为默认的图标是<code>font-awesome</code>的黑白图标，就是<code>i.fas.fa-chart-line</code>那一行，删除，然后引入新的图标标签，其中图标的样式、名称等参考自己的需要进行更改，样式主要是<code>width</code>、<code>height</code>、<code>position</code>、<code>top</code>这几个属性，这里的<code>animated-hover</code>和<code>faa-tada</code>是给对应的元素套上对应的class，如果装了动画依赖，扫描到这些class的元素会自动挂载动画样式，如果不想要可以去除。</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">if theme.aside.card_webinfo.enable</span><br><span class="line">  .card-widget.card-webinfo</span><br><span class="line">    .item-headline</span><br><span class="line"><span class="deletion">-      i.fas.fa-chart-line</span></span><br><span class="line"><span class="addition">+      a.faa-parent.animated-hover</span></span><br><span class="line"><span class="addition">+       svg.faa-tada.icon(style=&quot;height:25px;width:25px;fill:currentColor;position:relative;top:5px&quot; aria-hidden=&quot;true&quot;)</span></span><br><span class="line"><span class="addition">+        use(xlink:href=&#x27;#icon-shujutongji2&#x27;)</span></span><br><span class="line">      span= _p(&#x27;aside.card_webinfo.headline&#x27;)</span><br><span class="line">    .webinfo</span><br><span class="line">      if theme.aside.card_webinfo.post_count</span><br><span class="line">        .webinfo-item</span><br><span class="line">          .item-name= _p(&#x27;aside.card_webinfo.article_name&#x27;) + &quot; :&quot;</span><br><span class="line">          .item-count= site.posts.length</span><br><span class="line">      if theme.runtimeshow.enable</span><br><span class="line">        .webinfo-item</span><br><span class="line">          .item-name= _p(&#x27;aside.card_webinfo.runtime.name&#x27;) + &quot; :&quot;</span><br><span class="line">          .item-count#runtimeshow(data-publishDate=date_xml(theme.runtimeshow.publish_date))</span><br><span class="line">            i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">      if theme.wordcount.enable &amp;&amp; theme.wordcount.total_wordcount</span><br><span class="line">        .webinfo-item</span><br><span class="line">          .item-name=_p(&#x27;aside.card_webinfo.site_wordcount&#x27;) + &quot; :&quot;</span><br><span class="line">          .item-count=totalcount(site)</span><br><span class="line">      if theme.busuanzi.site_uv</span><br><span class="line">        .webinfo-item</span><br><span class="line">          .item-name= _p(&#x27;aside.card_webinfo.site_uv_name&#x27;) + &quot; :&quot;</span><br><span class="line">          .item-count#busuanzi_value_site_uv</span><br><span class="line">            i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">      if theme.busuanzi.site_pv</span><br><span class="line">        .webinfo-item</span><br><span class="line">          .item-name= _p(&#x27;aside.card_webinfo.site_pv_name&#x27;) + &quot; :&quot;</span><br><span class="line">          .item-count#busuanzi_value_site_pv</span><br><span class="line">            i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">      if theme.aside.card_webinfo.last_push_date</span><br><span class="line">        .webinfo-item</span><br><span class="line">          .item-name= _p(&#x27;aside.card_webinfo.last_push_date.name&#x27;) + &quot; :&quot;</span><br><span class="line">          .item-count#last-push-date(data-lastPushDate=date_xml(Date.now()))</span><br><span class="line">            i.fa-solid.fa-spinner.fa-spin</span><br></pre></td></tr></table></figure></li><li><p>接下来就是改文了，注意到第8行的<code>span= _p('aside.card_webinfo.headline')</code>，这行代码就是渲染图标后面的文字，我们其实可以直接改成<code>span= _p('小站资讯')</code>，这样就已经按照自己的文字显示了，但是为了更好维护，我们遵循主题的设计原则，注意到变量<code>aside.card_webinfo.headline</code>，这其实是在写好的语言包中扫描对应的值，因为不同的语言对应不同的文字，如果我们设置了语言为<code>zh-CN</code>那么就到<code>[BlogRoot]\themes\butterfly\languages\zh-CN.yml</code>进行修改。<code>yml</code>文件是以缩进区分层级的，我们只需要寻找<code>aside</code>-&gt;<code>card_webinfo</code>-&gt;<code>headline</code>这一项修改为自己喜欢的内容即可</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">aside:</span><br><span class="line">  articles: 文章</span><br><span class="line">  tags: 标签</span><br><span class="line">  categories: 分类</span><br><span class="line">  card_announcement: 公告栏</span><br><span class="line">  card_categories: 分类</span><br><span class="line">  card_tags: 标签</span><br><span class="line">  card_archives: 归档</span><br><span class="line">  card_recent_post: 最新文章</span><br><span class="line">  card_friend_link: 通讯录</span><br><span class="line">  card_webinfo:</span><br><span class="line"><span class="deletion">-    headline: 网站资讯</span></span><br><span class="line"><span class="addition">+    headline: 网站资讯</span></span><br><span class="line">    article_name: 文章数目</span><br><span class="line">    runtime:</span><br><span class="line">      name: 已运行时间</span><br><span class="line">      unit: 天</span><br><span class="line">    last_push_date:</span><br><span class="line">      name: 最后更新时间</span><br><span class="line">    site_wordcount: 本站总字数</span><br><span class="line">    site_uv_name: 本站访客数</span><br><span class="line">    site_pv_name: 本站总访问量</span><br><span class="line">  more_button: 查看更多</span><br><span class="line">  card_newest_comments:</span><br><span class="line">    headline: 最新评论</span><br><span class="line">    loading_text: 正在加载中...</span><br><span class="line">    error: 无法获取评论，请确认相关配置是否正确</span><br><span class="line">    zero: 没有评论</span><br><span class="line">    image: 图片</span><br><span class="line">    link: 链接</span><br><span class="line">    code: 代码</span><br><span class="line">  card_toc: 目录</span><br></pre></td></tr></table></figure></li><li><p>最后重新编译运行即可看见效果。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="渐变色版权美化（店长-微调）">渐变色版权美化（店长+微调）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/8322f8e6/">（二创）Copyright-beautify</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://tuchuang.voooe.cn/images/2023/01/01/image.webp" alt="image.webp"></p></div></div><ol><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\post\post-copyright.pug</code>,直接复制以下内容替换原文件内容。此处多次用到了三元运算符作为默认项设置，在确保有主题配置文件的默认项的情况下，也可以在相应文章的<code>front-matter</code>中重新定义作者，原文链接，开源许可协议等内容。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">if theme.post_copyright.enable &amp;&amp; page.copyright !== false</span><br><span class="line">  - let author = page.copyright_author ? page.copyright_author : config.author</span><br><span class="line">  - let url = page.copyright_url ? page.copyright_url : page.permalink</span><br><span class="line">  - let license = page.license ? page.license : theme.post_copyright.license</span><br><span class="line">  - let license_url = page.license_url ? page.license_url : theme.post_copyright.license_url</span><br><span class="line">  .post-copyright</span><br><span class="line">    .post-copyright__title</span><br><span class="line">      span.post-copyright-info</span><br><span class="line">        h #[=page.title]</span><br><span class="line">    .post-copyright__type</span><br><span class="line">      span.post-copyright-info</span><br><span class="line">        a(href=url_for(url))= theme.post_copyright.decode ? decodeURI(url) : url</span><br><span class="line">    .post-copyright-m</span><br><span class="line">      .post-copyright-m-info</span><br><span class="line">        .post-copyright-a</span><br><span class="line">            h 作者</span><br><span class="line">            .post-copyright-cc-info</span><br><span class="line">                h=author</span><br><span class="line">        .post-copyright-c</span><br><span class="line">            h 发布于</span><br><span class="line">            .post-copyright-cc-info</span><br><span class="line">                h=date(page.date, config.date_format)</span><br><span class="line">        .post-copyright-u</span><br><span class="line">            h 更新于</span><br><span class="line">            .post-copyright-cc-info</span><br><span class="line">                h=date(page.updated, config.date_format)</span><br><span class="line">        .post-copyright-c</span><br><span class="line">            h 许可协议</span><br><span class="line">            .post-copyright-cc-info</span><br><span class="line">                a.icon(rel=&#x27;noopener&#x27; target=&#x27;_blank&#x27; title=&#x27;Creative Commons&#x27; href=&#x27;https://creativecommons.org/&#x27;)</span><br><span class="line">                  i.fab.fa-creative-commons</span><br><span class="line">                a(rel=&#x27;noopener&#x27; target=&#x27;_blank&#x27; title=license href=url_for(license_url))=license</span><br></pre></td></tr></table></figure></li><li><p>修改<code>[BlogRoot]\themes\butterfly\source\css\_layout\post.styl</code>,直接复制以下内容，替换原文件，这个文件就是自己调节样式的。其中，<code>184</code>行是白天模式的背景色，这里默认是我网站的渐变色，大家可以根据自己的喜好调节；<code>253</code>行是夜间模式的发光光圈颜色，大家也可以自行替换成自己喜欢的颜色：</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">beautify</span><span class="params">()</span></span></span><br><span class="line">  <span class="built_in">headStyle</span>(fontsize)</span><br><span class="line">    <span class="attribute">padding-left</span>: <span class="built_in">unit</span>(fontsize + <span class="number">12</span>, <span class="string">&#x27;px&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">      <span class="attribute">margin-left</span>: <span class="built_in">unit</span>((<span class="built_in">-</span>(fontsize + <span class="number">6</span>)), <span class="string">&#x27;px&#x27;</span>)</span><br><span class="line">      <span class="attribute">font-size</span>: <span class="built_in">unit</span>(fontsize, <span class="string">&#x27;px&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">      <span class="attribute">padding-left</span>: <span class="built_in">unit</span>(fontsize + <span class="number">18</span>, <span class="string">&#x27;px&#x27;</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">h1</span>,</span><br><span class="line">  <span class="selector-tag">h2</span>,</span><br><span class="line">  <span class="selector-tag">h3</span>,</span><br><span class="line">  <span class="selector-tag">h4</span>,</span><br><span class="line">  <span class="selector-tag">h5</span>,</span><br><span class="line">  <span class="selector-tag">h6</span></span><br><span class="line">    <span class="attribute">transition</span>: all .<span class="number">2s</span> ease-out</span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">      <span class="attribute">position</span>: absolute</span><br><span class="line">      <span class="attribute">top</span>: <span class="built_in">calc</span>(<span class="number">50%</span> - <span class="number">7px</span>)</span><br><span class="line">      <span class="attribute">color</span>: <span class="variable">$title</span>-prefix-icon-color</span><br><span class="line">      <span class="attribute">content</span>: <span class="variable">$title</span>-prefix-icon</span><br><span class="line">      <span class="attribute">line-height</span>: <span class="number">1</span></span><br><span class="line">      <span class="attribute">transition</span>: all .<span class="number">2s</span> ease-out</span><br><span class="line">      <span class="keyword">@extend</span> <span class="selector-class">.fontawesomeIcon</span></span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">      <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">        <span class="attribute">color</span>: <span class="variable">$light</span>-blue</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">h1</span></span><br><span class="line">    <span class="built_in">headStyle</span>(<span class="number">20</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">h2</span></span><br><span class="line">    <span class="built_in">headStyle</span>(<span class="number">18</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">h3</span></span><br><span class="line">    <span class="built_in">headStyle</span>(<span class="number">16</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">h4</span></span><br><span class="line">    <span class="built_in">headStyle</span>(<span class="number">14</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">h5</span></span><br><span class="line">    <span class="built_in">headStyle</span>(<span class="number">12</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">h6</span></span><br><span class="line">    <span class="built_in">headStyle</span>(<span class="number">12</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">ol</span>,</span><br><span class="line">  <span class="selector-tag">ul</span></span><br><span class="line">    <span class="selector-tag">p</span></span><br><span class="line">      <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">8px</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">li</span></span><br><span class="line">    <span class="selector-pseudo">&amp;::marker</span></span><br><span class="line">      <span class="attribute">color</span>: <span class="variable">$light</span>-blue</span><br><span class="line">      <span class="attribute">font-weight</span>: <span class="number">600</span></span><br><span class="line">      <span class="attribute">font-size</span>: <span class="number">1.05em</span></span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">      <span class="selector-pseudo">&amp;::marker</span></span><br><span class="line">        <span class="attribute">color</span>: <span class="built_in">var</span>(--pseudo-hover)</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">ul</span> &gt; <span class="selector-tag">li</span></span><br><span class="line">    <span class="attribute">list-style-type</span>: circle</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#article-container</span></span><br><span class="line">  <span class="attribute">word-wrap</span>: break-word</span><br><span class="line">  <span class="attribute">overflow-wrap</span>: break-word</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">a</span></span><br><span class="line">    <span class="attribute">color</span>: <span class="variable">$theme</span>-link-color</span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">      <span class="attribute">text-decoration</span>: underline</span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">img</span></span><br><span class="line">    <span class="attribute">display</span>: block</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> auto <span class="number">20px</span></span><br><span class="line">    <span class="attribute">max-width</span>: <span class="number">100%</span></span><br><span class="line">    <span class="attribute">transition</span>: filter <span class="number">375ms</span> ease-in .<span class="number">2s</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">p</span></span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">16px</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">iframe</span></span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">20px</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;anchor&#x27;</span>)</span><br><span class="line">    <span class="selector-tag">a</span><span class="selector-class">.headerlink</span></span><br><span class="line">      <span class="selector-pseudo">&amp;:after</span></span><br><span class="line">        <span class="keyword">@extend</span> <span class="selector-class">.fontawesomeIcon</span></span><br><span class="line">        <span class="attribute">float</span>: right</span><br><span class="line">        <span class="attribute">color</span>: <span class="built_in">var</span>(--headline-presudo)</span><br><span class="line">        <span class="attribute">content</span>: <span class="string">&#x27;\f0c1&#x27;</span></span><br><span class="line">        <span class="attribute">font-size</span>: .<span class="number">95em</span></span><br><span class="line">        <span class="attribute">opacity</span>: <span class="number">0</span></span><br><span class="line">        <span class="attribute">transition</span>: all .<span class="number">3s</span></span><br><span class="line"></span><br><span class="line">      <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">        <span class="selector-pseudo">&amp;:after</span></span><br><span class="line">          <span class="attribute">color</span>: <span class="built_in">var</span>(--pseudo-hover)</span><br><span class="line"></span><br><span class="line">    <span class="selector-tag">h1</span>,</span><br><span class="line">    <span class="selector-tag">h2</span>,</span><br><span class="line">    <span class="selector-tag">h3</span>,</span><br><span class="line">    <span class="selector-tag">h4</span>,</span><br><span class="line">    <span class="selector-tag">h5</span>,</span><br><span class="line">    <span class="selector-tag">h6</span></span><br><span class="line">      <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">        <span class="selector-tag">a</span><span class="selector-class">.headerlink</span></span><br><span class="line">          <span class="selector-pseudo">&amp;:after</span></span><br><span class="line">            <span class="attribute">opacity</span>: <span class="number">1</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-tag">ol</span>,</span><br><span class="line">  <span class="selector-tag">ul</span></span><br><span class="line">    <span class="selector-tag">ol</span>,</span><br><span class="line">    <span class="selector-tag">ul</span></span><br><span class="line">      <span class="attribute">padding-left</span>: <span class="number">20px</span></span><br><span class="line"></span><br><span class="line">    <span class="selector-tag">li</span></span><br><span class="line">      <span class="attribute">margin</span>: <span class="number">4px</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="selector-tag">p</span></span><br><span class="line">      <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">8px</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;beautify.enable&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;beautify.field&#x27;</span>) == <span class="string">&#x27;site&#x27;</span></span><br><span class="line">      <span class="built_in">beautify</span>()</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;beautify.field&#x27;</span>) == <span class="string">&#x27;post&#x27;</span></span><br><span class="line">      &amp;<span class="selector-class">.post-content</span></span><br><span class="line">        <span class="built_in">beautify</span>()</span><br><span class="line"></span><br><span class="line">  &gt; <span class="selector-pseudo">:last-child</span></span><br><span class="line">    <span class="attribute">margin-bottom</span>: <span class="number">0</span> <span class="meta">!important</span></span><br><span class="line"></span><br><span class="line"><span class="selector-id">#post</span></span><br><span class="line">  <span class="selector-class">.tag_share</span></span><br><span class="line">    <span class="selector-class">.post-meta</span></span><br><span class="line">      &amp;__tag-list</span><br><span class="line">        <span class="attribute">display</span>: inline-block</span><br><span class="line"></span><br><span class="line">      &amp;__tags</span><br><span class="line">        <span class="attribute">display</span>: inline-block</span><br><span class="line">        <span class="attribute">margin</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span></span><br><span class="line">        <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">12px</span></span><br><span class="line">        <span class="attribute">width</span>: fit-content</span><br><span class="line">        <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="variable">$light</span>-blue</span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">12px</span></span><br><span class="line">        <span class="attribute">color</span>: <span class="variable">$light</span>-blue</span><br><span class="line">        <span class="attribute">font-size</span>: .<span class="number">85em</span></span><br><span class="line">        <span class="attribute">transition</span>: all .<span class="number">2s</span> ease-in-out</span><br><span class="line"></span><br><span class="line">        <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">          <span class="attribute">background</span>: <span class="variable">$light</span>-blue</span><br><span class="line">          <span class="attribute">color</span>: <span class="built_in">var</span>(--white)</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.post_share</span></span><br><span class="line">      <span class="attribute">display</span>: inline-block</span><br><span class="line">      <span class="attribute">float</span>: right</span><br><span class="line">      <span class="attribute">margin</span>: <span class="number">8px</span> <span class="number">0</span></span><br><span class="line">      <span class="attribute">width</span>: fit-content</span><br><span class="line"></span><br><span class="line">      <span class="selector-class">.social-share</span></span><br><span class="line">        <span class="attribute">font-size</span>: .<span class="number">85em</span></span><br><span class="line"></span><br><span class="line">        <span class="selector-class">.social-share-icon</span></span><br><span class="line">          <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">4px</span></span><br><span class="line">          <span class="attribute">width</span>: w = <span class="number">1.85em</span></span><br><span class="line">          <span class="attribute">height</span>: w</span><br><span class="line">          <span class="attribute">font-size</span>: <span class="number">1.2em</span></span><br><span class="line">          <span class="attribute">line-height</span>: w</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.post-copyright</span></span><br><span class="line">    <span class="attribute">position</span>: relative</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">40px</span> <span class="number">0</span> <span class="number">10px</span></span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">10px</span> <span class="number">16px</span></span><br><span class="line">    <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--light-grey)</span><br><span class="line">    <span class="attribute">transition</span>: box-shadow .<span class="number">3s</span> ease-in-out</span><br><span class="line">    <span class="attribute">overflow</span>: hidden</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">12px</span><span class="meta">!important</span></span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">linear-gradient</span>(<span class="number">45deg</span>, <span class="number">#f6d8f5</span>, <span class="number">#c2f1f0</span>, <span class="number">#f0debf</span>);</span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">      <span class="attribute">background</span> <span class="built_in">var</span>(--heo-post-blockquote-bg)</span><br><span class="line">      <span class="attribute">position</span> absolute</span><br><span class="line">      <span class="attribute">right</span> -<span class="number">26px</span></span><br><span class="line">      <span class="attribute">top</span> -<span class="number">120px</span></span><br><span class="line">      <span class="attribute">content</span> <span class="string">&#x27;\f25e&#x27;</span></span><br><span class="line">      <span class="attribute">font-size</span> <span class="number">200px</span></span><br><span class="line">      <span class="attribute">font-family</span> <span class="string">&#x27;Font Awesome 5 Brands&#x27;</span></span><br><span class="line">      <span class="attribute">opacity</span> .<span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">      <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">8px</span> <span class="number">0</span> <span class="built_in">rgba</span>(<span class="number">232</span>, <span class="number">237</span>, <span class="number">250</span>, .<span class="number">6</span>), <span class="number">0</span> <span class="number">2px</span> <span class="number">4px</span> <span class="number">0</span> <span class="built_in">rgba</span>(<span class="number">232</span>, <span class="number">237</span>, <span class="number">250</span>, .<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.post-copyright</span></span><br><span class="line">      &amp;-meta</span><br><span class="line">        <span class="attribute">color</span>: <span class="variable">$light</span>-blue</span><br><span class="line">        <span class="attribute">font-weight</span>: bold</span><br><span class="line"></span><br><span class="line">      &amp;-info</span><br><span class="line">        <span class="attribute">padding-left</span>: <span class="number">6px</span></span><br><span class="line"></span><br><span class="line">        <span class="selector-tag">a</span></span><br><span class="line">          <span class="attribute">text-decoration</span>: none</span><br><span class="line">          <span class="attribute">word-break</span>: break-word</span><br><span class="line"></span><br><span class="line">          <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">            <span class="attribute">text-decoration</span>: none</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.post-copyright-cc-info</span></span><br><span class="line">    <span class="attribute">color</span>: <span class="variable">$theme</span>-color;</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.post-outdate-notice</span></span><br><span class="line">    <span class="attribute">position</span>: relative</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">20px</span></span><br><span class="line">    <span class="attribute">padding</span>: .<span class="number">5em</span> <span class="number">1.2em</span></span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">3px</span></span><br><span class="line">    <span class="attribute">background-color</span>: <span class="variable">$noticeOutdate</span>-bg</span><br><span class="line">    <span class="attribute">color</span>: <span class="variable">$noticeOutdate</span>-color</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;noticeOutdate.style&#x27;</span>) == <span class="string">&#x27;flat&#x27;</span></span><br><span class="line">      <span class="attribute">padding</span>: .<span class="number">5em</span> <span class="number">1em</span> .<span class="number">5em</span> <span class="number">2.6em</span></span><br><span class="line">      <span class="attribute">border-left</span>: <span class="number">5px</span> solid <span class="variable">$noticeOutdate</span>-border</span><br><span class="line"></span><br><span class="line">      <span class="selector-pseudo">&amp;:before</span></span><br><span class="line">        <span class="keyword">@extend</span> <span class="selector-class">.fontawesomeIcon</span></span><br><span class="line">        <span class="attribute">position</span>: absolute</span><br><span class="line">        <span class="attribute">top</span>: <span class="number">50%</span></span><br><span class="line">        <span class="attribute">left</span>: .<span class="number">9em</span></span><br><span class="line">        <span class="attribute">color</span>: <span class="variable">$noticeOutdate</span>-border</span><br><span class="line">        <span class="attribute">content</span>: <span class="string">&#x27;\f071&#x27;</span></span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">50%</span>)</span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.ads-wrap</span></span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">40px</span> <span class="number">0</span></span><br><span class="line"><span class="selector-class">.post-copyright-m-info</span></span><br><span class="line">  <span class="selector-class">.post-copyright-a</span>,</span><br><span class="line">  <span class="selector-class">.post-copyright-c</span>,</span><br><span class="line">  <span class="selector-class">.post-copyright-u</span></span><br><span class="line">    <span class="attribute">display</span> inline-block</span><br><span class="line">    <span class="attribute">width</span> fit-content</span><br><span class="line">    <span class="attribute">padding</span> <span class="number">2px</span> <span class="number">5px</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span></span><br><span class="line">  <span class="selector-id">#post</span></span><br><span class="line">    <span class="selector-class">.post-copyright</span></span><br><span class="line">      <span class="attribute">background</span> <span class="number">#07080a</span></span><br><span class="line">      <span class="attribute">text-shadow</span> <span class="number">#bfbeb8</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span></span><br><span class="line">      <span class="attribute">border</span> <span class="number">1px</span> solid <span class="built_in">rgb</span>(<span class="number">19</span> <span class="number">18</span> <span class="number">18</span> / <span class="number">35%</span>)</span><br><span class="line">      <span class="attribute">box-shadow</span> <span class="number">0</span> <span class="number">0</span> <span class="number">5px</span> <span class="built_in">var</span>(--theme-color)</span><br><span class="line">      <span class="attribute">animation</span> flashlight <span class="number">1s</span> linear infinite alternate</span><br><span class="line">  <span class="selector-class">.post-copyright-info</span></span><br><span class="line">    <span class="attribute">color</span> <span class="number">#e0e0e4</span></span><br><span class="line"></span><br><span class="line"><span class="selector-id">#post</span></span><br><span class="line">  <span class="selector-class">.post-copyright__title</span></span><br><span class="line">    <span class="attribute">font-size</span> <span class="number">22px</span></span><br><span class="line">  <span class="selector-class">.post-copyright__notice</span></span><br><span class="line">    <span class="attribute">font-size</span> <span class="number">15px</span></span><br><span class="line">  <span class="selector-class">.post-copyright</span></span><br><span class="line">    <span class="attribute">box-shadow</span> <span class="number">2px</span> <span class="number">2px</span> <span class="number">5px</span></span><br></pre></td></tr></table></figure></li><li><p>默认项的配置</p><ul><li><p>作者：<code>[BlogRoot]\_config.yml</code>中的<code>author</code>配置项</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Site</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">Akilarの糖果屋</span></span><br><span class="line"><span class="attr">subtitle:</span> <span class="string">Akilar.top</span></span><br><span class="line"><span class="attr">description:</span></span><br><span class="line"><span class="attr">keywords:</span></span><br><span class="line"><span class="attr">author:</span> <span class="string">Akilar</span> <span class="comment">#默认作者</span></span><br><span class="line"><span class="attr">language:</span> <span class="string">zh-CN</span></span><br><span class="line"><span class="attr">timezone:</span> <span class="string">&#x27;&#x27;</span></span><br></pre></td></tr></table></figure></li><li><p>许可协议：<code>[BlogRoot]\_config.butterfly.yml</code>中的<code>license</code>和<code>license_url</code>配置项</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">post_copyright:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">decode:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">license:</span> <span class="string">CC</span> <span class="string">BY-NC-SA</span> <span class="number">4.0</span></span><br><span class="line">  <span class="attr">license_url:</span> <span class="string">https://creativecommons.org/licenses/by-nc-sa/4.0/</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p>页面覆写配置项，修改对应文章的<code>front-matter</code></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Copyright-beautify # 文章名称</span><br><span class="line">date: 2021-03-02 13:52:46 # 文章发布日期</span><br><span class="line">updated: 2021-03-02 13:52:46 # 文章更新日期</span><br><span class="line">copyright<span class="emphasis">_author: Nesxc # 作者覆写</span></span><br><span class="line"><span class="emphasis">copyright_</span>url: https://www.nesxc.com/post/hexocc.html # 原文链接覆写</span><br><span class="line">license: # 许可协议名称覆写</span><br><span class="line"><span class="section">license<span class="emphasis">_url: # 许可协议链接覆写</span></span></span><br><span class="line"><span class="emphasis"><span class="section">---</span></span></span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="aplayer音乐播放器">aplayer音乐播放器</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://butterfly.js.org/posts/507c070f/">Butterfly添加全局吸底Aplayer教程</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://s1.vika.cn/space/2022/10/30/a6852252f405426b8e60d9e1132ed932" alt="image (1)"></p></div></div><p>注意：我这里只在某个页面引入音乐播放器，如果要引入全局吸底的播放器，请见上面的链接。</p><ol><li><p>在博客根目录<code>[BlogRoot]</code>下打开终端，运行以下指令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-tag-aplayer --save</span><br></pre></td></tr></table></figure></li><li><p>在网站配置文件<code>_config.yml</code>中修改<code>aplayer </code>配置项为：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 音乐插件</span></span><br><span class="line"><span class="attr">aplayer:</span> </span><br><span class="line">  <span class="attr">meting:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">asset_inject:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>中修改<code>aplayerInject</code>配置项为：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Inject the css and script (aplayer/meting)</span></span><br><span class="line"><span class="attr">aplayerInject:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">per_page:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure></li><li><p>在你想要加入音乐播放器的页面加入以下语句：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;aplayer-oSEOhviA&quot;</span> <span class="attr">class</span>=<span class="string">&quot;aplayer aplayer-tag-marker meting-tag-marker&quot;</span> <span class="attr">data-id</span>=<span class="string">&quot;4895239160&quot;</span> <span class="attr">data-server</span>=<span class="string">&quot;netease&quot;</span> <span class="attr">data-type</span>=<span class="string">&quot;playlist&quot;</span> <span class="attr">data-mode</span>=<span class="string">&quot;random&quot;</span> <span class="attr">data-autoplay</span>=<span class="string">&quot;false&quot;</span> <span class="attr">data-listmaxheight</span>=<span class="string">&quot;340px&quot;</span> <span class="attr">data-preload</span>=<span class="string">&quot;auto&quot;</span> <span class="attr">data-theme</span>=<span class="string">&quot;#e3f2f5&quot;</span> <span class="attr">data-volume</span>=<span class="string">&quot;0.4&quot;</span> <span class="attr">mutex</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br></pre></td></tr></table></figure><p>其中<code>data-id</code>为歌单ID可以换为你喜欢的歌曲，其他参数见详情页这里不再赘述！</p></li></ol>              </div>            </details><h2 id="顶部渐变条色加载条">顶部渐变条色加载条</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://www.chuckle.top/article/13d6481a.html">给Butterfly加上顶部加载条</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://s1.vika.cn/space/2022/10/30/2a5cb2eb271f4135aae2c0e7be580164" alt="image-20221030160812710"></p></div></div><ol><li><p>新建<code>[BlogRoot]\source\css\progress_bar.css</code>文件，写入以下内容（或者你在<code>[BlogRoot]\source\css\custom.css</code>直接加也行，最后在配置文件记得引入即可）</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.pace</span> &#123;</span><br><span class="line">    -webkit-<span class="attribute">pointer-events</span>: none;</span><br><span class="line">    <span class="attribute">pointer-events</span>: none;</span><br><span class="line">    -webkit-user-select: none;</span><br><span class="line">    -moz-user-select: none;</span><br><span class="line">    user-select: none;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">2000</span>;</span><br><span class="line">    <span class="attribute">position</span>: fixed;</span><br><span class="line">    <span class="attribute">margin</span>: auto;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">8px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">7rem</span>;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">#eaecf2</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">1px</span> <span class="number">#e3e8f7</span>;</span><br><span class="line">    <span class="attribute">overflow</span>: hidden</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.pace-inactive</span> <span class="selector-class">.pace-progress</span> &#123;</span><br><span class="line">    <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">transition</span>: .<span class="number">3s</span> ease-in</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.pace</span> <span class="selector-class">.pace-progress</span> &#123;</span><br><span class="line">    -webkit-<span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">    -moz-<span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">    -ms-<span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">    -o-<span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">    <span class="attribute">box-sizing</span>: border-box;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>: <span class="built_in">translate3d</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    -moz-<span class="attribute">transform</span>: <span class="built_in">translate3d</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    -ms-<span class="attribute">transform</span>: <span class="built_in">translate3d</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    -o-<span class="attribute">transform</span>: <span class="built_in">translate3d</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translate3d</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    <span class="attribute">max-width</span>: <span class="number">200px</span>;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">2000</span>;</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">    <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="comment">/* linear-gradient(to right, #3494e6, #ec6ead) */</span></span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">linear-gradient</span>(to right, <span class="number">#43cea2</span>, <span class="number">#3866ca</span>);</span><br><span class="line">    <span class="attribute">animation</span>: gradient <span class="number">2s</span> ease infinite;</span><br><span class="line">    <span class="attribute">background-size</span>: <span class="number">200%</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.pace</span><span class="selector-class">.pace-inactive</span> &#123;</span><br><span class="line">    <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">transition</span>: .<span class="number">3s</span>;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">8px</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>的<code>inject</code>配置项加入刚刚的css样式和必须的js依赖：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">xxx</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/css/progress_bar.css&quot;</span> <span class="string">media=&quot;defer&quot;</span> <span class="string">onload=&quot;this.media=&#x27;all&#x27;&quot;&gt;</span> </span><br><span class="line">  <span class="attr">bottom:</span> </span><br><span class="line">  <span class="bullet">-</span> <span class="string">xxx</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">async</span> <span class="string">src=&quot;//npm.elemecdn.com/pace-js@1.2.4/pace.min.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="Bilibili视频适配">Bilibili视频适配</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><p><img src="https://s1.vika.cn/space/2022/10/30/cb5ee923f1544e369c4b91fafa4919b9" alt="image"></p></div></div><ol><li><p>在<code>[BlogRoot]\source\css\custom.css</code>自定义样式的文件中引入如下代码（这是我的，你可以自行微调）：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*哔哩哔哩视频适配*/</span></span><br><span class="line"><span class="selector-class">.aspect-ratio</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">90%</span>;</span><br><span class="line">  <span class="attribute">height</span>: auto;</span><br><span class="line">  <span class="attribute">padding-bottom</span>: <span class="number">75%</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">3%</span> auto;</span><br><span class="line">  <span class="attribute">text-align</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.aspect-ratio</span> <span class="selector-tag">iframe</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">86%</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>直接复制插入你的 <code>md</code> 文章就行，修改里面的 <code>aid</code> 为你视频的 <code>AV</code>号：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">align</span>=<span class="string">center</span> <span class="attr">class</span>=<span class="string">&quot;aspect-ratio&quot;</span>&gt;</span></span></span><br><span class="line"><span class="code">    &lt;iframe src=&quot;https://player.bilibili.com/player.html?aid=474023258&amp;&amp;page=1&amp;as_wide=1&amp;high_quality=1&amp;danmaku=0&quot; </span></span><br><span class="line"><span class="code">    scrolling=&quot;no&quot; </span></span><br><span class="line"><span class="code">    border=&quot;0&quot; </span></span><br><span class="line"><span class="code">    frameborder=&quot;no&quot; </span></span><br><span class="line"><span class="code">    framespacing=&quot;0&quot; </span></span><br><span class="line"><span class="code">    high_quality=1</span></span><br><span class="line"><span class="code">    danmaku=1 </span></span><br><span class="line"><span class="code">    allowfullscreen=&quot;true&quot;&gt; </span></span><br><span class="line"><span class="code">    &lt;/iframe&gt;</span></span><br><span class="line"><span class="code">&lt;/div&gt;</span></span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="文章页局部-html-代码不渲染">文章页局部 html 代码不渲染</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>在你的 md 文章页中，部分内容不想经过 Hexo 渲染，则包一层 <code>raw</code> 标签：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#123;% raw %&#125;</span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;&quot;</span>&gt;</span></span>你的一些代码...<span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span>&gt;</span></span>你的一些代码...<span class="language-xml"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span><br><span class="line">&#123;% endraw %&#125;</span><br></pre></td></tr></table></figure><p>那么标签内的代码就不会被框架渲染了~</p>              </div>            </details><h2 id="文章H1-H6标题小风车转动效果">文章H1~H6标题小风车转动效果</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><div class="video"><video controls preload><source src='https://anzhiy.cn/video/风车样式效果预览.mp4' type='video/mp4'>Your browser does not support the video tag.</video></div></div></div><ol><li><p>修改主题配置文件<code>_config.butterfly.yml</code>文件的<code>beautify</code>配置项：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">beautify:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">field:</span> <span class="string">post</span> <span class="comment"># site/post</span></span><br><span class="line">  <span class="comment"># title-prefix-icon: &#x27;\f0c1&#x27; 原内容</span></span><br><span class="line">  <span class="attr">title-prefix-icon:</span> <span class="string">&#x27;\f863&#x27;</span></span><br><span class="line">  <span class="attr">title-prefix-icon-color:</span> <span class="string">&quot;#F47466&quot;</span></span><br></pre></td></tr></table></figure></li><li><p>在<code>[BlogRoot]\source\css\custom.css</code> 中加入以下代码，可以自己调节一下转速:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 文章页H1-H6图标样式效果 */</span></span><br><span class="line"><span class="comment">/* 控制风车转动速度 4s那里可以自己调节快慢 */</span></span><br><span class="line"><span class="selector-tag">h1</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-tag">h2</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-tag">h3</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-tag">h4</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-tag">h5</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-tag">h6</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  -webkit-<span class="attribute">animation</span>: ccc <span class="number">4s</span> linear infinite;</span><br><span class="line">  <span class="attribute">animation</span>: ccc <span class="number">4s</span> linear infinite;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 控制风车转动方向 -1turn 为逆时针转动，1turn 为顺时针转动，相同数字部分记得统一修改 */</span></span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> ccc &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>);</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-tag">to</span> &#123;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">1turn</span>);</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">1turn</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> ccc &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>);</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-tag">to</span> &#123;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">1turn</span>);</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">1turn</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* 设置风车颜色 */</span></span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h1</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#ef50a8</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: -<span class="number">1.55rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1.3rem</span>;</span><br><span class="line">  <span class="attribute">margin-top</span>: -<span class="number">0.23rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h2</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#fb7061</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: -<span class="number">1.35rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1.1rem</span>;</span><br><span class="line">  <span class="attribute">margin-top</span>: -<span class="number">0.12rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h3</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#ffbf00</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: -<span class="number">1.22rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">0.95rem</span>;</span><br><span class="line">  <span class="attribute">margin-top</span>: -<span class="number">0.09rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h4</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#a9e000</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: -<span class="number">1.05rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">0.8rem</span>;</span><br><span class="line">  <span class="attribute">margin-top</span>: -<span class="number">0.09rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h5</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#57c850</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: -<span class="number">0.9rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">0.7rem</span>;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">0rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h6</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#5ec1e0</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: -<span class="number">0.9rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">0.66rem</span>;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">0rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* s设置风车hover动效 6s那里可以自己调节快慢*/</span></span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h1</span><span class="selector-pseudo">:hover</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h2</span><span class="selector-pseudo">:hover</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h3</span><span class="selector-pseudo">:hover</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h4</span><span class="selector-pseudo">:hover</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h5</span><span class="selector-pseudo">:hover</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h6</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h1</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h2</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h3</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h4</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h5</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::before</span>,</span><br><span class="line"><span class="selector-id">#content-inner</span><span class="selector-class">.layout</span> <span class="selector-tag">h6</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line">  -webkit-<span class="attribute">animation</span>: ccc <span class="number">6s</span> linear infinite;</span><br><span class="line">  <span class="attribute">animation</span>: ccc <span class="number">6s</span> linear infinite;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>的<code>inject</code>配置项进行引入（不再赘述）。</p></li></ol>              </div>            </details><h2 id="挂绳小猫咪-tzy大佬">挂绳小猫咪(tzy大佬)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://tzy1997.com/articles/hexo1613/">请收下这只可爱的猫咪吧</a></p><div class="hide-block"><button type="button" class="hide-button" style="">效果预览    </button><div class="hide-content"><img src="https://tuchuang.voooe.cn/images/2022/12/30/imagef8df0534573a5d30.webp" style="zoom:50%;" /></div></div><ol><li><p>制作一个盛放内容的盒子，在<code>[BlogRoot]/node_modules/hexo-theme-butterfly/layout/includes/head.pug</code>(如果是<code>git clone</code> 安装在<code>[BlogRoot]/themes/butterfly/layout/includes/head.pug</code>)最后一行加入如下代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">#myscoll</span><br></pre></td></tr></table></figure><p>其实随便放在哪里都行，只要能加载出来就行</p></li><li><p>在<code>[BlogRoot]/node_modules/hexo-theme-butterfly/source/js</code>文件夹下新建一个<code>cat.js</code>，将以下代码复制到文件中。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">clientWidth</span> &gt; <span class="number">992</span>) &#123;</span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">getBasicInfo</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="comment">/* 窗口高度 */</span></span><br><span class="line">        <span class="keyword">var</span> <span class="title class_">ViewH</span> = $(<span class="variable language_">window</span>).<span class="title function_">height</span>();</span><br><span class="line">        <span class="comment">/* document高度 */</span></span><br><span class="line">        <span class="keyword">var</span> <span class="title class_">DocH</span> = $(<span class="string">&quot;body&quot;</span>)[<span class="number">0</span>].<span class="property">scrollHeight</span>;</span><br><span class="line">        <span class="comment">/* 滚动的高度 */</span></span><br><span class="line">        <span class="keyword">var</span> <span class="title class_">ScrollTop</span> = $(<span class="variable language_">window</span>).<span class="title function_">scrollTop</span>();</span><br><span class="line">        <span class="comment">/* 可滚动的高度 */</span></span><br><span class="line">        <span class="keyword">var</span> <span class="variable constant_">S_V</span> = <span class="title class_">DocH</span> - <span class="title class_">ViewH</span>;</span><br><span class="line">        <span class="keyword">var</span> <span class="title class_">Band</span>_H = <span class="title class_">ScrollTop</span> / (<span class="title class_">DocH</span> - <span class="title class_">ViewH</span>) * <span class="number">100</span>;</span><br><span class="line">        <span class="keyword">return</span> &#123;</span><br><span class="line">            <span class="title class_">ViewH</span>: <span class="title class_">ViewH</span>,</span><br><span class="line">            <span class="title class_">DocH</span>: <span class="title class_">DocH</span>,</span><br><span class="line">            <span class="title class_">ScrollTop</span>: <span class="title class_">ScrollTop</span>,</span><br><span class="line">            <span class="title class_">Band</span><span class="attr">_H</span>: <span class="title class_">Band</span>_H,</span><br><span class="line">            <span class="attr">S_V</span>: <span class="variable constant_">S_V</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">show</span>(<span class="params">basicInfo</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (basicInfo.<span class="property">ScrollTop</span> &gt; <span class="number">0.001</span>) &#123;</span><br><span class="line">            $(<span class="string">&quot;.neko&quot;</span>).<span class="title function_">css</span>(<span class="string">&#x27;display&#x27;</span>, <span class="string">&#x27;block&#x27;</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            $(<span class="string">&quot;.neko&quot;</span>).<span class="title function_">css</span>(<span class="string">&#x27;display&#x27;</span>, <span class="string">&#x27;none&#x27;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    (<span class="keyword">function</span> (<span class="params">$</span>) &#123;</span><br><span class="line">        $.fn.<span class="property">nekoScroll</span> = <span class="keyword">function</span> (<span class="params">option</span>) &#123;</span><br><span class="line">            <span class="keyword">var</span> defaultSetting = &#123;</span><br><span class="line">                <span class="attr">top</span>: <span class="string">&#x27;0&#x27;</span>,</span><br><span class="line">                <span class="attr">scroWidth</span>: <span class="number">6</span> + <span class="string">&#x27;px&#x27;</span>,</span><br><span class="line">                <span class="attr">z_index</span>: <span class="number">9999</span>,</span><br><span class="line">                <span class="attr">zoom</span>: <span class="number">0.9</span>,</span><br><span class="line">                <span class="attr">borderRadius</span>: <span class="number">5</span> + <span class="string">&#x27;px&#x27;</span>,</span><br><span class="line">                <span class="attr">right</span>: <span class="number">60</span> + <span class="string">&#x27;px&#x27;</span>,</span><br><span class="line">                <span class="comment">// 这里可以换为你喜欢的图片，例如我就换为了雪人，但是要抠图</span></span><br><span class="line">                <span class="attr">nekoImg</span>: <span class="string">&quot;https://bu.dusays.com/2022/07/20/62d812db74be9.png&quot;</span>,</span><br><span class="line">                <span class="attr">hoverMsg</span>: <span class="string">&quot;喵喵喵~&quot;</span>,</span><br><span class="line">                <span class="attr">color</span>: <span class="string">&quot;#6f42c1&quot;</span>,</span><br><span class="line">                <span class="attr">during</span>: <span class="number">500</span>,</span><br><span class="line">                <span class="attr">blog_body</span>: <span class="string">&quot;body&quot;</span>,</span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="keyword">var</span> setting = $.<span class="title function_">extend</span>(defaultSetting, option);</span><br><span class="line">            <span class="keyword">var</span> getThis = <span class="variable language_">this</span>.<span class="title function_">prop</span>(<span class="string">&quot;className&quot;</span>) !== <span class="string">&quot;&quot;</span> ? <span class="string">&quot;.&quot;</span> + <span class="variable language_">this</span>.<span class="title function_">prop</span>(<span class="string">&quot;className&quot;</span>) : <span class="variable language_">this</span>.<span class="title function_">prop</span>(<span class="string">&quot;id&quot;</span>) !== <span class="string">&quot;&quot;</span> ? <span class="string">&quot;#&quot;</span> +</span><br><span class="line">                <span class="variable language_">this</span>.<span class="title function_">prop</span>(<span class="string">&quot;id&quot;</span>) : <span class="variable language_">this</span>.<span class="title function_">prop</span>(<span class="string">&quot;nodeName&quot;</span>);</span><br><span class="line">            <span class="keyword">if</span> ($(<span class="string">&quot;.neko&quot;</span>).<span class="property">length</span> == <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="variable language_">this</span>.<span class="title function_">after</span>(<span class="string">&quot;&lt;div class=\&quot;neko\&quot; id=&quot;</span> + setting.<span class="property">nekoname</span> + <span class="string">&quot; data-msg=\&quot;&quot;</span> + setting.<span class="property">hoverMsg</span> + <span class="string">&quot;\&quot;&gt;&lt;/div&gt;&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">let</span> basicInfo = <span class="title function_">getBasicInfo</span>();</span><br><span class="line">            $(getThis)</span><br><span class="line">                .<span class="title function_">css</span>(&#123;</span><br><span class="line">                    <span class="string">&#x27;position&#x27;</span>: <span class="string">&#x27;fixed&#x27;</span>,</span><br><span class="line">                    <span class="string">&#x27;width&#x27;</span>: setting.<span class="property">scroWidth</span>,</span><br><span class="line">                    <span class="string">&#x27;top&#x27;</span>: setting.<span class="property">top</span>,</span><br><span class="line">                    <span class="string">&#x27;height&#x27;</span>: basicInfo.<span class="property">Band_H</span> * setting.<span class="property">zoom</span> * basicInfo.<span class="property">ViewH</span> * <span class="number">0.01</span> + <span class="string">&#x27;px&#x27;</span>,</span><br><span class="line">                    <span class="string">&#x27;z-index&#x27;</span>: setting.<span class="property">z_index</span>,</span><br><span class="line">                    <span class="string">&#x27;background-color&#x27;</span>: setting.<span class="property">bgcolor</span>,</span><br><span class="line">                    <span class="string">&quot;border-radius&quot;</span>: setting.<span class="property">borderRadius</span>,</span><br><span class="line">                    <span class="string">&#x27;right&#x27;</span>: setting.<span class="property">right</span>,</span><br><span class="line">                    <span class="string">&#x27;background-image&#x27;</span>: <span class="string">&#x27;url(&#x27;</span> + setting.<span class="property">scImg</span> + <span class="string">&#x27;)&#x27;</span>,</span><br><span class="line">                    <span class="string">&#x27;background-image&#x27;</span>: <span class="string">&#x27;-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent)&#x27;</span>, <span class="string">&#x27;border-radius&#x27;</span>: <span class="string">&#x27;2em&#x27;</span>,</span><br><span class="line">                    <span class="string">&#x27;background-size&#x27;</span>: <span class="string">&#x27;contain&#x27;</span></span><br><span class="line">                &#125;);</span><br><span class="line">            $(<span class="string">&quot;#&quot;</span> + setting.<span class="property">nekoname</span>)</span><br><span class="line">                .<span class="title function_">css</span>(&#123;</span><br><span class="line">                    <span class="string">&#x27;position&#x27;</span>: <span class="string">&#x27;fixed&#x27;</span>,</span><br><span class="line">                    <span class="string">&#x27;top&#x27;</span>: basicInfo.<span class="property">Band_H</span> * setting.<span class="property">zoom</span> * basicInfo.<span class="property">ViewH</span> * <span class="number">0.01</span> - <span class="number">50</span> + <span class="string">&#x27;px&#x27;</span>,</span><br><span class="line">                    <span class="string">&#x27;z-index&#x27;</span>: setting.<span class="property">z_index</span> * <span class="number">10</span>,</span><br><span class="line">                    <span class="string">&#x27;right&#x27;</span>: setting.<span class="property">right</span>,</span><br><span class="line">                    <span class="string">&#x27;background-image&#x27;</span>: <span class="string">&#x27;url(&#x27;</span> + setting.<span class="property">nekoImg</span> + <span class="string">&#x27;)&#x27;</span>,</span><br><span class="line">                &#125;);</span><br><span class="line">            <span class="title function_">show</span>(<span class="title function_">getBasicInfo</span>());</span><br><span class="line">            $(<span class="variable language_">window</span>)</span><br><span class="line">                .<span class="title function_">scroll</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="keyword">let</span> basicInfo = <span class="title function_">getBasicInfo</span>();</span><br><span class="line">                    <span class="title function_">show</span>(basicInfo);</span><br><span class="line">                    $(getThis)</span><br><span class="line">                        .<span class="title function_">css</span>(&#123;</span><br><span class="line">                            <span class="string">&#x27;position&#x27;</span>: <span class="string">&#x27;fixed&#x27;</span>,</span><br><span class="line">                            <span class="string">&#x27;width&#x27;</span>: setting.<span class="property">scroWidth</span>,</span><br><span class="line">                            <span class="string">&#x27;top&#x27;</span>: setting.<span class="property">top</span>,</span><br><span class="line">                            <span class="string">&#x27;height&#x27;</span>: basicInfo.<span class="property">Band_H</span> * setting.<span class="property">zoom</span> * basicInfo.<span class="property">ViewH</span> * <span class="number">0.01</span> + <span class="string">&#x27;px&#x27;</span>,</span><br><span class="line">                            <span class="string">&#x27;z-index&#x27;</span>: setting.<span class="property">z_index</span>,</span><br><span class="line">                            <span class="string">&#x27;background-color&#x27;</span>: setting.<span class="property">bgcolor</span>,</span><br><span class="line">                            <span class="string">&quot;border-radius&quot;</span>: setting.<span class="property">borderRadius</span>,</span><br><span class="line">                            <span class="string">&#x27;right&#x27;</span>: setting.<span class="property">right</span>,</span><br><span class="line">                            <span class="string">&#x27;background-image&#x27;</span>: <span class="string">&#x27;url(&#x27;</span> + setting.<span class="property">scImg</span> + <span class="string">&#x27;)&#x27;</span>,</span><br><span class="line">                            <span class="string">&#x27;background-image&#x27;</span>: <span class="string">&#x27;-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent)&#x27;</span>, <span class="string">&#x27;border-radius&#x27;</span>: <span class="string">&#x27;2em&#x27;</span>,</span><br><span class="line">                            <span class="string">&#x27;background-size&#x27;</span>: <span class="string">&#x27;contain&#x27;</span></span><br><span class="line">                        &#125;);</span><br><span class="line">                    $(<span class="string">&quot;#&quot;</span> + setting.<span class="property">nekoname</span>)</span><br><span class="line">                        .<span class="title function_">css</span>(&#123;</span><br><span class="line">                            <span class="string">&#x27;position&#x27;</span>: <span class="string">&#x27;fixed&#x27;</span>,</span><br><span class="line">                            <span class="string">&#x27;top&#x27;</span>: basicInfo.<span class="property">Band_H</span> * setting.<span class="property">zoom</span> * basicInfo.<span class="property">ViewH</span> * <span class="number">0.01</span> - <span class="number">50</span> + <span class="string">&#x27;px&#x27;</span>,</span><br><span class="line">                            <span class="string">&#x27;z-index&#x27;</span>: setting.<span class="property">z_index</span> * <span class="number">10</span>,</span><br><span class="line">                            <span class="string">&#x27;right&#x27;</span>: setting.<span class="property">right</span>,</span><br><span class="line">                            <span class="string">&#x27;background-image&#x27;</span>: <span class="string">&#x27;url(&#x27;</span> + setting.<span class="property">nekoImg</span> + <span class="string">&#x27;)&#x27;</span>,</span><br><span class="line">                        &#125;);</span><br><span class="line">                    <span class="keyword">if</span> (basicInfo.<span class="property">ScrollTop</span> == basicInfo.<span class="property">S_V</span>) &#123;</span><br><span class="line">                        $(<span class="string">&quot;#&quot;</span> + setting.<span class="property">nekoname</span>)</span><br><span class="line">                            .<span class="title function_">addClass</span>(<span class="string">&quot;showMsg&quot;</span>)</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        $(<span class="string">&quot;#&quot;</span> + setting.<span class="property">nekoname</span>)</span><br><span class="line">                            .<span class="title function_">removeClass</span>(<span class="string">&quot;showMsg&quot;</span>);</span><br><span class="line">                        $(<span class="string">&quot;#&quot;</span> + setting.<span class="property">nekoname</span>)</span><br><span class="line">                            .<span class="title function_">attr</span>(<span class="string">&quot;data-msg&quot;</span>, setting.<span class="property">hoverMsg</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;);</span><br><span class="line">            <span class="variable language_">this</span>.<span class="title function_">click</span>(<span class="keyword">function</span> (<span class="params">e</span>) &#123;</span><br><span class="line">                btf.<span class="title function_">scrollToDest</span>(<span class="number">0</span>, <span class="number">500</span>)</span><br><span class="line">            &#125;);</span><br><span class="line">            $(<span class="string">&quot;#&quot;</span> + setting.<span class="property">nekoname</span>)</span><br><span class="line">                .<span class="title function_">click</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                    btf.<span class="title function_">scrollToDest</span>(<span class="number">0</span>, <span class="number">500</span>)</span><br><span class="line">                &#125;);</span><br><span class="line">            <span class="keyword">return</span> <span class="variable language_">this</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)(jQuery);</span><br><span class="line"></span><br><span class="line">    $(<span class="variable language_">document</span>).<span class="title function_">ready</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="comment">//部分自定义</span></span><br><span class="line">        $(<span class="string">&quot;#myscoll&quot;</span>).<span class="title function_">nekoScroll</span>(&#123;</span><br><span class="line">            <span class="attr">bgcolor</span>: <span class="string">&#x27;rgb(0 0 0 / .5)&#x27;</span>, <span class="comment">//背景颜色，没有绳子背景图片时有效</span></span><br><span class="line">            <span class="attr">borderRadius</span>: <span class="string">&#x27;2em&#x27;</span>,</span><br><span class="line">            <span class="attr">zoom</span>: <span class="number">0.9</span></span><br><span class="line">        &#125;</span><br><span class="line">        );</span><br><span class="line">        <span class="comment">//自定义（去掉以下注释，并注释掉其他的查看效果）</span></span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        $(&quot;#myscoll&quot;).nekoScroll(&#123;</span></span><br><span class="line"><span class="comment">            nekoname:&#x27;neko1&#x27;, //nekoname，相当于id</span></span><br><span class="line"><span class="comment">            nekoImg:&#x27;img/猫咪.png&#x27;, //neko的背景图片</span></span><br><span class="line"><span class="comment">            scImg:&quot;img/绳1.png&quot;, //绳子的背景图片</span></span><br><span class="line"><span class="comment">            bgcolor:&#x27;#1e90ff&#x27;, //背景颜色，没有绳子背景图片时有效</span></span><br><span class="line"><span class="comment">            zoom:0.9, //绳子长度的缩放值</span></span><br><span class="line"><span class="comment">            hoverMsg:&#x27;你好~喵&#x27;, //鼠标浮动到neko上方的对话框信息</span></span><br><span class="line"><span class="comment">            right:&#x27;100px&#x27;, //距离页面右边的距离</span></span><br><span class="line"><span class="comment">            fontFamily:&#x27;楷体&#x27;, //对话框字体</span></span><br><span class="line"><span class="comment">            fontSize:&#x27;14px&#x27;, //对话框字体的大小</span></span><br><span class="line"><span class="comment">            color:&#x27;#1e90ff&#x27;, //对话框字体颜色</span></span><br><span class="line"><span class="comment">            scroWidth:&#x27;8px&#x27;, //绳子的宽度</span></span><br><span class="line"><span class="comment">            z_index:100, //不用解释了吧</span></span><br><span class="line"><span class="comment">            during:1200, //从顶部到底部滑动的时长</span></span><br><span class="line"><span class="comment">        &#125;);</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在<code>[BlogRoot]/node_modules/hexo-theme-butterfly/source/css</code>文件夹下新建一个<code>cat.css</code>，将以下代码复制到文件中。当然你也可以选择不新建 css 文件，复制代码到<code>custom.css</code>也行，总之有地方引入就行。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="selector-tag">body</span>::-webkit-scrollbar &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.neko</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">64px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">64px</span>;</span><br><span class="line">    <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">&quot;https://bu.dusays.com/2022/07/20/62d812db74be9.png&quot;</span>);</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">32px</span>;</span><br><span class="line">    <span class="attribute">background-repeat</span>: no-repeat;</span><br><span class="line">    <span class="attribute">background-size</span>: contain;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">50%</span>);</span><br><span class="line">    <span class="attribute">cursor</span>: pointer;</span><br><span class="line">    <span class="attribute">font-family</span>: tzy;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">600</span>;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#6f42c1</span>;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.neko</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">100px</span>;</span><br><span class="line">    <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">&quot;https://bu.dusays.com/2022/07/20/62d812d95e6f5.png&quot;</span>);</span><br><span class="line">    <span class="attribute">background-size</span>: contain;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">9999</span>;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">50%</span>;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">100px</span>;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">115%</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.neko</span><span class="selector-class">.showMsg</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="built_in">attr</span>(data-msg);</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">    <span class="attribute">overflow</span>: hidden;</span><br><span class="line">    <span class="attribute">text-overflow</span>: ellipsis;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.neko</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="built_in">attr</span>(data-msg);</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">    <span class="attribute">overflow</span>: hidden;</span><br><span class="line">    <span class="attribute">text-overflow</span>: ellipsis;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.neko</span><span class="selector-class">.fontColor</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#333</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * @description: 滚动条样式  跟猫二选一</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">992px</span>) &#123;</span><br><span class="line">    ::-webkit-scrollbar &#123;</span><br><span class="line">        <span class="attribute">width</span>: <span class="number">8px</span> <span class="meta">!important</span>;</span><br><span class="line">        <span class="attribute">height</span>: <span class="number">8px</span> <span class="meta">!important</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    ::-webkit-scrollbar-track &#123;</span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">2em</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    ::-webkit-scrollbar-thumb &#123;</span><br><span class="line">        <span class="attribute">background-color</span>: <span class="built_in">rgb</span>(<span class="number">255</span> <span class="number">255</span> <span class="number">255</span> / .<span class="number">3</span>);</span><br><span class="line">        <span class="attribute">background-image</span>: <span class="built_in">-webkit-linear-gradient</span>(<span class="number">45deg</span>, <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.1</span>) <span class="number">25%</span>, transparent <span class="number">25%</span>, transparent <span class="number">50%</span>, <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.1</span>) <span class="number">50%</span>, <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.1</span>) <span class="number">75%</span>, transparent <span class="number">75%</span>, transparent);</span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">2em</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    ::-webkit-scrollbar-corner &#123;</span><br><span class="line">        <span class="attribute">background-color</span>: transparent</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在主题配置文件<code>_config.butterfly.yml</code>中引入<code>cat.js</code>和<code>cat.css</code>，当然还有在bottom的最前面引入<code>jQuery</code>，因为<code>cat.js</code>的语法依赖<code>jQuery</code>。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/css/cat.css&quot;&gt;</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">src=&quot;https://npm.elemecdn.com/jquery@latest/dist/jquery.min.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">data-pjax</span> <span class="string">src=&quot;/js/cat.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>最后重新编译运行即可看见效果。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="配置手机PC页面白天黑夜共四个背景图-店长">配置手机PC页面白天黑夜共四个背景图(店长)</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <p>详见：<a href="https://akilar.top/posts/23fdf850/">糖果屋微调合集</a></p><ol><li><p>首先是PC端的白天黑夜双背景，修改<code>[BlogRoot]\themes\butterfly\layout\includes\layout.pug</code></p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="addition">+ - var DefaultBg = page.defaultbg ? page.defaultbg : theme.background.default</span></span><br><span class="line"><span class="addition">+ - var DDMBg = theme.background.darkmode ? theme.background.darkmode : DefaultBg</span></span><br><span class="line"><span class="addition">+ - var DarkmodeBg = page.darkmodebg ? page.darkmodebg : DDMBg</span></span><br><span class="line">  if theme.background</span><br><span class="line">    #web_bg</span><br><span class="line"><span class="addition">+     if page.defaultbg || page.darkmodebg</span></span><br><span class="line"><span class="addition">+       style.</span></span><br><span class="line"><span class="addition">+         #web_bg&#123;</span></span><br><span class="line"><span class="addition">+           background: #&#123;DefaultBg&#125; !important;</span></span><br><span class="line"><span class="addition">+           background-attachment: local!important;</span></span><br><span class="line"><span class="addition">+           background-position: center!important;</span></span><br><span class="line"><span class="addition">+           background-size: cover!important;</span></span><br><span class="line"><span class="addition">+           background-repeat: no-repeat!important;</span></span><br><span class="line"><span class="addition">+         &#125;</span></span><br><span class="line"><span class="addition">+         [data-theme=&quot;dark&quot;]</span></span><br><span class="line"><span class="addition">+           #web_bg&#123;</span></span><br><span class="line"><span class="addition">+             background: #&#123;DarkmodeBg&#125; !important;</span></span><br><span class="line"><span class="addition">+             background-attachment: local!important;</span></span><br><span class="line"><span class="addition">+             background-position: center!important;</span></span><br><span class="line"><span class="addition">+             background-size: cover!important;</span></span><br><span class="line"><span class="addition">+             background-repeat: no-repeat!important;</span></span><br><span class="line"><span class="addition">+           &#125;</span></span><br></pre></td></tr></table></figure></li><li><p>再是实现手机端的白天黑夜双背景，在<code>[BlogRoot]\themes\butterfly\source\css\_layout</code>目录下新建一个<code>web-bg.styl</code>文件，写入以下内容：</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$web</span>-bg-night = <span class="built_in">hexo-config</span>(<span class="string">&#x27;background.darkmode&#x27;</span>) ? <span class="built_in">unquote</span>(<span class="built_in">hexo-config</span>(<span class="string">&#x27;background.darkmode&#x27;</span>)) : <span class="variable">$web</span>-bg</span><br><span class="line"><span class="variable">$mobile</span>-bg-day = <span class="built_in">hexo-config</span>(<span class="string">&#x27;background.mobileday&#x27;</span>) ? <span class="built_in">unquote</span>(<span class="built_in">hexo-config</span>(<span class="string">&#x27;background.mobileday&#x27;</span>)) : <span class="variable">$web</span>-bg</span><br><span class="line"><span class="variable">$mobile</span>-bg-night = <span class="built_in">hexo-config</span>(<span class="string">&#x27;background.mobilenight&#x27;</span>) ? <span class="built_in">unquote</span>(<span class="built_in">hexo-config</span>(<span class="string">&#x27;background.mobilenight&#x27;</span>)) : <span class="variable">$web</span>-bg-night</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span></span><br><span class="line">  <span class="selector-id">#web_bg</span></span><br><span class="line">    <span class="attribute">background</span>: <span class="variable">$web</span>-bg-night</span><br><span class="line">    <span class="attribute">background-attachment</span>: local</span><br><span class="line">    <span class="attribute">background-position</span>: center</span><br><span class="line">    <span class="attribute">background-size</span>: cover</span><br><span class="line">    <span class="attribute">background-repeat</span>: no-repeat</span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">800px</span>)</span><br><span class="line">  #web_bg</span><br><span class="line">    background: $mobile-bg-day !important</span><br><span class="line">    background-attachment: local !important</span><br><span class="line">    background-position: center !important</span><br><span class="line">    background-size: cover !important</span><br><span class="line">    background-repeat: no-repeat !important</span><br><span class="line">  [data-theme=&quot;dark&quot;]</span><br><span class="line">    #web_bg</span><br><span class="line">      background: $mobile-bg-night !important</span><br><span class="line">      background-attachment: local !important</span><br><span class="line">      background-position: center !important</span><br><span class="line">      background-size: cover !important</span><br><span class="line">      background-repeat: no-repeat !important</span><br></pre></td></tr></table></figure></li><li><p>然后还要修改一下<code>[BlogRoot]\themes\butterfly\source\css\var.styl</code>,大约35行的位置</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">  $text-line-height = 2</span><br><span class="line"><span class="deletion">- $web-bg = hexo-config(&#x27;background&#x27;) &amp;&amp; unquote(hexo-config(&#x27;background&#x27;))</span></span><br><span class="line"><span class="addition">+ $web-bg = hexo-config(&#x27;background.default&#x27;) &amp;&amp; unquote(hexo-config(&#x27;background.default&#x27;))</span></span><br><span class="line">  $index_top_img_height = hexo-config(&#x27;index_top_img_height&#x27;) ? convert(hexo-config(&#x27;index_top_img_height&#x27;)) : 100vh</span><br></pre></td></tr></table></figure></li><li><p>再修改一下配置项，在<code>[BlogRoot]/_config.butterfly.yml</code>中找到<code>background</code>配置项，内容改为：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Website Background (設置網站背景)</span></span><br><span class="line"><span class="comment"># can set it to color or image (可設置圖片 或者 顔色)</span></span><br><span class="line"><span class="comment"># The formal of image: url(http://xxxxxx.com/xxx.jpg)</span></span><br><span class="line"><span class="attr">background:</span></span><br><span class="line">  <span class="attr">default:</span>  <span class="comment">#【必选】默认背景</span></span><br><span class="line">  <span class="attr">darkmode:</span> <span class="comment">#【可选】PC端夜间模式背景</span></span><br><span class="line">  <span class="attr">mobileday:</span> <span class="comment">#【可选】移动端日间默认背景</span></span><br><span class="line">  <span class="attr">mobilenight:</span> <span class="comment">#【可选】移动端夜间模式背景</span></span><br></pre></td></tr></table></figure></li><li><p>当开了<code>Pjax</code>，还要再把<code>#web_bg</code>加到<code>pjax</code>选择器中。修改<code>[BlogRoot]\themes\butterfly\layout\includes\third-party\pjax.pug</code></p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">  script(src=url_for(theme.CDN.pjax))</span><br><span class="line">  script.</span><br><span class="line">    let pjaxSelectors = [</span><br><span class="line">      &#x27;title&#x27;,</span><br><span class="line">      &#x27;#config-diff&#x27;,</span><br><span class="line">      &#x27;#body-wrap&#x27;,</span><br><span class="line">      &#x27;#rightside-config-hide&#x27;,</span><br><span class="line">      &#x27;#rightside-config-show&#x27;,</span><br><span class="line"><span class="addition">+     &#x27;#web_bg&#x27;,</span></span><br><span class="line">      &#x27;.js-pjax&#x27;</span><br><span class="line">    ]</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="每页单独配置背景（店长）">每页单独配置背景（店长）</h2><details class="folding-tag" cyan><summary> 点击查看教程 </summary>              <div class='content'>              <div class="note info modern"><p><code>Butterfly</code>使用<code>id</code>为<code>web_bg</code>的<code>div</code>(以下简称<code>#web_bg</code>)来挂载背景图片，而背景图片是使用的<code>#web_bg</code>的<code>background</code>属性来配置,所以只需要改动这个css属性就可以。例如直接在md页面加入这样一条自定义样式。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;% raw %&#125;</span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span></span><br><span class="line"><span class="section">#web<span class="emphasis">_bg&#123;</span></span></span><br><span class="line"><span class="emphasis"><span class="section">  background: url(/img/newbg.png)!important;</span></span></span><br><span class="line"><span class="emphasis"><span class="section">  /*重新定义background会导致原有定位属性失效，所以也需要再声明一次加权的定位属性*/</span></span></span><br><span class="line"><span class="emphasis"><span class="section">  background-position: center !important;</span></span></span><br><span class="line"><span class="emphasis"><span class="section">  background-size: cover !important;</span></span></span><br><span class="line"><span class="emphasis"><span class="section">  background-repeat: no-repeat !important;</span></span></span><br><span class="line"><span class="emphasis"><span class="section">&#125;</span></span></span><br><span class="line"><span class="emphasis"><span class="section"><span class="language-xml"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span></span></span></span><br><span class="line"><span class="emphasis"><span class="section">&#123;% endraw %&#125;</span></span></span><br></pre></td></tr></table></figure><p>而更好的方案自然是在<code>front-matter</code>中通过新增一个<code>background</code>配置项来配置页面背景。</p><p>注意：此魔改可能和<code>配置手机PC页面白天黑夜共四个背景图</code>冲突，最好不要同时改！</p></div><ol><li><p>修改<code>[BlogRoot]\themes\butterfly\layout\includes\layout.pug</code></p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">  if theme.background</span><br><span class="line"><span class="deletion">-   #web_bg</span></span><br><span class="line"><span class="addition">+   if page.background</span></span><br><span class="line"><span class="addition">+     #web_bg(style=`background:`+ page.background + `;background-attachment: local;background-position: center;background-size: cover;background-repeat: no-repeat;`)</span></span><br><span class="line"><span class="addition">+   else</span></span><br><span class="line"><span class="addition">+     #web_bg</span></span><br></pre></td></tr></table></figure></li><li><p>如此即可在每个页面的<code>markdown</code>文件的<code>front-matter</code>中使用<code>background</code>配置项单独配置页面背景了,不写或留空则使用主题配置文件中的默认背景。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 糖果屋微调合集</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">cover: &#x27;https://npm.elemecdn.com/akilar-candyassets/image/20201115152231.png&#x27;</span></span><br><span class="line"><span class="emphasis">background: url(https://npm.elemecdn.com/akilar-candyassets/image/index.webp)</span></span><br><span class="line"><span class="emphasis">description: 将本站针对butterfly主题的亿点点小改动做个集锦。</span></span><br><span class="line"><span class="emphasis">---</span></span><br></pre></td></tr></table></figure></li><li><p>当开了<code>Pjax</code>，还要再把<code>#web_bg</code>加到<code>pjax</code>选择器中。修改<code>[BlogRoot]\themes\butterfly\layout\includes\third-party\pjax.pug</code></p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">  script(src=url_for(theme.CDN.pjax))</span><br><span class="line">  script.</span><br><span class="line">    let pjaxSelectors = [</span><br><span class="line">      &#x27;title&#x27;,</span><br><span class="line">      &#x27;#config-diff&#x27;,</span><br><span class="line">      &#x27;#body-wrap&#x27;,</span><br><span class="line">      &#x27;#rightside-config-hide&#x27;,</span><br><span class="line">      &#x27;#rightside-config-show&#x27;,</span><br><span class="line"><span class="addition">+     &#x27;#web_bg&#x27;,</span></span><br><span class="line">      &#x27;.js-pjax&#x27;</span><br><span class="line">    ]</span><br></pre></td></tr></table></figure></li></ol>              </div>            </details><h2 id="🍕🍕🍕写在最后">🍕🍕🍕写在最后</h2><ul><li><p>大家有啥教程想看的可以在评论区留言，如果搭建或者魔改过程中遇到不懂的可以加下面的群讨论，同时本人在B站有空也会做一些魔改系列的视频教程，点这里可以进入我的B站账号个人空间<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a></p>  <img src="https://s1.vika.cn/space/2022/11/04/0bd8a1a7e8f64d6a8248d1d872c5a178" alt="二维码" style="zoom:50%;" /></li></ul>]]></content>
    
    
    <summary type="html">🍚这是博客魔改教程总结的第二期</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
  <entry>
    <title>Hexo博客搭建基础教程(三)</title>
    <link href="https://www.fomal.cc/posts/3451f874.html"/>
    <id>https://www.fomal.cc/posts/3451f874.html</id>
    <published>2022-10-28T13:00:00.000Z</published>
    <updated>2022-10-28T13:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>前言📝</b></font></p><p>参考：<a href="https://tzy1997.com/articles/hexo1605/">基于 Hexo 从零开始搭建个人博客（五）</a>、<a href="https://butterfly.js.org/posts/4aa8abbe/">Butterfly 安装文档(三) 主题配置-1</a>、<a href="https://butterfly.js.org/posts/ceeb73f/">Butterfly 安装文档(四) 主题配置-2</a><br>阅读本篇前，请先阅读前面的文章：<a href="https://www.fomal.cc/posts/e593433d.html">Hexo 博客搭建基础教程 (一)</a>、<a href="https://www.fomal.cc/posts/4aa2d85f.html">Hexo 博客搭建基础教程 (二)</a><br>视频教程会同步至在我的B站账号<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a><br>注意：我的博客根目录路径为 【C:/Hexo-Blog/blog-demo】，下文所说的根目录都是此路径，将用[BlogRoot]代替。<br>修改站点配置文件<code>_config.yml</code>，路径为<code>[BlogRoot]\_config.yml</code><br>修改主题配置文件<code>_config.butterfly.yml</code>，路径为<code>[BlogRoot]\_config.butterfly.yml</code></p><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a> ⇦当前位置🪂</li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="1-前言">1.前言</h2><ol><li>博客搭建过程遇到任何问题，优先在本页面搜索，检查是否已经有该配置教程。</li><li>遇到问题可以优先在文章评论区留言，注意留言时请填写正确的邮箱以确保能收到站长的回复。</li><li>实在解决不了的问题可添加站长的微信进行交流，备注自己的个人信息。</li></ol><h2 id="2-语言">2.语言</h2><p>修改站点配置文件<code>_config.yml</code>，默认语言是 en 。<br>主题支持三种语言：</p><ul><li>default(en)</li><li>zh-CN (简体中文)</li><li>zh-TW (繁体中文)</li></ul><h2 id="3-网站资料">3.网站资料</h2><p>修改网站各种资料，例如标题、副标题和邮箱等个人资料，请修改站点配置文件<code>_config.yml</code>。部分参数如下，详细参数可参考官方的<a href="https://hexo.io/zh-cn/docs/configuration">配置描述</a>。</p><table><thead><tr><th style="text-align:center">参数</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">title</td><td style="text-align:center">网站标题</td></tr><tr><td style="text-align:center">subtitle</td><td style="text-align:center">描述</td></tr><tr><td style="text-align:center">description</td><td style="text-align:center">网站描述</td></tr><tr><td style="text-align:center">keywords</td><td style="text-align:center">网站的关键词。支持多个关键词</td></tr><tr><td style="text-align:center">author</td><td style="text-align:center">您的名字</td></tr><tr><td style="text-align:center">language</td><td style="text-align:center">网站使用的语言。对于简体中文用户来说，使用不同的主题可能需要设置成不同的值，请参考你的主题的文档自行设置，常见的有 zh-Hans和 zh-CN。</td></tr><tr><td style="text-align:center">timezone</td><td style="text-align:center">网站时区。Hexo 默认使用您电脑的时区。请参考 时区列表 进行设置，如 America/New_York, Japan, 和 UTC 。一般的，对于中国大陆地区可以使用 Asia/Shanghai</td></tr></tbody></table><h2 id="4-导航菜单">4.导航菜单</h2><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">menu:</span></span><br><span class="line">  <span class="attr">Home:</span> <span class="string">/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-home</span></span><br><span class="line">  <span class="attr">Archives:</span> <span class="string">/archives/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-archive</span></span><br><span class="line">  <span class="attr">Tags:</span> <span class="string">/tags/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-tags</span></span><br><span class="line">  <span class="attr">Categories:</span> <span class="string">/categories/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-folder-open</span></span><br><span class="line">  <span class="string">List||fas</span> <span class="attr">fa-list:</span></span><br><span class="line">    <span class="attr">Music:</span> <span class="string">/music/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-music</span></span><br><span class="line">    <span class="attr">Movie:</span> <span class="string">/movies/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-video</span></span><br><span class="line">  <span class="attr">Link:</span> <span class="string">/link/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-link</span></span><br><span class="line">  <span class="attr">About:</span> <span class="string">/about/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-heart</span></span><br></pre></td></tr></table></figure><ul><li><p>必须是 <code>/xxx/</code>，后面<code>||</code>分开，然后写图标名，如果不想显示图标，图标名可不写</p></li><li><p>若主题版本大于 v4.0.0，可以直接在子目录里添加 hide 隐藏子目录，如下面的List</p></li></ul><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">menu:</span></span><br><span class="line">  <span class="attr">Home:</span> <span class="string">/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-home</span></span><br><span class="line">  <span class="attr">Archives:</span> <span class="string">/archives/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-archive</span></span><br><span class="line">  <span class="attr">Tags:</span> <span class="string">/tags/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-tags</span></span><br><span class="line">  <span class="attr">Categories:</span> <span class="string">/categories/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-folder-open</span></span><br><span class="line">  <span class="string">List||fas</span> <span class="string">fa-list||hide:</span></span><br><span class="line">   <span class="attr">Music:</span> <span class="string">/music/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-music</span></span><br><span class="line">    <span class="attr">Movie:</span> <span class="string">/movies/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-video</span></span><br><span class="line">  <span class="attr">Link:</span> <span class="string">/link/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-link</span></span><br><span class="line">  <span class="attr">About:</span> <span class="string">/about/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-heart</span></span><br></pre></td></tr></table></figure><ul><li>文字可自行更改，中英文都可以</li></ul><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">menu:</span></span><br><span class="line">  <span class="string">首页:</span> <span class="string">/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-home</span></span><br><span class="line">  <span class="string">时间轴:</span> <span class="string">/archives/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-archive</span></span><br><span class="line">  <span class="string">标签:</span> <span class="string">/tags/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-tags</span></span><br><span class="line">  <span class="string">分类:</span> <span class="string">/categories/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-folder-open</span></span><br><span class="line">  <span class="string">清单||fa</span> <span class="attr">fa-heartbeat:</span></span><br><span class="line">    <span class="string">音乐:</span> <span class="string">/music/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-music</span></span><br><span class="line">    <span class="string">照片:</span> <span class="string">/Gallery/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-images</span></span><br><span class="line">    <span class="string">电影:</span> <span class="string">/movies/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-video</span></span><br><span class="line">  <span class="string">友链:</span> <span class="string">/link/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-link</span></span><br><span class="line">  <span class="string">关于:</span> <span class="string">/about/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-heart</span></span><br></pre></td></tr></table></figure><p>最终效果如下图所示：</p><p><img src="https://s1.vika.cn/space/2022/10/29/08530571ff2f44c3b7419bfdbf66f8c6" alt="image-20221029173243861"></p><h2 id="5-代码">5.代码</h2><h3 id="5-1-代码高亮主题">5.1 代码高亮主题</h3><p>Butterfly支持 6 种代码高亮样式：</p><ul><li>darker</li><li>pale night</li><li>light</li><li>ocean</li><li>mac</li><li>mac light</li></ul><p>修改主题配置文件<code>_config.butterfly.yml</code>。中的<code>highlight_theme</code>属性。</p><div class="tabs" id="代码高亮主题"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#代码高亮主题-1">darker</button></li><li class="tab"><button type="button" data-href="#代码高亮主题-2">pale night</button></li><li class="tab"><button type="button" data-href="#代码高亮主题-3">light</button></li><li class="tab"><button type="button" data-href="#代码高亮主题-4">ocean</button></li><li class="tab"><button type="button" data-href="#代码高亮主题-5">mac</button></li><li class="tab"><button type="button" data-href="#代码高亮主题-6">mac light</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="代码高亮主题-1"><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">darker</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/05/31/62962018a84e7.webp" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="代码高亮主题-2"><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">pale</span> <span class="string">night</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/05/31/62961859b9e8c.webp" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="代码高亮主题-3"><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">light</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/05/31/629617b3de088.webp" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="代码高亮主题-4"><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">ocean</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/05/31/6296188b7c513.webp" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="代码高亮主题-5"><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">mac</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/05/31/629618f4b4847.webp" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="代码高亮主题-6"><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">mac</span> <span class="string">light</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/05/31/629618cb37ff7.webp" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="5-2-代码复制">5.2 代码复制</h3><p>修改主题配置文件<code>_config.butterfly.yml</code>中的<code>highlight_copy</code>属性，<code>true</code>表示可以复制。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_copy:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p><img src="https://s1.vika.cn/space/2022/10/29/af884592171e423c9be632b82932d9d1" alt="image-20221029173420960"></p><h3 id="5-3-代码框展开-关闭">5.3 代码框展开/关闭</h3><p>修改主题配置文件<code>_config.butterfly.yml</code>。中的<code>highlight_shrink</code>属性。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_shrink:</span> <span class="literal">true</span> <span class="comment">#代码框不展开，需点击 &#x27;&gt;&#x27; 打开</span></span><br></pre></td></tr></table></figure><p>在默认情况下，代码框自动展开，可设置是否所有代码框都关闭状态，点击&gt;可展开代码。</p><ul><li>true 全部代码框不展开，需点击&gt;打开</li><li>false 代码框展开，有&gt;点击按钮</li><li>none 不显示&gt;按钮</li></ul><p><img src="https://s1.vika.cn/space/2022/10/29/fd17fb642e08403bae6554df4ae714f0" alt="image-20221029173458309"></p><h3 id="5-4-代码换行">5.4 代码换行</h3><p>在默认情况下，Hexo 在编译的时候不会实现代码自动换行。如果你不希望在代码块的区域里有横向滚动条的话，那么你可以考虑开启这个功能。</p><p>修改主题配置文件<code>_config.butterfly.yml</code>。中的<code>code_word_wrap</code>属性。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">code_word_wrap:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="5-5-代码高度限制">5.5 代码高度限制</h3><p>可配置代码高度限制，超出的部分会隐藏，并显示展开按钮。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_height_limit:</span> <span class="literal">false</span> <span class="comment"># unit: px</span></span><br></pre></td></tr></table></figure><ol><li>单位是<code>px</code>，直接添加数字，如 200</li><li>实际限制高度为<code>highlight_height_limit + 30 px</code> ，多增加 30px 限制，目的是避免代码高度只超出highlight_height_limit 一点时，出现展开按钮，展开没内容。</li><li>不适用于隐藏后的代码块（ css 设置 <code>display: none</code>）。</li></ol><img src="https://s1.vika.cn/space/2022/10/29/86c397c8ec81428dadfb059b92716334" alt="image-20221029173522172" style="zoom:50%;" /><h2 id="6-社交图标">6.社交图标</h2><p><code>Butterfly</code>支持<a href="https://fontawesome.com/icons?from=io">font-awesome v6</a>图标。</p><p>书写格式：<code>图标名：url || 描述性文字</code>。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">social:</span></span><br><span class="line">  <span class="attr">fab fa-github:</span> <span class="string">https://github.com/xxxxx</span> <span class="string">||</span> <span class="string">Github</span></span><br><span class="line">  <span class="attr">fas fa-envelope:</span> <span class="string">mailto:xxxxxx@gmail.com</span> <span class="string">||</span> <span class="string">Email</span></span><br></pre></td></tr></table></figure><p><img src="https://s1.vika.cn/space/2022/10/29/97e3e8b88a6b4c75b6d042a6aa481ab2" alt="image-20221029173631192"></p><h2 id="7-顶部图">7.顶部图</h2><p>如果不要显示顶部图，可直接配置 <code>disable_top_img: true</code>。</p><table><thead><tr><th>配置</th><th>解释</th></tr></thead><tbody><tr><td>index_img</td><td>主页的 top_img</td></tr><tr><td>default_top_img</td><td>默认的 top_img，当页面的 top_img 没有配置时，会显示 default_top_img</td></tr><tr><td>archive_img</td><td>归档页面的 top_img</td></tr><tr><td>tag_img</td><td>tag子页面 的 默认 top_img</td></tr><tr><td>tag_per_img</td><td>tag子页面的 top_img，可配置每个 tag 的 top_img</td></tr><tr><td>category_img</td><td>category 子页面 的 默认 top_img</td></tr><tr><td>category_per_img</td><td>category 子页面的 top_img，可配置每个 category 的 top_img</td></tr></tbody></table><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">index_img:</span> <span class="string">xxx.png</span></span><br></pre></td></tr></table></figure><p>其它页面 （tags/categories/自建页面）和文章页的<code>top_img</code>，请到对应的 md 页面设置<code>front-matter</code>中的<code>top_img</code>。</p><h2 id="8-文章置顶与封面">8.文章置顶与封面</h2><ol><li><p>你可以直接在文章的<code>front-matter</code>区域里添加<code>sticky: 1</code>属性来把这篇文章置顶。数值越大，置顶的优先级越大。</p></li><li><p>文章的markdown文档上，在<code>Front-matter</code>添加<code>cover</code>，并填上要显示的图片地址。如果不配置<code>cover</code>，可以设置显示默认的<code>cover</code>；如果不想在首页显示cover，可以设置为<code>false</code>。<br>修改主题配置文件<code>_config.butterfly.yml</code>。</p> <figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">cover:</span></span><br><span class="line">  <span class="comment"># 是否显示文章封面</span></span><br><span class="line">  <span class="attr">index_enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">aside_enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">archives_enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 封面显示的位置</span></span><br><span class="line">  <span class="comment"># 三个值可配置 left , right , both</span></span><br><span class="line">  <span class="attr">position:</span> <span class="string">both</span></span><br><span class="line">  <span class="comment"># 当没有设置cover时，默认的封面显示</span></span><br><span class="line">  <span class="attr">default_cover:</span> </span><br></pre></td></tr></table></figure><p>当配置多张图片时，会随机选择一张作为cover，此时写法应为：</p> <figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">default_cover:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">https://cdn.jsdelivr.net/gh/jerryc127/CDN@latest/cover/default_bg.png</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">https://cdn.jsdelivr.net/gh/jerryc127/CDN@latest/cover/default_bg2.png</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">https://cdn.jsdelivr.net/gh/jerryc127/CDN@latest/cover/default_bg3.png</span></span><br></pre></td></tr></table></figure></li></ol><p><img src="https://s1.vika.cn/space/2022/10/29/e9c6f655967b483690c4b8f8fd24b904" alt="image-20221029173703144"></p><h2 id="9-文章页相关配置">9.文章页相关配置</h2><h3 id="9-1-文章meta显示">9.1 文章meta显示</h3><p><code>post_meta</code>这个属性用于显示文章的相关信息的，修改主题配置文件<code>_config.butterfly.yml</code>。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">post_meta:</span></span><br><span class="line">  <span class="attr">page:</span></span><br><span class="line">    <span class="attr">date_type:</span> <span class="string">both</span> <span class="comment"># created or updated or both 主页文章日期是创建日或者更新日或都显示</span></span><br><span class="line">    <span class="attr">date_format:</span> <span class="string">relative</span> <span class="comment"># date/relative 显示日期还是相对日期</span></span><br><span class="line">    <span class="attr">categories:</span> <span class="literal">true</span> <span class="comment"># true or false 主页是否显示分类</span></span><br><span class="line">    <span class="attr">tags:</span> <span class="literal">true</span> <span class="comment"># true or false 主页是否显示标签</span></span><br><span class="line">    <span class="attr">label:</span> <span class="literal">true</span> <span class="comment"># true or false 显示描述性文字</span></span><br><span class="line">  <span class="attr">post:</span></span><br><span class="line">    <span class="attr">date_type:</span> <span class="string">both</span> <span class="comment"># created or updated or both 文章页日期是创建日或者更新日或都显示</span></span><br><span class="line">    <span class="attr">date_format:</span> <span class="string">relative</span> <span class="comment"># date/relative 显示日期还是相对日期</span></span><br><span class="line">    <span class="attr">categories:</span> <span class="literal">true</span> <span class="comment"># true or false 文章页是否显示分类</span></span><br><span class="line">    <span class="attr">tags:</span> <span class="literal">true</span> <span class="comment"># true or false 文章页是否显示标签</span></span><br><span class="line">    <span class="attr">label:</span> <span class="literal">true</span> <span class="comment"># true or false 显示描述性文字</span></span><br></pre></td></tr></table></figure><h3 id="9-2-文章版权和协议许可">9.2 文章版权和协议许可</h3><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">post_copyright:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">decode:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">author_href:</span></span><br><span class="line">  <span class="attr">license:</span> <span class="string">CC</span> <span class="string">BY-NC-SA</span> <span class="number">4.0</span></span><br><span class="line">  <span class="attr">license_url:</span> <span class="string">https://creativecommons.org/licenses/by-nc-sa/4.0/</span></span><br></pre></td></tr></table></figure><p>由于<code>Hexo 4.1</code>开始，默认对网址进行解码，以至于如果是中文网址，会被解码，可设置<code>decode: true</code>来显示中文网址。如果有文章（例如：转载文章）不需要显示版权，可以在文章页<code>Front-matter</code>中单独设置。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">copyright:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>从<code>v3.0.0</code>开始，支持对单独文章设置版权信息，可以在文章Front-matter单独设置。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">post<span class="emphasis">_copyright:</span></span><br><span class="line"><span class="emphasis">copyright_</span>author: xxxx</span><br><span class="line">copyright<span class="emphasis">_author_</span>href: https://xxxxxx.com</span><br><span class="line">copyright<span class="emphasis">_url: https://xxxxxx.com</span></span><br><span class="line"><span class="emphasis">copyright_</span>info: 此文章版权归xxxxx所有，如有转载，请註明来自原作者</span><br></pre></td></tr></table></figure><p><img src="https://s1.vika.cn/space/2022/10/29/39720529b18d48258f6f575d9694b009" alt="image-20221029173741784"></p><h3 id="9-3-文章打赏">9.3 文章打赏</h3><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">reward:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">QR_code:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">img:</span> <span class="string">/img/wechat.jpg</span></span><br><span class="line">      <span class="attr">link:</span></span><br><span class="line">      <span class="attr">text:</span> <span class="string">wechat</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">img:</span> <span class="string">/img/alipay.jpg</span></span><br><span class="line">      <span class="attr">link:</span></span><br><span class="line">      <span class="attr">text:</span> <span class="string">alipay</span></span><br></pre></td></tr></table></figure><h3 id="9-4-文章目录TOC">9.4 文章目录TOC</h3><p>修改主题配置文件<code>_config.butterfly.yml</code>。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">toc:</span></span><br><span class="line">  <span class="attr">post:</span> <span class="literal">true</span> <span class="comment"># 文章页是否显示 TOC</span></span><br><span class="line">  <span class="attr">page:</span> <span class="literal">false</span> <span class="comment"># 普通页面是否显示 TOC</span></span><br><span class="line">  <span class="attr">number:</span> <span class="literal">true</span> <span class="comment"># 是否显示章节数</span></span><br><span class="line">  <span class="attr">expand:</span> <span class="literal">false</span><span class="comment"># 是否展开 TOC</span></span><br><span class="line">  <span class="attr">style_simple:</span> <span class="literal">false</span> <span class="comment"># for post 简洁模式（侧边栏只显示 TOC, 只对文章页有效 ）</span></span><br></pre></td></tr></table></figure><img src="https://s1.vika.cn/space/2022/10/29/b40a3447a5d043a5bf8623ecb2fe128a" alt="image-20221029173812311" style="zoom:50%;" /><h3 id="9-5-相关文章推荐">9.5 相关文章推荐</h3><p>相关文章推荐的原理是根据文章tags的比重来推荐，修改主题配置文件<code>_config.butterfly.yml</code>。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">related_post:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">limit:</span> <span class="number">6</span> <span class="comment"># 显示推荐文章数目</span></span><br><span class="line">  <span class="attr">date_type:</span> <span class="string">created</span> <span class="comment"># or created or updated 文章日期显示创建日或者更新日</span></span><br></pre></td></tr></table></figure><h3 id="9-6-文章锚点">9.6 文章锚点</h3><p>开启文章锚点后，当你在文章页进行滚动时，文章链接会根据标题ID进行替换。</p><p>注意: 每替换一次，会留下一个歷史记录。所以如果一篇文章有很多锚点的话，网页的歷史记录会很多。</p><p>修改主题配置文件<code>_config.butterfly.yml</code>。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># anchor</span></span><br><span class="line"><span class="comment"># when you scroll in post , the url will update according to header id.</span></span><br><span class="line"><span class="attr">anchor:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="9-7-文章过期提醒">9.7 文章过期提醒</h3><p>可设置是否显示文章过期提醒，以更新时间为基准。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Displays outdated notice for a post (文章过期提醒)</span></span><br><span class="line"><span class="attr">noticeOutdate:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">style:</span> <span class="string">flat</span> <span class="comment"># style: simple/flat</span></span><br><span class="line">  <span class="attr">limit_day:</span> <span class="number">365</span> <span class="comment"># 距离更新时间多少天才显示文章过期提醒</span></span><br><span class="line">  <span class="attr">position:</span> <span class="string">top</span> <span class="comment"># position: top/bottom</span></span><br><span class="line">  <span class="attr">message_prev:</span> <span class="string">It</span> <span class="string">has</span> <span class="string">been</span> <span class="comment"># 天数之前的文字</span></span><br><span class="line">  <span class="attr">message_next:</span> <span class="string">days</span> <span class="string">since</span> <span class="string">the</span> <span class="string">last</span> <span class="string">update,</span> <span class="string">the</span> <span class="string">content</span> <span class="string">of</span> <span class="string">the</span> <span class="string">article</span> <span class="string">may</span> <span class="string">be</span> <span class="string">outdated.</span> <span class="comment"># 天数之后的文字</span></span><br></pre></td></tr></table></figure><h3 id="9-8-文章分页按钮">9.8 文章分页按钮</h3><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># post_pagination (分页)</span></span><br><span class="line"><span class="comment"># value: 1 || 2 || false# false:为关闭分页按钮；1:下一篇显示的是旧文章；2:下一篇显示的是新文章</span></span><br><span class="line"><span class="comment"># 1: The &#x27;next post&#x27; will link to old post</span></span><br><span class="line"><span class="comment"># 2: The &#x27;next post&#x27; will link to new post</span></span><br><span class="line"><span class="comment"># false: disable pagination</span></span><br><span class="line"><span class="attr">post_pagination:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><img src="https://s1.vika.cn/space/2022/10/29/7e0ca16646c4487895c7f1f792d87f92" alt="image-20221029173929409" style="zoom:50%;" /><h2 id="10-头像">10.头像</h2><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">avatar:</span></span><br><span class="line">  <span class="attr">img:</span> <span class="string">/assets/head.jpg</span></span><br><span class="line">  <span class="attr">effect:</span> <span class="literal">false</span> <span class="comment"># true则会一直转圈</span></span><br></pre></td></tr></table></figure><img src="https://s1.vika.cn/space/2022/10/28/0904865b6c0c4e1080078bc34b836082" alt="image-20221028141401289" style="zoom:50%;" /><h2 id="11-文章内容复制相关配置">11.文章内容复制相关配置</h2><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># copy settings</span></span><br><span class="line"><span class="comment"># copyright: Add the copyright information after copied content (复制的内容后面加上版权信息)</span></span><br><span class="line"><span class="attr">copy:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span><span class="comment"># 是否开启网站复制权限</span></span><br><span class="line">  <span class="attr">copyright:</span><span class="comment"># 复制的内容后面加上版权信息</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span><span class="comment"># 是否开启复制版权信息添加</span></span><br><span class="line">    <span class="attr">limit_count:</span> <span class="number">50</span><span class="comment"># 字数限制，当复制文字大于这个字数限制时，将在复制的内容后面加上版权信息</span></span><br></pre></td></tr></table></figure><h2 id="12-Footer-设置">12.Footer 设置</h2><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">footer:</span></span><br><span class="line">  <span class="attr">owner:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">since:</span> <span class="number">2022</span><span class="comment"># 站点起始时间</span></span><br><span class="line">  <span class="attr">custom_text:</span><span class="comment"># 是一个给你用来在页脚自定义文本的选项。通常你可以在这里写声明文本等,支持 HTML。</span></span><br><span class="line">  <span class="attr">copyright:</span> <span class="literal">false</span> <span class="comment"># Copyright of theme and framework</span></span><br></pre></td></tr></table></figure><p>可以参考tzy大佬的的<code>custom_text</code>填写示例：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">custom_text:</span> <span class="string">I</span> <span class="string">wish</span> <span class="string">you</span> <span class="string">to</span> <span class="string">become</span> <span class="string">your</span> <span class="string">own</span> <span class="string">sun,</span> <span class="literal">no</span> <span class="string">need</span> <span class="string">to</span> <span class="string">rely</span> <span class="string">on</span> <span class="string">who&#x27;s</span> <span class="string">light.&lt;p&gt;&lt;a</span> <span class="string">target=&quot;_blank&quot;</span> <span class="string">href=&quot;https://hexo.io/&quot;&gt;&lt;img</span> <span class="string">src=&quot;https://img.shields.io/badge/Frame-Hexo-blue?style=flat&amp;logo=hexo&quot;</span> <span class="string">title=&quot;博客框架为Hexo&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a</span> <span class="string">target=&quot;_blank&quot;</span> <span class="string">href=&quot;https://butterfly.js.org/&quot;&gt;&lt;img</span> <span class="string">src=&quot;https://img.shields.io/badge/Theme-Butterfly-6513df?style=flat&amp;logo=bitdefender&quot;</span> <span class="string">title=&quot;主题采用butterfly&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a</span> <span class="string">target=&quot;_blank&quot;</span> <span class="string">href=&quot;https://www.jsdelivr.com/&quot;&gt;&lt;img</span> <span class="string">src=&quot;https://img.shields.io/badge/CDN-jsDelivr-orange?style=flat&amp;logo=jsDelivr&quot;</span> <span class="string">title=&quot;本站使用JsDelivr为静态资源提供CDN加速&quot;&gt;&lt;/a&gt;</span> <span class="string">&amp;nbsp;&lt;a</span> <span class="string">target=&quot;_blank&quot;</span> <span class="string">href=&quot;https://vercel.com/</span> <span class="string">&quot;&gt;&lt;img src=&quot;</span><span class="string">https://img.shields.io/badge/Hosted-Vervel-brightgreen?style=flat&amp;logo=Vercel&quot;</span> <span class="string">title=&quot;本站采用双线部署，默认线路托管于Vercel&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a</span> <span class="string">target=&quot;_blank&quot;</span> <span class="string">href=&quot;https://vercel.com/</span> <span class="string">&quot;&gt;&lt;img src=&quot;</span><span class="string">https://img.shields.io/badge/Hosted-Coding-0cedbe?style=flat&amp;logo=Codio&quot;</span> <span class="string">title=&quot;本站采用双线部署，联通线路托管于Coding&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a</span> <span class="string">target=&quot;_blank&quot;</span> <span class="string">href=&quot;https://github.com/&quot;&gt;&lt;img</span> <span class="string">src=&quot;https://img.shields.io/badge/Source-Github-d021d6?style=flat&amp;logo=GitHub&quot;</span> <span class="string">title=&quot;本站项目由Gtihub托管&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a</span> <span class="string">target=&quot;_blank&quot;</span> <span class="string">href=&quot;http://creativecommons.org/licenses/by-nc-sa/4.0/&quot;&gt;&lt;img</span> <span class="string">src=&quot;https://img.shields.io/badge/Copyright-BY--NC--SA%204.0-d42328?style=flat&amp;logo=Claris&quot;</span> <span class="string">title=&quot;本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可&quot;&gt;&lt;/a&gt;&lt;/p&gt;</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/06/01/6296491902973.jpg" alt=""></p><p>对于部分人需要写 ICP 的，也可以写在custom_text里。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">custom_text:</span> <span class="string">&lt;a</span> <span class="string">href=&quot;icp链接&quot;&gt;&lt;img</span> <span class="string">class=&quot;icp-icon&quot;</span> <span class="string">src=&quot;icp图片&quot;&gt;&lt;span&gt;备案号：xxxxxx&lt;/span&gt;&lt;/a&gt;</span></span><br></pre></td></tr></table></figure><h2 id="13-右下角按钮">13.右下角按钮</h2><h3 id="13-1-简繁转换">13.1 简繁转换</h3><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">translate:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="comment"># 默认按钮显示文字(网站是简体，应设置为&#x27;default: 繁&#x27;)</span></span><br><span class="line">  <span class="attr">default:</span> <span class="string">繁</span></span><br><span class="line">  <span class="comment"># the language of website (1 - Traditional Chinese/ 2 - Simplified Chinese）</span></span><br><span class="line">  <span class="comment"># 网站默认语言，1: 繁体中文, 2: 简体中文</span></span><br><span class="line">  <span class="attr">defaultEncoding:</span> <span class="number">2</span></span><br><span class="line">  <span class="comment"># Time delay 延迟时间,若不在前, 要设定延迟翻译时间, 如100表示100ms,默认为0</span></span><br><span class="line">  <span class="attr">translateDelay:</span> <span class="number">0</span></span><br><span class="line">  <span class="comment"># 当文字是简体时，按钮显示的文字</span></span><br><span class="line">  <span class="attr">msgToTraditionalChinese:</span> <span class="string">&#x27;繁&#x27;</span></span><br><span class="line">  <span class="comment"># 当文字是繁体时，按钮显示的文字</span></span><br><span class="line">  <span class="attr">msgToSimplifiedChinese:</span> <span class="string">&#x27;簡&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="13-2-夜间模式">13.2 夜间模式</h3><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># dark mode</span></span><br><span class="line"><span class="attr">darkmode:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="comment"># dark 和 light 两种模式切换按钮</span></span><br><span class="line">  <span class="attr">button:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># Switch dark/light mode automatically (自動切換 dark mode和 light mode)</span></span><br><span class="line">  <span class="comment"># autoChangeMode: 1  Following System Settings, if the system doesn&#x27;t support dark mode, it will switch dark mode between 6 pm to 6 am</span></span><br><span class="line">  <span class="comment"># autoChangeMode: 2  Switch dark mode between 6 pm to 6 am</span></span><br><span class="line">  <span class="comment"># autoChangeMode: false</span></span><br><span class="line">  <span class="attr">autoChangeMode:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>v2.0.0 开始增加一个选项，可开启自动切换light mode 和 dark mode。</p><ul><li><code>autoChangeMode: 1</code> 跟随系统而变化，不支持的浏览器/系统将按照时间晚上6点到早上6点之间切换为 dark mode。</li><li><code>autoChangeMode: 2</code>只按照时间 晚上6点到早上6点之间切换为 dark mode,其余时间为light mode。</li><li><code>autoChangeMode: false</code> 取消自动切换。</li></ul><h3 id="13-3-阅读模式">13.3 阅读模式</h3><p>阅读模式下会去掉除文章外的内容，避免干扰阅读。只会出现在文章页面，右下角会有阅读模式按钮。</p><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">readmode:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h2 id="14-侧边栏设置">14.侧边栏设置</h2><h3 id="14-1-排版">14.1 排版</h3><p>可自行决定哪个项目需要显示，可决定位置，也可以设置不显示侧边栏。</p><p>修改主题配置文件<code>_config.butterfly.yml</code>，下面是本人博客的配置项可以参考</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">aside:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">hide:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">button:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">true</span> <span class="comment"># display on mobile</span></span><br><span class="line">  <span class="attr">position:</span> <span class="string">right</span> <span class="comment"># left or right</span></span><br><span class="line">  <span class="attr">display:</span></span><br><span class="line">    <span class="attr">archive:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tag:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">category:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">card_author:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">description:</span></span><br><span class="line">    <span class="attr">button:</span></span><br><span class="line">      <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">      <span class="attr">icon:</span> <span class="comment"># fab fa-github</span></span><br><span class="line">      <span class="attr">text:</span> <span class="string">🛴前往小家...</span></span><br><span class="line">      <span class="attr">link:</span> <span class="string">https://github.com/fomalhaut1998</span></span><br><span class="line">  <span class="attr">card_announcement:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">content:</span> <span class="string">&lt;center&gt;主域名：&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://www.fomal.cc&quot;&gt;&lt;b&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;fomal.cc&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a</span> <span class="string">href=&quot;https://www.fomal.cn&quot;&gt;&lt;b&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;fomal.cn&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br&gt;备用域名：&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://blog.fomal.cc&quot;&gt;&lt;b&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;blog.fomal.cc&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://aa.fomal.cc&quot;&gt;&lt;b&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;aa.fomal.cc&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br&gt;&lt;a</span> <span class="string">href=&quot;https://bb.fomal.cc&quot;&gt;&lt;b&gt;&lt;font</span> <span class="string">color=&quot;#5ea6e5&quot;&gt;bb.fomal.cc&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br&gt;&lt;a</span> <span class="string">href=&quot;mailto:admin@fomal.cn&quot;&gt;📬：&lt;b&gt;&lt;font</span> <span class="string">color=&quot;#a591e0&quot;&gt;admin@fomal.cn&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;/center&gt;</span></span><br><span class="line">  <span class="attr">card_recent_post:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">limit:</span> <span class="number">3</span> <span class="comment"># if set 0 will show all</span></span><br><span class="line">    <span class="attr">sort:</span> <span class="string">date</span> <span class="comment"># date or updated</span></span><br><span class="line">    <span class="attr">sort_order:</span> <span class="comment"># Don&#x27;t modify the setting unless you know how it works</span></span><br><span class="line">  <span class="attr">card_categories:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">limit:</span> <span class="number">8</span> <span class="comment"># if set 0 will show all</span></span><br><span class="line">    <span class="attr">expand:</span> <span class="string">none</span> <span class="comment"># none/true/false</span></span><br><span class="line">    <span class="attr">sort_order:</span> <span class="comment"># Don&#x27;t modify the setting unless you know how it works</span></span><br><span class="line">  <span class="attr">card_tags:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">limit:</span> <span class="number">20</span> <span class="comment"># if set 0 will show all</span></span><br><span class="line">    <span class="attr">color:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">sort_order:</span> <span class="comment"># Don&#x27;t modify the setting unless you know how it works</span></span><br><span class="line">  <span class="attr">card_archives:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">monthly</span> <span class="comment"># yearly or monthly</span></span><br><span class="line">    <span class="attr">format:</span> <span class="string">MMMM</span> <span class="string">YYYY</span> <span class="comment"># eg: YYYY年MM月</span></span><br><span class="line">    <span class="attr">order:</span> <span class="number">-1</span> <span class="comment"># Sort of order. 1, asc for ascending; -1, desc for descending</span></span><br><span class="line">    <span class="attr">limit:</span> <span class="number">8</span> <span class="comment"># if set 0 will show all</span></span><br><span class="line">    <span class="attr">sort_order:</span> <span class="comment"># Don&#x27;t modify the setting unless you know how it works</span></span><br><span class="line">  <span class="attr">card_webinfo:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">post_count:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">last_push_date:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">sort_order:</span> <span class="comment"># Don&#x27;t modify the setting unless you know how it works</span></span><br><span class="line">  <span class="attr">card_weibo:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="14-2-访问人数-UV-和-PV">14.2 访问人数(UV 和 PV)</h3><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">busuanzi:</span></span><br><span class="line">  <span class="attr">site_uv:</span> <span class="literal">true</span>  <span class="comment"># 本站总访客数</span></span><br><span class="line">  <span class="attr">site_pv:</span> <span class="literal">true</span>  <span class="comment"># 本站总访问量 </span></span><br><span class="line">  <span class="attr">page_pv:</span> <span class="literal">true</span>  <span class="comment"># 本文总阅读量</span></span><br></pre></td></tr></table></figure><h3 id="14-3-运行时间">14.3 运行时间</h3><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Time difference between publish date and now (網頁運行時間)</span></span><br><span class="line"><span class="comment"># Formal: Month/Day/Year Time or Year/Month/Day Time</span></span><br><span class="line"><span class="attr">runtimeshow:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">publish_date:</span> <span class="number">8</span><span class="string">/9/2022</span> <span class="number">00</span><span class="string">:00:00</span></span><br><span class="line">  <span class="comment">##网页开通时间</span></span><br><span class="line">  <span class="comment">#格式: 月/日/年 时间</span></span><br><span class="line">  <span class="comment">#也可以写成 年/月/日 时间</span></span><br></pre></td></tr></table></figure><h3 id="14-4-最新评论">14.4 最新评论</h3><div class="note warning flat"><p><code>v3.1.0</code> 以上支持。如果未配置任何评论，前先不要开启该功能。</p></div><p>最新评论只会在刷新时才会去读取，并不会实时变化。<br>由于 API 有 访问次数限制，为了避免调用太多，主题默认存取期限为 10 分鐘。也就是説，调用后资料会存在 <code>localStorage</code> 里，10分鐘内刷新网站只会去 <code>localStorage</code> 读取资料。 10 分鐘期限一过，刷新页面时才会去调取 API 读取新的数据。（3.6.0 新增了 storage 配置，可自行配置缓存时间）。</p><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Aside widget - Newest Comments</span></span><br><span class="line"><span class="attr">newest_comments:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">sort_order:</span> <span class="comment"># Don&#x27;t modify the setting unless you know how it works</span></span><br><span class="line">  <span class="attr">limit:</span> <span class="number">6</span>  <span class="comment"># 显示的数量</span></span><br><span class="line">  <span class="attr">storage:</span> <span class="number">10</span> <span class="comment"># 设置缓存时间，单位 分钟 </span></span><br><span class="line">  <span class="attr">avatar:</span> <span class="literal">true</span> <span class="comment"># 是否显示头像</span></span><br></pre></td></tr></table></figure><h2 id="15-网站背景">15.网站背景</h2><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 图片格式 url(http://xxxxxx.com/xxx.jpg)</span></span><br><span class="line"><span class="comment"># 颜色（HEX值/RGB值/颜色单词/渐变色)</span></span><br><span class="line"><span class="comment"># 留空 不显示背景</span></span><br><span class="line"><span class="attr">background:</span> <span class="string">url(https://source.fomal.cc/img/dm1.webp)</span></span><br></pre></td></tr></table></figure><p>如果你的网站根目录不是<code>'/'</code>，使用本地图片时，需加上你的根目录。<br>例如：网站是 <code>https://yoursite.com/blog</code>，引用一张<code>img/xx.png</code>图片，则设置<code>background</code>为 <code>url(/blog/img/xx.png)</code></p><h2 id="16-打字效果">16.打字效果</h2><p>详见：<a href="https://github.com/disjukr/activate-power-mode">activate-power-mode</a></p><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Typewriter Effect (打字效果)</span></span><br><span class="line"><span class="comment"># https://github.com/disjukr/activate-power-mode</span></span><br><span class="line"><span class="attr">activate_power_mode:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">colorful:</span> <span class="literal">true</span> <span class="comment"># open particle animation (冒光特效)</span></span><br><span class="line">  <span class="attr">shake:</span> <span class="literal">true</span> <span class="comment">#  open shake (抖動特效)</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/jerryc127/CDN/img/hexo-theme-butterfly-doc-type-animation.gif" alt=""></p><h2 id="17-footer-背景">17.footer 背景</h2><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># footer是否显示图片背景(与top_img一致)</span></span><br><span class="line"><span class="attr">footer_bg:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><ul><li><code>留空/false</code>：显示默认的颜色</li><li><code>图片链接</code>：显示所配置的图片</li><li><code>颜色包括HEX值 - #0000FF | RGB值 - rgb(0,0,255) | 颜色单词 - orange | 渐变色 - linear-gradient( 135deg, #E2B0FF 10%, #9F44D3 100%)</code>：对应的颜色</li><li><code>true</code>：显示跟 top_img 一样</li></ul><h2 id="18-背景特效">18.背景特效</h2><div class="tabs" id="背景特效"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#背景特效-1">静止彩带</button></li><li class="tab"><button type="button" data-href="#背景特效-2">动态彩带</button></li><li class="tab"><button type="button" data-href="#背景特效-3">canvas_nest</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="背景特效-1"><p>可设置每次刷新更换彩带，或者每次点击更换彩带。详细配置可查看<a href="https://github.com/hustcc/ribbon.js">canvas_ribbon</a></p><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">canvas_ribbon:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">size:</span> <span class="number">150</span></span><br><span class="line">  <span class="attr">alpha:</span> <span class="number">0.6</span></span><br><span class="line">  <span class="attr">zIndex:</span> <span class="number">-1</span></span><br><span class="line">  <span class="attr">click_to_change:</span> <span class="literal">false</span>  <span class="comment">#設置是否每次點擊都更換彩带</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span> <span class="comment"># false 手機端不顯示 true 手機端顯示</span></span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/jerryc127/CDN/img/hexo-theme-butterfly-docs-canvas-ribbon.png" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="背景特效-2"><p>好看的彩带背景，会飘动。<br>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">canvas_fluttering_ribbon:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">true</span> <span class="comment"># false 手机端不显示 true 手机端显示</span></span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/jerryc127/CDN/img/hexo-theme-butterfly-doc-canvas-ribbon-piao.gif" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="背景特效-3"><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">canvas_nest:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">color:</span> <span class="string">&#x27;0,0,255&#x27;</span> <span class="comment">#color of lines, default: &#x27;0,0,0&#x27;; RGB values: (R,G,B).(<span class="doctag">note:</span> use &#x27;,&#x27; to separate.)</span></span><br><span class="line">  <span class="attr">opacity:</span> <span class="number">0.7</span> <span class="comment"># the opacity of line (0~1), default: 0.5.</span></span><br><span class="line">  <span class="attr">zIndex:</span> <span class="number">-1</span> <span class="comment"># z-index property of the background, default: -1.</span></span><br><span class="line">  <span class="attr">count:</span> <span class="number">99</span> <span class="comment"># the number of lines, default: 99.</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span> <span class="comment"># false 手機端不顯示 true 手機端顯示</span></span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/jerryc127/CDN/img/hexo-theme-butterfly-doc-canvas_nest.gif" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="19-鼠标点击效果">19.鼠标点击效果</h2><div class="tabs" id="鼠标点击效果"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#鼠标点击效果-1">烟花</button></li><li class="tab"><button type="button" data-href="#鼠标点击效果-2">爱心</button></li><li class="tab"><button type="button" data-href="#鼠标点击效果-3">文字</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="鼠标点击效果-1"><p><code>zIndex</code>建议只在<code>-1</code>和<code>9999</code>上选。<br><code>-1 </code>代表烟火效果在底部。<br><code>9999 </code>代表烟火效果在前面。</p><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">fireworks:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">zIndex:</span> <span class="number">9999</span> <span class="comment"># -1 or 9999</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/jerryc127/CDN/img/hexo-theme-butterfly-doc-firewall.gif" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="鼠标点击效果-2"><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 点击出現爱心</span></span><br><span class="line"><span class="attr">click_heart:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/jerryc127/CDN/img/click_love.gif" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="鼠标点击效果-3"><p>修改主题配置文件<code>_config.butterfly.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 点击出现文字，文字可自行修改</span></span><br><span class="line"><span class="attr">ClickShowText:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">text:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">I</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">LOVE</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">YOU</span></span><br><span class="line">  <span class="attr">fontSize:</span> <span class="string">15px</span></span><br><span class="line">  <span class="attr">random:</span> <span class="literal">false</span> <span class="comment"># 文字随机显示</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p><img src="https://fastly.jsdelivr.net/gh/jerryc127/CDN/img/click_word.gif" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="20-自定义字体和字体大小">20.自定义字体和字体大小</h2><h3 id="20-1-全局字体">20.1 全局字体</h3><p>修改主题配置文件<code>_config.butterfly.yml</code>中的<code>font-family</code>属性即可，如不需要配置，请留空。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Global font settings</span></span><br><span class="line"><span class="comment"># Don&#x27;t modify the following settings unless you know how they work (非必要不要修改)</span></span><br><span class="line"><span class="attr">font:</span></span><br><span class="line">  <span class="attr">global-font-size:</span> <span class="string">&#x27;15px&#x27;</span></span><br><span class="line">  <span class="attr">code-font-size:</span> <span class="string">&#x27;14px&#x27;</span></span><br><span class="line">  <span class="comment"># -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot; , &quot;Helvetica Neue&quot; , Lato, Roboto, &quot;PingFang SC&quot; , &quot;Microsoft JhengHei&quot; , &quot;Microsoft YaHei&quot; , sans-serif</span></span><br><span class="line">  <span class="comment"># Wenkai, consolas, -apple-system, &#x27;Quicksand&#x27;, &#x27;Nimbus Roman No9 L&#x27;, &#x27;PingFang SC&#x27;, &#x27;Hiragino Sans GB&#x27;, &#x27;Noto Serif SC&#x27;, &#x27;Microsoft Yahei&#x27;, &#x27;WenQuanYi Micro Hei&#x27;, &#x27;ST Heiti&#x27;, sans-serif;</span></span><br><span class="line">  <span class="attr">font-family:</span> <span class="string">var(--global-font),</span> <span class="string">Consolas_1,</span> <span class="string">-apple-system,</span> <span class="string">&#x27;Quicksand&#x27;</span><span class="string">,</span> <span class="string">&#x27;Nimbus Roman No9 L&#x27;</span><span class="string">,</span> <span class="string">&#x27;PingFang SC&#x27;</span><span class="string">,</span> <span class="string">&#x27;Hiragino Sans GB&#x27;</span><span class="string">,</span> <span class="string">&#x27;Noto Serif SC&#x27;</span><span class="string">,</span> <span class="string">&#x27;Microsoft Yahei&#x27;</span><span class="string">,</span> <span class="string">&#x27;WenQuanYi Micro Hei&#x27;</span><span class="string">,</span> <span class="string">&#x27;ST Heiti&#x27;</span><span class="string">,</span> <span class="string">sans-serif;</span></span><br><span class="line">  <span class="comment"># consolas, ZhuZiAWan_light, &quot;Microsoft YaHei&quot;, Menlo, &quot;PingFang SC&quot;, &quot;Microsoft JhengHei&quot;, sans-serif</span></span><br><span class="line">  <span class="comment"># Consolas_1, ZhuZiAWan_light, &quot;Microsoft YaHei&quot;, Menlo, &quot;PingFang SC&quot;, &quot;Microsoft JhengHei&quot;, sans-serif</span></span><br><span class="line">  <span class="attr">code-font-family:</span> <span class="string">Consolas_1,</span> <span class="string">var(--global-font),</span> <span class="string">&quot;Microsoft YaHei&quot;</span><span class="string">,</span> <span class="string">Menlo,</span> <span class="string">&quot;PingFang SC&quot;</span><span class="string">,</span> <span class="string">&quot;Microsoft JhengHei&quot;</span><span class="string">,</span> <span class="string">sans-serif</span></span><br></pre></td></tr></table></figure><h3 id="20-2-Blog-标题字体">20.2 Blog 标题字体</h3><p>修改主题配置文件<code>_config.butterfly.yml</code>中的<code>blog_title_font</code>属性即可，如不需要配置，请留空。<br>如不需要使用网络字体，只需要把font_link留空就行。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Font settings for the site title and site subtitle</span></span><br><span class="line"><span class="comment"># https://fonts.googleapis.com/css?family=Titillium+Web&amp;display=swap</span></span><br><span class="line"><span class="comment"># Titillium Web, &#x27;PingFang SC&#x27; , &#x27;Hiragino Sans GB&#x27; , &#x27;Microsoft JhengHei&#x27; , &#x27;Microsoft YaHei&#x27; , sans-serif</span></span><br><span class="line"><span class="comment"># 左上角網站名字 主頁居中網站名字</span></span><br><span class="line"><span class="attr">blog_title_font:</span></span><br><span class="line">  <span class="attr">font_link:</span> </span><br><span class="line">  <span class="attr">font-family:</span> <span class="string">var(--global-font)</span></span><br></pre></td></tr></table></figure><h2 id="21-网站副标题">21.网站副标题</h2><p>可设置主页中显示的网站副标题或者喜欢的座右铭。</p><p>修改主题配置文件<code>_config.butterfly.yml</code>中的<code>subtitle</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># the subtitle on homepage (主頁subtitle)</span></span><br><span class="line"><span class="attr">subtitle:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># Typewriter Effect (打字效果)</span></span><br><span class="line">  <span class="attr">effect:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># loop (循環打字)</span></span><br><span class="line">  <span class="attr">loop:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># source 調用第三方服務</span></span><br><span class="line">  <span class="comment"># source: false 關閉調用</span></span><br><span class="line">  <span class="comment"># source: 1  調用一言網的一句話（簡體） https://hitokoto.cn/</span></span><br><span class="line">  <span class="comment"># source: 2  調用一句網（簡體） http://yijuzhan.com/</span></span><br><span class="line">  <span class="comment"># source: 3  調用今日詩詞（簡體） https://www.jinrishici.com/</span></span><br><span class="line">  <span class="comment"># subtitle 會先顯示 source , 再顯示 sub 的內容</span></span><br><span class="line">  <span class="attr">source:</span> <span class="literal">false</span></span><br><span class="line">  <span class="comment"># 如果關閉打字效果，subtitle 只會顯示 sub 的第一行文字</span></span><br><span class="line">  <span class="attr">sub:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;Welcome to Fomalhaut🥝のTiny Home!🤣🤣🤣&quot;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;Hope you have a nice day!🍭🍭🍭&quot;</span></span><br></pre></td></tr></table></figure><p>预览效果见本站主页：<a href="https://www.fomal.cc">Fomalhaut🥝</a></p><h2 id="22-页面加载动画preloader">22.页面加载动画preloader</h2><p>当进入网页时，因为加载速度的问题，可能会导致top_img图片出现断层显示，或者网页加载不全而出现等待时间，开启preloader后，会显示加载动画，等页面加载完，加载动画会消失。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 加载动画 Loading Animation</span></span><br><span class="line"><span class="attr">preloader:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h2 id="23-字数统计">23.字数统计</h2><div class="note warning flat"><p>注意必须要安装依赖才能设置为<code>true</code>，否则会报错！</p></div><ol><li>安装插件：在你的博客根目录，打开cmd命令窗口执行<code>npm install hexo-wordcount --save</code>。</li><li>开启配置：修改主题配置文件<code>_config.butterfly.yml</code>中的<code>wordcount</code>。</li></ol><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">wordcount:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">post_wordcount:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">min2read:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">total_wordcount:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h2 id="24-图片大图查看模式">24.图片大图查看模式</h2><p>只能开启一个。<br>如果你并不想为某张图片添加大图查看模式，你可以使用 html 格式引用图片，并为图片添加 no-lightbox class 名，例如：<code>&lt;img src=&quot;xxxx.jpg&quot; class=&quot;no-lightbox&quot;&gt;</code>。</p><div class="tabs" id="图片大图查看模式"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#图片大图查看模式-1">fancybox(推荐)</button></li><li class="tab"><button type="button" data-href="#图片大图查看模式-2">medium_zoom</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="图片大图查看模式-1"><p>修改主题配置文件<code>_config.butterfly.yml</code>中<code>fancybox</code>属性</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># fancybox http://fancyapps.com/fancybox/3/</span></span><br><span class="line"><span class="attr">fancybox:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="图片大图查看模式-2"><p>修改主题配置文件<code>_config.butterfly.yml</code>中<code>medium_zoom</code>属性</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">medium_zoom:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="25-Pjax">25.Pjax</h2><p>当用户点击链接，通过 <code>ajax </code>更新页面需要变化的部分，然后使用 HTML5 的 <code>pushState</code> 修改浏览器的 URL 地址。这样可以不用重复加载相同的资源<code>（css/js）</code>， 从而提升网页的加载速度。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Pjax [Beta]</span></span><br><span class="line"><span class="comment"># It may contain bugs and unstable, give feedback when you find the bugs.</span></span><br><span class="line"><span class="comment"># https://github.com/MoOx/pjax</span></span><br><span class="line"><span class="attr">pjax:</span> </span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 对于一些第三方插件，有些并不支持 pjax 。</span></span><br><span class="line">  <span class="comment"># 你可以把网页加入到 exclude 里，这个网页会被 pjax 排除在外。</span></span><br><span class="line">  <span class="comment"># 点击该网页会重新加载网站。</span></span><br><span class="line">  <span class="attr">exclude:</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="string">/music/</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">/no-pjax/</span></span><br></pre></td></tr></table></figure><p>注意：使用 pjax 后，一些自己DIY的js可能会无效，跳转页面时需要重新调用（例如朋友圈、说说等），具体请参考<a href="https://github.com/MoOx/pjax">Pjax文档</a>。</p><h2 id="26-Inject">26.Inject</h2><p>如想添加额外的 js/css/meta 等等东西，可以在 Inject 里添加，head(<code>&lt;/body&gt;</code>标签之前)， bottom(<code>&lt;/html&gt;</code>标签之前)。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Inject</span></span><br><span class="line"><span class="comment"># Insert the code to head (before &#x27;&lt;/head&gt;&#x27; tag) and the bottom (before &#x27;&lt;/body&gt;&#x27; tag)</span></span><br><span class="line"><span class="comment"># 插入代码到头部 &lt;/head&gt; 之前 和 底部 &lt;/body&gt; 之前</span></span><br><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/xxx.css&quot;&gt;</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;xxxx&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><h2 id="27-本地搜索系统">27.本地搜索系统</h2><ol><li><p>安装依赖：前往博客根目录，打开cmd命令窗口执行<code>npm install hexo-generator-search --save</code>。</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-search --save</span><br></pre></td></tr></table></figure></li><li><p>注入配置：修改站点配置文件<code>_config.yml</code>，添加如下代码：</p> <figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">search:</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">search.xml</span></span><br><span class="line">  <span class="attr">field:</span> <span class="string">post</span></span><br><span class="line">  <span class="attr">content:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure></li><li><p>主题中开启搜索：在主题配置文件_config.butterfly.yml中修改以下内容：</p> <figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">local_search:</span><br><span class="line"><span class="deletion">-  enable: false</span></span><br><span class="line"><span class="addition">+  enable: true</span></span><br></pre></td></tr></table></figure></li><li><p>重新编译运行，即可看到效果：前往博客根目录，打开cmd命令窗口依次执行如下命令：</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo cl &amp;&amp; hexo generate</span><br><span class="line">hexo s -p 8000</span><br></pre></td></tr></table></figure><p>详情可参考 <a href="https://github.com/wzpan/hexo-generator-search">hexo-generator-search</a></p></li></ol><p><img src="https://s1.vika.cn/space/2022/10/29/df8853f2baf342a2ba28968b80826693" alt="image-20221029174043726"></p>]]></content>
    
    
    <summary type="html">🥪Hexo博客搭建基础教程(三)</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>Hexo博客搭建基础教程(二)</title>
    <link href="https://www.fomal.cc/posts/4aa2d85f.html"/>
    <id>https://www.fomal.cc/posts/4aa2d85f.html</id>
    <published>2022-10-27T18:00:00.000Z</published>
    <updated>2022-10-27T18:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>前言📝</b></font></p><p>这部分教程有参考tzy大佬的文章：<a href="https://tzy1997.com/articles/hexo1603/">基于 Hexo 从零开始搭建个人博客（三）</a>、<a href="https://tzy1997.com/articles/hexo1604/">基于 Hexo 从零开始搭建个人博客（四）</a><br>阅读本篇前，请先阅读前面的文章：<a href="https://www.fomal.cc/posts/e593433d.html">Hexo 博客搭建基础教程 (一)</a><br>视频教程会同步至在我的B站账号<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a></p><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a></li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a> ⇦当前位置🪂</li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="1-前言">1.前言</h2><ol><li>博客搭建过程遇到任何问题，优先在本页面搜索，检查是否已经有该配置教程。</li><li>遇到问题可以优先在文章评论区留言，注意留言时请填写正确的邮箱以确保能收到站长的回复。</li><li>实在解决不了的问题可添加站长的微信进行交流，备注自己的个人信息。</li></ol><h2 id="2-Vercel部署与自定义域名">2.Vercel部署与自定义域名</h2><h3 id="2-1-Vercel部署">2.1 Vercel部署</h3><p>Vercel简介：<a href="https://vercel.com/dashboard">vercel</a>是一个代码托管平台，它能够托管你的静态html界面，甚至能够托管你的node.js与Python服务端脚本，是<strong>不想买服务器的懒人的福音</strong>！</p><p><strong>使用Vercel部署Hexo项目步骤：</strong></p><ol><li>首先需要一个Vercel账号，这里<strong>推荐用GitHub账户关联，这样你就可以在vercel中直接托管你的GitHub库中的项目了</strong>，实现开发部署一步到位（网络不流畅可以考虑挂梯子）。<br><img src="https://s1.vika.cn/space/2022/10/27/5ecde0efb97e4efe8c872c07f2b29301" alt="image-20221027223132537" style="zoom:33%;" /></li><li>当你用你的Github账户关联并绑定手机号登录之后，点击右上角的<code>Add New Project</code>创建新的项目，之后导入选项那里选择<code>Continue with Github</code>，这时候应该能看到你Github账号的仓库，选择你刚刚部署成功的存储静态博客的仓库<code>&lt;username&gt;.github.io</code>右边的<code>Import</code>选项，表示你要导入该仓库。<br><img src="https://s1.vika.cn/space/2022/10/27/13d509ad17d44a5ebf60d6bd7cde05f4" alt="image-20221027223231192" style="zoom:33%;" /><br><img src="https://s1.vika.cn/space/2022/10/27/23780c3fc63546559ff02d303f97e37d" alt="image-20221027223420282" style="zoom:50%;" /><br><img src="https://s1.vika.cn/space/2022/10/27/7e1c080e435648a1a27a0f21d19e979d" alt="image-20221027223742660" style="zoom: 33%;" /></li><li>起一个只能有字母、数字或者或者连字符的项目名称，然后其他默认，点击<code>Deploy</code>，等待一分钟即可部署成功，部署成功后电极<code>Continue to Dashboard</code>跳转到控制面板，下图所示就是控制面板，看到就代表成功部署到了，但是我们现在还不能访问他给出的域，因为GFW最近把Vercel屏蔽了。</li></ol><p>​<img src="https://s1.vika.cn/space/2022/10/27/09b5ce9b3ac64d2dad2acdf3cca92b5f" alt="image-20221027224225808" style="zoom: 33%;" /></p><img src="https://s1.vika.cn/space/2022/10/27/43c6816280914f6ebbab1d6ec345c8f9" alt="image-20221027224405464" style="zoom: 67%;" /><h3 id="2-2-绑定自定义域名">2.2 绑定自定义域名</h3><p>现在你的个人网站的地址是 <code>username.github.io</code>以及在Vercel上有一个<code>blog-demo-chi.vercel.app</code>。如果觉得不够定制化，可以购买一个专属域名。</p><div class="note info no-icon flat"><p>这一步不是必要的，如果目前还不想买域名可以先跳过。</p></div><p>腾讯云、阿里云等都是不错的域名代理商，建议选用<code>com</code>，<code>cn</code>或<code>cc</code>这类常用好记的顶域，对SEO比较友好，自定义部分的长度尽可能短别人才会更容易地记住你的网站，要知道域名就是你网站的卡片。此处以阿里云域名为例进行说明，购买域名后，实名认证进入阿里云控制台，点云解析进去，找到你刚买的域名，点进去添加Vercel所需的解析记录，注意博主这里是解析二级域名只需要解析一条即可。但是如果是一级域名，需要解析两个，一个是<code>@</code>，另外一个是<code>www</code>，Vercel建议是<code>@</code>的解析重定向至<code>www</code>。</p><p>以我的域名：<code>fomal.cc</code>为例进行说明</p><table><thead><tr><th style="text-align:center">主机记录</th><th style="text-align:center">解释</th></tr></thead><tbody><tr><td style="text-align:center">www</td><td style="text-align:center">解析后的域名为 <a href="http://www.fomal.cc">www.fomal.cc</a></td></tr><tr><td style="text-align:center">@</td><td style="text-align:center">直接解析主域名 <a href="http://fomal.cc">fomal.cc</a></td></tr><tr><td style="text-align:center">*</td><td style="text-align:center">泛解析，匹配其他所有域名 *.fomal.cc</td></tr><tr><td style="text-align:center">mail</td><td style="text-align:center">将域名解析为 <a href="http://mail.fomal.cc">mail.fomal.cc</a>，通常用于解析邮箱服务器</td></tr><tr><td style="text-align:center">二级</td><td style="text-align:center">如 <a href="http://abc.fomal.cc">abc.fomal.cc</a>，填写 abc</td></tr><tr><td style="text-align:center">手机网站</td><td style="text-align:center">如 <a href="http://m.fomal.cc">m.fomal.cc</a>，填写 m</td></tr><tr><td style="text-align:center">显性URL</td><td style="text-align:center">不支持泛解析（泛解析：将所有子域名解析到同一地址）</td></tr></tbody></table><div class="note info no-icon flat"><p>将域名指向云服务器，请选择「A」； 将域名指向另一个域名，请选择「CNAME」； 建立邮箱请选择「MX」，根据邮箱服务商提供的 MX 记录填写。</p></div><table><thead><tr><th style="text-align:center">记录类型</th><th style="text-align:center">解释</th></tr></thead><tbody><tr><td style="text-align:center">A</td><td style="text-align:center">用来指定域名的 IPv4 地址（如 8.8.8.8），如果需要将域名指向一个 IP 地址，就需要添加 A 记录。</td></tr><tr><td style="text-align:center">CNAME</td><td style="text-align:center">如果需要将域名指向另一个域名，再由另一个域名提供 IP 地址，就需要添加 CNAME 记录。</td></tr><tr><td style="text-align:center">MX</td><td style="text-align:center">如果需要设置邮箱，让邮箱能收到邮件，就需要添加 MX 记录。</td></tr><tr><td style="text-align:center">TXT</td><td style="text-align:center">在这里可以填写任何东西，长度限制 255。绝大多数的 TXT 记录是用来做 SPF 记录（反垃圾邮件）</td></tr><tr><td style="text-align:center">NS</td><td style="text-align:center">域名服务器记录，如果需要将子域名交给其他 DNS 服务商解析，就需要添加 NS 记录。</td></tr><tr><td style="text-align:center">AAAA</td><td style="text-align:center">用来指定主机名（或域名）对应的 IPv6 地址（例如：ff06:0:0:0:0:0:0:c3）记录。</td></tr><tr><td style="text-align:center">SRV</td><td style="text-align:center">记录了哪台计算机提供了哪个服务。格式为：服务的名字、点、协议的类型，例如：_xmpp-server_tcp。</td></tr><tr><td style="text-align:center">显性URL</td><td style="text-align:center">从一个地址 301 重定向到另一个地址的时候，就需要添加显性 URL 记录（注：DNSPod 目前只支持 301 重定向）。</td></tr><tr><td style="text-align:center">隐性URL</td><td style="text-align:center">类似于显性 URL，区别在于隐性 URL 不会改变地址栏的域名。</td></tr></tbody></table><p><strong>添加自定义域名的步骤：</strong></p><ol><li>点击Vercel控制面板右上角的<code>View Domains</code>查看当前的域，我们可以看到仅有Vercel给你预分配的一个域名，此时我们输入刚刚购买的域名，我这里以二级域名<code>demo.fomal.cc</code>为例进行说明，添加后他会提示你添加一条DNS解析记录。<br><img src="https://s1.vika.cn/space/2022/10/27/f0890ccf90d04ac7985a40558b8f0aad" alt="image-20221027224803563"><br><img src="https://s1.vika.cn/space/2022/10/27/3a1e809ca99a452fae6229d9b69134ad" alt="image-20221027224830609"><br><img src="https://s1.vika.cn/space/2022/10/27/1bd6bdd5cc924661a0bf779997240e86" alt="image-20221027225338126"><br><strong>PS</strong>：如果你是新买的域名，直接输入你新买的一级域名即可，例如<code>demo123.com</code>，他会推荐你将<code>demo123.com</code>重定向至<code>www.demo123.com</code>，点<code>ADD</code>即可，然后他会提示你添加两条解析记录，一个是<code>@</code>开头的和<code>CNAME</code>开头的，添加记录的方法和二级域名一致。<br><img src="https://s1.vika.cn/space/2022/10/27/66c6d6f8fac84481b788228c4222864d" alt="image-20221027225758503"><br><img src="https://s1.vika.cn/space/2022/10/27/d6dd5ec65e93439482a7ddd5833ebd9d" alt="image-20221027225808449"></li><li>在阿里云域名解析记录里面添加如下记录，其中记录类型对应<code>Type</code>，主机记录对应<code>Name</code>，记录值对应<code>Value</code>，其他的设置默认即可。<br><img src="https://s1.vika.cn/space/2022/10/27/83c253f0710f44c1b80bc662e4a97636" alt="image-20221027230049667" style="zoom: 80%;" /></li><li>回到Vercel刚刚查看域名的地方，如果操作没问题，应该会显示域名配置成功的提示，此时就可以通过自定义域名来访问我们搭建的网站了。<br><img src="https://s1.vika.cn/space/2022/10/27/9604de65a5524ba88d7e43f9412229d3" alt="image-20221027230357362"><br><img src="https://s1.vika.cn/space/2022/10/27/244bc979f30149778b9e1ffc7038ecd0" alt="image-20221027230421929" style="zoom: 67%;" /></li><li>当你有了新的域名之后，需要<code>[BlogRoot]\_config.yml</code>文件中的<code>url</code>配置项为自己的新域名，这样博客的文章链接才会正确生成。</li></ol><img src="https://s1.vika.cn/space/2022/10/28/fa95d5aef2ac45deb4a02400056047e1" alt="image-20221028113042788" style="zoom:50%;" /><h2 id="3-安装主题">3.安装主题</h2><p>本教程用的 🦋 hexo-theme-butterfly 主题 v4.5.0最新版，请放心食用。</p><p>本教程用的是npm方式安装的 <code>hexo-theme-butterfly</code>，后续魔改时更改的文件都是【C:/Hexo-Blog/blog-demo/node_modules/hexo-theme-butterfly】文件夹中的文件。如果你是<code>git clone</code>克隆方式安装的主题，请在【C:/Hexo-Blog/blog-demo/themes/butterfly】文件夹下修改对应的文件。</p><div class="tabs" id="主题安装方式"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#主题安装方式-1">npm安装(推荐)</button></li><li class="tab"><button type="button" data-href="#主题安装方式-2">Github安装</button></li><li class="tab"><button type="button" data-href="#主题安装方式-3">Gitee安装</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="主题安装方式-1"><p>注意：此方法只支持 Hexo 5.0.0以上版本!</p><p>在你的博客根目录（我这里路径为【C:/Hexo-Blog/blog-demo】）打开<code>Git BASH</code>命令窗口执行<code>npm i hexo-theme-butterfly</code></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i hexo-theme-butterfly</span><br></pre></td></tr></table></figure><p>安装成功后可在【C:/Hexo-Blog/blog-demo/node_modules】文件夹下找到hexo-theme-butterfly文件夹</p><div class="note info modern"><p>升级方法：在博客根目录下，运行 <code>npm update hexo-theme-butterfly</code>。<br>升级前请将<code>hexo-theme-butterfly</code>文件夹备份，npm更新会直接覆盖成新的包。</p></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="主题安装方式-2"><p>在你的博客根目录里（我这里路径为【C:/Hexo-Blog/blog-demo】），打开<code>Git BASH</code>工具，执行命令即可。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone -b 4.5.0 https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly</span><br></pre></td></tr></table></figure><p>安装成功后可在【C:/Hexo-Blog/blog-demo/themes】文件夹下找到<code>butterfly</code>文件夹，可以将<code>landscape</code>文件夹删掉。</p><div class="note info modern"><p>升级方法：在主题目录下，运行git pull</p></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="主题安装方式-3"><p>在你的博客根目录里（我这里路径为【C:/Hexo-Blog/blog-demo】），打开<code>Git BASH</code>工具，执行命令即可。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone -b 4.5.0 https://gitee.com/iamjerryw/hexo-theme-butterfly.git themes/butterfly </span><br></pre></td></tr></table></figure><div class="note info modern"><p>升级方法：在主题目录下，运行git pull</p></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="4-应用主题">4.应用主题</h2><ol><li>修改站点配置文件<code>_config.yml</code>，把主题改为<code>butterfly</code> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">theme:</span> <span class="string">butterfly</span></span><br></pre></td></tr></table></figure></li><li>如果你没有<code>pug</code>以及<code>stylus</code>的渲染器，请下载安装，这两个渲染器是<code>Butterfly</code>生成基础页面所需的依赖包： <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-renderer-pug hexo-renderer-stylus --save</span><br></pre></td></tr></table></figure></li><li>为了减少升级主题后带来的不便，请使用以下方法（建议，可以不做，高度魔改的一般都不会升级主题了，不然魔改的会被覆盖掉）<br>把主题文件夹中的 <code>_config.yml</code> 复制到 Hexo 根目录里（我这里路径为【C:/Hexo-Blog/blog-demo】），同时重新命名为 <code>_config.butterfly.yml</code>。以后只需要在 <code>_config.butterfly.yml</code>进行配置即可生效。Hexo会自动合併主题中的<code>_config.yml</code>和 <code>_config.butterfly.yml</code>里的配置，如果存在同名配置，会使用<code>_config.butterfly.yml</code>的配置，其优先度较高。</li></ol><h2 id="5-基础用法说明">5. 基础用法说明</h2><h3 id="5-1-Front-matter">5.1 Front-matter</h3><p><code>Front-matter</code> 是 markdown 文件最上方以<code>---</code>分隔的区域，用于指定个别档案的变数。</p><ul><li>Page Front-matter 用于页面配置</li><li>Post Front-matter 用于文章页配置</li></ul><div class="note info modern"><p>如果标注可选的参数，可根据自己需要添加，不用全部都写</p></div><p><strong>Page Front-matter：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">type:</span><br><span class="line">comments:</span><br><span class="line">description:</span><br><span class="line">keywords:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aside:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br><span class="line">---</span><br></pre></td></tr></table></figure><table><thead><tr><th style="text-align:left">写法</th><th>解释</th></tr></thead><tbody><tr><td style="text-align:left">title</td><td>【必需】页面标题</td></tr><tr><td style="text-align:left">date</td><td>【必需】页面创建日期</td></tr><tr><td style="text-align:left">type</td><td>【必需】标籤、分类和友情链接三个页面需要配置</td></tr><tr><td style="text-align:left">updated</td><td>【可选】页面更新日期</td></tr><tr><td style="text-align:left">description</td><td>【可选】页面描述</td></tr><tr><td style="text-align:left">keywords</td><td>【可选】页面关键字</td></tr><tr><td style="text-align:left">comments</td><td>【可选】显示页面评论模块(默认 true)</td></tr><tr><td style="text-align:left">top_img</td><td>【可选】页面顶部图片</td></tr><tr><td style="text-align:left">mathjax</td><td>【可选】显示mathjax(当设置mathjax的per_page: false时，才需要配置，默认 false)</td></tr><tr><td style="text-align:left">kates</td><td>【可选】显示katex(当设置katex的per_page: false时，才需要配置，默认 false)</td></tr><tr><td style="text-align:left">aside</td><td>【可选】显示侧边栏 (默认 true)</td></tr><tr><td style="text-align:left">aplayer</td><td>【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置</td></tr><tr><td style="text-align:left">highlight_shrink</td><td>【可选】配置代码框是否展开(true/false)(默认为设置中highlight_shrink的配置)</td></tr></tbody></table><p><strong>Post Front-matter：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">tags:</span><br><span class="line">categories:</span><br><span class="line">keywords:</span><br><span class="line">description:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">comments:</span></span><br><span class="line"><span class="emphasis">cover:</span></span><br><span class="line"><span class="emphasis">toc:</span></span><br><span class="line"><span class="emphasis">toc_</span>number:</span><br><span class="line">toc<span class="emphasis">_style_</span>simple:</span><br><span class="line">copyright:</span><br><span class="line">copyright<span class="emphasis">_author:</span></span><br><span class="line"><span class="emphasis">copyright_</span>author<span class="emphasis">_href:</span></span><br><span class="line"><span class="emphasis">copyright_</span>url:</span><br><span class="line">copyright<span class="emphasis">_info:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br><span class="line"><span class="section">aside:</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure><table><thead><tr><th>写法</th><th>解释</th></tr></thead><tbody><tr><td>title</td><td>【必需】文章标题</td></tr><tr><td>date</td><td>【必需】文章创建日期</td></tr><tr><td>updated</td><td>【可选】文章更新日期</td></tr><tr><td>tags</td><td>【可选】文章标籤</td></tr><tr><td>categories</td><td>【可选】文章分类</td></tr><tr><td>keywords</td><td>【可选】文章关键字</td></tr><tr><td>description</td><td>【可选】文章描述</td></tr><tr><td>top_img</td><td>【可选】文章顶部图片</td></tr><tr><td>cover</td><td>【可选】文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图，可设为false/图片地址/留空)</td></tr><tr><td>comments</td><td>【可选】显示文章评论模块(默认 true)</td></tr><tr><td>toc</td><td>【可选】显示文章TOC(默认为设置中toc的enable配置)</td></tr><tr><td>toc_number</td><td>【可选】显示toc_number(默认为设置中toc的number配置)</td></tr><tr><td>toc_style_simple</td><td>【可选】显示 toc 简洁模式</td></tr><tr><td>copyright</td><td>【可选】显示文章版权模块(默认为设置中post_copyright的enable配置)</td></tr><tr><td>copyright_author</td><td>【可选】文章版权模块的文章作者</td></tr><tr><td>copyright_author_href</td><td>【可选】文章版权模块的文章作者链接</td></tr><tr><td>copyright_url</td><td>【可选】文章版权模块的文章连结链接</td></tr><tr><td>copyright_info</td><td>【可选】文章版权模块的版权声明文字</td></tr><tr><td>mathjax</td><td>【可选】显示mathjax(当设置mathjax的per_page: false时，才需要配置，默认 false)</td></tr><tr><td>katex</td><td>【可选】显示katex(当设置katex的per_page: false时，才需要配置，默认 false)</td></tr><tr><td>aplayer</td><td>【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置</td></tr><tr><td>highlight_shrink</td><td>【可选】配置代码框是否展开(true/false)(默认为设置中highlight_shrink的配置)</td></tr><tr><td>aside</td><td>【可选】显示侧边栏 (默认 true)</td></tr></tbody></table><div class="note info modern"><p>注意：我的博客根目录路径为 【C:/Hexo-Blog/blog-demo】，下文所说的根目录都是此路径，将用[BlogRoot]代替。</p></div><h3 id="5-2-标签页">5.2 标签页</h3><ol><li><p>前往你的Hexo博客根目录，打开<code>Git Bash</code>执行如下命令：</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new page tags</span><br></pre></td></tr></table></figure></li><li><p>在<code>[BlogRoot]\source\</code>会生成一个含有<code>index.md</code>文件的<code>tags</code>文件夹。</p></li><li><p>修改<code>[BlogRoot]\source\tags\index.md</code>，添加<code>type: &quot;tags&quot;</code>。</p> <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: tags</span><br><span class="line">date: 2022-10-28 12:00:00</span><br><span class="line"><span class="section">type: &quot;tags&quot;</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="5-3-友情链接">5.3 友情链接</h3><ol><li><p>前往你的Hexo博客根目录，打开cmd命令窗口执行如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new page link</span><br></pre></td></tr></table></figure></li><li><p>在<code>[BlogRoot]\source\</code>会生成一个含有<code>index.md</code>文件的<code>link</code>文件夹</p></li><li><p>修改<code>[BlogRoot]\source\link\index.md</code>，添加<code>type: &quot;link&quot;</code></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: link</span><br><span class="line">date: 2022-10-28 12:00:00</span><br><span class="line"><span class="section">type: &quot;link&quot;</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure></li><li><p>前往<code>[BlogRoot]\source\_data</code>创建一个<code>link.yml</code>文件（如果沒有 <code>_data</code> 文件夹，请自行创建），并写入如下信息（根据你的需要写）：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">class_name:</span> <span class="number">1</span><span class="string">.技术支持</span></span><br><span class="line">  <span class="attr">class_desc:</span> <span class="string">本网站的搭建由以下开源作者提供技术支持</span></span><br><span class="line">  <span class="attr">link_list:</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Hexo</span> </span><br><span class="line">      <span class="attr">link:</span> <span class="string">https://hexo.io/zh-cn/</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://d33wubrfki0l68.cloudfront.net/6657ba50e702d84afb32fe846bed54fba1a77add/827ae/logo.svg</span></span><br><span class="line">      <span class="attr">descr:</span> <span class="string">快速、简单且强大的网志框架</span></span><br><span class="line">      <span class="attr">siteshot:</span> <span class="string">https://source.fomal.cc/siteshot/hexo.io.jpg</span></span><br><span class="line">      </span><br><span class="line"><span class="bullet">-</span> <span class="attr">class_name:</span> <span class="number">2</span><span class="string">.友情链接</span></span><br><span class="line">  <span class="attr">class_desc:</span> <span class="string">一些好朋友~~</span></span><br><span class="line">  <span class="attr">link_list:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Fomalhaut🥝</span></span><br><span class="line">      <span class="attr">link:</span> <span class="string">https://fomal.cc/</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">/assets/head.jpg</span></span><br><span class="line">      <span class="attr">descr:</span> <span class="string">Future</span> <span class="string">is</span> <span class="string">now</span> <span class="string">🍭🍭🍭</span></span><br><span class="line">      <span class="attr">siteshot:</span> <span class="string">https://source.fomal.cc/siteshot/www.fomal.cn.jpg</span></span><br></pre></td></tr></table></figure><p>class_name和class_desc支持 html 格式，如不需要，也可以留空。</p></li></ol><h3 id="5-4-图库">5.4 图库</h3><p>图库页面只是普通的页面，你只需要<code>hexo new page xxx</code>创建你的页面就行。</p><p>然后使用外挂标签 <code>galleryGroup</code>，具体用法请查看对应的内容。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;gallery-group-main&quot;</span>&gt;</span></span></span><br><span class="line"></span><br><span class="line">&#123;% galleryGroup &#x27;封面专区&#x27; &#x27;本站用作文章封面的图片，不保证分辨率&#x27; &#x27;/box/Gallery/photo&#x27; https://source.fomal.cc/img/default<span class="emphasis">_cover_</span>61.webp %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% galleryGroup &#x27;背景专区&#x27; &#x27;收藏的一些的背景与壁纸，分辨率很高&#x27; &#x27;/box/Gallery/wallpaper&#x27; https://source.fomal.cc/img/dm11.webp %&#125;</span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br></pre></td></tr></table></figure><h3 id="5-5-子页面">5.5 子页面</h3><p>子页面也是普通的页面，你只需要<code>hexo new page xxx</code>创建你的页面就行。</p><p>然后使用标签外挂 <code>gallery</code>，具体用法请查看对应的内容。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">&#123;% gallery %&#125; </span><br><span class="line">![<span class="string">p1</span>](<span class="link"> https://source.fomal.cc/img/default_cover_1.webp </span>) </span><br><span class="line">![<span class="string">p2</span>](<span class="link"> https://source.fomal.cc/img/default_cover_2.webp </span>) </span><br><span class="line">![<span class="string">p3</span>](<span class="link"> https://source.fomal.cc/img/default_cover_3.webp </span>) </span><br><span class="line">![<span class="string">p4</span>](<span class="link"> https://source.fomal.cc/img/default_cover_4.webp </span>) </span><br><span class="line">![<span class="string">p5</span>](<span class="link"> https://source.fomal.cc/img/default_cover_5.webp </span>) </span><br><span class="line">![<span class="string">p6</span>](<span class="link"> https://source.fomal.cc/img/default_cover_6.webp </span>) </span><br><span class="line">![<span class="string">p7</span>](<span class="link"> https://source.fomal.cc/img/default_cover_7.webp </span>) </span><br><span class="line">![<span class="string">p8</span>](<span class="link"> https://source.fomal.cc/img/default_cover_8.webp </span>) </span><br><span class="line">![<span class="string">p9</span>](<span class="link"> https://source.fomal.cc/img/default_cover_9.webp </span>) </span><br><span class="line">![<span class="string">p10</span>](<span class="link"> https://source.fomal.cc/img/default_cover_10.webp </span>) </span><br><span class="line">![<span class="string">p11</span>](<span class="link"> https://source.fomal.cc/img/default_cover_11.webp </span>) </span><br><span class="line">![<span class="string">p12</span>](<span class="link"> https://source.fomal.cc/img/default_cover_12.webp </span>) </span><br><span class="line">&#123;% endgallery %&#125;</span><br></pre></td></tr></table></figure><h3 id="5-6-404页面">5.6 404页面</h3><p>主題內置了一个简单的404页面，可在设置中开放。</p><p>如需本地预览，请访问 <a href="http://localhost:4000/404.html">http://localhost:4000/404.html</a></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># A simple 404 page</span></span><br><span class="line"><span class="attr">error_404:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">subtitle:</span> <span class="string">&quot;页面沒有找到&quot;</span></span><br><span class="line">  <span class="attr">background:</span> </span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">🍒Hexo博客搭建基础教程(二)</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>Hexo博客搭建基础教程(一)</title>
    <link href="https://www.fomal.cc/posts/e593433d.html"/>
    <id>https://www.fomal.cc/posts/e593433d.html</id>
    <published>2022-10-25T18:00:00.000Z</published>
    <updated>2023-01-03T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><font size="4px"><b>前言📝</b></font></p><p>这部分教程有参考tzy大佬的文章：<a href="https://tzy1997.com/articles/hexo1601/">基于 Hexo 从零开始搭建个人博客（一）</a>、<a href="https://tzy1997.com/articles/hexo1602/">基于 Hexo 从零开始搭建个人博客（二）</a><br>全程我将会用一个完全空白的虚拟机带着大家进行搭建，大家可以放心食用🍖🍖🍖<br>视频教程会同步至在我的B站账号<a href="https://space.bilibili.com/220757832"><strong>–Fomalhaut</strong></a></p><p><font size="4px"><b>博客搭建与魔改系列教程导航🚥🚥🚥</b></font></p><ol><li><a href="/posts/e593433d.html">🥬Hexo博客搭建基础教程(一)</a> ⇦当前位置🪂</li><li><a href="/posts/4aa2d85f.html">🍒Hexo博客搭建基础教程(二)</a></li><li><a href="/posts/3451f874.html">🥪Hexo博客搭建基础教程(三)</a></li><li><a href="/posts/eec9786.html">🍀博客魔改教程总结(一)</a></li><li><a href="/posts/5389e93f.html">🍚博客魔改教程总结(二)</a></li><li><a href="/posts/2d7ac914.html">🎋博客魔改教程总结(三)</a></li><li><a href="/posts/d739261b.html">🥕博客魔改教程总结(四)</a></li><li><a href="/posts/d1927166.html">🍊博客魔改教程总结(五)</a></li><li><a href="/posts/489d3914.html">🧄博客魔改教程总结(六)</a></li><li><a href="/posts/9ac969bb.html">🎨综合美化模块教程</a></li></ol></div><h2 id="1-前言">1.前言</h2><ol><li>博客搭建过程遇到任何问题，优先在本页面搜索，检查是否已经有该配置教程。</li><li>遇到问题可以优先在文章评论区留言，注意留言时请填写正确的邮箱以确保能收到站长的回复。</li><li>实在解决不了的问题可添加站长的微信进行交流，备注自己的个人信息。</li></ol><h2 id="2-环境与工具准备">2.环境与工具准备</h2><p><strong>本教程主要面对的是Windows用户</strong></p><ul><li>操作系统：Windows10</li><li>Node</li><li>Git</li><li>Hexo</li><li>文本编辑器(强烈推荐VSCODE)</li><li>GitHub 帐号</li><li>一个域名（强烈推荐买个域名）</li><li>云服务器（可选）</li></ul><h2 id="3-Node的安装">3.Node的安装</h2><ol><li>打开Node官网，下载和自己系统相配的Node的安装程序，否则会出现安装问题。下载地址：<a href="https://nodejs.org/en/download/">https://nodejs.org/en/download/</a><br>我个人的版本是 12.19.0，目前版本已经更新到19.0.0，按照个人经验，可以选个低一些的版本，可以和我的一样，否则后面会出现各种不兼容的问题！我之前就是安装16的，系统无法识别，如果大家遇到问题建议选个低版本的！历史版本下载页面：<a href="https://nodejs.org/en/download/releases/">https://nodejs.org/en/download/releases/</a><br><img src="https://s1.vika.cn/space/2022/10/27/876780920daf4f8fb319d49ff68f17a3" alt="image-20221027173738226"></li><li>下载后安装，安装的目录可以使用默认目录【C:/Program Files/nodejs/】，也可以自定义路径。<br>这个环境路径切换坑也很多，如果大家C盘空间足够可以直接装C盘，如果想切换其他盘或者把环境遍历切换到自定义路径也可以，具体教程百度(不过坑比较多就是了)!</li><li>安装完成后，检查是否安装成功。在键盘按下win + R键，输入CMD，然后回车，打开CMD窗口，执行node -v命令，看到版本信息，则说明安装成功。</li><li>修改npm源。npm下载各种模块，默认是从国处服务器下载，速度较慢，建议配置成淘宝镜像。打开CMD窗口，运行如下命令: <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm config set registry https://registry.npm.taobao.org</span><br></pre></td></tr></table></figure></li></ol><h2 id="4-安装Hexo">4.安装Hexo</h2><ol><li><p>在<code>Git BASH</code>输入如下命令安装</p>   <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br></pre></td></tr></table></figure></li><li><p>安装完后输入hexo -v验证是否安装成功。</p></li></ol><img src="https://s1.vika.cn/space/2022/10/27/f05830f48da44ea98d2a55c3a6663004" alt="image-20221027173525181" style="zoom: 67%;" /><h2 id="5-Github注册与创建仓库">5.Github注册与创建仓库</h2><ol><li>进入官网 <a href="https://github.com/">https://github.com/</a><br><img src="https://bu.dusays.com/2022/05/12/627d2c0449341.webp" alt="Github注册"></li><li>点击右上角的 Sign up(注册)<br><img src="https://bu.dusays.com/2022/05/12/627d2c05ee628.png" alt="Github注册"></li><li>填写自己的邮箱、密码、用户名等信息，然后用邮箱验证即可完成。</li><li>注册完成后，点击右上角的<code>+</code>按钮，选择<code>New repository</code>，创建一个<code>&lt;用户名&gt;.github.io</code>的仓库。</li></ol><p>​<img src="https://s1.vika.cn/space/2022/10/27/7a06143d180d47088833a486732dccf5" alt="image-20221027110619071" style="zoom:50%;" /></p><ul><li>仓库的格式必须为：<code>&lt;用户名&gt;.github.io</code> (注意：前缀必须为用户名，不要等后面404了再来为什么！！！)</li><li>Description：为描述仓库（选填）</li><li>勾选 Initialize this repository with a README 初始化一个 <a href="http://README.md">README.md</a> 文件</li><li>点击 Creat repository 进行创建</li></ul><p>​<img src="https://s1.vika.cn/space/2022/10/27/0a4dbb10ca69422ca9ccb7493d0f177a" alt="image-20221027111641909" style="zoom:50%;" /></p><h2 id="6-Git安装">6.Git安装</h2><ol><li><p>进入官网：<a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a> ，由于官网下载太慢可以通过淘宝的开源镜像下载 网址：<a href="https://registry.npmmirror.com/binary.html?path=git-for-windows/v2.36.1.windows.1/">https://registry.npmmirror.com/binary.html?path=git-for-windows/v2.36.1.windows.1/</a> ，下载版本更具自己的需求选择即可。</p><p><img src="https://s1.vika.cn/space/2022/10/27/28a7d7e6ef3f4df080da8d7e8337431b" alt="image-20221027111755697"></p></li><li><p>下载后傻瓜式安装Git即可，安装的目录可以使用默认目录【C:/Program Files/Git】，也可以自定义路径。</p></li><li><p>点击电脑左下角开始即可看见<code>Git Bash</code>。</p></li></ol><p><img src="https://bu.dusays.com/2022/05/13/627d410ddc940.webp" alt="Git Bash"></p><ul><li><code>Git CMD</code> 是windows 命令行的指令风格</li><li><code>Git Bash</code> 是linux系统的指令风格（建议使用）</li><li><code>Git GUI</code>是图形化界面（新手学习不建议使用）</li></ul><ol start="4"><li><p>常用命令</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git config -l  //查看所有配置</span><br><span class="line">git config --system --list //查看系统配置</span><br><span class="line">git config --global --list //查看用户（全局）配置</span><br></pre></td></tr></table></figure></li><li><p>配置用户名和邮箱</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name &quot;你的用户名&quot;</span><br><span class="line">git config --global user.email &quot;你的邮箱&quot;</span><br></pre></td></tr></table></figure></li><li><p>通过<code>git config -l</code> 检查是否配置成功，至此git安装及配置全部完成。</p><p><img src="https://s1.vika.cn/space/2022/10/27/9115d60b377a47f3a8b79779a287ee65" alt="image-20221027112049822"></p></li></ol><h2 id="7-连接至Github">7.连接至Github</h2><ol><li><p>执行以下命令生成ssh公钥，此公钥用于你的计算机连接Github</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C &quot;你的邮箱&quot;</span><br></pre></td></tr></table></figure><p>之后打开C盘下用户文件夹下的.ssh的文件夹，会看到 id_rsa.pub</p><p><img src="https://bu.dusays.com/2022/05/14/627e87126fc59.png" alt="公钥"></p><p>用记事本打开上述图片中的公钥（id_rsa.pub），复制里面的内容，然后开始在github中配置ssh密钥。</p><p><img src="https://bu.dusays.com/2022/05/14/627e87156038a.png" alt="记事本打开公钥"></p></li><li><p>将 SSH KEY 配置到 GitHub<br>进入github，点击右上角头像 选择<code>settings</code>，进入设置页后选择 <code>SSH and GPG keys</code>，名字随便起，公钥填到<code>Key</code>那一栏。</p> <img src="https://s1.vika.cn/space/2022/10/27/4a69d999fed54ff78a5b84805d3c6a12" alt="image-20221027112347632" style="zoom:33%;" /><p><img src="https://s1.vika.cn/space/2022/10/27/aa20ae7d8db34e2596638f5f031f0814" alt="image-20221027112416710"></p><p><img src="https://s1.vika.cn/space/2022/10/27/eaccde8a10eb4cde945a1ed221bb6ace" alt="image-20221027112657256"></p></li><li><p>测试连接，输入以下命令</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><p><img src="https://s1.vika.cn/space/2022/10/27/122bb1ef33074bee84030a525ce1ec56" alt="image-20221027112918539"></p><p>出现连接到账户的信息，说明已经大功告成，至此完成了环境准备工作。</p></li></ol><h2 id="8-初始化-Hexo-项目">8.初始化 Hexo 项目</h2><ol><li><p>在目标路径（我这里选的路径为【C:/Hexo-Blog】）打开cmd命令窗口，执行<code>hexo init</code>初始化项目。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo init blog-demo(项目名)</span><br></pre></td></tr></table></figure><p><img src="https://s1.vika.cn/space/2022/10/27/1fbeb52671cf4b1daeca3660d1a31a2f" alt="image-20221027113206776"></p></li><li><p>进入<code>blog-demo</code> ，输入<code>npm i</code>安装相关依赖。</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd blog-demo  //进入blog-demo文件夹</span><br><span class="line">npm i</span><br></pre></td></tr></table></figure><p><img src="https://s1.vika.cn/space/2022/10/27/150eeb3e61c94b89a1cad2a3079b1f94" alt="image-20221027113331624"></p></li><li><p>初始化项目后，<code>blog-demo</code>有如下结构：</p></li></ol>  <img src="https://s1.vika.cn/space/2022/10/27/70cf503f27c54d30a31c6b13735023b7" alt="image-20221027113438707" style="zoom:50%;" /><p>【node_modules】：依赖包<br>【scaffolds】：生成文章的一些模板<br>【source】：用来存放你的文章<br>【themes】：主题<br>【.npmignore】：发布时忽略的文件（可忽略）<br>【_config.landscape.yml】：主题的配置文件<br>【config.yml】：博客的配置文件<br>【package.json】：项目名称、描述、版本、运行和开发等信息</p><ol start="4"><li><p>输入hexo server或者hexo s 启动项目</p><p><img src="https://s1.vika.cn/space/2022/10/27/688592f6db1448d29a2f722fc7a0bb0a" alt="image-20221027113534970"></p></li><li><p>打开浏览器，输入地址：<a href="http://localhost:4000/">http://localhost:4000/</a> ，看到下面的效果，说明你的博客已经构建成功了。</p><p><img src="https://bu.dusays.com/2022/05/26/628e5423df640.webp" alt="博客首页"></p></li></ol><h2 id="9-将静态博客挂载到-GitHub-Pages">9. 将静态博客挂载到 GitHub Pages</h2><ol><li><p>安装 hexo-deployer-git</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure></li><li><p>修改 _config.yml 文件<br>在blog-demo目录下的_config.yml，就是整个Hexo框架的配置文件了。可以在里面修改大部分的配置。详细可参考官方的<a href="https://hexo.io/zh-cn/docs/configuration">配置描述</a>。<br>修改最后一行的配置，将repository修改为你自己的github项目地址即可，还有分支要改为<code>main</code>代表主分支（注意缩进）。</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repository:</span> <span class="string">git@github.com:Fomalhaut-Blog/Fomalhaut-Blog.github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">main</span></span><br></pre></td></tr></table></figure></li><li><p>修改好配置后，运行如下命令，将代码部署到 GitHub（Hexo三连）。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo generate &amp;&amp; hexo deploy  // Git BASH终端</span><br><span class="line">hexo clean; hexo generate; hexo deploy  // VSCODE终端</span><br></pre></td></tr></table></figure><ul><li><p>hexo clean：删除之前生成的文件，若未生成过静态文件，可忽略此命令。</p></li><li><p>hexo generate：生成静态文章，可以用<code>hexo g</code>缩写</p></li><li><p>hexo deploy：部署文章，可以用<code>hexo d</code>缩写</p><p><img src="https://s1.vika.cn/space/2022/10/27/7ed7b8256d75408aa86e90cd37d0ea53" alt="image-20221027113704801"></p><div class="note info no-icon flat"><p>注意：deploy时可能要你输入 username 和 password。</p></div><p>如果出现<code>Deploy done</code>，则说明部署成功了。</p><p><img src="https://s1.vika.cn/space/2022/10/27/85b61e7242214d368539d744b4778a5d" alt="image-20221027113756069"></p><p>稍等两分钟，打开浏览器访问：<a href="https://Fomalhaut-Blog.github.io">https://Fomalhaut-Blog.github.io</a> ，这时候我们就可以看到博客内容了。</p><p><img src="https://s1.vika.cn/space/2022/10/27/6de50dfe03604b07aa26fb7dd5fe1f99" alt="image-20221027113923949"></p></li></ul></li></ol><h2 id="10-无法连接至Github的解决方案">10. 无法连接至Github的解决方案</h2><div class="note info modern"><p>注意：当你在与Github进行ssh通信时候出现超时或者是连接被关闭的情况，可以尝试以下解决方案。</p></div><ol><li><p>挂代理和换网络（这个就不用多说了）</p></li><li><p><a href="https://blog.csdn.net/weixin_41287260/article/details/124368189">Git问题：解决“ssh:connect to host github.com port 22: Connection timed out”</a></p><p>这是评论区的朋友提供的，可以解决SSH连接超时等问题</p></li><li><p>开源项目<a href="https://github.com/521xueweihan/GitHub520">Github520</a></p><p>通过修改Host文件的方法解决访问速度慢的问题</p></li></ol><p>连接有效性检验：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 任选其一即可</span></span><br><span class="line">ping github.com</span><br><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">🥬Hexo博客搭建基础教程(一)</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>网站性能优化的一些小技巧</title>
    <link href="https://www.fomal.cc/posts/b48804d5.html"/>
    <id>https://www.fomal.cc/posts/b48804d5.html</id>
    <published>2022-10-23T18:00:00.000Z</published>
    <updated>2022-10-23T18:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><p>理论部分内容参考自：<a href="https://tzy1997.com/articles/we0522bs/">Web页面全链路性能优化指南</a>，如果仅仅想进行优化不想花费太多时间了解原理可以直接跳到第二部分</p></div><h1 id="一、理论部分">一、理论部分</h1><h2 id="1-浏览器渲染原理">1.浏览器渲染原理</h2><p>我们需要知道浏览器是如何渲染一个页面的，我们才能知道如何对页面进行性能优化，所以这里我们对一些基础知识进行讲解。</p><h3 id="1-1-进程与线程">1.1 进程与线程</h3><p>浏览器有多种进程，其中最主要的5种进程如下：</p><p><img src="https://bu.dusays.com/2022/05/23/628b96c2e0bec.webp" alt="p1"></p><ol><li>浏览器进程 负责界面展示、用户交互、子进程管理、提供存储等</li><li>渲染进程 每个页面都有一个单独的渲染进程，用于渲染页面，包含webworker线程</li><li>网络进程 主要处理网络资源加载（HTML、CSS、JS、IMAGE、AJAX等）</li><li>GPU进程 3D绘制，提高性能</li><li>插件进程 chrome插件，每个插件占用一个进程</li></ol><h3 id="1-2-输入url到页面展示完整过程">1.2 输入url到页面展示完整过程</h3><p><img src="https://bu.dusays.com/2022/05/23/628b9dcaedcbd.jpg" alt="p2"></p><h4 id="1-2-1-用户输入">1.2.1 用户输入</h4><p>用户在浏览器进程输入并按下回车健后，浏览器判断用户输入的url是否为正确的url，如果不是，则使用默认的搜索引擎将该关键字拼接成url。</p><h4 id="1-2-2-卸载原页面并重定向到新页面">1.2.2 卸载原页面并重定向到新页面</h4><p>然后浏览器会将现有页面卸载掉并重定向到用户新输入的url页面，也就是图中【Process Unload Event】和【Redirect】流程。</p><p>此时浏览器会准备一个渲染进程用于渲染即将到来的页面，和一个网络进程用于发送网络请求。</p><h4 id="1-2-3-处理Service-Worker">1.2.3 处理Service Worker</h4><p>如果当前页面注册了Service Worker那么它可以拦截当前网站所有的请求，进行判断是否需要向远程发送网络请求。也就是图中【Service Worker Init】与【Service Worker Fecth Event 】步骤</p><p>如果不需要发送网络请求，则取本地文件。如果需要则进行下一步。</p><h4 id="1-2-4-网络请求">1.2.4 网络请求</h4><p><img src="https://bu.dusays.com/2022/05/23/628b99a83152f.webp" alt="p3"></p><ol><li>根据url查询本地是否已经有强制缓存，如果有则判断缓存是否过期，如果没过期则直接返回缓存内容，也就是图1中【HTTP Cache】步骤</li><li>如果没有强制缓存或者缓存已过期，则将该请求加入队列进行排队准备发送网络请求，也就是图2中【正在排队】，然后进入DNS解析阶段，也就是图1中【DNS】以及图2中的【DNS查找】，DNS根据域名解析出对应的IP地址。(DNS基于UDP)。</li><li>使用IP寻址找到对方，然后根据IP地址+端口号创建一个TCP连接(三次握手)，也就是图1中【TCP】以及图2中的【初始连接】创建完成后利用TCP连接来传输数据。(TCP会将数据拆分为多个数据包，进行有序传输，如果丢包会重发，TCP的特点是可靠、有序)</li><li>判断当前协议是否为https，如果为https，则进行SSL协商，将数据进行加密，如果为http协议则不进行加密(明文传输)，也就是图2中的【SSL】。</li><li>开始发送http请求(请求行/请求头/请求体)，也就是图1中【Request】以及图2中的【已发送请求】。HTTP协议有多个版本，目前使用最多的版本为HTTP/1.1，HTTP/1.1发送完成后默认不会断开。keep-alive 默认打开，为了下次传输数据时复用上次创建的连接。每个域名最多同时建立6个TCP连接，所以同一时间最多发生6个请求。</li><li>服务器收到数据后解析HTTP请求(请求行/请求头/请求体)，处理完成后生成状态码和HTTP响应(响应行/响应头/响应体)后返回给客户端，也就是图2的【等待中】在做的事情。</li><li>客户端接收到HTTP响应后根据状态码进行对应的处理，如果状态码为304则直接代表协商缓存生效，直接取本地的缓存文件。如果不是则下载内容。也就是图1中【Response】以及图2中的【下载内容】步骤。</li></ol><h4 id="1-2-5-服务端响应">1.2.5 服务端响应</h4><p>在网络请求第6步中，服务器收到HTTP请求后需要根据请求信息来进行解析，并返回给客户端想要的数据，这也就服务端响应。</p><p>服务端可以响应并返回给客户端很多种类型的资源，这里主要介绍html类型。</p><p>目前前端处理服务端响应html请求主要分为SSR服务端渲染与CSR客户端渲染，CSR就是返回一个空的HTML模版，然后浏览器加载js后通过js动态渲染页面。SSR是服务端在接受到请求时事先在服务端渲染好html返回给客户端后，客户端再进行客户端激活。</p><p>在打开一个站点的首屏页的完整链路中，使用SSR服务端渲染时的速度要远大于CSR客户端渲染，并且SSR对SEO友好。所以对于首屏加载速度比较敏感或者需要优化SEO的站点来说，使用SSR是更好的选择。</p><h4 id="1-2-6-浏览器渲染详细流程">1.2.6 浏览器渲染详细流程</h4><p>浏览器渲染详细流程主要在网络请求中的地7步。浏览器下载完html内容后进行解析何渲染页面的流程。<br><img src="https://bu.dusays.com/2022/05/23/628ba7881b1a8.webp" alt="p4"><br>渲染流程分为4种情况：</p><ol><li>HTML中无任何CSS相关标签</li><li>CSS相关标签在HTML最顶部，且在解析到内容标签<code>（&lt;div /&gt;）</code>时已经解析完CSS相关标签</li><li>CSS相关标签在HTML最顶部，但在解析到内容标签<code>（&lt;div /&gt;）</code>时CSS相关标签尚未解析完</li><li>CSS相关标签在HTML最底部<br>（略）</li></ol><h3 id="1-3-浏览器处理每一帧的流程">1.3 浏览器处理每一帧的流程</h3><p>浏览器在渲染完页面之后还需要不间断的处理很多内容的，比如动画、用户事件、定时器等。因此当浏览器渲染完页面后，还会在之后的每一帧到来时执行以下的流程。<br><img src="https://bu.dusays.com/2022/05/24/628bb016bb39b.webp" alt="p5"></p><ol><li>【Input events】处理用户事件，先处理【阻塞事件Blocking】包括touch和wheel事件，后处理【非阻塞事件Non-blocking】包括click和keypress。</li><li>【JS】处理完用户事件后执行【定时器Timers】</li><li>【Begin frame】处理完定时器后开始进行【每帧事件Per frame events】的处理，包括窗口大小改变、滚动、媒体查询的更改、动画事件。</li><li>【rAF】处理完帧事件后执行requestAnimationFrame回调函数和IntersectionObserver回调函数。</li><li>【Layout】然后【重新计算样式Recalc style】、【更新布局Update layout】、【调整Observer回调的大小Resize Observer callbacks】</li><li>【Paint】然后【合成更新Compositing update】、【Paint invalidation】、【Record】</li></ol><h2 id="2-Chrome性能优化相关工具">2.Chrome性能优化相关工具</h2><p>了解完浏览器渲染原理，我们还需要知道根据哪些指标才能判断一个页面性能的好坏，在Chrome中这些指标应该怎么获取。以及Chrome都为我们提供了哪些性能相关的工具，如何使用。</p><h3 id="2-1-Chrome-Performance-性能">2.1 Chrome Performance(性能)</h3><p>Performance既是一个Chrome工具，可用于性能检测。<br>同样又是一套JS API，可在Chrome中执行。</p><h4 id="2-1-1-Chrome-Performance-工具的使用">2.1.1 Chrome Performance 工具的使用</h4><p>打开Chrome调试面板选择Performance，中文版为性能，点击刷新按钮，Performance会刷新并录制当前页面，然后我们就可以在面板中看到如下的各种性能相关细节。<br><img src="https://bu.dusays.com/2022/05/24/628bb12aad445.webp" alt="p6"></p><h4 id="2-1-2-使用Performance-API获取性能相关指标">2.1.2 使用Performance API获取性能相关指标</h4><p>接下来我们来了解一下目前常用的性能指标，并且我们需要知道其中一些关键指标如何用Performance API获取。</p><ol><li>TTFB（Time To First Byte）首字节时间：从发送请求到数据返回第一个字节所消耗的时间。</li><li>FP (First Paint) 首次绘制: 第一个像素绘制到页面上的时间。</li><li>FCP (First Contentful Paint) 首次内容绘制: 标记浏览器渲染来自 DOM 第一位内容的时间点，该内容可能是文本、图像、SVG 甚至 元素。</li><li>FMP(First Meaningful Paint) 首次有效绘制: 例如，在 YouTube 观看页面上，主视频就是主角元素。<br>图片可以没加载完成，但整体的骨架已经加载完成了。<br>1秒内完成FMP的概率超过80%，那就代表这个网站是一个性能较好的网站。</li><li>TTI (Time to Interactive) 可交互时间 : DOM树构建完毕，可以绑定事件的时间</li><li>LCP (Largest Contentful Paint) 最大内容渲染: 代表在viewport中最大的页面元素加载的时间。LCP的数据会通过PerformanceEntry对象记录, 每次出现更大的内容渲染, 则会产生一个新的PerformanceEntry对象(2019年11月新增)。</li><li>DCL (DomContentloaded): 当 HTML 文档被完全加载和解析完成之后，DOMContentLoaded 事件被触发，无需等待样式表、图像和子框架的完成加载。</li><li>L (onLoad), 当依赖的资源(图片、文件等), 全部加载完毕之后才会触发。</li><li>L (onLoad), 当依赖的资源(图片、文件等), 全部加载完毕之后才会触发。</li><li>TBT (Total Blocking Time) 页面阻塞总时长: TBT汇总所有加载过程中阻塞用户操作的时长，在FCP和TTI之间任何long task中阻塞部分都会被汇总。</li><li>CLS (Cumulative Layout Shift) 累积布局偏移: 总结起来就是一个元素初始时和其hidden之间的任何时间如果元素偏移了, 则会被计算进去, 具体的计算方法可看这篇文章 <a href="https://web.dev/cls/">https://web.dev/cls/</a></li><li>SI (Speed Index): 指标用于显示页面可见部分的显示速度, 单位是时间。</li></ol><h3 id="2-2-Coverage-覆盖率">2.2 Coverage(覆盖率)</h3><p>获取代码未使用占比。获取代码未使用占比<br><img src="https://bu.dusays.com/2022/05/24/628bb981db5c8.webp" alt="p7"></p><h3 id="2-3-Lighthouse">2.3 Lighthouse</h3><p>获取性能报告并查看推荐优化项。可以在本地安装命令行工具来使用，也可以通过Chrome来使用。<br><img src="https://bu.dusays.com/2022/05/24/628cf77e139ff.webp" alt="p8"></p><h3 id="2-4-Network-网络">2.4 Network(网络)</h3><h4 id="2-4-1-网络请求中的Timing-时间">2.4.1 网络请求中的Timing(时间)</h4><p>能获取网络请求的时间消耗细节，可以根据耗时来决定优化策略。优先优化耗时最长的。<br><img src="https://bu.dusays.com/2022/05/24/628cf966b69da.webp" alt="p9"></p><ul><li>正在排队：网络请求队列的排队时间</li><li>已停止：阻塞住用于处理其他事情的时间</li><li>DNS查找：用于DNS解析IP地址的时间</li><li>初始连接：创建TCP连接时间</li><li>SSL：用于SSL协商的时间</li><li>已发送请求：用于发送请求的时间</li><li>等待中：请求发出至接收响应的时间也可以理解为服务端处理请求的时间</li><li>下载内容：下载响应的时间</li></ul><h4 id="2-4-2-网络请求的优先级">2.4.2 网络请求的优先级</h4><p>浏览器会根据资源的类型决定优先请求哪些资源，优先级高的请求能够优先被加载。<br><img src="https://bu.dusays.com/2022/05/24/628cf9efddd7f.webp" alt="p10"><br>不同资源类型的优先级排序如下：</p><ul><li>最高：html、style</li><li>高：font、fetch、script</li><li>低：image、track</li></ul><h4 id="2-4-3-网页总资源信息">2.4.3 网页总资源信息</h4><p><img src="https://bu.dusays.com/2022/05/24/628cfb20c1315.webp" alt="p11"></p><ul><li>58个请求：网页一共多少个请求</li><li>6.9 MB 项资源：网页资源一共6.9MB大小</li><li>DOMContentLoaded 454 毫秒：DOM加载完毕的时长</li><li>加载时间 1.02 秒：onload完毕的时长</li></ul><h4 id="2-4-4-Network配置">2.4.4 Network配置</h4><p><img src="https://bu.dusays.com/2022/05/24/628cfcbe97759.webp" alt="p12"></p><h2 id="3-网页性能优化">3.网页性能优化</h2><p>上面我们分别讲解了进程与线程、浏览器打开一个页面的完整过程、浏览器处理每一帧时的流程、Chrome性能相关的各种工具以及性能相关的各种指标。以上内容都掌握之后我们再考虑性能优化遍有了思路，我们在页面展示的任意一个步骤中对其进行优化都能对整个网页的展示性能产生影响。</p><p>下面列出了一个页面能优化的所有内容，读者可根据自己的业务情况结合性能工具来做适合自己的优化方式。</p><h3 id="3-1-网络优化策略">3.1 网络优化策略</h3><h4 id="3-1-1-减少HTTP请求数">3.1.1 减少HTTP请求数</h4><p>合并JS、合并CSS、合理内嵌JS和CSS、使用雪碧图。</p><h4 id="3-1-2-使用HTTP缓存">3.1.2 使用HTTP缓存</h4><p>使用强制缓存可以不走网络请求，直接走本地缓存数据来加载资源。</p><p>使用协商缓存可以减少数据传输，当不需要更新数据时可通知客户端直接使用本地缓存。</p><h4 id="3-1-3-使用-HTTP-2-0">3.1.3 使用 HTTP/2.0</h4><p>HTTP/2.0使用同一个TCP连接来发送数据，他把多个请求通过二进制分贞层实现了分贞，然后把数据传输给服务器。也叫多路复用，多个请求复用同一个TCP连接。</p><p>HTTP/2.0会将所有以:开头的请求头做一个映射表，然后使用hpack进行压缩，使用这种方式会使请求头更小。</p><p>服务器可主动推送数据给客户端。</p><h4 id="3-1-4-避免重定向">3.1.4 避免重定向</h4><p>301、302 重定向会降低响应速度。</p><h4 id="3-1-5-使用-dns-prefetch">3.1.5 使用 dns-prefetch</h4><p>DNS请求虽然占用的带宽较少，但会有很高的延迟，由其在移动端网络会更加明显。</p><p>使用 dns-prefetch 可以对网站中使用到的域名提前进行解析。提高资源加载速度。</p><p>通过DNS预解析技术可以很好的降低延迟，在访问以图片为主的移动端网站时，使用DNS预解析的情意中下页面加载时间可以减少5%。</p><h4 id="3-1-6-使用域名分片">3.1.6 使用域名分片</h4><p>在HTTP/1.1中，一个域名同时最多创建6个TCP连接，将资源放在多个域名下可提高请求的并发数。</p><h4 id="3-1-7-CDN">3.1.7 CDN</h4><p>静态资源全上CDN，CDN能非常有效的加快网站静态资源的访问速度。</p><h4 id="3-1-8-压缩">3.1.8 压缩</h4><p>gzip压缩、html压缩、js压缩、css压缩、图片压缩。</p><h4 id="3-1-9-使用contenthash">3.1.9 使用contenthash</h4><p>contenthash可以根据文件内容在文件名中加hash，可用于浏览器缓存文件，当文件没有改变时便直接取本地缓存数据。</p><h4 id="3-1-10-合理使用preload、prefetch">3.1.10 合理使用preload、prefetch</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&lt;link rel=&quot;preload&quot; as=&quot;style&quot; href=&quot;/static/style.css&quot;&gt;</span><br><span class="line">&lt;link rel=&quot;preload&quot; as=&quot;font&quot; href=&quot;/static/font.woff&quot;&gt;</span><br><span class="line">&lt;link rel=&quot;preload&quot; as=&quot;script&quot; href=&quot;/static/script.js&quot;&gt;</span><br><span class="line"></span><br><span class="line">&lt;link rel=&quot;prefetch&quot; as=&quot;style&quot; href=&quot;/static/style.css&quot;&gt;</span><br><span class="line">&lt;link rel=&quot;prefetch&quot; as=&quot;font&quot; href=&quot;/static/font.woff&quot;&gt;</span><br><span class="line">&lt;link rel=&quot;prefetch&quot; as=&quot;script&quot; href=&quot;/static/script.js&quot;&gt;</span><br></pre></td></tr></table></figure><p>两者都不会阻塞<code>onload</code>事件，<code>prefetch</code>会在页面空闲时候再进行加载，是提前预加载之后可能要用到的资源，不一定是当前页面使用的，<code>preload</code>预加载的是当前页面的资源。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">as</span>=<span class="string">&quot;style&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./preload.css&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">article</span>&gt;</span><span class="tag">&lt;/<span class="name">article</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>如上代码，预加载了css但并没有使用。浏览器在页面<code>onload</code>完成一段时间后，发现还没有引用预加载的资源时，浏览器会在控制台输出下图的提示信息。<br><img src="https://bu.dusays.com/2022/05/24/628cfd2d0b279.webp" alt="p13"></p><p>preload和prefetch可根据资源类型决定资源加载的优先级，详细优先级如代码：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">  <span class="comment">&lt;!-- 最高 --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">as</span>=<span class="string">&quot;style&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./file.xxx&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">&lt;!-- 高 --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">as</span>=<span class="string">&quot;font&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./file.xxx&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">as</span>=<span class="string">&quot;fetch&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./file.xxx&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">as</span>=<span class="string">&quot;script&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./file.xxx&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">&lt;!-- 低 --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">as</span>=<span class="string">&quot;image&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./file.xxx&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">as</span>=<span class="string">&quot;track&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./file.xxx&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">article</span>&gt;</span><span class="tag">&lt;/<span class="name">article</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2022/05/24/628cfd767a1b3.webp" alt="p14"></p><h3 id="3-2-浏览器渲染优化策略">3.2 浏览器渲染优化策略</h3><h4 id="3-2-1-关键渲染路径">3.2.1 关键渲染路径</h4><p>当通过JS或者其他任意方式修改DOM后，浏览器会进入如下流程。</p><p>【JS通过API修改DOM】&gt;【计算样式】&gt;【布局(重排)】&gt;【绘制(重绘)】&gt;【合成】。</p><p><code>Reflow 重排</code>：重排在Chrome Performance中叫做布局，通常添加或删除元素、修改元素大小、移动元素位置、获取位置信息都会触发页面的重排，因为重排可能会改变元素的大小位置等信息，这样的改变会影响到页面大量其它元素的大小位置信息，会耗费掉大量的性能，所以在实际应用中我们应该尽可能的减少重排。</p><p><code>Repaint 重绘</code>：重绘在Chrome Performance中叫做绘制，通常样式改变但没有影响位置时会触发重绘操作，重绘性能还好，但我们也需要尽量减少重绘，如果需要做一些动画，我们尽量使用CSS3动画，CSS3动画只需要在初始化时绘制一次，之后的动画都不会触发重绘操作。</p><h4 id="3-2-2-强制同步布局问题">3.2.2 强制同步布局问题</h4><p>在同一个函数内，修改元素后又获取元素的位置时会触发强制同步布局，影响渲染性能。</p><p>强制同步布局会使js强制将【计算样式】和【布局(重排)】操作提前到当前函数任务中，这样会导致每次运行时执行一次【计算样式】和【重排】，这样一定会影响页面渲染性能，而正常情况下【计算样式】和【重排】操作会在函数结束后统一执行。</p><h4 id="3-2-3-如何减少重排与重绘">3.2.3 如何减少重排与重绘</h4><ol><li>脱离文档流(绝对定位、固定定位)，脱离文档流的元素进行重排不会影响到其他元素。</li><li>图片渲染时增加宽高属性，宽高固定后，图片不会根据内容动态改变高度，便不会触发重排。</li><li>尽量用CSS3动画，CSS3动画能最大程度减少重排与重绘。</li><li>使用will-change: transform;将元素独立为一个单独的图层。（定位、透明、transform、clip都会产生独立图层）。</li></ol><h3 id="3-3-静态文件优化策略">3.3 静态文件优化策略</h3><h4 id="3-3-1-图片优化">3.3.1 图片优化</h4><h5 id="3-3-1-1-图片格式">3.3.1.1 图片格式</h5><ol><li><code>jpg(jpeg)</code>：适合色彩丰富的图、Banner图。不适合：图形文字、图标、不支持透明度。</li><li><code>png</code>：适合纯色、透明、图标，支持纯透明和半透明。不适合色彩丰富图片，因为无损储存会导致储存体积大于jpeg。</li><li><code>gif</code>：适合动画、可以动的图标。支持纯透明但不支持半透明，不适合色彩丰富的图片。埋点信息通常也会使用gif发送，因为1x1的gif图发送的网络请求比普通的get请求要小一些。</li><li><code>webp</code>：支持纯透明和半透明，可以保证图片质量和较小的体积，适合Chrome和移动端浏览器。不适合其他浏览器。</li><li><code>svg</code>：矢量格式，大小非常小，但渲染成本过高，适合小且色彩单一的图标。</li></ol><h5 id="3-3-1-2-优化策略">3.3.1.2 优化策略</h5><ul><li>减少图片资源的尺寸和大小，节约用户流量。</li><li>设置<code>alt=”xxx”</code>属性，图像无法显示时会显示alt内容。</li><li>图片懒加载， <code>loading=”lazy”</code>为原生，建议使用<code>IntersectionObserver</code>自己做懒加载。</li><li>不同环境加载不同尺寸和像素的图片srcset与sizes的使用。</li><li>采用渐进式加载 先加载占位图，然后加载模糊小图，最后加载真正清晰的图。</li><li>使用Base64URL 减少图片请求数。</li><li>采用雪碧图合并图片，减少请求数。</li></ul><h4 id="3-3-2-HTML优化">3.3.2 HTML优化</h4><ul><li>语义化HTML，代码简洁清晰，利于SEO，便于开发维护。</li><li>减少HTML嵌套关系，减少DOM节点数量。</li><li>提前声明字符编码，让浏览器快速确定如何渲染网页内容<code>&lt;html lang=&quot;en&quot;&gt; &lt;meta charset=&quot;UTF-8&quot;&gt;</code>。</li><li>删除多余空格、空行、注释、无用属性。</li><li>减少iframe，子iframe会阻塞父级的onload事件。可以使用js动态给iframe赋值，就能解决这个问题。</li><li>避免table布局。</li></ul><h4 id="3-3-3-CSS优化">3.3.3 CSS优化</h4><ul><li>减少伪类选择器，减少选择器层数、减少通配符选择器、减少正则选择器。</li><li>避免css表达式<code>background-color: expression(...)</code>。</li><li>删除空格、空行、注释、减少无意义的单位、css压缩。</li><li>css外链，能走缓存。</li><li>添加媒体字段，只加载有效的css文件。</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;link rel=&quot;stylesheet&quot; href=&quot;./small.css&quot; media=&quot;screen and (max-width:600px)&quot; /&gt;</span><br><span class="line">&lt;link rel=&quot;stylesheet&quot; href=&quot;./big.css&quot; media=&quot;screen and (min-width:601px)&quot;/&gt;</span><br></pre></td></tr></table></figure><ul><li>使用<code>css contain</code>属性，能控制对应元素是否根据子集元素的改变进行重排。</li><li>减少<code>@import</code>使用，因为它使用串行加载。</li></ul><h4 id="3-3-4-JS优化">3.3.4 JS优化</h4><ul><li>通过script的<code>async</code>、<code>defer</code>属性异步加载，不阻塞DOM渲染。</li><li>减少DOM操作，缓存访问过的元素。</li><li>不直接操作真实DOM，可以先修改，然后一次性应用到DOM上。（虚拟DOM、DOM碎片节点）。</li><li>使用webworker解决复杂运算，避免复杂运算阻塞主线程，webworker线程位于渲染进程。</li><li>图片懒加载，使用<code>IntersectionObserver</code>实现。</li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">      <span class="selector-tag">img</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">display</span>: block;</span></span><br><span class="line"><span class="language-css">      &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./01.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./02.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./03.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./04.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./05.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./06.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./07.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./08.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./09.jpg&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;./loading.gif&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;./10.jpg&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">const</span> intersectionObserver = <span class="keyword">new</span> <span class="title class_">IntersectionObserver</span>(<span class="function">(<span class="params">changes</span>) =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">        changes.<span class="title function_">forEach</span>(<span class="function">(<span class="params">item, index</span>) =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">          <span class="keyword">if</span> (item.<span class="property">intersectionRatio</span> &gt; <span class="number">0</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            intersectionObserver.<span class="title function_">unobserve</span>(item.<span class="property">target</span>)</span></span><br><span class="line"><span class="language-javascript">            item.<span class="property">target</span>.<span class="property">src</span> = item.<span class="property">target</span>.<span class="property">dataset</span>.<span class="property">src</span></span></span><br><span class="line"><span class="language-javascript">          &#125;</span></span><br><span class="line"><span class="language-javascript">        &#125;)</span></span><br><span class="line"><span class="language-javascript">      &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">const</span> domImgList = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&quot;img&quot;</span>);</span></span><br><span class="line"><span class="language-javascript">      domImgList.<span class="title function_">forEach</span>(<span class="function">(<span class="params">domImg</span>) =&gt;</span> intersectionObserver.<span class="title function_">observe</span>(domImg));</span></span><br><span class="line"><span class="language-javascript">    </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><ul><li>虚拟滚动</li><li>使用<code>requestAnimationFrame</code>来做动画，使用<code>requestIdleCallback</code>来进行空闲时的任务处理。</li><li>尽量避免使用eval，性能差。</li><li>使用事件委托，能减少事件绑定个数。事件越多性能越差。</li><li>尽量使用<code>canvas</code>、<code>css3</code>动画。</li><li>通过chrome覆盖率（Coverage）工具排查代码中未使用过的代码并将其删除。</li><li>通过chrome性能（Performance）工具查看每个函数的执行性能并优化。</li></ul><h4 id="3-3-5-字体优化">3.3.5 字体优化</h4><p><code>FOUT</code>(Flash of Unstyled Text）等待一段时间，如果没加载完成，先显示默认。加载 后再进行切换。</p><p><code>FOIT</code>(F1ash of Invisib1e Text） 字体加载完毕后显示，加载超时降级系统字体（白屏）。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="keyword">@font-face</span> &#123;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">font-family</span>: <span class="string">&#x27;hagan&#x27;</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">src</span>: <span class="built_in">url</span>(<span class="string">&#x27;./font.ttc&#x27;</span>);</span></span><br><span class="line"><span class="language-css">      <span class="attribute">font-display</span>: swap;</span></span><br><span class="line"><span class="language-css">      <span class="comment">/* b1ock 35 内不显示，如果没加载完毕用默认的 */</span></span></span><br><span class="line"><span class="language-css">      <span class="comment">/* swap 显示老字体 在替换*/</span></span></span><br><span class="line"><span class="language-css">      <span class="comment">/* fa11back 缩短不显示时间，如果没加载完毕用默认的，和b1ock类似*</span></span></span><br><span class="line"><span class="comment"><span class="language-css">      /* optional 替换可能用字体 可能不替换*/</span></span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-tag">article</span> &#123;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">font-family</span>: hagan;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">  </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">article</span>&gt;</span>ABC abc<span class="tag">&lt;/<span class="name">article</span>&gt;</span>  </span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="3-4-浏览器储存优化策略">3.4 浏览器储存优化策略</h3><h4 id="3-4-1-Cookie">3.4.1 Cookie</h4><p><code>cookie</code>在过期之前一直有效，最大储存大小为4k，限制字段个数，不适合大量的数据储存，每次请求会携带<code>cookie</code>，主要用来做身份校验。<br>优化方式：</p><ol><li>需要合理设置cookie有效期。</li><li>根据不同子域划分cookie来减少cookie传输。</li><li>静态资源域名和cookie域名采用不同域名，避免静态资源请求携带cookie。</li></ol><h4 id="3-4-2-LocalStorage">3.4.2 LocalStorage</h4><p>Chrome下最多储存5M，除非手动清除，否则一直存在。可以利用<code>localStorage</code>储存静态资源。比如储存网页的<code>.js</code>、<code>.css</code>，这样会使页面打开速度非常快。例如 <a href="https://m.baidu.com">百度</a></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// index.js</span></span><br><span class="line"><span class="keyword">const</span> name = <span class="string">&#x27;hagan&#x27;</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">showName</span> () &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(name)</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">showName</span>()</span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- index.html --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://lib.baomitu.com/axios/0.26.1/axios.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="title function_">cacheFile</span>(<span class="string">&#x27;/index.js&#x27;</span>)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">cacheFile</span> (url) &#123;</span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">const</span> fileContent = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(url)</span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">if</span> (fileContent) &#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="built_in">eval</span>(fileContent)</span></span><br><span class="line"><span class="language-javascript">      &#125; <span class="keyword">else</span> &#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> &#123; data &#125; = <span class="keyword">await</span> axios.<span class="title function_">get</span>(url)</span></span><br><span class="line"><span class="language-javascript">        <span class="built_in">eval</span>(data)</span></span><br><span class="line"><span class="language-javascript">        <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(url, data)</span></span><br><span class="line"><span class="language-javascript">      &#125;</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript">  </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="3-4-3-SessionStorage">3.4.3 SessionStorage</h4><p>会话级别储存，可用于页面间的传值。</p><h4 id="3-4-4-IndexDB">3.4.4 IndexDB</h4><p>浏览器的本地数据库，大小几乎无上限。</p><h3 id="3-5-其他优化策略">3.5 其他优化策略</h3><ul><li>关键资源个数越多，首次页面加载时间就会越长。</li><li>关键资源的大小，内容越小下载时间越短。</li><li>优化白屏，合理使用内联css、js。</li><li>预渲染，打包时进行预渲染，生成静态HTML文件，用户访问时直接返回静态HTML。</li><li>服务端渲染同构，加速首屏速度（耗费服务端资源），有利于SEO优化。首屏使用服务端渲染，后续交互使用客户端渲染。</li></ul><h3 id="3-6-使用PWA提高用户体验">3.6 使用PWA提高用户体验</h3><p>webapp用户体验差的一大原因是不能离线访问。用户粘性低的一大原因是无法保存入口，PWA就是为了解决webapp的用户体验问题而诞生的。使用PWA能令站点拥有快速、可靠、安全等特性。</p><ol><li><code>Web App Manifest</code> 将网站添加到电脑桌面、手机桌面，类似Native的体验。</li><li><code>Service Worker</code> 配合<code>Cache API</code>，能做到离线缓存各种内容。</li><li><code>Push API</code> 配合 <code>Notification API</code>，能做到类似Native的消息推送与实时提醒。</li><li><code>App Shell</code> 配合 <code>App Skeleton</code>，能做App壳与骨架屏。</li></ol><h1 id="二、优化小技巧实操">二、优化小技巧实操</h1><h2 id="1-图片压缩">1.图片压缩</h2><h3 id="1-1-图片多级压缩">1.1 图片多级压缩</h3><p>目前从网上下载的图片主流格式是<code>JPG</code>或者<code>PNG</code>，当分辨率比较高的时候体积往往比较大，因此要想提高网站的速度就有必要将图片体积压缩，这里参考店长的推荐，无损压缩推荐<a href="https://tinypng.com/">Tinypng</a>，有损压缩推荐<a href="https://github.com/meowtec/Imagine/releases">imagine</a>。</p><table><thead><tr><th style="text-align:left"></th><th style="text-align:center">TinyPNG</th><th>Imagine</th></tr></thead><tbody><tr><td style="text-align:left">特点</td><td style="text-align:center">无损压缩</td><td>有损压缩，以牺牲图像质量， 降低图像色彩来达到缩减图像大小的目的。</td></tr><tr><td style="text-align:left">优点</td><td style="text-align:center">能够完全保留图像色彩，不损伤图像质量</td><td>1. 压缩程度高，支持转<code>png</code>为<code>jpg</code>或<code>webp</code>，进一步减少图片大小 2. 软件支持一次处理多张图片，无上限，处理完成支持直接批量覆盖原文件或重命名</td></tr><tr><td style="text-align:left">缺点</td><td style="text-align:center">单次仅能上传20张图片，每张限制大小为5MB，无法处理更大图片。</td><td>PNG转其他格式为不可逆操作（指覆盖保存后），且可能反而会增加图片大小。</td></tr></tbody></table><p>在这里还给大家推荐一个非常实用的网站：<a href="https://imagestool.com/zh_CN/index.html">imagesTool</a></p><p><img src="https://source.fomal.cc/siteshot/imagestool.com.jpg" alt=""></p><p>这个网站不仅仅支持将<code>PNG</code>与<code>JPG</code>格式的图片批量（完全没有数量限制那种）转化为<code>webp</code>和<code>avif</code>（chrome推荐的一种压缩率更高的编码方式），而且还能改变图片的原始分辨率，甚至将图片压缩到指定的大小，下面演示了一张图压缩之路！</p><img src="https://s1.vika.cn/space/2022/10/25/c82f67799a524abc8cbaef90b8bf9131" alt="image-20221025131104569" style="zoom:50%;" /><p>我们选择了将<code>PNG</code>转化为<code>webp</code>格式，画质为<code>High</code>，图片规模缩小为<code>80%</code>，压缩率达到94%；而选择将<code>PNG</code>转化为<code>avif</code>格式，画质为<code>High</code>，图片规模缩小为<code>80%</code>，压缩率达到95%，这样下来我们可以把所有图片几乎都可以控制在<code>500KB</code>以下，而且肉眼观察画质没有明显的不同。</p><img src="https://s1.vika.cn/space/2022/10/25/6e15b7e6ad79406b8320108aaa8e62a9" alt="image-20221025130942155" style="zoom: 67%;" /><div class="note info flat"><p>使用建议:如果没有特别要求，直接使用Imagine进行有损压缩即可。虽然说是有损压缩，但是默认压缩会自主计算压缩程度，一般默认程度就能节省70%空间，且肉眼几乎发现不了图片压缩情况。同时我个人是比较推荐一步到位直接压缩成<code>webp</code>格式，虽然在一些未适配的浏览器（例如IE浏览器）上可能出现无法查看图片的情况，但是压缩率是真的高，图片一路下来压缩个<code>80%</code>毫无压力。如果对图片分辨率要求不太高或者图片分辨率原本就太高了，可以考虑缩小分辨率，结合上面几项，甚至可以压缩<code>90%</code>的大小！</p></div><h3 id="1-2-图片懒加载">1.2 图片懒加载</h3><p>图片懒加载是指只加载目前能看到及其附近的页面上的图片，有节省流量与提高性能的作用。Butterfly主题内置了图片懒加载的选项，在<code>_config.butterfly.yml</code>文件下将对应项设置为如下即可：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Lazyload (圖片懶加載)</span></span><br><span class="line"><span class="comment"># https://github.com/verlok/vanilla-lazyload</span></span><br><span class="line"><span class="attr">lazyload:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">field:</span> <span class="string">site</span> <span class="comment"># site/post 选择在哪些地方启用图片懒加载</span></span><br><span class="line">  <span class="attr">placeholder:</span> <span class="comment"># 你自己喜欢的图片</span></span><br><span class="line">  <span class="attr">blur:</span> <span class="literal">true</span><span class="comment"># 模糊效果</span></span><br></pre></td></tr></table></figure><h2 id="2-字体二级压缩">2.字体二级压缩</h2><p>我们从网上下载的字体通常都是<code>TTF</code>格式，ttf(TrueTypeFont)是一种字库名称，是Apple公司和Microsoft公司共同推出的字体文件格式，也是最常用的格式之一，但是一些好看的字体往往体积都会很大，网站每次进去都要加载一个这么大的文件，速度肯定会很慢！例如下面这个筑紫A丸2.0的标准体ttf格式的字体文件，体积约为23MB。</p><p><img src="https://s1.vika.cn/space/2022/10/25/ca08a96314c5429b934b7ef977854650" alt="image-20221025131822607"></p><p>这部分参考：<a href="https://blog.csdn.net/littleduo/article/details/124563106">有效的压缩字体方法</a></p><p>一个有效的压缩方法是：<code>fonttools编码压缩+转woff2格式</code>二级压缩</p><h3 id="2-1-使用-fonttools-压缩字体文件">2.1 使用 fonttools 压缩字体文件</h3><p>需要 <code>Python</code> 环境，并已安装好 <code>pip</code>，使用 <code>pip</code> 来安装 <code>fonttools</code></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install fonttools</span><br></pre></td></tr></table></figure><p>下载已经整理好的字体编码列表文件<code>sc_unicode.txt</code> <a href="https://gist.githubusercontent.com/imaegoo/d64e5088b723c2e02c40985f55ff12db/raw/5ebd2ce49418c73459a9dfe050483409306a6c1d/sc_unicode.txt">点这里进行下载</a>。</p><p>将你要压缩的字体ttf文件和刚刚下载的sc_unicode.txt编码文件放进去同一个文件夹，进入到该文件夹的控制台如下命令然后回车</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pyftsubset ZhuZiAWan-3.ttf --unicodes-file=sc_unicode.txt</span><br></pre></td></tr></table></figure><p><img src="https://s1.vika.cn/space/2022/10/25/922e9871848443c1aa79f7ca01c9bfe7" alt="image-20221025133032806"></p><p><img src="https://s1.vika.cn/space/2022/10/25/69bee2e71ec24c1eb6c4c9d6dd874f5a" alt="image-20221025133103786"></p><p>然后就会得到图片所示的subset结尾的编码压缩后的ttf文件，体检体积已经从23MB下降到3MB。</p><h3 id="2-2-利用CloudConvert将TTF格式转换成woff2-格式">2.2 利用CloudConvert将<code>TTF</code>格式转换成<code>woff2</code> 格式</h3><p>进去国外平台<a href="https://cloudconvert.com/">CloudConvert</a>（国内速度可能会慢一些），将TTF格式的字体文件转化为<code>woff2</code>格式</p><p><img src="https://s1.vika.cn/space/2022/10/25/10aa744585094dbf9914ac029500f51c" alt="image-20221025133728970"></p><p>最后压缩成从<code>23MB</code>的文件压缩成<code>1.5MB</code>，足足压缩了十几倍，压缩率十分高！</p><h2 id="3-css和js文件优化">3.css和js文件优化</h2><h3 id="3-1-压缩css与js文件">3.1 压缩css与js文件</h3><ul><li><p>如果是用<code>VSCODE</code>进行网站搭建的小伙伴，可以下载插件<a href="https://github.com/olback/es6-css-minify/tree/3.0">JS &amp; CSS Minifier (Minify)</a></p></li><li><p>该插件支持将<code>js</code>和<code>css</code>文件的格式进行压缩，降低文件体积</p></li><li><p>使用方法：安装插件后，在<code>js</code>和<code>css</code>文件界面右键，选择<code>Minify Document</code>，插件会生成一个文件名为<code>xxx.min.css</code>或者<code>xxx.min.js</code>的文件，这就是压缩后的文件，在引入的时候直接引用这个压缩后的文件即可。</p></li></ul><img src="https://s1.vika.cn/space/2022/10/25/1e054153b72f4f429dc3a9a6086ccdb5" alt="image-20221025134609440" style="zoom: 33%;" /><h3 id="3-2-gulp批量压缩">3.2 gulp批量压缩</h3><p>这是压缩全局静态资源的教程，可以参考店长的文章：</p><div class="tag link"><a class="link-card" title="使用gulp压缩博客静态资源" href="https://akilar.top/posts/49b73b87/"><div class="left"><img src="https://cdn.cbd.int/akilar-candyassets@1.0.36/image/siteicon/favicon.ico"/></div><div class="right"><p class="text">使用gulp压缩博客静态资源</p><p class="url">https://akilar.top/posts/49b73b87/</p></div></a></div><h3 id="3-3-减少加载项">3.3 减少加载项</h3><p>当网站的东西多起来了之后，会越来越卡顿，这时候推荐以下几个优化方向：</p><ul><li>减少卡片的出场动画<code>wowjs</code>、<code>Live2D</code>、<code>canvas</code>元素等(其中Live2D是比较消耗资源的)</li><li>如果部分js和css文件只有部分页面需要引用，尽量不全局引用，同时删除空格、空行、注释、减少无意义的单位</li><li>css文件尽量添加media字段指定加载设备，js文件的引入可以加入 的 <code>async</code>、<code>defer</code> 属性异步加载，不阻塞 DOM 渲染</li></ul><h2 id="4-无服务器下的资源加速策略">4.无服务器下的资源加速策略</h2><h3 id="4-1-可用的免费CDN选择">4.1 可用的免费CDN选择</h3><p><strong>1.staticaly</strong></p><p>官网地址：<a href="https://www.staticaly.com">https://www.staticaly.com</a><br>轻松地从GitHub / GitLab / Bitbucket等加载您的项目 没有流量限制或限制。</p><p>文件通过超快速全球CDN提供。 在URL（不是分支）中使用特定标记或提交哈希。<br>根据URL永久缓存文件。 除master分支外，文件在浏览器中缓存1年。 具体用法：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"># GitHub CDN</span><br><span class="line">https://cdn.staticaly.com/gh/:user/:repo/:tag/:file</span><br><span class="line">https://cdn.staticaly.com/gh/growvv/growvv.github.io/master/README.md</span><br><span class="line"></span><br><span class="line"># GitLab CDN</span><br><span class="line">https://cdn.staticaly.com/gl/:user/:repo/:tag/:file</span><br><span class="line"></span><br><span class="line"># Bitbucket CDN</span><br><span class="line">https://cdn.staticaly.com/bb/:user/:repo/:tag/:file</span><br><span class="line"></span><br><span class="line"># WordPress CDN</span><br><span class="line">https://cdn.staticaly.com/wp/c/:version/wp-includes/:file  </span><br><span class="line">https://cdn.staticaly.com/wp/p/:plugin_name/:version/:file  </span><br><span class="line">https://cdn.staticaly.com/wp/t/:theme_name/:version/:file</span><br><span class="line"></span><br><span class="line"># Imgpx CDN</span><br><span class="line">https://cdn.staticaly.com/img/:image_url</span><br><span class="line"></span><br><span class="line"># Favicons CDN</span><br><span class="line">https://cdn.staticaly.com/favicons/:favicon_url</span><br></pre></td></tr></table></figure><p><strong>2.githack</strong></p><p>直接从GitHub，Bitbucket或GitLab提供原始文件<br>官网地址：<a href="https://liubing.me/goto/http://raw.githack.com">http://raw.githack.com/</a> 具体用法和上面的<code>staticaly</code>很类似</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># Github CDN</span><br><span class="line">//主分支</span><br><span class="line">https://rawcdn.githack.com/liub1934/LB-Blog/master/wp-content/themes/Memory/emoji/xiaodianshi/baiyan.png</span><br><span class="line"></span><br><span class="line">//版本分支</span><br><span class="line">https://rawcdn.githack.com/liub1934/LB-Blog/8806f440d3f9a7cc3e6125d7d75564e40262c6a8/wp-content/themes/Memory/emoji/xiaodianshi/baiyan.png</span><br></pre></td></tr></table></figure><p><strong>3.TianliCDN</strong></p><p><a href="https://tianli-blog.club/jsd/">https://tianli-blog.club/jsd/</a></p><p>轻量级私人CDN，申请见：<a href="https://tianli-blog.club/jsd/">https://tianli-blog.club/jsd/</a></p><p>4.UNPKG</p><p>见：<a href="https://unpkg.com/">https://unpkg.com/</a></p><h3 id="4-2-免费图床推荐">4.2 免费图床推荐</h3><ol><li><p>目前我是用的Github公共仓库+Vercel部署加速，速度还可以，关键是支持增量更新和自动部署，不过前期的配置比较麻烦点，你也可以选用Github公共仓库+Cloudflare部署加速，速度和Vercel接近。</p></li><li><p>大概步骤就是建立一个公共仓库，把你本地的图片推上这个仓库，然后将这个仓库部署托管于Vercel，再用一个二级域名绑定这个部署，那就可以通过二级域名+路径的方式访问到图片与资源了。每次仓库更新导致指定分支更新，都会触发Vercel重新部署，实现自动化流程。（这部分教程以后有机会详细写）</p></li><li><p>如果不想折腾或者只想存少量不太重要的图片，那么完全可以用公共的免费图床，下面列举了一些免费的图床：</p><ul><li><p><a href="https://smms.app/">SMMS</a></p></li><li><p><a href="https://www.superbed.cn/">聚合图床</a></p></li><li><p><a href="https://www.hualigs.cn/">遇见图床</a></p></li><li><p><a href="https://postimages.org/">PostImage</a></p></li><li><p><a href="https://imgse.com/">路过图床</a></p></li><li><p><a href="https://www.imgurl.org/">imgURL</a></p></li><li><p><a href="https://dash.cloudflare.com/">Cloudflare Pages</a></p></li><li><p><a href="https://imgbox.com/">imgbox</a></p></li><li><p><a href="https://pic.iqy.ink/upload">Lsky Pro</a></p></li><li><p><a href="https://upload.cc/">Upload.cc</a></p></li><li><p><a href="https://imagelol.com/">imagelol</a></p></li></ul></li></ol><h3 id="4-3-域名绑定的好处">4.3 域名绑定的好处</h3><p>目前Vercel的域已经被GFW墙了，如果想用Vercel托管网站又想在国内访问又不想科学上网，只能绑定国内域名，还有想用Vercel来进行资源加速也必须是有国内域名的，同时域名还可以拥有自己的域名邮箱与网站标识符，总之域名还是很有用的。对于静态网站来说你可以没有服务器，但是你不能没有域名。</p><h3 id="4-4-托管平台的选择">4.4 托管平台的选择</h3><p>目前能够托管静态网站的平台有以下几个</p><ol><li><a href="https://vercel.com/">Vercel</a>（不限量、速度较快） 推荐指数：🌟🌟🌟🌟🌟</li><li><a href="https://www.cloudflare.com/">Cloudflare</a>（不限量、速度还可以） 推荐指数：🌟🌟🌟🌟</li><li><a href="https://www.4everland.org/">4EVERLAND</a>（流量限制100GB、速度还可以、适合做备用线路） 推荐指数：🌟🌟🌟</li><li><a href="https://www.netlify.com/">Netlify</a>（流量限制100GB、速度还可以、适合做备用线路） 推荐指数：🌟🌟🌟</li><li><a href="https://pages.github.com/">Github Pages</a>（不限量、速度较慢） 推荐指数：🌟🌟</li><li><a href="https://gitee.com/">Gitee Pages</a>（不限量、速度还可以、但是Gitee与国外平台兼容性差） 推荐指数：🌟🌟</li><li>还有其他的例如<a href="https://docs.gitlab.com/ee/user/project/pages/">GitLab Pages</a>等就不说了，估计没啥人用</li></ol><h2 id="5-实用工具">5.实用工具</h2><h3 id="5-1-Lighthouse">5.1 Lighthouse</h3><p>Lighthouse 是一个网站性能测评工具， 它是 Google Chrome 推出的一个开源自动化工具，能够对 PWA 和网页多方面的效果指标进行评测，并给出最佳实践的建议以帮助开发者改进网站的质量。它的使用方法也非常简单，我们只需要提供一个要测评的网址，它将针对此页面运行一系列的测试，然后生成一个有关页面性能的报告。通过报告我们就可以知道需要采取哪些措施来改进应用的性能和体验。</p><p>在高版本（应该是 &gt;= 60）的 Chrome 浏览器中，Lighthouse 已经直接集成到了调试工具 DevTools 中了，因此不需要进行任何安装或下载。按 F12 打开开发者工具，可以看到在 console、security 等选项后面有一个 Audits （安装了lighthouse插件或者是高版本的谷歌浏览器可能显示的是 lighthouse）选项，选择该选项，然后点击 generate report 即可。</p><p><img src="https://s1.vika.cn/space/2022/10/25/d278a76bbd774b1d9912e74aa15b22c5" alt="image-20221025173341316"></p><p><img src="https://s1.vika.cn/space/2022/10/25/1d8b86f79de7449782b0c73e897edeb0" alt="image-20221025173705571"></p><p>使用 Lighthouse 对网站进行测评后，我们会得到一份评分报告，它包含了性能（Performance），访问无障碍（Accessibility），最佳实践（Best Practice），搜索引擎优化（SEO），PWA（Progressive Web App）五个部分：</p><h4 id="5-1-1-性能（Performance）">5.1.1 性能（Performance）</h4><p>性能评分的分值区间是0到100，如果出现0分，通常是在运行 Lighthouse 时发生了错误，满分100分代表了网站已经达到了98分位值的数据，而50分则是75分位值的数据。</p><p>影响评分的性能指标：性能测试结果会分成 Metrics，Diagnostic，Opportunities 三部分，但只有 Metrics 部分的指标项会对分数产生直接影响。</p><p>Lighthouse 会衡量以下 Metrics 性能指标项：</p><ul><li>首次内容绘制（First Contentful Paint）。即浏览器首次将任意内容（如文字、图像、canvas 等）绘制到屏幕上的时间点。</li><li>首次有效绘制（First Meaningful Paint）。衡量了用户感知页面的主要内容（primary content）可见的时间。对于不同的站点，首要内容是不同的，例如：对于博客文章，标题及首屏文字是首要内容，而对于购物网站来说，图片也会变得很重要。</li><li>首次 CPU 空闲（First CPU Idle）。即页面首次能够对输入做出反应的时间点，其出现时机往往在首次有效绘制完成之后。该指标目前仍处于实验阶段。</li><li>可交互时间（Time to Interactive）。指的是所有的页面内容都已经成功加载，且能够快速地对用户的操作做出反应的时间点。该指标目前仍处于实验阶段。</li><li>速度指标（Speed Index）。衡量了首屏可见内容绘制在屏幕上的速度。在首次加载页面的过程中尽量展现更多的内容，往往能给用户带来更好的体验，所以速度指标的值约小越好。</li><li>输入延迟估值（Estimated Input Latency）。这个指标衡量了页面对用户输入行为的反应速度，其基准值应低于 50ms。</li></ul><p>Metrics 部分的指标项会直接影响分数，可以作为我们的主要参考点。</p><p>另外的两部分中， <strong>Opportunities</strong> 指的是优化机会，它提供了详细的建议和文档，来解释低分的原因，帮助我们具体进行实现和改进。<strong>Diagnostics</strong> 指的是现在存在的问题，为进一步改善性能的实验和调整给出了指导。这两者不会纳入分数的计算。</p><p>每一项性能指标对评分的贡献都有其计算逻辑，Lighthouse 会将原始的性能值映射成为 0-100 之间的数字。</p><p>例如，FMP（First Meaningful Paint）的原始值是从页面初始化开始到主要内容渲染成功的耗时，根据真实站点的数据，顶级性能的站点的 FMP 值约为 1220ms，这个值会被映射成 Lighthouse 的 99 分。</p><p>针对不同的评分，Lighthouse 用了不同的颜色进行标注，分值区间和颜色的对应关系如下：</p><ul><li>0 - 49（慢）：红色</li><li>50 - 89（平均值）： 橙色</li><li>90 - 100（快）： 绿色</li></ul><h4 id="5-1-2-访问无障碍（Accessibility）">5.1.2 访问无障碍（Accessibility）</h4><p>访问无障碍评分的分值由相关指标的加权平均值计算而来。可以在<a href="https://www.cnblogs.com/ypSharing/p/15793767.html#gid=0">评分详情</a>查阅每项指标的具体权重。同理，较大权重的指标项对分数的影响较大。</p><p>无障碍性的每个指标项测试结果为pass或者fail，与性能指标项的计算方式不同，当页面只是部分通过某项指标时，页面的这项指标将不会得分。例如，如果页面中的一些元素有屏幕阅读器友好的命名，而其他的元素没有，那么这个页面的 screenreader-friendly-names 指标项得分为0。</p><h4 id="5-1-3-最佳实践（优化）（Best-Practice）">5.1.3 最佳实践（优化）（Best Practice）</h4><p>最佳实践评分的分数区间为0-100。影响这项评分的指标项的权重都是相同的。</p><p>比如：推荐使用 https，跨域的跳转链接需要使用 rel 标识，不能使用废弃的 API等等。</p><h4 id="5-1-4-搜索引擎优化（SEO）">5.1.4 搜索引擎优化（SEO）</h4><p>比如：图片元素使用 alt 属性等等提高搜索引擎搜索排名，便于搜索引擎能找到你这个网站。</p><h4 id="5-1-5-PWA（Progressive-Web-App）">5.1.5 PWA（Progressive Web App）</h4><p>Lighthouse 使用 PWA 基准检查项列表（Baseline PWA Checklist）进行测评，测评结果将这些指标项分成了四个类别，共包含12个自动测试项和3个手动测试项，其中各个自动测试项的评分权重是相同的。PWA 的评测指标对我们来说非常重要，我们可以从这四个类别详细了解一下基准指标项。</p><ul><li><p><strong>快速可靠：</strong></p><ol><li>页面在移动网络条件下能够快速加载。</li><li>在离线条件下页面能够返回状态码200。这里我们可以通过 Service Worker 来实现离线可用。</li><li>start_url 在离线条件下返回状态码200。start_url 是前面章节我们提到过的 manifest.json 中的一个属性，它指定了用户打开该 PWA 时加载的 URL。</li></ol></li><li><p><strong>可安装：</strong></p><ol><li>始终使用 HTTPS。</li><li>注册 Service Worker 来缓存页面以及 start_url。</li><li>使用 manifest 文件来实现安装 PWA 的需求，浏览器能够主动通知用户将应用添加到桌面，增加留存率。</li></ol></li><li><p><strong>PWA 优化：</strong></p><ol><li>将 HTTP 流量重定向到 HTTPS。</li><li>配置自定义启动画面。</li><li>设置地址栏主题颜色。</li><li>页面内容针对视口大小自适应，对移动用户的展示更友好。</li><li>使用了 <meta name="viewport"> 标签，并设置了 width 或 initial-scale 属性。</li><li>当 JavaScript 文件不可用时，提供降级措施，页面能显示基本内容而不出现白屏。</li></ol></li><li><p><strong>手动测试项：</strong></p><ol><li>站点跨浏览器可用，如主流浏览器 Chrome, Edge, Firefox 及 Safari 等。</li><li>页面间切换流畅，即使在较差的网络环境下，切换动画也应该简洁顺畅，这是提高用户感知体验的关键。</li><li>保证每个页面都有独一无二的 URL，能够在新的浏览器窗口打开，且方便在社交媒体上进行分享。</li></ol></li></ul><p>除了上述基准指标项之外，为了让 PWA 的体验更加完美，还有一些 Lighthouse 未实现检查的进阶指标，也就是可以作为示范性参考的 PWA 的指标，比如用户体验、缓存、推送通知等等。</p><h3 id="5-2-灵雀监控">5.2 灵雀监控</h3><p>灵雀应用监控平台最国内老牌知名免费网站统计51LA网站统计旗下的一个 Web 性能与 bug 监控工具平台，发布后在站长圈内也有一些较好的评价，访问地址：<a href="https://perf.51.la/">https://perf.51.la</a>。51LA灵雀应用监控平台，专注于帮您及时发现异常问题，帮助运营人员发现网站风险，协助开发者修复网页 bug，从而提升用户体验。产品面向产品，运营以及开发人员作为网站性能及异常信息收集工具。开发人员可以通过页面统计获取用户平均的页面统计信息和网页 Performance 的各个性能指标进行分析，如DNS 解析时间，TTFB、服务器响应时间、白屏时间、页面完全加载时长等是否达标等判断。灵雀应用监控平台为开发人员提供了包含程序异常收集、性能分析、资源异常分析、页面外链跳转分析、可疑脚本/iframe 监控等网站优化和用户体验改进所需的信息。</p><p><strong>特点：</strong></p><ul><li>大家是否有遇到过下面这些情况：</li><li>网站打开速度慢找不到原因；</li><li>部分访客无法打开网站又不能及时得到反馈；</li><li>网站突然无流量或被k 却无从查起起因；</li></ul><p><strong>1.异常分析，精准定位</strong></p><p><img src="https://s1.vika.cn/space/2022/10/25/2b1d0d3c50394c688f8046819584f7d9" alt="image-20221025174453208"></p><p>实时监控网站发生的程序错误、网络请求异常、资源加载异常等潜在问题，精准采集错误上报的页面、错误发生时间、UA等详细的用户设备数据，帮您快速定位异常，提高debug效率。</p><p><strong>2.性能监测，定向优化</strong></p><p><img src="https://s1.vika.cn/space/2022/10/25/ca16cee5817742389e20d66a9f11df46" alt="image-20221025174556202"></p><p>采用51LA V6网站统计的多维分析技术，详细展示分析网站性能加载状况，确定网站体验优化方向。</p><p><strong>3.外链监控，规避暗链</strong></p><p><img src="https://s1.vika.cn/space/2022/10/25/52897c1a5b2042ef8bf27ae299b1ea0c" alt="image-20221025174628427"></p><p>提供24小时全方位监控站内外链的功能，定位异常跳转，助您快速识别暗链链接，降低网站被k风险，提升网站安全性。</p>]]></content>
    
    
    <summary type="html">🍔这篇文章将从理论和实际来提升你网站的性能</summary>
    
    
    
    <category term="魔改教程" scheme="https://www.fomal.cc/categories/%E9%AD%94%E6%94%B9%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://www.fomal.cc/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://www.fomal.cc/tags/Butterfly/"/>
    
  </entry>
  
</feed>
