Głębokie zagłębienie się w dopasowanie obiektu i rozmiar tła w CSS
Opublikowany: 2022-03-10object-fit i background-size , kiedy możemy ich używać i dlaczego, wraz z kilkoma praktycznymi przykładami użycia i zaleceniami. Zanurzmy się. Nie zawsze jesteśmy w stanie załadować obrazy o różnych rozmiarach dla elementu HTML. Jeśli użyjemy szerokości i wysokości, które nie są proporcjonalne do proporcji obrazu, obraz może zostać skompresowany lub rozciągnięty. To nie jest dobre i można to rozwiązać za pomocą object-fit do elementu img lub za pomocą background-size .
Najpierw zdefiniujmy problem. Rozważmy następujący rysunek:

Dlaczego to się dzieje?
Obraz będzie miał proporcje, a przeglądarka wypełni pole zawierające ten obraz. Jeśli proporcje obrazu są inne niż określone dla niego szerokość i wysokość, wynikiem będzie ściśnięty lub rozciągnięty obraz.
Widzimy to na poniższym rysunku:

Rozwiązanie
Nie zawsze musimy dodawać obraz o innym rozmiarze, gdy proporcje obrazu nie są zgodne z szerokością i wysokością elementu zawierającego. Zanim zagłębimy się w rozwiązania CSS, chcę pokazać, jak robiliśmy to w aplikacjach do edycji zdjęć:

Teraz, kiedy rozumiemy, jak to działa, przyjrzyjmy się, jak to działa w przeglądarce. ( Uwaga, spoiler: to prostsze! )
object-fit CSS
Właściwość object-fit obiektu określa, w jaki sposób zawartość zastępowanego elementu, takiego jak img lub video , powinna zostać zmieniona, aby zmieściła się w jego pojemniku. Domyślną wartością object-fit jest fill , co może skutkować ściśnięciem lub rozciągnięciem obrazu.
Przyjrzyjmy się możliwym wartościom.
Możliwe wartości object-fit
object-fit: contain
W takim przypadku rozmiar obrazu zostanie zmieniony, aby pasował do proporcji jego kontenera. Jeśli proporcje obrazu nie zgadzają się z formatem kontenera, zostanie on umieszczony w formacie letterbox.

object-fit: contain , obraz będzie odpowiednio dopasowany do rozmiaru lub w formacie letterbox. (duży podgląd) object-fit: cover
W tym przypadku obraz zostanie również zmieniony, aby pasował do proporcji jego kontenera, a jeśli proporcje obrazu nie pasują do formatu kontenera, zostanie on przycięty w celu dopasowania.

object-fit: cover obraz zostanie odpowiednio przycięty w celu dopasowania lub odpowiednio zmieniony. (duży podgląd) object-fit: fill
Dzięki temu rozmiar obrazu zostanie zmieniony, aby pasował do proporcji jego kontenera, a jeśli proporcje obrazu nie pasują do formatu kontenera, zostanie ściśnięty lub rozciągnięty. Nie chcemy tego.

object-fit: fill obraz zostanie odpowiednio ściśnięty, rozciągnięty lub zmieniony. (duży podgląd) object-fit: none
W takim przypadku obraz w ogóle nie zostanie zmieniony, ani rozciągnięty, ani ściśnięty. Działa jak wartość cover , ale nie uwzględnia proporcji kontenera.

object-fit: none , rozmiar obrazu nie zostanie zmieniony, jeśli jego wymiary nie są takie same. (duży podgląd) Oprócz object-fit mamy również właściwość object-position , która odpowiada za pozycjonowanie obrazu w jego kontenerze.
Możliwe wartości dla object-position
Właściwość object-position działa podobnie do właściwości background-position w CSS:

Słowa kluczowe na top i na bottom działają również wtedy, gdy proporcje pola zawierającego są większe w pionie:

object-position: top (po lewej) i object-position: bottom (po prawej). (duży podgląd) CSS background-size
W przypadku background-size , pierwszą różnicą jest to, że mamy do czynienia z tłem, a nie elementem HTML ( img ).
Możliwe wartości dla background-size
Możliwe wartości dla background-size to auto , contain i cover .
background-size: auto
W przypadku auto obraz pozostanie w swoim domyślnym rozmiarze:

background-size: cover
W tym przypadku obraz zostanie zmieniony, aby zmieścił się w kontenerze. Jeśli proporcje nie są takie same, obraz zostanie zamaskowany w celu dopasowania.

background-size: cover , pamiętaj o uwzględnieniu proporcji obrazu. (duży podgląd) background-size: contain
W takim przypadku rozmiar obrazu zostanie zmieniony, aby zmieścił się w kontenerze. Jeśli współczynniki kształtu są wyłączone, obraz zostanie oznaczony jako letterbox, jak pokazano w następnym przykładzie:


