간격이 동일한 DIV의 유체 폭


329

유체 너비 컨테이너 DIV가 있습니다.

이 안에는 300px x 250px의 4 개의 DIV가 있습니다 ...

<div id="container">
   <div class="box1"> </div>
   <div class="box2"> </div>
   <div class="box3"> </div>
   <div class="box4"> </div>
</div>

내가 일어나고 싶은 것은 상자 1이 왼쪽에 떠 있고 상자 4가 오른쪽에 떠 있고 상자 2와 3이 균등하게 간격을 두는 것입니다. 브라우저가 작아 질수록 공간도 작아지기 때문에 간격이 유동적이기를 원합니다.

여기에 이미지 설명을 입력하십시오


2
display:inline-block;플로트 대신 하지 않습니까?
ayyp

1
IE6 / IE7 만 지원하기 때문 inline-blockinline요소
리 가격

좋아, 어떤 브라우저를 사용하고 있는지 확실하지 않았습니다.
ayyp

1
내가 생각할 수있는 가장 가까운 솔루션은 각 자식 .box div를 너비가 25 % 인 다른 div로 감싸는 것입니다. 그런 다음 자식 .box div를 래퍼의 가운데에 놓습니다. .box div의 간격은 균등하지만 왼쪽 및 오른쪽 div는 가장자리에 맞지 않습니다.
Paul Sham

5
@Paul Sham의 아이디어를 JSFiddle으로 만들었습니다 .
Sparky

답변:


440

참조 : http://jsfiddle.net/thirtydot/EDp8R/

  • 이것은 IE6 + 및 모든 최신 브라우저 에서 작동 합니다!
  • 작업하기 쉽도록 요청한 치수를 반으로 줄였습니다.
  • text-align: justify와 함께 .stretch포지셔닝을 처리합니다.
  • display:inline-block; *display:inline; zoom:1inline-blockIE6 / 7의 수정 사항 은 여기를 참조하십시오 .
  • font-size: 0; line-height: 0 IE6의 사소한 문제를 해결합니다.

#container {
  border: 2px dashed #444;
  height: 125px;
  text-align: justify;
  -ms-text-justify: distribute-all-lines;
  text-justify: distribute-all-lines;
  /* just for demo */
  min-width: 612px;
}

.box1,
.box2,
.box3,
.box4 {
  width: 150px;
  height: 125px;
  vertical-align: top;
  display: inline-block;
  *display: inline;
  zoom: 1
}

.stretch {
  width: 100%;
  display: inline-block;
  font-size: 0;
  line-height: 0
}

.box1,
.box3 {
  background: #ccc
}

.box2,
.box4 {
  background: #0ff
}
<div id="container">
  <div class="box1"></div>
  <div class="box2"></div>
  <div class="box3"></div>
  <div class="box4"></div>
  <span class="stretch"></span>
</div>

추가 span( .stretch)는으로 교체 할 수 있습니다 :after.

이것은 여전히 위의 솔루션과 동일한 모든 브라우저에서 작동 합니다. :afterIE6 / 7에서는 작동하지 않지만 distribute-all-lines어쨌든 사용 하고 있으므로 중요하지 않습니다.

참조 : http://jsfiddle.net/thirtydot/EDp8R/3/

에 약간의 단점있다 :after: Safari에서 완벽하게 마지막 행 작업을 할, 당신은 HTML의 공백을 조심해야합니다.

특히 이것은 작동하지 않습니다.

<div id="container">
    ..
    <div class="box3"></div>
    <div class="box4"></div>
</div>

그리고 이것은 :

<div id="container">
    ..
    <div class="box3"></div>
    <div class="box4"></div></div>

변경하여 각 클래스를 div추가하지 않고도 임의의 수의 자식에 대해 이것을 사용할 수 있습니다boxN

