jquery 表格固定表头、列插件

原创插件,转载请声明出处!!!

PS:此插件并无什么效率可言(注重效率就不要用了),然后也不支持旧版本浏览器(不支持css3 pointer-events属性的不能用)

PS2:相比其他插件(例如:http://www.fixedheadertable.com/),我写的这个的唯一优点就是不改变原来的表格结构(实际上是在原表格的容器的下方复制生成三个一样的表格)

jquery.fixedtable.js 内容如下:

/*!
 * jQuery Copy Plugin
 * version: 1.0.0-2018.01.31
 * Requires jQuery v1.5 or later
 * Copyright (c) 2018 Tiac
 * http://www.cnblogs.com/tujia/p/8393372.html
 */

// AMD support
(function (factory) {
    "use strict";
    if (typeof define === ‘function‘ && define.amd) {
        // using AMD; register as anon module
        define([‘jquery‘], factory);
    } else {
        // no AMD; invoke directly
        factory( (typeof(jQuery) != ‘undefined‘) ? jQuery : window.Zepto );
    }
}

(function($) {
"use strict";

/*
    Basic Usage:
    -----------

    Html:
        <div style="height: 400px; width: 500px; overflow: auto;">
            <table class="table" cellspacing="0">
                <thead>
                    <tr>
                        <th data-fixed="true">title</th>
                        <th data-fixed="true">title</th>
                        <th data-fixed="true">title</th>
                        <th>title</th>
                        <th>title</th>
                        <th>title</th>
                        <th>title</th>
                        <th>title</th>
                        <th>title</th>
                        <th>title</th>
                        <th>title</th>
                        <th>title</th>
                    </tr>
                </thead>
                <tbody>
                    ……
                </tbody>
            </table>
        </div>

    JS:
        $(‘.table‘).fixedTable();

    Other Usage:
    -----------

    $(‘.table‘).fixedTable({
        fixedColumns: 3,
        offset: {left:-1, top:-1},
        oddColor: ‘#E3EFF5‘,
        evenColor: ‘#FDBDBD‘,
    });

    $(‘.table‘).fixedTable(‘hide‘);
    $(‘.table‘).fixedTable(‘show‘);
    $(‘.table‘).fixedTable(‘refresh‘);
    $(‘.table‘).fixedTable(‘rebuild‘);
    $(‘.table‘).fixedTable(‘destroy‘);
*/

function getHeader(_this){
    var oTable = _this.clone();
    var oThead = oTable.children(‘thead‘).length>0? oTable.children(‘thead‘) : false;
    var oTbody = oTable.children(‘tbody‘).length>0? oTable.children(‘tbody‘) : oTable;
    var oTfoot = oTable.children(‘tfoot‘).length>0? oTable.children(‘tfoot‘) : false;

    oTable.width( _this.width() );

    /*if(oThead!=false){
        oTbody.remove();
    }else{
        oTbody.children(‘tr:gt(0)‘).remove();
    }
    if(oTfoot!=false) oTfoot.remove();*/

    var headers = oTable.find(‘tr:eq(0)‘).children();
    _this.find(‘tr:eq(0)‘).children().each(function(i){
        headers.eq(i).css(‘width‘, $(this).width());
        $(this).css(‘width‘, $(this).width());
    });

    return oTable;
}

function setPosition(wrapper, isRefresh){
    var oLTable        = wrapper.find(‘.ltableWrapper‘).find(‘.table:eq(0)‘);
    var oThead         = oLTable.children(‘thead‘).length>0? oLTable.children(‘thead‘) : false;
    var oTbody         = oLTable.children(‘tbody‘).length>0? oLTable.children(‘tbody‘) : oLTable;

    var oParent        = wrapper.prev(‘div‘);
    var ltableWrapper  = wrapper.find(‘.ltableWrapper‘);
    var lheaderWrapper = wrapper.find(‘.lheaderWrapper‘);
    var rheaderWrapper = wrapper.find(‘.rheaderWrapper‘);

    var options        = oParent.data(‘options‘);
    if(typeof(options)==‘string‘) options = JSON.parse( options );

    var scrollW = oLTable.height()>oParent.height()? 16 : 25;

    wrapper.css({
        left: oParent.offset().left + ((isRefresh==true? options.refreshOffset.left:options.offset.left) || 0),
        top: oParent.offset().top + ((isRefresh==true? options.refreshOffset.top:options.offset.top) || 0),
        width: oParent.width(),
        height: oParent.height()
    });

    var fixedWidth      = 0;
    var fixedHeight     = oParent.height()-scrollW;
    var fixedHeadWidth  = wrapper.width()-scrollW;
    var fixedHeadHeight = oThead? oThead.outerHeight() : oTbody.children(‘tr:eq(0)‘).outerHeight();

    if(options.fixedColumns==0){
        fixedWidth  = fixedHeadWidth;
    }else{
        var cells = (oThead || oTbody).children(‘tr:eq(0)‘).children();
        if(cells.eq(options.fixedColumns-1).offset().left>0){
            fixedWidth = cells.eq(options.fixedColumns-1).offset().left - wrapper.offset().left + cells.eq(options.fixedColumns-1).outerWidth(true);
        }else{
            fixedWidth = wrapper.outerWidth()/cells.length*(options.fixedColumns+1);
        }
    }
    ltableWrapper.height( fixedHeight );
    lheaderWrapper.height( fixedHeadHeight );
    rheaderWrapper.height( fixedHeadHeight );

    if(options.fixedColumns==0){
        ltableWrapper.width( 0 );
        lheaderWrapper.width( 0 );
        rheaderWrapper.width( fixedHeadWidth );
    }else{
        ltableWrapper.width( fixedWidth );
        lheaderWrapper.width( fixedWidth );
        rheaderWrapper.width( fixedHeadWidth-20 );
    }
}

$.fn.fixedTable = function(options) {
    if(options===undefined) options = {};

    var defaults = {
        fixedColumns: 0,
        offset: {left:0, top:0},
        refreshOffset: {left:0, top:0},
        oddColor: ‘#ffffff‘,
        evenColor: ‘#F8F8F8‘
    };

    if(typeof(options)==‘object‘){
        options = $.extend(defaults, options);
    }else if(typeof(options)==‘string‘){
        switch(options){
            case ‘show‘:
                this.each(function(){
                    $(this).parent().next(‘.fixedTable‘).show();
                });
                break;
            case ‘hide‘:
                this.each(function(){
                    $(this).parent().next(‘.fixedTable‘).hide();
                });
                break;
            case ‘refresh‘:
                this.each(function(){
                    var wrapper = $(this).parent().next(‘.fixedTable‘);
                    setPosition(wrapper, true);
                });
                break;
            case ‘rebuild‘:
                this.fixedTable(‘destroy‘);
                this.eq(0).parent().attr(‘data-runing‘, 0);
                var options = this.eq(0).parent().data(‘options‘);
                if(typeof(options)==‘string‘) options = JSON.parse( options );
                options.offset = {top:0, left:0};
                this.fixedTable( options );
                break;
            case ‘destroy‘:
                this.each(function(){
                    $(this).parent().next(‘.fixedTable‘).remove();
                });
                break;
        }
        return;
    }

    this.each(function(){
        var _this   = $(this);
        var oParent = _this.parent();

        var oBody = _this.children(‘tbody‘).length>0? _this.children(‘tbody‘) : _this;
        oBody.children(‘tr:odd‘).css(‘background-color‘, options.oddColor);
        oBody.children(‘tr:even‘).css(‘background-color‘, options.evenColor);

        var lheader = getHeader(_this);
        var rheader = lheader.clone();

        var oLTable = _this.clone();
        var oThead  = oLTable.children(‘thead‘).length>0? oLTable.children(‘thead‘) : false;
        var oTbody  = oLTable.children(‘tbody‘).length>0? oLTable.children(‘tbody‘) : oLTable;
        var oTfoot  = oLTable.children(‘tfoot‘).length>0? oLTable.children(‘tfoot‘) : false;
        oLTable.width( _this.width() );

        var fixedColumns = (oThead || oTbody).children(‘tr:eq(0)‘).find(‘[data-fixed="true"]‘).length || options.fixedColumns;
        options.fixedColumns = fixedColumns;

        if(oParent.attr(‘data-runing‘)==1){
            oParent.next(‘.fixedTable‘).remove();
        }else{
            oParent.attr(‘data-runing‘, 1);
            oParent.attr(‘data-options‘, JSON.stringify(options));
        }

        var wrapper        = $(‘<div class="fixedTable" style="position:absolute;top:0;left:0;overflow:hidden;pointer-events:none"></div>‘);
        var ltableWrapper  = $(‘<div class="ltableWrapper" style="position:absolute;top:0;left:0;overflow:hidden"></div>‘);
        var lheaderWrapper = $(‘<div class="lheaderWrapper" style="position:absolute;top:0;left:0;overflow:hidden"></div>‘);
        var rheaderWrapper = $(‘<div class="rheaderWrapper" style="position:absolute;top:0;left:0;overflow:hidden"></div>‘);
        ltableWrapper.append(oLTable);
        lheaderWrapper.append(lheader);
        rheaderWrapper.append(rheader);
        oParent.after(wrapper);
        wrapper.append(ltableWrapper).append(rheaderWrapper).append(lheaderWrapper);

        setPosition(wrapper);

        rheaderWrapper.scrollLeft(oParent.scrollLeft());
        ltableWrapper.scrollTop(oParent.scrollTop());
        rheaderWrapper.scrollTop(oParent.scrollTop());

        oParent.unbind(‘scroll‘).on(‘scroll‘, function(){
            var sl=this.scrollLeft,st=this.scrollTop,d=JSON.parse($(this).attr(‘slt‘)||‘{}‘);

            if(sl!=d.sl){
                rheaderWrapper.scrollLeft( $(this).scrollLeft() );
            }

            if(st!=d.st && fixedColumns>0){
                ltableWrapper.scrollTop( $(this).scrollTop() );
            }

            $(this).attr(‘slt‘, JSON.stringify({sl:sl,st:st}));
        });
    });
};

}));

原文地址:https://www.cnblogs.com/tujia/p/8393372.html

时间: 2024-08-01 07:13:35

jquery 表格固定表头、列插件的相关文章

Jquery 表格固定表头

网上找了好多现成的.结果没一个能成.只得自己动手. (function($){ $.fn.fixHeader = { init : function(obj){ var p = obj.parent(); //绑定事件 p.scroll(internalScroll); //获取表格第一行 var head = obj.children("thead tr th:first"); if (!head || head.length == 0) { var body = obj.child

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

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

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

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

table 表格固定表头和第一列、内容可滚动

整理了下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <meta charset="utf-8" /> <style type="text/css"&

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

引语:做有难度的事情,才是成长最快的时候.前段时间,接了一个公司的稍微大点的项目,急着赶进度,本人又没有独立带过队,因此,把自己给搞懵逼了.总是没有多余的时间来做自己想做的事,而且,经常把工作带入生活,这TM真是一个糟糕的事情!这两天,终于把项目上上去了,不管结果怎么样,总算是交差了吧.趁着这空档的时间,写点东西. 本篇,就来写写关于固定表头和表列的事儿吧. 相信大家使用excel的时候,肯定都会用到一项冻结的功能,冻结之后,可以让你很方便的查看到各种标题,从而能清楚的查看到当前行的内容. 这个

15 个最佳的 jQuery 表格插件

现如今,网站开发设计的需求会要求自动适应所有移动设备,即响应式网站: 在开发网站时必须考虑对平板设备融合 fluid(流)和自适应性特点. 大多数网站设计要靠margins, guides, rows and columns等网格系统和布局来在网页上组织内容.网格设计常见于报纸和杂志中的文字图像排版设计. 可以创建网格布局的数量几乎是无限的,并且能够用无数种方式排布.比如:在等间距的两列,三列或者四列网格顶端有一个横跨的header,或者一整页的有着同样外观和感觉的方格. 有一些很好的JQuer

25款顶级的jQuery表格插件

jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用文本和图片进行填充.我用了顶级的来形容这个些插件,我可以肯定你了解它们之后会觉得很酷. 1. Gridify Gridify 是轻量级的 jQuery 插件,用来创建一个类似 Pinterest 图片加载网格插件.支持图像加载事件,支持窗口缩放事件,支持非常长的高度项,支持动态项宽度,支持动画 (C

25个顶级的jQuery表格插件

jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用文本和图片进行填充.我用了顶级的来形容这个些插件,我可以肯定你了解它们之后会觉得很酷. 1. Gridify Gridify 是轻量级的 jQuery 插件,用来创建一个类似 Pinterest 图片加载网格插件.支持图像加载事件,支持窗口缩放事件,支持非常长的高度项,支持动态项宽度,支持动画 (C

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

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