div를 내용보다 크지 않게 만들려면 어떻게해야합니까?


2070

비슷한 레이아웃이 있습니다.

<div>
    <table>
    </table>
</div>

나는 div내만큼 넓게 확장되기를 원합니다 table.


90
이 효과를 "shrinkwrapping"이라고하며, 이에 따라 몇 가지 방법 (플로트, 인라인, 최소 / 최대 너비)을 선택할 수 있습니다.
— annakata

답변:


2426

이 솔루션은 사용자의 설정하는 것입니다 div에를 display: inline-block.


239
@ leif81 a span또는 a div또는 ul다른 것을 사용할 수 있습니다 . 중요한 부분은 최소 너비가 display: inline-block
— 되길

10
궁금한 점이있는 경우 부모의 "text-align : center"를 설정하고 테이블의 "text-align : left"를 설정하여 테이블의 부모를 중앙에 배치 할 수 있습니다 (예 : <body style = "text-align : center"> < span style = "text-align : left; display : inline-block;"> <table> ... </ table> </ span> </ body>)
— bernstein

12
스팬이있는 크롬에서는 작동하지 않지만 공백을 사용하여 작동합니다. nowrap;
— albanx

57
당신이 한 번주의하시기 바랍니다 display: inline-block속성은 설정 margin: 0 auto;하지 않습니다 일을 예상대로입니다. 이 경우 상위 용기 경우 text-align: center;그 inline-block소자의 좌우 중앙한다.
— Savas Vedova

12
inline-block나를 위해 일하지 않았지만 inline-flexDID.
— mareoraft

331

CSS라고 불리는 너비에 맞는 너비를 가진 블록 요소를 원하고 사양은 그러한 것을 얻는 축복 된 방법을 제공하지 않습니다. CSS2에서 적합도 축소는 목표가 아니지만 브라우저가 "가벼운 공간"에서 너비를 가져와야하는 상황을 처리하는 것을 의미합니다. 이러한 상황은 다음과 같습니다.

  • 흙손
  • 절대 위치 요소
  • 인라인 블록 요소
  • 테이블 요소

너비가 지정되지 않은 경우. CSS3에 원하는 것을 추가한다고 생각한다고 들었습니다. 지금은 위 중 하나를 수행하십시오.

기능을 직접 노출하지 않기로 한 결정은 이상해 보일 수 있지만 그만한 이유가 있습니다. 비쌉니다. 맞춤 축소는 최소 두 번 서식을 지정하는 것을 의미합니다. 너비를 알 때까지 요소 서식을 시작할 수 없으며 전체 내용을 거치지 않고 너비를 계산할 수 없습니다. 또한, 생각만큼 자주 수축 맞춤 요소가 필요하지 않습니다. 왜 테이블 주위에 여분의 div가 필요합니까? 어쩌면 테이블 캡션 만 있으면됩니다.


34
나는 inline-block이것을 정확하게 의도하고 문제를 완벽하게 해결 한다고 말합니다 .
— miahelf

6
나는 그들이 CSS4에 추가하고 있다고 생각합니다.content-box, max-content, min-content, available, fit-content, auto
— Muhammad Umer

4
새로운 fit-content키워드 (이 답변이 처음 작성되었을 때 존재하지 않고 여전히 완벽하게 지원되지 않음 )를 사용하면 요소에 "수축에 맞게"크기 조정을 명시 적으로 적용 할 수 있으므로 여기에 제안 된 해킹이 필요하지 않습니다. 지원 기능이있는 브라우저 만 타겟팅 할 수 있습니다. 그럼에도 불구하고 +1; 이것들은 지금도 유용합니다!
— Mark Amery

float내가해야 할 일을 했어!
— nipunasudha

228

내가 사용하는 것 같아

display: inline-block;

작동하지만 브라우저 호환성에 대해서는 잘 모르겠습니다.


또 다른 해결책은 블록 동작을 유지하려는 경우 div다른 것을 감싸는 것 입니다 div.

HTML :

<div>
    <div class="yourdiv">
        content
    </div>
</div>

CSS :

.yourdiv
{
    display: inline;
}

23
브라우저 호환성 질문에 대답하려면 DIV 요소의 IE7 / 8에서는 작동하지 않습니다. SPAN 요소를 사용해야합니다.
— 매트 브록

@feeela – 나는 항상 줌 앞에 *를 넣는다 *display: inline; *zoom: 1;. 나는이 특정 상황에 대해 테스트하지는 않았지만, 과거에는 hasLayout 핵이 IE7 또는 IE7 모드의 IE8 (또는 기발한 IE8)에만 필요하다는 것을 항상 발견했습니다.
— robocat

