it-swarm.com.ru

Colspan все столбцы

Как я могу указать, что тег td должен охватывать все столбцы (когда точное количество столбцов в таблице будет переменным/трудно определить, когда будет отображаться HTML)? w3schools упоминает, что вы можете использовать colspan="0", но в нем точно не указано, какие браузеры поддерживают это значение (IE 6 есть в нашем списке для поддержки).

Похоже, что установка colspan в значение, превышающее теоретическое количество столбцов, которое вы можете иметь, будет работать, но оно не будет работать, если для table-layout установлено fixed. Есть ли недостатки использования автоматической разметки с большим числом для colspan? Есть ли более правильный способ сделать это?

346
Bob

У меня есть IE 7.0, Firefox 3.0 и Chrome 1.0

Атрибут colspan = "0" в TD имеет значение НЕ охватывает для всех TD в в любом из указанных выше браузеров.

Возможно, не рекомендуется в качестве правильной практики разметки, но если вы укажете более высокое значение colspan, чем общее возможное количество столбцов в других строках, то TD охватит все столбцы.

Это НЕ работает, когда свойство CSS макета таблицы установлено на фиксированное значение.

Опять же, это не идеальное решение, но, похоже, оно работает в вышеупомянутых 3 версиях браузера, когда свойство CSS макета таблицы является автоматическим . Надеюсь это поможет.

244
Nahom Tijnam

Просто используйте это:

colspan="100%"

Он работает в Firefox 3.6, IE 7 и Opera 11! (и я думаю, на других, я не мог попробовать)


Предупреждение: как уже упоминалось в комментариях ниже, это фактически то же самое, что и colspan="100". Следовательно, это решение будет работать для таблиц с css table-layout: fixed или более 100 столбцов.

250
Cluxter

