10 właściwości CSS3 które musisz znać
() translation by (you can also view the original English article)
Przerobiliśmy już 30 selektorów, które musisz zapamiętać; ale co z nowymi właściwościami CSS3? Pomimo, że większość nadal wymaga specjalnych przedrostków, już dzisiaj możesz korzystać z nich w swoich projektach. A właściwie, zachęcam Cię do tego!
Kluczem do tego jest zdefiniowanie na początku projektu, czy zgadzasz się na trochę inne przdstawienie strony pomiędzy przeglądarkami. Czy zgadzasz się by, np IE wyświetlało ostre rogi, zamiast ładnych zaokrąglonych? To Twój wybór. Jednak pamiętaj, że strony nie muszą wyglądać identycznie we wszystkich przeglądarkach. W ramach podsumowania tego artykułu, popracujemy nad jednym projektem.
1. border-radius

Najbardziej popularna własność CSS3, border-radius
była niejako wizytówką CSS3. Podczas gdy designerzy byli przerażeni, że layout może wyglądać inaczej w różnych przeglądarkach, mały kroczek, jakim były zaokrąglone narożniki, był prostym sposobem na zwabienie ich!
Ironią jest to, że zupełnie normalne wydaje nam się tworzenie odmiennego wyglądu dla urządzeń mobilnych. Natomiast dziwi fakt, że niektórzy nie stosują się do tego przy urządzeniach desktopowych.
1 |
-webkit-border-radius: 4px; |
2 |
-moz-border-radius: 4px; |
3 |
border-radius: 4px; |
Zapamiętaj, że Safari i IE9 wdrożyły oficjalną składnię `border-radius`.
Okręgi
Niektórzy z Was mogą być nieświadomi tego, że korzystając z tej właściwości możemy tworzyć okręgi.
1 |
-moz-border-radius: 50px; |
2 |
-webkit-border-radius: 50px; |
3 |
border-radius: 50px; |

...I jeśli chcemy się trochę zabawić, możemy wykorzystać Flexible Box Model (szczegóły w #8) by wycentować tekst znajdujący się w okręgu poziomo jak i pionowo. Wymaga to trochę kodu, ale tylko z powodu potrzeby wypisywania przedrostków.
1 |
display: -moz-box; |
2 |
display: -webkit-box; |
3 |
display: box; |
4 |
|
5 |
-moz-box-orient: horizontal; /* wartość domyślna, więc prawdę mówiąc, tutaj zbędna */ |
6 |
-webkit-box-orient: horizontal; |
7 |
box-orient: horizontal; |
8 |
|
9 |
-moz-box-pack: center; |
10 |
-moz-box-align: center; |
11 |
|
12 |
-webkit-box-pack: center; |
13 |
-webkit-box-align: center; |
14 |
|
15 |
box-pack: center; |
16 |
box-align: center; |
2. box-shadow



Następnie mamy wszechobecny box-shadow
, który pozwala na nadanie głębi wybranemu elementowi. Tylko nie przesadzaj z wartościami!
1 |
-webkit-box-shadow: 1px 1px 3px #292929; |
2 |
-moz-box-shadow: 1px 1px 3px #292929; |
3 |
box-shadow: 1px 1px 3px #292929; |
box-shadow
przyjmuje cztery parametry:
- x-offset (oś x)
- y-offset (oś y)
- blur (rozmycie)
- color of shadow (kolor cienia)
Wielu nie zdaje sobie sprawy, że możemy nadać elementowi kilka właściwości box-shadows
jednocześnie. Może to prowadzić do naprawdę interesujących efektów. W poniższym screenshocie użyłem niebieskiego i zielonego cienia by je wyróżnić.



1 |
-webkit-box-shadow: 1px 1px 3px green, -1px -1px blue; |
2 |
-moz-box-shadow: 1px 1px 3px green,-1px -1px blue; |
3 |
box-shadow: 1px 1px 3px green, -1px -1px blue; |
Mądre Cienie
Używając cieni z pseudo-klasami ::before
i ::after
, możemy stworzyć bardzo ciekawe efekty. Oto jedna na początek:
HTML
1 |
<div class="box"> |
2 |
<img src="tuts.jpg" alt="Tuts" /> |
3 |
</div>
|
CSS
1 |
.box:after { |
2 |
content: ''; |
3 |
position: absolute; |
4 |
|
5 |
z-index: -1; /* schowaj cień za obrazek */ |
6 |
|
7 |
/* The Shadow */
|
8 |
-webkit-box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); |
9 |
-moz-box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); |
10 |
-box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); |
11 |
|
12 |
width: 70%; |
13 |
left: 15%; /* połowa z pozostałych 30% (sprawdź szerokość powyżej) */ |
14 |
|
15 |
height: 100px; |
16 |
bottom: 0; |
17 |
}
|



