Outro dia eu estava trabalhando em um gerador de esquema JSON e queria exibir números de linha em uma
Fiz algumas pesquisas e encontrei várias abordagens:
Não gostei de nenhum deles! O primeiro não parecia nítido - e não combinava com os estilos que eu já tinha em vigor para meus elementos
O segundo exigia um monte de JavaScript para manter essa lista ordenada: adicionar/remover elementos
Então acabei criando um híbrido.
É um SVG gerado dinamicamente, armazenado como uma Propriedade personalizada CSS — e usado como imagem de fundo, herdando os estilos de seu elemento pai
Vamos mergulhar.
Primeiro, o método principal:
lineNumbers(element, numLines = 50, inline = false)
element é o elemento
Em seguida, definimos um prefixo para a propriedade personalizada:
const prefix = '--linenum-';
Antes de continuarmos, verificamos se devemos reutilizar alguma propriedade existente:
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; } }
Em seguida, extraímos estilos do elemento, renderizando o SVG com a mesma família de fontes, tamanho de fonte, altura de linha etc.
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);Também precisamos de um ID aleatório para nossa propriedade:
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);E agora é hora de renderizar o 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);
Vamos detalhar:
Na seçãoIsenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3