Cara menempatkan div berdampingan

241

Saya memiliki pembungkus utama div yang diatur lebar 100%. Di dalam itu saya ingin memiliki dua divs, satu yang lebar tetap dan yang lainnya mengisi sisa ruang. Bagaimana cara mengapung div kedua untuk mengisi sisa ruang. Terima kasih atas bantuannya.

markt
sumber
2
Lain kali juga tempatkan kode contoh Anda, jadi pertanyaannya menjadi lebih jelas bagi para pengembang di sini ..
Rob
1
Apakah posisi: mutlak pilihan? Anda dapat mengatur posisi ke sisi wadah, dan div akan mengambil ukuran baru.
AlexanderMP

Jawaban:

363

Ada banyak cara untuk melakukan apa yang Anda minta:

  1. Menggunakan properti CSSfloat :

    <div style="width: 100%; overflow: hidden;">
        <div style="width: 600px; float: left;"> Left </div>
        <div style="margin-left: 620px;"> Right </div>
    </div>
    
  2. Menggunakan properti CSSdisplay - yang dapat digunakan untuk membuat divtindakan seperti table:

    <div style="width: 100%; display: table;">
        <div style="display: table-row">
            <div style="width: 600px; display: table-cell;"> Left </div>
            <div style="display: table-cell;"> Right </div>
        </div>
    </div>
    

Ada lebih banyak metode, tetapi keduanya adalah yang paling populer.

Crozin
sumber
17
Solusi HTML 5 dari @filoxo, gunakan itu
TheMcMurder
1
Apa yang dikatakan komentator sebelumnya: pertimbangkan untuk menambahkan solusi HTML5 per filoxo sebagai # 3.
Ahmed Fasih
2
@TheMcMurder: bagi kami yang perlu mendukung browser lama (mis. IE <11), itu bukan opsi.
Oyvind
@Oyvind, kamu benar sekali. Itu tergantung pada kasus penggunaan Anda. Jika Anda mendukung IE 8, 9, atau 10, Anda harus mendukung polyfill. Saya akan merekomendasikan layanan seperti polyfill.io cdn.polyfill.io/v2/docs atau github.com/10up/flexibility tetapi Anda mungkin harus benar-benar ketat persyaratan yang mencegah penggunaan polyfill.
TheMcMurder
1
Apa yang dilakukan dengan overflow: hidden? bukankah ini untuk elemen dengan ketinggian yang ditentukan?
michael
177

CSS3 memperkenalkan kotak fleksibel (alias. Kotak fleksibel) yang juga dapat mencapai perilaku ini.

Cukup menentukan lebar div pertama, dan kemudian memberikan kedua flex-grownilai 1yang akan memungkinkan untuk mengisi lebar tersisa induk.

.container{
    display: flex;
}
.fixed{
    width: 200px;
}
.flex-item{
    flex-grow: 1;
}
<div class="container">
  <div class="fixed"></div>
  <div class="flex-item"></div>
</div>

Demo jsFiddle

Perhatikan bahwa kotak fleksibel tidak kompatibel dengan browser lama, tetapi merupakan pilihan bagus untuk menargetkan browser modern (lihat juga Caniuse dan MDN ). Panduan komprehensif yang hebat tentang cara menggunakan kotak fleksibel tersedia di Trik CSS .

filoxo
sumber
5
Butuh sepanjang hari untuk menemukan solusi dan jawaban ini menyelesaikannya! Saya memiliki 4 panel berdampingan dengan panel ke-3 dan ke-4 terkadang tidak memiliki apa pun di dalamnya. Mereka semua tinggal di div yang berisi dengan perbatasan di sekitar mereka. Seluruh pelampung: kiri pada situasi div pertama meninggalkan saya dengan div melewati perbatasan di bagian bawah karena label yang dihasilkan adalah dinamis. Label adalah rentang karena itulah cara ASP membuat mereka. Tidak memiliki pelampung: kiri hanya membuat 3 div pada baris yang sama. Dan menggunakan tabel tidak mungkin. Terima kasih!
Luminous
Apakah ada metode yang kompatibel ke belakang untuk menggunakan sesuatu seperti ini, yaitu bagi kita saps miskin yang masih harus mendukung IE 8-10
Ben A. Hilleli
@ BenA.Hilleli yang mungkin tergantung pada kebutuhan Anda (mis. Peningkatan progresif atau penurunan anggun ) tetapi pencarian cepat menghasilkan ini (agak ketinggalan zaman ) "Cara menggunakan flexbox di dunia nyata" panduan serta Flexie.js yang mendukung IE6-9. Atau, cobalah salah satu jawaban lain untuk pertanyaan ini karena mereka mencapai hal yang sama.
filoxo
20

