Colspan все столбцы

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

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

Принятый ответ заключается в том, как НЕ делать этого, и, похоже, он имеет серьезные недостатки в производительности / согласованности. Думаю, ответ таков: жестко запрограммируйте количество столбцов. Я не вижу жизнеспособной альтернативы.

Andrew Koster 10.05.2019 22:11

Отличный вопрос, но вы должны просто не принимать ни одного ответа, если ни один из них не является правильным.

HoldOffHunger 02.10.2020 17:46
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
417
2
304 922
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

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

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

IE implements the HTML 3.2 definition, it sets colspan=0 as colspan=1.

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

Количество столбцов может быть различным, я обновлю свой вопрос, чтобы включить это замечание.

Bob 30.12.2008 00:43

Хотя совет в верхнем абзаце кажется разумным, я думаю, что многие детали здесь не совсем правильны. Спецификация HTML 3.2 говорит, что colspan должны быть целыми числами положительный, что делает colspan=0 незаконным; нигде не говорится, что colspan=0 должен обрабатываться как colspan=1 (хотя я уверен, что IE 6 именно так и делает). Кроме того, цитата нет (больше?) На странице форума, на которую вы ссылаетесь, и большинство результатов поиска Google (сейчас?) Полностью посвящены ошибкам, связанным с разные IE 6 colspan.

Mark Amery 16.09.2018 20:13
Ответ принят как подходящий

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

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

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

Это НЕ работает, если для свойства CSS table-layout установлено значение fixed.

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

Если вы укажете строгий тип документа в самом начале html, Firefox 3 отобразит colspan в соответствии со спецификациями html 4.01.

Eineki 30.12.2008 02:28

Я фанат colspan = "42", который охватывает весь диапазон. Очевидно, это проблема для> 42 столбцов, но это одно из немногих магических чисел, которые я одобряю.

Martin 14.01.2013 23:43

Я настоятельно рекомендую вам поставить colspan = <точное правильное число>. Я только что столкнулся с огромной ошибкой производительности в Firefox, на выяснение которой у меня ушел целый день. Произвольно большой colspan заставит FF подавиться на большом столе с помощью border-collapse: collapse. Моя таблица с 800 строками и 8 столбцами отображалась за 5 секунд. При правильном colspan время возвращается к разумной 1 секунде. bugzilla.mozilla.org/show_bug.cgi?id=675417

InfinitiesLoop 04.06.2013 04:50

Я рекомендую не использовать этот метод. Только что получил очень странный результат от Chrome на OSX (столбцы перекрывают друг друга).

Tzach 25.11.2014 19:07

еще одна проблема, обнаруженная в Chrome: если вы попытаетесь задать границу элементу TR, содержащему TD "слишком большого размера", правая граница не будет видна.

Massimo 03.02.2016 00:51

Подход не работает на Chrome v54. Уменьшает масштаб столбцов, чтобы они казались очень узкими слева.

Dan Solovay 03.11.2016 16:55

Использование больших чисел может испортить CSS, например свойство border-right. Я предполагаю, что граница пытается заканчиваться на самом дальнем столбце, даже если он не используется и просто colspan.

bryc 21.01.2017 01:02

Те браузеры, о которых вы говорите, отстают почти на ШЕСТЬ версий. Firefox имеет версию 62, а Chrome - версию 69. На некоторых клиентских базах могут быть старые браузеры, но не думаю, что большинству сайтов нужно обслуживать машины, которые каким-то образом отключили обновления своих браузеров и оставили это так на ДЕСЯТЬ ЛЕТ. Этому ответу тоже десять лет, но, к сожалению, вопрос, на который он отвечает, все еще актуален.

Andrew Koster 17.09.2018 22:52

Установка для colspan значения, превышающего фактический номер столбца, также нарушит работу программ чтения с экрана, поскольку они объявят colspan, а не фактическое количество столбцов.

deltragon 08.06.2020 20:09
дают более высокое значение colspan, чем общее возможное число. колонн Не работает в Microsoft Edge.
HoldOffHunger 02.10.2020 17:41

