【问题标题】:Pull th content into a td data-label attribute将内容拉入 td data-label 属性
【发布时间】:2018-04-16 12:22:54
【问题描述】:

我正在使用响应式表格样式,它会在较小的屏幕尺寸下折叠并在每个单元格之前显示表格标题。

body {
  font-family: "Open Sans", sans-serif;
  line-height: 1.25;
}
table {
  border: 1px solid #ccc;
  border-collapse: collapse;
  margin: 0;
  padding: 0;
  width: 100%;
  table-layout: fixed;
}
table caption {
  font-size: 1.5em;
  margin: .5em 0 .75em;
}
table tr {
  background: #f8f8f8;
  border: 1px solid #ddd;
  padding: .35em;
}
table th,
table td {
  padding: .625em;
  text-align: center;
}
table th {
  font-size: .85em;
  letter-spacing: .1em;
  text-transform: uppercase;
}
@media screen and (max-width: 600px) {
  table {
    border: 0;
  }
  table caption {
    font-size: 1.3em;
  }
  table thead {
    border: none;
    clip: rect(0 0 0 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
    color: red;
    background-color:#000;
  }
  table tr {
    border-bottom: 3px solid #ddd;
    display: block;
    margin-bottom: .625em;
  }
  table td {
    border-bottom: 1px solid #ddd;
    display: block;
    font-size: .8em;
    text-align: right;
  }
  table td:before {
    /*
    * aria-label has no advantage, it won't be read inside a table
    content: attr(aria-label);
    */
    content: attr(data-label);
    float: left;
    font-weight: bold;
    text-transform: uppercase;
  }
  table td:last-child {
    border-bottom: 0;
  }
  table td:first-child{
    color:white;
    background: #000;
  }
}
<table>
  <caption>Statement Summary</caption>
  <thead>
    <tr>
      <th scope="col">Account</th>
      <th scope="col">Estimated arrival date</th>
      <th scope="col">Amount</th>
      <th scope="col">Period</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td data-label="Account">Visa - 3412</td>
      <td data-label="Really freaking long div magic">04/01/2016</td>
      <td data-label="Amount">$1,190</td>
      <td data-label="Period">03/01/2016 - 03/31/2016</td>
    </tr>
    <tr>
      <td scope="row" data-label="Account">Visa - 6076</td>
      <td data-label="Due Date">03/01/2016</td>
      <td data-label="Amount">$2,443</td>
      <td data-label="Period">02/01/2016 - 02/29/2016</td>
    </tr>
    <tr>
      <td scope="row" data-label="Account">Corporate AMEX</td>
      <td data-label="Due Date">03/01/2016</td>
      <td data-label="Amount">$1,181</td>
      <td data-label="Period">02/01/2016 - 02/29/2016</td>
    </tr>
</tbody>
</table>

使用每个相应表格单元格上的 data-label 属性来表示列标题。在 CSS 中,它被称为内容:attr(data-label)。我将这种样式应用于一些相当大的表格,我不想为 HTML 中的每个单元格编写数据标签。有没有办法使用 Javascript 将 th 拉入 data-label 属性?

【问题讨论】:

    标签: javascript html css html-table responsive


    【解决方案1】:

    你想让表格从这个开始吗:

    | Account | Estimated arrival date | Amount | Period |
    | ------- | ---------------------- | ------ | ------ |
    |    1234 |             03/15/2001 |  $1.00 |    3rd |
    |    1235 |             04/21/2002 | $12.00 |    4th |
    |    4594 |             11/11/2011 | $45.00 |    2nd |
    

    这个?:

    -----------
    Account: 1234
    Estimated Arrival Date: 03/15/2001
    Amount: $1.00
    Period: 3rd
    -----------
    Account: 1235
    Estimated Arrival Date: 04/21/2002
    Amount: $12.00
    Period: 4th
    -----------
    Account: 4594
    Estimated Arrival Date: 11/11/2011
    Amount: $45.00
    Period: 2nd
    -----------
    

    更新 试试这个代码:

    function toggle() {
      var table = document.querySelector('.my-table');
      table.classList.toggle('show-thin');
    }
    .table {
      border-collapse: collapse;
      display: inline-table;
    }
    
    .tr {
      display: table-row;
    }
    
    .th, .td {
      display: table-cell;
      border: 1px solid #555;
      padding: 3px 6px;
    }
    
    .th {
      background-color: #ddd;
      font-weight: bold;
      text-align: center;
    }
    
    .td {
      text-align: right;
    }
    
    .my-table.show-thin {
      display: block;
    }
    
    .show-thin .tr {
      border-bottom: 1px solid black;
      display: block;
      margin-bottom: 2px;
      padding-bottom: 2px;
    }
    
    .show-thin .td {
      border: none;
      display: block;
      padding: 0;
      text-align: left;
    }
    
    .show-thin .td:before {
      content: attr(title) ':';
      display: inline-block;
      font-weight: bold;
      padding-right: 5px;
    }
    
    .show-thin .thin-hide {
      display: none;
    }
    <button onclick="toggle()">Toggle</button>
    <hr/>
    <div class="my-table">
    <div class="tr thin-hide">
      <span class="th">Account</span>
      <span class="th">Estimated arrival date</span>
      <span class="th">Amount</span>
      <span class="th">Period</span>
    </div>
    <div class="tr">
      <span class="td" title="Account">1234</span>
      <span class="td" title="Estimated Arrival Date">03/15/2001</span>
      <span class="td" title="Amount">$1.00</span>
      <span class="td" title="Period">3rd</span>
    </div>
    <div class="tr">
      <span class="td" title="Account">1235</span>
      <span class="td" title="Estimated Arrival Date">04/21/2002</span>
      <span class="td" title="Amount">$12.00</span>
      <span class="td" title="Period">4th</span>
    </div>
    <div class="tr">
      <span class="td" title="Account">4594</span>
      <span class="td" title="Estimated Arrival Date">11/11/2011</span>
      <span class="td" title="Amount">$45.50</span>
      <span class="td" title="Period">2nd</span>
    </div>
    </div>

    我的示例使用一个类将值从表格格式更改为行格式。但它也可以使用媒体查询来完成。这只是更容易演示。

    诀窍是在每个单元格上放置title 属性。然后在精简模式下使用 CSS 显示title


    这显示了表格在宽模式下的样子


    这显示了瘦模式下的情况


    当您查看这两个图像时,您会看到标准表格格式使用术语“预计到达日期”,第一个工作大写。精简版使用“Estimated Arrival Date”,所有单词都大写。这是为了表明价值来自不同的地方。

    在宽模式下,标题来自这里:

    <div class="tr thin-hide">
      <span class="th">Account</span>
      <span class="th">Estimated arrival date</span>
      <span class="th">Amount</span>
      <span class="th">Period</span>
    </div>
    

    在瘦模式下,它来自title 属性。

    如果您尝试使用&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;td&gt; 标签,这将不起作用。

    【讨论】:

    • 我更改了我的代码以包含一些适合您需要的代码。
    • 我的主要问题是我想将这种响应式样式应用于一些相当大的数据表,我不想进入 HTML 并设置数据标签或标题属性每个细胞。所以我希望使用 Javascript 根据所有适用 的 内容设置该属性。
    【解决方案2】:

    我的 jQuery 解决方案似乎有效(可选:我跳过任何带有 colspans 的表格单元格):

        $('.myDiv table').each(function (index, value) {
        var headerCount = $(this).find('thead th').length;
    
        for (i = 0; i <= headerCount; i++) {
            var headerLabel = $(this).find('thead th:nth-child(' + i + ')').text();
    
            $(this).find('tr td:not([colspan]):nth-child(' + i + ')').replaceWith(
                function () {
                    return $('<td data-label="' + headerLabel + '">').append($(this).contents());
                }
            );
        }
    
    });
    

    【讨论】:

      【解决方案3】:

      这个小代码 jQuery 复制 attr "data-label" TH 到 TD

      $('table th').each(function(i,elem) {
        var num = i + 1;
        $('table td:nth-child(' + num + ')').attr('data-label', $(elem).text());
      });
      

      【讨论】:

        猜你喜欢
        • 2020-01-21
        • 2020-02-15
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        相关资源
        最近更新 更多