layui table表格组件 toolbar操作栏自适应宽度

layui table表格组件 toolbar操作栏自适应宽度

最近在使用Layui时发现table数据表格组件的toolbar操作栏不支持自适应宽度功能,于是上网查询了一些资料,发现相关文章很少,有几篇的写法是根据列ID来进行操作的,兼容性太低,于是决定自己实现。

效果

我们先看一下table组件的默认效果:
在这里插入图片描述
可以看到在按钮没有全部显示的情况下,右侧预留了很多空白位置,非常不美观。
再看一下我们实现自适应宽度后的效果:

在这里插入图片描述
在这里插入图片描述

可以看到,优化后列宽为本页数据需要使用的最大宽度,在某些情况下可省去很多位置。

好,效果看完了,我们接下来看下如何实现。


实现

首先我们的toolbar操作栏需要设置一个默认的宽度(width参数),需要大于你所有按钮的宽度总和。
注意需要使用unresize: true 来禁止用户通过拖拽更改列宽
代码如下:

{fixed: 'right', title: '操作', toolbar: '#actionBar', unresize: true, width: 260}

然后利用table组件的done函数来执行我们的自适应宽度逻辑:
代码如下:

done: function (res, curr, count) {
	let maxWidth = 0;
	let fixedRight = $(".layui-table-fixed-r");

	//移除thead中原先的宽度样式
	fixedRight
		.children(".layui-table-header")
		.children("table")
		.children("thead")
		.children("tr")
			.each(function () {
				$(this).children("th").children("div").removeClass();
				$(this).children("th").children("div").addClass("layui-table-cell");
			});
	
	//移除tbody中原先的宽度样式,并计算出最后所需宽度
	fixedRight
		.children(".layui-table-body")
		.children("table")
		.children("tbody")
		.children("tr")
		.each(function () {
			$(this).children("td").children("div").removeClass();
			$(this).children("td").children("div").addClass("layui-table-cell");
			maxWidth = $(this).width() - 30;
		});

	//修改thead中该列各单元格的宽度
	fixedRight
		.children(".layui-table-header")
		.children("table")
		.children("thead")
		.children("tr")
		.each(function () {
			$(this).children("th").children("div").width(maxWidth);
		});
	//修改tbody中该列各单元格的宽度
	fixedRight
		.children(".layui-table-body")
		.children("table")
		.children("tbody")
		.children("tr")
		.each(function () {
			$(this).children("td").children("div").width(maxWidth);
		});

	//由于layui的table组件中 浮动并不是单个单元格真浮动,而是实际上是新加了一个浮动对象覆盖在原先的单元格上,所以如果不写如下代码,会造成被覆盖的那一层单元格没有被完全覆盖的bug
	$(".layui-table-box .layui-table-header")
		.children("table")
		.children("thead")
		.children("tr")
		.each(function () {
			$(this).children("th:last").children("div").width(maxWidth);
		});
	$(".layui-table-box .layui-table-main")
		.children("table")
		.children("tbody")
		.children("tr")
		.each(function () {
			$(this).children("td:last").children("div").width(maxWidth);
		});
}

复制上述代码至你的项目中,基本不需要任何改动即可实现操作栏自适应宽度的效果。

备注

maxWidth = $(this).width() - 30; 

其中这句代码中的 -30 是我测试后最好的一个修正值,当然,你的使用环境可能跟我的有所不同,如果需要进行一些修正,修改此值即可。

如果有更好的实现方式或该方法有任何的问题欢迎评论留言。

后记

在不同的使用环境中可能会出现一些奇怪的问题,后来的小伙伴可以查看评论区提供的解决方法。

1. 影响左边固定列的数据展示,将

$(".layui-table-box .layui-table-header")

替换为

