CSS 표시 : 너비가 100 %로 설정된 경우 테이블 행이 확장되지 않습니다.


96

약간의 문제가 있습니다. FireFox 3.6을 사용하고 있으며 다음과 같은 DOM 구조가 있습니다.

<div class="view-row">
    <div class="view-type">Type</div>
    <div class="view-name">Name</div>                
</div>

그리고 다음 CSS :

.view-row {
width:100%;
display:table-row;
}

.view-name {
display: table-cell;
float:right;
}

.view-type {
display: table-cell;
}

이륙하면 100 % 너비로 display:table-row올바르게 표시됩니다 view-row. 다시 넣으면 축소됩니다. 나는 이것을 JS Bin에 올렸다.

http://jsbin.com/ifiyo

무슨 일이야?

답변:


90

display:table-row등을 사용 하는 경우 포함 테이블을 포함하는 적절한 마크 업이 필요합니다. 그것이 없으면 원래 질문은 기본적으로 다음과 같은 잘못된 마크 업을 제공합니다.

<tr style="width:100%">
    <td>Type</td>
    <td style="float:right">Name</td>
</tr>

위의 테이블은 어디에 있습니까? 당신은 단지 난데없이 행을 가질 수 없습니다 (TR이 중 하나에 포함되어야합니다 table, thead, tbody, 등)

대신으로 외부 요소를 추가 display:table하고 포함하는 요소에 100 % 너비를 넣으십시오. 두 개의 내부 셀은 자동으로 50/50으로 이동하고 텍스트를 두 번째 셀의 오른쪽에 맞 춥니 다. floats테이블 요소는 잊으십시오 . 너무 많은 두통을 유발할 것입니다.

마크 업 :

<div class="view-table">
    <div class="view-row">
        <div class="view-type">Type</div>
        <div class="view-name">Name</div>                
    </div>
</div>

CSS :

.view-table
{
    display:table;
    width:100%;
}
.view-row,
{
    display:table-row;
}
.view-row > div
{
    display: table-cell;
}
.view-name 
{
    text-align:right;
}

11
망할 수레 제거에 +5!
기회의 chum

37
-1 설명이 잘못 되었기 때문입니다. CSS2.1 사양 에 따르면 문제의 마크 업 / CSS가 작동해야합니다.
user123444555621

8
어떤 브라우저도 누락 된 테이블에 문제가 없습니다 (Firefox 3.0 에는 ...). 실제 문제는 테이블 행의 너비 설정이 완전히 무시된다는 것 입니다. (즉, 문제의 마크 업 / CSS가 실제로 예상대로 작동하지 않으므로 위의 의견이 잘못되었습니다.))
user123444555621

3
이 대답은 틀 렸습니다. 질문자의 마크 업이 정확합니다. Pumbaa80이 말했듯이, 문제는 너비가 테이블 수준이 아닌 행 수준이어야한다고 가정하는 것입니다. 너비는 테이블 수준에서만 해석됩니다. 행을 완전히 생략 할 수 있습니다. 아래 내 전체 답변을 참조하십시오.
Amin Ariana

1
나는 작동하는 대답에 대해 언급하지 않았습니다. CSS에 테이블 행을 포함해야한다는 귀하의 의견에 대해 언급했습니다. 당신은하지 않습니다. 당신의 개인적인 신념 때문에 어떤 것을 말하는 것은 의사 적 타당성이라고 말하는 것은 매우 독단적이고 엄격한 말입니다. 특히 CSS가 완전히 유효했을 때.
Bill Rosmus 2012 년

56

테스트 된 답변 :

.view-row css에서 다음을 변경하십시오.

display:table-row;

에:

display:table

그리고 "float"를 제거하십시오 . 모든 것이 예상대로 작동합니다.

댓글에서 제시 한대로 포장 테이블이 필요 없습니다. CSS는 암시적인 트리 구조 (이 경우 행) 수준을 생략 할 수 있습니다. 코드가 작동하지 않는 이유는 "너비"가 테이블 행 수준이 아닌 테이블 수준에서만 해석 될 수 있기 때문입니다. "테이블"과 "테이블 셀"이 바로 아래에있는 경우 암시 적으로 행에있는 것으로 해석됩니다.

작업 예 :

<div class="view">
    <div>Type</div>
    <div>Name</div>                
</div>

CSS 사용 :

.view {
  width:100%;
  display:table;
}

.view > div {
  width:50%;
  display: table-cell;
}

귀하의 답변은 <table><td></td></table>W3C에 따라 자체적으로 잘못된 HTML 마크 업이되는 CSS에 해당하는 것을 제안합니다 . 유효성을 검사하는 동안이 마크 업을 모방하도록 브라우저에 지시하는 이유는 무엇입니까?
KP.

16
이는 CSS 규칙에 의해 정확합니다 : w3.org/TR/CSS2/tables.html#anonymous-boxes . 불필요한 코드 줄 (예 : KP가 제안한 불필요한 <view-row> div)을 제거하면 유지 관리가 더 쉽습니다. 이것은 나를 도왔다. 나는 그것을 사용하고있다. +1
Bill Rosmus 2012 년

1
float 문을 제거하는 것으로 충분하지 않을까요? .view div는 display : table-row 속성을 유지할 수 있습니다.
표의 문자

1
좋아요, ~~하지만 내가 말할 수있는 한 IE9에서는 작동하지 않습니다. ~~ 틀 렸습니다. 대단해! :)
f1lt3r

물론 display : table은 행이 1 개 이상인 경우에는 사용되지 않습니다. 그들은 모두 심하게 정렬되지 않은 결과
edc65

16

CSS3 사양에 따라 레이아웃을 테이블 스타일 요소로 래핑 할 필요가 없습니다. 브라우저는 요소가 존재하지 않는 경우 포함 된 요소의 존재를 유추합니다.


4
CSS 2.1 , 섹션 17.2.1, 상위 3.2 에도 동일한 내용이 지정 되었습니다 . 아래의 HBOX / VBOX 예제는 정확히 해당되는 경우입니다. 그래서 브라우저는 신경 쓰지 않는 것처럼 보입니다.
user123444555621

1

에 제공 .view-type클래스 float:left;또는 삭제 float:right;의를.view-name

편집 :<div class="view-row"> 예를 들어 div 를 다른 div로 래핑하십시오 .<div class="table">

다음 CSS를 설정하십시오.

.table {
    display:table;
    width:100%;}

올바른 결과를 얻으려면 테이블 구조를 사용해야합니다.


나는 ff3.6, 즉 8, 크롬, 오페라로 테스트했습니다. 여기에서 볼 수 있습니다 jsbin.com/ifiyo/4 그들은 나란히 보여줍니다
Sotiris

나는 맨 오른쪽에 이름이 있고 맨 왼쪽에 타자 ... 만약 당신이 둘 다에서 display : inline을하고 display : table-row it을 꺼내면, 나는 더 나은 방법이있을 것이라고 생각하고 있었다. 테이블 행 / 셀 속성을 사용하여 수행합니다.
기회의 chum

0

테이블 내에서 직접 테이블 셀을 중첩 할 수 있습니다. 당신은 테이블이 있습니다. 테이블 행 시작이 작동하지 않습니다. 이 HTML로 시도해보십시오.

<html>
  <head>
    <style type="text/css">
.table {
  display: table;
  width: 100%;
}
.tr {
  display: table-row;
  width: 100%;
}
.td {
  display: table-cell;
}
    </style>
  </head>
  <body>

    <div class="table">
      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>
    </div>

      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>

    <div class="table">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
    </div>

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