Colspan усі стовпці


385

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

Здається, встановлення colspanзначення, що перевищує теоретичну кількість стовпців, можливо, буде працювати, але воно не буде працювати, якщо ви table-layoutвстановили fixed. Чи є недоліки використання автоматичного макета з великою кількістю для colspan? Чи є більш правильний спосіб зробити це?


Прийнята відповідь стосується того, як НЕ робити цього, і, здається, це має серйозні недоліки продуктивності / послідовності. Тому я думаю, що відповідь така: жорсткий код кількості стовпців. Я не бачу жодної життєздатної альтернативи.
Андрій Костер

Відповіді:


268

У мене є IE 7.0, Firefox 3.0 та Chrome 1.0

Атрибут colspan = "0" в TD НЕ охоплює всі TD в будь-якому з перерахованих вище браузерів .

Можливо, не рекомендується як належна практика розмітки, але якщо ви даєте більш високе значення, ніж загальне можливе. стовпців в інших рядках , тоді TD буде охоплювати всі стовпці.

Це НЕ працює, коли властивість CSS для макета таблиці встановлено на фіксовану.

Знову ж таки, це не ідеальне рішення, але, здається, працює у вищезгаданих 3-х версіях браузера, коли властивість CSS-макета таблиці є автоматичною . Сподіваюсь, це допомагає.


Якщо ви вказали строгий doctype на самому початку html Firefox 3, надайте colspan відповідно до вимог специфікації html 4.01.
Ейнекі

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

40
Настійно рекомендую поставити colspan = <точне правильне число>. Я просто потрапив у Firefox величезну помилку, яка забирала мене цілий день. Довільно великий колпас змусить ФФ задихатися на великому столі з межею-крахом: колапс. Моя таблиця з 800 рядками та 8 стовпцями займала 5 секунд, щоб відобразити. Правий кольпан повертається до розумної 1 секунди. bugzilla.mozilla.org/show_bug.cgi?id=675417
InfinitiesLoop

2
Я не рекомендую використовувати цей метод. Щойно отримав дуже дивний результат від Chrome на OSX (стовпці перекриваються один з одним).
Цач

Ще одна проблема, виявлена ​​в Chrome, якщо ви спробуєте надати межу елементу TR, який містить TD "негабаритного розміру", права межа не буде видно.
Массімо

271

Просто скористайтеся цим:

colspan="100%"

Він працює на Firefox 3.6, IE 7 та Opera 11! (і, мабуть, на інших, я не міг спробувати)


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


16
Тестовано [додатково] в IE6 - IE8, Chrome [на ПК та Mac], Firefox 4.0 [ПК та Mac], Safari 5 [ПК та Mac]
hndcrftd

11
Як це все ще так незрозуміло? Це треба кричати на кожному розі вулиці !!! Я боровся з цим проклятим кольпанським питанням у різні часи вже досить довго
hndcrftd

30
Для chrome та firefox, colspan = "3%" обробляється так само, як colspan = "3".
zpmorgan

98
@zpmorgan і @Sprog, ви праві! colspan="100%"означає точно colspan="100".
NemoStein

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

64

Якщо ви хочете зробити клітинку "title", яка охоплює всі стовпці, як заголовок для вашої таблиці, ви можете використовувати тег заголовка ( http://www.w3schools.com/tags/tag_caption.asp / https: // developer.mozilla.org/en-US/docs/Web/HTML/Element/caption) Цей елемент призначений для цієї мети. Він поводиться як div, але не охоплює всю ширину батьківської таблиці (як би Div робив би в тому самому положенні (не намагайтеся цього вдома!)), Натомість він охоплює ширину стіл. Є деякі проблеми з перехресними веб-переглядачами, що мають межі, і такі (для мене було прийнятним). У будь-якому випадку, ви можете зробити його схожим на клітинку, яка охоплює всі стовпці. Всередині ви можете створювати рядки, додаючи елементи div. Я не впевнений, чи зможете ви вставити його між tr-елементами, але, напевно, це був би хакер (тому не рекомендується). Іншим варіантом було б возитися з плаваючими дівами, але це - юк!

Зробіть

<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>

1
Саме те, що я шукав, щоб поставити елементи керування сторінками внизу бази даних. Це прекрасно працює. Дуже дякую.
Коменка

5
Це не спрацьовує, якщо ви хочете розмістити всі знаки в середині таблиці. Так, як група за допомогою роздільника між спорідненими групами рядків. (Chrome)
Девід Хемпі

17

Як часткова відповідь, ось декілька моментів, про 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 вище, і одноголосно погоджуються, що a colspanз 0 Це дозволено, оскільки це формулювання з’являється у всіх трьох специфікаціях:

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

    Джерела:

  • Наступні твердження зі сторінки W3Schools, пов'язані з питанням , - принаймні на сьогоднішній день, - абсолютно помилкові:

    Тільки Firefox підтримує colspan = "0", що має особливе значення ... [Це] повідомляє браузеру перетягнути клітинку до останнього стовпця групи стовпців (colgroup)

    і

    Відмінності між HTML 4.01 та HTML5

    НІКОЛИ.

    Якщо ви вже не знаєте, що веб-розробники, як правило, зневажають W3Schools за його часті неточності, розгляньте цей урок чому.


4
Ха-ха, мені подобається, як корисні функції API повністю видаляються, коли ніхто не заважає їх реалізувати. Дивовижний процес.
Андрій Костер

14

Для IE 6 вам потрібно дорівнювати colspan кількості стовпців у вашій таблиці. Якщо у вас є 5 стовпців, вам потрібно:colspan="5" .

Причина в тому, що IE обробляє colspans по- різному, він використовує специфікацію HTML 3.2:

IE реалізує визначення 3.2 3.2, воно встановлює colspan=0як colspan=1.

Клоп добре задокументований .


1
Кількість стовпців може бути змінною, я оновлю своє запитання, щоб включити це зауваження.
Боб

Хоча поради у верхньому абзаці здаються розумними, я вважаю, що багато деталей тут не зовсім правильні. Специфікація HTML 3.2 говорить, що colspans повинні бути натуральними цілими числами, що робить colspan=0незаконним; ніде це прямо не диктує, що colspan=0слід розглядати як colspan=1(хоча я впевнений, що це насправді те, що робить IE 6). Крім того , цитата ні (більше?) В будь-якому місці на сторінці форуму Ви зв'язуєтеся, і більшість з результатів пошуку Google ( в даний час?) Близько абсолютно різних IE 6 Colspan пов'язаних помилок.
Марк Амері

11

Якщо ви використовуєте 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));
});