@robocat 예 inline-blockIE 7에서 활성화 된 해결 방법입니다 .
— feeela

@feela-당신의 의견은 나에게 이해가되지 않습니다! 나는 줌 앞에 *를 두는 것이 좋습니다 * 줌 : 1;
— robocat

4
인라인 블록 솔루션이 작동하는 이유를 설명하십시오.
— HelloWorldNoMore

220

display: inline-block 요소에 여백을 추가합니다.

나는 이것을 추천 할 것이다 :

#element {
    display: table; /* IE8+ and all other modern browsers */
}

보너스 : 이제을 #element추가하는 것만으로도 멋진 새로운 중심을 쉽게 맞출 수 있습니다 margin: 0 auto.


14
+1-요소를 중앙에 배치 할 수있는 최신 브라우저를위한 최상의 솔루션입니다. position: absolute<IE8 에는 조건부 주석 이 필요합니다.
— uınbɐɥs

21
지정 display: inline-block하면 여백이 추가되지 않습니다. 그러나 CSS는 공백을 처리하여 인라인 요소 사이에 표시됩니다.
— feeela

display : table 솔루션이 작동하는 이유를 설명하십시오.
— HelloWorldNoMore

2
인라인 블록을 사용하면 요소를 부모에 배치 할 수 없습니다 (예 : 텍스트 정렬 : 센터가 있으면 왼쪽에 붙일 수 없습니다) display : table is perfect :)
— FlorianB

1
당신이 가지고있는 경우가 갈 수있는 방법입니다position: absolute
— m4heshd

90

시도 할 수 있습니다 fit-content(CSS3) :

div {
  width: fit-content; 
  /* To adjust the height as well */ 
  height: fit-content;
}

1
@BartlomiejSkwira IE 또는 Eclipse에서 작업하는 대체물이 있습니까? 인라인 블록으로 작동하지 않는 다른 솔루션 .. \
— DAVIDBALAS1

8
이것은 너무 의미가 있으며 물론 지원이 부족합니다.
— Sava B.

86

나를 위해 일하는 것은 :

display: table;

에서 div. ( Firefox 및 Chrome 에서 테스트 )


4
네, 특히 마진을 중심으로해야하는 경우 : 자동. 이 경우 인라인 블록은 해결책이 아닙니다.
— Zsolt Szatmari

1
또한이 요소 내에서 패딩 작업을하려면 border-collapse: separate;스타일을 설정해야합니다 . 많은 브라우저에서 기본값이지만 부트 스트랩과 같은 CSS 프레임 워크는 종종 값을로 재설정합니다 collapse.
— Ruslan Stelmachenko

2009 년에 만들어진 Windows Mobile 6.5 전화의 MSIE 6에서 테스트되었습니다. 전화의 문제가 아닐 수있는 전폭 div로 우아하게 저하됩니다. 데스크톱에서 8 미만의 Internet Explorer 버전을 사용하는 사람은 지원되지 않는 운영 체제를 사용하고 있습니다 (IE6은 XP, IE7은 Vista). 해당 컴퓨터에서 인터넷을 계속 안전하게 사용하려면 GNU / Linux로 업그레이드하라는 페이지로 리디렉션합니다.
— Silas S. Brown

85

두 가지 더 나은 솔루션이 있습니다

  1. display: inline-block;

    또는

  2. display: table;

이 두 가지 중 display:table; , 더 있기 때문에 display: inline-block;추가 마진을 추가합니다.

들어 display:inline-block;당신은 여분의 공간을 해결하기 위해 부정적인 여백 방법을 사용할 수 있습니다


2
왜 display:table더 좋은지 설명해 주 시겠습니까?
— Nathaniel Ford

1
display : inline-block의 경우 추가 간격을 수정하려면 음수 여백 방법을 사용해야합니다.
— Shuvo Habib

8
@NathanielFord display:table는 블록 서식 컨텍스트에 요소를 남겨 두므로 평소와 같이 여백 등으로 위치를 제어 할 수 있습니다. display:-inline-*반면에, 요소를 인라인 형식 지정 컨텍스트에 배치하면 브라우저에서 상속 된 글꼴 / 행 높이 설정이있는 행 상자가 포함 된 익명 블록 래퍼를 작성하고 해당 행 상자에 블록을 삽입합니다 (정렬 기본적으로 기준선에 따라 세로로). 여기에는 더 많은 "마법"이 포함되므로 잠재적 인 놀라움이 발생합니다.
— Ilya Streltsyn


