前端组件库 ——LayUI 知识点大全(四)

简介: 教程来源 https://zlpow.cn LayUI 2.8+/3.0 支持 CSS 变量主题定制、深浅色切换;提供移动端专用版本;支持按需引入与模块化加载;可开发自定义模块及集成 ECharts 等第三方插件,兼顾简洁性与扩展性,适合快速构建后台系统。

六、扩展与定制

6.1 主题定制 - 使用 CSS 变量(新版特性)
很多开发者希望修改 LayUI 的默认主题色来匹配品牌风格。在 LayUI 2.8 及 3.0 版本中,官方添加了 CSS 变量支持,使得重置主题变得非常简单,无需再通过复杂的 Less 变量编译。

核心 CSS 变量列表:
image.png
在项目中定制主题:

/* 在全局样式表中覆盖 CSS 变量 */
:root {
  --lay-color-primary: #4c6ef5;      /* 修改主色为靛蓝 */
  --lay-color-accent: #fa5252;        /* 修改强调色为红色 */
  --lay-border-radius: 8px;           /* 增大圆角 */
  --lay-font-family: "Inter", system-ui, sans-serif;
}

实现深色/浅色主题切换:

/* 定义两套主题变量 */
:root {
  --lay-bg-color: #ffffff;
  --lay-text-color: #333333;
  --lay-border-color: #e9ecef;
}

:root.dark {
  --lay-bg-color: #1a1a1a;
  --lay-text-color: #e0e0e0;
  --lay-border-color: #2c2c2c;
}

配合 JavaScript 动态切换:

// 切换主题函数
function toggleTheme() {
  if (document.documentElement.classList.contains('dark')) {
    document.documentElement.classList.remove('dark');
    localStorage.setItem('layui-theme', 'light');
  } else {
    document.documentElement.classList.add('dark');
    localStorage.setItem('layui-theme', 'dark');
  }
}

// 页面加载时恢复用户选择的主题
const savedTheme = localStorage.getItem('layui-theme');
if (savedTheme === 'dark') {
  document.documentElement.classList.add('dark');
}

6.2 移动端适配
LayUI 提供了专门的移动端(Mobile)版本,针对手机和平板设备进行了优化。移动端版本的核心区别如下:
image.png
移动端页面基础模板:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>移动端 LayUI 示例</title>
  <link rel="stylesheet" href="/path/to/layui/css/layui.mobile.css">
</head>
<body>
  <div class="layui-container">
    <!-- 流式列表 -->
    <ul class="layui-list">
      <li class="layui-list-item">
        <div class="layui-list-img">
          <img src="avatar.jpg">
        </div>
        <div class="layui-list-text">
          <h3>标题文字</h3>
          <p>描述信息</p>
        </div>
      </li>
    </ul>
  </div>

  <!-- 底部 Tabbar 导航栏 -->
  <div class="layui-tabbar">
    <ul class="layui-tabbar-list">
      <li class="layui-tabbar-item layui-this">
        <i class="layui-icon layui-icon-home"></i>
        <span>首页</span>
      </li>
      <li class="layui-tabbar-item">
        <i class="layui-icon layui-icon-find-fill"></i>
        <span>发现</span>
      </li>
      <li class="layui-tabbar-item">
        <i class="layui-icon layui-icon-user"></i>
        <span>我的</span>
      </li>
    </ul>
  </div>

  <script src="/path/to/layui/layui.js"></script>
</body>
</html>

6.3 按需引入组件
LayUI 默认加载 layui.all.js 会包含所有内置模块,但这种方式会增加初始加载体积。对于对性能要求较高的项目,推荐按需引入:

// 方式一:配置模块路径并按需加载
layui.config({
  base: '/static/js/modules/',   // 自定义模块存放路径
  version: true                   // 开启版本控制,避免缓存
}).use(['layer', 'form', 'table'], function(){
  var layer = layui.layer;
  var form = layui.form;
  var table = layui.table;
  // 业务代码...
});

// 方式二:通过 extend 方法扩展自定义模块
layui.extend({
  admin: '{/}/static/js/admin'    // 扩展 admin 模块
}).use(['admin', 'layer'], function(){
  var admin = layui.admin;
  var layer = layui.layer;
  // 使用扩展模块
});

使用 Vite 或 Webpack 按需打包(高级用法):

// 在支持 tree-shaking 的构建工具中,可以只导入需要的组件
import layui from 'layui-src';
import 'layui-src/css/layui.css';

// 动态加载模块
layui.use(['layer', 'form'], () => {
  // ...
});

