chevron-left chevron-right

Piotr Nalepa Frontend, architecture and AI

[CSS] Jak utworzyć gradienty w CSS? – Prezentacja obecnych możliwości przeglądarek.

This version
blog.piotrnalepa.pl/2011/05/20/css-jak-utworzyc-gradienty-w-css-prezentacja-obecnych-mozliwosci-przegladarek
Published
Author
, Staff Software Engineer
Category
CSS
Feedback
Write to me · Post on X

This post is 15 years old. Browsers and tools may have changed since then, so check the code against current documentation before you use it.

Do tej pory, aby utworzyć elementy zawierające gradient, należało zaprojektować je w programie graficznym, a następnie stamtąd je wyciąć i za pomocą standardowego atrybutu CSS - background, wstawić ten element w kod strony. To miało swoje zalety jak i wady.
Do zalet można zaliczyć fakt, że element zawsze będzie wyglądał tak samo w każdej przeglądarce, bo jest to plik graficzny. Natomiast minusem takiego rozwiązania jest waga takiego pliku, bo jak wiadomo w dzisiejszych czasach wszystkim (a już najbardziej Google) zależy na jak najszybszym ładowaniu się strony WWW. Lecz od jakiegoś czasu można zmienić nieco podejście. Wraz z wprowadzeniem nowej wersji CSS3, dostarczono nam mnóstwo możliwości o których można było tylko pomarzyć. Między innymi obsługę gradientów z poziomu CSS.

Section 1Idea gradientu w CSS

Gradienty pozwalają uzyskać efekt przejścia z jednego koloru w drugi w okreslonym elemencie strony, np. przycisku czy jako tło menu. Mamy dostępne dwa warianty gradientu:

  • liniowy (linear)
  • kolisty (circular)

Warianty te w większości przypadków pozwolą na uzyskanie wymaganego efektu bez użycia programów graficznych.

Section 2Gradient liniowy w CSS

Jak to zwykle bywa z nowymi rzeczami wprowadzanymi przez CSS3 nie wszystko działa idelanie w każdej przeglądarce, dlatego część z nich ma inną implementację niż inne.

