news 2026/9/19 11:59:37

Material Design Lite 数据表格组件(mdl-data-table)实战指南:基础标记、选择交互与源码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Material Design Lite 数据表格组件(mdl-data-table)实战指南:基础标记、选择交互与源码解析

Material Design Lite 数据表格组件(mdl-data-table)实战指南:基础标记、选择交互与源码解析

【免费下载链接】material-design-liteMaterial Design Components in HTML/CSS/JS项目地址: https://gitcode.com/gh_mirrors/ma/material-design-lite

本篇指南围绕 Material Design Lite(MDL)仓库中的><table> <thead> </thead> <tbody> </tbody> </table>

第 2 步:添加 MDL 类声明组件

通过class属性添加一个或多个 MDL 类(空格分隔):

<table class="mdl-data-table mdl-js-data-table"> <thead> </thead> <tbody> </tbody> </table>

这里两个类各有分工:mdl-data-table定义表格为 MDL 组件(视觉样式),mdl-js-data-table为表格分配基础 JS 行为(组件升级),二者都必须存在。

第 3 步:填充表头与数据行

<thead>内编写恰好一行<tr>,为每一列包含一个表头单元格<th>,并写入列名文本。注意:为了保持表头对齐,纯文本列的表头需要添加 "non-numeric" 类(数据单元格默认按数值格式化):

<table class="mdl-data-table mdl-js-data-table"> <thead> <tr> <th class="mdl-data-table__cell--non-numeric">Name</th> <th>Age</th> <th>ID Number</th> </tr> </thead> <tbody> </tbody> </table>

<tbody>中,为每一行数据编写一个<tr>,为行中每一列编写一个<td>。与表头同理,纯文本数据单元格需要添加 non-numeric 类保证对齐:

<table class="mdl-data-table mdl-js-data-table"> <thead> <tr> <th class="mdl-data-table__cell--non-numeric">Name</th> <th>Age</th> <th>ID Number</th> </tr> </thead> <tbody> <tr> <td class="mdl-data-table__cell--non-numeric">Don Aubrey</td> <td>25</td> <td>49021</td> </tr> <tr> <td class="mdl-data-table__cell--non-numeric">Sophia Carson</td> <td>32</td> <td>10258</td> </tr> <tr> <td class="mdl-data-table__cell--non-numeric">Steve Moreno</td> <td>29</td> <td>12359</td> </tr> </tbody> </table>

完成以上三步后,data-table 组件即可直接使用。

配置选项全览

MDL CSS 类为数据表格应用各类预设的视觉与行为增强,下表列出全部可用类及其作用(与 README.md 的配置表一致):

MDL class作用备注
mdl-data-table将表格定义为 MDL 组件必须,加在 table 元素上
mdl-js-data-table为表格分配基础 MDL 行为必须,加在 table 元素上
mdl-data-table--selectable应用全选/单选行为(复选框)可选,加在 table 元素上
mdl-data-table__header--sorted-ascending应用视觉样式,指示列按升序排序可选,加在表头(th)上
mdl-data-table__header--sorted-descending应用视觉样式,指示列按降序排序可选,加在表头(th)上
mdl-data-table__cell--non-numeric对数据单元格应用文本格式(左对齐)可选,表头与数据单元格均可加
(不加任何类)对表头或数据单元格应用数值格式(右对齐,默认)默认行为

实战示例

示例一:带主选择框与行选择框的表格

在表格上追加mdl-data-table--selectable类即可启用选择交互,MDL 会自动在表头首列插入“主”复选框(全选/取消全选),并在每一行首列插入独立复选框:

<table class="mdl-data-table mdl-js-data-table mdl-data-table--selectable"> <thead> <tr> <th class="mdl-data-table__cell--non-numeric">Material</th> <th>Quantity</th> <th>Unit price</th> </tr> </thead> <tbody> <tr> <td class="mdl-data-table__cell--non-numeric">Acrylic (Transparent)</td> <td>250</td> <td>$2.90</td> </tr> <tr> <td class="mdl-data-table__cell--non-numeric">Plywood (Birch)</td> <td>50</td> <td>$1.25</td> </tr> <tr> <td class="mdl-data-table__cell--non-numeric">Laminate (Gold on Blue)</td> <td>10</td> <td>$12.35</td> </tr> </tbody> </table>

仓库中的官方代码片段 src/data-table/snippets/data-table.html 在此基础上还叠加了mdl-shadow--2dp(2dp 层级阴影),让表格呈现“卡片悬浮”质感,可直接组合使用。

示例二:无选择框、以文本为主的表格

不加 selectable 类即得到纯展示型表格。此例包含大量文本数据,因此文本列全部标注 non-numeric,数值列(Age)保持默认右对齐:

<table class="mdl-data-table mdl-js-data-table"> <thead> <tr> <th class="mdl-data-table__cell--non-numeric">Name</th> <th class="mdl-data-table__cell--non-numeric">Nickname</th> <th>Age</th> <th class="mdl-data-table__cell--non-numeric">Living?</th> </tr> </thead> <tbody> <tr> <td class="mdl-data-table__cell--non-numeric">John Lennon</td> <td class="mdl-data-table__cell--non-numeric">The smart one</td> <td>40</td> <td class="mdl-data-table__cell--non-numeric">No</td> </tr> <tr> <td class="mdl-data-table__cell--non-numeric">Paul McCartney</td> <td class="mdl-data-table__cell--non-numeric">The cute one</td> <td>73</td> <td class="mdl-data-table__cell--non-numeric">Yes</td> </tr> <tr> <td class="mdl-data-table__cell--non-numeric">George Harrison</td> <td class="mdl-data-table__cell--non-numeric">The shy one</td> <td>58</td> <td class="mdl-data-table__cell--non-numeric">No</td> </tr> <tr> <td class="mdl-data-table__cell--non-numeric">Ringo Starr</td> <td class="mdl-data-table__cell--non-numeric">The funny one</td> <td>74</td> <td class="mdl-data-table__cell--non-numeric">Yes</td> </tr> </tbody> </table>

