В настоящее время у меня есть таблица на моей странице, и я пытаюсь заморозить первый столбец. Столбец freeze работает нормально, используя position: fixed для этого конкретного столбца.

Однако есть еще одна проблема. Если у содержимого более одной строки, <tr> не увеличивает свою высоту в зависимости от содержимого. Следовательно, есть ли решение для этого?

Вот мое демо: https://jsfiddle.net/yusrilmaulidanraji/ckfdubsf/121/

#table-wrapper {
  width: 95%;
  float: left;
  overflow-x: scroll;
  background: #ddd;
}

table {
  background: #fff;
  width: 1200px;
  text-align: center;
  overflow: hidden;
  position: relative;
}

table thead tr th {
  width: 15em;
}

table thead tr th:first-child,
table tbody tr td:first-child {
  top: auto;
  left: 0.5;
  position: fixed;
  width: 6em;
}

table thead tr th:nth-child(2),
table tbody tr td:nth-child(2) {
  padding-left: 7em;
  /*to show second column behind the first*/
}
<button id="left">&larr;</button>
<button id="right">&rarr;</button>

<div id="table-wrapper">
  <table border="1">
    <thead>
      <tr>
        <th>Heading1</th>
        <th>Heading2</th>
        <th>Heading3</th>
        <th>Heading4</th>
        <th>Heading5</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>1<br/>asdasdada</td>
        <td>12</td>
        <td>13</td>
        <td>14</td>
        <td>15</td>
      </tr>
      <tr>
        <td>2<br/>asdasdada<br/>asdasdada</td>
        <td>22</td>
        <td>23</td>
        <td>24</td>
        <td>25</td>
      </tr>
      <tr>
        <td>3<br/>asdasdada</td>
        <td>32</td>
        <td>33</td>
        <td>34</td>
        <td>35</td>
      </tr>
      <tr>
        <td>4<br/>asdasdada<br/>asdasdada<br/>asdasdada<br/>asdasdada<br/>asdasdada</td>
        <td>42</td>
        <td>43</td>
        <td>44</td>
        <td>45</td>
      </tr>
      <tr>
        <td>5<br/>asdasdada</td>
        <td>52</td>
        <td>53</td>
        <td>54</td>
        <td>55</td>
      </tr>
    </tbody>
  </table>

</div>
1
Yusril Maulidan Raji 19 Окт 2017 в 17:50

3 ответа

Лучший ответ

Вы можете просмотреть все фиксированные элементы td, а затем установить для этих высот значения td по умолчанию.

  $('table tbody tr td:first-child').each(function(){
      var height = $(this).height();
      $(this).parent().find('td').height(height);
  });

Рабочий пример https://jsfiddle.net/ckfdubsf/122/

1
feesar 19 Окт 2017 в 14:57

В итоге я воспользовался ответом @feesar, однако у меня возникла другая проблема с производительностью. Поэтому вот окончательный результат для моего случая: https://jsfiddle.net/yusrilmaulidanraji/ckfdubsf/124/

  // Adjust the th and td's height.
  // Improve the performance by using native js + for loop.
  var firstHeader = $('#table-wrapper th:first-child');
  firstHeader[0].style.height = firstHeader[0].parentNode.offsetHeight + "px";
  var firstColumn = $('#table-wrapper td:first-child');
  for (var i = 0; i < firstColumn.length; i++) {
    firstColumn[i].parentNode.style.height = firstColumn[i].offsetHeight + "px";
  }

Логика и результат одинаковы, но имеют лучшую производительность. Надеюсь, это может помочь.

0
Yusril Maulidan Raji 23 Окт 2017 в 10:17

С точки зрения производительности, я думаю, вам лучше всего просто клонировать первый столбец таблицы и нарисовать его над «реальным», например так:

var $overlayTable = $("#table-wrapper table").clone().addClass("overlay");
$overlayTable.find("tr > *:not(:first-child)").remove();
$overlayTable.appendTo("#table-wrapper");

$(window).on("scroll", function () {
    $overlayTable.css("left", $(window).scrollLeft() + "px");
});
#table-wrapper {
  position: relative;
}
#table-wrapper table {
  text-align: center;
  table-layout: fixed;
  overflow-x: scroll;
  width: 1200px;
  border-collapse: collapse;
}
#table-wrapper table tr > * {
  margin-left: 150px;
  width: auto;
}
#table-wrapper table tr > *:first-child {
  width: 6em;
}
#table-wrapper table.overlay {
  position: absolute;
  top: 0;
  color: red;
  background-color: white;
  width: 6em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>
  <button id="left">&larr;</button>
  <button id="right">&rarr;</button>
</p>

<div id="table-wrapper">
  <table border="1">
    <thead>
      <tr>
        <th>Heading1</th>
        <th>Heading2</th>
        <th>Heading3</th>
        <th>Heading4</th>
        <th>Heading5</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>1<br/>asdasdada</td>
        <td>12</td>
        <td>13</td>
        <td>14</td>
        <td>15</td>
      </tr>
      <tr>
        <td>2<br/>asdasdada<br/>asdasdada</td>
        <td>22</td>
        <td>23</td>
        <td>24</td>
        <td>25</td>
      </tr>
      <tr>
        <td>3<br/>asdasdada</td>
        <td>32</td>
        <td>33</td>
        <td>34</td>
        <td>35</td>
      </tr>
      <tr>
        <td>4<br/>asdasdada<br/>asdasdada<br/>asdasdada<br/>asdasdada<br/>asdasdada</td>
        <td>42</td>
        <td>43</td>
        <td>44</td>
        <td>45</td>
      </tr>
      <tr>
        <td>5<br/>asdasdada</td>
        <td>52</td>
        <td>53</td>
        <td>54</td>
        <td>55</td>
      </tr>
    </tbody>
  </table>

</div>
0
Tomalak 25 Окт 2017 в 14:39