Hai div, một chiều rộng cố định, cái còn lại, phần còn lại


97

Tôi có hai thùng chứa div.

Trong khi một div cần có chiều rộng cụ thể, tôi cần điều chỉnh nó để div kia chiếm phần còn lại của không gian. Có cách nào tôi có thể làm điều này?

.left {
    float: left;
    width: 83%;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    margin-right: 10px;
    overflow: auto;
}

.right {
    float: right;
    width: 16%;
    text-align: right;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    height: 100%;
    overflow: auto;
}
<div class="left"></div>
<div class="right"></div> <!-- needs to be 250px -->


4
Không sử dụng các bản hack hàng thập kỷ cho các trình duyệt cổ. Cuộn xuống để có giải pháp flexbox hiện đại.
Evgeny

1
Trước khi bạn theo liên kết của Evgeny, hãy xem xét các trình duyệt mà người dùng của bạn thực sự sử dụng, thay vì các trình duyệt bạn muốn họ sử dụng. Flexbox sẽ không làm độc đáo trên của giáo sư của bạn IE 9: caniuse.com/#feat=flexbox
duhaime

@duhaime IE9 có 0,13% dùng ở đâu toàn
Evgeny

Vì vậy, 1 trong 1000 người sử dụng ...
duhaime

Câu trả lời:


127

Xem: http://jsfiddle.net/SpSjL/ (điều chỉnh độ rộng của trình duyệt)

HTML:

<div class="right"></div>
<div class="left"></div>

CSS:

.left {
    overflow: hidden;
    min-height: 50px;
    border: 2px dashed #f0f;
}

.right {
    float: right;
    width: 250px;
    min-height: 50px;
    margin-left: 10px;
    border: 2px dashed #00f;
}

Bạn cũng có thể làm điều đó với display: table, đây thường là một cách tiếp cận tốt hơn: Làm cách nào để đặt một phần tử đầu vào trên cùng một dòng với nhãn của nó?


4
Nó không hoạt động với tôi. Bên trái là 100% chiều rộng và bên phải là 250px. Hai dòng :(
bear

19
Bạn cần hoán đổi thứ tự của các divs, như trong câu trả lời của tôi và bản demo của tôi. rightsau đó left.
30

1
Nhìn chung, điều này phù hợp với tôi nhưng đôi khi khi tôi có văn bản trong div bên trái thay vì gói xuống dòng tiếp theo (và có khoảng trống) thì nó chỉ bị cắt bỏ ở bên phải (nơi bắt đầu của div bên phải). Làm cách nào để tạo dòng chữ nằm trong div bên trái?
Guy

1
DIV không nổi sẽ lấp đầy toàn bộ chiều rộng. Ý tưởng tồi khi nội dung cao hơn DIV nổi hoặc văn bản quá dài.
netAction

46

Đó là năm 2017 và cách tốt nhất để làm điều đó là sử dụng flexbox, tương thích với IE10 + .

.box {
  display: flex;
}

.left {
  flex: 1;  /* grow */
  border: 1px dashed #f0f;
}

.right {
  flex: 0 0 250px; /* do not grow, do not shrink, start at 250px */
  border: 1px dashed #00f;
}
<div class="box">
  <div class="left">Left</div>
  <div class="right">Right 250px</div>
</div>


1
bình luận của bạn về câu hỏi đã giúp tôi không cố gắng hỗ trợ IE6. cảm ơn!
Mike Davlantes

Đây cũng là tốt, nhưng calc () là tốt hơn nhiều so với flex do khả năng tương thích với IE9 và Chrome 26.
Don Dilanga

Điều này làm việc tốt cho tôi. Thậm chí không cần xác định chiều rộng .right.
rotaercz

1
Nó giết chết tôi rằng trong 2017/2018/2019 chúng tôi vẫn nhận được ý kiến dọc theo dòng của Cẩn thận với IE 9.
Mike Devenney

43

Bạn có thể sử dụng hàm calc () của CSS.

Demo: http://jsfiddle.net/A8zLY/543/

<div class="left"></div>
<div class="right"></div>

.left {
height:200px;
width:calc(100% - 200px);
background:blue;
float:left;
}

.right {
width:200px;
height:200px;
background:red;
float:right;   
}

Hy vọng điều này sẽ giúp bạn!!


Cảm ơn vì lời khuyên. Tôi đã kiểm tra tính tương thích giữa các trình duyệt và nó khá cao để sử dụng ổn định
Farside

1
Đây nên được chọn là câu trả lời tốt nhất, bởi vì trong câu trả lời này, các thẻ DIV không được hoán đổi như trong câu trả lời hay nhất.
Don Dilanga

14

Nếu bạn có thể lật thứ tự trong mã nguồn, bạn có thể làm như sau:

HTML:

<div class="right"></div> // needs to be 250px    
<div class="left"></div>

CSS:

.right {
  width: 250px;
  float: right;
}   

Ví dụ: http://jsfiddle.net/blineberry/VHcPT/

Thêm một vùng chứa và bạn có thể làm điều đó với thứ tự mã nguồn hiện tại và định vị tuyệt đối:

HTML:

<div id="container">
  <div class="left"></div>
  <div class="right"></div>
</div>

CSS:

#container {
  /* set a width %, ems, px, whatever */
  position: relative;
}

