Bagaimana cara mengatur lebar dan tinggi gambar tanpa meregangkannya?

90

Jika saya memiliki:

#logo {
    width: 400px;
    height: 200px;
}

kemudian

<img id="logo" src="logo.jpg"/>

akan meregang untuk mengisi ruang itu. Saya ingin gambar tetap dalam ukuran yang sama, tetapi untuk mengambil banyak ruang di DOM. Apakah saya harus menambahkan enkapsulasi <div>atau <span>? Saya benci menambahkan markup untuk gaya.

Paul Tarjan
sumber
Jika Anda masih menggunakan Stack Overflow, apakah Anda ingin mempertimbangkan untuk memperbarui jawabannya?
mikemaccana

Jawaban:

118

Ya, Anda membutuhkan div encapsulating:

<div id="logo"><img src="logo.jpg"></div>

dengan sesuatu seperti:

#logo { height: 100px; width: 200px; overflow: hidden; }

Solusi lain (padding, margin) lebih membosankan (karena Anda perlu menghitung nilai yang tepat berdasarkan dimensi gambar) tetapi juga tidak secara efektif mengizinkan container lebih kecil dari gambar.

Selain itu, hal di atas dapat diadaptasi dengan lebih mudah untuk tata letak yang berbeda. Misalnya, jika Anda menginginkan gambar di kanan bawah:

#logo { position: relative; height: 100px; width: 200px; }
#logo img { position: absolute; right: 0; bottom: 0; }
cletus
sumber
5
Anda dapat mengganti tag <div> dengan <figure>: menambahkan semantik dan Anda dapat memberikan keterangan (<figcaption>) untuknya, jika perlu. developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
Mateus Leon
Selain itu, jika untuk penggunaan branding, pada presentasi situs web, gunakan <h1> (if index) atau <p> (if other), terapkan atribut title dan alt ke <img>, sehingga Anda dapat menambahkan markup SEO friendly . Mereka juga merupakan elemen tingkat blok, seperti div, dan dapat menjadi pembungkus untuk fungsionalitas krop Anda.
Mateus Leon
3
Saya tidak tahu Cletus adalah seorang pengembang web. Luar biasa
Piyin
63

Jawaban 2017

Objek CSS cocok bekerja di semua browser saat ini. Ini memungkinkan imgelemen menjadi lebih besar tanpa meregangkan gambar.

Anda dapat menambahkan object-fit: cover;ke CSS Anda.

Dante
sumber
2
Anda mungkin harus menyebutkan browser apa yang berfungsi.
Nathan Tuggy
2
periksa tautan ini untuk kompatibilitas browser: caniuse.com/#search=object-fit
Alessia
28

Muat gambar sebagai background untuk div.

Dari pada:

<img id='logo' src='picture.jpg'>

melakukan

<div id='logo' style='background:url(picture.jpg)'></div>

Semua browser akan memotong bagian gambar yang tidak pas.
Ini memiliki beberapa keunggulan dibandingkan membungkusnya dengan elemen yang luapannya tersembunyi:

  1. Tidak ada markup ekstra. Div hanya menggantikan img.
  2. Pusatkan atau atur gambar dengan mudah ke offset lain. misalnya.url(pic) center top;
  3. Ulangi gambar jika cukup kecil. (Oke, tidak tahu mengapa Anda menginginkan itu)
  4. Setel warna bg dalam pernyataan yang sama, terapkan gambar yang sama dengan mudah ke beberapa elemen, dan semua yang berlaku untuk gambar bg.

Update: Jawaban ini dari before object-fit; Anda sekarang mungkin harus menggunakan object-fit / object-position.

Ini masih berguna untuk browser lama, untuk properti tambahan (seperti background-repeat), dan untuk kasus edge (Misalnya, mengatasi bug Chrome dengan flexbox dan object-position dan masalah FF (sebelumnya?) Dengan grid + autoheight + object- fit. Div pembungkus di grid / flexbox sering memberikan ... hasil yang tidak intuitif.)

SamGoody
sumber
4
Mereka yang memberi -1 harus menjelaskan untuk kepentingan pengguna lain. Secara pribadi, telah melakukan ini dengan hasil yang sangat baik, bahkan di IE6 dan Safari di iOS.
SamGoody
Hanya ingin menambahkan - ini umumnya merupakan pendekatan yang baik. Orang-orang bahkan menentukan koordinat posisi latar belakang untuk lembar sprite gambar sebagai pengoptimalan. Satu perbedaan, bagaimanapun, adalah bahwa ia tidak memiliki penangan kejadian kesalahan yang <img> miliki
badunk
Saya juga menambahkan kelas ke div dengan konten ini:background-repeat:no-repeat !important; float:left; width:100px; height:100px;
Nils
2
Beberapa browser secara default tidak akan mencetak gambar latar belakang, jadi ini mungkin bukan pendekatan yang baik jika Anda ingin mengizinkan pengguna mencetak halaman itu.
Bennett McElwee
5
Ini tidak benar secara semantik. Jika ini berguna, mengapa HTML5 menempatkan lebih banyak tag terkait gambar, untuk mengoptimalkan semantik, dengan figcaption, gambar? Gunakan tag img seperti yang dirancang dan berhenti mengganti semuanya dengan <div> s.
Mateus Leon
24

