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. ( FirefoxChrome 에서 테스트 )


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, 많은 경우에 당신도이 기본 사업부로 같은 작업을 수행 할 필요가 없습니다 heightwidth자동으로하지만 적용, 귀하의 경우가 아니라면 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.