Ukuran gambar CSS, bagaimana cara mengisi, bukan peregangan?

415

Saya memiliki gambar, dan saya ingin mengaturnya lebar dan tinggi tertentu (dalam piksel)

Tetapi jika saya mengatur lebar dan tinggi menggunakan css ( width:150px; height:100px), gambar akan melebar, dan itu mungkin jelek.

Bagaimana cara Mengisi gambar ke ukuran tertentu menggunakan CSS, dan tidak merentangkannya ?

Contoh gambar isi dan peregangan:

Gambar asli:

Asli

Gambar membentang:

Menggeliat

Gambar yang Diisi:

Terisi

Harap perhatikan bahwa dalam contoh gambar Penuh di atas: pertama, gambar diubah ukurannya menjadi 150x255 (rasio aspek terpelihara), dan kemudian dipangkas menjadi 150x100.

Mahdi Ghiasi
sumber
Coba hanya pengaturan widthdan heightharus menyesuaikan sesuai
NewInTheBusiness
3
Itu membentang gambar. lihat ini: jsfiddle.net/D7E3E
Mahdi Ghiasi
Dibutuhkan bagian dari gambar tidak mengubah ukuran!
Ali Ben Messaoud
3
Chris Coyier's juga memiliki beberapa solusi yang baik untuk ini: css-tricks.com/perfect-full-page-background-image
ambiguousmouse
1
SANGAT PENTING: ini adalah praktik yang sangat buruk untuk keperluan SEO. Jika Anda menggunakannya sebagai gambar latar belakang maka itu berfungsi ok, tetapi jika Anda ingin gambar itu ditemukan oleh Google, ia TIDAK akan diindeks jika itu hanya gambar latar belakang.
Alex Banman

Jawaban:

395

Jika Anda ingin menggunakan gambar sebagai latar belakang CSS, ada solusi yang elegan. Cukup gunakan coveratau containdi background-sizeproperti CSS3.

.container {
  width: 150px;
  height: 100px;
  background-image: url("http://i.stack.imgur.com/2OrtT.jpg");
  background-size: cover;
  background-repeat: no-repeat;
  background-position: 50% 50%;
}
<div class="container"></div>

Meskipun coverakan memberi Anda gambar yang ditingkatkan, containakan memberi Anda gambar yang diperkecil. Keduanya akan mempertahankan rasio aspek piksel.

http://jsfiddle.net/uTHqs/ (menggunakan sampul)

http://jsfiddle.net/HZ2FT/ (menggunakan isi)

Pendekatan ini memiliki keuntungan menjadi ramah terhadap tampilan Retina sesuai panduan singkat Thomas Fuchs.

Perlu disebutkan bahwa dukungan browser untuk kedua atribut tidak termasuk IE6-8.

Marcelo De Polli
sumber
1
Karena Anda dapat mengubah ukuran gambar murni di CSS, ini memungkinkan Anda untuk menggunakan gambar besar dan kemudian menurunkannya sesuai dengan kerapatan piksel masing-masing perangkat dengan menggunakan kueri media.
Marcelo De Polli
1
Bisakah Anda menjelaskan mengapa dalam hal ini posisi latar tampaknya mengindikasikan posisi tengah gambar daripada sudut kiri atas? Apakah ini konsekuensi dari ukuran latar belakang: sampul?
matteo
1
Tambang saya hanya mencakup seluruh DIV yang memperluas gambar. Saya tidak melihat kurva berakhir.
SearchForKnowledge
3
Untuk apa background-repeat: no-repeat;? Jika gambar menutupi wadahnya, toh itu tidak akan terulang kembali.
lurkit
3
'posisi latar belakang' dapat diatur ke 'pusat tengah' juga. mis .: .container {... posisi-belakang: pusat tengah; }
Leo Ribeiro
556

Anda dapat menggunakan properti css object-fit.

.cover {
  object-fit: cover;
  width: 50px;
  height: 100px;
}
<img src="http://i.stack.imgur.com/2OrtT.jpg" class="cover" width="242" height="363" />

