HTML colspan у CSS


251

Я намагаюся побудувати макет, подібний до наступного:

+---+---+---+
|   |   |   |
+---+---+---+
|           |
+-----------+

де дно заповнює простір верхнього ряду.

Якби це фактична таблиця, я міг би легко виконати це за допомогою <td colspan="3">, але оскільки я просто створюю макет , подібний до таблиці , я не можу використовувати <table>теги. Чи можливо це за допомогою CSS?


8
Найкраще рішення дійсно залежить від того, що йде в стіл. Якщо це дані (те, що належить до таблиці), тоді використовуйте таблицю. Якщо ви використовуєте таблицю для управління компонуванням сторінки, то краще використовувати одне з нижчезазначених рішень HTML + CSS.
mwcz

Додайте розмітку для обох випадків, а потім показуйте лише одну, використовуючи клас запиту CSS Media.
DigitalDesignDj

2
Забудьте про CSS. Якщо ви відображаєте табличні дані, ви неодмінно знаєте, на скільки стовпців вона буде проходити. Використовуйте colspanатрибут
Тихомир Мітков

Я зробив би це за допомогою завантажувальної програми або спеціальної сітки з завантажувальної програми
Arun Prasad ES

Якщо ви використовуєте CSS3, ви можете використовувати columnSpan. На відміну від <td colspan = "#">, у вас немає можливості встановити кількість стовпців, але ви можете переключити всі стовпці. w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

Відповіді:


407

Немає простого, елегантного аналога CSS для colspan.

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


10
Таблиці є структурними елементами, і саме те, що використання кольпану змінює його зовнішній вигляд, не означає, що це не так. CSS використовується для стильових елементів, а не для зміни структури. W3C обговорює структуру таблиці тут: w3.org/TR/html401/struct/tables.html#h-11.2
Роб

88
Робіть, зрозумійте свою позицію, але погляньте на рекомендації W3C - зокрема, що стосуються всієї парадигми таблиці - і ви побачите, що частиною їх розгляду було, безумовно, представлення таблиць. Ця думка про те, що таблиці були задумані лише як структура, є сучасною вигадкою, я думаю, що нам усім краще послужити, щоб перестати поширюватись. Справа в тому, що нам потрібно перестати бути догматичними щодо таблиць. Мені було б неправильно сказати, що вони завжди презентують, і ви так само неправильно сказати, що вони завжди є структурованими. Реальність просто не така, як різана, так і висушена.
Девід

4
Схоже, ваша відповідь - популярна відповідь. :) Я щасливий дізнатися, що антигромна догма (яку я придбала) занадто сувора. Я дотримуюся своєї відповіді лише настільки, наскільки я все ще думаю, що colspanце правильний інструмент для роботи. Моя відповідь була на 75% вірна, а ваша - на 100% вірна. Ви повинні повернутися до SO.
mwcz

71
Через 2 роки я погуглив це і захотів проголосувати за автора, але він сказав "не можу проголосувати за свою посаду", і я зрозумів, що це я, лол. Я вирішив змінити прийняте рішення на це, оскільки відчуваю, що він має кращу інформацію.
Вежа

14
Це міні-нарис про якусь іншу (не визначену) відповідь, а не відповідь на поставлене запитання.
Jukka K. Korpela

56

Наскільки я знаю, в css немає colspan, але column-spanнайближчим часом буде розкладка з декількома стовпцями, але оскільки це лише чернетка в CSS3, ви можете перевірити це тут . У будь-якому випадку ви можете зробити обхідний шлях , використовуючи divі spanз табличному дисплеєм , як це.

Це буде HTML:

<div class="table">
  <div class="row">
    <span class="cell red first"></span>
    <span class="cell blue fill"></span>
    <span class="cell green last"></span>
  </div>
</div>
<div class="table">
  <div class="row">
    <span class="cell black"></span>
  </div>
</div>

І це буде css:

  /* this is to reproduce table-like structure
     for the sake of table-less layout. */
  .table { display:table; table-layout:fixed; width:100px; }
  .row { display:table-row; height:10px; }
  .cell { display:table-cell; }

  /* this is where the colspan tricks works. */
  span { width:100%; }

  /* below is for visual recognition test purposes only. */
  .red { background:red; }
  .blue { background:blue; }
  .green { background:green; }
  .black { background:black; }

  /* this is the benefit of using table display, it is able 
     to set the width of it's child object to fill the rest of 
     the parent width as in table */
  .first { width: 20px; }
  .last { width: 30px; }
  .fill { width: 100%; }

Єдина причина використовувати цей трюк - це отримати користь від table-layoutповедінки, я використовую її багато, якщо лише встановлення діва та ширини прольоту до певного відсотка не виконало наші вимоги до дизайну.

Але якщо вам не потрібно отримувати користь від table-layoutповедінки, то відповідь Дурілая вам досить підійде.


