왜 "display : table-cell;"div가 있습니까? 마진의 영향을받지 않습니까?


211

나는이 div서로 옆 요소 display: table-cell;.

나는 margin그들 사이 에 설정하고 싶지만 margin: 5px효과가 없습니다. 왜?

내 코드 :

<div style="display: table-cell; margin: 5px; background-color: red;">1</div>
<div style="display: table-cell; margin: 5px; background-color: green;">1</div>

답변:


310

원인

에서 MDN이 문서 :

[여백 속성]은 테이블 캡션, 테이블 및 인라인 테이블 이외의 테이블 표시 유형을 가진 요소를 제외한 모든 요소에 적용됩니다.

즉, margin속성은 요소에 적용 할 수 없습니다display:table-cell .

해결책

border-spacing대신 속성 사용을 고려하십시오 .

display:table레이아웃이 있는 부모 요소에 적용되어야합니다 border-collapse:separate.

예를 들면 다음과 같습니다.

HTML

<div class="table">
    <div class="row">
        <div class="cell">123</div>
        <div class="cell">456</div>
        <div class="cell">879</div>
    </div>
</div>

CSS

.table {display:table;border-collapse:separate;border-spacing:5px;}
.row {display:table-row;}
.cell {display:table-cell;padding:5px;border:1px solid black;}

jsFiddle 데모 보기


가로 및 세로 여백이 다름

Diego Quirós가 언급했듯이이 border-spacing속성은 수평 및 수직 축에 대해 서로 다른 여백을 설정하기 위해 두 값을 허용합니다.

예를 들어

.table {/*...*/border-spacing:3px 5px;} /* 3px horizontally, 5px vertically */

6
감사! 수평 및 수직 공간이 다른 경계 간격을 필요로하는 경우에도이 표기법이 있습니다 : 수평 수직;
Diego Quirós

그리고 나는 버그를 발견했다고 생각했다. 더 많은 CSS를 배워야한다는 것이 밝혀졌습니다.
Pete Alvin

나는 이것이 실제로 특정 왼쪽 / 오른쪽 / 위쪽 / 아래쪽 여백을 처리하지 않는 것 같아? 그리고 특정 테이블 셀을 갖는 방법이 나머지와 다른 패딩을 가지지 않습니까?
Nathan

@Nathan padding은 평소와 같이 필요한 선택기 (예 : 클래스 또는 ID)에 대해 설정할 수 있습니다. margin셀 사이 를 의미하는 경우 두 값을로 설정하여 세로 축과 가로 축에 대해 별도로 설정할 수 border-spacing있지만 개별 셀이 아닌 전체 테이블에 적용됩니다.
보아스

21

내부 div를 사용하여 여백을 설정할 수 있습니다.

<div style="display: table-cell;">
   <div style="margin:5px;background-color: red;">1</div>
</div>
<div style="display: table-cell; ">
  <div style="margin:5px;background-color: green;">1</div>
</div>

JS 피들


2
셀 사이에 여백을 원하지만 왼쪽이나 오른쪽이 아닌 여백을 원하는 경우에 좋습니다. 그러면 CSS는 다음과 같을 수 있습니다 .inner-div { margin-right: 5px; } .outer-cell:last-child .inner-div { margin-right: 0; }. 그러나이 문제를 주목하십시오 :이 예제의 빨간색과 초록색 배경은 셀에 없기 때문에 높이가 반드시 일치하지는 않습니다.
Henrik N

8

표 셀은 여백을 존중하지 않지만 대신 투명한 테두리를 사용할 수 있습니다.

div {
  display: table-cell;
  border: 5px solid transparent;
}

참고 : 여기서 백분율을 사용할 수 없습니다 ... :(


2

이처럼 서로 div가 있다면

<div id="1" style="float:left; margin-right:5px">

</div>
<div id="2" style="float:left">

</div>

이 작동합니다!


10
좋아, 그러나 그가 같은 높이의 두 div를 원한다면 어떻게 될까요? 플로트는 이것을 할 수 없습니다.
hieroshima

그리고 그것이 JS 가 굉장한 이유 입니다 :)
Chris Happy

@ChrisHappy CSS 솔루션이있을 때는 절대 JavaScript를 사용하지 마십시오. 코드가 커집니다.
ssc-hrep3 2018 년

@ ssc-hrep3 응답 성이 필요할 때 부피가 큰 CSS 솔루션으로는 더 이상 충분하지 않습니다 ...
Chris Happy

2
이것들은 충분합니다-특히 반응이 빠른 요구 사항이있는 경우에 충분합니다. 이제 대부분의 주요 브라우저에서 지원되는 flexbox 를 살펴 보고이 정확한 문제를 매우 쉽게 해결하십시오. 레이아웃 스타일은 JavaScript로 수행해서는 안됩니다.
ssc-hrep3 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.