Lihat contoh di sini

Ada polyfill untuk IE: https://github.com/anselmh/object-fit

afonsoduarte
sumber
11
Menarik untuk melihat bahwa ini dapat dilakukan dengan imgtag juga (tidak hanya background-imagemetode seperti yang dijelaskan dalam jawaban di atas). Terima kasih :)
Mahdi Ghiasi
44
Saat mempertimbangkan ini sebagai opsi, ingatlah bahwa object-fit itu tidak didukung di banyak browser .
joshreesjones
2
Sayangnya background-sizejarang ada solusi yang layak dalam proyek saya. Anda cenderung menerima manfaat SEO apa pun dan tidak dapat memberikan tag ALT, teks, dll untuk menyertai gambar di mana Anda mungkin ingin memberikan konteks tambahan untuk pembaca layar.
Markus
3
Ini keren, tetapi tidak ada dukungan IE. Tak satu pun dari polyfill yang berfungsi lagi.
Jake
3
Hanya menggunakannya object-fit: cover;. Terima kasih banyak
Luka
67

Peningkatan pada jawaban di atas oleh @afonsoduarte ( BUKAN jawaban yang diterima) .
jika Anda menggunakan bootstrap


Ada tiga perbedaan:

  1. Memberikan width:100%gaya.
    Ini berguna jika Anda menggunakan bootstrap dan ingin gambar merentangkan semua lebar yang tersedia.

  2. Menentukan heightproperti adalah opsional, Anda dapat menghapus / menyimpannya sesuai kebutuhan

    .cover {
       object-fit: cover;
       width: 100%;
       /*height: 300px;  optional, you can remove it, but in my case it was good */
    }
  3. Omong-omong, TIDAK perlu menyediakan heightdan widthatribut pada imageelemen karena mereka akan ditimpa oleh gaya.
    jadi cukup menulis sesuatu seperti ini.

    <img class="cover" src="url to img ..."  />
Hakan Fikst
sumber
1
Persis apa yang saya cari.
francis lanthier
1
Kamu butuh ciuman!
Qin Wang
objek-fit tidak berfungsi dengan IE?
bgcode
1
ini tahun 2020, saya pikir ini saat yang tepat untuk meninggalkan IE
Hakan Fıstık
56

Satu-satunya cara nyata adalah memiliki wadah di sekitar gambar Anda dan gunakan overflow:hidden:

HTML

<div class="container"><img src="ckk.jpg" /></div>

CSS

.container {
    width: 300px;
    height: 200px;
    display: block;
    position: relative;
    overflow: hidden;
}

.container img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
}

Sangat menyakitkan dalam CSS untuk melakukan apa yang Anda inginkan dan memusatkan gambar, ada perbaikan cepat di jquery seperti:

var conHeight = $(".container").height();
var imgHeight = $(".container img").height();
var gap = (imgHeight - conHeight) / 2;
$(".container img").css("margin-top", -gap);

http://jsfiddle.net/x86Q7/2/

Dominic Green
sumber
1
Terima kasih. itu berhasil, tetapi memotong gambar dari atas . (lihat ini: jsfiddle.net/x86Q7 ) Apakah tidak ada cara untuk memotong gambar dari pusat ?
Mahdi Ghiasi
1
@ MahdiGhiasi: Ubah properti atas dan kiri di .container img css !!
Ali Ben Messaoud
Saya dapat mengatur margin-topgambar dengan misalnya 50px(lihat ini: jsfiddle.net/x86Q7/1 ), tetapi Bagaimana cara memotongnya dari pusat nyata ? (Tanpa jQuery?)
Mahdi Ghiasi
2
Ahh maaf tidak melihat komentar Anda tetapi saya menambahkan jquery hanya memetikan :)
Dominic Green
1
Solusi hebat! Bagi saya isi vertikal lebih penting daripada horisontal, jadi saya hanya perlu mengubah "width: 100%" menjadi "height: 100%" untuk kelas '.container img'. Terima kasih!
deebs
26