Chcesz więcej fajnych efektów? Zobacz ten tutorial na Nettuts+.
3. text-shadow



text-shadow
jest jedną z kilku właściwości CSS3, w której możemy ominąć przedrostki. Musi być nadana tekstowi i podobnie jak box-shadow
, zawiera cztery parametry:
- x-offset (oś x)
- y-offset (oś y)
- blur (rozmycie)
- color of shadow (kolor cienia)
1 |
h1 { |
2 |
text-shadow: 0 1px 0 white; |
3 |
color: #292929; |
4 |
}
|
Obrys Tekstu
Podobnie jak w box-shadow
, możemy nadawać elementowi kilka cieni, oddzielając je przecinkami. Np. powiedźmy, że chcesz stworzyć obrys dla tekstu. Co prawda webkit
oferuje metodę stroke
możemy jednak osiągnąć ten efekt na innych przeglądarkach stosująć poniższą metodę (która prawdę mówiąc nie jest taka ładna):
1 |
body { background: white; } |
2 |
|
3 |
h1 { |
4 |
text-shadow: 0 1px 0 black, 0 -1px 0 black, 1px 0 0 black, -1px 0 0 black; |
5 |
color: white; |
6 |
}
|



4. Text-Stroke



Bądź ostrożny z tą metodą. Przez ostatnie kilka lat tylko webkit
ją wspierał (Safari, Chrome, iPhone).W rzeczywistości, chociaż mogę się mylić, 'text-stroke' nie jest jeszcze częścią specyfikacji CSS3.W tym wypadku, z białym tekstem, Firefox, wyświetli białą stronę. Możesz wykorzystać wykrywanie JavaScript do obejścia tego, albo upewnić się że kolor tekstu jest różny od koloru tła.
1 |
h1 { |
2 |
-webkit-text-stroke: 3px black; |
3 |
color: white; |
4 |
}
|
Wykrywanie cechy
Jak możemy zapewnić jeden styl dla powiedźmy Firefoxa, a inny dla Safari i Chroma? Jednym rozwiązaniem jest wykrywacz.
Z wykrywaczem, możemy użyć JavaScript do sprawdzenia czy dana właściwość jest dostępna. Jeśli nie jest, stosujemy kod awaryjny.
Wróćmy do problemu z text-stroke
. Ustawmy kolor awaryjny black
dla wyszukiwarek które nie wspierają tej właściwości (aktualnie wszystko oprócz webkit
).
1 |
var h1 = document.createElement('h1'); |
2 |
if ( !( 'webkitTextStroke' in h1.style ) ) { |
3 |
var heading = document.getElementsByTagName('h1')[0]; |
4 |
heading.style.color = 'black'; |
5 |
} |
Na początku tworzymy element h1
. Później sprawdzamy czy -webkit-text-stroke
jest dostępne dla tego elementu, poprzez atrybut style
. Jeśli nie, to chwytamy nagłówek Hello Readers
i zmieniamy jego color z białego
na czarny
.
Zwróć uwagę, że powyższe przykłady są bardzo ogólne. Jeśli chcesz zamienić kilka
h1
na stronie, muszisz skorzystać z pętliwhile
by przefiltrować każdy nagłówek i odpowiednio je zaktualizować.Testujemy tylko dla
webkit
, a możliwe jest, że pozostałe przeglądarki w końcu zaczną wspieraćtext-stroke
. Miej to na uwadze.
Jeśli chcesz bardziej pełny skrypt wykrywający cechy, zajrzyj na Modernizr.
5. Wielokrotne tła



