Bagaimana cara memaksa div anak menjadi 100% tinggi orangtua div tanpa menentukan tinggi orangtua?


535

Saya punya situs dengan struktur berikut:

<div id="header"></div>

<div id="main">
  <div id="navigation"></div>
  <div id="content"></div>
</div>

<div id="footer"></div>

Navigasi di sebelah kiri dan konten div di sebelah kanan. Informasi untuk div konten ditarik melalui PHP, jadi setiap kali berbeda.

Bagaimana saya bisa menskalakan navigasi secara vertikal sehingga tingginya sama dengan tinggi div konten, tidak peduli halaman mana yang dimuat?


1
Gunakan tabel tampilan pada orang tua dan tampilan tabel-sel pada anak. Ini akan membuat anak selama orang tuanya. Lihat stackoverflow.com/q/22712489/3429430
user31782

3
Anda bisa mengatur display: flex; align-items: stretch;div # main. Dan jangan gunakan height: 100%untuk konten div #
Igor

Jawaban:


167

CATATAN : Jawaban ini berlaku untuk browser lawas tanpa dukungan untuk standar Flexbox. Untuk pendekatan modern, lihat: https://stackoverflow.com/a/23300532/1155721


Saya sarankan Anda melihat Kolom Ketinggian yang Sama dengan Cross-Browser CSS dan No Hacks .

Pada dasarnya, melakukan ini dengan CSS dengan cara yang kompatibel dengan browser bukan hal sepele (tetapi sepele dengan tabel) jadi temukan sendiri solusi tepat yang telah dikemas sebelumnya.

Juga, jawabannya bervariasi pada apakah Anda ingin tinggi 100% atau sama tinggi. Biasanya tingginya sama. Jika tinggi 100% jawabannya sedikit berbeda.


7
Ini terlihat seperti solusi yang bagus sampai Anda menggambar perbatasan border:1px solid bluemisalnya di container2: perbatasan biru berada di dua kolom pertama, bukan pada kolom kedua hanya seperti yang Anda harapkan.
Julien Kronegg

@ Bfritz, solusi yang lebih baik adalah menggunakandisplay:table
Siler

537

Untuk orang tua:

display: flex;

Anda harus menambahkan beberapa awalan, http://css-tricks.com/using-flexbox/ .

Sunting: Seperti yang dicatat @Adam Garner, luruskan-item: regangkan; tidak dibutuhkan. Penggunaannya juga untuk orang tua, bukan anak-anak. Jika Anda ingin mendefinisikan peregangan anak, Anda menggunakan menyelaraskan diri.

.parent {
  background: red;
  padding: 10px;
  display:flex;
}

.other-child {
  width: 100px;
  background: yellow;
  height: 150px;
  padding: .5rem;
}

.child {  
  width: 100px;
  background: blue;
}
<div class="parent">
  <div class="other-child">
    Only used for stretching the parent
  </div>
  <div class="child"></div>
</div>


3
IE11 tidak bermain dengan baik dengan flexbox dan ketinggian. klik pada "masalah yang diketahui" di sini: caniuse.com/#feat=flexbox
adamdport

@SuperUberDuper Baiklah Anda dapat menggunakannya di bootstrap karena ini: jsfiddle.net/prdwaynk Tetapi jika Anda adalah Anda, saya akan menggunakan fondasi yang merupakan produksi yang siap dengan flexbox: foundation.zurb.com/sites/docs/xy-grid.html BS4 juga akan memiliki Flexbox, tetapi masih dalam alpha, dan saya pikir yayasan lebih baik.
Aiphee

4
Jika Anda menggunakan align-items: centermaka item yang Anda butuhkan untuk meregangkan kebutuhanalign-self: normal
Dominic

2
Ini bukan jawaban yang tepat, karena ini perlu mengatur tinggi badan orang tua. Pertanyaan mengatakan 'tanpa menentukan tinggi badan orang tua?'.
SkuraZZ

3
@Aiphee downvoting karena tampaknya Anda tidak melihat bagian tentang tidak harus mengatur ketinggian orang tua di sana dalam teks pertanyaan asli, namun "solusi" Anda melakukan hal itu.
Tylerism

