Dengan menggunakan model kotak fleksibel CSS, bagaimana cara memaksa gambar untuk mempertahankan rasio aspeknya?
JS Fiddle: http://jsfiddle.net/xLc2Le0k/2/
Perhatikan bahwa gambar melebar atau menyusut untuk mengisi lebar wadah. Tidak apa-apa, tetapi dapatkah kita juga membuatnya meregangkan atau mengecilkan ketinggian untuk mempertahankan proporsi gambar?
HTML
<div class="slider">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
</div>
CSS
.slider {
display: flex;
}
.slider img {
margin: 0 5px;
}
<div>
dengan CSSbackground-image: url(...);background-size:contain; background-repeat:no-repeat
Jawaban:
Untuk tag img jika Anda menentukan satu sisi maka sisi lainnya diubah ukurannya untuk menjaga rasio aspek dan secara default gambar diperluas ke ukuran aslinya.
Menggunakan fakta ini jika Anda membungkus setiap tag img ke dalam tag div dan menyetel lebarnya menjadi 100% dari div induk, maka tingginya akan sesuai dengan rasio aspek yang Anda inginkan.
http://jsfiddle.net/0o5tpbxg/
sumber
Untuk menjaga agar gambar tidak meregang di salah satu sumbu di dalam induk fleksibel, saya telah menemukan beberapa solusi.
Anda dapat mencoba menggunakan object-fit pada gambar yang, mis
http://jsfiddle.net/ykw3sfjd/
Atau Anda dapat menambahkan aturan flex-specfic yang mungkin bekerja lebih baik dalam beberapa kasus.
sumber
object-fit: contain;
melakukan trik untuk saya, ketika saya hanya memiliki masalah di chrome, ff baik-baik saja.Tidak perlu menambahkan div yang mengandung.
Default untuk properti css "align-items" adalah "stretch" yang menyebabkan gambar Anda ditarik hingga ketinggian aslinya. Menyetel properti css "align-items" ke "flex-start" akan memperbaiki masalah Anda.
sumber
Tapi itu tidak berfungsi seperti yang diharapkan jika gambar yang disetel sebagai item flex langsung dengan Modul Tata Letak Kotak Fleksibel Level 1 , sejauh yang saya tahu.
Lihat diskusi ini dan laporan bug mungkin terkait:
Sebagai solusinya, Anda bisa membungkus masing
<img>
- masing dengan a<div>
atau a<span>
, atau lebih.jsFiddle
Atau, Anda dapat menggunakan
table
tata letak CSS sebagai gantinya, yang akan Anda dapatkan hasil yang serupaflexbox
, ini akan berfungsi di lebih banyak browser, bahkan untuk IE8.jsFiddle
sumber
.slider > div{min-width:0}
browser baru yang mendukungmin-width: auto
.auto
nilai baru sebagai nilai defaultmin-width
danmin-height
(sebelumnya0
). Chrome belum menerapkannya, jadi cuplikan pertama Anda berfungsi. Tetapi browser baru membutuhkannya untuk memungkinkan item flex menyusut lebih kecil dari lebar default gambar.Saya telah bermain-main dengan flexbox akhir-akhir ini dan saya menemukan solusi untuk ini melalui eksperimen dan alasan berikut. Namun, pada kenyataannya saya tidak yakin apakah ini yang sebenarnya terjadi.
Jika lebar nyata dipengaruhi oleh sistem fleksibel. Jadi setelah lebar elemen mencapai lebar maksimal induk, lebar ekstra yang disetel di css diabaikan. Maka aman untuk menyetel lebar ke 100%.
Karena tinggi tag img berasal dari gambar itu sendiri, maka mengatur tinggi ke 0% bisa melakukan sesuatu. (Di sinilah saya tidak jelas tentang apa ... tetapi masuk akal bagi saya bahwa itu harus memperbaikinya)
DEMO
(ingat pernah melihatnya di sini dulu!)
Hanya bekerja di chrome
sumber
auto
". Itulah yang terjadi di Firefox.Perilaku ini diharapkan. flex container akan meregangkan semua anaknya secara default. Gambar tidak terkecuali. (yaitu, orang tua akan memiliki
align-items: stretch
properti)Untuk menjaga rasio aspek, kami memiliki dua solusi:
align-items: stretch
properti default kealign-items: flex-start
ataualign-self: center
dll., Http://jsfiddle.net/e394Lqnt/3/atau
align-self: center
ataualign-self: flex-start
dll. Http://jsfiddle.net/e394Lqnt/2/sumber
Sebenarnya saya menemukan bahwa wadah dari tag gambar harus memiliki ketinggian untuk menjaga rasio gambar. misalnya>
kemudian di html Anda, penampung Anda akan membungkus gambar tag
ini berfungsi untuk IE dan browser lain
sumber
Saya baru saja mengalami masalah yang sama. Gunakan flex align untuk menengahkan elemen Anda. Anda perlu menggunakan
align-items: center
bukanalign-content: center
. Ini akan mempertahankan rasio aspek, sedangkan perataan-konten tidak akan mempertahankan rasio aspek.sumber