Saya memiliki situs untuk digabungkan yang memiliki rasio aspek tetap kira-kira 16:9
lanskap, seperti video.
Saya ingin membuatnya terpusat dan berkembang untuk mengisi lebar yang tersedia, dan tinggi yang tersedia, tetapi tidak pernah tumbuh lebih besar di kedua sisi.
Sebagai contoh:
- Halaman yang tinggi dan tipis akan memiliki konten yang membentang selebar penuh dengan tetap menjaga tinggi proporsional.
- Halaman lebar yang pendek akan memiliki konten yang membentang dari ketinggian penuh, dengan lebar proporsional.
Ada dua metode yang saya pelajari:
- Gunakan gambar dengan rasio aspek yang tepat untuk memperluas penampung
div
, tetapi saya tidak bisa membuatnya berperilaku dengan cara yang sama di browser utama. - Menetapkan bantalan bawah yang proporsional, tetapi itu hanya berfungsi secara relatif terhadap lebar dan mengabaikan tingginya. Itu terus bertambah besar dengan lebar dan menampilkan bilah gulir vertikal.
Saya tahu Anda dapat melakukan ini dengan JS dengan cukup mudah, tetapi saya ingin solusi CSS murni.
Ada ide?
html
css
responsive-design
aspect-ratio
Henry Gibson
sumber
sumber
position: relative (default) height: 0 padding-<top/bottom>: H/W*100%
Jawaban:
Gunakan unit viewport CSS baru
vw
danvh
(lebar viewport / tinggi viewport)BIOLA
Ubah ukuran secara vertikal dan horizontal dan Anda akan melihat bahwa elemen akan selalu memenuhi ukuran viewport maksimum tanpa merusak rasio dan tanpa scrollbar!
(MURNI) CSS
Tampilkan cuplikan kode
Jika Anda ingin menggunakan maksimal, katakanlah 90% lebar dan tinggi viewport: FIDDLE
Tampilkan cuplikan kode
Selain itu, dukungan browser juga cukup bagus: IE9 +, FF, Chrome, Safari- caniuse
sumber
vh
,vw
,vmin
,vmax
). Namun, ada solusi , yang menggunakan kueri media untuk menargetkan perangkat iOS.Hanya merumuskan kembali
Danield
jawaban dalam campuran KURANG, untuk penggunaan lebih lanjut:sumber
Gunakan kueri media CSS
@media
bersama dengan unit area pandang CSSvw
danvh
untuk menyesuaikan dengan rasio aspek area pandang. Ini memiliki keuntungan untuk memperbarui properti lain, sepertifont-size
juga.Biola ini mendemonstrasikan rasio aspek tetap untuk div, dan teks yang sama persis dengan skalanya.
Ukuran awal didasarkan pada lebar penuh:
Kemudian, jika area pandang lebih lebar dari rasio aspek yang diinginkan, alihkan ke tinggi sebagai ukuran dasar:
Ini sangat mirip dengan pendekatan
max-width
dan oleh @Danield, hanya saja lebih fleksibel.max-height
sumber
Pertanyaan asli saya untuk ini adalah bagaimana keduanya memiliki elemen dari aspek tetap, tetapi untuk menyesuaikannya dalam wadah yang ditentukan dengan tepat, yang membuatnya sedikit rumit. Jika Anda hanya ingin elemen individu mempertahankan rasio aspeknya, itu jauh lebih mudah.
Metode terbaik yang pernah saya temukan adalah dengan memberikan elemen ketinggian nol dan kemudian menggunakan persentase padding-bottom untuk memberikan ketinggian. Persentase pengisi selalu proporsional dengan lebar elemen, dan bukan tingginya, bahkan jika bantalan atas atau bawahnya.
Properti Padding W3C
Jadi memanfaatkannya Anda dapat memberi elemen persentase lebar untuk ditempatkan di dalam wadah, dan kemudian padding untuk menentukan rasio aspek, atau dalam istilah lain, hubungan antara lebar dan tingginya.
Jadi dalam contoh di atas objek mengambil 80% dari lebar wadah, dan kemudian tingginya 56,25% dari nilai itu. Jika lebarnya 160px maka padding bawahnya, dan dengan demikian tingginya akan menjadi 90px - aspek 16: 9.
Masalah kecil di sini, yang mungkin tidak menjadi masalah bagi Anda, adalah tidak ada ruang alami di dalam objek baru Anda. Jika Anda perlu memasukkan beberapa teks misalnya dan teks itu perlu mengambil nilai paddingnya sendiri, Anda perlu menambahkan wadah di dalamnya dan menentukan properti di sana.
Unit vw dan vh juga tidak didukung pada beberapa browser lama, jadi jawaban yang diterima untuk pertanyaan saya mungkin tidak memungkinkan untuk Anda dan Anda mungkin harus menggunakan sesuatu yang lebih lo-fi.
sumber
Saya memahami bahwa Anda meminta agar Anda menginginkan
CSS
solusi tertentu. Untuk mempertahankan rasio aspek, Anda harus membagi tinggi dengan rasio aspek yang diinginkan. 16: 9 = 1,777777777778.Untuk mendapatkan tinggi yang benar untuk wadah, Anda perlu membagi lebar saat ini dengan 1,777777777778. Karena Anda tidak dapat memeriksa
width
wadah dengan hanyaCSS
atau membagi dengan persentaseCSS
, ini tidak mungkin tanpaJavaScript
(sepengetahuan saya).Saya telah menulis skrip kerja yang akan menjaga rasio aspek yang diinginkan.
HTML
CSS
JavaScript
Anda dapat menggunakan
function
lagi jika Anda ingin menampilkan sesuatu yang lain dengan rasio yang berbeda dengan menggunakansumber
window.onresize
diaktifkan saat browser mengubah ukuran.Sekarang ada properti CSS baru ditentukan untuk mengatasi hal ini:
object-fit
.http://docs.webplatform.org/wiki/css/properties/object-fit
Dukungan browser masih agak kurang ( http://caniuse.com/#feat=object-fit ) - saat ini berfungsi di sebagian besar browser kecuali Microsoft - tetapi waktu yang diberikan itulah yang dibutuhkan untuk pertanyaan ini.
sumber
Jawaban Danield bagus, tapi hanya bisa digunakan saat div memenuhi seluruh viewport, atau dengan menggunakan sedikit
calc
, bisa digunakan jika lebar dan tinggi konten lain di viewport diketahui.Namun, dengan menggabungkan
margin-bottom
trik dengan metode pada jawaban di atas, masalahnya bisa direduksi menjadi hanya mengetahui ketinggian konten lainnya. Ini berguna jika Anda memiliki header dengan tinggi tetap, tetapi lebar sidebar, misalnya, tidak diketahui.Ini dia di jsfiddle menggunakan scss , yang membuatnya lebih jelas dari mana asalnya.
sumber
Berdasarkan jawaban Daniel , saya menulis mixin SASS ini dengan interpolasi (
#{}
) untuk iframe video youtube yang ada di dalam dialog modal Bootstrap:Pemakaian:
HTML:
Ini akan selalu menampilkan video tanpa bagian hitam yang ditambahkan youtube ke iframe ketika lebar atau tingginya tidak proporsional dengan video. Catatan:
$sides-adjustment
adalah sedikit penyesuaian untuk mengimbangi sebagian kecil dari bagian hitam ini yang muncul di samping;.modal-footer
;.modal-dialog
;.modal-header
.Setelah banyak pengujian, ini bekerja dengan sempurna untuk saya sekarang.
sumber
di sini solusi berdasarkan solusi @Danield, yang berfungsi bahkan dalam div.
Dalam contoh itu, saya menggunakan Angular tetapi dapat dengan cepat berpindah ke vanilla JS atau kerangka kerja lain.
Ide utamanya hanyalah memindahkan solusi @Danield dalam iframe kosong dan menyalin dimensi setelah ukuran jendela iframe berubah.
Iframe itu harus menyesuaikan dimensi dengan elemen ayahnya.
https://stackblitz.com/edit/angular-aspect-ratio-by-iframe?file=src%2Findex.html
Berikut beberapa screenshotnya:
sumber