Может, я прямолинейный мыслитель, но немного озадачен, разве вы не знаете номер столбца в своей таблице?

Кстати, IE6 не соблюдает colspan = "0", с определенной группой colgroup или без нее. Я также пытался использовать thead и th для создания групп столбцов, но браузер не распознает форму colspan = "0".

Я пробовал использовать Firefox 3.0 в Windows и Linux, и он работает только со строгим типом документа.

Проверить тест на нескольких баузерах можно на

http://browsershots.org/http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

Я нашел здесь тестовую страницу http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

Обновлено: скопируйте и вставьте ссылку, форматирование не примет части двойного протокола в ссылке (или я не настолько умен, чтобы правильно ее отформатировать).

Я согласен с первой частью: конечно, вы могли бы вычислить, сколько ячеек у вас будет в ряду? Как еще вы могли бы его создать?

nickf 24.09.2009 15:11

Не обязательно, у меня есть приложение с динамически сгенерированной таблицей AJAX, и количество столбцов может меняться от обратного вызова к обратному вызову. Кроме того, при разработке вы можете «знать» количество столбцов, но это может измениться, и вы просто знать пропустите один из них.

Mad Halfling 05.05.2010 15:37

Кроме того, если вы добавите столбцы позже, вы можете забыть изменить colspan, лучше, чтобы он всегда был максимальным.

Adam 23.09.2010 01:20

попробуйте использовать colSpan вместо colspan. IE нравится версия camelBack ...

только при использовании IE и настройке через JavaScript и .setAttribute ('colSpan', int); Обратите внимание, что это было исправлено в IE8 (только в режиме stds).

scunliffe 22.03.2010 19:20

+1 - Я этого не знал, и это очень помогло! Я не думал, что colSpan вообще работает в IE6.

mwilcox 11.11.2010 20:53

