首頁 web前端 css教學 使用 SVG 的 行號

使用 SVG 的 行號

Aug 19, 2024 pm 06:33 PM

前幾天,我正在開發 JSON 模式產生器,並希望在

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

  1. 使用背景圖像(TinyMCE 就是這樣做的,使用 PNG)
  2. 使用
      ;有序列表。

我一個都不喜歡!第一個看起來不清晰 - 並且與我已經為我的

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

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

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

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

    Line Numbers for <textarea> 使用 SVG

    讓我們開始吧。


    JavaScript

    一、main方法:

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

    元素是

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

    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 = `<svg xmlns="http://www.w3.org/2000/svg">
      <style>
        svg { background: ${bgColor}; }
        text {
          fill: hsl(from ${fillColor} h s l / 50%);
          font-family: ${fontFamily};
          font-size: ${fontSize}px;
          line-height: ${lineHeight};
          text-anchor: end;
          translate: 0 calc((var(--n) * ${translateY}px) + ${paddingTop}px);
        }
      </style>
      ${Array.from({ length: numLines }, (_, i) => `<text x="90%" style="--n:${i + 1};">${i + 1}</text>`).join("")}
    </svg>`;
    

    讓我們來分解一下:

    最後一部分迭代從 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 方法可能需要重新產生並重新套用整個背景圖像。

  • 以上是使用 SVG 的 行號的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    PHP教程
    1532
    276
    什麼是常見的CSS瀏覽器不一致? 什麼是常見的CSS瀏覽器不一致? Jul 26, 2025 am 07:04 AM

    不同瀏覽器對CSS解析存在差異,導致顯示效果不一致,主要包括默認樣式差異、盒模型計算方式、Flexbox和Grid佈局支持程度及某些CSS屬性行為不一致。 1.默認樣式處理不一致,解決方法是使用CSSReset或Normalize.css統一初始樣式;2.舊版IE的盒模型計算方式不同,建議統一使用box-sizing:border-box;3.Flexbox和Grid在邊緣情況或舊版本中表現有差異,應多測試並使用Autoprefixer;4.某些CSS屬性行為不一致,需查閱CanIuse並提供降級

    什麼是口音色的物業? 什麼是口音色的物業? Jul 26, 2025 am 09:25 AM

    accent-color是CSS中用於自定義復選框、單選按鈕和滑塊等表單元素高亮顏色的屬性;1.它直接改變表單控件選中狀態的默認顏色,如將復選框的藍色勾選標記改為紅色;2.支持的元素包括type="checkbox"、type="radio"和type="range"的輸入框;3.使用accent-color可避免複雜的自定義樣式和額外DOM結構,保持原生可訪問性;4.現代瀏覽器普遍支持,舊瀏覽器需降級處理;5.設置accent-col

    描述'垂直align”屬性及其典型用例 描述'垂直align”屬性及其典型用例 Jul 26, 2025 am 07:35 AM

    1.ItAdjustSelementsLikeImagesRikeImagesOrformInputswithIntExtLineSustLineSlineSlineSlineSlikeLikeLikeBaseline,中間,Super,Super,Super和Sub.2.intablebecells,ItControlScontentalStalteNtalmscontentalMedwithThtop,Middle,Middle,Midder,Midder,經常

    如何更改CSS中的文本顏色? 如何更改CSS中的文本顏色? Jul 27, 2025 am 04:25 AM

    要改變CSS中文本顏色,需使用color屬性;1.使用color屬性可設置文本前景色,支持顏色名稱(如red)、十六進制碼(如#ff0000)、RGB值(如rgb(255,0,0))、HSL值(如hsl(0,100%,50%))以及帶透明度的RGBA或HSLA(如rgba(255,0,0,0.5));2.可將顏色應用於包含文本的任何元素,如h1至h6標題、段落p、鏈接a(需注意a:link、a:visited、a:hover、a:active不同狀態的顏色設置)、按鈕、div、span等;3.最

    如何清除未使用的CSS? 如何清除未使用的CSS? Jul 27, 2025 am 02:47 AM

    UseAutomatedToolSlikePurgecsSoruncsStoscanAndRemoveUnusedcss; 2. integratePuratePurgingIntoyourBuildProcessviawebpack,vite,vite,ortailwind ’scontentConfiguration; 3.AuditcsSusageWithChroMedEvtoolScoverAgeTabBeforgeForgingToavoidRemovingNeedEdedStyles; 4.safelistdynamic

    CSS暗模式切換示例 CSS暗模式切換示例 Jul 30, 2025 am 05:28 AM

    首先通過JavaScript獲取用戶系統偏好和本地存儲的主題設置,初始化頁面主題;1.HTML結構包含一個按鈕用於觸發主題切換;2.CSS使用:root定義亮色主題變量,.dark-mode類定義暗色主題變量,並通過var()應用這些變量;3.JavaScript檢測prefers-color-scheme並讀取localStorage決定初始主題;4.點擊按鈕時切換html元素上的dark-mode類,並將當前狀態保存至localStorage;5.所有顏色變化均帶有0.3秒過渡動畫,提升用戶

    如何使用CSS Backdrop-Filter屬性? 如何使用CSS Backdrop-Filter屬性? Aug 02, 2025 pm 12:11 PM

    backdrop-filter用於對元素背後的內容應用視覺效果,1.使用backdrop-filter:blur(10px)等語法實現毛玻璃效果;2.支持blur、brightness、contrast等多種濾鏡函數並可疊加;3.常用於玻璃態卡片設計,需確保元素與背景重疊;4.現代瀏覽器支持良好,可用@supports提供降級方案;5.避免過大模糊值和頻繁重繪以優化性能,該屬性僅在元素背後有內容時生效。

    CSS方面比例屬性是什麼?如何使用它? CSS方面比例屬性是什麼?如何使用它? Aug 04, 2025 pm 04:38 PM

    Theaspect-ratioCSSpropertydefinesthewidth-to-heightratioofanelement,ensuringconsistentproportionsinresponsivedesigns.1.Itisapplieddirectlytoelementslikeimages,videos,orcontainersusingsyntaxsuchasaspect-ratio:16/9.2.Commonusecasesincludemaintainingres

    See all articles