Colspan / Rowspan для елементів, дисплей яких встановлений на клітинку таблиці


109

У мене є такий код:

<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2">Cell</div>
    </div>
</div>

<style>
    .table {
        display: table;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
    }
    .colspan2 {
        /* What to do here? */
    }
</style>

Досить прямо. Як додати colspan (або еквівалент colspan) для елементів із display: table-cell?


5
Ви не можете просто використовувати таблицю? Було б набагато простіше. Плюс, якщо це табличні дані, це було б і семантичніше.
punkrockbuddyholly

@thirtydot це, мабуть, може, це був би просто біль і непотрібне. Сіткові системи типу 960 в основному цього досягають, але для цілого макета сторінки.
punkrockbuddyholly

@MrMisterMan: Я не впевнений, що ти кажеш. 960.gs не використовує display: table-cell.
тридцятьдот

@ thirtydot вибачте, я забув конкретне питання, яке задав ОП. Ви маєте рацію, не можете додати colspan через CSS. Я вказував, що ви можете змусити діва вести себе як рядки та стовпці, і це включає клітини, що охоплюють декілька стовпців.
punkrockbuddyholly

Використовуйте модельовану таблицю, як це робите для першого рівня організації, який дасть вам можливість створити липкий колонтитул, наприклад. для вашої емуляції colspan ви можете створити вкладену таблицю у вашій унікальній комірці, яка матиме один рядок і стільки комірок, як вам потрібно, або використовувати простий плаваючий div.
Бернард Дусаблон

Відповіді:



27

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

Приклад дорівнює <table> з двома клітинками на рядок та двома рядками, де комірка у другому ряду - td colspan="2".

Я перевірив це за допомогою Iceweasel 20, Firefox 23 та IE 10.

div.table {
  display: table;
  width: 100px;
  background-color: lightblue;
  border-collapse: collapse;
  border: 1px solid red;
}

div.row {
  display: table-row;
}

div.cell {
  display: table-cell;
  border: 1px solid red;
}

div.colspan,
div.colspan+div.cell {
  border: 0;
}

div.colspan>div {
  width: 1px;
}

div.colspan>div>div {
  position: relative;
  width: 99px;
  overflow: hidden;
}
<div class="table">
    <div class="row">
        <div class="cell">cell 1</div>
        <div class="cell">cell 2</div>
    </div>
    <div class="row">
        <div class="cell colspan">
            <div><div>
                cell 3
            </div></div>
        </div>
        <div class="cell"></div>
    </div>
</div>

Живі дії (демо) тут .

EDIT: Я попрацював код, щоб він був більш зручним для друку, оскільки вони залишають кольори фону за замовчуванням. Я також створив rowspan-demo , натхненний пізньою відповіддю.


Я шукаю подібне рішення. Але замість цього я маю 5 комірок у верхньому ряду. У нижньому рядку мені потрібна 1 комірка того ж розміру, що і верхній. Тоді одна клітинка має colspan = 2, а інша клітина colspan = 2, що становить 5 комірок у нижньому ряду. Ось проблема jsfiddle на основі вашого рішення. Будь-які думки? jsfiddle.net/7wdza4ye/1
Varun Verma

1
@VarunVerma, ви повинні додати порожню клітинку між клітинками 7 та 8. Просто додавання <div class="cell"></div>працює (принаймні з Firefox). За допомогою цієї конструкції вам потрібно прокладати порожні комірки. Наприклад, якщо б у вас було так, щоб клітинка 7 була colspan = 3, а клітинка 8 була нормальною, тоді вам знадобляться дві порожні комірки між клітинами 7 та 8. Якщо ви не спроектували б щось інше (поля? Єдиний індивідуальний розділ?) . Крім того, ширина 100 пікселів і 5 комірок робить справи складними, оскільки слова розтягують css-комірки, налаштування переповнення, схоже, не мають значення. Крім того, необхідно перерахувати widthдля div.colspan>div>div.
F-3000

це спрацювало. Дякую. Насправді я додав порожню комірку після клітинки 8, оскільки нижня межа не відображалася. Ось останні: jsfiddle.net/7wdza4ye/3 . Був впевнений, як отримати межу між клітинками 7 та 8. Будь-які пропозиції? Спасибі за вашу допомогу.
Варун Верма

1
@VarunVerma, у Chrome зовнішня межа була неповною без порожньої комірки після 8, тому вона справді потрібна. Простий спосіб додати кордону між осередками 7 і 8 може бути таким: div.colspan{border-left:1px solid red}. Його потрібно розмістити десь нижче правила, яке встановлює div.colspan без полів, інакше це буде відмінено.
F-3000

