中國傳統的

比較無損壓縮和有損壓縮:如何選擇適當的壓縮方式?

Last Updated: 02 Sep, 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 可逆性 完全可逆 不可逆 何時選擇無損壓縮 您需要原始文件的精確副本(例如,法律文件、代碼文件)。 您正在編輯高品質照片或原始音訊檔案。 資料完整性比節省儲存空間更重要。 何時選擇有損壓縮 您要在線發布圖片或視頻。 串流媒體播放音樂或視頻,快速加載至關重要。
9月 2, 2025 · 1 min · Sher Azam Khan

開源 PowerPoint API 與商業 PowerPoint API:如何選擇合適的 API?

Last Updated: 06 Nov, 2025 在當今數據驅動的世界中,PowerPoint簡報不再局限於教室和公司會議室。開發人員越來越需要以程式設計方式建立、修改和自動化簡報文件,用於網路應用程式、報表系統、線上學習平台和業務工作流程。這種需求催生了兩大類工具:開源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 庫相比,功能較少。
8月 26, 2025 · 2 min · Sher Azam Khan

可搜尋PDF與一般PDF的差異?如何將普通PDF轉換為可搜尋PDF?

Last Updated: 26 Nov, 2025 PDF 文件是共享和儲存文件最廣泛使用的格式之一。它們能夠保留格式,可在任何裝置上使用,並且可以包含文字、圖像和圖形。但並非所有 PDF 文件都具有相同的功能。在快速尋找特定資訊方面,可搜尋 PDF 和 普通 PDF 的表現截然不同。 什麼是可搜尋 PDF? 可搜尋 PDF 是一種包含可選擇和可搜尋文字的 PDF 檔案。除了包含視覺內容外,它還包含一個嵌入式、機器可讀的文字圖層。這種文件看起來就像掃描圖像,但允許用戶搜尋、選擇和複製文字。與本質上只是頁面照片的「平面」或純圖像 PDF 不同,可搜尋 PDF 包含一個使用者和搜尋引擎都可以讀取的不可見文字圖層。 可搜尋 PDF 解決了這個問題。它保留了合約的原始圖像,但在其上方添加了一層不可見的、電腦可讀的文字圖層。大多數可搜尋的 PDF 文件都是使用**光學字元辨識 (OCR)**技術創建的,該技術掃描基於圖像的頁面,識別字元、數字和符號,並將它們轉換為數位文本,該文本以不可見的方式顯示在文件圖像下方。 可搜尋的 PDF 檔案有兩種建立方式: 直接從文字為主的來源檔案(例如 Microsoft Word、Google Docs 或 HTML 檔案)匯出。 使用 OCR(光學字元辨識)技術從掃描文件轉換而來。 什麼是普通(不可搜尋)PDF? 普通(不可搜尋)PDF本質上是一個基於圖像的文檔,其中的文字無法被識別為可編輯或可搜尋的內容。這些文件通常是透過掃描紙本文件(不使用 OCR 技術)或將圖像(例如 JPG 或 PNG)儲存為 PDF 文件創建的,也可以直接使用 Microsoft Word 或 Google Docs 等文字處理軟體建立。 可搜尋 PDF 和普通 PDF 的主要區別 編號 功能 可搜尋 PDF 普通(不可搜尋)PDF 1 文字搜尋 ✅ 是(Ctrl+F 可用) ❌ 否(文字是圖像) 2 文字選擇 ✅ 是 ❌ 否 3 可編輯文字 ✅ 可使用 PDF 編輯器編輯 ❌ 不使用 OCR 則無法編輯 4 SEO 友善 ✅ 搜尋引擎可以索引文字 ❌ 不可索引 5 檔案大小 ⚖️ 較大(包含文字資料) ⚖️ 較小(僅包含圖像) 6 輔助功能 ✅ 螢幕閱讀器友善 ❌ 無法存取 為什麼可搜尋 PDF 很重要 可搜尋 PDF 為個人、企業和組織帶來許多好處,包括:
8月 19, 2025 · 2 min · Sher Azam Khan

比較 TXT、可搜尋 PDF 和 Word (DOCX) 格式-哪種 OCR 輸出格式最佳?

