【问题标题】:Fixed header scrollable table has mismatch between header and tbody修复了 header 可滚动表 header 和 tbody 不匹配的问题
【发布时间】:2015-04-04 05:51:52
【问题描述】:

你可以在

中看到我的html代码

jsfiddle

它提供了一个固定标题的可滚动表格。 thead 和 tbody 的列之间存在轻微的不匹配。我该如何解决?

我需要将 thead 和 tbody 列的边界放在同一位置。

HTML:

<div id="tableContainer" class="tableContainer" style="margin: 0 auto;">
    <table class="scrollTable" cellpadding="0" cellspacing="0" width="100%" border="0">
        <thead class="fixedHeader">
            <tr class="alternateRow">
                <th>File</th>
                <th>Line</th>
                <th>Function</th>
                <th>Value</th>
                <th>Message</th>
            </tr>
        </thead>
        <tbody class="scrollContent">
            <tr class="alternateRow">
                <td>test.cpp</td>
                <td>72</td>
                <td>remove_items_states</td>
                <td>0.000000</td>
                <td>state_flag</td>
            </tr>
                    <tr class="alternateRow">
                <td>test.cpp</td>
                <td>72</td>
                <td>remove_items_states</td>
                <td>0.159990</td>
                <td>state_flag</td>
            </tr>
            <tr class="alternateRow">
                <td>test.cpp</td>
                <td>72</td>
                <td>remove_items_states</td>
                <td>0.159990</td>
                <td>state_flag</td>
            </tr>
            <tr class="alternateRow">
                <td>test.cpp</td>
                <td>72</td>
                <td>remove_items_states</td>
                <td>0.160000</td>
                <td>state_flag</td>
            </tr>
            <tr class="alternateRow">
                <td>test.cpp</td>
                <td>72</td>
                <td>remove_items_states</td>
                <td>0.160000</td>
                <td>state_flag</td>
            </tr>
        </tbody>
    </table>
</div>

CSS:

/* Terence Ordona, portal[AT]imaputz[DOT]com         */
/* http://creativecommons.org/licenses/by-sa/2.0/    */

/* begin some basic styling here                     */
body {
    background: #FFF;
    color: #000;
    font: normal normal 12px Verdana, Geneva, Arial, Helvetica, sans-serif;
    margin: 10px;
    padding: 0
}

table, td, a {
    color: #000;
    font: normal normal 12px Verdana, Geneva, Arial, Helvetica, sans-serif
}

h1 {
    font: normal normal 18px Verdana, Geneva, Arial, Helvetica, sans-serif;
    margin: 0 0 5px 0
}

h2 {
    font: normal normal 16px Verdana, Geneva, Arial, Helvetica, sans-serif;
    margin: 0 0 5px 0
}

h3 {
    font: normal normal 13px Verdana, Geneva, Arial, Helvetica, sans-serif;
    color: #008000;
    margin: 0 0 15px 0
}
/* end basic styling                                 */

/* define height and width of scrollable area. Add 16px to width for scrollbar          */
div.tableContainer {
    clear: both;
    border: 1px solid #963;
    height: 500px;
    overflow: auto;
    width: 756px
}

/* Reset overflow value to hidden for all non-IE browsers. */
html>body div.tableContainer {
    overflow: hidden;
    width: 756px
}

/* define width of table. IE browsers only                 */
div.tableContainer table {
    float: left;
    width: 740px
}

/* define width of table. Add 16px to width for scrollbar.           */
/* All other non-IE browsers.                                        */
html>body div.tableContainer table {
    width: 756px
}

/* set table header to a fixed position. WinIE 6.x only                                       */
/* In WinIE 6.x, any element with a position property set to relative and is a child of       */
/* an element that has an overflow property set, the relative value translates into fixed.    */
/* Ex: parent element DIV with a class of tableContainer has an overflow property set to auto */
thead.fixedHeader tr {
    position: relative
}

/* set THEAD element to have block level attributes. All other non-IE browsers            */
/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */
html>body thead.fixedHeader tr {
    display: block
}

/* make the TH elements pretty */
thead.fixedHeader th {
    background: #C96;
    border-left: 1px solid #EB8;
    border-right: 1px solid #B74;
    border-top: 1px solid #EB8;
    font-weight: normal;
    padding: 4px 3px;
    text-align: left
}

/* make the A elements pretty. makes for nice clickable headers                */
thead.fixedHeader a, thead.fixedHeader a:link, thead.fixedHeader a:visited {
    color: #FFF;
    display: block;
    text-decoration: none;
    width: 100%
}

/* make the A elements pretty. makes for nice clickable headers                */
/* WARNING: swapping the background on hover may cause problems in WinIE 6.x   */
thead.fixedHeader a:hover {
    color: #FFF;
    display: block;
    text-decoration: underline;
    width: 100%
}

/* define the table content to be scrollable                                              */
/* set TBODY element to have block level attributes. All other non-IE browsers            */
/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */
/* induced side effect is that child TDs no longer accept width: auto                     */
html>body tbody.scrollContent {
    display: block;
    height: 475px;
    overflow: auto;
    width: 100%
}

/* make TD elements pretty. Provide alternating classes for striping the table */
/* http://www.alistapart.com/articles/zebratables/                             */
tbody.scrollContent td, tbody.scrollContent tr.normalRow td {
    background: #FFF;
    border-bottom: none;
    border-left: none;
    border-right: 1px solid #CCC;
    border-top: 1px solid #DDD;
    padding: 2px 3px 3px 4px
}

tbody.scrollContent tr.alternateRow td {
    background: #EEE;
    border-bottom: none;
    border-left: none;
    border-right: 1px solid #CCC;
    border-top: 1px solid #DDD;
    padding: 2px 3px 3px 4px
}

/* define width of TH elements: 1st, 2nd, and 3rd respectively.          */
/* Add 16px to last TH for scrollbar padding. All other non-IE browsers. */
/* http://www.w3.org/TR/REC-CSS2/selector.html#adjacent-selectors        */
html>body thead.fixedHeader th {
    width: 200px
}

html>body thead.fixedHeader th + th {
    width: 240px
}

html>body thead.fixedHeader th + th + th {
    width: 316px
}

/* define width of TD elements: 1st, 2nd, and 3rd respectively.          */
/* All other non-IE browsers.                                            */
/* http://www.w3.org/TR/REC-CSS2/selector.html#adjacent-selectors        */
html>body tbody.scrollContent td {
    width: 200px
}

html>body tbody.scrollContent td + td {
    width: 240px
}

html>body tbody.scrollContent td + td + td {
    width: 300px
}

【问题讨论】:

    标签: html css


    【解决方案1】:

    您可以使用 jQuery。例如:jsfiddle

    // Change the selector if needed
    var $table = $('table.scrollTable'),
        $bodyCells = $table.find('tbody tr:first').children(),
        colWidth;
    
    // Adjust the width of thead cells when window resizes
    $(window).resize(function() {
        // Get the tbody columns width array
        colWidth = $bodyCells.map(function() {
            return $(this).width();
        }).get();
    
        // Set the width of thead columns
        $table.find('thead tr').children().each(function(i, v) {
            $(v).width(colWidth[i]);
        });    
    }).resize(); // Trigger resize handler
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多