Дякую @ F-3000. Це було корисно. Для решти, ось останнє посилання на основі рішення F-3000: jsfiddle.net/7wdza4ye/4
Varun Verma

16

Більш просте рішення, яке працює для мене в Chrome 30:

Colspan можна імітувати, використовуючи display: tableзамість display: table-rowрядків:

.table {
    display: block;
}
.row {
    display: table;
    width: 100%;
}
.cell {
    display: table-cell;
}
.row.colspan2 {/* You'll have to add the 'colspan2' class to the row, and remove the unused <div class=cell> inside it */
    display: block;
}

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


7

Якщо ви шукаєте прямий CSS спосіб імітувати колшпан, ви можете скористатися display: table-caption.

.table {
  display: table;
}
.row {
  display: table-row;
}
.cell {
  display: table-cell;
  border: 1px solid #000;
}
.colspan2 {
  /* What to do here? */
  display: table-caption;
}
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2">Cell</div>
    </div>
</div>


Це дивовижний ти рок!
Радж Камаль

1
Використовуючи display: table-caption буде охоплювати всі стовпці та розміщувати рядок у верхній частині таблиці, як і елемент підпису в html-таблиці, тому це насправді не працює. Тільки якщо ви хочете прокласти всі стовпці на першому чи останньому рядку.
Міхель

6

Просто використовуйте table.

таблиці нахмурені лише тоді, коли вони використовуються для цілей компонування.

Це здається табличними даними (рядки / стовпці даних). Тому я рекомендую використовувати table.

Дивіться мою відповідь на це запитання для отримання додаткової інформації:

створюючи те саме, що використовується з divs як таблиці


11
Справа в тому, що це не для табличних даних, тому я не хочу використовувати таблицю :)
Ghost Madara

13
Я не розумію, чому в CSSing все поводиться так, як на столі, якось краще, ніж просто використовувати таблицю. Справді, tr/ tdспам - це не найкрасивіший HTML, але це лише причина? Усі кажуть, що таблиці не були «призначені» для використання для форматування, але сам HTML не був «призначений» робити половину речей, які ми вважаємо прийнятними за сьогоднішніми стандартами, включаючи веб-додатки.
Невеликий

4
Майже через рік, але - Злегка, я ділюсь вашим роздратуванням з тим, що люди уникають таблиць без будь-якої причини, окрім як «столи не в стилі». Однак я стикаюся з кількома чуйними конструкціями, де корисно мати стіл не бути столом, щоб його можна було переставити на менші ширини. Навчання у мене немає кольспану для діви - це щось невтішно.
спін

4

Ось один із способів переміщення стовпців у CSS, який я використав для власної ситуації.

https://jsfiddle.net/mb8npttu/

<div class='table'>
    <div class='row'>
        <div class='cell colspan'>
            spanning
        </div>
        <div class='cell'></div>
        <div class='cell'></div>
    </div>

    <div class='row'>
        <div class='cell'>1</div>
        <div class='cell'>2</div>
        <div class='cell'>3</div>
    </div>
</div>

<style>
    .table { display:table; }
    .row { display:table-row; }
    .cell { display:table-cell; }
    .colspan { max-width:1px; overflow:visible; }
</style>

2
Я повинен був збільшити .colspanз , white-space: nowrap;щоб отримати результат , що я хотів, але він працював великий.
kshetline

2

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

Код:

    *{
      box-sizing: border-box;
    }
    .table {
        display: table;
        position: relative;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
        border: 1px solid red;
        padding: 5px;
        text-align: center;
    }
    .colspan {
        position: absolute;
        left: 0;
        width: 100%;
    }
    .dummycell {
        border-color: transparent;
    }
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell dummycell">&nbsp;</div>
        <div class="cell colspan">Cell</div>
    </div>
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
</div>

Пояснення:

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

Звичайно, ви також можете використовувати флексбокс та сітку для вирішення цієї проблеми в наші дні.


1

CSS

.tablewrapper {
  position: relative;
}
.table {
  display: table;
  position: relative
}
.row {
  display: table-row;
}
.cell {
  border: 1px solid red;
  display: table-cell;
}
.cell.empty
{
  border: none;
  width: 100px;
}
.cell.rowspanned {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100px;
}
.cell.colspan {
  position: absolute;
  left: 0;
  right: 0;
}

HTML