43

어떤 컨텍스트에서 이것이 나타날지 알지 못하지만 CSS 스타일 속성 float중 하나 left또는 right이 효과가 있다고 생각합니다 . 반면에 텍스트가 떠 다니는 것과 같은 다른 부작용도 있습니다.

그래도 틀렸다면 수정하십시오 .100 % 확실하지 않으며 현재 직접 테스트 할 수 없습니다.


1
예, CSS 2.1에서. (CSS2.0은 float를 전폭으로 만들지 만 실제로는 IE5 / Mac 만 해당합니다) 테이블과 플로트는 내용물에 맞게 축소 할 수있는 유일한 디스플레이 유형입니다.
— bobince

41

귀하의 질문에 대한 답변은 미래에 내 친구에게 있습니다 ...

즉 "intrinsic"은 최신 CSS3 업데이트와 함께 제공됩니다

width: intrinsic;

불행히도 IE 는 뒤에 있기 때문에 아직 지원하지 않습니다.

더 그것에 대해 : CSS 내장 및 외부 크기 조정 모듈 레벨 3 과 수 있습니까 사용? : 내재 및 외재 사이징 .

지금은 만족 <span>하거나로 <div>설정해야합니다

display: inline-block;

12
intrinsic값이 비표준입니다. 실제로입니다 width: max-content. 해당 링크 나 이미 연결된 초안 에 대한 MDN 페이지를 참조하십시오 .
— maryisdead

34

CSS2 호환 솔루션은 다음을 사용합니다.

.my-div
{
    min-width: 100px;
}

div를 플로팅하여 가능한 한 작게 만들 수 있지만 div 내부에 무언가가 떠있는 경우 clearfix 를 사용해야합니다 .

.my-div
{
    float: left;
}

3
그렇습니다. 어떤 doctype을 사용하고 있습니까?
— Soviut

34
width:1px;
white-space: nowrap;

나를 위해 잘 작동합니다 :)


그러나 다시 내 경우는 div 내부의 텍스트이며 OP와 같은 테이블은 아닙니다.
— Rui Marques

u는 콘텐츠 항목의 폭을 설정 할 필요가 없기 때문에 JQuery와의 UI 슬라이더이는 greate입니다
— CoffeJunky

26

OK, 많은 경우에 당신도이 기본 사업부로 같은 작업을 수행 할 필요가 없습니다 height및 width자동으로하지만 적용, 귀하의 경우가 아니라면 inline-block당신을 위해 디스플레이거야 작업을 ...보고 내가 당신을 위해 만든 코드와는의 할 일 당신이 찾고있는 것 :

div {
  display: inline-block;
}
<div>
  <table>
    <tr>
      <td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
      <td>Nunc auctor aliquam est ac viverra. Sed enim nisi, feugiat sed accumsan eu, convallis eget felis. Pellentesque consequat eu leo nec pharetra. Aenean interdum enim dapibus diam.</td>
      <td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
    </tr>
  </table>
</div>



19

display: inline;(또는 white-space: nowrap;) 를 사용하여 간단하게 수행 할 수 있습니다 .

이 정보가 도움이 되길 바랍니다.


18

inline-block@ user473598로 사용할 수 있지만 이전 브라우저는주의하십시오.

/* Your're working with */
display: inline-block;

/* For IE 7 */
zoom: 1;
*display: inline;

/* For Mozilla Firefox < 3.0 */
display:-moz-inline-stack;

Mozilla는 인라인 블록을 전혀 지원하지 않지만 -moz-inline-stack거의 동일한

inline-block표시 속성 주위의 일부 크로스 브라우저 : https://css-tricks.com/snippets/css/cross-browser-inline-block/

https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/ 에서이 속성을 사용하여 몇 가지 테스트를 볼 수 있습니다.


1
무슨 소리 야? Mozilla Firefox는 inline-block3.0 (2008)부터 지원합니다 . 출처 : developer.mozilla.org/en-US/docs/Web/CSS/…
— Chazy Chaz


18
<table cellpadding="0" cellspacing="0" border="0">
    <tr>
        <td>
            <div id="content_lalala">
                this content inside the div being inside a table, needs no inline properties and the table is the one expanding to the content of this div =)
            </div>
        </td>
    </tr>
</table>