.box1, .box2, .box3, .box4 { ...

#container > div { ...

이것은 div의 첫 번째 자식 인 #containerdiv를 선택하고 그 아래의 다른 div 는 선택하지 않습니다. 배경색을 일반화 하기 위해 CSS3 n-order selector를 사용할 수 있지만 IE9 + 및 기타 최신 브라우저에서만 지원됩니다.

.box1, .box3 { ...

된다 :

#container > div:nth-child(odd) { ...

jsfiddle 예제는 여기참조 하십시오 .


123
html의 각 상자 사이에 공백이 있어야한다는 것을 알기 위해 3 시간이 걸렸습니다. "정의"는 요소 사이의 간격을 넓히고 컨텐츠가 <div/><div/><div/>작동하지 않는 경우 확장합니다 . 당신이 있어야합니다 <div/> <div/> <div/>.
venimus

5
생성 된 내용 (일반적인 경우)으로 작업하는 경우 메모하기가 어렵 기 때문에 :)에 주목하고 싶었습니다. 내가 사용하는 생각 justify같은 경우에,하지만 작동하는 솔루션을 제공을 부탁드립니다. 많은 실험을 저장했습니다 (3h 디버깅에도 불구하고 : D). 또한 마지막 줄을 왼쪽으로 정렬하려면 보이지 않는 상자를 추가해야합니다 (행을 완료하기 위해)
venimus

4
@venimus :이 기술을 사용하여 또 다른 답변을 작성했습니다 : stackoverflow.com/questions/10548417/… . 보이지 않는 상자를 추가하여 발생하는 여분의 높이를 제거하기 위해 무엇을 했습니까?
thirtydot

11
누군가가 .stretch가 필요한지 설명 할 수 있습니까 ?
atp

6
@HartleySan : .stretch/ :after는 텍스트가 정당화 되고 마지막 행이 정당화 되지 않기 때문에 / 가 필요합니다 . 여기서 우리는 마지막 줄이 정당화되기를 원하므로 :after. 두 번째 질문에 대해서는 이전 답변에서 잠시 전에 살펴 보았습니다 . 그 대답에는 JavaScript가 필요했습니다. 구형 브라우저 (IE8)를 지원해야한다면 JavaScript가 필요하다고 생각합니다.
thirtydot

140

가장 쉬운 방법은 flexbox를 사용하는 것입니다.

http://css-tricks.com/snippets/css/a-guide-to-flexbox/

CSS는 다음과 같습니다.

#container {
    display: flex;
    justify-content: space-between;
}

데모 : http://jsfiddle.net/QPrk3/