样式原理:默认右对齐、悬停与选中态

查看样式源码 src/data-table/_data-table.scss 可以印证文档描述并发现更多细节:

  • 默认数值对齐td, th统一text-align: right(第 55 行);而.mdl-data-table__cell--non-numeric通过双重类名提升优先级覆盖为text-align: left(第 118-120 行),这就是“数值默认右对齐、文本需手动左对齐”的底层实现;
  • 悬停与选中反馈tbody tr:hover使用$data-table-hover-color(#eeeeee),.is-selected使用$data-table-selection-color(#e0e0e0),并叠加material-animation-default(0.28s)background-color过渡动画(第 36-50 行);
  • 边框与留白:表格整体使用$data-table-dividers(1px 实线、颜色 rgba(#000,0.12))描边,单元格列间距为$data-table-column-spacing / 2,首列/末列分别留 24px 内边距;
  • 排序指示箭头.mdl-data-table__header--sorted-ascending通过:before伪元素输出 Material 图标码点\e5d8(箭头向上),--sorted-descending输出\e5db(箭头向下),排序表头文字色加深至 rgba(#000,0.87),悬停时箭头颜色变浅(第 91-110 行)。也就是说,排序类只负责呈现视觉状态,排序逻辑需自行实现,仅需在点击表头后切换对应类即可。

这些视觉参数全部集中定义在变量文件 src/_variables.scss 中,包括:正文字号 13px、表头字号 12px、排序图标 16px、行高 48px、表头高度 56px 等。如需主题化,修改这些!default变量即可在编译 SCSS 时全局生效。

JavaScript 行为:选择交互的实现原理

选择交互并非纯 CSS 实现,而是由 src/data-table/data-table.js 在组件升级时动态注入。关键流程如下:

  1. 组件注册:文件末尾调用componentHandler.register(...),以mdl-js-data-table为 CSS 入口、MaterialDataTable为构造器完成注册(第 174-178 行)。页面加载时组件处理器自动扫描带mdl-js-data-table的表格并升级;
  2. 选择列注入init()中检测表格是否含mdl-data-table--selectable类。若包含,则在第一个<th>前插入一个承载“主复选框”的<th>,并在每个<tbody>(含<tfoot>)行的第一个<td>前插入行复选框(第 143-169 行);
  3. 复选框复用 Checkbox 组件createCheckbox_()动态创建label.mdl-checkbox.mdl-js-checkbox.mdl-js-ripple-effect包裹原生<input type="checkbox">,随后调用componentHandler.upgradeElement(label, 'MaterialCheckbox')将其升级为标准的 MDL 复选框组件(第 115-138 行),因此行复选框天然具备水波纹与勾选动画;
  4. 全选与联动selectRow_()绑定 change 事件——勾选主复选框会遍历所有行,调用行内MaterialCheckboxcheck()/uncheck()并同步is-selected类;取消某一行勾选时,若主复选框处于选中态会自动取消(第 72-105 行)。

所以对开发者而言,mdl-data-table--selectable类把“插复选框、联动画、联动全选”三件事全部托管,无需手写任何交互代码。

测试验证与引入方式

仓库在 test/unit/data-table.js 中为组件提供了单元测试,可验证实现契约:

  • MaterialDataTable构造器全局可用;
  • 通过componentHandler.upgradeElement(el, 'MaterialDataTable')可成功升级,且元素会获得data-upgraded标记;
  • 预置is-selected类的行,在升级后其行内复选框 label 自动带上is-checked类——印证了createCheckbox_中“读取已有is-selected类并初始化勾选态”的逻辑(checkbox.checked = row.classList.contains('is-selected'))。

引入组件时,只需确保样式与脚本被加载:样式在 src/material-design-lite.scss 中通过@import "data-table/data-table";随主样式表一起编译,脚本则随data-table.js打包(需一并包含componentHandler与 Checkbox 组件依赖,如 src/mdlComponentHandler.js 与 src/checkbox/checkbox.js)。

小结

MDL contenteditable="false">【免费下载链接】material-design-liteMaterial Design Components in HTML/CSS/JS项目地址: https://gitcode.com/gh_mirrors/ma/material-design-lite

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 11:58:42

Rust 工具链入门:rustup、cargo 与 rust-analyzer 配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 11:56:37

全息投影与AR全解析:从360度展示柜到Vuforia交互开发

简介&#xff1a;这是一份完整的《全息投影方案》范文文档&#xff0c;面向需要撰写全息投影、虚拟成像或多媒体展示方案的技术人员、项目策划人员及高校学生。文档系统梳理了全息投影基于光干涉与衍射的记录、再现技术原理&#xff0c;并结合博物馆文物展示、历史场景复现等案…

作者头像 李华
网站建设 2026/9/19 11:56:18

Claude Code 里 Haiku 与 Sonnet 轮着干活?TaoToken 这样改 settings.json

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 11:56:16

vtkResliceCursorWidget 设计还原,把 Codex 通道改到 TaoToken 再对照源码

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 11:55:55

链游投资新范式:N+联盟与链上行为分析方法论

1. N投资联盟不是新基金&#xff0c;而是链游生态的“联合体实验”看到标题里“Galaxy、Republic、Alameda成立N投资联盟”&#xff0c;很多人第一反应是&#xff1a;又一家新VC诞生了&#xff1f;募资多少&#xff1f;LP是谁&#xff1f;GP团队背景如何&#xff1f;——但如果…

作者头像 李华