• Strona główna
  • Curriculum Vitae
  • O mnie
  • Mapa strony
  • Kontakt
Niebieski Pomarańczowy Zielony Różowy Fioletowy

CSS3 i Media Queries

Opublikowane 7 maja 2011. Autor: Kamil Brenk. Wizyt: 2 200.

Kategorie: HTML5 & CSS3
Tematyka: Cross Browser Polyfills, CSS, CSS Media Queries, CSS3, HTML5, praktyczne skrypty

maj 07

Media Queries w CSS2 to nic innego jak wybór medium, dla którego ma być serwowany bieżący plik CSS. Czyli możemy zdecydować, które pliki wyświetlać w wersji do druku, a które dla np. odbiorników telewizyjnych.

Tak było dotychczas. Wraz z nadejściem CSS3 rozszerzono możliwości Media Queries. Teraz możemy dodatkowo decydować o dołączaniu odpowiedniego pliku/kodu CSS na podstawie rozdzielczości ekranu, orientacji wyświetlacza, kolorów, etc.

A wszystko w celu ułatwienia życia webdeveloperom, o czym dalej.

Jak było wcześniej z Media Queries?

Media Queries nie są żadną nowością, bowiem już wcześniej dysponowaliśmy atrybutem media dla stylów CSS. Jednak wcześniej spektrum możliwości nie zachwycał, gdyż jedynym warunkiem, który mogliśmy tam umieścić, był wybór typu medium przy wyświetlaniu strony.

Do wyboru były więc następujące typy medium:

  • screen – ekrany komputerowe,
  • tty – media używające siatki o stałej szerokości znaków jak dalekopisy, terminale lub przenośne urządzenia z ograniczonymi możliwościami wyświetlania,
  • tv – odbiorniki telewizyjne (niska rozdzielczość, ograniczone przewijanie, dostępny dźwięk),
  • projection – prezentacje projektorowe,
  • handheld – urządzenia ręczne/przenośne (mały ekran, czarno-biały),
  • print – urządzenia drukujące,
  • braille – urządzenia do czytania braillem, przeznaczone dla osób niewidomych,
  • aural – syntezatory mowy, czytniki,
  • all – dostępne dla wszystkich powyższych urządzeń.

Już wtedy mogliśmy też wybrać parę typów mediów na raz:

1
2
<link rel="stylesheet" media="screen, projection" href="normal.css">
<link rel="stylesheet" media="print" href="print.css">
Co nowego w Media Queries?

Wraz z wprowadzeniem CSS3 w nowoczesnych przeglądarek pojawiły się także rozszerzone możliwości Media Queries. Nowe możliwości nadal możemy wykorzystać zarówno w kodzie HTML (dla elementu STYLE), jak i bezpośrednio w pliku CSS.

Po stronie HTML tak wygląda przykładowy kod z wyborem medium:

1
<link rel="stylesheet" media="screen and (min-width: 800px) and (min-height: 1024px)" href="normal.css">

Nowością w powyższym kodzie jest rozszerzona zawartość atrybutu media. Ustawiliśmy tutaj warunek, by załadować plik normal.css tylko pod warunkiem, gdy:

  • stronę otworzono z urządzenia posiadającego ekran
  • minimalna szerokość ekranu wynosi 800 pikseli
  • minimalna wysokość ekranu wynosi 600 pikseli

Jeśli urządzenie, na którym strona została otworzona nie spełnia powyższych kryteriów, wtedy plik normal.css nie zostanie załadowany. Oczywiście takich warunków może być więcej, o czym za chwilę.

Alternatywna wersja dla powyższego kodu HTML, tym razem w CSS:

1
2
3
@media screen and (min-width: 800px) and (min-height: 1024px) {
      /* zawartość pliku normal.css */
}

Jak wszyscy wiem, również bezpośrednio z kodu CSS możemy importować zewnętrzne pliki. Także i tutaj możemy więc ustawić odpowiednie media:

1
@import url(normal.css) screen and (min-width: 800px) and (min-height: 1024px);

Przy pisaniu swoich warunków możemy używać także słów kluczowych not oraz only, np. :

1
2
3
<link rel="stylesheet" media="not screen and (color)" href="example.css" />

<link rel="stylesheet" media="only screen and (color)" href="example.css" />

Możemy także po przecinku wypisywać kolejne warunki, które muszą być spełnione, np. :

1
<link rel="stylesheet" media="screen and (color), projection and (color)" rel="stylesheet" href="example.css" />
Media features

Czas na omówienie konkretnych możliwości Media Queries.

Typ media

Jak już na wstępie zostało omówione, pierwszym z możliwych warunków (dostępnym zresztą od dawna) do zastosowania jest wybór typu medium, na którym odpalamy stronę (aural, braille, handheld, print, projection, screen, tty, tv).