4
Так, але трохи виправте: замість .span { ...цього має бути span { ....
Славік Мельцер

2
Використання divтегів для відображення табличних даних так само погано, як і використання tables для керування макетом сторінки
Тихомир Мітков

1
@TichomirMitkov залежить від того, чи використовуєте ви чуйний дизайн для зміни макета - у такому випадку іноді це може працювати досить добре.
Simon_Weaver

4
Це насправді не дає відповіді на запитання, оскільки у вашому прикладі ви, по суті, маєте дві таблиці одна за одною. (Ietwo ворожби з класом «стіл»)
Зима

21

Ще одна пропозиція - використовувати флексбокс замість таблиць. Це звичайно "сучасний браузер", але давай, це 2016;)

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

Ось чудовий посібник: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

.table {
  border: 1px solid red;
  padding: 2px;
  max-width: 300px;
  display: flex;
  flex-flow: row wrap;
}
.table-cell {
  border: 1px solid blue;
  flex: 1 30%;
}
.colspan-3 {
  border: 1px solid green;
  flex: 1 100%;
}
<div class="table">
  <div class="table-cell">
    row 1 - cell 1
  </div>
  <div class="table-cell">
    row 1 - cell 2
  </div>
  <div class="table-cell">
    row 1 - cell 3
  </div>
  <div class="table-cell colspan-3">
    row 2 - cell 1 (spans 3 columns)
  </div>
</div>


8
<div style="width: 100%;">
    <div style="float: left; width: 33%;">Row 1 - Cell 1</div>
    <div style="float: left; width: 34%;">Row 1 - Cell 2</div>
    <div style="float: left; width: 33%;">Row 1 - Cell 3</div>
</div>
<div style="clear: left; width: 100%;">
Row 2 - Cell 1
</div>

Я не можу знати ширину комірок.
Вежа

1
Тоді не накладайте ширину. Це не має значення. Але якщо ви хочете, щоб вони охоплювали однакову ширину, то два основні диви повинні мати однакову ширину.
Дастін Лайн

1
Ви можете використовувати ширину: calc (100% / 3), що зробить трохи краще, ніж давши середині на 1% більше
ii iml0sto1

5

Це не є частиною компетенції CSS. colspanописує структуру вмісту сторінки або надає певного значення даних у таблиці, що є завданням HTML.


ОП відверто згадує "створення табличного макета ", без структурного значення. Хіба це не сама мета CSS-таблиць? Немає об'єктивних причин трактувати властивість colspan інакше, ніж всю таблицю, якщо є елемент таблиці CSS, призначений лише для дизайну, чому б не властивість CSS Colspan, призначена лише для дизайну…
Skippy le Grand Gourou

2
Ознайомтеся з голосовою відповіддю на це запитання. Ваші настрої вже обговорюються там, і я схильний з цим погодитися. Моя думка з цього питання, безумовно, змінилася за п’ять років, як я написав цю відповідь.
mwcz

4

Щоб надати актуальну відповідь: Найкращий спосіб зробити це сьогодні - це використовувати макет css grid так:

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: auto;
  grid-template-areas: 
    "top-left top-middle top-right"
    "bottom bottom bottom"
}

.item-a {
  grid-area: top-left;
}
.item-b {
  grid-area: top-middle;
}
.item-c {
  grid-area: top-right;
}
.item-d {
  grid-area: bottom;
}

і HTML

<div class="item-a">1</div>
<div class="item-b">2</div>
<div class="item-c">3</div>
<div class="item-d">123</div>

3

Ви можете спробувати скористатися сітковою системою, наприклад http://960.gs/

Ваш код буде приблизно таким, припускаючи, що ви використовуєте макет "12 стовпців":

<div class="container_12">
<div class="grid_4">1</div><div class="grid_4">2</div><div class="grid_4">3</div>
<div class="clear"></div>
<div class="grid_12">123</div>
</div>

3

Спробуйте додати display: table-cell; width: 1%;до елемента комірки таблиці.


як це допоможе? Фундаментальна концепція таблиці полягає в тому, що кожен рядок має однакові комірки. Якщо в одному з рядків є клітинка, яка успішно реалізує "ширина: 1%", то всі рядки матимуть цей стовпець як "ширина: 1%". Суть "колпана" полягає в тому, щоб взяти 2 (або більше) стовпців фіксованої ширини і об'єднати їх, щоб отримати комбіновану ширину.
IAM_AL_X

3

Я мав певний успіх, хоча він покладається на кілька властивостей для роботи:

table-layout: fixed border-collapse: separate

і "ширини" комірок, які легко діляться / прольоту, тобто 4 x комірки шириною 25%:

.div-table-cell,
* {
  box-sizing: border-box;
}