Если вы хотите сделать ячейку «заголовок», охватывающую все столбцы, в качестве заголовка для вашей таблицы, вы можете использовать тег заголовка (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>

Именно то, что я искал, - разместить элементы управления разбивкой на страницы в нижней части таблицы данных. Работает отлично. Большое спасибо.

Comencau 10.08.2015 19:10

Это не сработает, если вы хотите охватить все столбцы в середине таблицы ... например, сгруппировать по разделителю между связанными группами строк. (Хром)

David Hempy 16.10.2015 23:15

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

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

colspan = "100" (например, сверх предела) в некоторых случаях может вызывать очень странную визуализацию таблицы (я попытаюсь найти некоторые тестовые примеры и опубликовать URL-адреса)

scunliffe 22.03.2010 19:19

-1 потому что, насколько я могу судить, утверждение в последнем абзаце является ложным. HTML 4 позволяет <td> иметь colspan = "0" (см. w3.org/TR/REC-html40/struct/tables.html#adef-colspan), тогда как HTML 5.0 не разрешает span = "0" на colgroup (см. w3.org/TR/html50/tabular-data.html#attr-colgroup-span, где указано, что "значение атрибута [значений] содержимого диапазона должно быть действительным неотрицательным целым числом больше нуля".).

Mark Amery 16.09.2018 20:32

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

colspan = "100%"

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


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

Протестировано [дополнительно] в IE6 - IE8, Chrome [на ПК и Mac], Firefox 4.0 [ПК и Mac], Safari 5 [ПК и Mac]

hndcrftd 06.05.2011 21:55

Как это до сих пор так неясно? Это надо кричать на каждом углу !!! Я уже довольно давно боролся с этой проклятой проблемой colspan в разное время

hndcrftd 06.05.2011 21:56

В chrome и firefox colspan = "3%" обрабатывается так же, как colspan = "3".

zpmorgan 21.05.2011 23:49

@zpmorgan, поэтому мы должны предположить, что 100% - это то же самое, что и 100, и, следовательно, работает правильно только из-за ответа выше?

Angry Dan 12.08.2011 17:20

@zpmorgan и @Sprog, вы правы! colspan = "100%" означает именно colspan = "100".

NemoStein 13.09.2011 18:35

Лол, я был очень рад, наконец, увидеть последовательное кросс-браузерное решение этой проблемы, только чтобы через комментарии обнаружил, что это действительно обманчивый, не работающий так, как ожидалось :( Я думаю, он не заслуживает большего количества голосов чем принятый ответ = /

Francisco 28.12.2011 19:07

@Francisco, однако, 100% семантически более правильно, поэтому механизм, с помощью которого он работает, возможно, не так важен? Если, конечно, у вас есть таблица с> 100 столбцами (ой).

Jonathan Day 13.03.2012 13:06

В хроме при установке colspan = '100%' я теряю правую границу таблицы

Omu 30.10.2012 00:27

Как сказал Ому, это может вызвать проблемы с границами таблицы, особенно когда задействовано пространство ячеек. Так что, если вы разборчивы в своих таблицах (Oh My! Tables ...), то это решение не работает.

teynon 17.01.2013 20:13

Я использовал этот подход и никогда не знал, что это означает 100 столбцов и что% фактически игнорируется. Я думаю, было бы здорово, если бы браузеры действительно реализовали это, поэтому я буду придерживаться 100%. Плюс, я думаю, что если у вас таблица с более чем 100 столбцами, то у вас на руках другая проблема :)

jamiebarrow 11.03.2013 20:11

@JonathanDay: Это совсем не семантически более корректно, это семантически абсолютно вводит в заблуждение. Это означает нечто совершенно иное, чем то, на что похоже. Это в значительной степени запутывание того, что происходит, и то, что это работает в ситуациях некоторый (только для table-layout: automatic), не делает его лучше.

sth 03.07.2013 19:57

@jamiebarrow Думаю, вы правы. Если вы запустите эту конструкцию и валидатор HTML5, он сообщит о наличии символа «%» как об ошибке. Спецификация кажется довольно ясной, что ее там не должно быть: w3.org/html/wg/drafts/html/master/…

killthrush 20.09.2013 20:51

Это не работает при использовании границ в таблице + td, установка 100% показывает пустое пространство справа от последнего столбца, удаляя границу.

MKN Web Solutions 31.07.2019 19:50

Работает на Chrome версии 77.0.3865.90!

Gustavo Amaro 09.10.2019 18:48

@GustavoAmaro: Начиная с Chrome v78.0.3904.108, он все еще работает только для 100 столбцов (как уже говорилось в других комментариях)

nitzel 21.11.2019 14:35

конечно, он работает только для 100 столбцов, он просто интерпретирует его как 100. Если вам нужно больше столбцов, просто используйте большее число. и не беспокойтесь о знаке процента.

stackers 04.03.2021 23:46

Просто хочу добавить свой опыт и ответить на это. Примечание. Это работает только тогда, когда у вас есть предопределенные table и tr с th, но они загружаются в ваши строки (например, через AJAX) динамически.

В этом случае вы можете подсчитать количество th в вашей первой строке заголовка и использовать это для охвата всего столбца.

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

Что-то вроде этого в jQuery, где table - ваша таблица ввода:

var trs = $(table).find("tr");
var numberColumns = 999;
if (trs.length === 1) {
    //Assume having one row means that there is a header
    var headerColumns = $(trs).find("th").length;
    if (headerColumns > 0) {
        numberColumns = headerColumns;
    }
}

Как и решение JavaScript, опубликованное до этого, это плохо обобщается; количество th не обязательно количество столбцов, так как некоторые из них могут иметь набор colspan, и поэтому это не будет работать так, как написано для всех.

Mark Amery 16.09.2018 20:54

Если вы используете 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));
});

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

Было бы здорово, если бы у вас была ванильная версия JS

jpaugh 15.09.2015 19:54

У вас есть общий вариант использования, в котором отсутствует поддержка $ (selector), или вы просто не хотите его использовать?

rainabba 17.09.2015 00:48

Ни один. Мне просто интересно, добавляет ли здесь jQuery какую-либо пользу; это довольно серьезная предпосылка, и, похоже, она используется здесь минимально.

jpaugh 17.09.2015 03:17

Справедливо. Между jQuery и Angular у меня редко бывают эти инструменты, поэтому я использую их по умолчанию. Но пока я оставлю это кому-нибудь другому, чтобы он мог придумать ванильную версию.

