Logo

Blog o JavaScript, jQuery, HTML5, CSS3 i 4. Porady jak pisać dobrej jakości kod, tutoriale, nowości.

Wiele teł w CSS3

  • 09.11.2011 20:59:00
  • CSS
  • 2

Gdy ostatnim razem opisywałem możliwości teł w CSS3 skupiałem się na gradientach. W tym wpisie pokażę, pewnie większości z Was znane już, ustwianie wielu teł dla konkretnego elementu. Wszystko za sprawą background-image, który w CSS3 może przyjąć kilka wartości. Na koniec, podam życiowy (z rekrutacji) przykład jaki można popełnić w CSS3.

Specyfikacja CSS3 (a właściwie nowoczesne przeglądarki) umożliwia teraz zdefiniowanie kilku teł elementowi. Tego bardzo, ale to bardzo brakowało front-end developerow. Teraz zamiast zagnieszczać elementy w sobie, można zdefiniować kilka teł i odpowiednio je wypozycjonować (tudzież ułożyć). Aby móc definiować kilka teł potrzebujemy właściwości background-image zdefiniować kilka teł. Każdą definicję tła oddzielamy przecinkiem. Ogólny wzór można zdefiniować w następujący sposób:

background-image: tło1[, tło2...];

Specyfikacja nie określa maksymalnej liczby teł jakie można przypisać jednemu elementowi. Nie znaczy to, że można pojechać po bandzie i wrzucić pierdyliard :). Z głową i potrzebami.

Definiowanie kilku teł wiąże się jeszcze z definiowaniem kilku atrybutów, które poprostu muszą być zdefiniowane. Bez nich wszystkie tła będą się powtarzać (a nie zawsze tego będziemy chcieli). Tak więc musimy pamiętać jeszcze o:

W praktyce wygląda to następująco:

#element {
    background-image: url("http://jsfiddle.net/img/logo.png"),
        url("http://ycombinator.com/images/y18.gif");
    background-position: 0 0, 100% 100%;
    background-repeat: no-repeat, no-repeat;
    background-origin: content-box, content-box;
    width: 200px;
    height: 200px;
    padding: 20px;
    border: solid 1px #000;
}

Powyższy kod:

A wygląda to tak:

Może się zdarzyć tak, że w przypadku dużej (aczkolwiek rozsądnej :P) liczby teł ominiemy lub zapomnimy o jakiejś wartości dla trzech dodatkowych właściwości. Co wtedy się stanie? Przeglądarka wejdzie w "tryb pętli" i będzie automatycznie przypisywać brakujące wartości zaczynając od początku. Spójrz na poniższy przykład:

#element {
    background-image: url("obrazek1.png"),
        url("obrazek2.gif"),
        url("obrazek3.png"),
        url("obrazek4.jpg"),
        url("obrazek5.jpg"),
        url("obrazek6.png");
    background-position: 0 0, 100% 100%;
    background-repeat: no-repeat, repeat-y;
    background-origin: content-box, border-box, padding-box;
}

Jak widać, zdefiniowaliśmy sześć teł, zaś wypozycjonowane są tylko 2 z 6 teł. Podobnie jest z właściwością określającą powtarzalność. background-origin posiada zdefiniowane tylko 3 z 6 wartości. Jedym słowem trochę brakuje. Oczywiście wszystkie tła się pojawią. Pytanie tylko w jaki sposób zostaną wyświetlone?

#element {
    background-image: url("obrazek1.png"),
        url("obrazek2.gif"),
        url("obrazek3.png"),
        url("obrazek4.jpg"),
        url("obrazek5.jpg"),
        url("obrazek6.png");
    background-position: 0 0, 100% 100%, 0 0, 100% 100%, 0 0, 100% 100%;
    background-repeat: no-repeat, repeat-y, no-repeat, repeat-y, no-repeat, repeat-y;
    background-origin: content-box, border-box, padding-box, content-box, border-box, padding-box;
}

Życiowy przykład

To teraz czas na bardziej "zaawansowany" przykład. Jest to przykład wzięty z jednego testu na front-end developera w jednej z warszawskich korko. Część testu poszła dobrze, cześć już nie. Efekt był taki, że nie przeszedłem go. To normalka, bo na rozmowach kwalifikacyjnych zawsze dowiadujemy się tego czego nie wiemy :). Tyle słowem wstępu i dygresji :).

Zadanie polegało na pocięciu projektu graficznego i zaimplementowaniu kilku bajerów. To na czym się skupię, to pewien element, który idealnie pasuje do tego wpisu. Tym elementem jest tło. Dość specyficzne tło :).

Chodzi o to tło. Normalnie można wyciąć paseczek o szerokości 2 pikseli i odpowiedniej wysokości i załatwione. A może by to zrobić z wykorzystaniem CSS3? Da się? Jasne, że się da.

Oczywiście wykorzystać tutaj najlepiej kilka teł. Jedno gradientowe, drugie jako obrazek.

background: 
   url("bg.gif"),
   linear-gradient(
   	#fbfbfd 0px, 
   	#8f8db9 158px,  
   	#cd007b 158px,
   	#cd007b 174px,
   	#0098aa 174px,
   	#0098aa 182px,
   	#eb690b 182px, 
   	#eb690b 216px, 
   	#8b2346 216px, 
   	#8b2346 224px, 
   	#90c797 224px, 
   	#90c797 252px, 
   	#f6a400 252px, 
   	#f6a400 266px, 
   	#003882 266px,
   	#003882 285px
   );

Efektem tego kodu będzie tło które zostało pokazane jako wzór. Dla jednych to pewnie przerost formy nad treścią, ale skoro CSS3 daje takie możliwości, to dlaczego by z nich nie korzystać? Na pewno kilka osób może zadać pytanie dlaczego różne kolory zaczynają i kończą się od tego samego miejsca? Odpowiedź jest prosta. Chodzi o to, aby kolory nie przechodziły w siebie w sposób płynny (chodzi o odcienie). Czysty "gradient" (bez nałożenia tła graficznego) wygląda tak:

Całkiem fajnie to wygląda co nie? :) Niech teraz mi ktoś powie, że CSS3 nie ma potencjału.

Autor wpisu

Piotr cichosz (shpyo) — Front-end developer Twórca kilku serwisów internetowych oraz autor kilku blogów. Pasjonat nowych, otwartych technologii.

Komentarze

Gavatar olo

04.07.2012 olo

css3 nie ma potencjału :D

Gavatar Gregor

07.04.2015 Gregor

A czy przy tej metodzie można zrobić tło menu:
url góra.png
url środek.png (środek ma być repeat-y od "góry" do "dół", bo jak daje repeat-y to zasłania wszystkie elementy)
url dół.png

Dodaj komentarz