background-size: contain zmienia rozmiar obrazu, aby zmieścił się w pojemniku. (duży podgląd) Jeśli chodzi o background-position , jest to podobne do działania object-position . Jedyna różnica polega na tym, że domyślna pozycja object-position jest inna niż background-position .
Kiedy nie używać object-fit lub rozmiaru background-size
Jeśli element lub obraz ma ustaloną wysokość i ma do niego nałożoną opcję background-size: cover lub object-fit: cover , pojawi się punkt, w którym obraz będzie zbyt szeroki, tracąc w ten sposób ważne szczegóły, które mogą wpłynąć na sposób użytkownik postrzega obraz.
Rozważmy następujący przykład, w którym obrazowi nadano stałą wysokość:
.card__thumb { height: 220px; } 
Jeśli pojemnik na kartę jest zbyt szeroki, spowoduje to wyświetlenie tego, co widzimy po prawej stronie (obraz, który jest zbyt szeroki). To dlatego, że nie określamy proporcji.
Jest tylko jedna z dwóch poprawek. Pierwszym z nich jest użycie padding hack do stworzenia wewnętrznego współczynnika.
.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; } Drugą poprawką jest użycie nowej właściwości CSS aspect-ratio . Za jego pomocą możemy wykonać następujące czynności:
.card__thumb img { aspect-ratio: 4 / 3; } Uwaga : opisałem już szczegółowo właściwość aspect-ratio na wypadek, gdybyś chciał się o niej dowiedzieć: „Poznajmy współczynnik proporcji w CSS”.
Przypadki użycia i przykłady
Awatary użytkownika
Idealny przypadek użycia dla object-fit: cover to awatary użytkowników. Współczynnik proporcji dozwolony dla awatara jest często kwadratowy. Umieszczenie obrazu w kwadratowym pojemniku może zniekształcić obraz.

object-fit do object-fit: cover . (duży podgląd) .c-avatar { object-fit: cover; }Lista logo
Lista klientów firmy jest ważna. W tym celu często będziemy używać logo. Ponieważ logotypy będą miały różne rozmiary, potrzebujemy sposobu na zmianę ich rozmiaru bez ich zniekształcania.
Na szczęście object-fit: contain to dobre rozwiązanie.
.logo__img { width: 150px; height: 80px; object-fit: contain; } 
object-fit: contain może pomóc nam w zmianie rozmiaru logo klienta bez jego zniekształcania. (duży podgląd)Miniatura artykułu
To bardzo powszechny przypadek użycia. Kontener na miniaturę artykułu może nie zawsze zawierać obraz o tych samych proporcjach. Ten problem powinien zostać rozwiązany w pierwszej kolejności przez system zarządzania treścią (CMS), ale nie zawsze tak jest.
.article__thumb { object-fit: cover; } 
object-fit: cover . (duży podgląd)Tło bohatera
W takim przypadku decyzja, czy użyć elementu img , czy tła CSS, będzie zależeć od następujących czynników:
- Czy wizerunek jest ważny? Jeśli CSS jest z jakiegoś powodu wyłączony, czy chcielibyśmy, aby użytkownik zobaczył obraz?
- A może cel obrazu jest jedynie dekoracyjny?
Na podstawie naszej odpowiedzi możemy zdecydować, której funkcji użyć. Jeśli obraz jest ważny :

<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; } Jeśli obrazek jest dekoracyjny , możemy wybrać background-image :
.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; }CSS jest w tym przypadku krótszy. Upewnij się, że każdy tekst umieszczony nad obrazem jest czytelny i dostępny.
Dodawanie tła do obrazu z object-fit: contain
Czy wiesz, że możesz dodać kolor tła do img ? Skorzystalibyśmy z tego, używając również object-fit: contain .
W poniższym przykładzie mamy siatkę obrazów. Gdy proporcje obrazu i kontenera są różne, pojawi się kolor tła.
img { object-fit: contain; background-color: #def4fd; } 
object-fit: contain , aby dodać kolor tła do obrazu. (duży podgląd)Element wideo
Czy kiedykolwiek potrzebowałeś video jako tła? Jeśli tak, to prawdopodobnie chciałeś, aby zajmował całą szerokość i wysokość swojego rodzica.
.hero { position: relative; background-color: #def4fd; } .hero__video { position: aboslute; left: 0; top: 0; width: 100%; height: 100%; } 
object-fit dla elementu video to contain . Jak widać tutaj, film nie zakrywa tła bohatera, mimo że ma position: absolute , width: 100% , height: 100% . (duży podgląd) Aby w pełni pokrył szerokość i wysokość swojego rodzica, musimy nadpisać domyślną wartość object-fit :
.hero__video { /* other styles */ object-fit: cover; } 
Wniosek
Jak widzieliśmy, zarówno object-fit , jak i background-size są bardzo przydatne do obsługi różnych współczynników proporcji obrazu. Nie zawsze będziemy mieć kontrolę nad ustawieniem idealnych wymiarów dla każdego obrazu i właśnie tam błyszczą te dwie funkcje CSS.
Przyjazne przypomnienie o implikacjach dostępności wyboru między elementem img a tłem CSS: Jeśli obraz jest czysto dekoracyjny, wybierz tło CSS. W przeciwnym img bardziej odpowiedni jest obraz.
Mam nadzieję, że ten artykuł okazał się przydatny. Dziękuję za przeczytanie.
