CSS의 HTML colspan


251

다음과 유사한 레이아웃을 구성하려고합니다.

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

바닥이 위쪽 행의 공간을 채우고 있습니다.

이것이 실제 테이블 인 경우으로 쉽게이 작업을 수행 할 수 <td colspan="3">있지만 단순히 테이블과 같은 레이아웃을 만들 때 <table>태그를 사용할 수 없습니다 . CSS를 사용하여 가능합니까?


8
가장 좋은 해결책은 실제로 테이블에 들어가는 것에 달려 있습니다. 데이터 (테이블에 속한 것) 인 경우 테이블을 사용하십시오. 테이블을 사용하여 페이지의 레이아웃을 제어하는 ​​경우 아래 HTML + CSS 솔루션 중 하나가 더 좋습니다.
mwcz

두 경우 모두에 마크 업을 추가 한 다음 미디어 쿼리 CSS 클래스를 사용하여 한 번에 하나씩 만 표시하십시오.
DigitalDesignDj

2
CSS는 잊어라. 테이블 형식의 데이터를 표시하는 경우 확장 가능한 열 수에 대해 확실히 알고있을 것입니다. colspan속성 사용
Tihomir Mitkov

부트 스트랩 또는 부트 스트랩에서 사용자 정의 된 그리드로이를 수행합니다
Arun Prasad ES

CSS3를 사용하는 경우 columnSpan을 사용할 수 있습니다. <td colspan = "#">과 달리 열 수를 설정하는 옵션이 없지만 모든 열을 확장 할 수 있습니다. w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

답변:


407

에 대한 간단하고 우아한 CSS 아날로그는 없습니다 colspan.

이 문제에 대한 검색은 절대적인 위치 지정, 크기 조정 및 유사한 다양한 브라우저 및 상황 별 경고와 함께 다양한 대안을 포함하는 다양한 솔루션을 반환합니다. 찾은 내용에 따라 최선의 결정을 읽고 결정하십시오.


10
테이블은 구조적 요소이며 colspan 변경을 사용한다고해서 모양이 달라지는 것은 아닙니다. CSS는 요소의 스타일을 지정하고 구조를 변경하지 않습니다. W3C는 여기에서 테이블 구조를 설명합니다 : w3.org/TR/html401/struct/tables.html#h-11.2
Rob

88
Rob, 자신의 입장을 이해하지만 W3C 권장 사항, 특히 전체 테이블 패러다임과 관련된 권장 사항을 살펴보면 고려해야 할 부분 이 테이블 의 표현 이라는 것을 알 수 있습니다. 테이블이 구조로서 순수하게 구상되었다는이 아이디어는 현대 소설 일뿐입니다. 요점은 테이블에 대해 독단적 인 태도를 멈춰야한다는 것입니다. 그들이 항상 프레젠테이션 이라고 말하는 것은 잘못된 일이며, 그들이 항상 구조적 이라고 말하는 것은 잘못입니다 . 현실은 그저 잘린 것이 아닙니다.
David

4
귀하의 답변 대중적인 답변 인 것 같습니다. :) 나는 반 테이블 교리 (내가 구입 한)가 너무 엄격하다는 것을 알게되어 기쁩니다. 나는 여전히 colspan직업에 맞는 도구 라고 생각하는 한 내 대답을 기다 립니다. 제 대답은 75 % 맞았고 당신의 대답은 100 % 맞습니다. 당신은 다시 돌아와야합니다.
mwcz 2012 년

71
2 년 후, 나는 이것을 구글 검색하고 저자를 투표하고 싶었지만 "자신의 게시물에 투표 할 수 없다"고 말했고 나는 그것이 나를 깨달았다. 나는 그것이 더 나은 정보를 가지고 있다고 생각하기 때문에 받아 들여진 해결책을 이것으로 바꾸기로 결정했다.
Tower

14
이것은 질문에 대한 답변이 아닌 다른 (지정되지 않은) 답변에 대한 미니 에세이입니다.
Jukka K. Korpela 2016 년

56

내가 아는 한 CSS에는 colspan이 없지만 column-span가까운 장래에는 다중 열 레이아웃이 있지만 CSS3의 초안이므로 여기 에서 확인할 수 있습니다 . 어쨌든 당신은 사용하여 해결 방법을 수행 할 수 있습니다 divspan같은 테이블 같은 디스플레이.

이것은 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동작 의 이점을 얻는 것입니다 .div 및 스팬 너비를 특정 비율로 설정해도 디자인 요구 사항이 충족되지 않으면 많이 사용합니다.

그러나 table-layout행동의 혜택을 누릴 필요가 없다면 durilai의 대답 이 당신에게 충분할 것입니다.