Właściwość background
została wprowadzona, by umożliwić wstawianie wielokrotnego tła w CSS3.
Stwórzmy przykład, który pokaże jak to działa. Z powodu braku odpowiednich obrazków w pobliżu, skorzystam z dwóch pochodzących z tutoriala, by ustawić nasze tło. Oczywiście, w swoim projekcie możesz wykorzystać tekstury albo nawet gradient dla tła.
1 |
.box { |
2 |
background: url(image/path.jpg) 0 0 no-repeat, |
3 |
url(image2/path.jpg) 100% 0 no-repeat; |
4 |
}
|
Powyżej, korzystając z przecinka jako odstępu, wstawiamy dwa oddzielne obrazki tła. Zwróć uwagę, że pierwszy z nich ustawiony jest w górnym lewym rogu (0 0
), a drugi w prawym górnym(100% 0
).
Upewnij się że zapewniasz wyjście awaryjne dla przeglądarek, które nie obsługują wsparcia dla tej właściwości. Ominą one tę właściwość i zostawią puste tło.
Rekompensata dla starszch przeglądarek
By ustawić pojedyncze tło z dla starszych przeglądarek jak np. IE7, zadeklaruj background
dwa razy: pierwszy dla starych przeglądarek i drugi jako nadpisanie. Ewentualnie możesz skorzystać z Modernizr.
1 |
.box { |
2 |
/* awaryjnie */
|
3 |
background: url(image/path.jpg) no-repeat; |
4 |
|
5 |
/* nowoczesne przeglądarki */
|
6 |
background: url(image/path.jpg) 0 0 no-repeat, |
7 |
url(image2/path.jpg) 100% 0 no-repeat; |
8 |
}
|
6. background-size
Do niedawna byliśmy zmuszeni używać podstępów by zmienić rozmiar naszego obrazka w tle.
1 |
background: url(path/to/image.jpg) no-repeat; |
2 |
background-size: 100% 100%; |
Kod powyżej zmusi obrazek w tle do wypełnienia całej przestrzeni. Np. jeśli byśmy chcieli, by obrazek zajął cały element body
niezależnie od szerokości okna przeglądarki?
1 |
body, html { height: 100%; } |
2 |
|
3 |
body { |
4 |
background: url(path/to/image.jpg) no-repeat; |
5 |
background-size: 100% 100%; |
6 |
}
|
To wszystko co musimy zrobić. background-size
przyjmuje dwa parametry: odpowiednio szerokości x
i y
.
Podczas gdy ostatnie wersje Chrome i Safari wspierają background-size
, nadal musimy korzystać z przedrostków w przypadku starszych wyszukiwarek.
1 |
body { |
2 |
background: url(path/to/image.jpg) no-repeat; |
3 |
-moz-background-size: 100% 100%; |
4 |
-o-background-size: 100% 100%; |
5 |
-webkit-background-size: 100% 100%; |
6 |
background-size: 100% 100%; |
7 |
}
|
7. text-overflow
Rozwijana przez Internet Explorer właściwość text-overflow
przyjmuje dwie wartości:
- clip (ucięcie)
- ellipsis (wielokropek)
Ta właściwość może być wykorzystana do wycięcia tekstu który wystaje poza pojemnik, jednocześnie dostarczając informacji użytkownikowi, jak wielokropek.