Saya tidak tahu banyak tentang strategi desain HTML dan CSS, tetapi jika Anda sedang mencari sesuatu yang sederhana dan yang akan sesuai dengan layar secara otomatis (seperti saya), saya percaya solusi yang paling lurus ke depan adalah membuat divs berperilaku seperti kata-kata dalam sebuah paragraf. Coba sebutkandisplay: inline-block

<div style="display: inline-block">
   Content in column A
</div>
<div style="display: inline-block">
   Content in column B
</div>

Anda mungkin atau mungkin tidak perlu menentukan lebar DIVs

Guillermo Ruffino
sumber
5
Mungkin display:flexadalah solusi terbaik, tetapi saya pikir inline-blockini juga sangat baik karena berfungsi pada lebih banyak browser. Ngomong-ngomong, Anda mungkin perlu membungkus kedua div dengan a <div style="white-space:nowrap">untuk mencegah putusnya perubahan ukuran.
John Henckel
Ini solusi yang bagus untuk templating. Satu-satunya masalah adalah mendorong div dengan konten lebih rendah ke bawah. Bagaimana cara mendorongnya ke atas?
hampir pemula
1
nvm, hanya perlu mencarinya, solusinya adalah: vertical-align: top;
hampir pemula
@JohnHenckel itu berarti tidak untuk semua browser, mungkinkah tidak bekerja untuk semua browser dengan cara yang sama? inline-blockkode.
Kavindu Gayantha
@guillermo itu tidak berfungsi dengan baik. semua div tidak menempatkan berdampingan. mengapa demikian. Ini tidak jelas.
Kavindu Gayantha
14

Anda dapat menggunakan kisi-kisi CSS untuk mencapai hal ini, ini adalah versi jangka panjang untuk tujuan ilustrasi:

div.container {
    display: grid;
    grid-template-columns: 220px 20px auto;
    grid-template-rows: auto;
}

div.left {
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: row1-start
    grid-row-end: 3;
    background-color: Aqua;
}

div.right {
    grid-column-start: 3;
    grid-column-end: 4;
    grid-row-start: 1;
    grid-row-end; 1;
    background-color: Silver;
}

div.below {
    grid-column-start: 1;
    grid-column-end: 4;
    grid-row-start: 2;
    grid-row-end; 2;
}
<div class="container">
    <div class="left">Left</div>
    <div class="right">Right</div>
    <div class="below">Below</div>
</div>

Atau metode yang lebih tradisional menggunakan float dan margin.

Saya telah menyertakan warna latar belakang dalam contoh ini untuk membantu menunjukkan di mana segala sesuatunya berada - dan juga apa yang harus dilakukan dengan konten di bawah area mengambang.

Jangan menempatkan gaya Anda sejajar dalam kehidupan nyata, ekstrak ke dalam style sheet.

div.left {
    width: 200px;
    float: left;
    background-color: Aqua;
}

div.right {
    margin-left: 220px;
    background-color: Silver;
}

div.clear {
    clear: both;
}
    <div class="left"> Left </div>
    <div class="right"> Right </div>
    <div class="clear">Below</div>

<div style="width: 200px; float: left; background-color: Aqua;"> Left </div>
<div style="margin-left: 220px; background-color: Silver;"> Right </div>
<div style="clear: both;">Below</div>
Fenton
sumber
2

Berikan div pertama float kiri dan diperbaiki dengan, div kedua 100% lebar float kiri. Itu harus melakukan trik. Jika Anda ingin menempatkan item di bawahnya, Anda perlu jelas: keduanya pada item yang ingin Anda tempatkan di bawah

rampok
sumber
2
<div class="container" style="width: 100%;">
    <div class="sidebar" style="width: 200px; float: left;">
        Sidebar
    </div>
    <div class="content" style="margin-left: 202px;">
        content 
    </div>
</div>

Ini akan kompatibel lintas browser. Tanpa margin-kiri Anda akan mengalami masalah dengan konten berjalan jauh ke kiri jika konten Anda lebih panjang dari sidebar Anda.

RDL
sumber
1

Jika Anda tidak menandai IE6, maka apung yang kedua <div>dan berikan margin yang sama dengan (atau mungkin sedikit lebih besar dari) <div>lebar tetap pertama .

HTML:

<div id="main-wrapper">
    <div id="fixed-width"> lorem ipsum </div>
    <div id="rest-of-space"> dolor sit amet </div>
</div>

CSS:

#main-wrapper {
    100%;
    background:red;
}
#fixed-width {
    width:100px;
    float:left
}
#rest-of-space {
    margin-left:101px;
        /* May have to increase depending on borders and margin of the fixd width div*/
    background:blue;
}

Margin memperhitungkan kemungkinan bahwa 'sisa ruang' <div>mungkin mengandung lebih banyak konten daripada 'lebar tetap' <div>.

Jangan beri latar belakang lebar tetap; jika Anda perlu melihat ini sebagai 'kolom' yang berbeda maka gunakan trik Kolom Faux .

Richard JP Le Guen
sumber