사람들이 때때로 테이블을 좋아하지 않는다는 것을 알고 있지만 CSS 인라인 해킹을 시도했지만 일부 div에서 작동했지만 다른 div에서는 그렇지 않았으므로 확장 div를 묶는 것이 더 쉬웠습니다. 테이블 ... 그리고 ... 인라인 속성을 가질 수 있거나 가질 수 없으며 여전히 테이블은 내용의 전체 너비를 보유 할 테이블입니다. =)


2
그것은 "적절한"방법은 아니지만 IE6 / 7 / 8은 종종 상황이 조금 복잡해지면 잘 재생되지 않기 때문에 왜 이런 식으로 해야하는지 완전히 이해합니다. 당신은 내 투표를 얻었다.
— Craigo

이 작업을 수행하지만 모든 단일 입력 상자를 둘러싸 야하므로 추가 HTML이 많이 있습니다.
— NickSoft

15

실습 데모는 여기

.floating-box {
    display:-moz-inline-stack;
    display: inline-block;

    width: fit-content; 
    height: fit-content;

    width: 150px;
    height: 75px;
    margin: 10px;
    border: 3px solid #73AD21;  
}
<h2>The Way is using inline-block</h2>

Supporting elements are also added in CSS.

<div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
</div>


13

두 가지 맛의 CSS3 flexbox 솔루션 : 상단에 하나는 스팬처럼 작동하고 하단에 하나는 div처럼 작동하여 래퍼를 사용하여 모든 너비를 취합니다. 그들의 클래스는 각각 "top", "bottom"및 "bottomwrapper"입니다.

body {
    font-family: sans-serif;
}
.top {
    display: -webkit-inline-flex;
    display: inline-flex;
}
.top, .bottom {
    background-color: #3F3;
    border: 2px solid #FA6;
}
/* bottomwrapper will take the rest of the width */
.bottomwrapper {
    display: -webkit-flex;
    display: flex;
}
table {
    border-collapse: collapse;
}
table, th, td {
    width: 280px;
    border: 1px solid #666;
}
th {
    background-color: #282;
    color: #FFF;
}
td {
    color: #444;
}
th, td {
    padding: 0 4px 0 4px;
}
Is this
<div class="top">
	<table>
        <tr>
            <th>OS</th>
            <th>Version</th> 
        </tr>
        <tr>
            <td>OpenBSD</td>
            <td>5.7</td> 
        </tr>
        <tr>
            <td>Windows</td>
            <td>Please upgrade to 10!</td> 
        </tr>
    </table>
</div>
what you are looking for?
<br>
Or may be...
<div class="bottomwrapper">
    <div class="bottom">
    	<table>
            <tr>
                <th>OS</th>
                <th>Version</th> 
            </tr>
            <tr>
                <td>OpenBSD</td>
                <td>5.7</td> 
            </tr>
            <tr>
                <td>Windows</td>
                <td>Please upgrade to 10!</td> 
            </tr>
        </table>
    </div>
</div>
this is what you are looking for.


에 대한 kudos display: inline-flex;. BTW 이것은 Chrome 62, firefox 57 및 safari 11의 접두사없이 작동합니다.
— Horacio

12
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

이것은 부모 div 너비를 가장 큰 요소 너비와 동일하게 만듭니다.


가로 크기를 최소화하고 유지하기 위해 세로 크기에만 적용 할 수있는 방법이 있습니까?
— Gobliins 2019

12

시도하십시오 display: inline-block;. 크로스 브라우저와 호환되도록 아래 CSS 코드를 사용하십시오.

div {
  display: inline-block;
  display:-moz-inline-stack;
  zoom:1;
  *display:inline;
  border-style: solid;
  border-color: #0000ff;
}
<div>
  <table>
    <tr>
      <td>Column1</td>
      <td>Column2</td>
      <td>Column3</td>
    </tr>
  </table>
</div>


11

Firebug로 변조 -moz-fit-content하여 OP가 원하는 것을 정확하게 수행하고 다음과 같이 사용할 수있는 속성 값 을 찾았습니다 .

width: -moz-fit-content;

Firefox에서만 작동하지만 Chrome과 같은 다른 브라우저에서는 해당 기능을 찾을 수 없습니다.


2017 년 1 월 현재 IE (모든 버전, Edge 및 모바일 포함) 및 Opera Mini는을 지원하지 않습니다 fit-content. Firefox는 너비 만 지원합니다. 다른 브라우저에서도 잘 지원됩니다.
— Gavin

11