Solusi CSS tanpa JS dan tanpa gambar latar:

Metode 1 "margin otomatis" (IE8 + - BUKAN FF!):

div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}
div img{
  position:absolute; 
  top:0; 
  bottom:0; 
  margin: auto;
  width:100%;
}
<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
  <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>

http://jsfiddle.net/5xjr05dt/

Metode 2 "mengubah" (IE9 +):

div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}

div img{
  position:absolute; 
  width:100%;
  top: 50%;
  -ms-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
  transform: translateY(-50%);
}
<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
  <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>

http://jsfiddle.net/5xjr05dt/1/

Metode 2 dapat digunakan untuk memusatkan gambar dalam wadah dengan lebar / tinggi tetap. Keduanya dapat meluap - dan jika gambar lebih kecil dari wadah itu masih akan terpusat.

http://jsfiddle.net/5xjr05dt/3/

Metode 3 "pembungkus ganda" (IE8 + - BUKAN FF!):

.outer{
  width:150px; 
  height:100px; 
  margin: 200px auto; /* just for example */
  border: 1px solid red; /* just for example */
  /* overflow: hidden;	*/ /* TURN THIS ON */
  position: relative;
}
.inner { 
    border: 1px solid green; /* just for example */
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
    display: table;
    left: 50%;
}
.inner img {
    display: block;
    border: 1px solid blue; /* just for example */
    position: relative;
    right: 50%;
    opacity: .5; /* just for example */
}
<div class="outer">
  <div class="inner">
     <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
  </div>
</div>

http://jsfiddle.net/5xjr05dt/5/

Metode 4 "pembungkus ganda DAN gambar ganda" (IE8 +):

.outer{
  width:150px; 
  height:100px; 
  margin: 200px auto; /* just for example */
  border: 1px solid red; /* just for example */
  /* overflow: hidden;	*/ /* TURN THIS ON */
  position: relative;
}
.inner { 
    border: 1px solid green; /* just for example */
    position: absolute;
    top: 50%;
    bottom: 0;
    display: table;
    left: 50%;
}
.inner .real_image {
    display: block;
    border: 1px solid blue; /* just for example */
    position: absolute;
    bottom: 50%;
    right: 50%;
    opacity: .5; /* just for example */
}

.inner .placeholder_image{
  opacity: 0.1; /* should be 0 */
}
<div class="outer">
  <div class="inner">
    <img class="real_image" src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
    <img class="placeholder_image"  src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
  </div>
</div>

http://jsfiddle.net/5xjr05dt/26/

  • Metode 1 memiliki dukungan yang sedikit lebih baik - Anda harus mengatur lebar ATAU tinggi gambar!
  • Dengan metode awalan 2 juga memiliki dukungan yang layak (dari ie9 ke atas) - Metode 2 tidak memiliki dukungan pada Opera mini!
  • Metode 3 menggunakan dua pembungkus - dapat meluap lebar DAN tinggi.
  • Metode 4 menggunakan gambar ganda (satu sebagai pengganti) ini memberikan beberapa overhead bandwidth tambahan, tetapi bahkan dukungan crossbrowser yang lebih baik.

Metode 1 dan 3 tampaknya tidak berfungsi dengan Firefox

JT Houtenbos
sumber
Ini adalah satu-satunya yang benar-benar berfungsi (minus solusi js). Terima kasih!
Jake
Ini terbatas pada meluap baik tinggi atau lebar, tetapi solusi yang menarik.
Jake
1
@ Jake - Dimungkinkan untuk meluap lebar DAN tinggi dengan metode 2 di atas - lihat jawaban saya yang diperbarui dengan biola tambahan.
JT Houtenbos
Ya. Ini jelas merupakan jawaban yang bagus. Saya akan bermain-main dengan itu lagi. Agak aneh untuk gambar yang lebih lebar daripada yang lebih tinggi yang harus responsif, tetapi ada banyak aplikasi untuk ini.
Jake
1
@ Jake - Cool - Saya menemukan metode ke-3 untuk melakukan pemusatan horizontal. Saya memperluas metode ini untuk juga mendukung pemusatan vertikal. Saya akan memposting tambahan saya sebagai metode ke-3 di atas. Tampaknya itu adalah bukti IE7 + (bahkan lebih rendah mungkin). Inilah jawaban aslinya: stackoverflow.com/questions/3300660/…
JT Houtenbos
10