99

Ini adalah masalah yang membuat frustrasi yang berurusan dengan desainer sepanjang waktu. Caranya adalah Anda perlu mengatur ketinggian hingga 100% pada BODY dan HTML di CSS Anda.

html,body {
    height:100%;
}

Kode yang tampaknya tidak berguna ini adalah untuk mendefinisikan ke browser apa arti 100%. Frustrasi, ya, tetapi merupakan cara paling sederhana.


9
Kecuali itu tidak selalu berfungsi, misalnya jika Anda memiliki elemen posisi relatif di dalam elemen posisi absolut, itu tidak lagi memaksa hasLayout.
tim

Juga, jika Anda ingin menyingkirkan scrollbar di sisi kanan jendela (muncul di Firefox v28), memberikan jendela ruang bernapas: html { height: 100%; } body { height: 98%; }.
Chris Middleton

59
Ini hanya berfungsi jika semua orang tua memiliki tinggi 100%, itu tidak cukup hanya mengatur html dan tubuh, semua orang tua harus memiliki tinggi badan yang ditentukan.
RaduM

97

Saya menemukan bahwa pengaturan dua kolom untuk display: table-cell;bukannya float: left;berfungsi dengan baik.


10
MS sendiri tidak mendukungnya lagi, jika itu membantu siapa pun meyakinkan klien mereka ...
Heraldmonkey

4
Ini harus menjadi jawaban yang diterima. Waktu telah berubah, jawaban ini berfungsi di semua browser (dengan pada quirk kecil di Safari 5.1.17). Dua baris CSS dan Anda langsung memiliki efek yang Anda cari tanpa menarik kembali bisa saya pikirkan.
callmetwan

7
Angkat jawaban ini. Masukkan punggungmu ke dalamnya pemuda!

Ini jawaban terbaik. Ya kita bisa membuat tabel untuk melakukan ini, tetapi ini bukan data tabular, sebaliknya kita memperlakukan divs seolah-olah mereka adalah sel tabel ... Brilliant!
Derokorian

Ini sebenarnya menempatkan saya ke arah yang benar untuk skenario yang berbeda. Jika seseorang berjuang untuk bekerja dengan divs persegi yang juga wadah fleksibel di Firefox atau Edge, ingatlah untuk mengatur: sebelum elemen ditampilkan: tabel. Jangan tanya saya mengapa tetapi memperbaikinya.
CGodo

56

Jika Anda tidak keberatan div navigasi terpotong saat div konten pendek tiba-tiba, setidaknya ada satu cara mudah:

#main {
position: relative;
}

#main #navigation {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 10em; /* or whatever */
}

#main #content {
margin: 0;
margin-left: 10em; /* or whatever width you set for #navigation */
}

Selain itu ada teknik faux-kolom .


2
Terima kasih banyak, Anda menghemat hari saya. Tidak tahu orang bisa mendefinisikan bagian atas dan bawah dan itu akan bekerja seperti ini.
rubish

Ini akan membuat konten kontainer berhenti mengubah ukurannya.
DreamWave

+1 karena secara khusus menjawab pertanyaan OP "Bagaimana Memaksa Div Anak hingga 100% dari Div Orang Tua Tanpa Menentukan Tinggi Orang Tua?" Masalah saya tidak memerlukan kolom (yang disebutkan dalam detail pertanyaan tetapi tidak di tajuk utama) melainkan satu div di belakang yang lain. Jawaban ini berfungsi di kedua aplikasi.
Lukas

Ini harus menjadi jawaban yang dipilih
Gabriel

32
#main {
    overflow: hidden;
}
#navigation, #content {
    margin-bottom: -1000px;
    padding-bottom: 1000px;
}

Saya harus mengatakan saya sedang mencari solusi semacam ini. Sangat sederhana dan begitu jelas sehingga tidak ada yang tahu. Selamat @Roman!
Greg0ry

15

menggunakan jQuery:

$(function() {
    function unifyHeights() {
        var maxHeight = 0;
        $('#container').children('#navigation, #content').each(function() {
            var height = $(this).outerHeight();
            // alert(height);
            if ( height > maxHeight ) {
                maxHeight = height;
            }
        });
        $('#navigation, #content').css('height', maxHeight);
    }
    unifyHeights();
});

19
Math.max()akan menjadi temanmu di sini.
alex

1
Tidak dapat membuat CSS berfungsi dalam semua kasus bagi saya yang benar-benar hanya perlu perbaikan cepat. Ini mungkin bukan pendekatan yang paling standar , tetapi ini berhasil dengan baik. Terima kasih! : -]

1
Saat menggunakan cssfungsi JQuery , Anda tidak dapat membedakan antara layar dan media cetak, seperti yang biasa Anda lakukan saat menggunakan solusi CSS murni. Dengan demikian, Anda mungkin memiliki masalah pencetakan.
Julien Kronegg

12

Coba buat margin bawah 100%.

margin-bottom: 100%;

6
atau padding-bottom: 100%; itu tidak tepat tetapi berfungsi dengan baik untuk beberapa situasi.
Jason

padding-bottom melakukan trik dalam kasus saya. Solusi ini sangat mirip dengan apa yang diposkan oleh @Roman Kuntyi.
Greg0ry

10
#main {
   display: table;
} 
#navigation, #content {
   display: table-cell;
}

Lihatlah contoh ini .


Inilah yang saya lakukan, ingin menambahkan jawaban. Saya juga menggunakan height: 100%tetapi ternyata itu tidak diperlukan.
jcubic

9

height : <percent>hanya akan berfungsi jika Anda memiliki semua simpul induk dengan tinggi persen yang ditentukan dengan ketinggian tetap dalam piksel, ems, dll. di tingkat atas. Dengan begitu, ketinggian akan turun ke elemen Anda.

Anda dapat menentukan 100% untuk html dan elemen tubuh seperti @Travis dinyatakan sebelumnya untuk memiliki tinggi halaman yang turun ke node Anda.


9

Setelah lama mencari dan mencoba, tidak ada yang menyelesaikan masalah saya kecuali

style = "height:100%;"

pada div anak-anak

dan untuk orang tua berlaku ini

.parent {
    display: flex;
    flex-direction: column;
}

juga, saya menggunakan bootstrap dan ini tidak merusak responsif untuk saya.


1
Saya harus menghapus flex-direction: column;ini agar bekerja untuk saya.
Richard Hedges

6

Berdasarkan metode yang dijelaskan dalam artikel ini saya telah membuat solusi dinamis. Kurang:

Html:

<div id="container3">
    <div id="container2">
        <div id="container1">
            <div id="col1">Column 1</div>
            <div id="col2">Column 2</div>
            <div id="col3">Column 3</div>
        </div>
    </div>
</div>

Kurang:

/* Changes these variables to adjust your columns */
@col1Width: 60%;
@col2Width: 1%;
@padding: 0%;

/* Misc variable. Do not change */
@col3Width: 100% - @col1Width - @col2Width;

#container3 {
    float: left;
    width: 100%;
    overflow: hidden;
    background-color: red;
    position: relative;

    #container2 {
        float: left;
        width: 100%;
        position: relative;
        background-color: yellow;
        right: @col3Width;

        #container1 {
            float: left;
            width: 100%;
            position: relative;
            right: @col2Width;
            background-color: green;

            #col1 {
                float: left;
                width: @col1Width - @padding * 2;
                position: relative;
                left: 100% - @col1Width + @padding;
                overflow: hidden;
            }

            .col2 {
                float: left;
                width: @col2Width - @padding * 2;
                position: relative;
                left: 100% - @col1Width + @padding + @padding * 2;
                overflow: hidden;
            }

            #col3 {
                float: left;
                width: @col3Width - @padding * 2;
                position: relative;
                left: 100% - @col1Width + @padding + @padding * 4;
                overflow: hidden;
            }
        }
    }
}


3

Saya tahu ini sudah lama sejak pertanyaan itu dibuat, tetapi saya menemukan solusi yang mudah dan berpikir seseorang dapat menggunakannya (maaf tentang bahasa Inggris yang buruk). Ini dia:

