покажите/скройте столбцы таблицы HTML с помощью CSS

Я хочу отобразить основную таблицу HTML со средствами управления для переключения показа/сокрытия дополнительных столбцов:

<table id="mytable">
    <tr>
        <th>Column 1</th>
        <th class="col1">1a</th>
        <th class="col1">1b</th>
        <th>Column 2</th>
        <th class="col2">2a</th>
        <th class="col2">2b</th>
    </tr>
    <tr>
        <td>100</td>
        <td class="col1">40</td>
        <td class="col1">60</td>
        <td>200</td>
        <td class="col2">110</td>
        <td class="col2">90</td>
    </tr>
</table>

Таким образом, Столбец 1 и Столбец 2 будут единственными столбцами, отображенными по умолчанию - но когда Вы нажмете на Столбец 1, я хочу 1a и 1b переключиться, и то же со Столбцом 2 с 2a и 2b. Я могу закончить с большим количеством столбцов и большим количеством строк - таким образом, любые подходы цикличного выполнения JavaScript также не спешили работать с тем, когда я протестировал.

Единственный подход, который, кажется, достаточно быстр, должен настроить некоторую CSS как это:

table.hide1 .col1 { display: none; }
table.hide2 .col2 { display: none; }
table.hide3 .col3 { display: none; }

table.show1 .col1 { display: table-cell; }
table.show2 .col2 { display: table-cell; }
table.show3 .col3 { display: table-cell; }

И затем настроенные onClick вызовы функции на ячейках заголовка таблицы, которые инициируют переключатель - и определят, какой класс CSS установить "mytable" на это создаст эффект переключателя, который я ищу. Существует ли простой способ настроить это так, чтобы код мог работать на n # столбцов?

Обновление

Вот то, что я придумал, работает отлично - и действительно быстро. Сообщите мне, можно ли думать о способах улучшиться.

CSS

.col1 {display: none; }
.col2 {display: none; }
.col3 {display: none; }

table.show1 .col1 { display: table-cell; }
table.show2 .col2 { display: table-cell; }
table.show3 .col3 { display: table-cell; }

JavaScript

function toggleColumn(n) {
    var currentClass = document.getElementById("mytable").className;
    if (currentClass.indexOf("show"+n) != -1) {
        document.getElementById("mytable").className = currentClass.replace("show"+n, "");
    }
    else {
        document.getElementById("mytable").className += " " + "show"+n;
    }
}

И отрывок HTML:

<table id="mytable">
<tr>
    <th onclick="toggleColumn(1)">Col 1 = A + B + C</th>
    <th class="col1">A</th>
    <th class="col1">B</th>
    <th class="col1">C</th>
    <th onclick="toggleColumn(2)">Col 2 = D + E + F</th>
    <th class="col2">D</th>
    <th class="col2">E</th>
    <th class="col2">F</th>
    <th onclick="toggleColumn(3)">Col 3 = G + H + I</th>
    <th class="col3">G</th>
    <th class="col3">H</th>
    <th class="col3">I</th>
</tr>
<tr>
    <td>20</td>
    <td class="col1">10</td>
    <td class="col1">10</td>
    <td class="col1">0</td>
    <td>20</td>
    <td class="col2">10</td>
    <td class="col2">8</td>
    <td class="col2">2</td>
    <td>20</td>
    <td class="col3">10</td>
    <td class="col3">8</td>
    <td class="col3">2</td>
</tr>
</table>
36
задан Christopher Rapcewicz 10 December 2013 в 18:29
поделиться

2 ответа

Нет, это все. Теоретически вы могли бы использовать visibility: collapse для некоторых s, чтобы сделать это, но поддержка браузером не вся там.

Чтобы немного улучшить то, что у вас есть, вы можете использовать table-layout: fixed в

, чтобы браузер мог использовать более простой, быстрый и предсказуемый алгоритм фиксированного макета таблицы. Вы также можете отбросить правила .show , например, когда ячейка не сделана display: none правилом .hide , она будет автоматически отображаться : таблица-ячейка . Разрешение возврата к отображению таблицы по умолчанию вместо его явной установки позволяет избежать проблем в IE <8, где значения отображения таблицы не поддерживаются.

20
ответ дан 27 November 2019 в 05:46
поделиться

Я не думаю, что можно что-то сделать, чтобы избежать того, что вы уже делаете, однако, если вы создаете таблицу на клиенте с помощью javascript, вы всегда можете добавить правила стиля динамически, так что вы можете позволить любое количество столбцов, не загромождая ваш css файл всеми этими правилами. Смотрите http://www.hunlock.com/blogs/Totally_Pwn_CSS_with_Javascript, если вы не знаете, как это сделать.

Редактировать: Для вашего "липкого" переключателя вы должны просто добавить имена классов, а не заменять их. Например, вы можете дать ему имя класса "hide2 hide3" и т.д. Я не думаю, что вам действительно нужны классы "show", поскольку они будут использоваться по умолчанию. Библиотеки вроде jQuery облегчают эту задачу, но в отсутствие таковых может помочь функция вроде этой:

var modifyClassName = function (elem, add, string) {
var s = (elem.className) ? elem.className : "";
var a = s.split(" ");
if (add) {
  for (var i=0; i<a.length; i++) {
      if (a[i] == string) {
          return;
          }
      }
  s += " " + string;
  }
else {
    s = "";
    for (var i=0; i<a.length; i++) {
        if (a[i] != string)
            s += a[i] + " "; 
        }
    }
elem.className = s;
}
1
ответ дан 27 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: