固定表头、锁定前几列的代码参考[JS篇]

  引语:做有难度的事情,才是成长最快的时候。前段时间,接了一个公司的稍微大点的项目,急着赶进度,本人又没有独立带过队,因此,把自己给搞懵逼了。总是没有多余的时间来做自己想做的事,而且,经常把工作带入生活,这TM真是一个糟糕的事情!这两天,终于把项目上上去了,不管结果怎么样,总算是交差了吧。趁着这空档的时间,写点东西。

  本篇,就来写写关于固定表头和表列的事儿吧。

  相信大家使用excel的时候,肯定都会用到一项冻结的功能,冻结之后,可以让你很方便的查看到各种标题,从而能清楚的查看到当前行的内容。

  这个冻结锁定的需求,来源于页面太长,太宽。

  那么,对于网页版本的冻结锁定,是不是也有相应的功能呢?去网上搜索插件,基本上又都只是固定表头的,并不能固定前几列。不过幸好,不知道从哪里捡到一部分代码,改了一下内部代码,匆忙将功能实现,进入下一步。下面就跟大家分享一下,锁定表头、前几列的这段代码,也可以认为是个小插件,希望在你需要时,能帮上点忙!(实在没有找到作者是谁,如果你知道,请告知我,我一定加上作者姓名)

  独立源码如下:

