float : left가 설정된 경우 div를 최대 너비로 확장


115

다음과 같은 것이 있습니다.

<div style="width:100px;float:left">menu</div>
<div style="float:left">content</div>

두 개의 수레가 모두 필요합니다. 콘텐츠 div가 전체 화면에서 메뉴의 100px를 뺀 값을 채우기를 원합니다. float를 사용하지 않으면 div가 정확히 확장됩니다. 그러나 float가 설정되었을 때 어떻게 설정합니까? 내가 좋아하는 sth를 사용하면

style=width:100%

그런 다음 콘텐츠 div는 부모의 크기를 가져옵니다. 즉, 본문 또는 내가 시도한 다른 div이므로 물론 메뉴 오른쪽에 맞지 않고 아래에 표시됩니다.

답변:


138

내가 당신을 올바르게 이해했으면 좋겠습니다 . http://jsfiddle.net/EAEKc/를보십시오.

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Content with Menu</title>
  <style>
    .content .left {
      float: left;
      width: 100px;
      background-color: green;
    }
    
    .content .right {
      margin-left: 100px;
      background-color: red;
    }
  </style>
</head>

<body>
  <div class="content">
    <div class="left">
      <p>Hi, Flo!</p>
    </div>
    <div class="right">
      <p>is</p>
      <p>this</p>
      <p>what</p>
      <p>you are looking for?</p>
    </div>
  </div>
</body>

</html>


5
질문은 "두 개의 수레가 모두 필요하다"고 말합니다.
Crescent Fresh

8
예, 당신이 옳고 동의합니다. 그러나 Flo는 둘 다라고 생각하기 때문에 이것 만 언급했다고 생각합니다! 원하는 레이아웃을 가져 와서 내 대체 솔루션이 필요했습니다.
merkuro

@merkuro : 좋은 지적입니다. 원하는 효과를 얻기 위해 ".right"를 띄울 필요가 없다는 데 동의합니다. @Flo : 확인할 수 있습니까, 콘텐츠 div가 플로팅되어야합니까? 다른 이유로?
Crescent Fresh

작동 할 수도 있습니다. 그 이유는 맞습니다. 플로트가 더 멋지지만 작동하지 않을 것 같습니다
Flo

2
Ahh jeah와 나는 다시 내가 그것을 float로 변경 한 이유를 봅니다. Ie7과 Firefox는 잘 작동하지만 5.5와 6은 왼쪽 div의 오른쪽 가장자리에서 여백을 시작하므로 236px (실제 너비, 100 예) 두 div 사이의 간격
Flo

100

내가 찾은 가장 교차 호환 가능한 방법은 그다지 분명하지 않습니다. 두 번째 열에서 플로트를 제거하고 적용 overflow:hidden해야합니다. 이것은 div 외부로 나가는 모든 콘텐츠를 숨기는 것처럼 보이지만 실제로는 div가 부모 내에 머물도록 강제합니다.

다음은 코드를 사용하여 수행 할 수있는 방법의 예입니다.

<div style="width: 100px; float: left;">menu</div>
<div style="overflow: hidden;">content</div>

이것이이 문제가있는 모든 사람에게 유용하기를 바랍니다. 다른 해상도에 맞게 조정하려고 시도한 후 제가 구축 한 사이트에 가장 적합하다고 생각한 것입니다. 안타깝게도 div콘텐츠 뒤에 오른쪽 플로팅을 포함하면 작동하지 않습니다. 좋은 IE 호환성과 함께 작동하는 좋은 방법을 아는 사람이 있다면 매우 기쁩니다.

새롭고 더 나은 옵션 사용 display: flex;

이제 Flexbox 모델이 상당히 광범위하게 구현되었으므로 flex레이아웃에 훨씬 더 많은 가능성을 허용하므로 실제로 대신 사용하는 것이 좋습니다 . 다음은 원본과 같은 간단한 2 열입니다.

<div style="display: flex;">
    <div style="width: 100px;">menu</div>
    <div style="flex: 1;">content</div>
</div>

그리고 여기에 유연한 너비의 중앙 열이있는 3 열이 있습니다!

<div style="display: flex;">
    <div style="width: 100px;">menu</div>
    <div style="flex:1;">content</div>
    <div style="width: 100px;">sidebar</div>
</div>

몇 가지 추가 테스트 후 IE 6에서 작동하기 위해 "position : relative"를 사용하여 hasLayout을 트리거 할 필요가없는 것 같습니다. IE 5에 대해 잘 모르겠지만 어쨌든 포함하는 것은 일반적으로 문제가되지 않습니다. 안전을 위해.
alanaktion

1
이 답변은 감사하지 않은 것 같지만 알아두면 정말 좋습니다. 이것은 div 내부에 부동 요소가 있어도 부동을 허용합니다. 나는 구글 "블록 서식 컨텍스트"입니다. 지금.
Carlos Gil

가장 좋은 방법은 시간을 낭비하는 대신 브라우저 간 호환되지 않는 CSS 트릭을 추가하는 대신 간단한 2 cols 테이블을 사용하는 것입니다
Marco Demaio 2012

@Marco 내 디자인이 반응하기 때문에 CSS를 사용해야했습니다. 다른 화면 크기에는 다른 레이아웃이 필요했기 때문에 테이블이 작동하지 않았을 것입니다. 또한이 방법은 기본적으로 누구나 여전히 사용하는 모든 브라우저에서 작동하는 것으로 보입니다.
alanaktion

