”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 SVG 的行号

使用 SVG 的行号

发布于2024-08-23
浏览:812

前几天我正在开发 JSON 模式生成器,并且想要在

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

  1. 使用背景图像(TinyMCE 使用 PNG 来做到这一点)
  2. 使用
      有序列表。

我不喜欢他们中的任何一个!第一个看起来不清晰 - 并且与我已经为

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

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

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

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

    Line Numbers for <textarea> 使用 SVG

    让我们深入探讨。


    JavaScript

    一、主要方法:

    lineNumbers(element, numLines = 50, inline = false)
    

    element 是要使用的

    接下来,我们为自定义属性定义一个前缀:

    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 = `
      ${Array.from({ length: numLines }, (_, i) => `${i   1}`).join("")}
    `;
    

    我们来分解一下:

    最后一部分迭代从 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 方法可能需要重新生成和重新应用整个背景图像。

  • 版本声明 本文转载于:https://dev.to/madsstoumann/line-numbers-for-using-svg-1216?1如有侵犯,请联系[email protected]删除
    最新教程 更多>
    • Redis 解释:主要功能、用例和实践项目
      Redis 解释:主要功能、用例和实践项目
      Introduction Redis is an open-source, in-memory data structure store used as a database, cache, and message broker. It’s known for its perfor...
      编程 发布于2024-11-06
    • 如何在 macOS 上设置 MySQL 自动启动:开发人员分步指南
      如何在 macOS 上设置 MySQL 自动启动:开发人员分步指南
      作为开发人员,我们经常发现自己在本地计算机上使用 MySQL 数据库。虽然每次系统启动时手动启动 MySQL 是可以管理的,但这可能是一项乏味的任务。在本指南中,我们将逐步介绍将 MySQL 设置为在 macOS 上自动启动的过程,从而节省您的时间并简化您的工作流程。 先决条件 在我...
      编程 发布于2024-11-06
    • 掌握 TypeScript:了解扩展的力量
      掌握 TypeScript:了解扩展的力量
      TypeScript 中的 extends 关键字就像一把瑞士军刀。它用于多种上下文,包括继承、泛型和条件类型。了解如何有效地使用扩展可以生成更健壮、可重用和类型安全的代码。 使用扩展进行继承 extends 的主要用途之一是继承,允许您创建基于现有接口或类的新接口或类。 inter...
      编程 发布于2024-11-06
    • 如何将具有组计数的列添加到 Pandas 中的分组数据框?
      如何将具有组计数的列添加到 Pandas 中的分组数据框?
      如何在Pandas中向分组数据框中添加列在数据分析中,经常需要对数据进行分组并进行计算每组。 Pandas 通过其 groupby 函数提供了一种便捷的方法来做到这一点。一个常见的任务是计算每个组中某一列的值,并将包含这些计数的列添加到数据帧中。考虑数据帧 df:df = pd.DataFrame(...
      编程 发布于2024-11-06
    • 破解编码面试的热门必备书籍(从初级到高级排名)
      破解编码面试的热门必备书籍(从初级到高级排名)
      准备编码面试可能是一个充满挑战的旅程,但拥有正确的资源可以让一切变得不同。无论您是从算法开始的初学者、专注于系统设计的中级开发人员,还是完善编码实践的高级工程师,这份按难度排名的前 10 本书列表都将为您提供成功所需的知识和技能。你的软件工程面试。这些书籍涵盖了从基本算法到系统设计和简洁编码原则的所...
      编程 发布于2024-11-06
    • Java 字符串实习初学者指南
      Java 字符串实习初学者指南
      Java String Interning 引入了通过在共享池中存储唯一字符串来优化内存的概念,减少重复对象。它解释了 Java 如何自动实习字符串文字以及开发人员如何使用 intern() 方法手动将字符串添加到池中。 通过掌握字符串驻留,您可以提高 Java 应用程序的性能和内存效率。要深入...
      编程 发布于2024-11-06
    • 如何在 GUI 应用程序中的不同页面之间共享变量数据?
      如何在 GUI 应用程序中的不同页面之间共享变量数据?
      如何从类中获取变量数据在 GUI 编程环境中,单个应用程序窗口中包含多个页面是很常见的。每个页面可能包含各种小部件,例如输入字段、按钮或标签。当与这些小部件交互时,用户提供输入或做出需要在不同页面之间共享的选择。这就提出了如何从一个类访问另一个类的变量数据的问题,特别是当这些类代表不同的页面时。利用...
      编程 发布于2024-11-06
    • React 中的动态路由
      React 中的动态路由
      React 中的动态路由允许您基于动态数据或参数创建路由,从而在应用程序中实现更灵活、更强大的导航。这对于需要根据用户输入或其他动态因素呈现不同组件的应用程序特别有用。 使用 React Router 设置动态路由 您通常会使用react-router-dom库在React中实现动态路由。这是分步指...
      编程 发布于2024-11-06
    • 大批
      大批
      方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
      编程 发布于2024-11-06
    • WPF中延迟操作时如何避免UI冻结?
      WPF中延迟操作时如何避免UI冻结?
      WPF 中的延迟操作WPF 中的延迟操作对于增强用户体验和确保平滑过渡至关重要。一种常见的情况是在导航到新窗口之前添加延迟。为了实现此目的,经常使用 Thread.Sleep,如提供的代码片段中所示。但是,在延迟过程中,使用 Thread.Sleep 阻塞 UI 线程会导致 UI 无响应。这表现为在...
      编程 发布于2024-11-06
    • 利用 Java 进行实时数据流和处理
      利用 Java 进行实时数据流和处理
      In today's data-driven world, the ability to process and analyze data in real-time is crucial for businesses to make informed decisions swiftly. Java...
      编程 发布于2024-11-06
    • 如何修复损坏的 InnoDB 表?
      如何修复损坏的 InnoDB 表?
      从 InnoDB 表损坏中恢复灾难性事件可能会导致数据库表严重损坏,特别是 InnoDB 表。遇到这种情况时,了解可用的修复选项就变得至关重要。InnoDB Table Corruption Symptoms查询中描述的症状,包括事务日志中的时间戳错误InnoDB 表的修复策略虽然已经有修复 MyI...
      编程 发布于2024-11-06
    • JavaScript 数组和对象中是否正式允许使用尾随逗号?
      JavaScript 数组和对象中是否正式允许使用尾随逗号?
      数组和对象中的尾随逗号:标准还是容忍?数组和对象中尾随逗号的存在引发了一些关于它们的争论JavaScript 的标准化。这个问题源于在不同浏览器中观察到的不一致行为,特别是旧版本的 Internet Explorer。规范状态根据 ECMAScript 5 规范(第 11.1.5 节) ),对象字面...
      编程 发布于2024-11-06
    • 最佳引导模板生成器
      最佳引导模板生成器
      在当今快速发展的数字环境中,速度和效率是关键,网页设计师和开发人员越来越依赖 Bootstrap 构建器来简化他们的工作流程。这些工具可以快速创建响应灵敏、具有视觉吸引力的网站,使团队能够比以往更快地将他们的想法变为现实。 Bootstrap 构建器真正改变了网站的构建方式,使该过程更加易于访问和高...
      编程 发布于2024-11-06
    • 简化 NestJS 中的文件上传:无需磁盘存储即可高效内存中解析 CSV 和 XLSX
      简化 NestJS 中的文件上传:无需磁盘存储即可高效内存中解析 CSV 和 XLSX
      Effortless File Parsing in NestJS: Manage CSV and XLSX Uploads in Memory for Speed, Security, and Scalability Introduction Handling file uploa...
      编程 发布于2024-11-06

    免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

    Copyright© 2022 湘ICP备2022001581号-3