동일한 <table>에 여러 <tbody>를 가질 수 있습니까?


594

<tbody>동일한 태그를 여러 개 가질 수 있습니까 <table>? 그렇다면 어떤 시나리오에서 여러 <tbody>태그를 사용해야 합니까?

답변:


710

예, 예를 들어 다음과 같이 데이터 그룹을보다 쉽게 ​​스타일 지정하는 데 사용합니다.

thead th { width: 100px; border-bottom: solid 1px #ddd; font-weight: bold; }
tbody:nth-child(odd) { background: #f5f5f5;  border: solid 1px #ddd; }
tbody:nth-child(even) { background: #e5e5e5;  border: solid 1px #ddd; }
<table>
    <thead>
        <tr><th>Customer</th><th>Order</th><th>Month</th></tr>
    </thead>
    <tbody>
        <tr><td>Customer 1</td><td>#1</td><td>January</td></tr>
        <tr><td>Customer 1</td><td>#2</td><td>April</td></tr>
        <tr><td>Customer 1</td><td>#3</td><td>March</td></tr>
    </tbody>
    <tbody>
        <tr><td>Customer 2</td><td>#1</td><td>January</td></tr>
        <tr><td>Customer 2</td><td>#2</td><td>April</td></tr>
        <tr><td>Customer 2</td><td>#3</td><td>March</td></tr>
    </tbody>
    <tbody>
        <tr><td>Customer 3</td><td>#1</td><td>January</td></tr>
        <tr><td>Customer 3</td><td>#2</td><td>April</td></tr>
        <tr><td>Customer 3</td><td>#3</td><td>March</td></tr>
    </tbody>
</table>

여기에서 예를 볼 수 있습니다 . 최신 브라우저에서만 작동하지만 현재 응용 프로그램에서 지원하는 것이므로 JavaScript 등의 그룹화를 사용할 수 있습니다. 가장 중요한 것은 행을 시각적으로 그룹화하여 데이터를 훨씬 읽기 쉽게 만드는 편리한 방법입니다 . 물론 다른 용도가 있지만 적용 가능한 한, 이것은 가장 일반적인 것입니다.


6
좋은 답변 주셔서 감사합니다. 하나 tbody또는 여러 개의 화면 판독기에 문제가됩니까 ?
Jitendra Vyas

1
@ metal-gear-solid-내 경험상 그들은 예를 들어 마치 마치 하나 인 것처럼 잘 처리합니다 <tbody>. 테이블 중첩 을 시작하면 일반적으로 화면 판독기에 실제 탐색 문제가 발생합니다.
Nick Craver

10
@ metal : 아니요, 의미 론적 차이 <tbody>가 있습니다. 답변에서 설명한 것처럼 여러 요소가 표에서 별도의 그룹을 설명합니다. 또한 일반적으로 배경 셀을 타겟팅하는 것이 더 낫다는 점을 추가해야하므로 CSS는 예를 들어 다음과 같아야합니다.tbody:nth-child(odd) td { background: #f5f5f5; }
DisgruntledGoat

4
"newer browsers"의 정의는 무엇입니까?
Tim Down

8
@TimDown- "최신 브라우저"라고 말하면 :nth-child()연결된 데모에 대한 CSS 사용법 만 참조 하면 여러 <tbody>브라우저에서 작동합니다.
Nick Craver

298

예. 에서 DTD를

<!ELEMENT table
     (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>

따라서 하나 이상을 기대합니다. 그런 다음 계속 말합니다

테이블 행 그룹간에 규칙 이 필요한 경우 여러 tbody 섹션을 사용하십시오 .


12
HTML5의 사양에서는,이 약간의 변화 만은 "기본적인 예, 여러 tbody요소가 잘) 남아 있습니다. 특히, 지금있는 사람 넣을 수 tfoot요소를 한 후tbody 처럼 경우 . (그들은 깔끔하게 DTD의 측면 쪽 강화 그들은 하나를 제공하지 않는다고 말함으로써 .) :-)
TJ Crowder

5
이 답변에 감사드립니다. 사양 참조는 내 책의 # 1 답변입니다.
KernelCurry

1
따라서 하나 이상을 기대합니다. 이것은 잘못입니다. 세트 <tr>일 수도 있으므로 0도 될 수 있습니다 (즉, tbody 또는 tr은 tr이 아니라 tbody 일 수 있음을 의미합니다).
Alexis Wilke

@AlexisWilke 이것은 스펙에 따라 사실입니다 : 테이블에 테이블 바디가 하나만 있고 테이블 헤드 또는 풋 섹션이없는 경우를 제외하고 TBODY 시작 태그는 항상 필요합니다
Gecko IT


14

Martin Joiner의 문제는 <caption>태그 에 대한 오해로 인해 발생합니다 .

<caption>태그는 테이블의 캡션을 정의합니다.

<caption>태그의 첫 번째 자식이어야 <table>태그입니다.

테이블 당 하나의 캡션 만 지정할 수 있습니다.

또한 scope특성은 <th>요소가 아닌 요소에 배치해야합니다 <tr>.

멀티 헤더 멀티 tbody 테이블을 작성하는 올바른 방법은 다음과 같습니다.

<table id="dinner_table">
    <caption>This is the only correct place to put a caption.</caption>
    <tbody>
        <tr class="header">
            <th colspan="2" scope="col">First Half of Table (British Dinner)</th>
        </tr>
        <tr>
            <th scope="row">1</th>
            <td>Fish</td>
        </tr>
        <tr>
            <th scope="row">2</th>
            <td>Chips</td>
        </tr>
        <tr>
            <th scope="row">3</th>
            <td>Peas</td>
        </tr>
        <tr>
            <th scope="row">4</th>
            <td>Gravy</td>
        </tr>
    </tbody>
    <tbody>
        <tr class="header">
            <th colspan="2" scope="col">Second Half of Table (Italian Dinner)</th>
        </tr>
        <tr>
            <th scope="row">5</th>
            <td>Pizza</td>
        </tr>
        <tr>
            <th scope="row">6</th>
            <td>Salad</td>
        </tr>
        <tr>
            <th scope="row">7</th>
            <td>Oil</td>
        </tr>
        <tr>
            <th scope="row">8</th>
            <td>Bread</td>
        </tr>
    </tbody>
</table>


caption태그는 오프닝 따라야 table태그를. developer.mozilla.org/en-US/docs/Web/HTML/Element/table
Cypher

네가 옳아. 어떻게 든 문서를 잘못 해석했습니다. 오류를 수정했습니다.
John Slegers

헤더 에는 scope="rowgroup"(대신 col)을 사용하는 것이 좋습니다 tbody. 예를 참조하십시오 .
CletusW

7

예. 예를 들어 코스와 같이 테이블의 관련 부분을 동적으로 숨기거나 공개하는 데 사용합니다. 즉.

<table>
  <tbody id="day1" style="display:none">
    <tr><td>session1</td><tr>
    <tr><td>session2</td><tr>
  </tbody>
  <tbody id="day2">
    <tr><td>session3</td><tr>
    <tr><td>session4</td><tr>
  </tbody>
  <tbody id="day3" style="display:none">
    <tr><td>session5</td><tr>
    <tr><td>session6</td><tr>
  </tbody>
</table>

많은 행을 개별적으로 처리하지 않고 몸통을 조작하여 버튼을 제공하여 모든 것 또는 현재 날짜 만 전환 할 수 있습니다.


4

편집 : caption태그는 테이블에 속하므로 한 번만 존재해야합니다. 내가 한 것처럼 captiontbody요소와 a 를 연결하지 마십시오 .

<table>
    <caption>First Half of Table (British Dinner)</caption>
    <tbody>
        <tr><th>1</th><td>Fish</td></tr>
        <tr><th>2</th><td>Chips</td></tr>
        <tr><th>3</th><td>Pease</td></tr>
        <tr><th>4</th><td>Gravy</td></tr>
    </tbody>
    <caption>Second Half of Table (Italian Dinner)</caption>
    <tbody>
        <tr><th>5</th><td>Pizza</td></tr>
        <tr><th>6</th><td>Salad</td></tr>
        <tr><th>7</th><td>Oil</td></tr>
        <tr><th>8</th><td>Bread</td></tr>
    </tbody>
</table>

위의 나쁜 예 : 복사하지 마십시오

위와 같은 예제는 caption태그를 잘못 이해했기 때문에 예상대로 렌더링되지 않습니다 . 표준을 따르지 않기 때문에 올바르게 렌더링하려면 많은 CSS 해킹이 필요합니다.

caption태그 에서 W3Cs 표준을 검색 했지만 caption테이블 당 하나의 요소 만 있어야한다는 사실에 대한 명확한 규칙을 찾을 수 없었지만 실제로는 그렇지 않습니다.


3

또한 HTML5 DOCTYPE을 사용하여 W3C의 HTML Validator를<tbody> 통해 여러 태그가 있는 HTML 문서를 실행 하면 성공적으로 유효성이 검사됩니다.


2

JSFiddle 을 만들었습니다. 테이블이있는 두 개의 중첩 된 ng-repeats와 tbody에 부모 ng-repeat가 있습니다. 테이블의 행을 검사하면 6 개의 tbody 요소, 즉 부모 수준이있는 것을 볼 수 있습니다.

HTML

<div>
        <table class="table table-hover table-condensed table-striped">
            <thead>
                <tr>
                    <th>Store ID</th>
                    <th>Name</th>
                    <th>Address</th>
                    <th>City</th>
                    <th>Cost</th>
                    <th>Sales</th>
                    <th>Revenue</th>
                    <th>Employees</th>
                    <th>Employees H-sum</th>
                </tr>
            </thead>
            <tbody data-ng-repeat="storedata in storeDataModel.storedata">
                <tr id="storedata.store.storeId" class="clickableRow" title="Click to toggle collapse/expand day summaries for this store." data-ng-click="selectTableRow($index, storedata.store.storeId)">
                    <td>{{storedata.store.storeId}}</td>
                    <td>{{storedata.store.storeName}}</td>
                    <td>{{storedata.store.storeAddress}}</td>
                    <td>{{storedata.store.storeCity}}</td>
                    <td>{{storedata.data.costTotal}}</td>
                    <td>{{storedata.data.salesTotal}}</td>
                    <td>{{storedata.data.revenueTotal}}</td>
                    <td>{{storedata.data.averageEmployees}}</td>
                    <td>{{storedata.data.averageEmployeesHours}}</td>
                </tr>
                <tr data-ng-show="dayDataCollapse[$index]">
                    <td colspan="2">&nbsp;</td>
                    <td colspan="7">
                        <div>
                            <div class="pull-right">
                                <table class="table table-hover table-condensed table-striped">
                                    <thead>
                                        <tr>
                                            <th></th>
                                            <th>Date [YYYY-MM-dd]</th>
                                            <th>Cost</th>
                                            <th>Sales</th>
                                            <th>Revenue</th>
                                            <th>Employees</th>
                                            <th>Employees H-sum</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <tr data-ng-repeat="dayData in storeDataModel.storedata[$index].data.dayData">
                                            <td class="pullright">
                                                <button type="btn btn-small" title="Click to show transactions for this specific day..." data-ng-click=""><i class="icon-list"></i>
                                                </button>
                                            </td>
                                            <td>{{dayData.date}}</td>
                                            <td>{{dayData.cost}}</td>
                                            <td>{{dayData.sales}}</td>
                                            <td>{{dayData.revenue}}</td>
                                            <td>{{dayData.employees}}</td>
                                            <td>{{dayData.employeesHoursSum}}</td>
                                        </tr>
                                    </tbody>
                                </table>
                            </div>
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>

(참고 : 두 수준에 많은 데이터가있는 경우 DOM을 채 웁니다. 따라서 데이터를 가져 와서 대체하는 지시문을 작성하고 있습니다. 즉 부모를 클릭 할 때 DOM에 추가하고 다른 것을 클릭하거나 동일한 부모를 클릭하면 제거합니다 Prisjakt.nu 에서 찾은 동작을 얻으려면 나열된 컴퓨터로 스크롤하여 행이 아닌 링크를 클릭하면 링크가 아닌 행을 클릭하면 tr이 추가되고 부모를 다시 클릭하거나 다른 항목을 클릭하면 제거됩니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.