将HTML表格转换为Bootstrap列 - 响应式设计

22

我一直在处理我们拥有的旧产品,目前使用HTML表格来显示其内容。在这个响应式世界中,我想使其响应式。在网上阅读后,我相信重新设计整个网站可能需要很多工作,但我试图找到一种解决方案,将任何表格转换为基于包含Bootstrap列的div的列。这是登录页面的一个非常好的例子:JsFiddle

我无法访问字段的源代码,但我可以使用jQuery添加元素(append/prepend)。我也可以添加CSS样式。

请有人能帮我实现这个方法吗?

<table></table>
.
.
.
<div class="container">
<div class="row">
<div class="col-md-3">
</div>
</div>
</div>

干杯。


1
如果是表格数据,请保留为表格。如果他们使用表格进行布局,则这是一个很好的方法,但使用jQuery以这种方式更改DOM可能不是最佳选择。有没有办法获得源代码访问权限? - Kyle
这不是真正的表格数据,只是使用表格创建表单。我实际上没有访问源代码的权限,因为它是一个应用程序开发系统,字段是在服务器级别上定义的。但是,我可以访问前端并且可以操作字段和DOM。 - Neophile
@VincentG:当你点击那个按钮时,它只是为你进行转换,不是吗?我该如何让它在我的网页上实时工作? - Neophile
我认为,如果您无法访问HTML结构,则可以使用CSS进行修复,例如这个fiddle:http://jsfiddle.net/shigemimatsumoto/Ww8hq/ - Vincent G
嗨。我不确定这是否正是您要寻找的,但我过去曾使用过这个来使表格具有响应性 https://css-tricks.com/examples/ResponsiveTables/responsive.php。如果您想让我为您编写一个示例,请告诉我。我已经将其从760像素及以下转换为列表样式视图,并且效果很好。 - sringland
显示剩余6条评论
11个回答

9

将任何给定的表格无缝转换为Bootstrap列可能会很困难。请考虑到Bootstrap列只允许最多12列,而表格可能有更多。

此函数将把表格转换为BS行/列,但它假设表格行数可以被12整除(否则,您需要根据自己的需求进行调整)。

/**
 * Convert a table to bootstrap columns
 * @param table DOMElement
 */
function makeBSCols(table){
    var html = ["<div class='container'>"];
    $(table).find('tr').each(function(){
        var $td = $(this).find('td').length ? $(this).find('td') : $(this).find('th');
        // get the column width
        if($td.length > 12) return alert("too many columns");
        var cls = Math.floor(12/$td.length);
        if(cls!==(12/$td.length)) return alert("invalid column count");
        html.push("<div class='row'>");
        $td.each(function(){
            html.push('<div class="col-sm-'+cls+'">'+$(this).html()+'</div>');
        });
        html.push('</div>');
    });
    html.push('</div>');
    $(table).replaceWith(html.join(''));
}

示例:makeBSCols(document.getElementById('myTable')) (Fiddle)

如果您要显示表格数据,为了获得更灵活的解决方案,您可以考虑使用Bootstrap表格而不是Bootstrap列/行。这个方法只会将Bootstrap样式添加到您的表格中,并将其放置在.table-responsive div中,有助于响应性。

/**
 * Convert a regular table to bootstrap table
 * @param table DOMElement
 */
function makeBSTable(otable){
    var table = $(otable).clone(); console.log(table);
    table.addClass("table-hover table-bordered table-striped table");
    var div = $('<div class="table-responsive" />');
    $(otable).replaceWith(div);
    div.append(table);
}

例如:makeBSTable(document.getElementById('myTable'))Fiddle

该示例用于创建一个具有排序和分页功能的表格。通过传递id为"myTable"的HTML表格元素,可使其变为可排序和可分页的Bootstrap表格。


嗨,伙计,谢谢你的回答。你能根据我的 JsFiddle 提供你的答案吗? - Neophile
@JackBrown,我更新了你的fiddle。请在本帖中查看我的回答。 - B2K

2

针对楼主:您需要重写整个项目中的表格

根据您的要求,您不想重新制作任何已建立的表格,同时您希望将现有的表格转换为响应式的 div。

首先,为了提供一个可以在整个项目中使用的解决方案,非常重要的是网站中的所有表格都遵循相同的结构标准。从登录页面中我看到目前情况非常随意。

即使您编写了适用于您提供的屏幕(登录屏幕)的解决方案,我也不确定是否足以满足您整个网站的需求。您屏幕上的表格嵌套到核心。如果采用这种方法,您永远不知道会发生什么问题。

因此,我的建议是.. 既往不咎.. 以前的开发人员只使用表格来构建页面,但是世界已经变成了响应式。未来几年它还将发生变化。我们永远不知道。所以现在是时候将所有页面重写为新的 HTML 结构并升级到最新的可能代码