Если вы хотите создать ячейку 'title', охватывающую все столбцы, в качестве заголовка для вашей таблицы, вы можете использовать тег заголовка ( http://www.w3schools.com/tags/tag_caption.asp / https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption ) Этот элемент предназначен для этой цели. Он ведет себя как div, но не охватывает всю ширину родительского элемента таблицы (как div сделал бы в той же позиции (не пытайтесь сделать это дома!)), Вместо этого он охватывает ширину Таблица. Есть некоторые межбраузерные проблемы с границами и тому подобное (было приемлемо для меня). В любом случае, вы можете заставить его выглядеть как ячейка, которая охватывает все столбцы. Внутри вы можете создавать строки, добавляя элементы div. Я не уверен, что вы можете вставить его между tr-элементами, но я думаю, это было бы хаком (поэтому не рекомендуется). Другим вариантом будет возиться с плавающими div, но это гадость!

Делать

<table>
    <caption style="gimme some style!"><!-- Title of table --></caption>
    <thead><!-- ... --></thead>
    <tbody><!-- ... --></tbody>
</table>

Не

<div>
    <div style="float: left;/* extra styling /*"><!-- Title of table --></div>
    <table>
        <thead><!-- ... --></thead>
        <tbody><!-- ... --></tbody>
    </table>
    <div style="clear: both"></div>
</div>
63
Akira

Для IE 6 вам нужно будет равняться colspan количеству столбцов в вашей таблице. Если у вас есть 5 столбцов, вам понадобится: colspan="5".

Причина в том, что IE обрабатывает colspans по-другому, он использует спецификацию HTML 3.2:

IE реализует определение HTML 3.2, он устанавливает colspan=0 как colspan=1.

Ошибка хорошо задокументирована .

14
George Stocker

В качестве частичного ответа, вот несколько моментов о colspan="0", который был упомянут в вопросе.

tL; DR версия:

colspan="0" не работает ни в одном браузере. W3Schools не так (как обычно). HTML 4 говорит, что colspan="0" должен заставить столбец охватывать всю таблицу, но никто не реализовал это, и он был удален из спецификации после HTML 4.

Еще несколько подробностей и доказательств:

  • Все основные браузеры рассматривают его как эквивалент colspan="1".

    Вот демонстрация, показывающая это; попробуйте это в любом браузере, который вам нравится.

    td {
      border: 1px solid black;
    }
    <table>
      <tr>
        <td>ay</td>
        <td>bee</td>
        <td>see</td>
      </tr>
      <tr>
        <td colspan="0">colspan="0"</td>
      </tr>
      <tr>
        <td colspan="1">colspan="1"</td>
      </tr>
      <tr>
        <td colspan="3">colspan="3"</td>
      </tr>
      <tr>
        <td colspan="1000">colspan="1000"</td>
      </tr>
    </table>
  • Спецификация HTML 4 (теперь старая и устаревшая, но актуальная, когда задавался этот вопрос) действительно действительно сказала что colspan="0" должен обрабатываться как охватывающий все столбцы:

    Нулевое значение ("0") означает, что ячейка охватывает все столбцы от текущего столбца до последнего столбца группы столбцов (COLGROUP), в которой определена ячейка.

    Однако большинство браузеров никогда не реализовывали это.

  • HTML 5.0 (рекомендованный кандидатом еще в 2012 году), жизненный стандарт WhatWG HTML (доминирующий сегодня стандарт) и новейшая спецификация W3 HTML 5 не содержат формулировку, приведенную выше в HTML 4, и единодушно соглашаются с тем, что colspan из 0 не допускается, с этой формулировкой, которая появляется во всех трех спецификациях:

    Элементы td и th могут иметь заданный атрибут содержимого colspan, значение которого должно быть действительным неотрицательным целым числом, большим нуля ...

    Источники:

  • Следующие утверждения от страница W3Schools, на которую ссылается вопрос - по крайней мере в наши дни - полностью ложны:

    Только Firefox поддерживает colspan = "0", что имеет особое значение ... [Он] говорит браузеру, чтобы охватить ячейку до последнего столбца группы столбцов (colgroup)

    а также

    Различия между HTML 4.01 и HTML5

    НИКТО.

    Если вы еще не знаете, что веб-разработчики, как правило, неуважительно относятся к W3Schools, за их частые неточности, подумайте, почему.

11
Mark Amery

Если вы используете jQuery (или не против его добавления), это сделает работу лучше, чем любой из этих хаков.

function getMaxColCount($table) {
    var maxCol = 0;

    $table.find('tr').each(function(i,o) {
        var colCount = 0;
        $(o).find('td:not(.maxcols),th:not(.maxcols)').each(function(i,oo) {
            var cc = Number($(oo).attr('colspan'));
            if (cc) {
                colCount += cc;
            } else {
                colCount += 1;
            }
        });
        if(colCount > maxCol) { maxCol = colCount };
    });

    return maxCol;

}

Чтобы упростить реализацию, я украшаю любой td/th, который мне нужен, с помощью класса, такого как "maxCol", тогда я могу сделать следующее:

$('td.maxcols, th.maxcols').each(function(i,o) {
    $t = $($(o).parents('table')[0]); $(o).attr('colspan',  getMaxColCount($t));
});

Если вы найдете реализацию, для которой это не сработает, не хлопайте ответом, объясните в комментариях, и я обновлю информацию, если она будет рассмотрена.

11
rainabba

Другое рабочее, но уродливое решение: colspan="100", где 100 - это значение, превышающее общее количество столбцов, которое необходимо colspan.

Согласно W3C, опция colspan="0" действительна только с тегом COLGROUP.

4
Raptor

Ниже приведено краткое решение es6 (аналогично ответ Rainbabba , но без jQuery).

Array.from(document.querySelectorAll('[data-colspan-max]')).forEach(td => {
    let table = td;
    while (table && table.nodeName !== 'TABLE') table = table.parentNode;
    td.colSpan = Array.from(table.querySelector('tr').children).reduce((acc, child) => acc + child.colSpan, 0);
});
html {
  font-family: Verdana;
}
tr > * {
  padding: 1rem;
  box-shadow: 0 0 8px gray inset;
}
<table>
<thead>
  <tr>
    <th>Header 1</th>
    <th>Header 2</th>
    <th>Header 3</th>
    <th>Header 4</th>
    <th>Header 5</th>
    <th>Header 6</th>
  </tr>
</thead>
<tbod><tr>
  <td data-colspan-max>td will be set to full width</td>
</tr></tbod>
</table>
2
Sjeiti