layui 首个版本发布于 2016 年,layui 官网于 2021年10月13日 下线。新版下载、文档和示例在内的所有框架日常维护工作,全部迁移到 Github 和 Gitee。
对于 产品的下架呢? 也感到有些莫名的伤感,虽然刚开始用的时候会经常性的吐槽。但是呢————是吧?
不管咋样吧,感恩作者这几年的付出(鞠躬.gif)

开始进入正题哈

安装

  1. 官网 官网 官方文档镜像链接
  2. Git 仓库下载 Git 链接
  3. github github 链接
  4. npm
  5. CDN

layui 有 CSS、JS、组件库,文件间相互关联,所以建议使用本地文件包,而非使用 bootCDN。 在测试项目或练习中使用 layui.all.js 来使用所有内置模块。上线项目则推荐使用 layui.js 根据需求引入指定模块

引入 【layui.js】 文件支持的语法与引入 【layui.all.js】 文件支持的语法略有不同

layui.js 需要先“引入”再支持功能: layui.use(‘layer’, function () { // layui.use(模块名称,回调) layui.layer.msg(222); });
不支持: layui.layer.msg(111); 而使用 layui.all.js 两种语法都支持

起步

引入了样式文件和脚本文件以后就可以从官网组件开始了。

  1. <head>
  2. ...
  3. <link rel="stylesheet" href="./layui/css/layui.css">
  4. </head>
  5. <body>
  6. <script src="./layui/layui.all.js"></script>
  7. </body>

样式起步从按钮开始

拷贝示例代码,并挂类(跟 bootstrap 不能说一毛一样,只能说毫无差别。 狗头.jpg)
Layui 搭建 - 图1

模块化使用方式

Layui 搭建 - 图2
与引入了 jQuery 文件就拥有 jQuery($)核心对象一样,引入了 layui 的 js 文件就有 layui 核心对象。
layui.use() 方法就表示使用模块。
假设当前引入的是 layui.js 那么在使用模块时,就要先.use( ) 表示使用某个模块:

  1. layui.use('mod',function(){
  2. // 具体代码
  3. });

弹出层 layer

  1. layui.use('layer', function(){
  2. var layer = layui.layer;
  3. layer.msg('hello');
  4. });
  5. // 等同于一个链式操作
  6. layui.use('layer', function () {
  7. layui.layer.msg('Hello world');
  8. });

Layui 搭建 - 图3
layui 内置了 jQuery,就可以直接使用 jQuery 语法获取到某个元素节点

  1. const $ = layui.$;
  2. $('#btn').click(function{}); // 可以使用 jquery 的方法了

结合一下点击事件 + 弹出层:

  1. const $ = layui.$;
  2. $('#btn').click(function () {
  3. layui.use('layer', function () {
  4. layui.layer.msg(111);
  5. });
  6. });

日期与时间 laydate

  1. layui.use('laydate', function () {
  2. layui.laydate.render({
  3. elem: '#testLaydate', // 绑定到某一个元素,这里是一个 input 框
  4. });
  5. });

快速搭建一个后台管理系统

一个后台管理系统的布局通常长这样:
Layui 搭建 - 图4
在官方文档【布局】-【管理系统界面布局】- 【预览布局效果】- 【查看该布局代码】有完整代码可供快速搭建网页结构:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  6. <title>layout 管理系统大布局 - Layui</title>
  7. <link rel="stylesheet" href="./layui/css/layui.css">
  8. </head>
  9. <body>
  10. <div class="layui-layout layui-layout-admin">
  11. <div class="layui-header">
  12. <div class="layui-logo layui-hide-xs layui-bg-black">layout demo</div>
  13. <!-- 头部区域(可配合layui 已有的水平导航) -->
  14. <ul class="layui-nav layui-layout-left">
  15. <!-- 移动端显示 -->
  16. <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
  17. <i class="layui-icon layui-icon-spread-left"></i>
  18. </li>
  19. <li class="layui-nav-item layui-hide-xs"><a href="">nav 1</a></li>
  20. <li class="layui-nav-item layui-hide-xs"><a href="">nav 2</a></li>
  21. <li class="layui-nav-item layui-hide-xs"><a href="">nav 3</a></li>
  22. <li class="layui-nav-item">
  23. <a href="javascript:;">nav groups</a>
  24. <dl class="layui-nav-child">
  25. <dd><a href="">menu 11</a></dd>
  26. <dd><a href="">menu 22</a></dd>
  27. <dd><a href="">menu 33</a></dd>
  28. </dl>
  29. </li>
  30. </ul>
  31. <ul class="layui-nav layui-layout-right">
  32. <li class="layui-nav-item layui-hide layui-show-md-inline-block">
  33. <a href="javascript:;">
  34. <img src="http://tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
  35. class="layui-nav-img">
  36. tester
  37. </a>
  38. <dl class="layui-nav-child">
  39. <dd><a href="">Your Profile</a></dd>
  40. <dd><a href="">Settings</a></dd>
  41. <dd><a href="">Sign out</a></dd>
  42. </dl>
  43. </li>
  44. <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
  45. <a href="javascript:;">
  46. <i class="layui-icon layui-icon-more-vertical"></i>
  47. </a>
  48. </li>
  49. </ul>
  50. </div>
  51. <div class="layui-side layui-bg-black">
  52. <div class="layui-side-scroll">
  53. <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
  54. <ul class="layui-nav layui-nav-tree" lay-filter="test">
  55. <li class="layui-nav-item layui-nav-itemed">
  56. <a class="" href="javascript:;">menu group 1</a>
  57. <dl class="layui-nav-child">
  58. <dd><a href="javascript:;">menu 1</a></dd>
  59. <dd><a href="javascript:;">menu 2</a></dd>
  60. <dd><a href="javascript:;">menu 3</a></dd>
  61. <dd><a href="">the links</a></dd>
  62. </dl>
  63. </li>
  64. <li class="layui-nav-item">
  65. <a href="javascript:;">menu group 2</a>
  66. <dl class="layui-nav-child">
  67. <dd><a href="javascript:;">list 1</a></dd>
  68. <dd><a href="javascript:;">list 2</a></dd>
  69. <dd><a href="">超链接</a></dd>
  70. </dl>
  71. </li>
  72. <li class="layui-nav-item"><a href="javascript:;">click menu item</a></li>
  73. <li class="layui-nav-item"><a href="">the links</a></li>
  74. </ul>
  75. </div>
  76. </div>
  77. <div class="layui-body">
  78. <!-- 内容主体区域 -->
  79. <div style="padding: 15px;">内容主体区域。记得修改 layui.css js 的路径</div>
  80. </div>
  81. <div class="layui-footer">
  82. <!-- 底部固定区域 -->
  83. 底部固定区域
  84. </div>
  85. </div>
  86. <script src="./layui/layui.js"></script>
  87. <script>
  88. layui.use(['element', 'layer', 'util'], function () {
  89. var element = layui.element,
  90. layer = layui.layer,
  91. util = layui.util,
  92. $ = layui.$;
  93. //头部事件
  94. util.event('lay-header-event', {
  95. //左侧菜单事件
  96. menuLeft: function (othis) {
  97. layer.msg('展开左侧菜单的操作', { icon: 0 });
  98. },
  99. menuRight: function () {
  100. layer.open({
  101. type: 1,
  102. content: '<div style="padding: 15px;">处理右侧面板的操作</div>',
  103. area: ['260px', '100%'],
  104. offset: 'rt', //右上角
  105. anim: 5,
  106. shadeClose: true
  107. });
  108. }
  109. });
  110. });
  111. </script>
  112. </body>
  113. </html>

在官方布局基础上,修改了一些符合我们需要的部分:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  6. <title>layout 管理系统大布局 - Layui</title>
  7. <link rel="stylesheet" href="./layui/css/layui.css">
  8. </head>
  9. <body>
  10. <div class="layui-layout layui-layout-admin">
  11. <!-- 头部导航 -->
  12. <div class="layui-header layui-bg-cyan">
  13. <div class="layui-logo ">一个学生管理系统</div>
  14. <!-- 头部区域(可配合layui 已有的水平导航) -->
  15. <ul class="layui-nav layui-layout-left">
  16. <li class="layui-nav-item layui-hide-xs"><a href="">商品管理</a></li>
  17. <li class="layui-nav-item">
  18. <a href="javascript:;">其他内容</a>
  19. <dl class="layui-nav-child">
  20. <dd><a href="">其他内容1</a></dd>
  21. <dd><a href="">其他内容2</a></dd>
  22. <dd><a href="">其他内容3</a></dd>
  23. </dl>
  24. </li>
  25. </ul>
  26. <ul class="layui-nav layui-layout-right">
  27. <li class="layui-nav-item layui-hide layui-show-md-inline-block">
  28. <a href="javascript:;">
  29. <img src="http://tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg" class="layui-nav-img">
  30. admin
  31. </a>
  32. <dl class="layui-nav-child">
  33. <dd><a href="">退出登录</a></dd>
  34. </dl>
  35. </li>
  36. </ul>
  37. </div>
  38. <!-- 左侧菜单 -->
  39. <div class="layui-side layui-bg-cyan">
  40. <div class="layui-side-scroll">
  41. <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
  42. <ul class="layui-nav layui-nav-tree layui-bg-cyan" lay-filter="test">
  43. <li class="layui-nav-item layui-nav-itemed">
  44. <a class="" href="javascript:;">学生模块</a>
  45. <dl class="layui-nav-child">
  46. <dd><a href="javascript:;">学生管理</a></dd>
  47. <dd><a href="javascript:;">班级学生</a></dd>
  48. <dd><a href="javascript:;">课程学生</a></dd>
  49. </dl>
  50. </li>
  51. <li class="layui-nav-item">
  52. <a href="javascript:;">退换货记录</a>
  53. <dl class="layui-nav-child">
  54. <dd><a href="javascript:;">退货记录</a></dd>
  55. <dd><a href="javascript:;">换货记录</a></dd>
  56. </dl>
  57. </li>
  58. <li class="layui-nav-item"><a href="javascript:;">库存清点</a></li>
  59. <li class="layui-nav-item"><a href="javascript:;">商品发布</a></li>
  60. </ul>
  61. </div>
  62. </div>
  63. <!-- 右侧内容主体 -->
  64. <div class="layui-body">
  65. <!-- 内容主体区域 -->
  66. <div style="padding: 15px;">内容主体区域</div>
  67. </div>
  68. <!-- 底部固定区域 -->
  69. <div class="layui-footer layui-word-aux">&copy; 哼,总有人想剽窃我的智慧</div>
  70. </div>
  71. <script src="./layui/layui.all.js"></script>
  72. <script>
  73. layui.use(['element', 'layer', 'util'], function () {
  74. var element = layui.element,
  75. layer = layui.layer,
  76. util = layui.util,
  77. $ = layui.$;
  78. //头部事件
  79. util.event('lay-header-event', {
  80. //左侧菜单事件
  81. menuLeft: function (othis) {
  82. layer.msg('展开左侧菜单的操作', { icon: 0 });
  83. },
  84. menuRight: function () {
  85. layer.open({
  86. type: 1,
  87. content: '<div style="padding: 15px;">处理右侧面板的操作</div>',
  88. area: ['260px', '100%'],
  89. offset: 'rt', //右上角
  90. anim: 5,
  91. shadeClose: true
  92. });
  93. }
  94. });
  95. });
  96. </script>
  97. </body>
  98. </html>

显示的主题颜色从 black 变成了 cyan。
Layui 搭建 - 图5
你还可以写成彩色,只要你愿意》
Layui 搭建 - 图6

表格和分页

文档跑 这一页 来了,layui 最牛*的就是把表格的分页和排序功能内置了!
那么既然要显示表格,那么 student.html 里自然就该出现 table 标签了。再依照文档语法、利用 mock 生成一些随机数据:

  1. <!-- 这是在 student.html -->
  2. <table lay-filter='studentList' id='studentList'></table>
  3. <!-- 引入的 mock 文件已经引在了 index.html -->
  4. <script>
  5. // 生成随机数据,内容在语雀 Mock 那一篇都有讲解
  6. let data = Mock.mock({
  7. "list|27": [{
  8. "id|+1": 1,
  9. "name": "@cname()",
  10. "age|16-22": 1,
  11. "gender|1": ["男", "女"],
  12. "score|0-100": 1,
  13. "address": "@county(true)",
  14. "phoneNumber": /^1[3458]\d{9}$/
  15. }]
  16. });
  17. layui.table.render({
  18. elem: '#studentList', // 绑定节点
  19. data: data.list, // value 为一个 array,数据从 mock 来
  20. page: true, //开启分页
  21. cols: [[ //表头
  22. { field: 'id', title: '学号', sort: true, fixed: 'left' },
  23. { field: 'name', title: '姓名' },
  24. { field: 'age', title: '年龄', sort: true },
  25. { field: 'gender', title: '性别', sort: true },
  26. { field: 'score', title: '成绩', sort: true },
  27. { field: 'address', title: '城市', width: 300, },
  28. { field: 'phoneNumber', title: '电话号码', sort: true },
  29. ]]
  30. });
  31. </script>

Layui 搭建 - 图7

Layui 搭建 - 图8

大概内容就这些,有些我也没有搞明白,反正layui 很强大。喜欢 的可以深入的研究研究.

更新一个小提示

看看官网里的这句话,或许在某些地方~能帮你大忙
Layui 搭建 - 图9