首页 web前端 css教程 使用 SVG 的 行号

使用 SVG 的 行号

Aug 19, 2024 pm 06:33 PM

前几天,我正在开发 JSON 模式生成器,并希望在

我做了一些研究,发现了多种方法:

  1. 使用背景图像(TinyMCE 就是这样做的,使用 PNG)
  2. 使用
      ;有序列表。

我一个都不喜欢!第一个看起来不清晰 - 并且与我已经为我的

第二个需要一堆 JavaScript 来维护有序列表:动态添加/删除

  • 元素、同步滚动事件等等。

    所以我最终创建了一个混合体。

    它是动态生成的 SVG,存储为 CSS 自定义属性 — 并用作背景图像,从其父

    Line Numbers for <textarea> 使用 SVG

    让我们开始吧。


    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。

    我们快到了!


    要将生成的 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中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热门文章

    <🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
    4 周前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系统,解释
    4 周前 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora:巫婆树的耳语 - 如何解锁抓钩
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    热门话题

    Java教程
    1673
    14
    CakePHP 教程
    1429
    52
    Laravel 教程
    1333
    25
    PHP教程
    1278
    29
    C# 教程
    1257
    24
    静态表单提供商的比较 静态表单提供商的比较 Apr 16, 2025 am 11:20 AM

    让我们尝试在这里造成一个术语:“静态表单提供商”。你带上html

    使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

    在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

    每周平台新闻:HTML加载属性,主要的ARIA规格以及从iframe转移到Shadow dom 每周平台新闻:HTML加载属性,主要的ARIA规格以及从iframe转移到Shadow dom Apr 17, 2025 am 10:55 AM

    在本周的平台新闻综述中,Chrome引入了一个用于加载的新属性,Web开发人员的可访问性规范以及BBC Move

    带有HTML对话框元素的一些动手 带有HTML对话框元素的一些动手 Apr 16, 2025 am 11:33 AM

    这是我第一次查看HTML元素。我已经意识到了一段时间,但是尚未将其旋转。它很酷,

    纸张形式 纸张形式 Apr 16, 2025 am 11:24 AM

    购买或建造是技术的经典辩论。自己构建东西可能会感觉更便宜,因为您的信用卡账单上没有订单项,但是

    托管您自己的非JavaScript分析的选项 托管您自己的非JavaScript分析的选项 Apr 15, 2025 am 11:09 AM

    有很多分析平台可帮助您跟踪网站上的访问者和使用数据。也许最著名的是Google Analytics(广泛使用)

    '订阅播客”链接应在哪里? '订阅播客”链接应在哪里? Apr 16, 2025 pm 12:04 PM

    有一段时间,iTunes是播客中的大狗,因此,如果您将“订阅播客”链接到喜欢:

    See all articles