针对公众:想要根据设备将表格更改为 div

快速检查: 工作的演示(调整结果屏幕大小以查看效果)

据我所知,您希望在中型和大型设备上显示table,但是当用户使用小型设备或将屏幕调整为小型时,您希望以不同的方式显示它,更像一个div结构。

我有一个使用内置 bootstrap 类的解决方案。

解决方案:

  • 创建您要显示在中型和大型设备上的表格(和另一种 HTML 结构),以及您要在小型设备上显示的其他 HTML 结构。
  • 使用 bootstrap 提供的辅助类根据视口切换显示表格和其他部分。

    这是来自文档的截图和测试用例

enter image description here

因此,根据上述详细信息,您所需要的就是..

// the tables are visible only on medium and large devices
<table class="visible-md-block visible-lg-block"> 
  //..your table structure
</table>

 // This section is only visible in small and extra small devices
 <div class="visible-xs-block visible-sm-block"> 
  //The table data represented in a div structure.
  //Each row can be structured as sections with header as label and row data as value.
 </div>

缺点:

  • 如果用户在任何设备上或从未调整屏幕大小,则使用此方法将导致额外的HTML。

优点:

  • 这不需要您跟踪屏幕何时被调整以便构建新部分。这也意味着您不需要Jquery。
  • 这不需要您找出用户所用的设备。
  • 工作非常顺畅,因为它仅涉及CSS。

希望这可以帮助您!


1
我不认为这是解决您问题的“最好”的方式,但如果您只能使用CSS和jQuery,我认为您可以将表格数据的每个部分都放进
中,使用$(...).hide()将其隐藏,然后使用$(...).html()将该内容放入Bootstrap的
中。

1
我认为你说的彻底重构可能需要很多工作。但是我真的会考虑更混合的解决方案:为什么不挑选一些组件并将它们进行良好的重构。你拥有的旧产品将会显著改善,只是第一步不会达到100%。对于现在无法重构的部分,制定一个巧妙的计划。其他人提出的解决方案完美地回答了你的问题,但我认为最终你将陷入难以维护的产品中。这样的产品没有任何人会从中受益,对吧?

1
表格用于表格数据。如果表格中的内容是这样的,最好保持它们为表格。这是出于语义原因以及与美国第508节的可访问性和合规性有关。您可以使用 .table-responsive 类来帮助在移动设备上更好地显示并避免任何破坏。 还有其他使表格更具响应性的方法,例如 stackabletablesaw 等。 即使您转换为 Bootstrap 的行和列,您仍然有一个设置为12列的网格,如果表格的内容无法很好地适应其中,那么用户体验将会很差。

这并不一定是真的。表格只是一种容器类型。当我开始进行Web开发时,没有太多的替代方案,也没有CSS、DIV、部分或文章之类的东西。如果您想要多列,比如左侧列用于字段标签,右侧用于输入元素,则表格是您唯一的选择。 - B2K
@B2K 表格是用于表格数据的。如果您正在放置非表格数据(如您所建议的),则此答案不适用于您。这符合 WCAG 2.0 - H51 的编译要求。 - TheSharpieOne
我想你误解了我的意思。表格应该用于制作表格数据。直到最近,它们并不是这样使用的。在Netscape 1.0发布时,我正在设计网站。话虽如此,规范都很好,但在处理遗留网站时,告诉别人他们应该做什么并没有什么帮助。 - B2K

1
我认为如果网站基于HTML表格,您需要重写整个HTML。如果您只是将表格用作“普通”表格,则可以在表格中添加class="table"。此外,您可以将表格包装在具有class="table-responsive"的div中。

e.g.:

<div class="table-responsive">
  <table class="table">
    ...
  </table>
</div>

还有一些其他的样式可用:table-hover table-striped ... 您可以在这里找到一些示例:http://getbootstrap.com/css/#tables


1

Bootstrap将列和行分为响应所有设备的部分,请尝试此功能。

使用此类型的响应式设计。

<!DOCTYPE html>
<html>
<head>
    <title>test</title>
    <!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-lg-offser-2 col-lg-5">
            <form>
                <div class="form-group">
                    <input type="text" name="username" class="form-control" placeholder="Username">
                </div>
                <div class="form-group">
                    <input type="password" name="pass" class="form-control" placeholder="Password">
                </div>
                <div class="form-group">
                    <button class="btn btn-success">Login</button>
                </div>
            </form>
        </div>
    </div>
</div>
</body>
</html>

1
你可以使用jQuery来获取信息,然后将其添加到现有的表格中。我使用标签 来作为表头,内部使用普通的 和 标签。这对我很有效。我使用jQuery来获取数据并添加到表格中。这很容易做到。
对于响应式的Bootstrap页面,可以使用下面的表格代码,并将其放置在一个
中,创建一个列,例如:
<div class="container">
    <div class="row">
        <div class="col-md-4"> </div>
        <div class="col-md-4"> /*You can place the table in here*/ </div>
        <div class="col-md-4"> </div>
    </div>