.left {
  position: absolute;
  top: 0;
  left: 0;
  right: 250px;
}

.right {
  position: absolute;
  background: red;
  width: 250px;
  top: 0;
  right: 0;
}

Ở đây, .leftdiv được một chiều rộng ngầm định từ top, leftrightphong cách cho phép nó để lấp đầy khoảng trống còn lại trong #container.

Ví dụ: http://jsfiddle.net/blineberry/VHcPT/3/


Ví dụ đầu tiên dường như không thực sự hoạt động. Div .left trong jsFiddle thực sự là toàn bộ chiều rộng của màn hình. Nếu cả hai div có cùng chiều cao thì tuyệt vời, nhưng trong trường hợp này chỉ cần thêm padding 5px vào .left và bạn sẽ thấy.
user3413723

1
Giải pháp thứ hai đã làm việc tuyệt vời cho tôi. Thiên tài!
user3413723

6

Nếu bạn có thể bọc chúng trong một thùng chứa, <div>bạn có thể sử dụng định vị để làm cho bên trái được <div>neo tại left:0;right:250px, hãy xem bản trình diễn này . Bây giờ tôi sẽ nói rằng điều này sẽ không hoạt động trong IE6 vì chỉ một góc của a <div>có thể được định vị tuyệt đối trên một trang ( xem ở đây để giải thích đầy đủ).


3

1- Có div wrapper, đặt padding và margin theo ý muốn
2- Đặt div bên trái có chiều rộng bạn cần và làm cho nó nổi bên trái
3- Đặt lề div bên phải bằng chiều rộng bên trái

.left
{
    ***width:300px;***
    float: left;
    overflow:hidden;

}

.right
{
    overflow: visible;
    ***margin-left:300px;***
}



<div class="wrapper">
    <div class="left">
        ...
    </div>

    <div class="right" >
        ...
    </div>

</div>

Hy vọng điều này làm việc cho bạn!



1

đặt bên phải của bạn thành chiều rộng cụ thể và làm nổi nó, ở bên trái bạn chỉ cần đặt lề phải thành 250px

.left {
vertical-align: middle;
min-height: 50px;
margin-right: 250px;
overflow: auto

}

.right {
width:250px;
text-align: right;
display: table-cell;
vertical-align: middle;
min-height: 50px;
height: 100%;
overflow: auto
}

giết kiểu hiển thị trong .right và chắc chắn rằng bạn không có một bất cứ nơi nào rõ ràng thiết lập đó sẽ được làm ảnh hưởng đến .left
meteorainer

bạn có loại div wrapper nào không? Có thứ gì đó trực tuyến mà tôi có thể đi kiểm tra hay điều này hoàn toàn ở địa phương?
meteorainer

Nó hoàn toàn, cục bộ, tuy nhiên, hãy để tôi thử đưa nó vào jsfiddle.
bear

haha, bạn đã gỡ phao của mình: đúng rồi. Ngoài ra, đừng quên tính đến chiều rộng đường viền, vì vậy nếu bạn định để chúng trừ chiều rộng từ một trong các chiều rộng div.
meteorainer

0

Nếu bạn cần một giải pháp trình duyệt chéo, bạn có thể sử dụng cách tiếp cận của tôi, rõ ràng và dễ dàng.

.left{
        position: absolute;
        height: 150px;
        width:150px;
        background: red;
        overflow: hidden;
        float:left;
}
.right{
        position:relative;
        height: 150px;
        width:100%;
        background: red;
        margin-left:150px;
        background: green;
        float:right;
}

-1

Sử dụng đơn giản này có thể giúp bạn

<table width="100%">
    <tr>
         <td width="200">fix width</td>
         <td><div>ha ha, this is the rest!</div></td>
    </tr>
</table>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.