Saya ingin memiliki menu vertikal dengan ketinggian tertentu.
Setiap anak harus mengisi ketinggian induk dan memiliki teks garis tengah.
Jumlah anak-anak adalah acak, jadi saya harus bekerja dengan nilai-nilai dinamis.
Div .container
berisi jumlah acak anak-anak ( .item
) yang selalu harus mengisi ketinggian orangtua. Untuk mencapai itu saya menggunakan flexbox.
Untuk membuat tautan dengan teks disejajarkan dengan tengah saya menggunakan display: table-cell
teknik. Tetapi menggunakan tampilan tabel membutuhkan menggunakan ketinggian 100%.
Masalah saya adalah itu .item-inner { height: 100% }
tidak berfungsi di webkit (Chrome).
- Apakah ada perbaikan untuk masalah ini?
- Atau adakah teknik yang berbeda untuk membuat semua
.item
mengisi ketinggian induk dengan teks yang lurus rata ke tengah?
Contoh di sini jsFiddle, harus dilihat di Firefox dan Chrome
.container {
height: 20em;
display: flex;
flex-direction: column;
border: 5px solid black
}
.item {
flex: 1;
border-bottom: 1px solid white;
}
.item-inner {
height: 100%;
width: 100%;
display: table;
}
a {
background: orange;
display: table-cell;
vertical-align: middle;
}
<div class="container">
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
</div>
css
google-chrome
webkit
flexbox
Ricardo Castañeda
sumber
sumber
top:0
danleft:0
membuatnya muncul seperti yang diharapkan.Jawaban:
Larutan
Gunakan wadah fleksibel bersarang.
Singkirkan persentase ketinggian. Singkirkan properti tabel. Singkirkan
vertical-align
. Hindari penentuan posisi absolut. Tetap dengan flexbox sepanjang jalan.Oleskan
display: flex
ke item fleksibel (.item
), menjadikannya wadah fleksibel. Ini secara otomatis mengaturalign-items: stretch
, yang memberitahu anak (.item-inner
) untuk memperluas ketinggian penuh dari induk.Penting: Hapus ketinggian yang ditentukan dari item fleksibel agar metode ini berfungsi. Jika seorang anak memiliki ketinggian yang ditentukan (misalnya
height: 100%
), maka ia akan mengabaikanalign-items: stretch
kedatangan dari orang tua. Agarstretch
default berfungsi, tinggi anak harus dihitung denganauto
(penjelasan lengkap ).Coba ini (tidak ada perubahan pada HTML):
Tampilkan cuplikan kode
Demo jsFiddle
Penjelasan
Ini tidak berfungsi karena Anda menggunakan tinggi persentase dengan cara yang tidak sesuai dengan implementasi tradisional spesifikasi.
Dengan kata lain, agar persentase tinggi untuk bekerja pada anak dalam-aliran, orang tua harus memiliki tinggi yang ditetapkan.
Dalam kode Anda, wadah tingkat atas memiliki ketinggian yang ditentukan:
.container { height: 20em; }
Wadah tingkat ketiga memiliki ketinggian yang ditentukan:
.item-inner { height: 100%; }
Tetapi di antara mereka, wadah tingkat kedua -
.item
- tidak memiliki ketinggian yang ditentukan. Webkit melihatnya sebagai tautan yang hilang..item-inner
memberitahu Chrome: beri sayaheight: 100%
. Chrome mencari ke induk (.item
) untuk referensi dan menjawab: 100% dari apa? Saya tidak melihat apa-apa (mengabaikanflex: 1
aturan yang ada). Akibatnya, itu berlakuheight: auto
(tinggi konten), sesuai dengan spesifikasi.Firefox, di sisi lain, sekarang menerima tinggi fleksibel orangtua sebagai referensi untuk tinggi persentase anak. IE11 dan Edge juga menerima ketinggian fleksibel.
Juga, Chrome akan menerima
flex-grow
sebagai referensi induk yang memadai jika digunakan bersama denganflex-basis
(nilai numerik apa pun berfungsi (auto
tidak akan), termasukflex-basis: 0
). Namun pada tulisan ini, solusi ini gagal di Safari.Tampilkan cuplikan kode
Empat Solusi
1. Tentukan ketinggian pada semua elemen induk
Solusi lintas-browser yang andal adalah menentukan ketinggian pada semua elemen induk. Ini mencegah tautan yang hilang, yang oleh peramban berbasis Webkit dianggap sebagai pelanggaran terhadap spesifikasi.
Perhatikan itu
min-height
danmax-height
tidak dapat diterima. Itu pastiheight
properti.Lebih detail di sini: Bekerja dengan
height
properti CSS dan nilai persentase2. Posisi Relatif & Mutlak CSS
Berlaku
position: relative
untuk orang tua danposition: absolute
anak.Ukuran anak dengan
height: 100%
danwidth: 100%
, atau menggunakan sifat offset:top: 0
,right: 0
,bottom: 0
,left: 0
.Dengan penentuan posisi absolut, persentase tinggi berfungsi tanpa ketinggian yang ditentukan pada induk.
3. Hapus wadah HTML yang tidak perlu (disarankan)
Apakah ada kebutuhan untuk dua kontainer di sekitar
button
? Mengapa tidak menghapus.item
atau.item-inner
, atau keduanya? Meskipunbutton
elemen terkadang gagal sebagai wadah fleksibel , mereka bisa berupa benda lentur. Pertimbangkan untuk membuatbutton
anak dari.container
atau.item
, dan menghapus mark-up gratis.Ini sebuah contoh:
Tampilkan cuplikan kode
4. Container Flex Bersarang (disarankan)
Singkirkan persentase ketinggian. Singkirkan properti tabel. Singkirkan
vertical-align
. Hindari penentuan posisi absolut. Tetap dengan flexbox sepanjang jalan.Oleskan
display: flex
ke item fleksibel (.item
), menjadikannya wadah fleksibel. Ini secara otomatis mengaturalign-items: stretch
, yang memberitahu anak (.item-inner
) untuk memperluas ketinggian penuh dari induk.Penting: Hapus ketinggian yang ditentukan dari item fleksibel agar metode ini berfungsi. Jika seorang anak memiliki ketinggian yang ditentukan (misalnya
height: 100%
), maka ia akan mengabaikanalign-items: stretch
kedatangan dari orang tua. Agarstretch
default berfungsi, tinggi anak harus dihitung denganauto
(penjelasan lengkap ).Coba ini (tidak ada perubahan pada HTML):
Tampilkan cuplikan kode
jsFiddle
sumber
Solusi: Hapus
height: 100%
di .item-batin dan menambahkandisplay: flex
di .itemDemo: https://codepen.io/tronghiep92/pen/NvzVoo
sumber
Menentukan atribut flex ke wadah berfungsi untuk saya:
Ini memastikan ketinggian diatur dan tidak tumbuh.
sumber
Untuk Mobile Safari Ada perbaikan Browser. Anda perlu menambahkan -webkit-box untuk perangkat iOS.
Ex.
jika Anda menggunakan
align-items: stretch;
properti untuk elemen induk, hapusheight : 100%
dari elemen turunan.sumber
Saya memiliki masalah serupa di iOS 8, 9 dan 10 dan info di atas tidak dapat memperbaikinya, namun saya menemukan solusi setelah seharian mengerjakan ini. Memang itu tidak akan bekerja untuk semua orang, tetapi dalam kasus saya item saya ditumpuk dalam kolom dan memiliki tinggi 0 padahal seharusnya tinggi konten. Mengganti css menjadi baris dan membungkus memperbaiki masalah. Ini hanya berfungsi jika Anda memiliki satu item dan mereka ditumpuk tetapi karena saya butuh waktu sehari untuk mengetahuinya, saya pikir saya harus membagikan perbaikan saya!
sumber
Saya memiliki bug serupa, tetapi saat menggunakan nomor tetap untuk tinggi dan bukan persentase. Itu juga wadah fleksibel di dalam tubuh (yang tidak memiliki ketinggian yang ditentukan). Tampaknya di Safari, wadah fleksibel saya memiliki ketinggian 9px karena alasan tertentu, tetapi di semua peramban lain ditampilkan ketinggian 100px yang benar yang ditentukan dalam stylesheet.
Saya berhasil membuatnya bekerja dengan menambahkan properti
height
danmin-height
ke kelas CSS.Hal berikut ini berfungsi untuk saya di Safari 13.0.4 dan Chrome 79.0.3945.130:
Semoga ini membantu!
sumber