Material Design Lite 快速上手指南:从 CDN 引入到动态组件升级的完整实践
Material Design Lite 快速上手指南从 CDN 引入到动态组件升级的完整实践【免费下载链接】material-design-liteMaterial Design Components in HTML/CSS/JS项目地址: https://gitcode.com/gh_mirrors/ma/material-design-liteMaterial Design LiteMDL是一个基于 Google Material Design 设计语言的轻量级前端组件库全部组件由 CSS、JavaScript 与 HTML 构建不依赖任何 JavaScript 框架。本文以当前仓库的官方入门文档docs/_pages/started.md其页面内容由 docs/_templates/started.html 渲染为骨架结合仓库源码与构建配置系统讲解 MDL 的五种引入方式、配色方案机制、组件使用三步法以及动态网站中upgradeElement的底层原理。读完本文你将能够独立地在任意项目中接入并配置 MDL并正确处理动态创建的组件升级问题。MDL 是什么设计目标与适用场景按照 src/INTRODUCTION.md 的定义MDL 是面向 Web 开发者的 Material Design 组件库其核心理念是以 CSS、JavaScript、HTML 三种技术构建组件用于构造美观、一致且功能完整的网页与 Web 应用。它追求三条现代 Web 设计原则浏览器可移植性browser portability跨浏览器、跨操作系统使用设备无关性device independence针对跨设备使用进行优化优雅降级graceful degradation在较老的浏览器中也能呈现可用状态。MDL 的组件库既包含按钮、复选框、文本框等常见 UI 控件的 Material Design 化重制版本也包含卡片Card、栅格布局Grid、滑块Slider、进度条Spinner、标签页Tabs、排版Typography等增强型特性。它免费开放使用既可以与任何构建库或开发环境配合也可以独立裸用——这正是lite轻量一词的定位所在。第一步引入主 CSS 与 JavaScript 文件在每个需要 MDL 的 HTML 页面中都必须引入 MDL 的 CSS 与 JavaScript 文件。官方文档提供了五种获取方式CDN 托管、手动下载、源码构建、Bower 安装、npm 安装。无论选择哪种方式页面的核心骨架都是一样的——一个link引入样式、一个script引入脚本、再加上 Material Icons 图标字体。当前仓库版本为 1.3.0见 package.json 与 bower.json。方式一CDN 托管推荐如果不想自己维护静态资源可以直接在 HTML 中加入以下三行约 27kB gzippedlink relstylesheet hrefhttps://fonts.googleapis.com/icon?familyMaterialIcons link relstylesheet href$$hosted_libs_prefix$$/$$version$$/material.indigo-pink.min.css script defer src$$hosted_libs_prefix$$/$$version$$/material.min.js/script其中$$hosted_libs_prefix$$是 CDN 前缀占位符$$version$$对应版本号当前仓库版本为 1.3.0需要替换为实际部署地址。注意脚本使用了defer属性确保脚本在文档解析完成后执行此时componentHandler才能正确扫描并升级页面中的组件。选择配色方案MDL 的配色基于主色primary与强调色accent并直接编码在 CSS 文件名中命名模式为material.{primary}-{accent}.min.css例如material.indigo-pink.min.css代表主色 indigo、强调色 pink。官方 CDN 托管了多种基于常见 Material Design 颜色的组合。你可以通过 自定义与预览工具 在线预览各配色组合的效果。各配色的具体颜色值定义在 src/_color-definitions.scss 中从源码可以确认每种主题对应一套完整的颜色变量映射。方式二手动下载从发布地址下载mdl.zip即当前仓库构建产物 dist 目录内容的压缩包解压后将material.min.css与material.min.js放入项目然后引用link relstylesheet href./material.min.css script src./material.min.js/script link relstylesheet hrefhttps://fonts.googleapis.com/icon?familyMaterialIcons同样地若要自定义配色应使用 自定义与预览工具 选择主色与强调色后下载定制版 CSS用定制文件替换默认的material.min.css。方式三从源码构建官方源码以仓库形式托管构建流程如下# 克隆本仓库当前镜像仓库 git clone https://gitcode.com/gh_mirrors/ma/material-design-lite.git # 进入源码目录 cd material-design-lite # 安装依赖并安装全局 gulp npm install npm install -g gulp # 构建生产版本组件 gulp构建产物会输出到dist目录。从 gulpfile.babel.js 的构建任务可以看到完整链路styles任务通过 gulp-sass 编译 src/material-design-lite.scss 得到material.min.cssgulpfile.babel.jsscripts任务先执行 lint 再拼接各组件脚本并压缩为material.min.jsgulpfile.babel.jszip:mdl任务则把两个主文件打包成mdl.zipgulpfile.babel.js。依赖清单与 Node 版本要求node 0.12.0见 package.json。link relstylesheet href./material.min.css script src./material.min.js/script link relstylesheet hrefhttps://fonts.googleapis.com/icon?familyMaterialIcons需要说明的是通过源码构建方式引入时无法定制配色方案——如需定制配色请优先使用 CDN 托管或手动下载方式再配合 自定义与预览工具 生成定制 CSS。方式四Bower 安装在启用 Bower 的项目中执行bower install material-design-lite --save该命令会将 MDL 库文件安装到项目的bower_components目录。从 bower.json 可以看到包的主文件声明为material.min.css与material.min.js版本同为 1.3.0。引用方式link relstylesheet href/bower_components/material-design-lite/material.min.css script src/bower_components/material-design-lite/material.min.js/script link relstylesheet hrefhttps://fonts.googleapis.com/icon?familyMaterialIcons同样地Bower 方式也无法定制配色需要定制时仍应使用 自定义与预览工具。方式五npm 安装在 npm 工程中执行npm install material-design-lite --save该命令将库文件安装到项目的node_modules目录仓库自身的 package.json 将main指向dist/material.min.js引用方式link relstylesheet href/node_modules/material-design-lite/material.min.css script src/node_modules/material-design-lite/material.min.js/script link relstylesheet hrefhttps://fonts.googleapis.com/icon?familyMaterialIcons至此页面已具备使用 MDL 组件的全部条件。第二步使用组件——以 Button 为例官方入门页在 docs/_templates/started.html 提供了两个最直观的按钮示例带涟漪效果的强调色按钮以及彩色 FAB浮动操作按钮。这两个示例的完整源码分别位于 src/button/snippets/raised-ripple-accent.html 与 src/button/snippets/fab-colored.html可直接复制到项目页面的body中使用。示例一带涟漪的强调色凸起按钮!-- Accent-colored raised button with ripple -- button classmdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent Button /button示例二彩色 FAB 按钮!-- Colored FAB button -- button classmdl-button mdl-js-button mdl-button--fab mdl-button--colored i classmaterial-iconsadd/i /button通过 CSS 类定制组件行为MDL 组件的全部行为与外观定制都通过追加 CSS 类完成。以上述按钮为例mdl-button mdl-js-button基础按钮样式 声明这是一个需要 JavaScript 升级的 MDL 按钮组件mdl-js-button正是 src/button/button.js 中注册给MaterialButton组件的 CSS 类mdl-js-ripple-effect为按钮添加点击涟漪效果。从 src/button/button.js 的init()实现可以看到当元素包含RIPPLE_EFFECTmdl-js-ripple-effect类时组件会在按钮内动态注入mdl-button__ripple-container与mdl-ripple两个 span 元素并在 mouseup/mouseleave 时触发 blur 处理mdl-button--fab将按钮外观切换为圆形 FABmdl-button--accent/mdl-button--colored分别应用强调色与主色调色板。从 src/button/_button.scss 的样式源码可以进一步验证所有这些mdl-button--*变体类在 SCSS 中均有对应的规则定义分别控制字体、内边距、圆角与主题色。除按钮外MDL 还提供了卡片src/card、滑块src/slider、表格src/data-table、菜单src/menu等大量组件完整列表与配置选项参见 组件文档开箱即用的整站示例参见 模板页面。通用规则与原则组件使用三步法无论使用哪种组件都遵循同样的两步基本流程详见 docs/_templates/started.html从一个标准 HTML 元素开始例如button、div或ul具体取决于你要使用的组件。这一步让元素在页面中确立存在为 MDL 改造做好准备为该元素添加一个或多个 MDL 专属 CSS 类例如mdl-button或mdl-tabs__panel。这些类将 MDL 增强应用到元素上使其转变为 MDL 组件。此外务必在文档中加入 viewport meta 标签确保移动设备正确渲染meta nameviewport contentwidthdevice-width, initial-scale1.0关于 HTML 元素与 MDL CSS 类的说明MDL 采用带命名空间的 BEM 风格类mdl-前缀 __element/--modifier命名这些类可以应用到几乎所有 HTML 元素上。对于某些组件几乎任意元素都适用对于另一些组件部分元素会获得更好的视觉或行为表现。各组件文档中的示例均选用了表现良好的元素组合如果你必须使用示例之外的元素官方鼓励自行试验找到最适合你应用的 HTML 元素与 MDL 类组合。第三步进阶在动态网站中使用upgradeElementMDL 会在页面加载时自动注册并渲染所有带 MDL 类的元素。其底层机制位于 src/mdlComponentHandler.js页面load事件触发时脚本先执行cutting the mustard特性检测验证classList、querySelector、addEventListener与Array.prototype.forEach是否可用见 src/mdlComponentHandler.js通过后给html加上mdl-js类并调用componentHandler.upgradeAllRegistered()对所有已注册组件执行批量升级。但当你通过 JavaScript 动态创建 DOM 元素时这些新元素不会自动获得升级必须显式调用upgradeElement函数。官方文档给出的示例是动态创建前面展示过的带涟漪凸起按钮div idcontainer/ script var button document.createElement(button); var textNode document.createTextNode(Click Me!); button.appendChild(textNode); button.className mdl-button mdl-js-button mdl-js-ripple-effect; componentHandler.upgradeElement(button); document.getElementById(container).appendChild(button); /script关键点是upgradeElement必须在元素插入 DOM 之前调用如上例所示先 upgrade 再 appendChild这样才能保证组件的初始化逻辑在正确时机执行。upgradeElement的底层原理从 src/mdlComponentHandler.js 的实现看upgradeElementInternal的执行链路如下参数校验若传入的不是 Element 实例直接抛出Invalid argument provided to upgrade MDL element.错误事件可取消先派发可取消的mdl-componentupgrading事件若外部监听器调用了preventDefault()则本次升级被取消匹配注册组件当未显式传入 jsClass 时遍历registeredComponents_注册表找出元素 classList 中包含其cssClass、且尚未被升级的组件通过data-upgraded属性记录已升级的类名列表见 src/mdlComponentHandler.js实例化组件为每个匹配的组件调用new registeredClass.classConstructor(element)创建实例把类名追加到元素的data-upgraded属性并执行用户通过registerUpgradedCallback注册的回调src/mdlComponentHandler.js派发完成事件最后派发mdl-componentupgraded事件。每个组件在自身脚本末尾通过componentHandler.register(...)完成注册例如按钮组件注册为classAsString: MaterialButton、cssClass: mdl-js-buttonsrc/button/button.js。当widget为true时升级后的实例还会被挂载到元素属性上element[registeredClass.className] instance开发者因此可以直接调用实例的公开方法——例如MaterialButton的disable()/enable()src/button/button.js。若你的页面在首屏加载后动态替换大段 DOM例如单页应用还可以使用upgradeDom()扫描并升级全部匹配元素与upgradeElements()升级一组元素并递归处理子元素见 src/mdlComponentHandler.js。对应地downgradeElements()用于销毁组件实例并从data-upgraded中移除记录。这些 API 的定义与行为均可从 src/mdlComponentHandler.js 的源码注释与实现中确认单元测试位于 test/unit/componentHandler.js。了解 MDL 的职责边界MDL 的定位是提供一套轻量、基础的 Material Design 组件与模板集合而不是覆盖所有 UX 需求的完整框架。官方在 docs/_templates/started.html 中明确表示项目不打算提供满足所有可能的 UX 需求的组件结构而是提供低摩擦low-friction的 Material Design 实现供你在此基础上扩展即使在 Material Design 规范内部尤其是卡片也不可能以无缝的方式穷尽所有组合当你发现某个能力未被提供例如抽屉中的下拉菜单可能需要自行编写组件。换句话说MDL 刻意保持lite开发者应将其视为可构建的起点而非终点。这一设计哲学也贯穿于整个仓库的目录组织每个组件都是独立的模块如 src/button、src/card各自的样式、脚本与示例放在同一目录下方便按需取舍。下一步深入组件与模板组件详解每个组件的完整用法、MDL 类及其效果、编码注意事项与配置选项参见 组件文档其中按钮部分对应文档中引用的#buttons-section卡片、滑块、表格、菜单等小节依次对应各组件模块整站模板展示 MDL 组件组合使用的真实站点示例参见 模板页面仓库内的现成模板位于 templates 目录如 templates/dashboard/index.html、templates/blog/index.html可以直接打开参考样式与排版MDL 的排版与颜色规范参见 样式文档本地演示运行gulp构建后可通过gulp serve见 gulpfile.babel.js在本地预览站点与组件 demo。LicenseMDL 由 Google 于 2015 年发布采用 Apache-2.0 许可证仓库中的 LICENSE 文件为完整文本可自由使用、修改与分发。【免费下载链接】material-design-liteMaterial Design Components in HTML/CSS/JS项目地址: https://gitcode.com/gh_mirrors/ma/material-design-lite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

