【问题标题】:How to convert columns to rows using CSS如何使用 CSS 将列转换为行
【发布时间】:2014-06-26 16:57:44
【问题描述】:

您好,我需要将列转换为行,将行转换为列。我在左侧有列标题和行标题。行标题只是行左侧的粗体文本,用于定义行是什么。

我正在努力使这张桌子适合移动设备。该表有 7 列宽,这 7 列不显示在智能手机中。所以我的想法是使用媒体查询来显示一个表,其中列和行被切换,因为不会超过 3 行。这个可以吗?

【问题讨论】:

  • 你能把你的桌子弄乱吗?它有多少行?

标签: javascript html css


【解决方案1】:

DEMO

Css 解决方案: 只需将您的tdth 转换为display:block; 并将您的tr 转换为display:table-cell;

CSS:

@media screen and (max-width:767px) {
    table tr > *{
        display: block;
    }
    table tr {
        display: table-cell;
    }
}

缺点:如果您的单元格包含太多数据,则布局会破坏Example

jQuery 解决方案:我们可以跟踪元素高度以保持不变DEMO

JS:

$(function () {
    switchRowsAndCols("table", 767);
});

function switchRowsAndCols(thisTable, resolution) {
    if ($(window).width() < resolution) {
        switchRowsAndColsInnerFun(thisTable);
    }
    $(window).resize(function () {
        if ($(window).width() < resolution) {
            switchRowsAndColsInnerFun(thisTable);
        }else{
            switchRowsAndColsRemove(thisTable);
        }
    });
};

function switchRowsAndColsRemove(thisTable) {
    $("tr > *", thisTable).css({
        height: 'auto'
    });
};

function switchRowsAndColsInnerFun(thisTable) {
    var maxRow = $("tr:first-child() > *", thisTable).length;

    for (var i = maxRow; i >= 0; i--) {

        $("tr > *:nth-child(" + i + ")", thisTable).css({
            height: 'auto'
        });

        var maxHeight = 0;

        $("tr > *:nth-child(" + i + ")", thisTable).each(function () {
            var h = $(this).height();
            maxHeight = h > maxHeight ? h : maxHeight;
        });

        $("tr > *:nth-child(" + i + ")", thisTable).each(function () {
            $(this).height(maxHeight);
        });
    };
};

【讨论】:

  • @NicholasHazel 这个简单的解决方案有一个问题——如果你放太多数据,即换行,布局就会崩溃,我想不出任何 CSS 解决方案,所以这里有一些 jQuery——请查看我的更新答案.
  • @ImranBughio - 决定推出一个超级快速严格的 jQuery 解决方案。如果您打算使用 jQuery,请好好使用它 :-)(您的回答也非常合理)。
  • 同时添加表 colgroup { display: none; }
【解决方案2】:

好吧,我想我会为寻求额外帮助的其他人提供一个稍微不同的 jQuery 解决方案来解决您的困境。

如果您使用脚本,不妨让它做所有事情(以下脚本需要4.2ms 运行,这对我来说似乎很合理:-)

基本上下面的操作是将您的tabular-data 转换为multidimensional array

1, 2, 3, 4
5, 6, 7, 8 
9, 10, 11, 12

变成:

[[1,5,9],[2,6,10],[3,7,11],[4,8,12]]

然后,只需让它根据新的array 和一对for-loops 重写您的table

有一点需要注意,您必须将其绑定到 media querywindow.resize 处理程序才能获得您正在寻找的后天效果。这就像更改我分配的 on.click 处理程序一样简单。

看看吧!非常漂亮:

http://jsfiddle.net/jsR7n/1/

HTML:

<input type="button" id="switch" value="switch" \>
<table id="switchItems">
<tr>
    <td>a</td>
    <td>b</td>
    <td>c</td>
    <td>d</td>
</tr>
<tr>
    <td>...etc

jQuery 脚本:

$(function(){
    $('#switch').on('click', function(){
        var items = [];
        var itemsConv = [];
        var table = $('#switchItems');
        var row,cell;

// FIND ALL OF THE DATA
        $("tr").each(function(){
            var trRow = [];
            $(this).children().each(function() {
                trRow.push($(this).text());
            });
            items.push(trRow);
        });
        for(var j=0;j<items[0].length;j++){
            var newRow = [];
            for(var i=0;i<items.length;i++){
                newRow.push(items[i][j]);
            }
            itemsConv.push(newRow);
        }

// KILL OUR CURRENT DATA IN THE TABLE
        table.empty();

// REWRITE OUR TABLE WITH NEW DATA
        for(var i=0; i<itemsConv.length; i++){
            row = $( '<tr />' );
            table.append( row );
            for(var j=0; j<itemsConv[i].length; j++){
                cell = $('<td>'+itemsConv[i][j]+'</td>');
                row.append( cell );
            }
        }
    });
});

希望对您有所帮助!

http://jsfiddle.net/jsR7n/1/

【讨论】:

  • 很好,我只是在网上看有很多小脚本做同样的任务,但没有任何正确注册的 jQuery 插件,也许我们应该自己上传一个插件?
  • 好的,想用git吗?
  • 让我们在Chat Room继续讨论
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多