侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

数据表格自动分配列宽的一种实现方法

技术  /  管理员 发布于 7年前   468

layui数据表格自动分配列宽效果图:

1.gif适用场景:
主要是解决窗口大小改变后表格尾列出现空白和滚动条的问题
-窗口由小变大,出现表格尾列出现空白

1.jpg窗口由大变小,出现横向滚动条

2.jpg重新加载框架后恢复正常

3.jpg使用前提:

-每一列的表头必须全部设置minWidth(依靠minWidth属性进行的判断)

-自己中间使用的<iframe>,其他方式效果未知

-页面只能有一个数据表格,多个数据表格的话需要自己修改代码(表格的判断,列数的获取等)

具体步骤:

-监听窗口大小改变事件

var resizeTimer;    $(window).resize(function () {        if (resizeTimer) {clearTimeout(resizeTimer);        }        resizeTimer = setTimeout(function () {resizeTimer = null;dstributionColumnWidth();        }, 200);    });/*经过测试发现,当窗口大小改变之后,这个方法会调用多次所以需要使用clearTimeout方法取消由 setTimeout() 方法设置的 timeout也就是说每一次调用后200毫秒内的下一次调用都会取消上一次的调用这样可以大概率保证最终只执行一次如果还是不行就把200调大点比如500当然值越小,给人的感觉越流畅*/

获取表格的宽度、列数、求出平均列宽

// 表格宽度var tabWidth = $(".layui-table-header").width();// 列数var colNum = $("tr").eq(0).find("th").length;// 平均列宽var avgWidth = tabWidth / colNum;/*求宽度和列宽的方式比较简单,也不知道有没有通用性(水平所限),自己使用没有问题,如果大家拿不到值的话就根据自己的情况写代码拿到相应的值就行了,当然要是有更好更优雅的方法也一定要留言告诉我*/

获取每一列的data-field和data-minwidth属性的值并封装为对象,并按照data-minwidth的值由大到小排序

/**     * 列对象     * @param index 所在列在当前行中的索引位置(没用上可以不要)     * @param name 对应表头中设置的field     * @param minWidth 对象表头中的minWidth     * @param width 最终的宽度     * @constructor     */    function Column(index, name, minWidth, width) {        this.index = index;        this.name = name;        this.minWidth = minWidth;        this.width = width;    }// 获取参数封装对象if (cols === undefined) {cols = $("tr").eq(0).find("th").map(function (index, item) {    var col = new Column(index, $(this).attr("data-field"), $(this).attr("data-minwidth"));    return col;});// 排序cols.sort(function (a, b) {    return b["minWidth"] - a["minWidth"];});        }/**     * 计算列宽     * @param columns column对象数组     * @param colNum 列数     * @param tabWidth 表格宽度     * @param avgWidth 平均宽度     */    function calculateColumnWidth(columns, colNum, tabWidth, avgWidth) {        // 是否显示表格横向滚动条        showOverflowX = false;        // 是否完成比较        var isComplete = false;        for (var i = 0; i < columns.length; i++) {var column = columns[i];// 如果计算出的平均列宽比最大的minWidth还要大,那么剩下的就不用比较了,直接赋值即可if (column["minWidth"] <= avgWidth || isComplete) {    column["width"] = parseInt(avgWidth);    isComplete = true;} else {   /*    如果minWidth > 平均列宽,那么就用表格宽度减去minWidth    然后除以列数-1,重新求平均列宽    */    column["width"] = column["minWidth"];    tabWidth -= column["minWidth"];    colNum -= 1;    avgWidth = tabWidth / colNum;    // 如果最后一列时,平均列宽大于最小列宽,说明当前页面的宽度足够显示表格,就可以隐藏横向滚动条,反之则需要显示滚动条    if (i == columns.length - 1) {        showOverflowX = true;    }}        }    }

设置单元格宽度、设置滚动条