Czy wiesz, że Internet Explorer zapewnia wsparcie dla tej właściwości od wersji IE6? To oni ją stworzyli!
1 |
.box { |
2 |
-o-text-overflow: ellipsis; |
3 |
text-overflow:ellipsis; |
4 |
|
5 |
overflow:hidden; |
6 |
white-space:nowrap; |
7 |
|
8 |
border: 1px solid black; |
9 |
width: 400px; |
10 |
padding: 20px; |
11 |
|
12 |
cursor: pointer; |
13 |
}
|
W tym momencie, możesz rozważyć pokazanie całej zawartości kiedy użytkownik najedzie myszką na pojemnik.
1 |
#box:hover { |
2 |
white-space: normal; |
3 |
color: rgba(0,0,0,1); |
4 |
background: #e3e3e3; |
5 |
border: 1px solid #666; |
6 |
}
|
Trochę dziwne jest, że nie ma (chyba, że się mylę) sposobu na zresetowanie text-overflow
lub jej wyłączenie. By to "zasymulować", w :hover
, ustawiamy white-space
z powrotem na normal
. To działa, poniewać funkcjonalność text-overflow
jest od tego zależna.
Czy wiesz, że: Możesz samemu określić ciąg znaków, które będą użyte jako trzykropek. Robiąc to wyświetli się ciąg znaków reprezentujący przycięty tekst.
8. Flexible Box Model
Flexible Box Model, w końcu pozwala nam pozbyć się tych wszystkich float
. Pomimo, że zrozumienie tej właściwości wymaga trochę pracy, to gdy już załapiesz, ma sens.
Zróbmy szybkie demo i stwórzmy dwukolumnowy layout.
1 |
<div id="container"> |
2 |
|
3 |
<div id="main"> Główna zawartość </div> |
4 |
<aside> Zawartość z boku </aside> |
5 |
|
6 |
</div>
|
Teraz CSS: na początku musimy określić container
, który będzie traktowany jako box
. Dodatkowo okręślę jakieś generalne rozmiary, skoro nie mamy żadnej zawartości.
1 |
#container { |
2 |
width: 960px; |
3 |
height: 500px; /* na potrzeby demo */ |
4 |
|
5 |
background: #e3e3e3; |
6 |
margin: auto; |
7 |
|
8 |
display: -moz-box; |
9 |
display: -webkit-box; |
10 |
display: box; |
Następnie ustawmy różne kolory tła dla #main
div
, i aside
.
1 |
#main { |
2 |
background: yellow; |
3 |
}
|
4 |
|
5 |
aside { |
6 |
background: red; |
7 |
}
|
Jak narazie nie ma tego wiele.



Jedna rzecz warta odnotowania to fakt, że kiedy ustawiamy
display: box
elementy dzieci zabiorą całą szerokość; taka jest domyślna wartośćbox-align
stretch.
Zobacz co się stanie gdy dokładnie określimy szerokość zawartość #main
.
1 |
#main { |
2 |
background: yellow; |
3 |
width: 800px; |
4 |
}
|



Już trochę lepiej, ale nadal mamy problem z aside
, które nie zabiera całej dostępnej przestrzeni. Możemy to zmienić korzystając z nowej właściwości box-flex
.
box-flex
nakazuje elementowi zabranie całej dostępnej przestrzeni.
1 |
aside { |
2 |
display: block; |
3 |
background: red; |
4 |
|
5 |
/* zabiera całą dostępną przestrzeń */
|
6 |
-moz-box-flex: 1; |
7 |
-webkit-box-flex: 1; |
8 |
box-flex: 1; |
9 |
}
|
Dzięki temu, niezależnie od szerokości #main
, aside
zajmie całą dostępną szerokość. Nie musisz już się martwić problemami z float
, jak opadanie elementów poniżej głównej zawartości.



Jedynie zaczęliśmy temat. Zobacz świetny artykuł Paula Irisha, który to rozwija. Bądź ostrożny używając tej metody ponieważ nie jest w pełni wspierana w starszych przeglądarkach. W takim przypadku możesz skorzystać z wykrywacza lub Modernizr by wykryć i zapewnić konieczne wyjścia awaryjne.
9. Resize
Dostępna wyłącznie w Firefox 4 oraz Safari 3, resize
-- część CSS3 UI -- pozwala określić wymiary textarea
.
1 |
<textarea name="elem" id="elem" rows="5" cols="50"></textarea> |
Zwróć uwagę, że domyślnie przeglądarki
webkit
oraz Firefox 4 pozwalają ustawić rozmiartextareas
w pionie jak i poziomie.
1 |
textarea { |
2 |
-moz-resize: vertical; |
3 |
-webkit-resize: vertical; |
4 |
resize: vertical; |
5 |
}
|
Możliwe wartości
- both: Zmiana w pionie i poziomie
- horizontal: Zmiana w poziomie
- vertical:Zmiana w pionie
- none: Wyłącza resize