<div class="tablewrapper">
  <div class="table">
    <div class="row">
      <div class="cell rowspanned">
        Center
      </div>
      <div class="cell">
        Top right
      </div>
    </div>
    <div class="row">
      <div class="cell empty"></div>
      <div class="cell colspan">
        Bottom right
      </div>
    </div>
  </div>
</div>

Код


1

Це можна зробити просто за допомогою чистого CSS та центрування тексту по всьому «підробленому» кольспану.

Трюк полягає в тому, щоб встановити рядки на position:relative, а потім розмістити "порожні знаки" в те місце, rowде ви хочете зробити colspan(вони повинні мати height, щоб працювати), встановити місце, cellде вміст знаходиться як display:grid, і, нарешті, застосувати position:absoluteдо елемента всередині клітини (і відцентруйте її, як ви можете центрирувати будь-який інший абсолютний елемент).

 .table {
        display: table;
  }
  .row {
      display: table-row;
      position: relative;
  }
  .cell {
      display: table-cell;
      background-color: blue;
      color: white;
      height: 26px;
      padding: 0 8px;
  } 
  .colspan2 {
      display: grid;
  }
  .colspan2 p {
    position:absolute;
    left: 50%;
    transform:translateX(-50%);
    margin: 0;
  }
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2"><p>Cell</p></div>
        <div class="cell"></div>
    </div>
</div>


0

Використовуючи відповідні класи класів і атрибути CSS, ви можете імітувати бажані ефекти colspan та rowspan.

Ось CSS

.table {
    display:table;
}

.row {
    display:table-row;
}

.cell {
    display:table-cell;
    padding: 5px;
    vertical-align: middle;
}

Ось зразок HTML

<div class="table">
    <div class="row">
        <div class="cell">
            <div class="table">
                <div class="row">
                    <div class="cell">X</div>
                    <div class="cell">Y</div>
                    <div class="cell">Z</div>
                </div>
                <div class="row">
                    <div class="cell">2</div>
                    <div class="cell">4</div>
                    <div class="cell">6</div>
                </div>
            </div>
        </div>
        <div class="cell">
            <div class="table">
                <div class="row">
                    <div class="cell">
                        <div class="table">
                            <div class="row">
                                <div class="cell">A</div>
                            </div>
                            <div class="row">
                                <div class="cell">B</div>
                            </div>
                        </div>
                    </div>
                    <div class="cell">
                        ROW SPAN
                    </div>    
                </div>
            </div>
        </div>
    </div>
</div>    

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

*** Це не гламурно, але це працює для тих, хто шукає такого форматування, і вони хочуть уникати ТАБЛИЦІВ. Якщо його для DIO LAYOUT, ТАБЛИЦІ все ще працюють у HTML5.

Сподіваємось, це допоможе комусь.


По-перше, HTML5 має повну підтримку <table>- просто люди повинні уникати використання його для візуального форматування . Використовувати його для відображення структурованих даних - це те, де їх слід використовувати , якщо тільки щось інше (наприклад <ul>, як простий приклад) не підходить для завдання. По-друге, чувак, 4 столи. Ви вносите цікаве запитання на стіл (rowspan), але ваша відповідь кричить використовувати його <table>. Я повинен побачити, як працює тут моє рішення ...
F-3000,

Я б відредагував свій попередній коментар, але timelimit звертається в. Як і у моїй відповіді про colspan, rowspan можна досягти набагато менше клопотів, ніж з вашим ... оригінальним підходом. Побачте самі .
F-3000,

Дякуємо за ваш відгук. Я ніколи не казав, що HTML5 не підтримує таблиці. Багато людей просто прагнуть цього уникнути. Іноді, коли ви пишете веб-додаток (на відміну від сторінки лише рекламного типу), вам потрібна більше фіксований макет для розміщення кнопок та / або управління.
JRC

0

Ви можете встановити позицію вмісту colspan як "відносну", а рядок як "абсолютну", як це:

.table {
    display: table;
}
.row {
    display: table-row;
    position: relative;
}
.cell {
    display: table-cell;
}
.colspan2 {
    position: absolute;
    width: 100%;
}

0

Зараз цього досягти неможливо.

AFAIK це буде охоплено таблицями CSS , специфікація яких, здається, наразі перебуває у стані "незавершеного виробництва".


0

Ви можете спробувати це рішення, де ви можете дізнатися, як застосувати colspan, використовуючи div https://codepen.io/pkachhia/pen/JyWMxY

HTML:

<div class="div_format">
            <div class="divTable">
                <div class="divTableBody">
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Project Name</div>
                        <div class="divTableCell cell_value">: Testing Project</div>
                        <div class="divTableCell cell_lable">Project Type</div>
                        <div class="divTableCell cell_value">: Web application</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Version</div>
                        <div class="divTableCell cell_value">: 1.0.0</div>
                        <div class="divTableCell cell_lable">Start Time</div>
                        <div class="divTableCell cell_value">: 2016-07-10 11:00:21</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Document Version</div>
                        <div class="divTableCell cell_value">: 2.0.0</div>
                        <div class="divTableCell cell_lable">End Time</div>
                        <div class="divTableCell cell_value">: 2017-07-10 11:00:23</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Document Revision</div>
                        <div class="divTableCell cell_value">: 3</div>
                        <div class="divTableCell cell_lable">Overall Result</div>
                        <div class="divTableCell cell_value txt_bold txt_success">: Passed</div>
                    </div>                          
                </div>
                <div class="divCaptionRow">
                    <div class="divCaptionlabel">Description</div>
                    <div class="divCaptionValue">: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore</div>
                </div>
            </div>
        </div>

CSS:

body {
                font-family: arial
            }
            * {
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                box-sizing: border-box
            }
            .div_format {
                width: 100%;
                display: inline-block;
                position: relative
            }           
            .divTable {
                display: table;
                width: 100%;            
            }
            .divTableRow {
                display: table-row
            }
            .divTableHeading {
                background-color: #EEE;
                display: table-header-group
            }
            .divTableCell,
            .divTableHead {
                display: table-cell;
                padding: 10px
            }
            .divTableHeading {
                background-color: #EEE;
                display: table-header-group;
                font-weight: bold
            }
            .divTableFoot {
                background-color: #EEE;
                display: table-footer-group;
                font-weight: bold
            }
            .divTableBody {
                display: table-row-group
            }
            .divCaptionRow{
                display: table-caption;
                caption-side: bottom;
                width: 100%;
            }
            .divCaptionlabel{
                caption-side: bottom;
                display: inline-block;
                background: #ccc;
                padding: 10px;
                width: 15.6%;
                margin-left: 10px;
                color: #727272;
            }
            .divCaptionValue{
                float: right;
                width: 83%;
                padding: 10px 1px;
                border-bottom: 1px solid #dddddd;
                border-right: 10px solid #fff;
                color: #5f5f5f;
                text-align: left;
            }

            .cell_lable {
                background: #d0d0d0;
                border-bottom: 1px solid #ffffff;
                border-left: 10px solid #ffffff;
                border-right: 10px solid #fff;
                width: 15%;
                color: #727272;
            }
            .cell_value {
                border-bottom: 1px solid #dddddd;
                width: 30%;
                border-right: 10px solid #fff;   
                color: #5f5f5f;
            }

-1

Навіть якщо це старе питання, я хотів би поділитися своїм рішенням цієї проблеми.

<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan">
            <div class="spanned-content">Cell</div>
        </div>
    </div>
</div>

<style>
    .table {
        display: table;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
    }
    .colspan:after {
        /* What to do here? */
        content: "c";
        display: inline;
        visibility: hidden;
    }
    .spanned-content {
        position: absolute;
    }
</style>

Ось загадка . Це насправді не проміжок часу, і рішення трохи хитре, але в деяких ситуаціях воно корисне. Тестовано на Chrome 46, Firefox 31 та IE 11.

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


Звичайно, ви завжди можете покластися на таке сіткове рішення, як Bootstrap. У цьому конкретному випадку мені дуже потрібна автоматична ширина, яка пропонує відображення: table.
Габріель

Крім того, якщо ви хочете надати навантаженому вмісту деякий фоновий колір, вам доведеться заповнити тр повною кількістю tds :(
Габріель

Я закінчив скласти таблицю і переглянув свою концепцію "табличних даних" ^^
Габріель

-2

Використовуйте вкладені таблиці для розміщення проміжків стовпців ...

<div class="table">
  <div class="row">
    <div class="cell">
      <div class="table">
        <div class="row">
          <div class="cell">Cell</div>
          <div class="cell">Cell</div>
        </div>
      </div>
    </div>
  </div>

  <div class="row">
    <div class="cell">Cell</div>
  </div>
</div>

Або використовуйте 2 таблиці, де проміжок стовпця охоплює весь ряд ...

<div class="table">
  <div class="row">
    <div class="cell">Cell</div>
    <div class="cell">Cell</div>
  </div>
</div>

<div class="table">
  <div class="row">
    <div class="cell">Cell</div>
  </div>
</div>

2
Питання полягало в тому, як це зробити за допомогою CSS.
Енно Ґрьопер

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