그러나 이는 현재 비교적 최신 브라우저 ( http://caniuse.com/flexbox ) 에서만 지원됩니다 . 또한 flexbox 레이아웃 사양이 몇 차례 변경되었으므로 이전 구문을 추가하여 더 많은 브라우저를 사용할 수 있습니다.

http://css-tricks.com/old-flexbox-and-new-flexbox/

http://css-tricks.com/using-flexbox/


1
이것에 대해 감사합니다. 페이지 하단에 고정 된 바닥 글의 네 개의 짝수 목록에 적용했습니다. FF28.0, Chrome 34.0.1847.116 m 및 IE11에서 치료를했습니다.
user1063287

1
Flexbox는 웹에서 가장 많이 지원되는 도구가 아니며 일반적인 여백 및 패딩 접근 방식을 능가하지 않습니다.
TheBlackBenzKid

widht가 정의되지 않은 여러 div를 정당화하려는 모든 사람들에게 display : flex 옵션과 함께 flex-wrap을 사용하십시오. 동적 너비로 div를 줄 바꿈합니다.
Kamil Budziewski

20

경우 CSS3는 옵션이며, 이것은 CSS를 사용하여 수행 할 수있는 calc()기능을.

사례 1 : 한 줄에 상자 정렬 ( FIDDLE )

마크 업은 간단합니다-컨테이너 요소가있는 여러 div입니다.

CSS는 다음과 같습니다

div
{
    height: 100px;
    float: left;
    background:pink;
    width: 50px;
    margin-right: calc((100% - 300px) / 5 - 1px); 
}
div:last-child
{
    margin-right:0;
}

어디 -1px가 IE9 + CALC / 반올림 버그를 해결하기 위해 - 참조 여기

사례 2 : 여러 줄에 상자 정렬 ( FIDDLE )

여기에는 calc()기능 이외에도 media queries필요합니다.

기본 아이디어는 각 #columns 상태에 대해 미디어 쿼리를 설정하는 것입니다. 여기서 calc ()를 사용하여 각 요소 (마지막 열의 요소 제외)에 대한 마진 오른쪽을 계산합니다.

이것은 많은 작업처럼 들리지만 LESS 또는 SASS를 사용하는 경우 매우 쉽게 수행 할 수 있습니다

(여전히 CSS로 할 수는 있지만 모든 계산을 수동으로 수행 한 다음 상자 너비를 변경하면 모든 것을 다시 해결해야합니다)

다음은 LESS를 사용하는 예는 다음과 같습니다 (당신은이 코드를 복사 / 붙여 넣기 할 수 있습니다 여기에 [그것은 또한 내가 언급 바이올린 위를 생성하는 데 사용되는 코드입니다, 그것으로 재생)

@min-margin: 15px;
@div-width: 150px;

@3divs: (@div-width * 3);
@4divs: (@div-width * 4);
@5divs: (@div-width * 5);
@6divs: (@div-width * 6);
@7divs: (@div-width * 7);

@3divs-width: (@3divs + @min-margin * 2);
@4divs-width: (@4divs + @min-margin * 3);
@5divs-width: (@5divs + @min-margin * 4);
@6divs-width: (@6divs + @min-margin * 5);
@7divs-width: (@7divs + @min-margin * 6);


*{margin:0;padding:0;}

.container
{
    overflow: auto;
    display: block;
    min-width: @3divs-width;
}
.container > div
{
    margin-bottom: 20px;
    width: @div-width;
    height: 100px;
    background: blue;
    float:left;
    color: #fff;
    text-align: center;
}

@media (max-width: @3divs-width) {
    .container > div {  
        margin-right: @min-margin;
    }
    .container > div:nth-child(3n) {  
        margin-right: 0;
    }
}

@media (min-width: @3divs-width) and (max-width: @4divs-width) {
    .container > div {  
        margin-right: ~"calc((100% - @{3divs})/2 - 1px)";
    }
    .container > div:nth-child(3n) {  
        margin-right: 0;
    }
}

@media (min-width: @4divs-width) and (max-width: @5divs-width) {
    .container > div {  
        margin-right: ~"calc((100% - @{4divs})/3 - 1px)";
    }
    .container > div:nth-child(4n) {  
        margin-right: 0;
    }
}

@media (min-width: @5divs-width) and (max-width: @6divs-width) {
    .container > div {  
        margin-right: ~"calc((100% - @{5divs})/4 - 1px)";
    }
    .container > div:nth-child(5n) {  
        margin-right: 0;
    }
}

@media (min-width: @6divs-width){
    .container > div {  
        margin-right: ~"calc((100% - @{6divs})/5 - 1px)";
    }
    .container > div:nth-child(6n) {  
        margin-right: 0;
    }
}

따라서 기본적으로 먼저 상자 너비와 상자 사이에 원하는 최소 여백을 결정해야합니다.

이를 통해 각 주에 필요한 공간을 계산할 수 있습니다.

그런 다음 calc ()를 사용하여 오른쪽 여백을 계산하고 n 번째 자식을 사용하여 마지막 열의 상자에서 오른쪽 여백을 제거하십시오.

허용되는 답변에 비해이 답변 의 장점text-align:justify두 줄 이상의 상자가있을 때-마지막 행의 상자가 '정렬'되지 않는다는 것입니다. 예 : 마지막 행에 2 개의 상자가 남아있는 경우-I 첫 번째 상자가 왼쪽에 있고 다음 상자가 오른쪽에 있기를 원하지 않습니다. 오히려 상자가 순서대로 서로 따라갑니다.

브라우저 지원 과 관련하여 : 이것은 IE9 +, Firefox, Chrome, Safari 6.0 이상 에서 작동 합니다 (자세한 내용 은 여기 참조). 그러나 IE9 +에서는 미디어 쿼리 상태 사이에 약간의 결함이 있음을 알았습니다. [누군가이 문제를 해결하는 방법을 알고 있다면 정말로 알고 싶습니다 :)] <- 여기서 수정


13

다른 게시물에서 flexbox에 대해 언급 했지만 두 개 이상의 항목 행이 필요한 경우 flexbox의 space-between속성 이 실패합니다 (포스트 끝 참조)

현재까지 이것에 대한 유일한 해결책은

CSS 그리드 레이아웃 모듈 ( 코드 펜 데모 )

기본적으로 필요한 관련 코드는 다음과 같습니다.

ul {
  display: grid; /* (1) */
  grid-template-columns: repeat(auto-fit, 120px); /* (2) */
  grid-gap: 1rem; /* (3) */
  justify-content: space-between; /* (4) */
  align-content: flex-start; /* (5) */
}

1) 컨테이너 요소를 그리드 컨테이너로 만듭니다.

2) 필요에 따라 '자동'열로 그리드를 설정하십시오. 반응 형 레이아웃을 위해 수행됩니다. 각 열의 너비는 120px입니다. (의 사용을 참고 auto-fit(에 나란히 놓이는으로 auto-fill) 0 빈 트랙을 붕괴 1 행 레이아웃에있는 () -. 남은 공간을 차지하기 위해 확장 할 항목을 허용 (체크 아웃 이 데모를 내가 무슨 말보고 )).

