2 열 div 레이아웃 : 너비가 고정 된 오른쪽 열, 왼쪽 유체


158

내 요구 사항은 간단합니다 .2 열은 올바른 크기가 고정되어 있습니다 . 불행히도 나는 stackoverflow 또는 Google에서 작동하는 솔루션을 찾을 수 없었습니다. 내 컨텍스트에서 구현하면 거기에 설명 된 각 솔루션이 실패합니다. 현재 솔루션은 다음과 같습니다.

div.container {
    position: fixed;
    float: left;
    top: 100px;
    width: 100%;
    clear: both;
}

#content {
    margin-right: 265px;
}

#right {
    float: right;
    width: 225px;
    margin-left: -225px;
}

#right, #content {
    height: 1%; /* fixed for IE, although doesn't seem to work */
    padding: 20px;
}
<div class="container">
    <div id="content">
        fooburg content
    </div>
    <div id="right">
        test right
    </div>
</div>

위의 코드로 다음을 얻습니다.

|----------------------- -------|
| fooburg content  |            |
|-------------------------------|
|                  | test right | 
|----------------------- -------|

조언 부탁드립니다. 많은 감사합니다!

답변:


268

왼쪽 열의 플로트를 제거하십시오.

HTML 코드에서 오른쪽 열은 왼쪽 열보다 먼저 와야합니다.

오른쪽에 부동 (및 너비)이 있고 왼쪽 열에 너비가없고 부동이 없으면 유연합니다. :)

또한 overflow: hidden외부 div에 일부 높이 (자동 가능)를 적용하여 내부 div를 모두 둘러싸십시오.

마지막으로, 왼쪽 열에서, 추가 width: autooverflow: hidden브라우저 창 크기를 조절하고, 오른쪽 열에는 이러한 속성없이, 왼쪽 하나를 만지면, 이것이 바로 하나에서 왼쪽 열 독립을한다 (예를 들어, 왼쪽 열이 실행됩니다 이 속성을 사용하면 올바른 공간을 유지합니다.

HTML 예 :

<div class="container">
    <div class="right">
        right content fixed width
    </div>
    <div class="left">
        left content flexible width
    </div>
</div>

CSS :

.container {
   height: auto;
   overflow: hidden;
}

.right {
    width: 180px;
    float: right;
    background: #aafed6;
}

.left {
    float: none; /* not needed, just for clarification */
    background: #e8f6fe;
    /* the next props are meant to keep this block independent from the other floated one */
    width: auto;
    overflow: hidden;
}​​

예 : http://jsfiddle.net/jackJoe/fxWg7/


2
모든 열 clear: both 내부의 @Mir A 는 외부 수레에 영향을 미치지 않습니다. 컬럼 사이에 동일한 레벨의 컬럼을 배치하지 않으면 "깨지기 쉬운"상태가 아니며 , 마지막에 배치하면 아무런 해가 없습니다.
jackJoe

6
나는 Adam의 예제를 사용하는 것을 고려할 것입니다. html 마크 업에서 오른쪽 열을 왼쪽 열 앞에 두는 것은 좋은 생각이 아닙니다.
Danny_Joris

1
@Danny_Joris 동의합니다. 당신은 미디어 쿼리를 사용하는 경우 또한, 그것은 오른쪽 열에 밀어 지금 어려운 아래 왼쪽 열을
andrewtweber

2
그것이 어떻게 작동하는지 궁금한 사람들을 위해 여기에 설명이 있습니다. stackoverflow.com/questions/25475822/…
Hashem Qolami

1
플렉스 박스를 사용하지 않고 올바르게 쌓을 수 있도록 왼쪽 뒤에 오른쪽 열을 가질 수있는 방법이 있는지 궁금합니다.
Dominic

71

http://www.alistapart.com/articles/negativemargins/를 참조 하십시오 . 이것이 바로 필요한 것입니다 ( 예 4 ).

<div id="container">
    <div id="content">
        <h1>content</h1>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.  Phasellus varius eleifend tellus. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nulla facilisi. Sed wisi lectus, placerat nec, mollis quis, posuere eget, arcu.</p>
        <p class="last">Donec euismod. Praesent mauris mi, adipiscing non, mollis eget, adipiscing ac, erat. Integer nonummy mauris sit amet metus. In adipiscing, ligula ultrices dictum vehicula, eros turpis lacinia libero, sed aliquet urna diam sed tellus. Etiam semper sapien eget metus.</p>
    </div>
</div>

<div id="sidebar">
    <h1>sidebar</h1>
    <ul>
        <li>link one</li>
        <li>link two</li>
    </ul>
</div>

#container {
    width: 100%;
    background: #f1f2ea url(background.gif) repeat-y right;
    float: left;
    margin-right: -200px;
}
#content {
    background: #f1f2ea;
    margin-right: 200px;
}
#sidebar {
    width: 200px;
    float: right;