6.4 自定义模块开发完整指南
LayUI 允许开发者使用 layui.define() 方法定义自己的模块,这对于封装复用的业务组件非常有用。以下是一个完整的自定义模块开发示例:

步骤一:定义模块

// modules/userManager.js
layui.define(['layer', 'form', 'upload'], function(exports){
  var layer = layui.layer;
  var form = layui.form;
  var upload = layui.upload;

  // 私有变量和方法
  var apiBaseUrl = '/api/user';
  var currentUser = null;

  function fetchUserList(callback) {
    $.get(apiBaseUrl + '/list', function(res){
      callback(res.data);
    });
  }

  function showUserDetail(userId) {
    $.get(apiBaseUrl + '/' + userId, function(user){
      layer.open({
        type: 1,
        title: '用户详情',
        content: `
          <div style="padding: 20px;">
            <p>姓名:${user.name}</p>
            <p>邮箱:${user.email}</p>
            <p>角色:${user.role}</p>
          </div>
        `,
        area: ['400px', '300px']
      });
    });
  }

  // 公开 API
  var api = {
    // 获取用户列表
    getList: function(callback) {
      fetchUserList(callback);
    },
    // 显示用户详情
    showDetail: function(userId) {
      showUserDetail(userId);
    },
    // 打开新增用户弹窗
    openAddDialog: function(callback) {
      layer.open({
        type: 2,
        title: '新增用户',
        content: '/page/user/add',
        area: ['600px', '500px'],
        end: function() {
          if (callback) callback();
        }
      });
    },
    // 删除用户
    deleteUser: function(userId, successCallback) {
      layer.confirm('确定删除该用户吗?', {
        icon: 3,
        title: '提示'
      }, function(index){
        layer.close(index);
        $.ajax({
          url: apiBaseUrl + '/' + userId,
          type: 'DELETE',
          success: function(){
            layer.msg('删除成功');
            if (successCallback) successCallback();
          }
        });
      });
    }
  };

  // 输出模块接口
  exports('userManager', api);
});

步骤二:在页面中使用自定义模块

<script>
layui.config({
  base: '/static/js/modules/'    // 设置自定义模块的根目录
}).use(['userManager', 'table'], function(){
  var userManager = layui.userManager;
  var table = layui.table;

  // 使用自定义模块的方法
  userManager.getList(function(users){
    console.log('用户列表:', users);
  });

  // 删除用户
  userManager.deleteUser(123, function(){
    table.reload('userTable');
  });
});
</script>

6.5 第三方插件集成
LayUI 的模块化设计使得集成第三方插件变得非常简单。以下是一些常见的集成场景:

集成 ECharts:

// 1. 引入 ECharts CDN
// 2. 在 LayUI 中使用
layui.use(['element'], function(){
  var element = layui.element;

  // 初始化 ECharts 图表
  var myChart = echarts.init(document.getElementById('chart'));
  myChart.setOption({
    title: { text: '数据趋势' },
    xAxis: { data: ['Mon', 'Tue', 'Wed'] },
    yAxis: {},
    series: [{ type: 'line', data: [120, 200, 150] }]
  });
});

封装 ECharts 为 LayUI 模块:

// modules/echarts.js
layui.define(function(exports){
  var echarts = window.echarts;
  if (!echarts) {
    console.error('请先引入 ECharts 库');
    return;
  }

  var api = {
    init: function(domId, option) {
      var dom = document.getElementById(domId);
      if (!dom) return null;
      var chart = echarts.init(dom);
      chart.setOption(option);
      return chart;
    },
    resize: function(chart) {
      chart && chart.resize();
    }
  };

  exports('echarts', api);
});

// 使用封装后的模块
layui.use(['echarts'], function(){
  var echarts = layui.echarts;
  var chart = echarts.init('chartBox', {
    xAxis: { data: ['A', 'B', 'C'] },
    yAxis: {},
    series: [{ type: 'bar', data: [10, 20, 30] }]
  });
});

总结
LayUI 以其极低的学习门槛、丰富的组件库和独特的模块化设计,在广大后端开发者及中小型项目团队中占据了独特的地位。虽然在前端工程化大行其道的今天,LayUI 可能不是构建大型复杂单页面应用的首选,但它在快速构建后台管理系统、内部运营平台、传统企业官网等方面依然具有极高的效率优势。特别是随着 3.0 版本的发布,LayUI 正努力向现代化标准靠拢,试图在“返璞归真”与“紧跟时代”之间找到完美的平衡点。
来源:
https://rvtst.cn

相关文章
|
6天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23334 5
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
15天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
5329 25
|
11天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
3846 12
|
10天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
3151 10
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
27天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
21193 64
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)