typecho主题 final

· 默认分类

电影
分类筛选全部
112025
南京照相馆
8.8 · 2025
捕风追影
8.2 · 2025
82025
东极岛
0 · 2025
22025
心迷宫
8.7 · 2014
吉祥如意
7.7 · 2020
警察荣誉
8.5 · 2022
好东西
8.9 · 2024
72024
热天午后
8.7 · 1975
王牌对王牌
8.5 · 1998
122023
平凡之路
7.2 · 2023
曾少年
7.5 · 2023
欢颜
7.8 · 2023
爱情而已
8.2 · 2023
种地吧
9.1 · 2023
有生之年
8.7 · 2023
狂飙
8.5 · 2023
南海归墟
6 · 2023
繁城之下
8.5 · 2023
三体
8.8 · 2023
82023
开端
7.9 · 2022
对手
7.8 · 2021
漫长的季节
9.4 · 2023
22023
自豪与荣耀
7.1 · 2008
国家公敌
8.2 · 1998
洛城机密
8.9 · 1997
沉默的羔羊
8.9 · 1991
老无所依
8.4 · 2007
上帝之城
9 · 2002
活死人黎明
7.3 · 1978
活死人黎明
7.5 · 2004

final - AI 上下文文档

最终更新时间:2025-11-16 02:41:38
文档版本:v1.0
项目版本:1.6

📋 变更记录 (Changelog)

2025-11-16


项目愿景

final 是一个简洁、高性能的 Typecho 博客主题,旨在成为用户的"最终选择"。主题强调:


架构总览

技术栈

设计模式


模块结构图

graph TD
    A["(根) final"] --> B["主题核心"];
    A --> C["静态资源模块"];
    A --> D["插件扩展"];

    B --> B1["模板文件"];
    B --> B2["配置与函数"];
    B --> B3["样式文件"];

    C --> C1["JavaScript"];
    C --> C2["CSS"];

    D --> D1["LivePhoto 插件"];

    B1 --> B1A["index.php (首页)"];
    B1 --> B1B["post.php (文章)"];
    B1 --> B1C["page.php (页面)"];
    B1 --> B1D["archive.php (归档)"];
    B1 --> B1E["comments.php (评论)"];
    B1 --> B1F["header.php"];
    B1 --> B1G["footer.php"];
    B1 --> B1H["404.php"];

    B2 --> B2A["functions.php"];

    B3 --> B3A["style.css"];
    B3 --> B3B["comments.css"];

    C1 --> C1A["motionphoto.js"];
    C1 --> C1B["prism.min.js"];
    C1 --> C1C["prism-autoloader.min.js"];
    C1 --> C1D["lazyload.min.js"];

    C2 --> C2A["prism.min.css"];

    D1 --> D1A["Plugin.php"];

    style A fill:#e1f5ff
    style B fill:#fff4e6
    style C fill:#f3e5f5
    style D fill:#e8f5e9

📁 项目结构

final/
├── 📄 核心模板文件
│   ├── index.php          # 首页模板(文章列表)
│   ├── post.php           # 单篇文章页面
│   ├── page.php           # 独立页面模板
│   ├── archive.php        # 归档页面
│   ├── comments.php       # 评论区模板
│   ├── header.php         # 页面头部(<head> 标签、SEO、预加载)
│   ├── footer.php         # 页面尾部(导航、脚本初始化、主题切换)
│   └── 404.php            # 404 错误页面
│
├── 📄 主题配置与函数
│   ├── functions.php      # 主题配置面板、LivePhoto 辅助类、Gallery 短代码
│   └── Plugin.php         # 独立 LivePhoto 插件(可选安装)
│
├── 🎨 样式文件
│   ├── style.css          # 主样式表(CSS 变量、响应式布局、主题切换)
│   └── comments.css       # 评论区专用样式
│
├── 📦 静态资源
│   ├── js/
│   │   ├── prism.min.js           # 代码高亮核心
│   │   ├── prism-autoloader.min.js # Prism 语言自动加载器
│   │   ├── motionphoto.js         # Motion Photo 处理脚本
│   │   └── lazyload.min.js        # 图片懒加载库(已废弃,使用原生 IntersectionObserver)
│   └── css/
│       └── prism.min.css          # Prism 默认主题(亮色模式)
│
├── 📚 文档
│   ├── README.md          # 项目说明
│   ├── CLAUDE.md          # AI 上下文文档(本文件)
│   └── AGENTS.md          # 开发者协作指南(如果存在)
│
└── 🖼️ 其他
    └── screenshot.png     # 主题预览图

文件统计


🔑 核心功能模块