.div-table {
  display: table;
  border: solid 1px #ccc;
  border-left: none;
  border-bottom: none;
  table-layout: fixed;
  margin: 10px auto;
  width: 50%;
  border-collapse: separate;
  background: #eee;
}

.div-table-row {
  display: table-row;
}

.div-table-cell {
  display: table-cell;
  padding: 15px;
  border-left: solid 1px #ccc;
  border-bottom: solid 1px #ccc;
  text-align: center;
  background: #ddd;
}

.colspan-3 {
  width: 300%;
  display: table;
  background: #eee;
}

.row-1 .div-table-cell:before {
  content: "row 1: ";
}

.row-2 .div-table-cell:before {
  content: "row 2: ";
}

.row-3 .div-table-cell:before {
  content: "row 3: ";
  font-weight: bold;
}

.div-table-row-at-the-top {
  display: table-header-group;
}
<div class="div-table">

  <div class="div-table-row row-1">

    <div class="div-table-cell">Cell 1</div>
    <div class="div-table-cell">Cell 2</div>
    <div class="div-table-cell">Cell 3</div>

  </div>

  <div class="div-table-row row-2">

    <div class="div-table-cell colspan-3">
      Cor blimey he's only gone and done it.
    </div>

  </div>

  <div class="div-table-row row-3">

    <div class="div-table-cell">Cell 1</div>
    <div class="div-table-cell">Cell 2</div>
    <div class="div-table-cell">Cell 3</div>

  </div>

</div>

https://jsfiddle.net/sfjw26rb/2/

Крім того, застосування display: table-header-group або table-footer-group є зручним способом переходу елементів "рядків" до верхньої / нижньої частини "таблиці".


0

якщо ви використовуєте div та span, він займе більше розміру коду, коли рядок таблиці datagrid буде більш об’ємним. Цей нижче код перевіряється у всіх браузерах

HTML:

<div id="gridheading">
<h4>Sl.No</h4><h4 class="big">Name</h4><h4>Location</h4><h4>column</h4><h4>column</h4><h4>column</h4><h4>Amount(Rs)</h4><h4>View</h4><h4>Edit</h4><h4>Delete</h4> 
</div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>

CSS:

#gridheading {
    background: #ccc;
    border-bottom: 1px dotted #BBBBBB;
    font-size: 12px;
    line-height: 30px;
    text-transform: capitalize;
}
.data {
    border-bottom: 1px dotted #BBBBBB;
    display: block;
    font-weight: normal;
    line-height: 20px;
    text-align: left;
    word-wrap: break-word;
}
 h4 {
    border-right: thin dotted #000000;
    display: table-cell;
    margin-right: 100px;
    text-align: center;
    width: 100px;
    word-wrap: break-word;
}
.data .big {
    margin-right: 150px;
    width: 200px;
}

0
column-span: all; /* W3C */
-webkit-column-span: all; /* Safari & Chrome */
-moz-column-span: all; /* Firefox */
-ms-column-span: all; /* Internet Explorer */
-o-column-span: all; /* Opera */

http://www.quackit.com/css/css3/properties/css_column-span.cfm


недостатньо підтримки ... IE8, на жаль, все ще залишається тривалим питанням еволюції
beauXjames

9
ОП хоче мати table-cellпроміжок декількох стовпців таблиці. column-spanпризначений для управління компонуванням стовпців. Що дозволяє передати текст через кілька стовпців, як це роблять газети.
Кріс Вессілінг

1
Дійсно - хоча це було б дійсно добре використовувати на дисплеї: table-cell; елементів, це стосується лише css-колонок: jsfiddle.net/mk0rrLc3/1
Марк

@ Позначити-- проміжок стовпця використовується з властивістю підрахунку стовпців, визначеним у батьків. Не потрібно змінювати тип дисплея. Крім того, проміжок стовпця може приймати лише 1 або все як значення, він не дозволяє розділити фракції, отже, "стовпець-проміжок: 2", як видно з вашої скрипки, не є дійсним використанням властивості.
MistyDawn

0

Якщо ви прийшли сюди, тому що вам потрібно ввімкнути або вимкнути colspanатрибут (скажімо, для мобільного макета):

Скопіюйте <td>s і покажіть лише ті, що бажані colspan:

table.colspan--on td.single {
  display: none;
}

table.colspan--off td.both {
  display: none;
}
<!-- simple table -->
<table class="colspan--on">
  <thead>
    <th>col 1</th>
    <th>col 2</th>
  </thead>
  <tbody>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
    <tr>
      <!-- the <td> spanning both columns -->
      <td class="both" colspan="2">both</td>

      <!-- the two single-column <td>s -->
      <td class="single">A</td>
      <td class="single">B</td>
    </tr>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
  </tbody>
</table>
<!--
that's all
-->

 