1
환상적이고 간단한 솔루션이며 올바른 HTML 순서도 유지합니다!
user1794295

3
마크 업 순서가 올 바르기 때문에 허용되는 솔루션보다 낫습니다.
Petri Lehtinen

나는 이것에 대해 몰랐다. 나는 이것에 대해 어떻게 알지 못했다. 완전한! 나는 '유체 입력, 고정 너비 검색 버튼'전체를 수행하려고 노력했으며 분명히 소스 순서가 실제로 중요합니다. 이건 못 살아 감사!
Malabar Front

이 솔루션이 마음에 들었습니다. 모바일 중단 점 시간이 있기 때문에 오른쪽 열 / 사이드 바가 왼쪽 열 내용 위에 있지 않습니다.
dougtesting.net

이 방법으로 올바른 열을 맨 위로 가져올 수 없습니다.
mulllhausen

29

오른쪽 열을 왼쪽 앞에 배치하지 않으려면 음수 오른쪽 마진을 사용하십시오.

@media 설정을 포함시켜 "응답 성"을 유지하면 오른쪽 열이 좁은 화면에서 왼쪽 아래로 떨어집니다.

<div style="background: #f1f2ea;">
  <div id="container">
    <div id="content">
        <strong>Column 1 - content</strong>
    </div>
  </div>
  <div id="sidebar">
    <strong>Column 2 - sidebar</strong>
  </div>
<div style="clear:both"></div>

<style type="text/css">
#container {
    margin-right: -300px;
    float:left;
    width:100%;
}
#content {
    margin-right: 320px; /* 20px added for center margin */
}
#sidebar {
    width:300px;
    float:left
}
@media (max-width: 480px) {
    #container {
        margin-right:0px;
        margin-bottom:20px;
    }
    #content {
        margin-right:0px;
        width:100%;
    }
    #sidebar {
        clear:left;
    }
}
</style>

1
훌륭한 솔루션. 왼쪽에서 더 중요한 콘텐츠가있는 블로그와 같은 레이아웃의 경우 HTML에서 왼쪽 아래에 오른쪽을 유지하는 것이 중요합니다.
Jake

3
훌륭한 답변! Codepen에 대한 실제 예는 다음과 같습니다. codepen.io/martinkrulltott/pen/yNxezM
Martin

11

지금까지 가장 간단하고 유연한 솔루션table display :

HTML, 왼쪽 div가 먼저오고 오른쪽 div가 두 번째로옵니다 ... 우리는 왼쪽에서 오른쪽으로 읽고 씁니다. 따라서 div를 오른쪽에서 왼쪽으로 배치하는 것은 의미가 없습니다.

<div class="container">
    <div class="left">
        left content flexible width
    </div>
    <div class="right">
        right content fixed width
    </div>
</div>

CSS :

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

.left {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}​​

.right {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}

사례 예 :

// One div is 150px fixed width ; the other takes the rest of the width
.left {width: 150px} .right {width: 100%}

// One div is auto to its inner width ; the other takes the rest of the width
.left {width: 100%} .right {width: auto}

감사합니다. flexbox가 실행 가능한 대안이 아닌 경우 테이블에 대한 시간과 장소가있는 경우가 있습니다. 제대로 스택되지 않는 DOM에 올바른 콘텐츠를 배치하기보다는.
Dominic

1
나는 이것이 '깨끗한'해결책이라는 것을 좋아한다. 그러나 div를 테이블 셀 모드로 설정하는 유일한 문제는 테이블 및 Td를 사용할 수도 있다는 것입니다. 오버플로 스크롤링과 같은 기능을 잃어
버릴 수 있습니다