</div>

这是一个样例表格代码:

<table>
    <thead>
        <tr>
          <th>header 1</th>
          <th>header 2 </th>
        </tr>
    </thead>
    <tbody>
        /*You could pull and add the data in here with <tr> and <td> using                   jQuery*/
    </tbody>
</table>

1
更新: 原帖中并没有明确提到作者需要处理深层嵌套的表格。我已经相应地更新了他的JsFiddle
以下是我写的一些jQuery代码,可以将表格实时转换为Bootstrap行和列。它假定表格是对称的,没有colspan或rowspan属性。
在将表格转换为Bootstrap布局时,主要问题之一是正确处理标题行。只要所有的标题单元格都使用th标签,这个jQuery代码就可以做到。你可以通过将find('th')替换为find('th,td')来轻松地假设第一行中的任何内容都是标题。
最后,重要的是保留原始表格的属性,如id、class和onclick事件。任何以编程方式添加的事件可能需要重新应用。
$('table:not(:has(table))').each(function() {
    debugger;
    var rowSelector = 'tr';
    var attributes = $.map(this.attributes,function(a,i) {
       return a.name+'="'+a.value+'"';
    }).join(' ');

    // handle collapsible headers
    var $headers = $('tr:first', this).find('th');
    var columns = $('tr:first',this).find('th,td').length;
    if ($headers.length > 0) {
        $headers.closest('tr').addClass('row visible-sm visible-md visible-lg');
        $headers.addClass('form-group  col-sm-' + Math.floor(12 / $headers.length)).wrapInner('<label></label>');
        rowSelector = 'tr:not(:first)';
    }
    // add classes to each data row
    $(rowSelector, this).addClass('row').each(function() {
        $('td,th', this)
            .addClass('form-group col-sm-' + Math.floor(12 / columns))
            .filter(function() {
               return $headers.length > 1;
            })
            .each(function (i) {
               // add collapsible headers to each row
               $(this).prepend('<label class="visible-xs">' + $($headers[i]).html() + '</label>');
            });
    });
    // convert input elements to bootstrap styled controls 
    $(':input', this).addClass('form-control').css('width', '');

    var divs = '<div class="container"><div '+attributes+'>'+$(this).html()
        .replace(/<\/{0,1}tbody>/gi, '')
        .replace(/<(tr|td|th)/gi, '<div')
        .replace(/<\/(tr|td|th)/gi, '</div')+'</div></div>';
    $(this).replaceWith(divs);
});

$('table').each(function() {
    var rewrite = $(this).html()
        .replace(/<(\/{0,1})table/gi, '<$1div')
        .replace(/<\/{0,1}tbody>/gi, '')
        .replace(/<(\/{0,1})(tr|td|th)/gi, '<$1div');
      $(this).replaceWith( rewrite );
});

给定这个样例表格。
<table>
  <tr><th>First Name</th><th>Last Name</th><th>Address</th><th>City</th><th>State</th><th>Zip Code</th></tr>
  <tr><td>Jake</td><td>Elwood</td><td>1060 W Addison St</td><td>Chicago</td><td>IL</td><td>60613</td></tr>
  <tr><td>John</td><td>Wayne</td><td>18601 Airport Way</td><td>Santa Ana</td><td>CA</td><td>92707</td></tr>
</table>

以下为Bootstrap标记的结果:
<div class="container">
<div class="row visible-md visible-lg">
    <div class="form-group col-md-2">
        <label>First Name</label>
    </div>
    <div class="form-group col-md-2">
        <label>Last Name</label>
    </div>
    <div class="form-group col-md-2">
        <label>Address</label>
    </div>
    <div class="form-group col-md-2">
        <label>City</label>
    </div>
    <div class="form-group col-md-2">
        <label>State</label>
    </div>
    <div class="form-group col-md-2">
        <label>Zip Code</label>
    </div>
</div>
<div class="row">
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">First Name</label>
        Jake
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">Last Name</label>
        Elwood
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">Address</label>
        1060 W Addison St
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">City</label>
        Chicago
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">State</label>
        IL
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">Zip Code</label>
        60613
    </div>
</div>
<div class="row">
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">First Name</label>
        John
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">Last Name</label>
        Wayne
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">Address</label>
        18601 Airport Way
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">City</label>
        Santa Ana
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">State</label>
        CA
    </div>
    <div class="form-group col-md-2">
        <label class="visible-xs visible-sm">Zip Code</label>
        92707
    </div>
</div>
</div>

1
var tablesYouWant = document.querySelectorAll("yourSelection"); //A selection of elements
for(var i = 0; i < tablesYouWantl i++){
    i.class += "classNames"; //Add Bootstrap classes to the elements
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接