Layui表格单元格内如何嵌入一个小型的Sparkline折线图

冬丽小哥_3794

冬丽小哥_3794

2026-04-16

780人浏览

原创

Sparkline在Layui表格中渲染失败主因是DOM未挂载完成即初始化;需在table.render的done回调中用requestAnimationFrame延迟遍历.sparkline-cell单元格,清空旧canvas后插入新canvas并调用sparkline(),同时每次重绘前清除旧实例。

Sparkline 图表在 Layui 表格中渲染失败的常见原因

直接在 layui.table.render() 的 cols 配置里用 templet 插入 <canvas></canvas> 或调用 sparkline(),大概率会白屏、报错或只显示第一个单元格——因为 layui 渲染表格时是批量生成 dom,而多数 sparkline 库(如 jquery.sparkline)依赖元素已挂载到文档流且尺寸可读。表格滚动、分页、重绘时,未做生命周期管理的图表会丢失或重复初始化。

用 done 回调 + 延迟绑定渲染 Sparkline

必须等表格 DOM 完全就绪、且每行数据都已插入页面后,再逐个查找目标单元格并初始化图表。不能在 templet 里直接 new 实例。

  • done 回调里用 setTimeout(..., 0) 或 requestAnimationFrame 确保 DOM 已 flush,再遍历 .layui-table-body .layui-table-cell 中带特定 class(比如 sparkline-cell)的单元格
  • 每个单元格内先清空旧 <canvas></canvas>(避免重复渲染叠加),再插入新 <canvas></canvas> 并调用 $(...).sparkline()
  • 数据需从原始行对象提取,不要依赖单元格 innerHTML —— 表格可能含 HTML 转义或格式化内容
done: function(res, curr, count) {
  requestAnimationFrame(() => {
    $('.sparkline-cell').each(function() {
      const $cell = $(this);
      const data = $cell.data('values'); // 提前存好数组,如 [12, 19, 11, 29, 15]
      $cell.empty().append('<canvas></canvas>');
      $cell.find('canvas').sparkline(data, {
        type: 'line',
        width: '80px',
        height: '24px',
        lineColor: '#39f',
        fillColor: 'rgba(57,159,255,0.1)'
      });
    });
  });
}

兼容 Layui 分页/搜索/排序后的图表重绘

每次表格重载(table.reload())、搜索、排序都会触发 done,但默认不会清除旧图表实例,导致内存泄漏和 canvas 重叠。必须主动销毁。

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载
  • 在 done 开头加 $('.sparkline-cell canvas').remove(); 清理上一轮画布
  • 避免用全局变量存图表实例;若需交互(如 hover 显示数值),改用事件委托绑定到父容器,监听 canvas 上的 mousemove
  • 移动端要注意 canvas 像素比,sparkline 默认不处理 devicePixelRatio,小图可能模糊 —— 可手动缩放 canvas.width/height 并用 CSS 缩放回原尺寸

替代方案:纯 CSS + SVG 的轻量 Sparkline(无 JS 依赖)

如果只是展示趋势线、不需要交互或动态更新,用 SVG path 替代 canvas 更稳。Layui 表格支持在 templet 中直接返回 SVG 字符串,且不受 DOM 挂载时机限制。

  • 预计算折线路径:把 5~10 个数值归一化为 0–100 区间,映射成 <path d="M0,80 L20,60 L40,70..."></path>
  • 用 viewBox 控制缩放,CSS 设定固定宽高,确保不同分辨率下清晰
  • 缺点:无法响应式重绘,数据变化需重新渲染整行;但省去 JS 初始化开销,适合只读报表场景

复杂点在于数值归一化逻辑要写在 templet 函数里,且得避开 Layui 对 HTML 字符串的自动转义 —— 必须用 return {html: svgStr} 形式(部分 Layui 版本需升级到 2.9+)。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

layui

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

相关专题

更多
ECharts是什么
ECharts是什么

ECharts是基于JavaScript的开源可视化库,能够帮助开发者轻松地实现各种复杂的数据可视化效果,提供了丰富的图表类型和交互功能。本专题为大家提供ECharts是什么的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.04

812

5

echarts自适应大小设置
echarts自适应大小设置

使用ECharts的自适应大小设置可以使图表能够根据不同屏幕尺寸和设备进行自适应。一种是使用resize事件,在图表容器大小改变时重新渲染图表;另一种是使用CSS样式,通过设置图表容器的宽度和高度为百分比值,使图表容器根据父元素的大小进行自适应。根据实际需求选择合适的方法,可以使图表在不同设备上都能够良好地显示和交互 。

2023.09.13

4445

8

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

4091

6

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

244

21

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

0

15

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

0

18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 12.9万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 11.1万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习