1
@MarcoDemaio, 내 요점은 모바일 장치에서와 같이 더 작은 고정 열이 기본 열만큼 큰 화면 크기에서 두 열이 전체 너비 행이되기를 원한다는 것입니다. 실제로 JavaScript로 콘텐츠를 옮기고 싶지 않은 한 테이블로.
alanaktion

31

여백에 크기를 고정하지 않는 솔루션

.content .right{
    overflow: auto; 
    background-color: red;
}

Merkuro의 경우 +1이지만 플로트의 크기가 변경되면 고정 마진이 실패합니다. 위의 CSS를 오른쪽 div에 사용하면 왼쪽 플로트의 크기를 변경하여 크기가 멋지게 변경됩니다. 좀 더 유연합니다. 여기에서 바이올린을 확인하십시오 : http://jsfiddle.net/9ZHBK/144/


2
@alanaktion 나는 불필요한 자동을 제거했습니다. 차이점은 오버플로 값입니다. 분명히 overflow: hiddenoverflow auto같은 동작이 발생할. 나는 또한 사람들이 바이올린을 고맙게 생각한다고 생각합니다.
Wilt 2014 년

이것이 작동하는 이유를 알고 싶다면 여기를 참조하십시오. stackoverflow.com/a/1767270/2756409
TylerH

나는 이것이 merkuro의 해결책보다 낫다고 생각합니다.
SkuraZZ

6

플로팅 된 요소는 일반 흐름 레이아웃에서 제외되며 DIV와 같은 블록 요소는 더 이상 부모의 너비에 걸쳐 있지 않습니다. 이 상황에서 규칙이 변경됩니다. 바퀴를 재창조하는 대신이 사이트에서 두 개의 열 레이아웃을 만드는 몇 가지 가능한 솔루션을 확인하십시오. http://www.maxdesign.com.au/presentation/page_layouts/

특히 "액체 2 단 레이아웃"입니다.

건배!


4

누구나 관심이 있고 "플로팅"을 좋아하지 않는 경우 HTML 5에 대한 업데이트 된 솔루션입니다.

테이블 및 테이블 셀에 고정 너비를 설정할 수 있으므로이 경우 테이블이 잘 작동합니다.

.content-container{
    display: table;
    width: 300px;
}

.content .right{
    display: table-cell;   
    background-color:green;
    width: 100px;
}

http://jsfiddle.net/EAEKc/596/ @merkuro의 원본 소스 코드


+1 마지막으로 고정 너비 요소와 함께 작동하는 것이 기술적으로 부동 소수점을 사용하지 않더라도 오른쪽에 있습니다.
Karthik T

+1 그렇습니다. 수년 동안 수레와 위치 및 테이블로 고생 한 후 이것이 올바른 솔루션입니다. 허용 된 솔루션이 안전하지 않은 CSS를 전파합니다.
horace

4

이 사용법은 문제를 해결할 수 있습니다.

width: calc(100% - 100px);

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Content with Menu</title>
  <style>
    .content .left {
      float: left;
      width: 100px;
      background-color: green;
    }
    
    .content .right {
      float: left;
      width: calc(100% - 100px);
      background-color: red;
    }
  </style>
</head>

<body>
  <div class="content">
    <div class="left">
      <p>Hi, Flo!</p>
    </div>
    <div class="right">
      <p>is</p>
      <p>this</p>
      <p>what</p>
      <p>you are looking for?</p>
    </div>
  </div>
</body>

</html>


SO에 오신 것을 환영합니다. 이것이 어떻게 작동하는지에 대한 설명을 추가 할 수 있습니까?
yacc

3

그리고에 따라 merkuro당신이 왼쪽에 하나를 최대화하려는 경우의 솔루션, 당신은 사용해야합니다 :

<!DOCTYPE html>   
<html lang="en">     
    <head>              
        <meta "charset="UTF-8" />   
        <title>Content with Menu</title>                 
        <style>
            .content .left {
                margin-right: 100px;
                background-color: green;
            }
            .content .right {
                float: right;
                width: 100px;
                background-color: red;
            }
        </style>              
    </head>
    <body>        
        <div class="content">
            <div class="right">  
                <p>is</p>
                <p>this</p>
                <p>what</p>
                <p>you are looking for?</p>
            </div>
            <div class="left">
                <p>Hi, Flo!</p>
            </div>
        </div>
    </body>
</html>

IE에서 테스트되지 않았으므로 IE에서 깨져 보일 수 있습니다.


1

허용되는 대답은 작동 할 수 있지만 여백이 겹치는 아이디어가 마음에 들지 않습니다. HTML5에서는 display: flex;. 깨끗한 솔루션입니다. 하나의 요소와 flex-grow: 1;동적 요소 의 너비를 설정하기 만하면됩니다 . merkuros 바이올린의 편집 버전 : https://jsfiddle.net/EAEKc/1499/


0

안녕하세요 오른쪽 요소에 오버플로 숨김 메서드를 사용하는 쉬운 방법이 있습니다.

    .content .left {
        float:left;
        width:100px;
        background-color:green;
      }
      .content .right {
        overflow: hidden;
        background-color:red;
      }
<!DOCTYPE html>   
<html lang="en">     
    <head>      
           
        <title>Content Menu</title>         
          
    </head>
    <body>    
    <div class="content">
      <div class="left">
        <p>Hi, Flo! I am Left</p>
      </div>
      <div class="right">  
        <p>is</p>
        <p>this</p>
        <p>what</p>
        <p>you are looking for?</p>
        <p> It done with overflow hidden and result is same.</p>
      </div>
    </div>
    </body>
</html> 


-1

이것은 작동 할 수 있습니다.

    div{
    display:inline-block;
    width:100%;
    float:left;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.