저번에 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 = ``;
분석해 보겠습니다.
마지막 부분은 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 조작에 의존하지 않습니다. 행 번호는 CSS 사용자 정의 속성에 저장된 단일 SVG로 생성됩니다.
줄 번호는 배경 이미지의 일부이므로 텍스트 내용과 함께 자동으로 스크롤되므로 수동 동기화 논리가 필요하지 않습니다.
생성된 SVG를 CSS 사용자 정의 속성에 저장하면 여러 요소에서 재사용할 수 있습니다. 즉, 여러 요소에 동일한 줄 번호가 필요한 경우 중복되는 SVG 생성을 방지하면서 모두 동일한 사용자 정의 속성을 참조할 수 있습니다.
순서가 지정된 목록은 스크린 리더 및 보조 기술을 통해 더 쉽게 액세스할 수 있는 반면, SVG 기반 줄 번호는 무시되거나 잘못 해석될 수 있습니다.
순서가 지정된 목록에서 개별 줄 번호의 스타일을 지정하고 상호 작용하는 것은 간단합니다. 대조적으로, SVG 접근 방식을 사용하면 특정 줄 번호에 대화형 기능을 추가하거나 사용자 정의하기가 더 어렵습니다.
SVG 및 CSS 사용자 정의 속성은 모든 브라우저에서 일관되게 렌더링되지 않을 수 있습니다. 현재 구현에는 Safari에 문제가 있어 번역에서 (paddingTop / 10)을 빼야 합니다.
정렬된 목록은 줄 추가 또는 제거와 같은 동적 콘텐츠 업데이트를 처리하는 데 더 유연할 수 있는 반면, SVG 접근 방식은 전체 배경 이미지를 재생성하고 다시 적용해야 할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3