CSS'de Nesne Sığdırma ve Arka Plan Boyutuna Derin Bir Bakış

Yayınlanan: 2022-03-10
Kısa özet ↬ Bu makalede, object-fit ve background-size nasıl çalıştığını, bunları ne zaman kullanabileceğimizi ve neden bazı pratik kullanım örnekleri ve önerileriyle birlikte inceleyeceğiz. Hadi dalalım.

Bir HTML öğesi için her zaman farklı boyutlu resimler yükleyemiyoruz. Resmin en boy oranıyla orantılı olmayan bir genişlik ve yükseklik kullanırsak, resim sıkıştırılabilir veya uzatılabilir. Bu iyi değil ve ya bir img öğesi için object-fit olarak ya da background-size kullanılarak çözülebilir.

Önce sorunu tanımlayalım. Aşağıdaki şekli göz önünde bulundurun:

Karşılaştırıldığında iyi görünen bir fotoğraf ve sıkıştırılmış bir görüntü
Bir kart bileşeninde kullanıldığında sıkışan güzel görünümlü bir fotoğraf. (Büyük önizleme)

Bu neden oluyor?

Bir görüntünün en boy oranı olacaktır ve tarayıcı, içeren kutuyu bu görüntüyle dolduracaktır. Görüntünün en boy oranı, kendisi için belirtilen genişlik ve yükseklikten farklıysa, sonuç ya sıkıştırılmış ya da uzatılmış bir görüntü olacaktır.

Bunu aşağıdaki resimde görüyoruz:

Karşılaştırıldığında iyi görünümlü bir fotoğraf ve uzatılmış bir görüntü
Resmin en boy oranı, içeren kutudan farklıdır ve resim uzar. (Büyük önizleme)

Çözüm

Resmin en boy oranı, içerdiği öğenin genişliği ve yüksekliği ile aynı hizada olmadığında her zaman farklı boyutta bir resim eklememiz gerekmez. CSS çözümlerine dalmadan önce, bunu fotoğraf düzenleme uygulamalarında nasıl yaptığımızı size göstermek istiyorum:

Maskede kırpılmış üst ve alt kenarları olan bir görüntü örneği
İlk önce görüntüyü dikey olarak ortalardık ve ardından bir maskeye klipslerdik. Bu, görüntünün en boy oranını korur ve sıkışmasını önler. (Büyük önizleme)

Artık bunun nasıl çalıştığını anladığımıza göre, bunun tarayıcıda nasıl çalıştığına geçelim. ( Spoiler uyarısı: Daha kolay! )

CSS object-fit

object-fit özelliği, img veya video gibi değiştirilen bir öğenin içeriğinin, kabına sığacak şekilde nasıl yeniden boyutlandırılması gerektiğini tanımlar. object-fit için varsayılan değer fill ve bu, görüntünün sıkıştırılmasına veya gerilmesine neden olabilir.

Olası değerlerin üzerinden geçelim.

Atlamadan sonra daha fazlası! Aşağıdan okumaya devam edin ↓

object-fit için olası değerler

object-fit: contain

Bu durumda resim, kapsayıcısının en boy oranına uyacak şekilde yeniden boyutlandırılacaktır. Resmin en boy oranı kapsayıcınınkiyle eşleşmiyorsa, mektup kutusuna eklenir.

nesneye sığdırmak: içermek
object-fit: contain kullanıldığında, görüntü ya mektup kutusuna dönüştürülür ya da buna göre yeniden boyutlandırılır. (Büyük önizleme)

object-fit: cover

Burada, görüntü ayrıca kabının en boy oranına uyacak şekilde yeniden boyutlandırılacak ve görüntünün en boy oranı kabınkiyle eşleşmiyorsa sığacak şekilde kırpılacaktır.

nesne-uyum: kapak
object-fit: cover kullanıldığında, görüntü sığacak şekilde kırpılır veya uygun şekilde yeniden boyutlandırılır. (Büyük önizleme)

object-fit: fill

Bununla, resim, kabının en boy oranına uyacak şekilde yeniden boyutlandırılacak ve resmin en boy oranı kabınkiyle eşleşmezse, sıkıştırılacak veya uzatılacaktır. Bunu istemiyoruz.

nesneye sığdırmak: doldurmak
object-fit: fill kullanıldığında, görüntü buna göre sıkıştırılır, uzatılır veya yeniden boyutlandırılır. (Büyük önizleme)

object-fit: none

Bu durumda, görüntü hiçbir şekilde yeniden boyutlandırılmaz, ne uzatılır ne de sıkıştırılır. cover değeri gibi çalışır, ancak kapsayıcısının en boy oranına uymaz.