CSS

.main, .sidebar {
    float: none;
    padding: 20px;
    vertical-align: top;
}
.container {
    display: table;
}
.main {
    width: 400px;
    background-color: LightSlateGrey;
    display: table-cell;
}
.sidebar {
    width: 200px;
    display: table-cell;
    background-color: Tomato;
}

HTML

<div class="container clearfix">
    <div class="sidebar">
        simple text here
    </div>
    <div class="main">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam congue, tortor in mattis mattis, arcu erat pharetra orci, at vestibulum lorem ante a felis. Integer sit amet est ac elit vulputate lobortis. Vestibulum in ipsum nulla. Aenean erat elit, lacinia sit amet adipiscing quis, aliquet at erat. Vivamus massa sem, cursus vel semper non, dictum vitae mi. Donec sed bibendum ante.
    </div>
</div>

Contoh sederhana. Perhatikan bahwa Anda dapat berubah menjadi responsif.


Oh, saya lupa: jika Anda ingin menyelaraskan konten .sidebar di tengah, cukup ubah "vertical-align: top" menjadi "vertical-align: middle".
Paula Fleck

2

Solusi saya:

$(window).resize(function() {
   $('#div_to_occupy_the_rest').height(
        $(window).height() - $('#div_to_occupy_the_rest').offset().top
    );
});

1

Ada sedikit kontradiksi dalam judul pertanyaan dan kontennya. Judul berbicara tentang div induk, tetapi pertanyaannya membuatnya seperti Anda ingin dua div saudara kandung (navigasi dan konten) memiliki ketinggian yang sama.

Apakah Anda (a) ingin navigasi dan konten 100% ketinggian utama, atau (b) ingin navigasi dan konten sama tingginya?

Saya akan menganggap (b) ... jika demikian, saya tidak berpikir Anda akan dapat melakukannya dengan struktur halaman Anda saat ini (setidaknya, tidak dengan CSS murni dan tanpa skrip). Anda mungkin perlu melakukan sesuatu seperti:

<main div>
    <content div>
         <navigation div></div>
    </div>
</div>

dan atur div konten untuk memiliki margin kiri berapa pun lebar panel navigasi. Dengan begitu, konten konten berada di sebelah kanan navigasi dan Anda dapat mengatur div navigasi menjadi 100% dari tinggi konten.

EDIT: Saya melakukan ini sepenuhnya di kepala saya, tetapi Anda mungkin juga perlu mengatur margin kiri div navigasi ke nilai negatif atau mengatur itu mutlak dibiarkan 0 untuk mendorongnya kembali ke paling kiri. Masalahnya adalah, ada banyak cara untuk melakukan ini tetapi tidak semuanya akan kompatibel dengan semua browser.


1

[Mengacu pada kode Kurang Dmity dalam jawaban lain] Saya menduga ini semacam "kode semu"?

Dari apa yang saya pahami coba gunakan teknik faux-kolom yang harus melakukan trik.

http://www.alistapart.com/articles/fauxcolumns/

Semoga ini membantu :)


4
Bergantung pada pengurutan urutan jawaban, sulit untuk mengatakan apa yang dimaksud dengan "ini" ... Saya menduga ini tentang kode Dmitry. Dengan demikian, komentar ini milik komentar di bawah jawabannya! Dan, untuk informasi Anda, ini bukan pseudo-code, itu adalah kode dalam bahasa Kurang, cara mendefinisikan CSS dengan cara prosedural.
PhiLho

1

Trik ini berfungsi: Menambahkan elemen terakhir di bagian HTML Anda dengan gaya hapus: keduanya;

    <div style="clear:both;"></div>

Semuanya sebelum itu akan dimasukkan dalam ketinggian.


1

memberi position: absolute;kepada anak itu berhasil dalam kasus saya


1

Anda menggunakan CSS Flexbox

.flex-container {
  display: flex;
  background-color: DodgerBlue;
}

.flex-container > div {
  background-color: #f1f1f1;
  margin: 10px;
  padding: 20px;
  font-size: 30px;
}
<!DOCTYPE html>
<html>
<head>
</head>
<body>

