<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>JavaScript on 清风客</title>
        <link>https://xuewexin.github.io/tags/javascript/</link>
        <description>Recent content in JavaScript on 清风客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <copyright>等我</copyright>
        <lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://xuewexin.github.io/tags/javascript/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>软件开发框架期末复习重点（精简归纳版）</title>
        <link>https://xuewexin.github.io/p/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0%E9%87%8D%E7%82%B9%E7%B2%BE%E7%AE%80%E5%BD%92%E7%BA%B3%E7%89%88/</link>
        <pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate>
        
        <guid>https://xuewexin.github.io/p/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0%E9%87%8D%E7%82%B9%E7%B2%BE%E7%AE%80%E5%BD%92%E7%BA%B3%E7%89%88/</guid>
        <description>&lt;img src="https://xuewexin.github.io/p/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0%E9%87%8D%E7%82%B9%E7%B2%BE%E7%AE%80%E5%BD%92%E7%BA%B3%E7%89%88/cover.png" alt="Featured image of post 软件开发框架期末复习重点（精简归纳版）" /&gt;&lt;h2 id=&#34;前言&#34;&gt;前言
&lt;/h2&gt;&lt;p&gt;这是一份软件开发框架课程的期末复习重点，涵盖了 HTML、CSS、JavaScript 和 jQuery 四大板块的核心知识点。精简归纳，方便考前快速回顾。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一html-核心知识点&#34;&gt;一、HTML 核心知识点
&lt;/h2&gt;&lt;h3 id=&#34;1-图片标签-img-属性&#34;&gt;1. 图片标签 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 属性
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;属性&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;src&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;图片路径（URL）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;alt&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;替代文本（图片无法显示时展示，辅助屏幕阅读器）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;鼠标悬停时的提示文字&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;width&lt;/code&gt; / &lt;code&gt;height&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;设置图片宽高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;border&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;边框（已不推荐，建议用 CSS）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;2-表单-form-创建与常用控件&#34;&gt;2. 表单 &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 创建与常用控件
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;控件&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单行文本输入框&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;password&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;密码输入框（内容隐藏）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;radio&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单选框（一组选一个）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;复选框（一组选多个）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;提交按钮&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;reset&amp;quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;重置按钮&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;多行文本输入框&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; + &lt;code&gt;&amp;lt;option&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;下拉列表框&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;通用按钮（可触发 JS）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;为控件提供描述标签&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;3-列表创建&#34;&gt;3. 列表创建
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无序列表&lt;/strong&gt;：&lt;code&gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;/code&gt;（圆点符号）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有序列表&lt;/strong&gt;：&lt;code&gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;/code&gt;（数字序号）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定义列表&lt;/strong&gt;：&lt;code&gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;术语&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;描述&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌套列表&lt;/strong&gt;：在 &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; 内再嵌套 &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; 或 &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二css-核心知识点&#34;&gt;二、CSS 核心知识点
&lt;/h2&gt;&lt;h3 id=&#34;1-基础选择器&#34;&gt;1. 基础选择器
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;选择器&lt;/th&gt;
					&lt;th&gt;语法&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;元素选择器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;div&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;选择所有指定标签&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;类选择器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.className&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;选择带该类名的元素&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ID 选择器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;#idName&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;选择唯一 ID 元素&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;通配符选择器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;选择所有元素&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;属性选择器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;[type=&amp;quot;text&amp;quot;]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;根据属性选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;伪类选择器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;:hover&lt;/code&gt;, &lt;code&gt;:focus&lt;/code&gt;, &lt;code&gt;:first-child&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;特定状态选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;伪元素选择器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;::before&lt;/code&gt;, &lt;code&gt;::after&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;创建虚拟元素&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;2-文本样式与对齐&#34;&gt;2. 文本样式与对齐
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;属性&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;font-family&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;字体&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;font-size&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;字体大小&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;color&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;文字颜色&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;font-weight&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;粗细（&lt;code&gt;normal&lt;/code&gt; / &lt;code&gt;bold&lt;/code&gt; / &lt;code&gt;100~900&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;font-style&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;样式（&lt;code&gt;normal&lt;/code&gt; / &lt;code&gt;italic&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;text-decoration&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;装饰（&lt;code&gt;underline&lt;/code&gt; / &lt;code&gt;overline&lt;/code&gt; 等）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;text-align&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;水平对齐（&lt;code&gt;left&lt;/code&gt; / &lt;code&gt;right&lt;/code&gt; / &lt;code&gt;center&lt;/code&gt; / &lt;code&gt;justify&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;vertical-align&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;垂直对齐（行内/表格用；块级推荐 Flexbox）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;3-内边距与外边距&#34;&gt;3. 内边距与外边距
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内边距&lt;/strong&gt; &lt;code&gt;padding&lt;/code&gt;：内容到边框的距离&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外边距&lt;/strong&gt; &lt;code&gt;margin&lt;/code&gt;：元素到外部的距离&lt;/li&gt;
&lt;li&gt;简写顺序：&lt;code&gt;上 右 下 左&lt;/code&gt;（如 &lt;code&gt;padding: 10px 20px 10px 20px&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-行内元素-vs-块级元素&#34;&gt;4. 行内元素 vs 块级元素
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;代表&lt;/th&gt;
					&lt;th&gt;特点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;行内元素&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;span&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;img&lt;/code&gt;, &lt;code&gt;strong&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;不换行，不能设宽高（替换元素除外）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;块级元素&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;div&lt;/code&gt;, &lt;code&gt;p&lt;/code&gt;, &lt;code&gt;h1~h6&lt;/code&gt;, &lt;code&gt;ul&lt;/code&gt;, &lt;code&gt;ol&lt;/code&gt;, &lt;code&gt;li&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;独占一行，可设宽高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;转换方式&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display: block;&lt;/code&gt; → 行内转块&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display: inline;&lt;/code&gt; → 块转行内&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display: inline-block;&lt;/code&gt; → 行内块（不换行但可设宽高）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-浮动float及清除方法&#34;&gt;5. 浮动（Float）及清除方法
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;引发问题&lt;/strong&gt;：父元素高度塌陷、浮动覆盖其他内容&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;清除方案&lt;/strong&gt;（推荐度从低到高）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;浮动元素后加空 &lt;code&gt;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&lt;/code&gt; — 冗余&lt;/li&gt;
&lt;li&gt;给父元素设固定高度 — 不灵活&lt;/li&gt;
&lt;li&gt;父元素加 &lt;code&gt;overflow: hidden;&lt;/code&gt; — 简单但有副作用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;伪类清除法（推荐）&lt;/strong&gt;：
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;clearfix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;after&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;block&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;clear&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;both&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;6-盒子模型box-model&#34;&gt;6. 盒子模型（Box Model）
&lt;/h3&gt;&lt;p&gt;由内到外：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;内容（content） → 内边距（padding） → 边框（border） → 外边距（margin）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;code&gt;box-sizing&lt;/code&gt; 值&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;content-box&lt;/code&gt;（默认）&lt;/td&gt;
					&lt;td&gt;宽高仅指内容区域&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;border-box&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;宽高包含 padding 和 border（更直观）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;7-定位方式position&#34;&gt;7. 定位方式（Position）
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;值&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;static&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;默认，正常文档流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;relative&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;相对自身原位置偏移，仍占文档空间&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;absolute&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;相对最近已定位祖先，脱离文档流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;fixed&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;相对视口固定，脱离文档流&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;堆叠顺序&lt;/strong&gt;：使用 &lt;code&gt;z-index&lt;/code&gt;（数值越大越靠上）&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三javascript-核心知识点&#34;&gt;三、JavaScript 核心知识点
&lt;/h2&gt;&lt;h3 id=&#34;1-数据类型&#34;&gt;1. 数据类型
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;分类&lt;/th&gt;
					&lt;th&gt;类型&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;基本类型（值类型）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Number&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Boolean&lt;/code&gt;, &lt;code&gt;Undefined&lt;/code&gt;, &lt;code&gt;Null&lt;/code&gt;, &lt;code&gt;Symbol&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;引用类型（对象类型）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Object&lt;/code&gt;, &lt;code&gt;Array&lt;/code&gt;, &lt;code&gt;Function&lt;/code&gt;, &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;RegExp&lt;/code&gt; 等&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;2-常用数组操作&#34;&gt;2. 常用数组操作
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;操作&lt;/th&gt;
					&lt;th&gt;方法&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;访问&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;arr[0]&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;修改&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;arr[0] = 新值&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;末尾添加&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;push(元素)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;开头添加&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;unshift(元素)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;任意位置增/删&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;splice(索引, 删除个数, 添加的元素...)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;末尾删除&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;pop()&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;开头删除&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;shift()&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;查找索引&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;indexOf(元素)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;遍历&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;for&lt;/code&gt; 循环 或 &lt;code&gt;forEach()&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;连接数组&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;concat(另一个数组)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;转字符串&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;3-相等判断&#34;&gt;3. 相等判断
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;运算符&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;示例&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;==&lt;/code&gt;（宽松相等）&lt;/td&gt;
					&lt;td&gt;比较值，会进行类型转换&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;5&amp;quot; == 5&lt;/code&gt; → &lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;===&lt;/code&gt;（严格相等）&lt;/td&gt;
					&lt;td&gt;比较值和类型，均相同才为 &lt;code&gt;true&lt;/code&gt;（&lt;strong&gt;推荐使用&lt;/strong&gt;）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;5&amp;quot; === 5&lt;/code&gt; → &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;4-函数定义与定时函数&#34;&gt;4. 函数定义与定时函数
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;基本写法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;函数名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;参数1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;参数2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// 函数体
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;定时函数&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;setTimeout(函数, 毫秒)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;延迟执行一次&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;setInterval(函数, 毫秒)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每隔指定时间重复执行&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 5 秒后执行一次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;timer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;setTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;执行&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 每 2 秒重复执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;interval&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;setInterval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;周期执行&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;四jquery-选择器&#34;&gt;四、jQuery 选择器
&lt;/h2&gt;&lt;h3 id=&#34;1-基本选择器&#34;&gt;1. 基本选择器
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;选择器&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;#id&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;ID 选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;.class&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;类选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;element&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;标签选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;*&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;全选&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;2-层次选择器&#34;&gt;2. 层次选择器
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;选择器&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;祖先 后代&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;后代选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;父 &amp;gt; 子&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;子代选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;前 + 后&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;紧邻兄弟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;$(&amp;quot;前 ~ 后面所有&amp;quot;)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;后面所有兄弟&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;3-过滤选择器&#34;&gt;3. 过滤选择器
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;分类&lt;/th&gt;
					&lt;th&gt;选择器&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;基本过滤&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;:first&lt;/code&gt;, &lt;code&gt;:last&lt;/code&gt;, &lt;code&gt;:even&lt;/code&gt;, &lt;code&gt;:odd&lt;/code&gt;, &lt;code&gt;:eq(index)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内容过滤&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;:contains(&#39;文本&#39;)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;可见性过滤&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;:visible&lt;/code&gt;, &lt;code&gt;:hidden&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;属性过滤&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;[type=&#39;text&#39;]&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;子元素过滤&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;:nth-child(n)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;表单过滤&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;:input&lt;/code&gt;, &lt;code&gt;:enabled&lt;/code&gt;, &lt;code&gt;:disabled&lt;/code&gt;, &lt;code&gt;:checked&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;4-属性选择器&#34;&gt;4. 属性选择器
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;选择器&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;[attribute]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;拥有该属性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;[attribute=value]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;属性等于某值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;[attribute!=value]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;属性不等于某值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;[attribute^=value]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;属性以某值开头&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;[attribute$=value]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;属性以某值结尾&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;[attribute*=value]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;属性包含某值&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;板块&lt;/th&gt;
					&lt;th&gt;核心内容&lt;/th&gt;
					&lt;th&gt;考试重点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;HTML&lt;/td&gt;
					&lt;td&gt;标签属性、表单控件、列表&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 属性、&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 各类 input、列表嵌套&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CSS&lt;/td&gt;
					&lt;td&gt;选择器、盒模型、定位、浮动&lt;/td&gt;
					&lt;td&gt;选择器优先级、&lt;code&gt;position&lt;/code&gt; 区别、清除浮动&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JavaScript&lt;/td&gt;
					&lt;td&gt;数据类型、数组操作、定时器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;==&lt;/code&gt; vs &lt;code&gt;===&lt;/code&gt;、数组方法、&lt;code&gt;setTimeout&lt;/code&gt;/&lt;code&gt;setInterval&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jQuery&lt;/td&gt;
					&lt;td&gt;各类选择器&lt;/td&gt;
					&lt;td&gt;基本/层次/过滤/属性选择器的灵活运用&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;祝考试顺利！&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>我的博客美化与功能完善之路 — Hugo &#43; Stack 主题深度定制</title>
        <link>https://xuewexin.github.io/p/blog-customization-journey/</link>
        <pubDate>Thu, 18 Jun 2026 00:00:00 +0800</pubDate>
        
        <guid>https://xuewexin.github.io/p/blog-customization-journey/</guid>
        <description>&lt;img src="https://xuewexin.github.io/p/blog-customization-journey/cover.png" alt="Featured image of post 我的博客美化与功能完善之路 — Hugo &#43; Stack 主题深度定制" /&gt;&lt;h2 id=&#34;前言&#34;&gt;前言
&lt;/h2&gt;&lt;p&gt;从零搭建一个个人博客其实不难——Hugo 一条命令就能生成一个站点。但要让博客真正有&amp;quot;自己的味道&amp;quot;，就得花不少心思了。&lt;/p&gt;
&lt;p&gt;我的博客从去年冬天开始搭建，这半年多来陆陆续续加了各种功能和美化，踩了不少坑，也学到了很多东西。这篇文章就来记录一下我是怎么一步一步把这个博客折腾成现在这个样子的。&lt;/p&gt;
&lt;p&gt;目前博客的主要特色：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎨 &lt;strong&gt;毛玻璃 + 纯白 + 暗夜&lt;/strong&gt;三主题自由切换&lt;/li&gt;
&lt;li&gt;✨ 粒子动画背景 + 自定义光标&lt;/li&gt;
&lt;li&gt;🎵 底部固定音乐播放器（带进度记忆）&lt;/li&gt;
&lt;li&gt;💬 Giscus 评论区（跟随主题明暗切换）&lt;/li&gt;
&lt;li&gt;🔍 客户端全文搜索（支持 URL 参数）&lt;/li&gt;
&lt;li&gt;📱 移动端适配的汉堡菜单 + 内联搜索&lt;/li&gt;
&lt;li&gt;📑 文章页悬浮目录&lt;/li&gt;
&lt;li&gt;🔗 PJAX 无刷新页面切换&lt;/li&gt;
&lt;li&gt;📤 文章社交分享（微信/微博/QQ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面就一项一项来说。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一视觉美化&#34;&gt;一、视觉美化
&lt;/h2&gt;&lt;h3 id=&#34;1-三主题切换--毛玻璃--纯白--暗夜&#34;&gt;1. 三主题切换 — 毛玻璃 / 纯白 / 暗夜
&lt;/h3&gt;&lt;p&gt;这是我最满意的一个功能。Stack 主题原生只支持亮色/暗色两种模式，我在此基础上增加了一个&amp;quot;&lt;strong&gt;毛玻璃&lt;/strong&gt;&amp;ldquo;模式，作为默认主题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://xuewexin.github.io/p/blog-customization-journey/1.png&#34;
	width=&#34;1440&#34;
	height=&#34;900&#34;
	srcset=&#34;https://xuewexin.github.io/p/blog-customization-journey/1_hu_53754b9a0b941a5c.png 480w, https://xuewexin.github.io/p/blog-customization-journey/1_hu_387865f0ab358653.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;1&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;160&#34;
		data-flex-basis=&#34;384px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;三个主题各有特点：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;主题&lt;/th&gt;
					&lt;th&gt;特点&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;毛玻璃 (Glass)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;半透明卡片 + 模糊背景 + 粉色粒子&lt;/td&gt;
					&lt;td&gt;日常浏览，展示个性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;纯白 (Light)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;纯白背景 + 高对比度 + 隐藏背景图&lt;/td&gt;
					&lt;td&gt;认真阅读，打印友好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;暗夜 (Dark)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;GitHub 风格暗色 + &lt;code&gt;#0D1117&lt;/code&gt; 底色&lt;/td&gt;
					&lt;td&gt;夜间阅读，保护眼睛&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;主题状态存储在 &lt;code&gt;localStorage&lt;/code&gt; 中，刷新不丢失。评论组件（Giscus）和音乐播放器（APlayer）也会跟随主题自动切换配色。&lt;/p&gt;
&lt;p&gt;实现上，核心是通过 CSS 自定义属性区分三个主题的变量值：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data-theme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;glass&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;--card-background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgba&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;--card-border&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgba&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;backdrop-filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;blur&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c&#34;&gt;/* ... */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data-theme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;--card-background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#ffffff&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;--card-border&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#e0e0e0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c&#34;&gt;/* ... */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data-theme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;--card-background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#161B22&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;--card-border&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#30363d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c&#34;&gt;/* ... */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;TypeScript 维护一个 &lt;code&gt;ThemeSwitcher&lt;/code&gt; 类，通过 &lt;code&gt;document.documentElement.setAttribute(&#39;data-theme&#39;, theme)&lt;/code&gt; 切换主题，并派发 &lt;code&gt;onColorSchemeChange&lt;/code&gt; 事件通知其他组件。&lt;/p&gt;
&lt;h3 id=&#34;2-粒子动画背景&#34;&gt;2. 粒子动画背景
&lt;/h3&gt;&lt;p&gt;在毛玻璃主题下，全站背景会显示粉色粒子动画，用的是经典的 &lt;strong&gt;particles.js&lt;/strong&gt; 库。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://xuewexin.github.io/p/blog-customization-journey/2.png&#34;
	width=&#34;1440&#34;
	height=&#34;900&#34;
	srcset=&#34;https://xuewexin.github.io/p/blog-customization-journey/2_hu_5978fbf26ad56440.png 480w, https://xuewexin.github.io/p/blog-customization-journey/2_hu_943bddd03a69fa5d.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;2&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;160&#34;
		data-flex-basis=&#34;384px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;配置文件在 &lt;code&gt;assets/background/particlesjs-config.json&lt;/code&gt;，设置了 120 个粉色（&lt;code&gt;#f3afca&lt;/code&gt;）粒子，粒子之间有连线，鼠标可以抓取和排斥粒子。粒子动画只在毛玻璃主题下显示，切换到纯白或暗夜时会自动隐藏——毕竟阅读的时候不需要这些花里胡哨的东西。&lt;/p&gt;
&lt;h3 id=&#34;3-自定义光标&#34;&gt;3. 自定义光标
&lt;/h3&gt;&lt;p&gt;我给博客的三种指针状态换了定制光标：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;默认光标&lt;/strong&gt; → 青色圆形箭头（&lt;code&gt;1.png&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文本选择&lt;/strong&gt; → 同系列 I 型光标（&lt;code&gt;2.png&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接悬停&lt;/strong&gt; → 同系列手型光标（&lt;code&gt;3.png&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;光标的实现很简单，CSS 的 &lt;code&gt;cursor&lt;/code&gt; 属性配合 &lt;code&gt;url()&lt;/code&gt; 即可：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;img&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;cursor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/mouse/1.png&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;auto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;textarea&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;article-content&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;cursor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/mouse/2.png&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;copyCodeButton&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;cursor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/mouse/3.png&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;pointer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;4-自定义字体--宋体&#34;&gt;4. 自定义字体 — 宋体
&lt;/h3&gt;&lt;p&gt;用 &lt;code&gt;@font-face&lt;/code&gt; 加载了一个中文字体文件（&lt;code&gt;assets/font/宋.ttf&lt;/code&gt;），并通过 Hugo 的资源管道 &lt;code&gt;resources.Get&lt;/code&gt; 获取文件的 URL。然后将 &lt;code&gt;--base-font-family&lt;/code&gt; 和 &lt;code&gt;--code-font-family&lt;/code&gt; 两个 CSS 变量都覆盖为这个字体，让正文和代码块都有统一的风格。&lt;/p&gt;
&lt;h3 id=&#34;5-卡片悬浮效果&#34;&gt;5. 卡片悬浮效果
&lt;/h3&gt;&lt;p&gt;我借鉴了&lt;strong&gt;华为商城&lt;/strong&gt;的设计风格——鼠标悬浮时卡片微微上浮（&lt;code&gt;translateY(-5px)&lt;/code&gt;），阴影加深。这个效果应用到了文章列表、侧边栏菜单、侧边栏个人信息卡片、标签云等几乎所有可点击的区域：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;article-list--compact&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;article&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;hover&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;widget&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;hover&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;sidebar-profile-card&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;hover&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;translateY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;-5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgba&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;transition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;all&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.35&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cubic-bezier&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.25&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.46&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.94&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个 0.35 秒的三次贝塞尔缓动动画让整个网站的交互感提升了一个档次——不会太慢让人不耐烦，也不会太快没感觉。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二交互体验&#34;&gt;二、交互体验
&lt;/h2&gt;&lt;h3 id=&#34;1-pjax-无刷新页面切换--进度条&#34;&gt;1. PJAX 无刷新页面切换 + 进度条
&lt;/h3&gt;&lt;p&gt;这可能是对用户体验提升最大的一个功能。PJAX（PushState + Ajax）让你在页面之间切换时不需要整页刷新——只有 &lt;code&gt;.main-container&lt;/code&gt; 的内容被替换，Header、Sidebar、Footer 等保持不变。&lt;/p&gt;
&lt;p&gt;再配合 &lt;strong&gt;topbar.js&lt;/strong&gt; 进度条，页面切换时有类似 YouTube 的顶部彩色进度条动画，从白色渐变到蓝色（&lt;code&gt;rgba(0, 149, 234, 1)&lt;/code&gt;），体验非常流畅。&lt;/p&gt;
&lt;p&gt;实现的时候踩了一个大坑——PJAX 替换内容时不会执行新页面中的 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 标签。这意味着评论组件（Giscus）在页面切换后就消失了。解决方案是在 &lt;code&gt;pjax:complete&lt;/code&gt; 事件中手动重建 Giscus：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;reloadGiscus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;giscusDiv&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;giscus&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;giscusDiv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;giscusDiv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;innerHTML&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;createElement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;src&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://giscus.app/client.js&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;data-repo&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;xuewexin/xuewexin.github.io&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// ... 其他属性
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;appendChild&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-悬浮目录-toc&#34;&gt;2. 悬浮目录 (TOC)
&lt;/h3&gt;&lt;p&gt;对于长文章，目录导航是刚需。Stack 主题默认的目录在文章内顶部，滚动后就看不到了。于是我写了一个&lt;strong&gt;悬浮目录按钮&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文章页面右侧中间固定一个圆形按钮&lt;/li&gt;
&lt;li&gt;点击后从右侧滑出一个 300px 宽的目录面板&lt;/li&gt;
&lt;li&gt;通过轮询同步 &lt;code&gt;#TableOfContents&lt;/code&gt; 的高亮状态，实现滚动跟踪&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://xuewexin.github.io/p/blog-customization-journey/3.png&#34;
	width=&#34;348&#34;
	height=&#34;101&#34;
	srcset=&#34;https://xuewexin.github.io/p/blog-customization-journey/3_hu_e9409b23b6d58f10.png 480w, https://xuewexin.github.io/p/blog-customization-journey/3_hu_c8faa8e41a230330.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;3&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;344&#34;
		data-flex-basis=&#34;826px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;支持 ESC 关闭、点击遮罩关闭，移动端自动缩小宽度。目录内容太少（少于 100 字符）时自动隐藏，避免只有一个标题的尴尬。&lt;/p&gt;
&lt;h3 id=&#34;3-回到顶部按钮&#34;&gt;3. 回到顶部按钮
&lt;/h3&gt;&lt;p&gt;当页面滚动超过 400px 时，右下角出现一个圆形回到顶部按钮。用 &lt;code&gt;requestAnimationFrame&lt;/code&gt; 做了滚动监听的节流优化，避免高频触发影响性能。为了不和底部的音乐播放器重叠，在移动端会抬高按钮位置。&lt;/p&gt;
&lt;h3 id=&#34;4-代码块复制按钮&#34;&gt;4. 代码块复制按钮
&lt;/h3&gt;&lt;p&gt;每个代码块右上角自动添加一个「Copy」按钮，点击后复制代码到剪贴板，按钮文字短暂变为「Copied!」。代码从 Stack 主题的 &lt;code&gt;main.ts&lt;/code&gt; 中实现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三功能增强&#34;&gt;三、功能增强
&lt;/h2&gt;&lt;h3 id=&#34;1-aplayer-音乐播放器&#34;&gt;1. APlayer 音乐播放器
&lt;/h3&gt;&lt;p&gt;博客底部固定了一个 &lt;strong&gt;APlayer&lt;/strong&gt; 音乐播放器，预设了 8 首歌：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://xuewexin.github.io/p/blog-customization-journey/4.png&#34;
	width=&#34;1440&#34;
	height=&#34;900&#34;
	srcset=&#34;https://xuewexin.github.io/p/blog-customization-journey/4_hu_7fbef3dd95ec9ec7.png 480w, https://xuewexin.github.io/p/blog-customization-journey/4_hu_234b33d699ea6041.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;4&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;160&#34;
		data-flex-basis=&#34;384px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;实现了&lt;strong&gt;播放位置记忆&lt;/strong&gt;——关闭页面前把当前歌曲索引、播放进度、暂停状态存进 &lt;code&gt;localStorage&lt;/code&gt;，下次打开自动恢复。切换歌曲时有 500ms 的延迟等待缓冲，避免切歌卡顿。&lt;/p&gt;
&lt;h3 id=&#34;2-giscus-评论区&#34;&gt;2. Giscus 评论区
&lt;/h3&gt;&lt;p&gt;用 GitHub Discussions 驱动的 &lt;strong&gt;Giscus&lt;/strong&gt; 评论系统。最大的改进是&lt;strong&gt;暗色主题跟随&lt;/strong&gt;——通过 &lt;code&gt;postMessage&lt;/code&gt; API 与 Giscus 的 iframe 通信，当博客切换主题时，评论区也同步切换：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;setGiscusTheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;theme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;iframe&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;querySelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;.giscus-frame&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;iframe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;iframe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;contentWindow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;postMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;giscus&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;setConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;theme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;theme&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://giscus.app&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-客户端全文搜索&#34;&gt;3. 客户端全文搜索
&lt;/h3&gt;&lt;p&gt;这个功能花了不少心思。搜索页面会用 Hugo 的 JSON 输出格式生成一个全站文章索引，然后通过 TypeScript 实现客户端全文搜索：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持多关键词（空格分隔）匹配&lt;/li&gt;
&lt;li&gt;在标题和正文中分别匹配，加权评分&lt;/li&gt;
&lt;li&gt;显示匹配片段（前后各 20 个字符的上下文）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;搜索结果同步到 URL&lt;/strong&gt;：&lt;code&gt;/search/?keyword=你的搜索词&lt;/code&gt;，可以通过链接分享搜索结果&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-微信联系弹窗&#34;&gt;4. 微信联系弹窗
&lt;/h3&gt;&lt;p&gt;侧边栏菜单增加了一个「联系作者」入口，点击弹出微信二维码。弹窗支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点击空白处关闭&lt;/li&gt;
&lt;li&gt;ESC 键关闭&lt;/li&gt;
&lt;li&gt;阻止背景滚动&lt;/li&gt;
&lt;li&gt;暗色主题适配&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每篇文章底部也有一个微信联系按钮，绿色微信品牌配色。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四移动端适配&#34;&gt;四、移动端适配
&lt;/h2&gt;&lt;p&gt;移动端体验是衡量一个博客好坏的重要标准。我重写了移动端的顶部导航栏，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;汉堡菜单&lt;/strong&gt;：带动画旋转效果的汉堡图标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;站点标题&lt;/strong&gt;：&amp;ldquo;欢迎来到清风客的blog&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内联搜索&lt;/strong&gt;：点击搜索图标在顶栏内展开搜索输入框，自动聚焦&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://xuewexin.github.io/p/blog-customization-journey/5.png&#34;
	width=&#34;390&#34;
	height=&#34;844&#34;
	srcset=&#34;https://xuewexin.github.io/p/blog-customization-journey/5_hu_fe6b080002f8c1be.png 480w, https://xuewexin.github.io/p/blog-customization-journey/5_hu_940c7005bdb3fc22.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;5&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;46&#34;
		data-flex-basis=&#34;110px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;移动端视口 ≤ 767px 时自动切换到这个布局。侧边栏菜单项在移动端也做了优化——去掉圆角，全宽居中排列。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五社交分享&#34;&gt;五、社交分享
&lt;/h2&gt;&lt;p&gt;每篇文章底部有四个分享按钮：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;复制链接&lt;/strong&gt; — 一键复制文章 URL，兼容旧浏览器的 &lt;code&gt;document.execCommand(&#39;copy&#39;)&lt;/code&gt; 回退方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微信分享&lt;/strong&gt; — 通过 &lt;code&gt;api.qrserver.com&lt;/code&gt; 动态生成文章二维码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微博分享&lt;/strong&gt; — 跳转微博分享页面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QQ 分享&lt;/strong&gt; — 跳转 QQ 分享页面&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;分享弹窗同样支持暗色适配和 ESC 关闭。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六部署流水线&#34;&gt;六、部署流水线
&lt;/h2&gt;&lt;p&gt;博客托管在 GitHub Pages，通过 GitHub Actions 自动部署。推送代码到 &lt;code&gt;main&lt;/code&gt; 分支后，工作流会自动：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 Hugo Extended 构建站点（包含草稿内容）&lt;/li&gt;
&lt;li&gt;将生成的静态文件推送到 &lt;code&gt;xuewexin.github.io&lt;/code&gt; 仓库&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;站点地址：&lt;a class=&#34;link&#34; href=&#34;https://xuewexin.github.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://xuewexin.github.io&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;结语&#34;&gt;结语
&lt;/h2&gt;&lt;p&gt;从一个默认的 Hugo 主题，到如今这个功能齐全的个性化博客，这半年来我学到了很多前端知识——CSS 变量、TypeScript 构建、PJAX 原理、浏览器 API（&lt;code&gt;localStorage&lt;/code&gt;、&lt;code&gt;postMessage&lt;/code&gt;、&lt;code&gt;clipboard&lt;/code&gt;）等等。&lt;/p&gt;
&lt;p&gt;当然，还有一些想做的功能没来得及加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 图片懒加载优化（目前图片太多的话首屏加载会慢）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 文章分类的 RSS 订阅&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 更丰富的文章封面图展示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;写博客这件事本身就很有意思——你不仅要会写代码，还得会设计、会排版、会考虑用户体验。但对于每个程序员来说，拥有一个自己亲手搭建的博客，绝对是一件很酷的事情。&lt;/p&gt;
&lt;p&gt;感谢各位的观看，如有不足的地方请见谅 (●&amp;rsquo;◡&amp;rsquo;●) (～￣▽￣)～&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文首发于「清风客」个人博客，欢迎来访交流。&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
