어느 날 JSON 스키마 생성기를 작업하면서 <텍스트 영역>에 줄 번호를 표시하고 싶었습니다. 화려한 것도 없고 부드러운 줄 바꿈이나 조금 복잡한 것도 고려하지 않습니다.
몇 가지 조사를 통해 여러 가지 접근 방식을 찾았습니다.
그 중 하나도 마음에 들지 않았습니다! 첫 번째는 깔끔해 보이지 않았고
두 번째에는 순서가 지정된 목록을 유지하기 위해 여러 JavaScript가 필요했습니다. 즉,
그래서 결국 하이브리드를 만들게 되었습니다.
동적으로 생성된 SVG로 CSS 사용자 정의 속성으로 저장되고 배경 이미지로 사용되며 상위
자세히 살펴보겠습니다.
먼저 주요 방법은 다음과 같습니다.
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>`;
분류해 보겠습니다.