1️⃣ 主题模式切换系统

位置footer.php:134-266style.css:1-69

功能说明

关键代码

// footer.php:179-234
function switchToThemeMode(themeMode) {
    saveThemeMode(themeMode);
    if (themeMode === 'auto') {
        isAutoThemeMode = true;
        const currentSystemThemeMode = systemThemeModeMedia.matches ? 'dark' : 'light';
        setBodyThemeMode(currentSystemThemeMode);
    } else {
        isAutoThemeMode = false;
        setBodyThemeMode(themeMode);
    }
}

配置项functions.php:82-101):


2️⃣ LivePhoto / Motion Photo 支持

位置functions.php:104-479Plugin.php:1-198

功能说明

实现方式

  1. 主题内置方案(推荐):通过 FinalTheme_LivePhotoHelper 类实现

    • 位置:functions.php:104-479
    • 注册内容过滤钩子:contentExexcerptEx
    • 编辑器按钮:admin/write-post.phpadmin/write-page.php 钩子
  2. 独立插件方案:通过 Plugin.php 实现

    • 位置:Plugin.php:1-198
    • 需要在 Typecho 插件管理中启用
    • 依赖 jQuery(编辑器按钮)

核心解析逻辑functions.php:238-267):

public static function parseCallback($matches) {
    $attrs = self::shortcode_parse_atts($matches[3]);

    if (isset($attrs['photo']) && !isset($attrs['video'])) {
        // Motion Photo:只有图片
        return sprintf('<div id="files"><img src="%s"></div>', $attrs['photo']);
    } elseif (isset($attrs['photo']) && isset($attrs['video'])) {
        // Live Photo:图片 + 视频
        return sprintf('<div data-live-photo data-photo-src="%s" data-video-src="%s"></div>',
            $attrs['photo'], $attrs['video']);
    }
}

前端初始化footer.php:295-322):


3️⃣ Gallery 相册短代码

位置functions.php:158-235

功能说明

短代码格式

[Gallery columns="3" gap="10px" height="200px"]
图片URL1
图片URL2
<a href="图片URL3">...</a>
[/Gallery]

参数说明

生成 HTML

<div class="gallery" data-gallery-id="gallery-1" style="display: grid; ...">
    <a href="图片URL" class="glightbox" data-gallery="gallery-1">
        <img src="图片URL" style="object-fit: cover; ...">
    </a>
</div>

4️⃣ 图片懒加载系统

位置functions.php:272-343footer.php:324-386

功能说明

实现流程

  1. 服务端:将 <img src="原图"> 替换为 <img src="占位图" data-src="原图" class="lazyload">
  2. 客户端:监听图片进入视口,动态替换 src
  3. 排除逻辑

    • 检查 data-live-photo 容器
    • 检查 id="files" 容器(Motion Photo)
    • 检查 .gallery 容器

关键代码functions.php:287-340):

private static function applyImageLazyload($text) {
    $placeholderImage = 'data:image/png;base64,...'; // 1x1 透明占位图

    $text = preg_replace_callback('/<img([^>]+)>/i', function($matches) use ($placeholderImage, $text) {
        // 跳过 LivePhoto 容器内的图片
        $offset = strpos($text, $imgTag);
        $before = substr($text, max(0, $offset - 200), 200);
        if (strpos($before, 'data-live-photo') !== false) {
            return $imgTag; // 跳过
        }

        // 替换 src 为占位图,添加 data-src
        $newAttributes = preg_replace('/src="([^"]+)"/', 'src="' . $placeholderImage . '" data-src="$1"', $attributes);
        return '<img' . $newAttributes . '>';
    }, $text);
}

配置项functions.php:59-62):


5️⃣ 代码高亮系统

位置header.php:52-65footer.php:275-293

功能说明

样式切换逻辑footer.php:151-168):

function updateCodeHighlightTheme(themeMode) {
    const themes = {
        dark: 'https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-tomorrow.min.css',
        read: 'https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-solarizedlight.min.css',
        light: '<?php $this->options->themeUrl("static/css/prism.min.css"); ?>'
    };

    const link = document.createElement('link');
    link.rel = 'stylesheet';
    link.href = themes[themeMode] || themes.light;
    document.head.appendChild(link);
}

配置项functions.php:48-51):


6️⃣ PJAX 无刷新跳转

位置footer.php:478-657

功能说明

核心逻辑footer.php:510-566):