Example 1CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#gradient1  {
    /* fallback, czyli wersja dla starych przeglądarek */
    background-color:#063053;
    /* chrome 2+, safari 4+; wielokrotne zatrzymania kolorów */
    background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0.32,#063053),color-stop(0.66,#395873), color-stop(0.83,#5c7c99));
    /* chrome 10+, safari 5.1+ */
    background-image:-webkit-linear-gradient(#063053,#395873,#5c7c99);
    /* firefox; wielokrotne zatrzymania kolorów */
    background-image:-moz-linear-gradient(top,#063053,#395873,#5c7c99);
    /* ie 6+ */
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#063053', endColorstr='#395873');
    /* ie8 + */
    -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#063053', endColorstr='#395873')";
    /* ie10 */
    background-image: -ms-linear-gradient(#063053,#395873,#5c7c99);
    /* opera 11.1 */
    background-image: -o-linear-gradient(#063053,#395873,#5c7c99);
    /* wersja standardowa */
    background-image: linear-gradient(#063053,#395873,#5c7c99);
}

Jak widać, różnorodność wersji składniowych może przyprawić o ból głowy. Dlatego mam nadzieję, że wkrótce jako całkowity standard wejdzie wersja ostatnia z powyższego przykładu.

W momencie, gdy zależy nam na gradiencie liniowym ukośnym, możemy wykorzystać nastepującą składnię:

Example 2CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#gradient2  {
    /* fallback, czyli wersja dla starych przeglądarek */
    background-color:#063053;
    /* chrome 2+, safari 4+; wielokrotne zatrzymania kolorów */
    background-image:-webkit-gradient(linear,left bottom,right top,color-stop(0.32,#063053),color-stop(0.66,#395873), color-stop(0.83,#5c7c99));
    /* chrome 10+, safari 5.1+ */
    background-image:-webkit-linear-gradient(45deg,#063053,#395873,#5c7c99);
    /* firefox; wielokrotne zatrzymania kolorów */
    background-image:-moz-linear-gradient(45deg,#063053,#395873,#5c7c99);
    /* ie10 */
    background-image: -ms-linear-gradient(45deg,#063053 0%,#395873 100%);
    /* opera 11.1 */
    background-image: -o-linear-gradient(45deg,#063053,#395873);
    /* The "standard" */
    background-image: linear-gradient(45deg,#063053,#395873);
}

Jeśli chodzi o odpowiednie wsparcie gradientów przez Internet Explorera, to zaleca się stosować "komentarze warunkowe", aby odpowiednie składnie Internet Explorera się nie kłóciły ze sobą.

Example 3HTML
1
2
3
4
5
6
7
8
<!--[if lt IE 10]>
<style>
.gradientElement {
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#063053', endColorstr='#395873');
    -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#063053', endColorstr='#395873')";
}
</style>
<![endif]-->

Section 3Gradienty kołowe w CSS

Gradienty kołowe w porównaniu do liniowych różnią się trochę składnią. Należy pamiętać o tym, że taki gradient zawsze się zaczyna od środka. Jeśli chodzi o wsparcie dla gradientów kołowych przez Internet Explorera, to mam smutną wiadomość i dość przewidywalną - IE nie wspiera gradientów kołowych ... na razie..
W przeglądarkach które korzystają z silnika WebKit (Google Chrome i Safari) występuje problem z nadmiernie rozbudowaną składnią dla tego typu gradientu, który wygląda tak:

Example 4CSS
1
2
3
4
/* podstawa */
background-image: -webkit-gradient(radial, center center, 0, center center, 220, from(orange), to(red));
/* zatrzymania kolorów */
background-image: -webkit-gradient(radial, center center, 0, center center, 220, color-stop(0.20,red),color-stop(0.40,green), color-stop(0.6,blue), color-stop(0.8,purple), color-stop(1,orange));

Prawda, że strasznie? Jak tak uważam. Jedynym pocieszeniem jest to, że planowana jest zmiana składni na prostszą w przyszłości.
Bazowa wersja gradientu kołowego dla większości przeglądarek wygląda następująco:

Example 5CSS
1
2
3
4
5
6
#gradient3 {
    background-image: -moz-radial-gradient(orange, red);
    background-image: -webkit-gradient(radial, center center, 0, center center, 220, from(orange), to(red)); /* stara składnia */
    background-image: -webkit-radial-gradient(orange, red); /* nowa składnia */
    background-image: radial-gradient(orange, red);
}

Wersja nieco bardziej rozbudowana wygląda następująco:

Example 6CSS
#gradient4 {
    background-image: -moz-radial-gradient(45px 45px 45deg, circle cover, yellow 0%, orange 100%, red 95%);
    background-image: -webkit-radial-gradient(45px 45px, circle cover, yellow, orange);
    background-image: radial-gradient(45px 45px 45deg, circle cover, yellow 0%, orange 100%, red 95%);
}

Section 4Kilka porad odnośnie gradientów

Jak widać, stosowanie gradientów może być problematyczne dla początkujących, ale na dłuższą metę przydatne. Oto kilka porad odnośnie gradientów:

  • jeśli chcesz wykorzystać przezroczystość, to jako oznaczenia koloru zamiast trybu HEX (#000000) wykorzystaj tryb rgba(255.255.255.0)
  • pamiętaj o używaniu tzw. fallbacków, czyli ustawień koloru dla starszych wersji przeglądarek
  • dla przeglądarek typu Firefox czy Chrome można użyć dodatkowych właściwości repeating-radial-gradient oraz repetaing-linear-gradient.

Demo z tego artykułu można znaleźć w tym miejscu: gradienty CSS (będzie wkrótce). Artykuł zainspirowany tym artykułem.
A przy okazji tego artykułu korzystałem z nowego edytora graficznego dostępnego pod tym adresem.

Share
Feedback

About the author

Staff Software Engineer

I've been writing this blog since 2009 and building for the web professionally for 14 years. Today I lead the frontend of the Cosmos platform at Bishop Fox, where I've been since day one of the project. Before that I worked at OLX, KUDO, Auto1 and eZ Systems. Here I write about what I've learned in practice: JavaScript, TypeScript, React, CSS and frontend architecture. I've also spoken at conferences across Poland and Europe. Got a question or an idea for a post? Let me know!