4
네,하지만 약간의 수정 : 그 대신에 .span { ...이어야합니다 span { ....
Slavik Meltser

2
div태그를 사용하여 표 형식의 데이터를 표시하는 것은 tables를 사용하여 페이지 레이아웃을 제어하는 것만 큼 ​​좋지 않습니다
Tihomir Mitkov

1
@TichomirMitkov는 반응 형 디자인을 사용하여 레이아웃을 변경하는지 여부에 따라 다릅니다.
Simon_Weaver

4
주어진 예제에서 본질적으로 두 개의 테이블이 있기 때문에 이것은 실제로 질문에 대답하지 않습니다. (클래스가 "표"인 Ietwo div)
Winter

21

또 다른 제안은 테이블 대신 flexbox를 사용하는 것입니다. 이것은 물론 "현대 브라우저"이지만 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>

셀의 너비를 알 수 없습니다.
Tower

1
그런 다음 너비를 넣지 마십시오. 중요하지 않습니다. 그러나 동일한 너비로 확장하려면 두 개의 주요 div의 너비가 동일해야합니다.
Dustin Laine

1
width : calc (100 % / 3)을 사용하면 중간 1 % 더주는 것보다 조금 더 나을 것입니다
ii iml0sto1

5

그것은 CSS의 범위의 일부가 아닙니다. colspan페이지 내용의 구조를 설명하거나 HTML 작업 인 표의 데이터에 의미를 부여합니다.


OP는 구조적 의미없이 " 테이블과 같은 레이아웃 만들기"를 명시 적으로 언급 합니다. CSS 테이블의 목적이 아닙니까? 디자인 전용 CSS 테이블 요소가있는 경우 colspan 속성을 전체 테이블과 다르게 처리해야하는 객관적인 이유는 없습니다. 디자인 전용 CSS colspan 속성이 아닌 이유는 무엇입니까?
Skippy le Grand Gourou

2
이 질문에 대해 가장 많이 투표 된 답변을 확인하십시오. 귀하의 정서는 이미 논의되었으며 이에 동의하는 경향이 있습니다. 이 답변을 작성한 후 5 년 동안이 문제에 대한 의견이 분명히 바뀌 었습니다.
mwcz

4

최신 답변을 제공하려면 오늘이 작업을 수행하는 가장 좋은 방법은 다음과 같이 CSS 그리드 레이아웃을 사용하는 것입니다.

.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%;테이블 셀 요소에 추가 하십시오.


어떻게 도움이 되나요? 테이블의 기본 개념은 모든 행에 동일한 셀이 있다는 것입니다. 행 중 하나에 "width : 1 %"를 성공적으로 구현하는 셀이 있으면 모든 행에 해당 열이 "width : 1 %"로 표시됩니다. "colspan"의 요점은 고정 너비 열을 2 개 이상 가져와 결합하여 결합 된 너비를 얻는 것입니다.
IAM_AL_X 2016 년

3

작동하는 몇 가지 속성에 의존하지만 약간의 성공을 거두었습니다.

table-layout: fixed border-collapse: separate

쉽게 나누기 / 분리되는 셀 너비, 즉 25 % 너비의 4 x 셀 :

.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을 적용하면 'row'요소를 'table'의 맨 위 / 아래로 쉽게 이동할 수 있습니다.


0

div 및 span을 사용하면 datagrid-table 행이 더 많은 양일 때 더 많은 코드 크기를 차지합니다. 아래 코드는 모든 브라우저에서 확인됩니다.

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
OP는 table-cell여러 테이블 열에 걸쳐 있고 싶습니다 . column-span열 레이아웃을 제어하기위한 것입니다. 신문처럼 여러 열로 텍스트를 넘길 수 있습니다.
Chris Wesseling

1
실제로 이것은 디스플레이에서 사용하는 것이 정말 좋을 것입니다 : table-cell; 요소는 css-columns에만 적용됩니다. jsfiddle.net/mk0rrLc3/1
Mark

@ Mark-- column-span은 부모에 정의 된 column-count 속성과 함께 사용됩니다. 디스플레이 유형을 변경할 필요는 없습니다. 또한 열 범위는 값으로 1 또는 모두 만 허용 할 수 있으므로 분류를 허용하지 않으므로 바이올린에서 볼 수있는 "열 범위 : 2"는 속성을 올바르게 사용하지 않습니다.
MistyDawn

0

colspan속성 을 켜거나 꺼야하기 때문에 여기에 온 경우 (예 : 모바일 레이아웃) :

을 복제하고 <td>원하는 것만 표시하십시오 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 속성 "column-count", "column-gap"및 "column-span"은 유사 래퍼 내에 의사 테이블의 모든 열을 유지하는 방식으로이를 수행 할 수 있습니다 (HTML은 깔끔하고 깔끔하게 유지됨).

단 하나의 열 또는 모든 열만 정의 할 수 있으며 Firefox에서 열 범위가 아직 작동하지 않으므로 제대로 표시되도록하려면 몇 가지 추가 CSS가 필요합니다. https://www.w3schools.com/css/css3_multiple_columns.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

이것은 asker가 찾고 있던 솔루션을 제공하지 않습니다. 인라인 행의 셀을 만듭니다.
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, CSS를 사용하는 다른 사용자 용 colspan 5


이 질문자는 HTML <table> 요소를 사용할 수 없다고 구체적으로 언급했습니다. 그가 할 수 있다면 이것은 해결하기 쉬운 문제 일 것입니다.
MistyDawn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.