(function($) {
    $.fn.magicTable = function(option) {
        $.fn.magicTable.option = {
            /* 浮动头部 */
            ‘magicTop‘: $(‘#J_MagicTableTop‘),
            ‘magicLeft‘: $(‘#J_MagicTableLeft‘),
            /* 可能有隐藏的,所以设定浮动头部的开始索引 */
            ‘leftIndex‘: 0,
            ‘leftFlg‘: false,
            /* 高度调整 */
            "thfix": 0,
            "thWidth": 0, //左边显示的宽度
            "thHeight": 0,
            "thTop": 0,
            "thLeft":0,
            "thLine": 0,
            "removeTotal": false
        };
        var option = $.extend({}, $.fn.magicTable.option, option);

        return this.each(function() {
            $(this).css({‘z-index‘: ‘9‘, ‘display‘: ‘‘, ‘position‘: ‘relative‘});

            /*复制活动的表格内容*/
            var leftHtml = ‘‘;
            var leftHtml2 = ‘‘;
            var leftFlg = option.leftFlg;
            var thWidth = option.thWidth;
            var thHeight = 0; //th的高度
            var thTop = option.thTop; //th距离浏览器顶部的top高度
            var thLeft = option.thLeft; //左侧未滚动时的left
            var removeTotal = option.removeTotal;//除去最后一行的汇总
            var flagLeftLength = 0; //左侧显示浮动层时的临界点

            //处理浮动的头部
            option.magicTop.html($(this).find(‘thead‘).clone()).css({
                ‘width‘: $(this).width()
            });

            var trLenght = $(this).find(‘>tbody>tr‘).length;
            if(removeTotal)
            {
                trLenght -= 1;
            }

            $(this).find(‘tr‘).each(function(i, item) {
                var maxHeight = $(this).height();
                $(this).find(‘td‘).each(function(tdI, tdItem){
                    var height = $(this).height();
                    if(height > maxHeight){
                        maxHeight = height;
                    }
                });
                if (i == option.thLine){
                    thTop = thTop > 0 ? thTop : $(this).find(‘th:first‘).offset().top;
                    thHeight = $(this).height();  //包围th的tr的高度
                    thLeft = $(this).offset().left; //表格左侧是的left
                    flagLeftLength = $(this).find(‘th:eq(‘ + option.leftIndex + ‘)‘).offset().left;
                    thWidth = flagLeftLength + $(this).find(‘th:eq(‘ + option.leftIndex + ‘)‘).outerWidth() - thLeft;
                } else if (i > option.thLine) {
                    if (leftFlg && (i <= trLenght)){
                        var tmpHtml = ‘‘;
                        for (var j = 0; j <= option.leftIndex; j++) {
                            tmpHtml += ‘<td style="height:‘ + maxHeight + ‘px;width:‘ +
                                    $(this).find(‘td:eq(‘ + j + ‘)‘).innerWidth() + ‘px">‘ + $(this).find(‘td:eq(‘ + j + ‘)‘).html() + ‘</td>‘;
                        }
                        leftHtml2 += ‘<tr>‘ + tmpHtml + ‘</tr>‘;
                    }
                    leftHtml = leftHtml + ‘<tr><td style="height:‘ + maxHeight + ‘px">‘ +
                            $(this).find(‘td:eq(‘ + option.leftIndex + ‘)‘).html() + ‘</td><tr>‘;
                }
            });

            if (leftFlg) {
                leftHtml = leftHtml2;
                option.magicLeft.html(leftHtml);
            }

            /*活动模块*/
            function moveSquare(){
                if ($(this).scrollTop() >= thTop){
                    option.magicTop.show().css({‘z-index‘: ‘999‘, ‘position‘: ‘absolute‘, ‘top‘: $(this).scrollTop() + option.thfix + ‘px‘});
                } else {
                    option.magicTop.css({‘display‘: ‘none‘});
                }

                if ($(this).scrollLeft() >= thLeft) {
                    option.magicLeft.show().css({
                        ‘z-index‘: ‘99‘,
                        ‘position‘: ‘absolute‘,
                        ‘top‘: thTop + thHeight - 1 + ‘px‘,
                        ‘left‘: $(this).scrollLeft() - 1 + ‘px‘,
                        ‘width‘: thWidth + ‘px‘,
                    });
                    if ($(this).scrollTop() >= thTop){
                        option.magicLeft.show().css({
                            ‘top‘: thTop + thHeight - option.thfix - 1 + ‘px‘
                        });
                    }
                } else {
                    option.magicLeft.css({‘display‘: ‘none‘});
                }
            }

            if (document.all) {
                window.attachEvent("onscroll", moveSquare);
            } else {
                window.addEventListener(‘scroll‘, moveSquare, false);
            }

        });
    };

    $.fn.magicTable.setDefaults = function(settings) {
        $.extend($.fn.magicTable.option, settings);
    };
})(jQuery);

  使用方法:

    1. 在表格之前,添加一个空的表格头table,在表格之后,添加一个空的表格列table,示例如下:

     <table id="J_MagicTableTop" class="table table-bordered data-list" style="display:none;"></table>
           <table class="table table-bordered data-list" id="J_MagicTable">
                    <thead>
                    <tr>
                        <th style="width:80px;">产品</th>
                        <th style="width:110px;">任务名称</th>
                        <th>操作</th>
                    </tr>
                    </thead>
                    <tbody>
                    </tbody>
           </table>
      <table id="J_MagicTableLeft" class="table table-bordered data-list magic-table-left" style="display:none;"></table>

    2. 添加js绑定事件

        if ($("#J_MagicTable").length > 0) {
            var blockHeadingHeight = $("#J_BlockHeading").outerHeight();    //用于设置最上面的间隙
            $(‘#J_MagicTable‘).magicTable({thfix: blockHeadingHeight, leftIndex: 2, leftFlg: true});
        }    

  就这样就可以实现,固定表头和前3列的效果了,还是很不错的。

  但是需要注意以下几点:

  1. 表结构一定是table > thead > th 这种结构的,表头中一定是有th这个元素的;

  2. 表头一定要加上width宽度指示,否则将出现严重错位;

  3. 即使是使用了width指示,也会出现错位情况,应该让table>tr>td 设置文字打断, word-break: break-all;

  4. 尽量不要使用colspan属性;

  原理解析:

    其实也很简单,就是利用了一个position: absolute; 起到绝对定位的作用,通过检测当前所处位置,改变他的位置。表头、表列为复制的原表格的属性,不必单独填写;

  有待改进的地方:

    我本人已经作了部分修改,但是鉴于时间关系,没有细改。待完善: 1. 不用指定表头及表列所在的空位,自行创建即可;2. 获取真实td,th的宽度,不必要全部计算设置;

  OK,以上为今天的分享,如果有什么不对的地方,欢迎批评指正。如果你有什么疑问,也可以直接@我,我会尽快回复的!

时间: 2024-10-10 23:31:51

固定表头、锁定前几列的代码参考[JS篇]的相关文章

下载不含数据EXCEL的固定表头模版(标准EXCEL只含有列头),然后上传EXCEL.显示成功和上传失败的EXCEL连接

<div id="import" runat="server" visible="false"> Step1:<asp:HyperLink ID="HyperLink1" NavigateUrl="~/CommonTemplate/设备清单模版.xlsx" runat="server">下载模版</asp:HyperLink><br />

css控制固定表头,兼容行列合并

项目中设计的报表table设计的列数相对过多,当拖动下方的滚动条时无法对应表头所对应的列,因此在网上搜索了好一段日子,最后在网上找到了一些参考资料,然后总结归纳出兼容行列合并的固定表头demo. 多浏览器没有做太多测试,在ie6中已测试通过. 功能期待了很久今天终于找到解决的方式,总结到javaeye中方便日后查阅.实现方式可能还有更好的,希望有大牛路过,给我留点更好的实现例子作日后交流之用. 以下是相关的css Html代码   <style type="text/css"&g

jQuery 关于ScrollableGridPlugin.js(固定表头)插件的逐步解析

以前写前台的时候需要用哪些效果从来都是有现成的东西拿来就用的,因为自己真的是有些懒,毫无探索精神,只重视结果,不追求过程. 这个ScrollableGridPlugin.js是从网上找到的一个具有固定表头效果的插件,使用起来灰常的简便,而且效果也是看着不错的.不过毕竟不是量身定做的,所以有的地方在自己的项目中还是要进行一点点小改动,因为实在是太喜欢这个插件了,所以第一次进到里面,看看原作者的思路和写法,然后才能知道如何去改成适合自己项目. 对于js我完全是一个非常业余的选手,下面根据自己的现状对

表格在固定表头遇到样式问题

css 样式来固定表头,首先设置两个table,这个时候就遇到了一个问题,那就是两个表格td的宽度要保持对其.这样才能做到固定表头的效果. 首先给table设置一个固定宽度.然后添加样式 table{table-layed:fixed} 有可能还会遇到其他的问题就是在设置td的宽度无效,这个时候不要慌.先检查是否为td设置了colspan和rowsapn等属性.如果是表格的第一列tr设置了这两个属性很可能导致td的宽度无效.我前面就是,利用一个其他的元素代替  然后就可以肆无忌惮的修改td的宽度

原生javascript 固定表头原理与源码

我在工作中需要固定表头这个功能,我不想去找,没意思.于是就写了一个,我写的是angularjs 自定义指令 起了个 "fix-header" 有人叫  "freeze-header" ,算了,看心情吧,最近心情不太好就不改了~~~ 想了想,我还是改成原生吧,angularjs就是个毛毛~~~. 先讲一下思路: 1.想一想,再想一想,肯定用定位了,具体是绝对定位还是固定定位,看实际情况:     2.clone 一份thead元素,用于再创建一个定位的表头:    

jquery固定表头或冻结表头的方法

html中经常遇到要把一个table的表头部分冻结,以便浏览时有更好的体验,百度完了大多数的网上解决方案,高级的bootstrap和angularjs中都没有清晰的解决方案,难道就我们中国人需要固定表头或者冻结table表头不成?其实自己写一个也没什么不可,eacherp中就有一个很方便的解决办法,一个函数而已,使用起来比较方便. javascript代码: <script> var container="#grid"; var url="abc.php"

UltraWebGrid 固定表头表尾

把Grid的TableLayout属性设为:Fixed ; UseFixedHeaders设为:True  //这是指定Grid允许固定列   StationaryMargins="Headerandfooter"  //这使Header始终在最上面显示 设置 UltraWebGrid 固定表头表尾

iOS常用于显示几小时前/几天前/几月前/几年前的代码片段

iOS常用于显示几小时前/几天前/几月前/几年前的代码片段 2015-03-13 10:09 版权声明:请关注个人博客:http://www.henishuo.com/ print? /** * Retain a formated string with a real date string * * @param dateString a real date string, which can be converted to a NSDate object * * @return a strin

自定义表格固定表头,随着表格内容增加出现滚动条

1.首先要固定表头就必须是两个表格组合在一起 2.用一个div把两个表格包在一起,并且设置宽度,在让它可以横向滚动,overflow-x: auto 3.在设置里面两个table的宽度为一样,在设置内容表格overflow-x:hidden;overflow-y:auto <!--表格表头固定--HTML部分> <div class="wrap_table"> <div class="table_head"> <table