」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 SVG 的行號

使用 SVG 的行號

發佈於2024-08-23
瀏覽:763

前幾天我正在開發 JSON 模式產生器,並且想要在

我做了一些研究,發現了多種方法:

  1. 使用背景圖像(TinyMCE 使用 PNG 來做到這一點)
  2. 使用
      有序列表。

我不喜歡他們中的任何一個!第一個看起來不清晰 - 並且與我已經為

第二個需要一堆 JavaScript 來維護有序列表:動態新增/刪除

  • 元素、同步滾動事件等等。

    所以我最終創建了一個混合體。

    它是一個動態生成的 SVG,儲存為 CSS 自訂屬性 — 並用作背景圖像,從其父

    Line Numbers for <textarea> 使用 SVG

    讓我們深入探討。


    JavaScript

    一、主要方法:

    lineNumbers(element, numLines = 50, inline = false)
    

    element 是要使用的

    接下來,我們為自訂屬性定義一個前綴:

    const prefix = '--linenum-';
    

    在繼續之前,我們檢查是否重複使用任何現有屬性:

    if (!inline) {
      const styleString = document.body.getAttribute('style') || '';
      const regex = new RegExp(`${prefix}[^:]*`, 'g');
      const match = styleString.match(regex);
    
      if (match) {
        element.style.backgroundImage = `var(${match[0]})`;
        return;
      }
    }
    

    接下來,我們從元素中提取樣式,使用相同的字體系列、字體大小、行高等渲染SVG。 :

    const bgColor = getComputedStyle(element).borderColor;
    const fillColor = getComputedStyle(element).color;
    const fontFamily = getComputedStyle(element).fontFamily;
    const fontSize = parseFloat(getComputedStyle(element).fontSize);
    const lineHeight = parseFloat(getComputedStyle(element).lineHeight) / fontSize;
    const paddingTop = parseFloat(getComputedStyle(element).paddingTop) / 2;
    const translateY = (fontSize * lineHeight).toFixed(2);
    

    我們的財產也需要一個隨機 ID:

    const id = `${prefix}${Math.random().toString(36).substr(2, 6)}`;
    

    現在是時候渲染 SVG 了:

    const svg = `
      ${Array.from({ length: numLines }, (_, i) => `${i   1}`).join("")}
    `;
    

    我們來分解:

    最後一部分迭代從 numLines 建立的數組,並將 元素附加到主 SVG。

    我們快到了!


    要將產生的 SVG 用作 url() 屬性,我們需要對其進行編碼

    const encodedURI = `url("data:image/svg xml,${encodeURIComponent(svg)}")`;
    

    最後,我們在元素或文件主體上設定該屬性:

    const target = inline ? element : document.body;
    target.style.setProperty(id, encodedURI);
    element.style.backgroundImage = `var(${id})`;
    

    就是這樣!

    還不錯,只有 610 字節,縮小並壓縮!


    示範

    您可以在此處查看演示,並在此處下載完整腳本。

    下面是簡化的 Codepen,不使用內聯屬性邏輯:


    優點和缺點

    有優點和缺點嗎?當然有!

    就我個人而言,對於我目前的項目,我需要一種簡單、清晰的方法來將行號添加到

    優點

    減少 DOM 操作

    此方法不依賴操作 DOM。行號以單一 SVG 生成,儲存在 CSS 自訂屬性中。

    自動同步

    由於行號是背景圖像的一部分,它們會隨著文字內容自動滾動,而無需手動同步邏輯。

    跨元素的可重複使用性

    透過將產生的 SVG 儲存在 CSS 自訂屬性中,它可以在多個元素之間重複使用。這意味著如果多個元素需要相同的行號,它們都可以引用相同的自訂屬性,從而避免冗餘的 SVG 生成。

    可擴展性

    SVG 的向量特性確保行號在任何縮放等級下都保持清晰。

    缺點

    無障礙

    螢幕閱讀器和輔助技術更容易存取有序列表,而基於 SVG 的行號可能會被忽略或誤解。

    客製化複雜性

    對有序清單中的各個行號進行樣式設定和互動非常簡單。相較之下,SVG 方法使得自訂特定行號或在特定行號上新增互動性變得更加困難。

    瀏覽器相容性

    SVG 和 CSS 自訂屬性可能無法在所有瀏覽器中一致地呈現 - 目前的實作在 Safari 中存在問題,我們需要從 translateY 中扣除 (paddingTop / 10)。

    動態內容處理

    有序清單可以更靈活地處理動態內容更新,例如新增或刪除行,而 SVG 方法可能需要重新產生和重新套用整個背景影像。

  • 版本聲明 本文轉載於:https://dev.to/madsstoumann/line-numbers-for-using-svg-1216?1如有侵犯,請聯絡[email protected]刪除
    最新教學 更多>
    • Redis 解釋:主要功能、用例和實踐項目
      Redis 解釋:主要功能、用例和實踐項目
      Introduction Redis is an open-source, in-memory data structure store used as a database, cache, and message broker. It’s known for its perfor...
      程式設計 發佈於2024-11-06
    • 如何在 macOS 上設定 MySQL 自動啟動:開發人員逐步指南
      如何在 macOS 上設定 MySQL 自動啟動:開發人員逐步指南
      作為開發人員,我們經常發現自己在本地電腦上使用 MySQL 資料庫。雖然每次系統啟動時手動啟動 MySQL 是可以管理的,但這可能是一項乏味的任務。在本指南中,我們將逐步介紹將 MySQL 設定為在 macOS 上自動啟動的流程,從而節省您的時間並簡化您的工作流程。 先決條件 在我...
      程式設計 發佈於2024-11-06
    • 掌握 TypeScript:了解擴充的力量
      掌握 TypeScript:了解擴充的力量
      TypeScript 中的 extends 关键字就像一把瑞士军刀。它用于多种上下文,包括继承、泛型和条件类型。了解如何有效地使用扩展可以生成更健壮、可重用和类型安全的代码。 使用扩展进行继承 extends 的主要用途之一是继承,允许您创建基于现有接口或类的新接口或类。 inter...
      程式設計 發佈於2024-11-06
    • 如何將具有群組計數的欄位新增至 Pandas 中的分組資料框?
      如何將具有群組計數的欄位新增至 Pandas 中的分組資料框?
      如何在Pandas中向分組資料框中添加列在資料分析中,經常需要將資料分組並進行計算每組。 Pandas 透過其 groupby 函數提供了一種便捷的方法來做到這一點。一個常見的任務是計算每個組中某一列的值,並將包含這些計數的列加入到資料幀中。 考慮資料幀df:df = pd.DataFrame({'...
      程式設計 發佈於2024-11-06
    • 破解編碼面試的熱門必備書籍(從初級到高級排名)
      破解編碼面試的熱門必備書籍(從初級到高級排名)
      准备编码面试可能是一个充满挑战的旅程,但拥有正确的资源可以让一切变得不同。无论您是从算法开始的初学者、专注于系统设计的中级开发人员,还是完善编码实践的高级工程师,这份按难度排名的前 10 本书列表都将为您提供成功所需的知识和技能。你的软件工程面试。这些书籍涵盖了从基本算法到系统设计和简洁编码原则的所...
      程式設計 發佈於2024-11-06
    • Java 字串實習初學者指南
      Java 字串實習初學者指南
      Java String Interning 引入了透過在共享池中儲存唯一字串來優化記憶體的概念,減少重複物件。它解釋了 Java 如何自動實習字串文字以及開發人員如何使用 intern() 方法手動將字串新增至池中。 透過掌握字串駐留,您可以提高 Java 應用程式的效能和記憶體效率。要深入了解...
      程式設計 發佈於2024-11-06
    • 如何在 GUI 應用程式中的不同頁面之間共用變數資料?
      如何在 GUI 應用程式中的不同頁面之間共用變數資料?
      如何從類別中取得變數資料在 GUI 程式設計環境中,單一應用程式視窗中包含多個頁面是很常見的。每個頁面可能包含各種小部件,例如輸入欄位、按鈕或標籤。當與這些小部件互動時,使用者提供輸入或做出需要在不同頁面之間共享的選擇。這就提出瞭如何從一個類別存取另一個類別的變數資料的問題,特別是當這些類別代表不同...
      程式設計 發佈於2024-11-06
    • React 中的動態路由
      React 中的動態路由
      React 中的動態路由可讓您基於動態資料或參數建立路由,從而在應用程式中實現更靈活、更強大的導航。這對於需要根據使用者輸入或其他動態因素呈現不同元件的應用程式特別有用。 使用 React Router 設定動態路由 您通常會使用react-router-dom程式庫在React中實作動態路由。這...
      程式設計 發佈於2024-11-06
    • 大批
      大批
      方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
      程式設計 發佈於2024-11-06
    • WPF中延遲操作時如何避免UI凍結?
      WPF中延遲操作時如何避免UI凍結?
      WPF 中的延遲操作WPF 中的延遲操作對於增強用戶體驗和確保平滑過渡至關重要。常見的情況是在導航到新視窗之前添加延遲。 為了實現此目的,經常使用 Thread.Sleep,如提供的程式碼片段所示。但是,在延遲過程中,使用 Thread.Sleep 阻塞 UI 執行緒會導致 UI 無回應。這表現為在...
      程式設計 發佈於2024-11-06
    • 利用 Java 進行即時資料流和處理
      利用 Java 進行即時資料流和處理
      In today's data-driven world, the ability to process and analyze data in real-time is crucial for businesses to make informed decisions swiftly. Java...
      程式設計 發佈於2024-11-06
    • 如何修復損壞的 InnoDB 表?
      如何修復損壞的 InnoDB 表?
      從 InnoDB 表損壞中恢復災難性事件可能會導致資料庫表嚴重損壞,特別是 InnoDB 表。遇到這種情況時,了解可用的修復選項就變得至關重要。 InnoDB Table Corruption Symptoms查詢中所述的症狀,包括交易日誌中的時間戳錯誤InnoDB 表的修復策略雖然已經有修復MyI...
      程式設計 發佈於2024-11-06
    • JavaScript 陣列和物件中是否正式允許使用尾隨逗號?
      JavaScript 陣列和物件中是否正式允許使用尾隨逗號?
      陣列與物件中的尾隨逗號:標準還是容忍? 數組和物件中尾隨逗號的存在引發了一些關於它們的爭論JavaScript 的標準化。這個問題源自於在不同瀏覽器中觀察到的不一致行為,特別是舊版的 Internet Explorer。 規範狀態規範狀態ObjectLiteral : { } { P...
      程式設計 發佈於2024-11-06
    • 最佳引導模板產生器
      最佳引導模板產生器
      在當今快速發展的數位環境中,速度和效率是關鍵,網頁設計師和開發人員越來越依賴 Bootstrap 建構器來簡化他們的工作流程。這些工具可以快速創建響應靈敏、具有視覺吸引力的網站,使團隊能夠比以往更快地將他們的想法變為現實。 Bootstrap 建構器真正改變了網站的建構方式,使過程更加易於存取和高...
      程式設計 發佈於2024-11-06
    • 簡化 NestJS 中的檔案上傳:無需磁碟儲存即可高效能記憶體中解析 CSV 和 XLSX
      簡化 NestJS 中的檔案上傳:無需磁碟儲存即可高效能記憶體中解析 CSV 和 XLSX
      Effortless File Parsing in NestJS: Manage CSV and XLSX Uploads in Memory for Speed, Security, and Scalability Introduction Handling file uploa...
      程式設計 發佈於2024-11-06

    免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

    Copyright© 2022 湘ICP备2022001581号-3