chevron-left chevron-right

Piotr Nalepa Frontend, architektura i AI

[CSS] Responsywne obrazki z zachowaniem proporcji

Ta wersja
blog.piotrnalepa.pl/2012/12/06/css-responsywne-obrazki-z-zachowaniem-proporcji
Opublikowano
Autor
, Staff Software Engineer
Kategoria
CSS
Uwagi
Napisz do mnie · Napisz na X

Ten wpis ma 13 lat. Od tego czasu przeglądarki i narzędzia mogły się zmienić, więc zanim użyjesz kodu, sprawdź go z aktualną dokumentacją.

W tym artykule poruszam temat związany ze skalowaniem obrazków i tła wraz ze zmianą szerokosci kontenera je zawierającego. Dzięki temu, proporcje obrazka nigdy nie będą naruszone i prezentowany obrazek będzie dobrze wyglądał.

Sekcja 1Stałe proporcje obrazków niezależnie od szerokosci

Technika polega na ustawieniu odgórnego paddingu. Padding jest ustawiany jako procent wysokosci kontenera. Można tą technikę zastosować nie tylko do obrazków, ale również do plików video dołączanych za pomocą znacznika <video>.

Załóżmy, że mamy obrazek o wymiarach 800x450 i chcielibymy jego proporcje (16:9) niezależnie od szerokosci kontenera. Aby łatwiej wyobrazić sobie strukturę HTML tego rpzykładu zerknij do kodu poniżej:

Przykład 1HTML
1
2
3
<div class="span4">
 
</div>

Jak widać, nic specjalnego. Po prostu kontener, a w nim obrazek.

Dla tak przygotowanej struktury HTML stosujemy następujący kod CSS:

Przykład 2CSS
1
2
3
4
5
6
7
8
9
.span4 {
    width: 45%;
    margin: 0 2.5%;
}
.span4 > img {
    width: 100%;
    padding-top: 56.25%;
    display: block;
}

Klasa span4 ma 45% szerokosci głównego kontenera (nie ma znaczenia ile szerokosci ma główny kontener). Natomiast, obrazek wewnątrz wybranego elementu ma ustawiony padding odgórny o wartosci 56,25% szerokosci rodzica. Tym sposobem, proporcje obrazka się ładnie skalują. Powyższą technikę można stosować również na innych elementach.
Odnosnie obrazków, to jestem swiadom, że wystarczy zastosować height: auto, aby obrazek się automatycznie skalował.

W przypadku, gdy korzystamy z innego elementu strony niż obrazek, ale używamy tła w nim, to musimy do skalowanego elementu dodać atrybut: background-size: cover. Tym sposobem tło wewnątrz elementu się skaluje wraz ze zmianą wymiarów wybranego elementu.
Niestety, ta technika nie zadziała w Internet Explorerze 8 i niżej, dlatego w ich przypadku należy zastosować inną technikę.

Najpierw musimy być pewni, że obrazek stosowany jako tło, jest conajmniej tak szeroki jak maksymalna szerokosc elementu, do którego zostanie zastosowane tło. Jeli element będzie mniejszy, to obrazek tła zostanie przycięty.

Przykład 3CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
.span4 {
    width: 45%;
    margin: 0 2.5%;
}
.span4 > div {
    width: 100%;
    padding-top: 56.25%;
    display: block;
    background-image: url(obrazek.jpg);
    background-size: cover;         /* IE8 i niżej nie obsłuży tego */
    -moz-background-size: cover;    /* ani tego */
    background-position: center;    /* dzięki temu wycentruje tło i ewentualnie tło zostanie przycięte */
}

Sekcja 2Podsumowanie

Jak widać, technika jest bardzo prosta do zastosowania i efektywna. Dzięki temu, nie ważne czy mamy galerię obrazków, czy też elementy z danymi, które muszą zachować okreslone proporcje, to będziemy pewni że proporcje zostaną zachowane.

źródło

Udostępnij
Uwagi

O autorze

Staff Software Engineer

Piszę na tym blogu od 2009 roku, a strony i aplikacje webowe tworzę zawodowo od 14 lat. Obecnie w Bishop Fox prowadzę frontend platformy Cosmos, od samego początku projektu. Wcześniej pracowałem m.in. w OLX, KUDO, Auto1 i eZ Systems. Piszę tu o tym, czego nauczyłem się w praktyce: o JavaScripcie, TypeScripcie, Reakcie, CSS-ie i architekturze frontendu. Występowałem też jako prelegent na konferencjach w Polsce i Europie. Masz pytanie albo pomysł na wpis? Daj znać!