3) 그리드 행과 열에 간격 / 홈통을 설정하십시오. 여기에는 '공간 간격'레이아웃 이 필요하므로 간격 이 필요한만큼 커지므로 실제로 간격이 최소 간격 이됩니다.

4) 및 5)-flexbox와 유사합니다.

body {
  margin: 0;
}
ul {
  display: grid;
  grid-template-columns: repeat(auto-fit, 120px);
  grid-gap: 1rem;
  justify-content: space-between;
  align-content: flex-start;
  
  /* boring properties: */
  list-style: none;
  width: 90vw;
  height: 90vh;
  margin: 2vh auto;
  border: 5px solid green;
  padding: 0;
  overflow: auto;
}
li {
  background: tomato;
  height: 120px;
}
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

코덱 데모 (효과를 보려면 크기 조정)


브라우저 지원 -Caniuse

현재 Chrome (Blink), Firefox, Safari 및 Edge에서 지원됩니다! ... IE의 일부 지원 ( Rachel Andrew 의이 게시물 참조 )


NB :

Flexbox의 space-between속성은 한 행의 항목에 대해 효과적이지만 flex-wrap: wrap, 마지막 줄의 정렬을 제어 할 수 없기 때문에 해당 항목을 감싸는 Flex 컨테이너에 적용하면 (와 함께 ) 실패합니다. 마지막 행은 항상 정당화됩니다 (보통 원하는 것이 아닙니다)

시연하려면 :

Codepen (내가 말하는 것을보기 위해 크기 조정)


CSS 그리드에 대한 추가 정보 :


1
매우 과소 평가 된 답변. 이것은 내가하고 싶은 일을 달성하는 가장 간단하고 효과적인 방법이었습니다. 감사합니다.
Barnaby Mercer

1
이것은 크기와 공간을 약간 조정하면서 내가 찾은 동작을 정확하게 생성 한 가장 적은 양의 CSS (및 JS가 없습니다!)였습니다.
EKW

1
나는 이것을 오랫동안 찾고 있었고 마침내 그것을 발견했다!. 감사합니다 @Danield
nareeboy

2

이것은 다른 크기의 5 이미지로 저에게 효과적이었습니다.

  1. 컨테이너 사업부 만들기
  2. 이미지의 순서가없는 목록
  3. CSS에서는 부호가없는 세로로 표시하고 글 머리 기호가 없어야합니다.
  4. 컨테이너 div의 내용을 정당화하십시오.

이것은 justify-content : space-between으로 작동하며 목록에 있으며 가로로 표시됩니다.

CSS에서

 #container {
            display: flex;
            justify-content: space-between;
 }
    #container ul li{ display:inline; list-style-type:none;
}

html에서

<div id="container"> 
  <ul>  
        <li><img src="box1.png"><li>
        <li><img src="box2.png"><li>
        <li><img src="box3.png"><li>
        <li><img src="box4.png"><li>
        <li><img src="box5.png"><li>
    </ul>
</div>

이 코드는 잘 작동 할 수 있지만 좋은 답변에는 작동 방식 및 왜 좋은 솔루션인지에 대한 설명이 포함됩니다.
Blackwood


이 반응이 있습니까?
stackdave

1

jQuery당신이 직접 부모를 대상으로 수 있습니다.

이는 많은 어린이들이 동적으로 추가되는 방법을 정확히 알지 못하거나 자신의 숫자를 알 수없는 경우에 유용합니다.

var tWidth=0;

$('.children').each(function(i,e){
tWidth += $(e).width();

///Example: If the Children have a padding-left of 10px;..
//You could do instead:
tWidth += ($(e).width()+10);

})
$('#parent').css('width',tWidth);

이것은 구부러짐에 parent따라 수평으로 자랄 수 있습니다 children.

참고 : 이것은 '.children'a widthHeightSet

도움이 되길 바랍니다.


1

"행"당 요소 수와 컨테이너 너비를 알고 있으면 선택기를 사용하여 요소에 여백을 추가하여 정당한 모양을 만들 수 있습니다.

나는 정당화하고 싶었던 세 div의 행을 가지고 있었으므로 다음을 사용했다.

.tile:nth-child(3n+2) { margin: 0 10px }

이렇게하면 각 행의 가운데 div에 1 및 3 div를 컨테이너의 바깥 쪽 가장자리로 강제하는 여백이 생길 수 있습니다

테두리 배경색 등과 같은 다른 것들에도 좋습니다.

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