rainabba 18.09.2015 19:46

Поскольку jQuery несколько устарел, я добавил версию / ответ es6 (не хотел обновлять этот ответ совершенно другим кодом).

Sjeiti 08.10.2018 15:26

Если я правильно понимаю код, он вычислит getMaxColCount () для каждой ячейки в таблице. это не очень эффективно ...

Nadav 05.12.2019 19:45

Согласно спецификации colspan = "0" должен приводить к ширине таблицы td.

Однако это верно только в том случае, если ваша таблица имеет ширину! Таблица может содержать строки разной ширины. Итак, единственный случай, когда рендерер знает ширину таблицы, если вы определить группу! В противном случае результат colspan = "0" невозможно определить ...

http://www.w3.org/TR/REC-html40/struct/tables.html#adef-colspan

Я не могу протестировать его в старых браузерах, но это часть спецификации начиная с 4.0 ...

"это часть спецификации начиная с 4.0" - Нет, не совсем. Это было - часть спецификации, но это было удалено в HTML 5, а значение colspan 0 было признано незаконным. И w3.org/TR/html50/… (спецификация HTML 5.0), и html.spec.whatwg.org/multipage/… (последняя версия WhatWG HTML Living Standard) заявляют, что colspan должен быть больше нуля. И, как отмечено в других ответах здесь, браузеры никогда не реализовывали старое поведение HTML 4, которое вы цитируете.
Mark Amery 10.09.2018 17:42

В качестве частичного ответа, вот несколько моментов о 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" следует рассматривать как охватывающий все столбцы:

    The value zero ("0") means that the cell spans all columns from the current column to the last column of the column group (COLGROUP) in which the cell is defined.

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

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

    The td and th elements may have a colspan content attribute specified, whose value must be a valid non-negative integer greater than zero ...

    Источники:

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

    Only Firefox supports colspan = "0", which has a special meaning ... [It] tells the browser to span the cell to the last column of the column group (colgroup)

    а также

    Differences Between HTML 4.01 and HTML5

    NONE.

    Если вы еще не знаете, что веб-разработчики обычно презирают W3Schools за его частые неточности, рассмотрите этот урок, чтобы понять, почему.

Ха-ха, мне нравится, как полезные функции API просто полностью удаляются, когда никто не пытается их реализовать. Потрясающий процесс.

Andrew Koster 10.05.2019 22:12

Ниже представлено краткое решение 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>

используйте colspan = "100%" в ячейке таблицы, и он работает нормально.

colspan = "100%"

Этот ответ уже дан здесь stackoverflow.com/a/5028091/6127393 и в настоящее время является наиболее популярным ответом на этот вопрос, которому уже 9 лет. Также сниппеты предназначены для полных рабочих примеров, а не для недопустимых фрагментов кода.

Arleigh Hix 02.10.2020 11:06

Решение CSS было бы идеальным, но я не смог его найти, поэтому вот решение JavaScript: для элемента tr с заданным классом разверните его, выбрав полную строку, подсчитав элементы td и их атрибуты colSpan, и просто установка расширенного ряда с помощью el.colSpan = newcolspan;. Вот так...

var headertablerows = document.getElementsByClassName('max-col-span');

[].forEach.call(headertablerows, function (headertablerow) {
    var colspan = 0;
    [].forEach.call(headertablerow.nextElementSibling.children, function (child) {
        colspan += child.colSpan ? parseInt(child.colSpan, 10) : 1;
    });
    
    headertablerow.children[0].colSpan = colspan;
});
html {
  font-family: Verdana;
}
tr > * {
  padding: 1rem;
  box-shadow: 0 0 8px gray inset;
}
  <table>
    <tr class = "max-col-span">
      <td>1 - max width
      </td>
    </tr>
    <tr>
      <td>2 - no colspan
      </td>
      <td colspan = "2">3 - colspan is 2
      </td>
    </tr>
  </table>

Возможно, вам придется отрегулировать это, если вы используете таблицу headers, но это должно дать доказательный подход, который использует 100% чистый JavaScript.

Другие вопросы по теме