function loadPage(url, pushState = true) {
    progress.start();

    fetch(url, {
        headers: { 'X-PJAX': 'true', 'X-Requested-With': 'XMLHttpRequest' }
    })
    .then(response => response.text())
    .then(html => {
        const parser = new DOMParser();
        const doc = parser.parseFromString(html, 'text/html');
        const newMain = doc.getElementById('main');

        mainContainer.innerHTML = newMain.innerHTML;
        document.title = doc.querySelector('title').textContent;

        if (pushState) {
            history.pushState({ url: url }, '', url);
        }

        window.scrollTo({ top: 0, behavior: 'smooth' });
        initMain(); // 重新初始化代码高亮、Live Photo 等
    })
    .finally(() => progress.done());
}

配置项functions.php:43-46):


7️⃣ DOM 批量调度器 (DomBatch)

位置footer.php:76-131

功能说明

使用方式

// 读取操作(不触发重排)
DomBatch.read(function() {
    const height = element.offsetHeight;
});

// 写入操作(批量执行,减少重排)
DomBatch.write(function() {
    element.style.height = '100px';
});

应用场景


🎯 主题配置项详解

位置functions.php:6-102

基础配置

性能优化

功能开关

配置项类型默认值说明
pjaxStatusyes/nono全站 PJAX 无刷新跳转
codeHighlightyes/noyes代码语法高亮
livePhotoStatusyes/nonoLive Photo/Motion Photo
imageLazyloadStatusyes/noyes图片懒加载
commentAreaStatusyes/noyes评论区显示

主题模式配置

配置项类型默认值说明
themeModeSelectStatusyes/noyes主题模式切换总开关
defaultThemeModeauto/light/dark/readauto默认主题模式
themeModeHeaderSelectStatusyes/nono页面顶部选择器
themeModeMinitoolStatusyes/nono右下角悬浮按钮

自定义代码


🚀 性能优化策略

1. 资源加载优化

2. 图片优化

3. 渲染优化

4. PJAX 优化


📐 代码规范与最佳实践

PHP 编码规范

JavaScript 编码规范

CSS 编码规范


🔧 开发与调试

本地开发环境要求

调试技巧

  1. 主题模式切换:查看 localStorage.getItem('theme-mode')
  2. PJAX 调试:Network 面板查看 X-PJAX: true 请求
  3. 懒加载调试:Elements 面板查看 data-srcsrc 变化

常见问题排查

LivePhoto 不显示

  1. 检查配置:livePhotoStatus 是否为 yes
  2. 检查短代码格式:[LivePhoto photo="..." video="..."]
  3. 查看控制台:是否成功加载 livephotoskit.js

图片懒加载失效

  1. 检查配置:imageLazyloadStatus 是否为 yes
  2. 查看图片标签:是否有 class="lazyload"data-src
  3. 控制台查看:IntersectionObserver 是否触发

PJAX 页面跳转后功能失效


📊 项目统计

代码行数统计(估算)

覆盖率分析

主要缺口与建议


🔄 建议下一步操作

功能增强

  1. 实现搜索功能

    • 服务端:Typecho 搜索 API
    • 客户端:快捷键触发(/ 键)+ 移动端适配
    • 建议使用 PJAX 实现无刷新搜索
  2. 增强 Gallery 功能

    • 支持视频混排
    • 支持拖拽排序(编辑器)
    • 支持瀑布流布局(Masonry)
  3. 优化 Motion Photo 支持

    • 自动提取内嵌视频(需服务端支持)
    • 支持更多格式(HEIC、AVIF)

性能优化

  1. 关键 CSS 内联:将首屏 CSS 内联到 <head>
  2. 图片格式现代化:支持 WebP、AVIF
  3. Service Worker:实现离线缓存

代码质量

  1. 添加 ESLint:统一 JavaScript 代码风格
  2. 添加 PHP CS Fixer:统一 PHP 代码风格
  3. 编写单元测试:测试短代码解析、主题配置等核心逻辑

📞 技术支持


📝 附录

短代码快速参考

LivePhoto / Motion Photo

<!-- Live Photo(图片 + 视频) -->
[LivePhoto photo="https://example.com/photo.jpg" video="https://example.com/video.mp4" ratio="4/3"]

<!-- Motion Photo(仅图片) -->
[LivePhoto photo="https://example.com/motion.jpg" ratio="16/9"]

Gallery 相册

主题配置代码示例

启用所有功能

// 在 Typecho 后台 -> 外观 -> 设置外观 中配置
PJAX:是
代码高亮:是
Live Photo:是
图片懒加载:是
评论区:是
主题模式切换:是
默认主题:跟随系统
顶部选择器:否
悬浮按钮:是

文档结束 | 生成时间:2025-11-16 02:41:38 | AI Agent: Claude Code