Last Updated: 20 Nov, 2025 您剛剛掃描了一份文檔,並使用光學字元辨識 (OCR) 軟體進行了處理。現在您面臨一個選擇:應該如何保存輸出結果?三種最常見的格式是 TXT、可搜尋 PDF 和 Word (DOCX),每種格式都有其獨特的優缺點。選擇合適的格式可以為您節省大量時間,並顯著提高您的工作效率。這三種最常見的選項是: 純文字 (TXT) 可搜尋 PDF Word 文件 (DOCX) 每種格式都有其自身的優點、限制和理想的應用場景。在本篇部落格文章中,我們將詳細分析每種格式的優缺點,以幫助您根據自身需求確定合適的格式。 1. 純文字 (.txt) - 原始資料處理的理想選擇 TXT 檔案是最簡單、最基本的數位文字格式。當您的OCR軟體輸出TXT檔案時,它會去除所有格式——字體、顏色、圖像、列和表格——只保留原始的、未格式化的文字。 優點: ✅ 通用相容性 – TXT檔案可以在任何裝置上打開,從智慧型手機到舊式系統,無需特殊軟體。 ✅ 檔案體積小 – 由於TXT檔案包含未格式化的原始文本,因此體積非常小。 ✅ 易於編輯和處理 – 非常適合資料擷取、文字探勘或匯入資料庫和AI模型。 ✅ 無格式問題 – 與DOCX或PDF不同,TXT檔案不會有字體、影像或佈局錯亂的風險。 ✅ 資料分析的理想選擇 – 由於TXT檔案僅包含純文本,因此非常適合匯入資料庫、電子表格或程式腳本,以進行資料探勘和分析。 缺點: ❌ 格式完全遺失:這是最大的缺點。您會遺失原始文件的全部視覺佈局,如果文件結構很重要,這會導致文字難以閱讀。 ❌ 圖像無法搜尋:如果 OCR 結果包含圖表或手寫註釋,它們將無法保留。 ❌ 結構受限:段落和標題可能會因為缺少適當的間距而混雜在一起。 最適合: 需要提取大量文字進行定量分析的資料科學家和研究人員。 將文字輸入應用程式的程式設計師。 任何只需要最基本的文字內容而不需要其他功能的人。 適合快速複製內容並貼上到其他應用程式。 2. 可搜尋 PDF (.pdf) - 完美的數位副本 可搜尋 PDF (1) 兼具兩者的優點。它與原始掃描文件外觀完全相同,保留了精確的佈局、圖像和字體。然而,它在圖像「背後」包含一個不可見的OCR 生成文字圖層。這意味著您可以查看原始文檔,同時還能搜尋、選擇、複製和貼上文字。
8月 12, 2025 · 2 min · Sher Azam Khan

如何將PDF轉換為FDF?

Last Updated: 20 Nov, 2025 PDF 是一種在保持格式完整的情況下共享文件的絕佳方式,但有時您只需要 PDF 中的表單資料,而不是整個文件。這時 FDF 就派上用場了。 FDF,即“表單資料格式”,是 Adob​​e 開發的一種文件格式,專門用於處理 PDF 中的表單資料(例如姓名、電子郵件、複選框狀態)。 所以,如果您一直在問自己**「如何將 PDF 轉換為 FDF?」**,那麼您來對地方了!讓我們來詳細了解一下。 什麼是 FDF,為什麼要使用它? 在開始轉換之前,讓我們先明確一下 FDF 究竟是什麼。 FDF(表單資料格式) 文件是輕量級文件,僅包含填寫 PDF 表單所需的資料和說明。 您可以將其理解為表單內容,但不包含表單設計。 它通常用於提取、修改或發送表單資料,而無需完整的 PDF 文件。 如何將 PDF 轉換為 FDF 根據您可用的工具,您可以使用幾種方法。 1. 使用 Adob​​e Acrobat Pro 如果您可以使用 Adob​​e Acrobat Pro,這是最直接的方法。 步驟: 在 Adobe Acrobat Pro 中開啟您的 PDF 表單。 前往 檔案 > 匯出資料 或 工具 > 準備表單。 選擇 匯出資料,然後選擇 FDF 作為檔案格式。 將 .fdf 檔案儲存到您想要的任何位置。 注意:此方法僅適用於 可填寫表單。
6月 25, 2025 · 2 min · Shakeel Faiz

什麼是 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,確保在多個設備和操作系統上的可訪問性。
3月 26, 2025 · 1 min · Shakeel Faiz

什麼是XML:全面指南