<!--
stuff only needed for making this interactive example looking good:
-->
<br><br>
<button onclick="toggle()">Toggle colspan</button>
<script>/*toggle classes*/var tableClasses = document.querySelector('table').classList;
function toggle() {
  tableClasses.toggle('colspan--on');
  tableClasses.toggle('colspan--off');
}
</script>
<style>/* some not-needed styles to make this example more appealing */
td {text-align: center;}
table, td, th {border-collapse: collapse; border: 1px solid black;}</style>


0

Властивості CSS "колонка-кількість", "проміжок стовпців" та "проміжок стовпців" можуть зробити це таким чином, що всі стовпці псевдо-таблиці зберігаються всередині однієї обгортки (HTML залишається красивим та акуратним).

Єдині застереження - це те, що ви можете визначити лише 1 стовпець або всі стовпці, а проміжок стовпців ще не працює у Firefox, тому деякі додаткові CSS необхідні для того, щоб він відображався правильно. https://www.w3schools.com/css/css3_multiple_column.asp

.split-me {
  -webkit-column-count: 3;
  -webkit-column-gap: 0;
  -moz-column-count: 3;
  -moz-column-gap: 0;
  column-count: 3;
  column-gap: 0;
}

.cols {
  /* column-span is 1 by default */
  column-span: 1;
}

div.three-span {
  column-span: all !important;
}

/* alternate style for column-span in Firefox */
@-moz-document url-prefix(){
  .three-span {
    position: absolute;
    left: 8px;
    right: 8px;
    top: auto;
    width: auto;
  }
}


    
<p>The column width stays fully dynamic, just like flex-box, evenly scaling on resize.</p>

<div class='split-me'>
  <div class='col-1 cols'>Text inside Column 1 div.</div>
  <div class='col-2 cols'>Text inside Column 2 div.</div>
  <div class='col-3 cols'>Text inside Column 3 div.</div>
  <div class='three-span'>Text div spanning 3 columns.</div>
</div>



  <style>
/* Non-Essential Visual Styles */

html * { font-size: 12pt; font-family: Arial; text-align: center; }
.split-me>* { padding: 5px; } 
.cols { border: 2px dashed black; border-left: none; }
.col-1 { background-color: #ddffff; border-left: 2px dashed black; }
.col-2 { background-color: #ffddff; }
.col-3 { background-color: #ffffdd; }
.three-span {
  border: 2px dashed black; border-top: none;
  text-align: center; background-color: #ddffdd;
}
  </style>


0

Я прийшов сюди, тому що в даний час блок таблиці WordPress не підтримує параметр colspan, і я думав, що я заміню його за допомогою CSS. Це було моїм рішенням, припускаючи, що стовпці однакової ширини:

table {
  width: 100%;
}

table td {
  width: 50%;
  background: #dbdbdb;
  text-align: center;
}

table tr:nth-child(2n+1) {
  position:relative;
  display:block;
  height:20px;
  background:green;
}

table tr:nth-child(2n+1) td {
  position:absolute;
  left:0;
  right:-100%;
  width: auto;
  top:0;
  bottom:0;
  background:red;
  text-align:center;
}
<table>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
</table>


-1

Ви завжди можете position:absolute;щось задати і вказати ширину. Це не дуже текучий спосіб зробити це, але він би спрацював.


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

-1

Я створив цю загадку:

введіть тут опис зображення

http://jsfiddle.net/wo40ev18/3/

HTML

<div id="table">
<div class="caption">
    Center Caption
</div>
<div class="group">
      <div class="row">
            <div class="cell">Link 1t</div>
            <div class="cell"></div>
          <div class="cell"></div>
          <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell ">Link 2</div>
      </div>
</div>

CSS

   #table {
    display:table;
}

.group {display: table-row-group; }

.row {
    display:table-row;
    height: 80px;
    line-height: 80px;
}

.cell {
    display:table-cell;
    width:1%;
    text-align: center;
    border:1px solid grey;
    height: 80px
        line-height: 80px;
}

.caption {
    border:1px solid red; caption-side: top; display: table-caption; text-align: center; 
    position: relative;
    top: 80px;
    height: 80px;
      height: 80px;
    line-height: 80px;

}

1
Але я думаю, що сітка завантажувача може зробити це дуже легко
Arun Prasad ES

Це не забезпечує рішення, яке шукав запитувач. Він просто створює вбудований ряд комірок.
MistyDawn

-1

Класи медіа-запитів можна використовувати для досягнення чогось прохідного з дублюванням розмітки. Ось мій підхід до завантажувальної програми:

  <tr class="total">
    <td colspan="1" class="visible-xs"></td>
    <td colspan="5" class="hidden-xs"></td>
    <td class="focus">Total</td>
    <td class="focus" colspan="2"><%= number_to_currency @cart.total %></td>
  </tr>

colspan 1 для мобільних, colspan 5 для інших, хто виконує роботу CSS.


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