nesne-uyum: yok
object-fit: none kullanılırken, boyutları aynı değilse görüntü yeniden boyutlandırılmaz. (Büyük önizleme)

object-fit dışında, bir görüntünün kapsayıcı içinde konumlandırılmasından sorumlu olan object-position özelliğine de sahibiz.

object-position için olası değerler

object-position özelliği, CSS'nin background-position özelliğine benzer şekilde çalışır:

nesne konumu merkezi, sol, sağ
Çoğu zaman, varsayılan değer kullanılır (yani "merkez" veya "%50 %50"). (Büyük önizleme)

top ve bottom anahtar kelimeler, içeren kutunun en boy oranı dikey olarak daha büyük olduğunda da çalışır:

nesne konumu üst ve alt
object-position: top (sol) ve object-position: bottom (sağ). (Büyük önizleme)

CSS background-size

background-size ile ilk fark, bir HTML ( img ) öğesi değil, arka planla uğraşıyor olmamızdır.

background-size için olası değerler

background-size için olası değerler auto , contain ve cover .

background-size: auto

auto ile resim varsayılan boyutunda kalır:

arka plan boyutu: otomatik
Varsayılan boyutun bazen bulanık bir görüntüye neden olabileceğini unutmayın (çok küçükse). (Büyük önizleme)

background-size: cover

Burada resim, kapsayıcıya sığacak şekilde yeniden boyutlandırılacaktır. En-boy oranları aynı değilse, görüntü sığacak şekilde maskelenecektir.

arka plan boyutu: kapak
background-size: cover kullanırken, bir görüntünün en boy oranlarını dikkate aldığınızdan emin olun. (Büyük önizleme)

background-size: contain

Bu durumda, görüntü kapsayıcıya sığacak şekilde yeniden boyutlandırılacaktır. En-boy oranları kapalıysa, görüntü sonraki örnekte gösterildiği gibi mektup kutusuna dönüştürülür:

arka plan boyutu: içerir
background-size: contain , görüntüyü kaba sığacak şekilde yeniden boyutlandırır. (Büyük önizleme)

background-position gelince, bu, object-position nasıl çalıştığına benzer. Tek fark, object-position konumunun varsayılan konumunun background-position farklı olmasıdır.

object-fit veya background-size ne zaman kullanılmaması gerektiği

Öğeye veya görüntüye sabit bir yükseklik verilirse ve ya background-size: cover ya da object-fit: cover sahipse, görüntünün çok geniş olacağı bir nokta olacaktır, bu nedenle nasıl yapılacağını etkileyebilecek önemli ayrıntıları kaybedersiniz. kullanıcı görüntüyü algılar.

Görüntüye sabit bir yükseklik verilen aşağıdaki örneği göz önünde bulundurun:

 .card__thumb { height: 220px; }
Sabit bir yüksekliğe sahip olduğu için görüntünün çok geniş olduğu ve kartın kabının çok geniş olduğu bir örnek
Sağda gösterilen resim çok geniş çünkü sabit bir yüksekliğe sahipken kartın kabı çok geniş. (Büyük önizleme)

Kartın kabı çok genişse, sağda gördüğümüzle sonuçlanır (çok geniş bir resim). Bunun nedeni, bir en boy oranı belirtmiyoruz.