<div class="flex-container">
  <div>1</div>
  <div>2</div>
  <div>3</div>  
</div>

<p>A Flexible Layout must have a parent element with the <em>display</em> property set to <em>flex</em>.</p>

<p>Direct child elements(s) of the flexible container automatically becomes flexible items.</p>

</body>
</html>


1

Jawaban ini tidak ideal lagi karena CSS flexbox dan kisi di mana diterapkan ke CSS. Namun itu masih merupakan solusi yang berhasil

Pada layar yang lebih kecil Anda mungkin ingin menjaga ketinggian otomatis karena col1, col2 dan col3 ditumpuk satu sama lain.

Namun setelah breakpoint kueri media Anda ingin cols muncul di sebelah satu sama lain dengan ketinggian yang sama untuk semua kolom.

1125 px hanya merupakan contoh breakpoint lebar jendela dan setelah itu Anda ingin membuat semua kolom diatur ke ketinggian yang sama.

<div class="wraper">
    <div class="col1">Lorem ipsum dolor sit amet.</div>
    <div class="col2">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eos laudantium, possimus sed, debitis amet in, explicabo dolor similique eligendi officia numquam eaque quae illo magnam distinctio odio, esse vero aspernatur.</div>
    <div class="col3">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorem, odio qui praesentium.</div>
</div>

Anda bisa, tentu saja, menetapkan lebih banyak breakpoint jika perlu.

<script>
    $(document).ready(function(){
        $(window).on('load resize', function() {
            let vraperH = $('.wraper').height();
            if (window.innerWidth>= 1125) {
              $('.col1').height(vraperH);
              $('.col2').height(vraperH);
              $('.col3').height(vraperH);
            }
            if (window.innerWidth < 1125) {
              $('.col1').height('auto');
              $('.col2').height('auto');
              $('.col3').height('auto');
            }
        });
    });
</script>

1

Saya memiliki masalah yang sama, ini bekerja berdasarkan jawaban Hakam Fostok, saya telah membuat contoh kecil, dalam beberapa kasus mungkin berhasil tanpa harus menambahkan display: flex;dan flex-direction: column;pada wadah induk

.row {
    margin-top: 20px;
}

.col {
    box-sizing: border-box;
    border: solid 1px #6c757d;
    padding: 10px;
}

.card {
    background-color: #a0a0a0;
    height: 100%;
}

JSFiddle


0

Seperti yang ditunjukkan sebelumnya, flexbox adalah yang termudah. misalnya.

#main{ display: flex; align-items:center;}

ini akan menyelaraskan semua elemen anak ke pusat di dalam elemen induk.


3
ini tidak menjawab pertanyaan, mereka menginginkan tinggi yang sama, tidak memusatkan isinya
Ryan M


0

Berikut demo mode lama berdasarkan position: absolutewadah konten danposition: relative wadah induk.

Adapun cara modern untuk melakukannya - kotak fleksibel adalah yang terbaik.


-3

Cara termudah untuk melakukan ini adalah dengan memalsukannya. Apart List telah membahas hal ini secara ekstensif selama bertahun-tahun, seperti dalam artikel ini dari Dan Cederholm dari 2004 .

Begini cara saya biasanya melakukannya:

<div id="container" class="clearfix" style="margin:0 auto;width:950px;background:white url(SOME_REPEATING_PATTERN.png) scroll repeat-y center top;">
    <div id="navigation" style="float:left;width:190px;padding-right:10px;">
        <!-- Navigation -->
    </div>
    <div id="content" style="float:left;width:750px;">
        <!-- Content -->
    </div>
</div>

Anda dapat dengan mudah menambahkan header ke desain ini dengan membungkus #container di div lain, menanamkan header header sebagai saudara # kontainer, dan memindahkan gaya margin dan lebar ke wadah induk. Selain itu, CSS harus dipindahkan ke file yang terpisah dan tidak disimpan sebaris, dll. Akhirnya, kelas clearfix dapat ditemukan pada positioniseverything .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.