이 코드를 사용해보십시오. CSS 섹션의 코드를 따르십시오.

div {
  display: inline-block;
  padding: 2vw;
  background-color: green;
}

table {
  width: 70vw;
  background-color: white;
}
<div>
    <table border="colapsed">
      <tr>
        <td>Apple</td>
        <td>Banana</td>
        <td>Strawberry</td>
      </tr>
      <tr>
        <td>Apple</td>
        <td>Banana</td>
        <td>Strawberry</td>
      </tr>
      <tr>
        <td>Apple</td>
        <td>Banana</td>
        <td>Strawberry</td>
      </tr>

    </table>
</div>


7

태그 안에 태그 display: inline-block를 추가 하고 CSS 형식을 외부 태그에서 새로운 내부 태그로 이동하여 비슷한 문제 ( 항목이 중앙에 있었기 때문에 사용하고 싶지 않은 곳)를 해결했습니다 . 당신에게 적합한 대답이 아니라면 다른 대안 아이디어로 이것을 버립니다 .spandivdivspandisplay: inline block


7

div요소 에서 두 가지 방법 중 하나를 사용할 수 있습니다 .

display: table;

또는,

display: inline-block; 

나는 display: table;모든 여분의 공간을 자체적으로 처리하기 때문에을 사용하는 것을 선호합니다 . 하지만 display: inline-block일부 여분의 공간 고정이 필요합니다.


6
div{
  width:auto;
  height:auto;
}

div에 인라인 (또는 인라인 블록) 요소가 포함되어 있고 div 자체와 다른 글꼴 크기와 줄 높이를 가진 경우에는 작동하지 않습니다.
— quotesBro

5

컨테이너가 줄을 끊고 몇 시간 후에 좋은 CSS 솔루션을 찾고 아무것도 찾지 못하면 jQuery를 대신 사용 합니다.

$('button').click(function(){

  $('nav ul').each(function(){
    
    $parent = $(this).parent();
    
    $parent.width( $(this).width() );
    
  });
});
nav {
  display: inline-block;
  text-align: left; /* doesn't do anything, unlike some might guess */
}
ul {
  display: inline;
}

/* needed style */
ul {
  padding: 0;
}
body {
  width: 420px;
}

/* just style */
body {
  background: #ddd;
  margin: 1em auto;
}
button {
  display: block;
}
nav {
  background: #bbb;
  margin: 1rem auto;
  padding: 0.5rem;
}
li {
  display: inline-block;
  width: 40px;
  height: 20px;
  border: solid thin #777;
  margin: 4px;
  background: #999;
  text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button>fix</button>

<nav>
  <ul>
    <li>3</li>
    <li>.</li>
    <li>1</li>
    <li>4</li>
  </ul>
</nav>

<nav>
  <ul>
    <li>3</li>
    <li>.</li>
    <li>1</li>
    <li>4</li>
    <li>1</li>
    <li>5</li>
    <li>9</li>
    <li>2</li>
    <li>6</li>
    <li>5</li>
    <li>3</li>
    <li>5</li>
  </ul>
</nav>


이것은 Chrome의 스 니펫에서 눈에 띄게 손상되었습니다. 수정 버튼을 두 번 클릭하면 처음 클릭했을 때와 다른 결과가 나타납니다.
— Mark Amery

내 Mac의 @MarkAmery 크롬, 사파리 및 파이어 폭스에서 방금 시도했지만 눈에 띄는 오류가없고 콘솔에 아무것도없고 일관된 동작이 있습니다. 아마도 창문이있는 것일 수도 있습니다.
— cregox

5

개정 (자식이 여러 개인 경우 작동) : jQuery를 사용할 수 있습니다 (JSFiddle 링크를보십시오)

var d= $('div');
var w;


d.children().each(function(){
 w = w + $(this).outerWidth();
 d.css('width', w + 'px')
});

jQuery를 포함시키는 것을 잊지 마십시오 ...

여기 JSfiddle을보십시오


귀하의 사업부에 여러 자녀가있는 경우 고장입니다. 그것은 단순히 div 너비를 첫 번째 자식 의 너비로 설정합니다 .
— Mark Amery

@MarkAmery 우선, 부정적인 투표를하기 전에 질문을주의 깊게 읽으십시오. 그들은 한 자녀를 요구했습니다. 여러 자녀와 함께 어떻게 할 수 있는지 궁금하다면 수정 된 답변을보십시오.
— Bondsmith

4

나는 노력 div.classname{display:table-cell;}했고 효과가 있었다!

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