Якщо ви знайдете реалізацію, для якої це не спрацює, не вдавайте відповідь, поясніть у коментарях, і я оновлю, чи можна її охопити.


1
Було б чудово, якби у вас була версія JS для ванілі
jpaugh

Чи є у вас поширений випадок використання, у якому немає підтримки $ (селектор) або просто не хочете ним користуватися?
rainabba

1
Ні. Мені просто цікаво, чи додає тут jQuery якусь користь; це досить обґрунтована умова, і схоже, що її тут використовують лише мінімально.
jpaugh

Справедливо. Між jQuery і Angular, рідко я не маю цих інструментів, тому я їм за замовчуванням. Я поки що залишу його комусь, щоб придумати ванільну версію, поки що.
rainabba

1
Оскільки jQuery дещо застарілий, я додав версію / відповідь es6 (не хотів оновлювати цю відповідь зовсім іншим кодом).
Сеїті

5

Ще одне робоче, але некрасиве рішення:, colspan="100"де 100 - це значення, що перевищує загальний розмір стовпців colspan.

Відповідно до W3C, colspan="0"опція діє лише з COLGROUPтегом.


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

-1 тому що, наскільки я можу визначити претензію в останньому пункті, помилковою. HTML 4 дозволяє <td>мати s 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, в якому зазначено, що "атрибут вмісту" span "['s] має бути дійсним невід'ємним цілим числом, більшим за нуль." ).
Марк Амері

2

Нижче наведено стисле рішення es6 (подібне до відповіді Рейнбабби, але без 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>


-1

Просто хочу додати свій досвід і відповісти на це.
Примітка. Це працює лише тоді, коли у вас є попередньо визначені tableта trзth s", але вони завантажуються у рядки (наприклад, через 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, розміщені до цього , це не добре узагальнює; кількість ths необов'язково кількість стовпців, оскільки деякі з них можуть мати colspanнабір, тому це не працюватиме так, як написано для всіх.
Марк Амері

-2

Можливо, я прямий мислитель, але я трохи спантеличений, чи не знаєте ви номер стовпця своєї таблиці?

До речі IE6 не вшановує colspan = "0", з визначеною або без колгрупи. Я також намагався використовувати 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

13
Не обов’язково, у мене є додаток з динамічно генерованою таблицею AJAX, і кількість стовпців може змінюватися від зворотного дзвінка до зворотного дзвінка. Також при розробці ви можете "знати" кількість стовпців, але це може змінитися, і ви просто знаєте , що пропустите одну з них
Mad Halfling

11
Плюс якщо ви додасте стовпці пізніше, ви можете забути змінити colspan, краще, щоб це завжди було max.
Адам

-2

Відповідно до специфікації 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, яку ви цитуєте.
Марк Амері

-6

спробуйте використовувати "colSpan" замість "colspan". IE любить версію camelBack ...


4
тільки при використанні IE та налаштуваннях через JavaScript та .setAttribute ('colSpan', int); Зауважте, це було зафіксовано в IE8 (лише в режимі
stds

1
+1 - Я цього не знав, і це була величезна допомога! Я не думав, що colSpan навіть працював в IE6.
mwilcox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.