Bunun için iki düzeltmeden yalnızca biri var. Birincisi, içsel bir oran oluşturmak için dolgu kesmesini kullanmaktır.

 .card__thumb { position: relative; padding-bottom: 75%; height: 0; } .card__thumb img { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

İkinci düzeltme, yeni aspect-ratio CSS özelliğini kullanmaktır. Bunu kullanarak şunları yapabiliriz:

 .card__thumb img { aspect-ratio: 4 / 3; }

Not : En aspect-ratio özelliği hakkında bilgi sahibi olmak isteyenler için daha önce detaylı olarak yazmıştım: “CSS'de En Boy Oranını Öğrenelim”.

Kullanım Durumları ve Örnekler

Kullanıcı Avatarları

object-fit: cover , kullanıcı avatarlarıdır. Bir avatar için izin verilen en boy oranı genellikle karedir. Görüntüyü kare bir kaba yerleştirmek görüntüyü bozabilir.

Nesneye uymayan ve nesneye sığdıran bir kullanıcı avatarı: kapak
Bir kullanıcı avatarının object-fit ve object-fit: cover ile karşılaştırılması. (Büyük önizleme)
 .c-avatar { object-fit: cover; }

Logolar Listesi

Bir işletmenin müşterilerini listelemek önemlidir. Bu amaçla genellikle logoları kullanacağız. Logoların boyutları farklı olacağından, onları deforme etmeden yeniden boyutlandırmanın bir yoluna ihtiyacımız var.

Neyse ki, object-fit: contain bunun için iyi bir çözümdür.

 .logo__img { width: 150px; height: 80px; object-fit: contain; }
Logoların listesi: Airbnb, Domino's Pizza, Apple Pay, Amazon
object-fit: contain , müşterilerin logolarını deforme etmeden yeniden boyutlandırmamıza yardımcı olabilir. (Büyük önizleme)

Makale Küçük Resmi

Bu çok yaygın bir kullanım durumudur. Bir makale küçük resminin kapsayıcısında her zaman aynı en boy oranına sahip bir görüntü olmayabilir. Bu sorun, ilk etapta içerik yönetim sistemi (CMS) tarafından düzeltilmelidir, ancak her zaman değil.

 .article__thumb { object-fit: cover; }
Makale küçük resmi
object-fit: cover biraz yardım alarak makale küçük resimlerini ayarlama. (Büyük önizleme)

kahraman arka plan

Bu kullanım durumunda, bir img öğesinin mi yoksa bir CSS arka planının mı kullanılacağına ilişkin karar aşağıdakilere bağlı olacaktır:

  • Görüntü önemli mi? CSS herhangi bir nedenle devre dışı bırakılırsa, kullanıcının resmi görmesini ister miyiz?
  • Yoksa görüntünün amacı sadece dekoratif mi?

Cevabımıza göre hangi özelliği kullanacağımıza karar verebiliriz. Görüntü önemliyse :

Bir kahraman arka planı olan kullanım çantası
Diyelim ki görsel önemli çünkü yemekle ilgili bir web sitesi. (Büyük önizleme)
 <section class="hero"> <img class="hero__thumb" src="thumb.jpg" alt="" /> </section>
 .hero { position: relative; } .hero__thumb { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

Resim dekoratif ise, background-image ile gidebiliriz:

 .hero { position: relative; background-image: linear-gradient(to top, #a34242, rgba(0,0,0,0), url("thumb.jpg"); background-repeat: no-repeat; background-size: cover; }

Bu durumda CSS daha kısadır. Resmin üzerine yerleştirilen herhangi bir metnin okunabilir ve erişilebilir olduğundan emin olun.

object-fit: contain

img arka plan rengi ekleyebileceğinizi biliyor muydunuz? Bundan object-fit: contain kullanırken de faydalanırız.

Aşağıdaki örnekte, bir resim ızgaramız var. Görüntünün ve kapsayıcının en boy oranları farklı olduğunda, arka plan rengi görünecektir.

 img { object-fit: contain; background-color: #def4fd; }
Nesne sığdırma ile bir görüntüye arka plan rengi ekleme: içerme
Bir görüntüye arka plan rengi eklemek için object-fit: contain kullanabiliriz. (Büyük önizleme)

Video Öğesi

Hiç arka plan olarak bir video ihtiyacınız oldu mu? Eğer öyleyse, muhtemelen ebeveyninin tüm genişliğini ve yüksekliğini almasını istediniz.

 .hero { position: relative; background-color: #def4fd; } .hero__video { position: aboslute; left: 0; top: 0; width: 100%; height: 100%; }
Videonun kahraman arka planını kapsamadığı bir şekil
video öğesi için varsayılan object-fit değeri contain şeklindedir. Burada görebileceğiniz gibi, video position: absolute , width: 100% ve height: 100% olmasına rağmen kahraman arka planını kapsamıyor. (Büyük önizleme)

Ebeveyninin genişliğini ve yüksekliğini tamamen kaplamasını sağlamak için, varsayılan object-fit değerini geçersiz kılmamız gerekir:

 .hero__video { /* other styles */ object-fit: cover; }
Videonun ebeveyninin tüm genişliğini ve yüksekliğini kapsadığı bir şekil.
Artık video, ebeveyninin tam genişliğini ve yüksekliğini kapsıyor. (Büyük önizleme)

Çözüm

Gördüğümüz gibi, hem object-fit hem de background-size , farklı görüntü en boy oranlarını işlemek için çok kullanışlıdır. Her görüntü için mükemmel boyutları ayarlamak üzerinde her zaman kontrolümüz olmayacak ve bu iki CSS özelliğinin öne çıktığı yer burasıdır.

Bir img öğesi ile bir CSS arka planı arasında seçim yapmanın erişilebilirlik üzerindeki etkileri hakkında dostça bir hatırlatma: Görüntü tamamen dekoratifse, o zaman bir CSS arka planı seçin. Aksi takdirde, bir img daha uygundur.

Umarım bu makaleyi faydalı bulmuşsunuzdur. Okuduğunuz için teşekkürler.