이 솔루션은 적어도 RWD 기술에 대해 의미 적으로 정확하고 친숙하지만 tablewith 를 사용하는 td것은 확실하지 않기 때문에 불공평합니다 !
ianp

이 방법을 사용하면 미디어 쿼리에서 열이 좁아지면 일반 div에 대한 테이블을 쉽게 삭제할 수 있습니다. 좋고 깨끗합니다. 나는 좋아한다.
AnthonyVO

6

아직 언급되지 않은 솔루션을 제안하고 싶습니다 .CSS3를 사용 calc()하여 혼합 %하고 px단위를 지정하십시오. calc()우수한 지원 요즘, 그것은 매우 복잡한 레이아웃을 신속하게 건설 할 수 있습니다.

여기 JSFiddle이 있습니다 아래 코드에 대한 링크.

HTML :

<div class="sidebar">
  sidebar fixed width
</div>
<div class="content">
  content flexible width
</div>

CSS :

.sidebar {
    width: 180px;
    float: right;
    background: green;
}

.content {
    width: calc(100% - 180px);
    background: orange;
}

이 개념이 더 복잡한 레이아웃에 적용 되었음을 보여주는 또 다른 JSFiddle 이 있습니다. 여기서는 SCSS를 사용하여 변수에 유연하고 자기 기술적 인 코드를 사용할 수 있었지만 "하드 코딩 된"값이 문제가되지 않으면 순수 CSS로 레이아웃을 쉽게 다시 만들 수 있습니다.


2

다음과 같은 일반적인 HTML 소스 주문형 솔루션입니다.

  • 소스 순서의 첫 번째 열은 유동적입니다
  • 소스 순서의 두 번째 열은 고정되어 있습니다.
    • 이 열은 CSS를 사용하여 왼쪽 또는 오른쪽으로 띄울 수 있습니다

오른쪽의 고정 / 두 번째 열

#wrapper {
  margin-right: 200px;
}
#content {
  float: left;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: right;
  width: 200px;
  margin-right: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

왼쪽의 고정 / 두 번째 열

#wrapper {
  margin-left: 200px;
}
#content {
  float: right;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: left;
  width: 200px;
  margin-left: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

다른 해결책은 display : table-cell ; 동일한 높이의 열이 생성됩니다.


오른쪽의 두 번째 열은 작동하지 않습니다. 왼쪽 열에 텍스트가 가득 찬 경우 오른쪽 열이 새 행으로 표시됩니다.
TomSawyer

더 많은 콘텐츠를 넣고 크기를 조정하려고 시도한 적이 있습니까? 방금 코드를 테스트했지만 작동하지 않았습니다.
TomSawyer

@TomSawyer 나는 당신이 무슨 말을하는지 잘 모르겠습니다. jsfiddle.net/salman/mva6cnxLjsfiddle.net/salman/mva6cnxL/1 콘텐츠를 추가하려고합니다 . 완벽하게 작동합니다.
살만 A

내가 찾은 것. 감사합니다

0

이봐, 당신이 할 수있는 일은 컨테이너에 고정 너비를 적용하고 clear : both와 같은 다른 div 클래스를 사용하는 것입니다.

div#left {

width: 600px;
float: left;
}

div#right {

width: 240px;
float: right;

}

div.clear {

clear:both;

}

왼쪽 및 오른쪽 컨테이너 아래에 명확한 div를 배치하십시오.


-3

나는 그것을 단순화했다 : 나는 jackjoe의 답변을 편집했다. 높이 자동 등 필요하지 않다고 생각합니다.

CSS :

#container {
position: relative;
margin:0 auto;
width: 1000px;
background: #C63;
padding: 10px;
}

#leftCol {
background: #e8f6fe;
width: auto;
}

#rightCol {
float:right;
width:30%;
background: #aafed6;
}

.box {
position:relative;
clear:both;
background:#F39;
 }
</style>

HTML :

<div id="container">

  <div id="rightCol"> 
   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
 </div>

 <div id="leftCol">

   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

Lorem ipsum dolor 앉은 자세, consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor는 앉은 자세로, consectetuer addipiscing elit.Phasellus varius eleifend입니다.

</div>

</div>

<div class="box">
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
</div>

원래 질문은 고정 크기의 올바른 열을 원합니다.
Dr. Aaron Dishno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.