Objek-fit CSS3

Saya tidak yakin seberapa jauh penerapannya oleh webkit, IE, dan firefox. Tapi Opera bekerja seperti sihir

object-fitberfungsi dengan konten SVG, tetapi efek yang sama juga dapat dicapai dengan menyetel preserveAspectRatio=""atribut di SVG itu sendiri.

img {
  height: 100px;
  width: 100px;
  -o-object-fit: contain;
}

Chris Mills mendemonstrasikannya di sini http://dev.opera.com/articles/view/css3-object-fit-object-position/

kepiting
sumber
2
1+ Ini sangat keren. Sayang sekali ada dukungan terbatas .. Sepertinya Chrome 32 adalah yang pertama mendukung tanpa awalan vendor.
Josh Crozier
Ini luar biasa, bekerja seperti pesona. Hanya menambahkan satu properti sudah memperbaiki semuanya. Saya hanya perlu Chrome dan berhasil. Dan ya, tanpa awalan vendor. Terima kasih.
whyAto8
10
#logo {
    width: 400px;
    height: 200px;

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

Buat div dan berikan kelas. Lalu jatuhkan img di dalamnya.

<div class="mydiv">

<img src="location/of/your/image" ></img>

</div>

Setel ukuran div Anda dan buat itu relatif.

    .mydiv {
        position: relative;
        height:300px;
        width: 100%;
        overflow: hidden;
    }

lalu atur gaya gambar Anda

img {
    width: 100%;
    height: auto;
    overflow: hidden;
}

Semoga membantu

Sabba Keynejad
sumber
3

Anda dapat menggunakan seperti di bawah ini:

.width100 {
  max-width: 100px;
  height: 100px;
  width: auto;
  border: solid red;
}
<img src="https://www.gravatar.com/avatar/dc48e9b92e4210d7a3131b3ef46eb8b1?s=512&d=identicon&r=PG" class="width100" />

PurTahan
sumber
1

Apakah saya harus menambahkan <div> atau <span> yang merangkum?

Saya pikir Anda melakukannya. Satu-satunya hal yang terlintas dalam pikiran adalah padding, tetapi untuk itu Anda harus mengetahui dimensi gambar terlebih dahulu.

Pekka
sumber
0

Anda dapat mencoba mengatur bantalan daripada tinggi / lebar.

Berkatilah Yahu
sumber
0

Yang terpikir oleh saya adalah meregangkan lebar atau tinggi dan membiarkannya mengubah ukurannya dalam aspek rasio. Akan ada ruang putih di samping. Sesuatu seperti bagaimana layar lebar menampilkan resolusi 1024x768.

mauris
sumber
0

Jika menggunakan flexbox adalah opsi yang valid untuk Anda (tidak perlu mendukung browser lama), periksa jawaban saya yang lain di sini (yang mungkin merupakan duplikat dari yang ini):

Pada dasarnya Anda perlu membungkus tag img Anda dalam div dan css Anda akan terlihat seperti ini:

.img__container {
    display: flex;
    padding: 15px 12px;
    box-sizing: border-box;
    width: 400px; height: 200px;

    img {
        margin: auto;
        max-width: 100%;
        max-height: 100%;
    }
}
rafaelbiten
sumber
-1

Ini pertanyaan yang cukup lama, tetapi saya memiliki masalah menjengkelkan yang sama persis di mana semuanya bekerja dengan baik untuk Chrome / Edge (dengan properti objek-fit) tetapi properti css yang sama tidak berfungsi di IE11 (karena tidak didukung di IE11), saya akhirnya menggunakan elemen "gambar" HTML5 yang memecahkan semua masalah saya.

Saya pribadi tidak menggunakan tag DIV luar karena itu tidak membantu sama sekali dalam kasus saya, jadi saya menghindari DIV luar dan hanya diganti dengan elemen 'gambar'.

Kode di bawah ini memaksa gambar untuk diperkecil / diperkecil dengan baik (tanpa mengubah rasio aspek asli).

<figure class="figure-class">
  <img class="image-class" src="{{photoURL}}" />
</figure>

dan kelas css:

.image-class {
    border: 6px solid #E8E8E8;
    max-width: 189px;
    max-height: 189px;
}

.figure-class {
    width: 189px;
    height: 189px;
}
nakul2013
sumber