Bagaimana saya bisa mengirim bagian dalam <div> ke bagian bawah induknya <div>?

184

Div di dalam gambar div lain dan kode di bawah ini. Karena akan ada teks dan gambar div induk. Dan red div akan menjadi elemen terakhir dari parent parent.

teks alternatif

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>
uzay95
sumber
Jadi, apakah kode dari div induk ditempatkan secara logis di atas div anak? Apakah gambar dan teks ditambahkan secara dinamis? Apa pertanyaan spesifiknya?
justkt

Jawaban:

218

Ini satu arah

<div style="position: relative; 
            width: 200px; 
            height: 150px; 
            border: 1px solid black;">

    <div style="position: absolute; 
                bottom: 0; 
                width: 100%; 
                height: 50px; 
                border: 1px solid red;">
    </div>
</div>

Tetapi karena div bagian dalam diposisikan mutlak, Anda harus selalu khawatir tentang konten lain di div bagian luar yang tumpang tindih (dan Anda harus selalu mengatur ketinggian tetap).

Jika Anda bisa melakukannya, lebih baik menjadikan div bagian dalam itu sebagai objek DOM terakhir di div bagian luar Anda dan mengaturnya menjadi "jelas: keduanya".

Jon Smock
sumber
1
Terima kasih atas penjelasan Anda dan Hack IE (jika saya tidak salah Anda menambahkan ** lebar: 100% untuk Hack IE).
uzay95
1
Tidak, lebarnya: 100% ada di aslinya - saya tidak menambahkannya.
Jon Smock
1
Saya mencoba untuk berani bagian yang saya ubah, tetapi penurunan harga tidak berlaku di dalam blok kode :-P
Jon Smock
:) Sebenarnya saya tidak bisa mendapatkan bagaimana kita meretas IE dengan simbol, itu sebabnya saya pikir itu IE Hacking :)
uzay95
Perlu diingat bahwa jika wadah induk mengambang, pendekatan ini tidak akan berfungsi.
klewis
84

Cara flexbox.

HTML:

<div class="parent">
  <div>Images, text, buttons oh my!</div>
  <div>Bottom</div>
</div>

CSS:

.parent {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/*  not necessary, just to visualize it */

.parent {
  height: 500px;
  border: 1px solid black;
}


.parent div {
  border: 1px solid red;
}

masukkan deskripsi gambar di sini

Edit:

Sumber - Panduan Flexbox

Dukungan browser untuk flexbox - Caniuse

Franklin Tarter
sumber
4
OMG, di mana saja kamu selama hidup [pemrograman] saya! ;) Saya suka ini sangat sederhana dan tidak mengacaukan penentuan posisi, dan sepertinya hanya berfungsi di semua browser: caniuse.com/#feat=flexbox . Ini harus menjadi solusi dan jawaban yang diterima untuk pemrograman modern.
Sablefoste
1
Flexbox biasanya merupakan "cara mudah" hari ini dan memiliki (hampir) dukungan dan dokumentasi browser yang hebat. Menambahkan tautan caniuse ke jawabannya.
Franklin Tarter
80

Buat div luar position="relative"dan div dalam position="absolute"dan aturbottom="0" .

Fermin
sumber
8
dan width=100%juga.
Kevin
6
Ya, ini berfungsi tetapi penentuan posisi absolut merusak "tata letak alami". Tinggi div dalam tidak akan dimasukkan sebagai ketinggian orangtua dan karena div luar semakin sempit, Anda mungkin melihat tumpang tindih dengan hal-hal lain di div luar.
Ayush Gupta
15

Berikut ini adalah trik CSS murni lainnya, yang tidak memengaruhi aliran elemen.

#parent {
  min-height: 100vh; /* set height as you need */
  display: flex;
  flex-direction: column;
  background: grey;
}
.child {
  margin-top: auto;
  background: green;
}
<div id="parent">
  <h1>Positioning with margin</h1>
  <div class="child">
    Content to the bottom
  </div>
</div>

R3gi
sumber
Luar biasa jika tidak ingin mengatur ketinggian pada div induk! Terima kasih!
Johan Nordli
1
ini adalah jawaban terbaik bagi saya
Russell Chisholm
Bagus! Solusi fleksibel lainnya memindahkan semua konten saya keluar dari tempatnya, yang satu ini mengisolasi objek yang ingin Anda tempatkan di bagian bawah dari yang lain. Solusi bagus!
Alejandro Aristizábal
8

Anda mungkin tidak ingin penentuan posisi absolut karena melanggar reflow: dalam beberapa keadaan, solusi yang lebih baik adalah membuat elemen kakek-nenek display:table;dan elemen induk display:table-cell;vertical-align:bottom;. Setelah melakukan ini, Anda harus dapat memberikan elemen anak display:inline-block;dan mereka akan mengalir secara otomatis ke bagian bawah orangtua.

Ansikt
sumber
8

Catatan: Ini sama sekali bukan cara terbaik untuk melakukannya!

Situasi : Saya harus melakukan hal yang sama hanya saja saya tidak dapat menambahkan div tambahan, oleh karena itu saya terjebak dengan apa yang saya miliki dan daripada menghapus innerHTML dan membuat yang lain melalui javascript hampir seperti 2 render saya harus memiliki konten di bawah (bilah animasi).

Solusi: Mengingat betapa lelahnya saya pada saat itu, sepertinya normal untuk memikirkan metode semacam itu, tetapi saya tahu saya memiliki elemen DOM induk yang ketinggian barnya dimulai.

Daripada bermain-main dengan javascript lebih lanjut saya menggunakan jawaban CSS ( TIDAK SELALU BAIK )! :)

-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-ms-transform:rotate(180deg);

Ya itu benar, alih-alih memposisikan DOM, saya membalikkan induknya dalam css.

Untuk skenario saya ini akan berhasil! Mungkin juga untuk orang lain! Tidak menyala! :)

Pogrindis
sumber
1
Ini mungkin bukan cara terbaik untuk melakukannya tetapi ini cukup mengagumkan, pendekatan yang sangat kreatif. Saya sendiri telah bergulat masalah ini untuk sementara waktu hari ini, poin utama saya: tidak ada ketinggian yang ditetapkan, harus benar-benar cair (tidak cukup karakter untuk menjelaskan mengapa tampilan: meja tidak berfungsi). Ini menangani semuanya dengan indah; gambar di dalam div juga terbalik ketika ini terjadi jadi saya hanya menggunakan kelas pada elemen-elemen itu untuk membalikkannya. Tampak persis seperti seharusnya, tanpa ketinggian yang ditetapkan. Agak berantakan tapi hei, terkadang tidak ada alternatif yang lebih baik. Sudah selesai dilakukan dengan baik!
tganyan
4

Berikut adalah cara untuk menghindari div dan tabel absolut jika Anda mengetahui tinggi orangtua:

<div class="parent">
    <div class="child"> <a href="#">Home</a>
    </div>
</div>

CSS:

.parent {
    line-height:80px;
    border: 1px solid black;
}
.child {
    line-height:normal;
    display: inline-block;
    vertical-align:bottom;
    border: 1px solid red;
}

JsFiddle:

Contoh

formatc
sumber
0
<div style="width: 200px; height: 150px; border: 1px solid black;position:relative">
    <div style="width: 100%; height: 50px; border: 1px solid red;position:absolute;bottom:0">
    </div>
</div>
WegDwight
sumber