Wymiary ekranu

Możemy zadecydować, na ekranach o jakiej rozdzielczości wczytywać nasz kod CSS. Do wyboru jest oczywiście długość i szerokość ekranu (mowa o rozdzielczości).

Możemy określać zarówno minimalne, jak i maksymalne wielkości, a regułki za to odpowiedzialne to: min-width, max-width, min-height, max-height.

Na szczęście nie musimy kierować się wyłącznie rozdzielczością ekranu. Często bywa tak, że użytkownik ma dużo mniejszy obszar „widoczności” strony WWW, aniżeli rozdzielczość ekranu. Wynika to z faktu, iż różne programy lubią pojawiać się jako toolbar po prawej lub lewej stronie ekranu. Także pasek zadań (Windows) bywa przenoszony przez niektórych na boki ekranu.

W tym celu powstały kolejne regułki dla Media Queries pozwalające rozpoznać „prawdziwą” szerokość/wysokość wyświetlanej strony, tj. device-width, device-height, min-device-width, max-device-width, min-device-height oraz max-device-height.

Orientacja ekranu / Aspect Ratio

Regułki te są do siebie podobne, dlatego stanowią jeden podpunkt. Mianowicie orientacja ekranu wskazuje, czy ekran jest szerszy niż wyższy czy też na odwrót :-) Czyli inaczej mówiąc, czy mamy do czynienia z płaskim i szerokim ekranem (komputery, telewizory) czy wąskim, lecz wysokim (urządzenia mobilne, telefony)?

Jak łatwo się więc domyślić, dla orientacji mamy do wyboru dwie regułki:

  • orientation: portrait – orientacja pionowa
  • orientation: landscape – orientacja pozioma

Aspect Ration jest to natomiast stosunek wysokości do szerokości ekranu (lub obszaru aktualnie wyświetlonej strony).

Przykład, w którym szerokość ekranu jest dokładnie jeszcze raz tak wielka jak wysokość „widocznego” obszaru roboczego strony:

1
@media all and (device-aspect-ratio: 32/18) { … }

Przy wyborze Aspect Ration mamy do dyspozycji następujące regułki: aspect-ratio oraz device-aspect-ratio.

Kolory

Regułka odpowiedzialna za warunkowe serwowanie plików CSS w zależności od kolorów, jakie obsługuje urządzenie użytkownika. Masz tutaj następujące regułki (już bez objaśnień – nazwa sama mówi za siebie): color, min-color, max-color, color-index, min-color-index, max-color-index, monochrome, min-monochrome, max-monochrome.

Kilka praktycznych przykładów użycia:

1
2
3
4
5
@media (color) { /* urządzenie obsługuje kolory */ }

@media (min-color-index: 256) { /* głębia kolorów - minimum 256 kolorów */ }

@media (monochrome) { /* urządzenie jest monochromatyczne - składa się jedynie z barw prostych */ }

DPI wyświetlacza

Możemy także rozpoznać liczbę DPI wyświetlacza w urządzeniu renderującym naszą stronę WWW i na podstawie wyniku zaserwować odpowiednie style CSS (jest to szczególnie przydatna opcja przy druku / urządzeniach drukujących).

Regułki, którymi możemy dysponować: resolution, min-resolution, max-resolution:

1
2
@media print and (min-resolution: 300dpi) { … }
@media print and (min-resolution: 118dpcm) { … }

Sposób skanowania

Wartość ta nie jest dla mnie do końca jasna, ponieważ nie tworzyłem JESZCZE stron pod telewizory :-) Przykład ze specyfikacji W3C:

1
@media tv and (scan: progressive) { … }
Wsparcie przeglądarek dla CSS Media Types

Nowoczesne przeglądarki, tj. Chrome, Opera, Mozilla czy Safari (od 4.0) radzą sobie bezproblemowo z wszystkimi powyższymi warunkami.

Jak zwykle problem stanowi Internet Explorer, co nie jest żadną nowością. Obsługa Media Queries jest zaimplementowana dopiero od wersji 9.0.

Jeśli natomiast chodzi o przeglądarki mobilne to nie ma żadnego problemu – jest zapewnione wsparcie dla Media Queries, przynajmniej dla iOS Safari, Opera Mini, Opera Mobile czy Android Browser.

Co z Internet Explorer?

Niestety jak zwykle kulą u nogi jest zacofany Internet Explorer, który wciąż stanowi spory procent rynku przeglądarek i o którego trzeba od czasu do czasu zadbać.

Na szczęście znalazło się kilku dobrych ludzi chcących pomóc innym webdeveloperem i napisali wtyczki dodające obsługę Media Queries tym ułomnym i przestarzałym przeglądarkom ;-)