// 这里是根据名称查找相应的th、td标签,可能有更好的方法,欢迎留言for (var i = 0; i < cols.length; i++) {       var col = cols[i];       var width = cols[i].width;       $("[data-field='" + cols[i]["name"] + "']").each(function () {   // 实际修改的是th、td下的div标签   // 我使用的是动画的方式,也可以选择直接赋值   $(this).children().eq(0).animate({width: width}, 200);        }) }// 根据showOverflowX的值判断是否需要显示滚动条if (showOverflowX) {     $('.layui-table-body').css({"overflow-x": "auto"});} else {     $('.layui-table-body').css({"overflow-x": "hidden"});}

完成!
完整代码

var cols, showOverflowX;    /**     * 列对象     * @param index 所在列在当前行中的索引位置(没用上可以不要)     * @param name 对应表头中设置的field     * @param minWidth 对象表头中的minWidth     * @param width 最终的宽度     * @constructor     */    function Column(index, name, minWidth, width) {        this.index = index;        this.name = name;        this.minWidth = minWidth;        this.width = width;    }    /**     * 计算列宽     * @param columns column对象数组     * @param colNum 列数     * @param tabWidth 表格宽度     * @param avgWidth 平均宽度     */    function calculateColumnWidth(columns, colNum, tabWidth, avgWidth) {        showOverflowX = false;        var isComplete = false;        for (var i = 0; i < columns.length; i++) {var column = columns[i];if (column["minWidth"] <= avgWidth || isComplete) {    column["width"] = parseInt(avgWidth);    isComplete = true;} else {    column["width"] = column["minWidth"];    tabWidth -= column["minWidth"];    colNum -= 1;    avgWidth = tabWidth / colNum;    if (i == columns.length - 1) {        showOverflowX = true;    }}        }    }    /**     * 分配列宽     */    function dstributionColumnWidth() {        // 表格宽度        var tabWidth = $(".layui-table-header").width();        // 列数        var colNum = $("tr").eq(0).find("th").length;        // 平均列宽        var avgWidth = tabWidth / colNum;        if (cols === undefined) {cols = $("tr").eq(0).find("th").map(function (index, item) {    var col = new Column(index, $(this).attr("data-field"), $(this).attr("data-minwidth"));    return col;});cols.sort(function (a, b) {    return b["minWidth"] - a["minWidth"];});        }        calculateColumnWidth(cols, colNum, tabWidth, avgWidth);        for (var i = 0; i < cols.length; i++) {var col = cols[i];var width = cols[i].width;$("[data-field='" + cols[i]["name"] + "']").each(function () {    $(this).children().eq(0).animate({width: width}, 200);})        }        if (showOverflowX) {$('.layui-table-body').css({"overflow-x": "auto"});        } else {$('.layui-table-body').css({"overflow-x": "hidden"});        }    }    var resizeTimer;    $(window).resize(function () {        if (resizeTimer) {clearTimeout(resizeTimer);        }        resizeTimer = setTimeout(function () {resizeTimer = null;dstributionColumnWidth();        }, 200);    });

使用方法

layui.config({    // 放到这个目录里    base: '/static/js/extend/'}).extend({formSelects: 'formSelects-v4.min'});  // 这里layui.use(['table', 'element', 'layer', 'jquery', 'form', 'formSelects', 'tools', 'autoColumnWidth'], function () {    var table = layui.table,        element = layui.element,        layer = layui.layer,        $ = layui.$,        form = layui.form,        formSelects = layui.formSelects,        tools = layui.tools,        // 这里        autoColumnWidth = layui.autoColumnWidth;

然后在需要的地方直接调用

autoColumnWidth.resize();

ps:窗口大小监听代码还是要自己写的

想要数据表格加载之后就分配列宽可以写在done的回调里

done: function () {      autoColumnWidth.resize();}

推荐:layui使用教程

以上就是数据表格自动分配列宽的一种实现方法的详细内容,更多请关注其它相关文章!


  • 上一条:
    layDate新增日期多选和销毁方法详细介绍
    下一条:
    表格工具按钮列显示更多时也能触发table的事件
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客