Solusi lain adalah menempatkan gambar dalam wadah dengan lebar dan tinggi yang diinginkan. Dengan menggunakan metode ini Anda tidak perlu mengatur gambar sebagai gambar latar elemen.

Kemudian Anda dapat melakukan ini dengan imgtag dan hanya mengatur lebar dan lebar maks pada elemen.

CSS:

.imgContainer {
    display: block;
    width: 150px; 
    height: 100px;
}

.imgContainer img {
    max-width: 100%;
    max-height: 100%;
}

HTML:

<div class='imgContainer'>
    <img src='imagesrc.jpg' />
</div>

Sekarang ketika Anda mengubah ukuran wadah gambar akan secara otomatis tumbuh sebesar mungkin tanpa melampaui batas atau mendistorsi.

Jika Anda ingin memusatkan gambar secara vertikal dan horizontal, Anda dapat mengubah css wadah ke:

.imgContainer {
    display: table-cell;
    width: 150px; 
    height: 100px;
    text-align: center;
    vertical-align: middle;
}

Berikut ini adalah JS Fiddle http://jsfiddle.net/9kUYC/2/

earl3s
sumber
Ini tidak sama dengan sampul dalam CSS, di mana salah satu dimensi yang dihasilkan selalu melampaui 100% (atau sama dengan tepi kasus)
Miroshko
Tidak, solusi ini memastikan bahwa itu tidak pernah melampaui 100%, yang merupakan bagian dari pertanyaan itu. Mereka tidak ingin distorsi gambar atau tumbuh melampaui dimensi asli.
earl3s
3
Pertanyaannya adalah "Bagaimana Mengisi" dengan contoh gambar yang diisi, yang jelas dipotong.
Miroshko
Tetapi bagaimana jika Anda membutuhkan gambar agar responsif? Menentukan lebar dan tinggi tertentu tidak akan berhasil 😕
Ricardo Zea
2
Itu yang saya butuhkan. Terima kasih!
Nico Rodsevich
5

Membangun dari jawaban @Dominic Green menggunakan jQuery, berikut adalah solusi yang harus bekerja untuk gambar yang lebih lebar daripada tinggi atau lebih tinggi dari lebar.

http://jsfiddle.net/grZLR/4/

Mungkin ada cara yang lebih elegan dalam melakukan JavaScript, tetapi ini berhasil.

function myTest() {
  var imgH = $("#my-img").height();
  var imgW = $("#my-img").width();
  if(imgW > imgH) {
    $(".container img").css("height", "100%");
    var conWidth = $(".container").width();
    var imgWidth = $(".container img").width();
    var gap = (imgWidth - conWidth)/2;
    $(".container img").css("margin-left", -gap);
  } else {
    $(".container img").css("width", "100%");
    var conHeight = $(".container").height();
    var imgHeight = $(".container img").height();
    var gap = (imgHeight - conHeight)/2;
    $(".container img").css("margin-top", -gap);
  }
}
myTest();
anjing hutan
sumber
5
  • Tidak menggunakan latar belakang css
  • Hanya 1 div untuk klip itu
  • Diubah ukuran menjadi lebar minimum daripada menjaga rasio aspek yang benar
  • Pangkas dari tengah (vertikal dan horizontal, Anda dapat menyesuaikannya dengan bagian atas, kiri & transformasi)