css3-mediaqueries.js

Jak zapewnia autor tej biblioteki, css3-mediaqueries.js dodaje wsparcie CSS3 Media Queries dla takich przeglądarek jak: IE 5+, Firefox 1+ oraz Safari 2.

Uwaga od autora – z wykorzystaniem tej biblioteki Media Queries nie zadziała dla @import (którego i tak nie warto używać ze względów wydajnościowych).

Największą wadą biblioteki jest jej rozmiar, bowiem zajmuje całe 15 KB!

Respond

Kolejna ciekawa biblioteka łatająca ułomności przestarzałych przeglądarek, Respond, zapewni wsparcie dla: IE 6, IE 7 oraz IE 8.

Aby biblioteka rozpoznała Media Queries należy każdą klauzulę zamknąć komentarzem, na wzór poniższego kodu:

1
2
3
@media screen and (min-width: 480px){
    /* some css */
}/*/mediaquery*/

Największą zaletą biblioteki Respond jest jej mały rozmiar, gdyż zajmuje niecały 1 KB! Wadą natomiast jest, że dodaje wsparcie jedynie dla regułek typu medium oraz wymiarów ekranu (min-width, max-width). Nie jest to wiele, ale w większości projektów wystarczy.

Kilka słów podsumowania

Jak już zapewne zauważyłeś, nowe możliwości Media Queries zachwycają i pewnie nie raz będę z nich korzystał w przyszłości.

Największą zaletą Media Queries jest to, że możemy napisać jedną stronę i dla niej serwować style CSS dla wielu urządzeń bez powielania czy przepisywania kodu HTML – dla komputerów, tabletów, drukarek, urządzeń mobilnych, tv, czytników i reszty (z czasem pewnie pojawi się tego więcej).

Czy już dzisiaj możemy korzystać z Media Queries? Jak najbardziej, bowiem wszystkie nowoczesne przeglądarki (nawet mobilne) w pełni obsługują tą technologię. Dla Internet Explorer sugeruję natomiast wykorzystywać jedną z powyższych bibliotek.

Ps. przy wczytywaniu dodatkowej biblioteki dla IE może przydać się mój wcześniejszy wpis: Sposoby wczytywania JavaScript. Można także skorzystać z komentarzy warunkowych dla Internet Explorer.

Przydatne linki
  • Specyfikacja W3C Media Queries
  • Przykład 1, Przykład 2

Podobne wpisy

  • Nowe możliwości CSS3
  • Eksperymentalne własności w CSS3
  • Gramatyka w HTML i CSS
  • Boilerplate 2.0
  • Kompendium programisty #2

