使用 SVG 的

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

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

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

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

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

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

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

    Line Numbers for <textarea>使用SVG

    让我们开始吧


    JavaScript

    首先是main方法:

    雷雷

    element 是

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

    雷雷

    在继续之前,我们检查是否重用任何现有属性:

    雷雷

    接下来,我们从元素中提取样式,使用相同的字体系列、字体大小、行高等渲染SVG。:

    雷雷

    我们的房产也需要一个随机ID:

    雷雷

    现在是时候渲染 SVG 了:

    雷雷

    我们来分解一下:

    最后一部分迭代从 numLines 创建的数组,并将 元素附加到主 SVG。

    我们就快到了!


    要将生成的 SVG 用作 url() 属性,我们需要encodeit:

    雷雷

    最后,我们在元素或文档主体上设置该属性:

    雷雷

    就这样!

    还不错,只有610字节,缩小并压缩了!


    演示

    您可以在此处查看演示,并在此处下载完整脚本。

    下面是一个简化的Codepen,没有使用内联属性逻辑:


    优点和缺点

    有优点和缺点吗?当然有!

    就我个人而言,对于我当前的项目,我需要一种简单、清晰的方法来将行号添加到

    优点

    减少 DOM 操作

    该方法不依赖于操作 DOM。行号生成为单个 SVG,存储在 CSS 自定义属性中。

    自动同步

    由于行号是背景图片的一部分,它们会自动随着文本内容滚动,无需手动同步逻辑。

    跨元素的可重用性

    通过将生成的 SVG 存储在 CSS 自定义属性中,它可以在多个元素之间重复使用。这意味着如果多个元素需要相同的行号,它们都可以引用相同的自定义属性,从而避免冗余的 SVG 生成。

    可扩展性

    SVG 的矢量特性确保行号在任何缩放级别下都保持清晰。

    缺点

    无障碍

    屏幕阅读器和辅助技术更容易访问有序列表,而基于 SVG 的行号可能会被忽略或误解。

    定制复杂性

    在有序列表中设置各个行号的样式并与之交互非常简单。相比之下,SVG 方法使得自定义或为特定行号添加交互性变得更加困难。

    浏览器兼容性

    SVG 和 CSS 自定义属性可能无法在所有浏览器上一致地呈现 - 当前的实现在 Safari 上存在问题,我们需要从 translateY 中扣除 (paddingTop / 10)。

    动态内容处理

    有序列表可以更灵活地处理动态内容更新,例如添加或删除行,而 SVG 方法可能需要重新生成并重新应用整个背景图像。

  • 以上是使用 SVG 的

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

    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责声明 Sitemap
    PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!