9.5. Rozmiar tła (background-size
)
Wprowadzenie: Skalowanie obrazu tła
Domyślnie obraz tła (background-image
) jest wyświetlany w swoich oryginalnych wymiarach. Jeśli obraz jest mniejszy niż element, będzie powtarzany (chyba że zmieniono background-repeat
). Jeśli jest większy, zostanie obcięty do granic elementu.
Właściwość background-size
pozwala **kontrolować rozmiar obrazu tła**, umożliwiając jego skalowanie (powiększanie lub zmniejszanie), aby lepiej dopasować go do elementu.
Wartości background-size
Właściwość background-size
może przyjmować różne wartości:
Słowa kluczowe
auto
: (Domyślne) Obraz jest wyświetlany w swoich oryginalnych wymiarach. Jeśli podano dwie wartościauto auto
, obie osie zachowują oryginalny rozmiar. Jeśli podano jedną wartośćauto
, a drugą konkretną (np.background-size: 50px auto;
), druga oś jest skalowana proporcjonalnie, aby zachować oryginalne proporcje obrazu.cover
: Skaluje obraz tła (zachowując proporcje) tak, aby **całkowicie pokrył** obszar tła elementu. Jeśli proporcje obrazu nie pasują do proporcji elementu, część obrazu zostanie **obcięta**. Jest to często używane do tworzenia pełnoekranowych teł lub teł dla kontenerów, które mają zawsze być w pełni zakryte obrazem.contain
: Skaluje obraz tła (zachowując proporcje) tak, aby **cały zmieścił się** wewnątrz obszaru tła elementu. Jeśli proporcje obrazu nie pasują do proporcji elementu, pozostaną puste przestrzenie po bokach lub na górze/dole elementu (w tych miejscach widoczny będziebackground-color
).
<div class="box size-example cover-example">cover</div>
<div class="box size-example contain-example">contain</div>
<div class="box size-example auto-example">auto (domyślne)</div>
.size-example {
width: 200px;
height: 150px;
border: 1px solid black;
margin-bottom: 10px;
background-image: url('obraz-szeroki.jpg'); /* Zakładamy obraz szerszy niż wyższy */
background-repeat: no-repeat; /* Ważne dla demonstracji rozmiaru */
background-position: center; /* Wycentrujmy dla lepszego efektu */
background-color: lightgray;
color: white; text-shadow: 1px 1px 1px black; font-size: 1.5em; text-align: center; line-height: 150px;
}
.cover-example { background-size: cover; }
.contain-example { background-size: contain; }
.auto-example { background-size: auto; /* Obraz w oryginalnym rozmiarze, prawdopodobnie obcięty */ }
W przykładzie cover
zapewni, że całe pudełko będzie zakryte obrazem (nawet kosztem obcięcia jego boków). contain
zapewni, że cały obraz będzie widoczny (nawet jeśli powstaną puste paski na górze/dole). auto
pokaże obraz w jego oryginalnym rozmiarze, wycentrowany, prawdopodobnie obcięty przez granice pudełka.
Wartości długości (px, em, %)
Można podać jedną lub dwie wartości, aby określić konkretny rozmiar tła:
- Jedna wartość: (np.
background-size: 200px;
lubbackground-size: 50%;
) Określa **szerokość** obrazu tła. Wysokość jest ustawiana naauto
, co oznacza, że jest skalowana proporcjonalnie, aby zachować oryginalne proporcje obrazu. - Dwie wartości: (np.
background-size: 100px 50px;
lubbackground-size: 80% 60%;
) Pierwsza wartość określa **szerokość**, a druga **wysokość** obrazu tła. Użycie dwóch konkretnych wartości może spowodować zniekształcenie (rozciągnięcie lub ściśnięcie) obrazu, jeśli podane proporcje różnią się od oryginalnych proporcji obrazu. Wartości procentowe odnoszą się do wymiarów obszaru pozycjonowania tła (domyślnie padding-box).
.size-pixels {
/* Szerokość 150px, wysokość auto (proporcjonalnie) */
background-size: 150px;
}
.size-percent {
/* Szerokość 100% kontenera, wysokość auto (proporcjonalnie) */
background-size: 100%;
}
.size-fixed-distorted {
/* Szerokość 100px, wysokość 80px - może zniekształcić obraz */
background-size: 100px 80px;
}
.size-percent-both {
/* Szerokość 50% kontenera, wysokość 75% kontenera - może zniekształcić */
background-size: 50% 75%;
}
Rozmiar wielu obrazów tła
Podobnie jak w przypadku innych właściwości tła, jeśli używasz wielu obrazów, możesz podać wiele wartości dla background-size
, oddzielonych przecinkami. Każda wartość odpowiada obrazowi na tej samej pozycji w background-image
.
.multi-bg-sized {
background-image: url("logo.png"), url("pattern.png");
background-repeat: no-repeat, repeat;
background-position: center, top left;
background-size: 50px, auto; /* logo ma 50px szerokości (wys. auto), wzór ma rozmiar auto (oryginalny) */
/* Można też użyć cover/contain: */
/* background-size: contain, cover; */
border: 1px solid brown;
height: 200px;
}
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Ustaw duży obraz jako tło elementu div
o stałych wymiarach (mniejszych niż obraz). Użyj background-size: cover;
, aby obraz wypełnił cały element, nawet jeśli zostanie częściowo obcięty. Wycentruj obraz za pomocą background-position: center;
.
Rozwiązanie:
Zakładamy duży obraz `hero.jpg`.
HTML:
<div class="hero-box"></div>
CSS:
.hero-box {
width: 400px;
height: 250px;
border: 1px solid darkblue;
background-image: url('hero.jpg');
background-repeat: no-repeat;
background-position: center;
background-size: cover; /* Kluczowa właściwość */
background-color: lightgray; /* Fallback */
}
Efekt: Pudełko będzie w całości wypełnione fragmentem obrazu hero.jpg
. Obraz zostanie przeskalowany tak, aby pokryć cały obszar, a jego środek będzie wyrównany ze środkiem pudełka.
Zadanie 2 (do samodzielnego wykonania)
Zmodyfikuj Zadanie 1, zmieniając background-size: cover;
na background-size: contain;
. Zaobserwuj, jak teraz cały obraz jest widoczny, ale mogą pojawić się puste przestrzenie.
Zadanie 3 (do samodzielnego wykonania)
Ustaw obrazek jako tło elementu div
. Użyj background-size
z jedną wartością procentową (np. background-size: 50%;
), aby ustawić szerokość tła na 50% szerokości elementu, zachowując proporcje obrazu.
FAQ - Najczęściej zadawane pytania
Jaka jest różnica między cover
a background-size: 100% 100%;
?
cover
zawsze zachowuje proporcje obrazu, skalując go tak, aby pokrył cały element (co może prowadzić do obcięcia). background-size: 100% 100%;
ustawia szerokość obrazu na 100% szerokości elementu i wysokość obrazu na 100% wysokości elementu, co **zniekształci** obraz, jeśli jego proporcje nie pasują do proporcji elementu.
Do czego odnoszą się wartości procentowe w background-size
?
Wartości procentowe odnoszą się do wymiarów **obszaru pozycjonowania tła**, który domyślnie jest określony przez background-origin
(zazwyczaj padding-box). Czyli background-size: 50% 25%;
ustawi szerokość obrazu na 50% szerokości padding-box i wysokość na 25% wysokości padding-box.
Czy background-size
działa z powtarzającym się tłem?
Tak. Jeśli ustawisz background-size
i jednocześnie background-repeat
na repeat
(lub space
/round
), powtarzane będą obrazy o zmienionym rozmiarze.
Jak ustawić tło na całą szerokość i wysokość strony (pełnoekranowe)?
Najczęściej stosuje się to do elementu body
lub html
(lub dedykowanego kontenera):
body {
min-height: 100vh; /* Upewnij się, że body ma co najmniej wysokość viewportu */
background-image: url('fullscreen-bg.jpg');
background-repeat: no-repeat;
background-position: center;
background-size: cover;
background-attachment: fixed; /* Opcjonalnie, aby tło było stałe podczas przewijania */
}