Komentarze (9)

  1. css3.pl 7 maja 2011

    Wyraz „media” odmienia się jako – typ medium, typy mediów, itd.

  2. Kamil Brenk 7 maja 2011

    @css3.pl: dzięki, właśnie nie byłem pewien jak odmieniać słówko „media” czy jak tłumaczyć „Media Queries” (dlatego zostawiłem angielską nazwę). Poprawki naniesione ;)

  3. Bigismall 15 maja 2011

    Dobry wpis! Właśnie tego potrzebowałem.

  4. kenio 27 maja 2011

    Czy ten sposób na pewno działa dla IE 7 i 8 nawet po wrzuceniu skryptu respond? Bo z tego co zauważyłem to bez podanej szerokości dla jakiegos kontenera, a zamiast tego probie nadania mu szerokosci przez @media only screen and (min-width: 480px) { #element { width: ; } to IE7 i 8 nawet nie reagują. Dopiero po podaniu mu na sztywno szerokosci w pliku css dla elementu zaskakuje.

  5. Kamil Brenk 27 maja 2011

    @kenio: Nie wiem czy dobrze rozumiem, ale Ty próbujesz za pomocą Media Queries „stylować” elementy na stronie? ;)

    Media Queries służy do warunkowego wczytywania odpowiednich plików CSS ze stylami – jeśli sprzęt użytkownika spełnia pewne wymagania to wczytujemy xxx.css, jeśli spełnia inne wymagania to yyy.css.

  6. pingwinoos 22 grudnia 2011

    Nowoczesne przeglądarki, tj. Chrome, Opera, Mozilla czy Safari (od 4.0) radzą sobie bezproblemowo z wszystkimi powyższymi warunkami.

    hmm…..czyżby ?
    mam stronę …. ustawiłem media queries (http://www.testyehe.yoyo.pl/index.html)

    przeglądam w Chrome FF i wszystkich wymioenionych wyżej i wygląda że nie działą … rozdzialczość mam 1680 x 1050 …. co tu może nie grać ?

    kiedy usunę wszystko z media= i zostawię tylko „screen” arkusz wczytuje się poprawnie.

  7. Kamil Brenk 22 grudnia 2011

    @pingwinoos: ustawiłeś, że użytkownik musi mieć ekran o minimalnej rozdzielczości: 1680×1050 pikseli. Niestety nie mam tak dużego wyświetlacza/monitora i nie mogę nawet przetestować.

    Z tego co widzę to niecałe 5% Polaków (http://ranking.pl/pl/rankings/screen-resolutions.html) będzie widziało u Ciebie style, bo tylko dla nich wczytujesz jakiś arkusz. Na pewno taki miałeś zamiar?

    Btw. tak, media queries działają dla wymienionych przeglądarek i wiele stron już je stosuje w praktyce, w tym kilka moich ostatnich projektów.

  8. pingwinoos 22 grudnia 2011

    Nie neguje że nie działają, chciałem dociec dlaczego to u mnie nie działa.
    CHciałem użyć meda quiers aby wziąść pod uwagę wszystkie dostępne rozdzielczości (a przynajmniej większość)

    Ja mam taki monitor, także arkusz powinien się chyba wgrywać a nie wgrywa się.
    Ok zmieniam na 800×600 abyś mógł przetestować.

  9. pingwinoos 22 grudnia 2011

    kurde ale jaja, faktycznie działa, przepraszam za zamieszanie ;D
    sory….



Dodaj komentarz

XHTML: Możesz użyć następujących tagów
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Kamil Brenk Blog

PHP, JavaScript, SQL, HTML

  • Informacje o blogu

    Kamil Brenk

    Blog o tworzeniu aplikacji na potrzeby sieci Web.

    Praktyczne przykłady, porady i sztuczki. PHP, SQL, AJAX, JavaScript, HTML i pochodne.

    Kanał RSS

    • Najnowsze
    • Komentarze
    • Popularne
    • Gramatyka w HTML i CSS
    • PHP kontra Microsoft Office, part I
    • Cross-Domain JavaScript: CORS
    • Wysyłanie wiadomości SMS w PHP
    • Boilerplate 2.0
    • Własne selektory w jQuery
    • Dexterxx: Mhmm... Maxthon 3 z najnowszym webkitem i nikomu nie chciało...
    • Kamil Brenk: @Michał:1) jak już otrzymam dyplom to zrobię serię o...
    • Michal Wachowski: Po pierwsze - tyle czekania i tylko to? A bu! :) Po drugie -...
    • Kamil Brenk: @CapaciousCore: języki kompilowane są szybsze niż...
    • CapaciousCore: @Kamil Brenk wiem, że komentarze i post nie są uber świeże....
    • Kamil Brenk: @CapaciousCore: post i komentarze napisane ponad rok temu;...
    • CapaciousCore: Przebrnąłem przez te wszystkie komentarze i mam trochę...
    • Przyszłość PHP
    • Niestandardowe czcionki na stronie
    • Gramatyka w PHP, część 1
    • Umowa i zaliczka dla freelancera
    • Projekt aplikacji po stronie klienta
    • Własny mechanizm Feed
    • jQuery.extends dla PHP
  • Szukajka
    Wpisz co chcesz wyszukać na stronie…
  • Kategorie
    • Apache
    • Freelancer
    • Front-end Development
    • HTML5 & CSS3
    • Inne
    • JavaScript
    • Książki
    • PHP
    • Po godzinach
    • Pozycjonowanie
    • Protokół HTTP
    • SQL
    • Wyrażenia regularne
  • Moje serwisy
    • Testy zawodowe
    • Miłość, uczucia i seks
  • Czytane blogi
    • Wojciech Sznapka
    • Wojciech Soczyński
    • Michał Wachowski
    • Tomasz Kowalczyk
    • JavaScript po polsku | Code42
  • Archiwum
    • Luty 2012
    • Listopad 2011
    • Październik 2011
    • Wrzesień 2011
    • Sierpień 2011
    • Lipiec 2011
    • Maj 2011
    • Kwiecień 2011
    • Marzec 2011
    • Luty 2011
    • Styczeń 2011
    • Grudzień 2010
    • Listopad 2010
    • Październik 2010
    • Wrzesień 2010
    • Sierpień 2010
    • Lipiec 2010
    • Czerwiec 2010
    • Maj 2010
    • Kwiecień 2010
    • Marzec 2010
    • Luty 2010
    • Styczeń 2010
  • Strona główna
  • Curriculum Vitae
  • O mnie
  • Mapa strony
  • Kontakt

Kamil Brenk © 2010. All rights reserved.

Designed by FTL Wordpress Themes brought to you by Smashing Magazine.

Do góry ∧