$(".layui-table-box>.layui-table-header")
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要在layui table表格中实现导出操作,需要使用第三方插件,如tableX、tableExport等。这里以tableX为例,具体实现步骤如下: 1. 引入tableX插件和相关依赖文件 ```html <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.1.5/jszip.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/js-xlsx/0.8.0/xlsx.full.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/blobjs/1.1.1/Blob.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/TableExport/5.2.0/js/tableexport.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/tableExport.jquery.plugin/1.0.3/js/tableExport.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/table-x/1.0.2/js/table-x.min.js"></script> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/table-x/1.0.2/css/table-x.min.css"> ``` 2. 在table的初始化配置中添加导出按钮 ```javascript table.render({ elem: '#demo', url: '/data', cols: [[ {field: 'id', title: 'ID', width: 80}, {field: 'username', title: '用户名', width: 120}, {field: 'email', title: '邮箱', minWidth: 200}, {field: 'sex', title: '性别', width: 80, sort: true}, {field: 'city', title: '城市', width: 100}, {field: 'sign', title: '签名', minWidth: 200}, {field: 'experience', title: '积分', width: 80, sort: true}, {field: 'score', title: '评分', width: 80, sort: true}, {field: 'classify', title: '职业', width: 100}, {field: 'wealth', title: '财富', width: 135, sort: true}, ]], page: true, toolbar: 'default', //开启头部工具,并为其绑定左侧模板 defaultToolbar: ['exports', 'print', 'filter'], //自定义头部工具右侧图标。如无需自定义,去除该参数即可 done: function(res, curr, count) { tableExport.render({ elem: '#demo', filename: '数据列表', sheetName: 'Sheet1', type: 'xlsx', title: '数据列表', page: true, style: 'border: 1px solid #ddd;text-align: center;' }); } }); ``` 其中,toolbar配置项开启头部工具,并为其绑定左侧模板;defaultToolbar配置项自定义头部工具右侧图标,其中'exports'表示导出按钮。 3. 实现导出功能 ```javascript tableExport.render({ elem: '#demo', filename: '数据列表', sheetName: 'Sheet1', type: 'xlsx', title: '数据列表', page: true, style: 'border: 1px solid #ddd;text-align: center;' }); ``` 其中,elem表示要导出的table元素的选择器,filename表示导出文件名,sheetName表示导出文件的sheet名称,type表示导出文件类型,title表示导出文件的标题,page表示是否导出分页,style表示导出文件的样式。 4. 完整代码 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>layui表格导出操作</title> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.1.5/jszip.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/js-xlsx/0.8.0/xlsx.full.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/blobjs/1.1.1/Blob.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/TableExport/5.2.0/js/tableexport.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/tableExport.jquery.plugin/1.0.3/js/tableExport.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/table-x/1.0.2/js/table-x.min.js"></script> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/table-x/1.0.2/css/table-x.min.css"> </head> <body> <table id="demo" lay-filter="test"></table> <script> layui.use(['table', 'tableExport'], function() { var table = layui.table; var tableExport = layui.tableExport; table.render({ elem: '#demo', url: '/data', cols: [[ {field: 'id', title: 'ID', width: 80}, {field: 'username', title: '用户名', width: 120}, {field: 'email', title: '邮箱', minWidth: 200}, {field: 'sex', title: '性别', width: 80, sort: true}, {field: 'city', title: '城市', width: 100}, {field: 'sign', title: '签名', minWidth: 200}, {field: 'experience', title: '积分', width: 80, sort: true}, {field: 'score', title: '评分', width: 80, sort: true}, {field: 'classify', title: '职业', width: 100}, {field: 'wealth', title: '财富', width: 135, sort: true}, ]], page: true, toolbar: 'default', defaultToolbar: ['exports', 'print', 'filter'], done: function(res, curr, count) { tableExport.render({ elem: '#demo', filename: '数据列表', sheetName: 'Sheet1', type: 'xlsx', title: '数据列表', page: true, style: 'border: 1px solid #ddd;text-align: center;' }); } }); }); </script> </body> </html> ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无枫丶

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值