google_sign_in 插件版本演进全解析:从 0.0.1 到 7.2.0 的架构变迁与升级指南

google_sign_in 插件版本演进全解析:从 0.0.1 到 7.2.0 的架构变迁与升级指南

google_sign_in 插件版本演进全解析:从 0.0.1 到 7.2.0 的架构变迁与升级指南 【免费下载链接】packages A collection of useful packages maintained by the Flutter team 项目地址: https://gitcode.com/GitHub_Trending/pac/packages 导读 本文以 Flutt…

2026/9/19 2:10:42 阅读更多 →
工业场景下视觉与多传感器融合的物理级鲁棒性设计

工业场景下视觉与多传感器融合的物理级鲁棒性设计

/* 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 2:09:42 阅读更多 →
支持向量机原理详解:从最大间隔到核函数与Python实现

支持向量机原理详解:从最大间隔到核函数与Python实现

/* 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 2:09:42 阅读更多 →

最新新闻

华为ICT云赛道云存储试题解析:从存储基础到OceanStor全闪存

华为ICT云赛道云存储试题解析:从存储基础到OceanStor全闪存

简介:面向华为ICT大赛云赛道与HCIA-Storage认证考生的云存储试题资料,紧扣云存储与存储技术考点,覆盖数据类型(结构化、半结构化、非结构化)、块/文件/对象存储、云存储特点、存储网络协议(FC拓扑、CIFS交互…

2026/9/19 3:28:30 阅读更多 →
异构算力统一管理:从GPU到NPU的调度与监控实战

异构算力统一管理:从GPU到NPU的调度与监控实战

智算中心的机器越堆越多,但真正让平台团队头疼的往往不是买卡,而是怎么把手里这些不同品牌、不同架构的GPU和NPU管起来用起来。如果你也在做类似的事,或者正准备搭一套异构算力管理平台,这篇内容应该能帮你少走不少弯路。我从一个…

2026/9/19 3:28:30 阅读更多 →
Hasura Event Triggers 实战:用 AWS Lambda(Python)在数据变更时自动写入修订历史

Hasura Event Triggers 实战:用 AWS Lambda(Python)在数据变更时自动写入修订历史

Hasura Event Triggers 实战:用 AWS Lambda(Python)在数据变更时自动写入修订历史 【免费下载链接】graphql-engine Blazing fast, instant realtime GraphQL APIs on all your data with fine grained access control, also trigger webhook…

2026/9/19 3:28:30 阅读更多 →
考研复试准备18天复盘:从信息搜集到面试模拟的高效冲刺策略

考研复试准备18天复盘:从信息搜集到面试模拟的高效冲刺策略

今天是DHU复试准备的第18天,距离最终走进考场还有一周左右的时间。按惯例,这个节点该停一停,做一次阶段性的梳理。与其说是"复盘",不如说是把18天来踩过的坑、确认过的信息、摸索出来的有效方法摊开来看一看&#xff0c…

2026/9/19 3:28:30 阅读更多 →
oh-my-zsh wakeonlan 插件使用指南:用 `wake` 命令远程唤醒局域网设备

oh-my-zsh wakeonlan 插件使用指南:用 `wake` 命令远程唤醒局域网设备

CLI开发工具插件系统 【免费下载链接】ohmyzsh 🙃 A delightful community-driven (with 2,500 contributors) framework for managing your zsh configuration. Includes 300 optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc…

2026/9/19 3:28:30 阅读更多 →
YOLOv8本地部署全流程:Anaconda、PyCharm、CUDA与PyTorch环境配置避坑指南

YOLOv8本地部署全流程:Anaconda、PyCharm、CUDA与PyTorch环境配置避坑指南

但凡亲手做过一次YOLOv8本地部署的人,应该都会同意一件事:YOLOv8本身一点都不难,难的是环境。模型说白了就是一个Python包,一条pip install ultralytics就能装完。但在这条命令之前的Python版本管理、PyTorch安装、CUDA和显卡驱动…

2026/9/19 3:27:30 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →