中文

比较 STL、OBJ 和 STEP:3D 打印文件格式终极指南

Last Updated: 29 Oct, 2025 你已经设计了一个精彩的3D 模型,并准备将其变为现实。点击“导出”后,立即出现一个文件格式下拉菜单:STL、OBJ、STEP、AMF 和 3MF。你会选择哪一种?如果直接使用默认格式,可能会牺牲打印质量、色彩,甚至影响后期编辑设计的能力。 这项技术的核心是CAD(计算机辅助设计)文件格式,它充当着数字3D 模型和实体打印对象之间的桥梁。选择正确的文件格式至关重要,因为它直接影响最终 3D 打印的质量、兼容性和功能。为你的3D 打印项目选择合适的文件格式与设计本身一样重要。您发送到打印机的数字蓝图决定了作品的最终质量、精度甚至色彩。本指南将揭秘3D 打印的三种最常见文件格式:STL、OBJ** 和STEP。我们将详细分析它们的含义、优缺点,以及何时应该使用它们来确保每次都能获得完美的打印效果。 1. STL(立体光刻技术)——行业标准 概述: 如果您曾经从互联网上下载过3D 模型,那么它很可能就是STL 文件。STL 是“立体光刻技术”或“标准三角语言”的缩写,是 3D 打印领域使用最广泛的文件格式,这是有原因的。它也被称为3D 打印格式的鼻祖。 STL 文件 于 20 世纪 80 年代为首批立体光刻 (SLA) 打印机开发,它使用三角形网格近似 3D 模型 的表面。可以将其想象成一个数字测地线穹顶——三角形越多,表面越光滑。 工作原理:它仅描述模型表面的几何形状,不包含任何关于颜色、纹理、材质或模型各个部分的信息。它是一个“哑”网格。 优点: 通用性:全球所有切片软件和 3D 打印机均支持。 简单性:简单的结构使文件易于处理和生成。 文件大小小:与其他格式相比,STL 文件通常较小(除非三角形数量非常多)。 缺点: 无颜色或纹理:无法存储颜色信息,因此不适合多色打印。 无元数据:会丢失所有关于原始设计意图的信息(例如,哪个部分是孔、哪个部分是凸台或倒角)。 网格错误:低分辨率的 STL 文件在曲面上可能会出现可见的面。生成错误的 STL 文件可能会出现孔、非流形边缘以及其他必须在打印前修复的错误。 最适合:标准、单材料 3D 打印(FDM 和 SLA)、功能部件的快速成型以及文件兼容性至关重要的情况。 局限性:不支持纹理或组件等高级属性,因此不适合复杂模型。 2. 视觉上的有力竞争者:OBJ (.obj) 概述: 一种更高级的几何定义格式,最初由 Wavefront Technologies 开发。虽然它也可以用多边形(不限于三角形)描述几何图形,但它在 3D 打印方面的主要优势在于它能够支持颜色和纹理信息。OBJ 文件使用顶点、面和法线定义 3D 模型的几何图形。它们的独特之处在于能够引用外部纹理贴图文件(例如 .
九月 15, 2025 · 2 分钟 · Sher Azam Khan

面向开发人员的 7 大免费开源 PowerPoint API 和库(2025 年)

Last Updated: 29 Oct, 2025 几十年来,Microsoft PowerPoint 一直是无可争议的演示文稿之王。但是,当您需要生成数百份个性化销售报告、从数据库创建动态演示文稿 或自动化合规培训幻灯片时,该怎么办?在 GUI 中手动点击和拖动不仅繁琐,而且无法扩展。这时,代码 的力量就显现出来了。作为一名软件开发者,您可以利用功能强大、免费且开源的 API 和库,以编程方式创建、编辑和操作PowerPoint 文件(PPT、PPTX)。这种自动化功能开启了一个充满可能性的全新世界,从后端报告生成到 Web 应用程序中集成的演示文稿功能。 什么是 PowerPoint API 和库? PowerPoint API(应用程序编程接口)或库是一组预先编写的代码,允许开发人员直接从自己的软件应用程序中创建、读取、编辑和转换 PowerPoint 演示文稿(例如 PPT、PPTX 文件)。您无需从头构建这些功能,只需集成这些工具即可处理以下任务: 从模板生成幻灯片。 使用数据库中的文本、图像和图表填充幻灯片。 将演示文稿转换为 PDF 或图像等其他格式。 从现有演示文稿中提取数据。 1. Apache POI - Apache POI HWPF 和 XWPF 最适合:需要全面控制 Microsoft Office 文档的 Java 开发人员。 概述: Apache POI(混淆实现不佳)是 Java 生态系统中处理 Microsoft Office 格式的无可争议的冠军。其 HSLF 和 XSLF 组件分别专为 .ppt 和 .pptx 文件设计。它是一个强大、成熟且功能强大的库,可让您对演示文稿中的每个元素进行底层控制。 主要功能: 全面的格式支持:支持传统 PPT (HSLF) 和现代 PPTX (XSLF) 格式。 丰富的功能集:创建幻灯片,添加文本、形状、表格、图像和超链接。您还可以操作幻灯片母版和布局。 文本提取:轻松从幻灯片中提取所有文本内容进行索引或分析。 活跃的社区:作为一个 Apache 项目,它拥有优秀的文档和庞大的支持社区。 注意事项: 对于简单任务来说,该 API 可能非常冗长且复杂。 与更高级别的库相比,需要更多样板代码。 如何安装: 使用该 API 最简单的方法是通过 Maven 依赖项,请使用以下命令安装该 API。
九月 8, 2025 · 3 分钟 · Sher Azam Khan

比较无损压缩和有损压缩:如何选择合适的压缩方式?

Last Updated: 06 Nov, 2025 你是否曾经尝试发送一个超大视频文件却被告知文件过大?或者你是否好奇为什么你最喜欢的音乐流媒体服务允许你在存储空间有限的手机上下载成千上万首歌曲?这一切背后的秘密在于数据压缩。压缩是缩小文件大小的数字魔法。但并非所有压缩方式都一样。无损压缩和有损压缩这两大类压缩方式的工作原理截然不同,用途也大相径庭。选择合适的压缩方式取决于你对质量、存储空间和性能的需求。让我们来详细了解一下它们的区别,帮助你选择最适合自己的压缩方式。 什么是无损压缩? 无损压缩是一种在不损失任何原始数据的情况下减小文件大小的方法。你可以把它想象成一个高效的zip文件,专门用来存储你的数据。它使用巧妙的算法来查找并消除统计冗余。当你解压缩文件时,你会得到一个与原文件完全相同的副本,位对位一模一样。这使得它非常适合那些对数据完整性要求极高的场景。以下是一个简单的示例,展示了它的工作原理。假设有一个文件包含文本:“blue blue blue sky”。无损算法可能会将其编码为“3 blue sky”。它并没有丢失任何含义或数据;它只是找到了一种更高效的表示方法。这与 .ZIP 文件处理文档的方式类似。 常用格式: 图像:PNG、BMP、WebP(可以是无损压缩)、TIFF、RAW 音频:FLAC、ALAC、WAV(未压缩,但通常归为此类) 通用数据:ZIP、7z 最佳用途:归档、文本文件、医学影像,或任何对精度要求极高的场景。 缺点:与有损压缩相比,文件体积较大。压缩率通常只有 20-50%。 什么是有损压缩? 有损压缩通过永久删除不太重要的数据来减小文件大小。虽然与无损压缩方法相比,它可以实现更小的文件体积,但可能会导致一定的质量下降。对于许多应用来说,这种权衡是可以接受的。它的工作原理是感知编码,也就是说,它会丢弃人眼或人耳最不可能注意到的信息。这正是技术的关键所在。对于图像,算法可能会对相邻像素非常相似的颜色进行平均处理(从而降低细节)。对于音频,它可能会去除超出人耳平均听觉范围的极高或极低频率。压缩程度越高,丢弃的数据就越多。 常用格式: 图像:JPEG、WebP(通常有损压缩)、HEIC 音频:MP3、AAC、Ogg Vorbis 视频:MP4、H.264、H.265、AVI 最适合:网页图像、音乐流媒体、在线视频,以及那些节省存储空间或带宽比追求完美音质更重要的场景。 缺点:质量损失。过度压缩会导致可见或可听见的瑕疵,例如 JPEG 图片中的像素化或低比特率 MP3 音频的单薄空洞的声音。这种质量损失是永久性的;您无法从有损压缩文件中恢复原始数据。 无损压缩与有损压缩的主要区别 编号 特性 无损压缩 有损压缩 1 文件大小 较大(但已压缩) 小得多 2 质量 100%保留 轻微到明显的损失 3 应用场景 归档、文档、原始媒体 网页内容、流媒体、随意分享 4 格式 PNG、FLAC、ZIP JPEG、MP3、MP4 5 可逆性 完全可逆 不可逆 何时选择无损压缩 您需要原始文件的精确副本(例如,法律文件、代码文件)。 您正在编辑高质量照片或原始音频文件。 数据完整性比节省存储空间更重要。 何时选择有损压缩 您要在线发布图片或视频。 流媒体播放音乐或视频,快速加载至关重要。 存储空间和带宽有限,且对完美画质要求不高。 专业提示:混合工作流程 许多专业人士采用混合方法:
九月 2, 2025 · 1 分钟 · Sher Azam Khan

开源 PowerPoint API 与商业 PowerPoint API:如何选择合适的 API?

Last Updated: 06 Nov, 2025 在当今数据驱动的世界中,PowerPoint演示文稿不再局限于教室和公司会议室。开发人员越来越需要以编程方式创建、修改和自动化演示文稿文件,用于Web应用程序、报表系统、在线学习平台和业务工作流程。这种需求催生了两大类工具:开源PowerPoint API和商业PowerPoint API。对于开发人员和企业而言,选择合适的工具至关重要,因为它直接影响成本、灵活性、性能和长期支持。 什么是PowerPoint API? PowerPoint API允许软件开发人员以编程方式处理PPT和PPTX文件,而无需依赖Microsoft PowerPoint本身。只需几行代码,软件开发人员即可创建、读取、编辑和转换 PowerPoint 演示文稿(例如 PPTX、PPT 和 PPSX 文件)。它支持诸如创建新幻灯片、插入文本和图像、嵌入图表、应用动画、导出为 PDF 或 HTML 等格式,甚至支持在现代 Web 应用程序中进行实时协作等功能。通过集成 PowerPoint API,开发人员可以节省时间、减少手动工作,并提供可扩展的演示解决方案。 最佳开源 PowerPoint API 开源 PowerPoint 库 为开发人员提供免费访问代码的权限,这些代码可以根据他们的需求进行定制。它们通常受宽松的许可证(例如 Apache 2.0 或 MIT)约束,允许您在个人和商业项目中免费使用它们。这些项目由活跃的社区维护,并为一般的演示任务提供良好的功能。然而,它们可能缺乏高级功能、专业支持或企业级性能。 最佳开源 PowerPoint API Python-PPTX(Python)——广泛用于创建和编辑 PowerPoint 文件。它支持添加幻灯片、形状、文本和图像,但高级动画和媒体嵌入功能有限。 Apache POI——HSLF 和 XSLF(Java)——作为 Apache POI 项目 的一部分,它允许读取、创建和修改 PPT 和 PPTX 文件。适用于 Java 应用程序,但在处理大型演示文稿时速度有时会较慢。 PHPPresentation(PHP)——使 PHP 开发人员能够动态生成演示文稿。仍在开发中,一些高级格式设置功能有限。 Ruby PowerPoint (Ruby) – 提供用于基本处理PowerPoint 文件的 Ruby 接口,但与Python 或 Java 库相比,功能较少。
八月 26, 2025 · 2 分钟 · Sher Azam Khan

什么是 DOCX 文件及其与 DOC 的区别?

最后更新: 2025年4月9日 DOCX 文件 是 Microsoft Word 使用的一种文档格式,是 Office Open XML (OOXML) 规范的一部分。DOC 是 Office 2007 之前使用的旧的二进制文件格式。与之相比,DOCX 更小、更安全,并支持高级功能。 请查看我们的详细指南:DOC 和 DOCX 的区别 什么是 DOCX 文件? DOCX 文件 是 Microsoft Word 用于存储文本、图像、表格和其他格式元素的文档文件格式。它于 Microsoft Office 2007 推出,是 Word 文档的默认文件格式,并且是 Office Open XML (OOXML) 标准的一部分。DOCX 文件在各个平台上得到广泛支持,使其成为创建和共享文档的可靠选择。 与基于二进制的旧 DOC 格式相比,DOCX 文件是基于 XML 结构构建的。此更改允许更好的压缩、改进的兼容性和在文件损坏时更容易恢复文件。 DOCX 文件的突出之处 轻量和压缩: DOCX 文件使用 ZIP 压缩,因此与 DOC 文件相比,尺寸更小,节省存储空间并加速文件传输。 丰富的格式选项: DOCX 支持高级格式功能,如样式、主题、表格、图像、图表和嵌入对象,使用户能够创建专业外观的文档。 跨平台兼容性: DOCX 文件可以在包括 Google Docs、LibreOffice 和 Apple Pages 等各种应用程序中打开和编辑,确保在多种设备和操作系统上的可访问性。
三月 26, 2025 · 1 分钟 · Shakeel Faiz

什么是 XML:全面指南

最后更新: 2025年3月25日 什么是 XML? XML(可扩展标记语言) 是一种用于存储、传输和重建数据的标记语言和文件格式。它提供了一种结构化的方法来编码信息,使其既可被人类读取,也可被机器读取。 XML 的主要特性 1. 由开放标准定义 由 万维网联盟(W3C) 于1998年根据 XML 1.0规范 建立。 遵循严格的规则以保证数据结构化且易于解释。 2. 设计目标 XML 的设计着重于在不同平台上的简洁性、普遍性和可用性。 采用基于文本的格式,便于阅读和编辑。 3. 支持 Unicode XML 支持 Unicode,允许存储和处理多语言文本。 4. 适用性 最初为文档创建,现在 XML 被广泛用于各个领域的数据表示,包括网络服务、API 和配置文件。 5. 模式和 API XML 结构可以使用文档类型定义(DTD)、 XML 架构(XSD) 或 Relax NG 来定义。 各种 API,如 DOM(文档对象模型) 和 SAX(简单 API for XML),支持 XML 处理。 6. XML 的常见用途 不同系统之间的数据交换(如网络服务、API)。 软件应用中的配置文件。 存储结构化信息(如 RSS 提要、SVG 图形、文档格式如 DOCX)。 网络开发(如 XHTML、SOAP、基于 AJAX 的应用)。 XML 概述 1.
三月 25, 2025 · 3 分钟 · Shakeel Faiz

适用于 Python、Java 和 JavaScript 的最佳 XML 解析器(附示例)

最后更新: 2025 年 3 月 25 日 XML(可扩展标记语言) 广泛用于数据存储、配置文件和 web 服务。高效解析 XML 对于处理结构化数据的开发者来说至关重要。本文将探索适用于 Python、Java 和 JavaScript 的最佳 XML 解析器,并为每种语言提供示例。 1. 在 Python 中解析 XML Python 提供了多种库来解析 XML 文件,每种都有其适用的用例。 1.1 xml.etree.ElementTree(内置库) xml.etree.ElementTree 是一个简单且高效的内置模块,用于解析 XML。 示例:解析 XML 文件 优点: 轻量且易于使用。 缺点: 在处理复杂 XML 结构时功能有限。 1.2 lxml(快速且功能丰富) lxml 是一个强大的库,基于 libxml2 C 库,提供速度和 XPath 支持。 示例:使用 lxml 解析 优点: 比 ElementTree 更快,支持 XPath。 缺点: 需要安装(pip install lxml)。 1.3 BeautifulSoup(最适合网页抓取) BeautifulSoup 主要用于 解析 HTML,但也支持 XML。
三月 21, 2025 · 2 分钟 · Shakeel Faiz

如何用 Python、Java 和 JavaScript 读取和编辑 XML 文件

最后更新:2025年3月25日 XML (可扩展标记语言) 被广泛用于存储和传输数据。无论您是初学者还是经验丰富的开发者,了解如何读取和编辑 XML 文件都是必不可少的。在本指南中,我们将介绍高效处理 XML 文件的基本和高级方法。 理解 XML 结构 一个 XML 文件由元素、属性和层次结构数据组成。以下是一个简单的 XML 示例: 读取 XML 文件 1. 使用 Python Python 的 xml.etree.ElementTree 模块允许简便地解析 XML。 xml.etree.ElementTree 是 Python 的内置模块,这意味着您无需单独安装它。它与 Python 一同预装,提供用于解析、修改和创建 XML 数据的便捷工具。 代码解析 这个 Python 脚本使用 xml.etree.ElementTree 来解析一个 XML 文件(books.xml)。它检索所有 元素,提取它们的、<author> 和 <price> 值,并打印出来。这使得结构化的 XML 数据读取变得更容易。 2. 使用 Java Java 提供 javax.xml.parsers 用于处理 XML。 javax.xml.parsers 是一个 Java 内置包,提供用于使用 DOM(文档对象模型)和 SAX(简单 API for XML)解析器解析 XML 的类。它被包含在 Java 标准库中,所以无需额外安装即可使用。 </section> <footer class="entry-footer"><span title='2025-03-20 00:00:00 +0000 UTC'>三月 20, 2025</span> · 1 分钟 · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 如何用 Python、Java 和 JavaScript 读取和编辑 XML 文件" href="https://blog.fileformat.com/zh/programming/how-to-read-and-edit-xml-files-in-python-java-and-javascript/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>阅读和编辑XML文件的新手指南 </h2> </header> <section class="entry-content-home"> 最后更新: 2025年3月25日 为什么学习XML编辑? XML (可扩展标记语言) 广泛用于软件应用程序、Web服务和配置文件中的数据存储和传输。然而,许多人在正确打开或修改XML文件时遇到困难。本指南将帮助初学者和开发人员学习如何高效地读取、编辑、验证和格式化XML文件。 打开XML文件的工具 1. 记事本 (Windows内置编辑器) 右键单击XML文件,选择 打开方式 > 记事本。 适用于快速编辑,但缺乏语法高亮功能。 2. Visual Studio Code (VS Code) 免费、轻量且功能丰富的代码编辑器。 提供语法高亮、自动格式化和XML验证扩展功能。 3. Microsoft Excel 能以结构化表格形式打开XML。 导航到 文件 > 打开 > 浏览,选择XML文件,然后选择 作为XML表格。 4. 在线XML编辑器 网站如 CodeBeautify、XMLGrid 和 XMLViewer 允许查看和编辑XML而无需安装软件。 适用于快速检查和格式化。 编辑XML:语法规则和最佳实践 遵循正确的标签结构 每个开始标签都必须有对应的结束标签。 <person> <name>John Doe</name> </person> 使用有意义的标签名 除非必要,避免使用诸如<item>或<data>这样的一般性标签。 确保嵌套正确 不正确的示例: <parent> <child1> <child2></child2> </child1> </parent> 正确的示例: <parent> <child1> <child2></child2> </child1> </parent> 转义特殊字符 使用<代表<,>代表>,&代表&。 使用XSD(XML模式定义)验证XML XML验证通过使用XSD文件定义规则来确保数据的完整性。 验证XML的步骤: 创建一个XSD文件(定义XML结构) </section> <footer class="entry-footer"><span title='2025-03-19 00:00:00 +0000 UTC'>三月 19, 2025</span> · 1 分钟 · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 阅读和编辑XML文件的新手指南" href="https://blog.fileformat.com/zh/web/a-beginner-guide-to-reading-and-editing-xml-files/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>Minecraft 与 MCPACK 文件 </h2> </header> <section class="entry-content-home"> 最后更新: 2025年2月27日 什么是 Minecraft? Minecraft 是一款全球公认的沙盒游戏,提供无与伦比的创作自由,让玩家可以在程序生成的世界中探索、建造和生存。自2009年测试版发布和2011年正式发布以来,Minecraft 已成为有史以来最畅销的视频游戏,销量超过3亿份。其开放式的游戏玩法、模组功能和社区驱动的内容都促进了其持久的成功。其中一个使 Minecraft 实现自定义的关键组件是 MCPACK 文件格式,它允许玩家修改游戏内的纹理、声音和行为。 Minecraft 的开放性 Minecraft 的独特之处在于其并没有强制性的目标,允许玩家自己定义游戏目标。虽然游戏包含一个可选的成就系统,但核心体验围绕在通过方块建造采集资源、制作物品和建造复杂建筑上。玩家与一个由不同生物群系组成的扩展、程序化生成的世界互动,包括森林、沙漠、丛林和山地。 游戏最值得注意的特性之一是 红石,这是一种材料,允许玩家创建复杂的电路、自动化机械和逻辑门。这些使得游戏内出现了计算机、计算器和简单的人工智能形式,展示了 Minecraft 的深度和灵活性。 游戏模式 Minecraft 提供不同的游戏模式以满足各种玩法风格。 生存模式 在生存模式中,玩家必须收集自然资源如木材和石头以制作工具、建造避难所,并从黑暗区域生成的敌对生物中保护自己。该模式设有一个健康条和一个饥饿条,要求玩家管理食物供应以维持健康。 玩家可以通过采矿、冶炼、繁殖动物和战斗等活动获得经验值。这些经验值可以用来附魔工具、武器和盔甲,提高它们的耐久性和效能。 当玩家死亡时,他们会掉落物品,这些物品可以在5分钟内被取回,否则会消失。重生点默认为世界生成点,但可以通过床或重生锚进行调整。 生存模式有两种变体: 硬核模式:类似于生存,但具有永久死亡——玩家死亡后无法重生,必须删除世界或以旁观者身份进行游戏。 冒险模式:专为自定义地图设计,此模式限制玩家直接修改世界,要求他们遵循地图制作者设定的预定义规则。 创造模式 在创造模式中,玩家可以无限制地获取所有物品,并即时放置或移除方块。玩家可以自由飞行,不受伤害或饥饿威胁,使此模式特别适合于大型项目的建造、测试机制和红石装置的实验。 MCPACK 文件在生存和创造模式中都扮演着关键角色,因为它们允许玩家修改纹理、声音和游戏机制,以创造符合他们偏好风格的自定义体验。 玩家自定义:皮肤和 MCPACK 文件 新的 Minecraft 玩家会随机分配一个默认皮肤,共有九种选项,包括标志性的 Steve 和 Alex 模型。然而,Minecraft 最受欢迎的特性之一就是自定义皮肤的能力。玩家可以创造并上传自己的角色设计,替换默认纹理为个性化的版本。 这些自定义皮肤通常以 PNG 格式 存储,但当其打包成资源包时,它们格式化为 MCPACK 文件。MCPACK 格式是一种压缩包,包含自定义资源如: 角色皮肤(玩家和生物的自定义外观) 纹理(对方块、物品和用户界面元素的修改) 声音(自定义背景音乐、音效或语音包) Minecraft 中的生物:被动、中立和敌对实体 生物(简称移动实体)为 Minecraft 的世界带来了生机,种类不同的生物对游戏玩法产生不同的影响。这些生物包括: 被动生物(友好且对资源有用):牛、猪、鸡和羊提供食物、羊毛和皮革。 敌对生物(攻击玩家):僵尸、骷髅、蜘蛛、女巫和臭名昭著的苦力怕,其接近玩家时会自爆。 中立生物(未被激怒时非敌对):末影人、狼和猪灵。末影人具有可以瞬移和搬运方块的独特性,让其成为游戏中最有趣的生物之一。 某些敌对生物如僵尸和骷髅在阳光下会燃烧,除非受到头盔保护或站在水中。还有一些特殊的生物变体,如尸壳(免疫阳光的沙漠僵尸)和溺尸(生活在海洋和河流中的僵尸)。 使用 MCPACK 文件修改生物和纹理 MCPACK 文件是 Minecraft 自定义系统的重要组成部分。玩家和开发者使用它们创建自定义资源包以修改游戏内的视觉、声音甚至行为。通过 MCPACK 文件,玩家可以: </section> <footer class="entry-footer"><span title='2025-02-27 00:00:00 +0000 UTC'>二月 27, 2025</span> · 1 分钟 · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to Minecraft 与 MCPACK 文件" href="https://blog.fileformat.com/zh/game/minecraft-and-mcpack-files/"></a> </article> <footer class="page-footer"> <nav class="pagination"> <a class="prev" href="https://blog.fileformat.com/zh/">« 上一页</a> <a class="next" href="https://blog.fileformat.com/zh/page/3/">下一页 »</a> </nav> </footer> </main> <footer class="footer"> </footer> <a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor"> <path d="M12 6H0l6-6z" /> </svg> </a> <script> (function(i, s, o, g, r, a, m) {i['ContainerizeMenuObject'] = r; i[r] = i[r] || function() {(i[r].q = i[r].q || []).push(arguments)}, i[r].l = 1 * new Date(); a = s.createElement(o),m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.append(a)})(window, document, 'script', 'https://menu.containerize.com/scripts/engine.min.js?v=1.0.1', 'fileformat-zh'); </script> <script> let menu = document.getElementById('menu') if (menu) { menu.scrollLeft = localStorage.getItem("menu-scroll-position"); menu.onscroll = function () { localStorage.setItem("menu-scroll-position", menu.scrollLeft); } } document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener("click", function (e) { e.preventDefault(); var id = this.getAttribute("href").substr(1); if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({ behavior: "smooth" }); } else { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView(); } if (id === "top") { history.replaceState(null, null, " "); } else { history.pushState(null, null, `#${id}`); } }); }); </script> <script> var mybutton = document.getElementById("top-link"); window.onscroll = function () { if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) { mybutton.style.visibility = "visible"; mybutton.style.opacity = "1"; } else { mybutton.style.visibility = "hidden"; mybutton.style.opacity = "0"; } }; </script> <script> document.getElementById("theme-toggle").addEventListener("click", () => { if (document.body.className.includes("dark")) { document.body.classList.remove('dark'); localStorage.setItem("pref-theme", 'light'); } else { document.body.classList.add('dark'); localStorage.setItem("pref-theme", 'dark'); } }) </script> </body> </html>