使用 SVG 的 行號
前幾天,我正在開發 JSON 模式產生器,並希望在
我做了一些研究,發現了多種方法:
- 使用背景圖像(TinyMCE 就是這樣做的,使用 PNG)
- 使用
- ;有序列表。
我一個都不喜歡!第一個看起來不清晰 - 並且與我已經為我的
第二個需要一堆 JavaScript 來維護有序列表:動態新增/刪除
所以我最後創建了一個混合體。
它是動態產生的 SVG,儲存為 CSS 自訂屬性 — 並用作背景圖像,從其父
讓我們開始吧。
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 用作 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中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

要改變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.最

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

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

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

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