Hati-hati jika Anda menggunakan tema atau sesuatu, mereka akan sering mendeklarasikan img max-width pada 100%. Anda harus membuat tidak ada. Uji itu :)

https://jsfiddle.net/o63u8sh4/

<p>Original:</p>
<img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>

<p>Wrapped:</p>
<div>
    <img src="http://i.stack.imgur.com/2OrtT.jpg" alt="image"/>
</div>


div{
  width:150px; 
  height:100px; 
  position:relative;
  overflow:hidden;
}
div img{
  min-width:100%;
  min-height:100%;
  height:auto;
  position:relative;
  top:50%;
  left:50%;
  transform:translateY(-50%) translateX(-50%);
}
dmegatool
sumber
Ini adalah jawaban yang saya cari.
Marcos Buarque
Inilah yang ingin saya lakukan untuk waktu yang lama, terima kasih;)
Boss COTIGA
4

Saya membantu membangun plugin jQuery yang disebut Fillmore , yang menangani background-size: coverbrowser di yang mendukungnya, dan memiliki shim bagi mereka yang tidak. Coba lihat!

Aidan Feldman
sumber
4

Saya pikir sudah terlambat untuk jawaban ini. Pokoknya berharap ini akan membantu seseorang di masa depan. Saya menghadapi masalah memposisikan kartu dalam sudut. Ada kartu yang ditampilkan untuk berbagai acara. Jika lebar gambar acara besar untuk kartu, gambar harus ditampilkan dengan memotong dari dua sisi dan tinggi 100%. Jika tinggi gambar panjang, bagian bawah gambar dipotong dan lebar 100%. Inilah solusi css murni saya untuk ini:

masukkan deskripsi gambar di sini

HTML:

 <span class="block clear img-card b-b b-light text-center" [ngStyle]="{'background-image' : 'url('+event.image+')'}"></span>

CSS

.img-card {
background-repeat: no-repeat;
background-size: cover;
background-position: 50% 50%;
width: 100%;
overflow: hidden;
}
Nodirabegimxonoyim
sumber
saya tidak dapat memahami bagaimana ini bekerja tetapi itu berhasil. Anda perlu memposisikan rentang benar-benar atas: 0; kanan: 0; bawah: 0; kiri: 0 di dalam induk yang relatif diposisikan untuk dimensi itu.
Mike
Terima kasih atas umpan baliknya, Mike, saya senang jika ini membantu. Apakah Anda ingin saya memperbarui jawaban dengan komentar Anda?
Nodirabegimxonoyim
3

Coba sesuatu seperti ini: http://jsfiddle.net/D7E3E/4/

Menggunakan wadah dengan overflow: disembunyikan

EDIT: @Dominic Green mengalahkan saya.

woutr_be
sumber
Terima kasih. itu berhasil, tetapi memotong gambar dari atas . (lihat ini: jsfiddle.net/x86Q7 ) Apakah tidak ada cara untuk memotong gambar dari pusat ?
Mahdi Ghiasi
Mungkin agak sulit dengan CSS, ini adalah yang terbaik yang bisa saya dapatkan dengan jsfiddle.net/D7E3E/5
woutr_be
Ya, untuk membuatnya terpusat dengan benar, Anda harus menggunakan jQuery, mungkin jauh lebih mudah.
woutr_be
3

Ini akan Mengisi gambar ke ukuran tertentu, tanpa merentangkannya atau tanpa memotongnya

img{
    width:150px;  //your requirement size
    height:100px; //your requirement size

/*Scale down will take the necessary specified space that is 150px x 100px without stretching the image*/
    object-fit:scale-down;
}
Manoj Selvin
sumber
2

Untuk menyesuaikan gambar dalam layar penuh coba ini:

background-repeat: round;

suyash1798
sumber
0
<div class="container">
     <img src="http://i.stack.imgur.com/2OrtT.jpg"/>
</div>

<style>
.container {
       width: 150px;
       height: 100px;
       overflow: hidden;
}
</style>
pengguna3181614
sumber