10. Transition
Prawdopodobnie najbardziej odjechana właściwośc CSS3, pozwalająca dodawać animacje do elementów, bez używania JavaScript.
Mimo, że IE9 nadal nieobsługuje
transition
, to nie oznacz, że nie powinieneś tego używać.
Skopiujmy efekt, gdzie po najechaniu na link w pasku bocznym tekst przesunie się lekko w prawo.
HTML
1 |
<ul>
|
2 |
<li>
|
3 |
<a href="#"> Najedź na mnie </a> |
4 |
</li>
|
5 |
<li>
|
6 |
<a href="#"> Najedź na mnie </a> |
7 |
</li>
|
8 |
<li>
|
9 |
<a href="#"> Najedź na mnie </a> |
10 |
</li>
|
11 |
<li>
|
12 |
<a href="#"> Najedź na mnie </a> |
13 |
</li>
|
14 |
</ul>
|
CSS
1 |
ul a { |
2 |
-webkit-transition: padding .4s; |
3 |
-moz-transition: padding .4s; |
4 |
-o-transition: padding .4s; |
5 |
transition: padding .4s; |
6 |
}
|
7 |
|
8 |
a:hover { |
9 |
padding-left: 6px; |
10 |
}
|
transition
przyjmuje trzy parametry:
- Właściwość do zmiany. (Ustaw wartość na
all
jeśli to konieczne) - Czas
- Tempo
Powodem, dla którego nie nadajemy
transition
bezpośrednio dohover
jest to, że gdybyśmy tak zrobili, animacja miałaby efekt, tylko podczas najechania kursorem. Natomiast podczas opuszczania pola element wróciłby do swojego pierwotnego stanu, bez animacji.
Ponieważ tylko ulepszyliśmy kod, nie wyrządziliśmy żadnej szkody dla starszych przeglądarek
Końcowy projekt
Weźmy większość technik, których się nauczyliśmy i stwórzmy odjechany efekt. Przejrzyj najpierw efekt końcowy (najlepiej w przeglądarce Webkit).
Krok 1. Tagi
W naszym kontenerze .box
dodajmy dwa div
y: jeden na przód i jeden na tył.
1 |
<body>
|
2 |
|
3 |
<div class="box"> |
4 |
<div>Hello</div> |
5 |
<div> World </div> |
6 |
</div>
|
7 |
|
8 |
</body>
|
Krok 2. Centrowanie w poziomie i pionie
Następnie, chcę by nasza karta była dokładnie wycentrowana na monitorze. By to zrobić skorzystamy z Flexible Box Model. Upewnij się tylko, by wykorzystać Modernizr dla starszych przeglądarek.
Skoro nasza strona zawiera tylko tę kartę możemy skorzystać z body
jako głównego pojemnika.
1 |
body, html { height: 100%; width: 100%; } |
2 |
|
3 |
body { |
4 |
display: -moz-box; |
5 |
display: -webkit-box; |
6 |
display: box; |
7 |
|
8 |
-moz-box-orient: horizontal; |
9 |
-webkit-box-orient: horizontal; |
10 |
box-orient: horizontal; |
11 |
|
12 |
-moz-box-pack: center; |
13 |
-moz-box-align: center; |
14 |
|
15 |
-webkit-box-pack: center; |
16 |
-webkit-box-align: center; |
17 |
|
18 |
box-pack: center; |
19 |
box-align: center; |
20 |
}
|

