【问题标题】:Converting HTML tables to bootstrap columns - Responsive Design将 HTML 表格转换为引导列 - 响应式设计
【发布时间】:2017-04-20 23:37:01
【问题描述】:

我一直在研究我们拥有的旧产品,该产品目前使用 HTML 表格来显示其内容。在这个反应灵敏的世界里,我想让它反应灵敏。在线阅读后,我相信重新设计整个网站可能最终需要做很多工作,但是,我正在尝试找到一种解决方案,可以将任何表转换为基于包含引导列的 div 的列。此处为登录页面提供了一个非常示例:JsFiddle

我无权访问字段的来源,但是,我可以使用 jQuery 添加元素(追加/前置)。我还可以添加 CSS 样式。

有人可以帮我解决这个问题吗?

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

干杯。

【问题讨论】:

  • 如果是表格数据,请保留为表格。如果他们使用表格进行布局,那么这是一个很好的方法,但使用 jQuery 以这种方式更改 DOM 可能不是最好的主意。有什么方法可以访问源代码?
  • 它不是真正的表格数据,它只是使用表格创建表单。我真的无法访问源代码,因为它是一个应用程序开发系统和字段是在服务器级别定义的。但是,我确实可以访问前端,并且可以操作字段和 DOM。
  • 你检查过这个吗? divtable.com/generator
  • @VincentG:当您单击该按钮时,它会为您完成转换,不是吗。我怎样才能让它在我的网页上运行?
  • 我认为,如果您无法访问 HTML 结构,您可以使用 CSS 进行修复,例如:jsfiddle.net/shigemimatsumoto/Ww8hq

标签: javascript jquery html css twitter-bootstrap


【解决方案1】:

可能很难将任何给定的表完美地转换为引导列。考虑到引导列最多只允许 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)

对于更灵活的解决方案,(假设您实际上是在显示表格数据)您可以考虑只使用 BS 表而不是 BS 列/行。这只会将 BS 样式添加到您的表格中,并将其放入 .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)

【讨论】:

  • 嗨,伙计,感谢您的回答。您能否根据我的 JsFiddle 提供您的答案?
  • @JackBrown 我更新了你的小提琴。在此线程的其他地方查看我的答案。
【解决方案2】:

致 OP:您需要在整个项目中重写表

根据您的要求,您不想返工任何已构建的表格,并且您还想将现有表格转换为响应式 div。

首先要提供一个适用于您的整个项目的解决方案,非常重要的是您网站中的所有表格都遵循相同的结构标准。我现在从登录页面看到它非常随机。

即使您编写了一个可以在您提供的屏幕(登录屏幕)上运行的解决方案,我也不确定这是否足以满足您的整个网站。屏幕中的表格嵌套在核心中。如果你采取这种方法,你永远不知道会发生什么事情。

所以我的建议是.. 已经完成了.. 以前的开发人员过去只使用表格来构建页面,但是世界已经改变为响应性。在接下来的几年里,它也会发生变化。我们不知道。因此,您应该将所有页面重写为新的 HTML 结构并升级到最新的可能代码


面向大众:想要根据设备将表格更改为 div 的人

快速检查: Working fiddle(调整结果屏幕大小以查看效果)

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

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

解决方案:

  • 创建您的表格(在中型和大型设备中显示)和其他 HTML 结构(您希望在小型设备中显示)。
  • 使用 bootstrap 提供的 Helper Classe 根据视口切换表格和其他部分的显示。

    这是来自 Doc 和 TestCase 的快照

所以有了上面给出的细节,你所需要的就是..

// 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

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    如果网站基于 html 表格,我认为您将不得不重写整个 html。

    如果您将表格用作“普通”表格,则只需将 class="table 添加到您的表格中

    此外,您可以使用 class="table-responsive" 将表格包裹在 div 中

    例如:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我认为你是对的,完整的重构可能会花费大量工作。但是我真的会考虑一个更让我们称之为混合解决方案的解决方案:为什么不选择一些组件并很好地重构它们。您拥有的旧产品会显着改善,但不是在第一步中 100%。对于现在无法重构的部分,制定一个漂亮的计划。其他人提到的解决方案完美地解决了您的问题,但我认为您最终会被无法维护的产品所困扰。没有人会从这样的产品中受益,对吧?

        【讨论】:

          【解决方案6】:

          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>
          

          【讨论】:

            【解决方案7】:

            您可以使用 jQuery 提取信息并将其添加到您拥有的表中。我使用标签,然后是标题,在其中我使用普通和标签。为我工作。我使用 jQuery 来提取数据并添加到表中。这很容易做到。

            对响应式引导页面有用的东西可能是使用下面的表格代码并将其放置在您创建列的位置,例如:

            <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>
            

            【讨论】:

              【解决方案8】:

              表格用于表格数据。如果这是表格中的内容,最好将它们保留为表格。这是出于语义原因和可访问性(以及符合美国第 508 条)。您可以使用 .table-responsive 类来帮助使其在移动设备上看起来更好,并且不会破坏任何东西。 还有其他一些东西可以使表格更具响应性,例如 stackabletablesaw 等等。 即使您转换为引导程序的行和列,您也有一个设置的 12 列网格,如果它们的表格内容不能很好地固定在那里,它将会有一个糟糕的用户体验。

              【讨论】:

              • 这不一定是真的。表只是一种容器。当我第一次开始做 web 开发时,没有太多的选择,也没有 css、div、section 或文章之类的东西。如果你想要多列,比如左边的字段标签和右边的输入元素,表格是你唯一的选择。
              • @B2K 表用于表格数据。如果您放置的东西不是表格数据(如您所建议的那样),那么此答案不适用于您。这与 WCAG 2.0 - H51 编译
              • 我觉得你误会了我。表格应该用于表格数据。直到最近才使用它们。当 Netscape 1.0 发布时,我正在设计网站。也就是说,规范都很好,但是在处理遗留网站时,告诉别人他们应该做什么并不是很有帮助。
              【解决方案9】:

              更新: 从原始帖子中并不清楚作者需要处理深度嵌套的表。我有相应的updated his JsFiddle

              这是我不久前编写的一些 jQuery 代码,它可以即时将表转换为引导行和列。它假定表格是对称的,没有 colspan 或 rowspan 属性。

              将表格转换为引导布局时的主要问题之一是正确处理标题行。如果所有标题单元格都使用 th 标记,则此 jQuery 代码将执行此操作。通过将find('th') 替换为find('th,td'),您可以轻松地假设第一行的任何内容都是标题。

              最后,保留原始表的属性很重要,例如 id、类和 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>
              

              导致以下引导标记:

              <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>
              

              【讨论】:

                【解决方案10】:
                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
                }
                

                【讨论】:

                  【解决方案11】:

                  您应该需要使用引导类表添加这样的类 - 响应

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

                  【讨论】:

                    猜你喜欢
                    • 2013-03-06
                    • 2014-05-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-11-19
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多