Dengan HTML / CSS, bagaimana saya bisa membuat elemen yang memiliki lebar dan / atau tinggi 100% dari elemen induknya dan masih memiliki bantalan atau margin yang tepat?
Maksud saya, "tepat" jika elemen induk saya 200px
tinggi dan saya tentukan height = 100%
dengan, padding = 5px
saya akan berharap bahwa saya harus mendapatkan 190px
elemen tinggi dengan border = 5px
di semua sisi, baik berpusat di elemen induk.
Sekarang, saya tahu itu bukan bagaimana model kotak standar menentukan itu harus bekerja (walaupun saya ingin tahu mengapa, tepatnya ...), jadi jawaban yang jelas tidak bekerja:
#myDiv {
width: 100%
height: 100%;
padding: 5px;
}
Tetapi bagi saya tampaknya ada BEBERAPA cara andal menghasilkan efek ini untuk orang tua dengan ukuran sewenang-wenang. Adakah yang tahu cara menyelesaikan tugas (yang tampaknya sederhana) ini?
Oh, dan sebagai catatan saya tidak terlalu tertarik pada kompatibilitas IE sehingga seharusnya (semoga) membuat segalanya lebih mudah.
EDIT: Karena sebuah contoh diminta, inilah yang paling sederhana yang dapat saya pikirkan:
<html style="height: 100%">
<body style="height: 100%">
<div style="background-color: black; height: 100%; padding: 25px"></div>
</body>
</html>
Tantangannya adalah untuk mendapatkan kotak hitam untuk muncul dengan padding 25 pixel di semua tepi tanpa halaman tumbuh cukup besar untuk memerlukan scrollbar.
Jawaban:
Saya belajar bagaimana melakukan hal-hal ini dengan membaca " PRO HTML dan Pola Desain CSS ". Ini
display:block
adalah nilai tampilan default untukdiv
, tetapi saya ingin membuatnya eksplisit. Wadah harus jenis yang tepat;position
atributfixed
,relative
atauabsolute
.Fiddle oleh komentar Nooshu
sumber
top:0
,,bottom:0
pada dasarnya "meregangkan" elemen. Aku hanya bisa mendapatkannya untuk bekerja denganposition:absolute
meskipuntop:20px;bottom:20px;left:20px;right:20px;
alih - alih menggunakan margin sama sekali?Ada properti baru di CSS3 yang dapat Anda gunakan untuk mengubah cara model kotak menghitung lebar / tinggi, itu disebut ukuran kotak.
Dengan menyetel properti ini dengan nilai "border-box", elemen apa pun yang Anda terapkan tidak akan meregang ketika Anda menambahkan padding atau border. Jika Anda menentukan sesuatu dengan lebar 100px, dan bantalan 10px, itu akan tetap menjadi lebar 100px.
Lihat di sini untuk dukungan browser . Itu tidak bekerja untuk IE7 dan lebih rendah, namun, saya percaya bahwa IE7.js Dean Edward menambahkan dukungan untuk itu. Nikmati :)
sumber
border-box
adalah pahlawan semua orang :)Solusinya adalah TIDAK menggunakan tinggi dan lebar sama sekali! Pasang kotak dalam menggunakan atas, kiri, kanan, bawah dan kemudian tambahkan margin.
sumber
Cara yang lebih baik adalah dengan properti calc (). Jadi kasus Anda akan terlihat seperti:
Sederhana, bersih, tidak ada solusi. Pastikan Anda tidak lupa ruang antara nilai dan operator (mis.
(100%-5px)
Itu akan mematahkan sintaks. Nikmati!sumber
Menurut spesifikasi w3c, ketinggian mengacu pada ketinggian area yang dapat dilihat, mis. Pada monitor resolusi 1280x1024 piksel, tinggi 100% = 1024 piksel.
min-height mengacu pada tinggi total halaman termasuk konten sehingga pada halaman di mana konten lebih besar dari 1024px min-height: 100% akan meregangkan untuk memasukkan semua konten.
Masalah lainnya adalah padding dan border ditambahkan pada tinggi dan lebar di sebagian besar browser modern kecuali ie6 (ie6 sebenarnya cukup logis tetapi tidak sesuai dengan spesifikasi). Ini disebut model kotak. Jadi jika Anda tentukan
Ini benar-benar akan memberi Anda 100% + 5px + 5px untuk ketinggian. Untuk menyiasatinya, Anda perlu wadah pembungkus.
sumber
1. Tinggi penuh dengan
padding
2. Tinggi penuh dengan
margin
3. Tinggi penuh dengan
border
sumber
Ini adalah salah satu kebodohan langsung CSS - Saya belum memahami alasannya (jika ada yang tahu, tolong jelaskan).
100% berarti 100% tinggi wadah - yang ditambahkan setiap margin, batas dan bantalan. Jadi secara efektif mustahil untuk mendapatkan wadah yang mengisi induknya dan yang memiliki margin, batas, atau bantalan.
Perhatikan juga, pengaturan tinggi juga tidak konsisten di antara browser.
Hal lain yang saya pelajari sejak saya memposting ini adalah bahwa persentasenya relatif panjang wadah , yaitu lebarnya, membuat persentasenya bahkan lebih berharga untuk ketinggian.
Saat ini, unit viewport vh dan vw lebih berguna, tetapi masih tidak terlalu berguna untuk apa pun selain wadah tingkat atas.
sumber
Solusi lain adalah dengan menggunakan tampilan: tabel yang memiliki perilaku model kotak yang berbeda.
Anda dapat mengatur tinggi dan lebar untuk induk dan menambahkan padding tanpa memperluasnya. Anak memiliki tinggi dan lebar 100% minus bantalan.
JSBIN
Pilihan lain adalah menggunakan propperty ukuran kotak. Satu-satunya masalah dengan keduanya adalah mereka tidak bekerja di IE7.
sumber
Solusi lain: Anda dapat menggunakan satuan persentase untuk margin serta ukuran. Sebagai contoh:
Masalah utama di sini adalah bahwa margin akan naik / turun sedikit dengan ukuran elemen induk. Agaknya fungsi yang Anda inginkan adalah agar margin tetap konstan dan elemen anak tumbuh / menyusut untuk mengisi perubahan spasi. Jadi, tergantung seberapa ketat tampilan yang Anda inginkan, itu bisa menjadi masalah. (Saya juga memilih margin yang lebih kecil, seperti 0,3%).
sumber
Solusi dengan flexbox (bekerja pada IE11): ( atau lihat di jsfiddle )
( CSS-reset tidak selalu penting untuk masalah aktual.)
Bagian yang penting adalah
flex: 1
(Dikombinasikan dengandisplay: flex
di induknya). Lucunya, penjelasan paling masuk akal yang saya tahu tentang cara kerja properti Flex berasal dari dokumentasi asli, jadi saya tetap merujuknya :sumber
Contoh Frank sedikit membingungkan saya - itu tidak berhasil dalam kasus saya karena saya belum memahami posisi dengan cukup baik. Penting untuk dicatat bahwa elemen wadah induk perlu memiliki posisi non-statis (dia menyebutkan ini tetapi saya mengabaikannya, dan itu tidak ada dalam contohnya).
Berikut adalah contoh di mana anak - diberi bantalan dan perbatasan - menggunakan posisi absolut untuk mengisi induk 100%. Orang tua menggunakan posisi relatif untuk memberikan titik referensi untuk posisi anak sambil tetap dalam aliran normal - elemen berikutnya "lebih banyak konten" tidak terpengaruh:
Tautan yang berguna untuk mempelajari posisi CSS dengan cepat
sumber
Perbatasan sekitar div, bukan margin halaman tubuh
Solusi lain - Saya hanya ingin batas sederhana di sekitar tepi halaman saya, dan saya ingin tinggi 100% ketika konten lebih kecil dari itu.
Border-box tidak berfungsi, dan pemosisian tetap tampak salah untuk kebutuhan yang begitu sederhana.
Saya akhirnya menambahkan batas pada wadah saya, alih-alih mengandalkan margin dari isi halaman - sepertinya:
sumber
Ini adalah perilaku default dari
display: block
Cara tercepat yang dapat Anda perbaiki pada tahun 2020 adalah dengan mengaturdisplay: 'flex'
elemen induk dan padding misalnya 20px maka semua anak-anaknya akan memiliki tinggi 100% relatif terhadap tinggi.sumber
Untuk menambahkan -webkit dan -moz akan lebih tepat
sumber
sumber