最後更新日期:2025年3月25日 什麼是XML? XML(可擴展標記語言)是一種用於儲存、傳輸和重構數據的標記語言和文件格式。它提供了一種結構化的編碼信息方法,使其既可讀於人又可讀於機器。 XML的關鍵特性 1. 由開放標準定義 由萬維網協會(W3C)於1998年根據XML 1.0規範建立。 遵循嚴格的規則以確保數據結構化且易於解讀。 2. 設計目標 XML的設計考慮到簡單性、通用性和可用性,可在不同平台上使用。 使用基於文本的格式,易於閱讀和編輯。 3. Unicode支持 XML支持Unicode,允許存儲和處理多語言文本。 4. 多功能性 最初為文檔創建,現已廣泛用於各領域的數據表示,包括網絡服務、API 和配置文件。 5. 架構和API XML結構可以使用文檔類型定義(DTD)、XML結構(XSD)或Relax NG定義。 各種API,如DOM(文檔對象模型)和SAX(簡單XML API),使XML處理成為可能。 6. XML的常見用途 不同系統之間的數據交換(例如,網絡服務,API)。 軟件應用程序中的配置文件。 存儲結構化信息(例如,RSS提要,SVG圖形,類似DOCX的文檔格式)。 網頁開發(例如,XHTML,SOAP,基於AJAX的應用程序)。 XML概述 1. XML的主要用途:序列化 XML中的序列化意味著: 以結構化格式存儲數據。 在不同系統之間傳輸數據。 重建可用形式的數據。 當兩個系統需要交換信息時,XML提供了一個標準化的文件格式以實現互操作性。它充當結構化數據交換的**“通用語言”**。 2. XML作為標記語言 XML是一種標記語言,意思是它: 用標籤標記數據以清晰結構。 層次結構化地組織信息。 用元數據分類數據。 示例: XML BasicsJohn Doe 在此,和<author>是定義數據元素的標籤。 3. XML結構(XSD)和驗證 一個**XML結構(XSD)**定義了XML文檔的結構規則。 XML文檔可以是: 格式良好的 → 遵循基本語法規則(正確嵌套,正確閉合標籤)。 有效的 → 符合結構規則(必需元素,正確數據類型)。 XSD規則示例: <xs:element name="title" type="xs:string"/> 這確保了<title>必須包含一個字符串值。 4. XML媒體類型(RFC 7303) </section> <footer class="entry-footer"><span title='2025-03-25 00:00:00 +0000 UTC'>3月 25, 2025</span> · 2 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 什麼是XML:全面指南" href="https://blog.fileformat.com/zh-hant/web/what-is-xml-comprehensive-guide/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>Python、Java 和 JavaScript 的最佳 XML 解析器(附示例) </h2> </header> <section class="entry-content-home"> 最後更新: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。 範例:使用 BeautifulSoup 解析 XML 優點: 易於使用,適合網頁抓取。 缺點: 比 lxml 慢。 2. </section> <footer class="entry-footer"><span title='2025-03-21 00:00:00 +0000 UTC'>3月 21, 2025</span> · 2 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to Python、Java 和 JavaScript 的最佳 XML 解析器(附示例)" href="https://blog.fileformat.com/zh-hant/web/the-best-xml-parsers-for-python-java-and-javascript-with-examples/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>如何使用 Python、Java 和 JavaScript 讀取和編輯 XML 文件 </h2> </header> <section class="entry-content-home"> 最後更新: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)。它檢索所有 <book> 元素,提取它們的 <title>、<author> 和 <price> 值,並將其打印出來。這樣可以輕鬆讀取結構化的 XML 資料。 2. 使用 Java Java 提供 javax.xml.parsers 來處理 XML。 javax.xml.parsers 是 Java 的內置包,提供用於通過 DOM(文檔對象模型)和 SAX(簡單 API 用於 XML)解析器解析 XML 的類。它包含在 Java 標準庫中,因此無需安裝任何額外的東西即可使用它。 </section> <footer class="entry-footer"><span title='2025-03-20 00:00:00 +0000 UTC'>3月 20, 2025</span> · 1 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 如何使用 Python、Java 和 JavaScript 讀取和編輯 XML 文件" href="https://blog.fileformat.com/zh-hant/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 (可擴展標記語言) 被廣泛應用於存儲和傳輸數據在軟體應用、網絡服務和配置文件中。然而,許多人在正確打開或修改 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> 使用有意義的標籤名稱 </section> <footer class="entry-footer"><span title='2025-03-19 00:00:00 +0000 UTC'>3月 19, 2025</span> · 1 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 新手指南:閱讀和編輯 XML 文件" href="https://blog.fileformat.com/zh-hant/web/a-beginner-guide-to-reading-and-editing-xml-files/"></a> </article> <footer class="page-footer"> <nav class="pagination"> <a class="prev" href="https://blog.fileformat.com/zh-hant/">« Prev Page</a> <a class="next" href="https://blog.fileformat.com/zh-hant/page/3/">Next Page »</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>