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.


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; }

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


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.)


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/


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;
}

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


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" />


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.



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.


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%;
    }
}

-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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.