Dua div, satu lebar tetap, yang lain, sisanya

97

Saya punya dua wadah div.

Sementara salah satu harus memiliki lebar tertentu, saya perlu menyesuaikannya, sehingga div lainnya mengambil sisa ruang. Apakah ada cara agar saya bisa melakukan ini?

.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 -->

beruang
sumber
4
Jangan gunakan peretasan berusia satu dekade untuk peramban kuno. Gulir ke bawah untuk solusi flexbox modern.
Evgeny
1
Sebelum Anda mengikuti tautan Evgeny, pertimbangkan peramban yang sebenarnya digunakan pengguna Anda, bukan peramban yang Anda ingin mereka gunakan. Flexbox tidak akan membuat baik pada dosen Anda IE 9: caniuse.com/#feat=flexbox
Duhaime
@duhaime IE9 memiliki 0,13% penggunaan global
Evgeny
Jadi 1 dari 1000 pengguna ...
duhaime

Jawaban:

127

Lihat: http://jsfiddle.net/SpSjL/ (sesuaikan lebar browser)

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;
}

Anda juga dapat melakukannya dengan display: table, yang biasanya merupakan pendekatan yang lebih baik: Bagaimana saya dapat meletakkan elemen masukan pada baris yang sama dengan labelnya?

tigapuluhdot
sumber
4
Itu tidak berhasil denganku. Kiri akan memiliki lebar 100% dan kanan adalah 250px. Dua baris :(
beruang
19
Anda perlu menukar urutan divs, seperti di jawaban saya dan demo saya. rightlalu left.
tigapuluhdot
1
Secara keseluruhan ini berfungsi untuk saya tetapi terkadang ketika saya memiliki teks di div kiri alih-alih membungkus ke baris berikutnya (dan ada spasi) itu hanya terpotong di sebelah kanan (di mana div kanan dimulai). Bagaimana cara membuat pembungkus teks di div kiri?
Guy
1
DIV yang tidak mengambang mengisi lebar penuh. Ide buruk jika konten lebih tinggi dari DIV mengambang atau teks terlalu panjang.
netAction
47

Ini tahun 2017 dan cara terbaik untuk melakukannya adalah dengan menggunakan flexbox, yang kompatibel dengan 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>

Evgeny
sumber
1
Komentar Anda tentang pertanyaan itu menyelamatkan saya dari upaya mendukung IE6. Terima kasih!
Mike Davlantes
Ini juga bagus, tetapi calc () jauh lebih baik daripada flex karena kompatibilitas dengan IE9 dan Chrome 26.
Don Dilanga
Ini bekerja dengan baik untuk saya. Bahkan tidak membutuhkan lebar .right untuk didefinisikan.
rotaercz
1
Sungguh membunuh saya bahwa pada 2017/2018/2019 kami masih mendapatkan komentar seperti WASPADALAH DARI IE 9.
Mike Devenney
43

Anda dapat menggunakan Fungsi calc () dari 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;   
}

Semoga ini bisa membantu Anda !!

Shivali Patel
sumber
Terima kasih atas sarannya. Saya memeriksa kompatibilitas antar browser, dan itu cukup tinggi untuk penggunaan yang stabil
Farside
1
Ini harus dipilih sebagai jawaban terbaik, karena dalam jawaban ini tag DIV tidak ditukar seperti pada jawaban terbaik.
Don Dilanga
14

Jika Anda dapat membalik urutan di kode sumber, Anda dapat melakukannya seperti ini:

HTML:

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

CSS:

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

Contoh: http://jsfiddle.net/blineberry/VHcPT/

Tambahkan penampung dan Anda dapat melakukannya dengan urutan kode sumber Anda saat ini dan pemosisian absolut:

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;
}

Di sini, .leftdiv mendapat lebar implisit diatur dari top, left, dan rightgaya yang memungkinkan untuk mengisi ruang yang tersisa di #container.

Contoh: http://jsfiddle.net/blineberry/VHcPT/3/

Brent
sumber
Contoh pertama sepertinya tidak benar-benar berfungsi. Div .left di jsFiddle sebenarnya adalah lebar penuh dari layar. Jika kedua div memiliki tinggi yang sama maka bagus, tetapi dalam kasus ini tambahkan saja padding 5px ke .left dan Anda akan melihat.
pengguna3413723
1
Solusi kedua bekerja sangat baik untuk saya. Jenius!
pengguna3413723
6

Jika Anda dapat membungkusnya dalam wadah, <div>Anda dapat menggunakan pemosisian untuk membuat <div>jangkar kiri left:0;right:250px, lihat demo ini . Sekarang saya akan mengatakan bahwa ini tidak akan berfungsi di IE6 karena hanya satu sudut dari a yang <div>dapat diposisikan secara mutlak pada halaman ( lihat di sini untuk penjelasan lengkap).

andyb
sumber
3

1- Memiliki div pembungkus, atur padding dan margin sesuka Anda
2- Jadikan div sisi kiri lebar yang Anda butuhkan dan buat itu mengambang ke kiri
3- Atur margin div sisi kanan sama dengan lebar sisi kiri

.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>

Semoga ini berhasil untuk Anda!

Oscar
sumber
1

atur hak Anda ke lebar tertentu dan letakkan, di kiri Anda atur margin-right menjadi 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
}
meteorainer
sumber
matikan jenis tampilan di .right dan pastikan Anda tidak memiliki pengaturan yang jelas di mana pun yang akan memengaruhi .left
meteorainer
apakah Anda memiliki div jenis pembungkus? Apakah ada sesuatu yang online yang dapat saya periksa atau apakah ini benar-benar lokal?
meteorainer
Ini sepenuhnya, lokal, bagaimanapun, izinkan saya mencoba meletakkannya di jsfiddle.
beruang
haha, Anda melepas pelampung Anda: benar. Juga, jangan lupa untuk memperhitungkan lebar perbatasan, jadi jika Anda akan membiarkannya di kurangi lebar dari salah satu lebar div.
meteorainer
0

Jika Anda membutuhkan solusi lintas browser, Anda dapat menggunakan pendekatan saya, jelas dan mudah.

.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;
}

sumber
-1

Gunakan yang sederhana ini dapat membantu Anda

<table width="100%">
    <tr>
         <td width="200">fix width</td>
         <td><div>ha ha, this is the rest!</div></td>
    </tr>
</table>
Huỳnh Hữu Ân
sumber