"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Números de linha para usar SVG

Números de linha para usar SVG

Publicado em 23/08/2024
Navegar:612

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:

  1. Usando uma imagem de fundo (o TinyMCE faz isso, usando um PNG)
  2. Usando uma lista ordenada
      .

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

  • dinamicamente, sincronizar eventos de rolagem e muito mais.

    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

    Line Numbers for <textarea> usando SVG

    Vamos mergulhar.


    JavaScript

    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 traduzirY = (fontSize * lineHeight).toFixed(2);
    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 id = `${prefix}${Math.random().toString(36).substr(2, 6)}`;
    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 svg = ` svg { background: ${bgColor}; } texto { preencher: hsl(de ${fillColor} h s l / 50%); família de fontes: ${fontFamily}; tamanho da fonte: ${fontSize}px; altura da linha: ${lineHeight}; âncora de texto: fim; traduzir: 0 calc((var(--n) * ${translateY}px) ${paddingTop}px); } ${Array.from({ comprimento: numLines }, (_, i) => `${i 1} texto>`).join("")} `;
    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ção
  • Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/madsstoumann/line-numbers-for-using-svg-1216?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
    Tutorial mais recente Mais>

    Isençã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