Krok 3. Stylizacja pojemnika
Teraz nadamy styl naszym "kartom":
1 |
.box { |
2 |
background: #e3e3e3; |
3 |
border: 1px dashed #666; |
4 |
margin: auto; |
5 |
width: 400px; |
6 |
height: 200px; |
7 |
cursor: pointer; |
8 |
position: relative; |
9 |
|
10 |
-webkit-transition: all 1s; |
11 |
-moz-transition: all 1s; |
12 |
transition: all 1s; |
13 |
}
|
Zauważ, że zaleciliśmy temu elementowi wykonania wszystkich zmian stylu. Jeśli nastąpią, dokonamy zmian w ciągu jednej sekundy (transition: all 1s
).



Krok 4. Efektywny cień
Następnie, jak nauczyliśmy się z artykułu, zamontujemy cień za pomocą pseudo-klasy ::after
.
1 |
.box::after { |
2 |
content: ''; |
3 |
position: absolute; |
4 |
|
5 |
width: 70%; |
6 |
height: 10px; |
7 |
bottom: 0; |
8 |
left: 15%; |
9 |
|
10 |
z-index: -1; |
11 |
|
12 |
-webkit-box-shadow: 0 9px 20px rgba(0,0,0,.4); |
13 |
-moz-box-shadow: 0 9px 20px rgba(0,0,0,.4); |
14 |
box-shadow: 0 9px 20px rgba(0,0,0,.4); |
15 |
}
|



Krok 5. Stylizowanie dzieci div
W tym momencie dzieci div
y znajdują się jeden na drugim. Nadajmy im position
absolute
, a następnie każmy zająć całą dostępną przestrzeń.
1 |
.box > div { |
2 |
background: #e3e3e3; |
3 |
|
4 |
position: absolute; |
5 |
width: 100%; height: 100%; |
6 |
top: 0; left: 0; |
7 |
|
8 |
|
9 |
font: 45px/200px bold helvetica, arial, sans-serif; |
10 |
text-align: center; |
11 |
|
12 |
-webkit-transition: all .5s ease-in-out; |
13 |
-moz-transition: all .5s ease-in-out; |
14 |
transition: all .5s ease-in-out; |
15 |
}
|



Krok 6. Naprawa "przodu"
Sprawdź obrazek u góry; zwróć uwagę jak domyślnie wyświetlany jest tył karty?Jest to spowodowane tym, że element znajduje się niżej w kodzie, dlatego dostaje wyższy z-index
. Naprawmy to.
1 |
/* Upewnij się, że najpierw widzimy przód */
|
2 |
.box > div:first-child { |
3 |
position: relative; |
4 |
z-index: 2; |
5 |
}
|



Krok 7. Rotacja karty
Teraz czas na zabawę; kiedy najeżdżamy kursorem na kartę, powinno się obrócić i pokazać tył (a przynajmniej umowny tył). By tego dokonać, używamy transformacji oraz funkcji rotateY
.
1 |
.box:hover { |
2 |
-webkit-transform: rotateY(180deg); |
3 |
-moz-transform: rotateY(180deg); |
4 |
transform: rotateY(180deg); |
5 |
}
|



Krok 8. Odwrócony tekst
Czy to nie wygląda świetnie? Ale teraz tekst jest odwrócony. Oczywiście dzieje się tak dlatego, że transformujemy kontener. Naprawmy to nadając rotację dziecku div
o 180 stopni.
1 |
/* Schowaj przód kiedy najedzie kursorem*/
|
2 |
.box:hover > div:first-child { |
3 |
opacity: 0; |
4 |
}
|
5 |
|
6 |
.box:hover div:last-child { |
7 |
-webkit-transform: rotateY(180deg); |
8 |
-moz-transform: rotateY(180deg); |
9 |
transform: rotateY(180deg); |
10 |
}
|
I dzięki tym ostatnim linijkom uzyskaliśmy porządany efekt!



Podsumowanie
Dziękuję za przeczytanie, oraz mam nadzieję że czegoś się nauczyłeś!
Ps: ze względu na to, że artykuł pochodzi z 2010 roku, niektóre z właściwości są obecnie zmienione.