Kurs HTML

14.3. Media Queries: Operatory logiczne (and, not, only, przecinek)

Strona główna > Kurs CSS > Rozdział 14: Responsywność (RWD) > Media Queries: Operatory logiczne (and, not, only, przecinek)

Łączenie warunków w Media Queries

W poprzedniej lekcji poznaliśmy podstawową składnię Media Queries. Często jednak potrzebujemy stworzyć bardziej złożone warunki, łącząc typy mediów z cechami lub wiele cech ze sobą. Do tego służą operatory logiczne: and, not, only oraz przecinek (,), który działa jak logiczne LUB.

Operator and

Operator and jest najczęściej używanym operatorem logicznym. Służy do łączenia typu medium z cechą medium lub do łączenia wielu cech medium. Wszystkie połączone warunki muszą być spełnione, aby całe zapytanie było prawdziwe (logiczne I).

Składnia:

@media [media-type] and (media-feature-1: value) and (media-feature-2: value) { ... }

Przykłady:

/* Tylko dla ekranów ORAZ gdy minimalna szerokość to 768px */
@media screen and (min-width: 768px) { 
  /* Style dla tabletów i większych ekranów */
}

/* Tylko dla ekranów ORAZ gdy minimalna szerokość to 768px ORAZ orientacja jest pozioma */
@media screen and (min-width: 768px) and (orientation: landscape) {
  /* Style dla tabletów w poziomie i większych */
}

/* Można pominąć typ medium (domyślnie 'all') */
/* Gdy minimalna szerokość to 600px ORAZ maksymalna szerokość to 900px */
@media (min-width: 600px) and (max-width: 900px) {
  /* Style dla ekranów o szerokości między 600px a 900px włącznie */
}

Przecinek (,) - Logiczne LUB

Przecinek działa jak operator logiczny LUB. Jeśli użyjesz przecinka do oddzielenia wielu zapytań o media, style zostaną zastosowane, jeśli **którekolwiek** z tych zapytań będzie prawdziwe.

Składnia:

@media (media-query-1), (media-query-2), [media-type] { ... }

Przykłady:

/* Gdy maksymalna szerokość to 600px LUB orientacja jest pionowa */
@media (max-width: 600px), (orientation: portrait) {
  /* Style dla małych ekranów LUB dowolnego ekranu w pionie */
  .sidebar {
    display: none; /* Ukryj sidebar */
  }
}

/* Dla drukarek LUB dla ekranów o minimalnej szerokości 1200px */
@media print, screen and (min-width: 1200px) {
  body {
    font-size: 14pt;
  }
}

Każde zapytanie oddzielone przecinkiem jest traktowane niezależnie.

Operator not

Operator not neguje całe zapytanie o media. Style zostaną zastosowane, jeśli zapytanie jest **fałszywe**. Musi być umieszczony na samym początku zapytania i neguje całe zapytanie, a nie tylko pojedynczą cechę.

Składnia:

@media not [media-type] and (media-feature: value) { ... }

Przykład:

/* Stosuj, gdy NIE jest to drukarka */
@media not print {
  body {
    background-color: white;
  }
}

/* Stosuj, gdy NIE jest to ekran o minimalnej szerokości 600px */
/* (Czyli dla ekranów węższych niż 600px) */
@media not screen and (min-width: 600px) {
  .mobile-menu {
    display: block;
  }
}

/* Uwaga: 'not' neguje całe zapytanie. */
/* Poniższe NIE oznacza 'nie kolorowy' - jest niepoprawne dla cechy 'color' */
/* @media not (color) { ... } */ 
/* Poprawnie (dla urządzeń monochromatycznych): */
@media (monochrome) { ... } 
/* Lub (dla urządzeń nie monochromatycznych): */
@media not (monochrome) { ... }

Operator not jest stosunkowo rzadziej używany niż and i przecinek.

Operator only

Operator only jest używany głównie w celu **ukrycia Media Queries przed starszymi przeglądarkami**, które nie rozpoznają zapytań o media z cechami (rozpoznają tylko typy mediów).

Jeśli starsza przeglądarka napotka @media only screen and (min-width: 600px), zignoruje całe zapytanie, ponieważ nie rozumie słowa kluczowego only. Nowoczesna przeglądarka zignoruje słowo only i poprawnie zinterpretuje resztę zapytania: screen and (min-width: 600px).

Składnia:

@media only [media-type] and (media-feature: value) { ... }

Przykład:

/* Starsze przeglądarki zignorują to zapytanie */
@media only screen and (min-width: 768px) {
  .container {
    width: 750px;
  }
}

W dzisiejszych czasach użycie only jest **znacznie mniej potrzebne**, ponieważ praktycznie wszystkie używane przeglądarki obsługują Media Queries z cechami. Można go jednak nadal spotkać w starszych kodach lub użyć dla pewności, choć często jest pomijany.

FAQ - Najczęściej zadawane pytania

Czy mogę łączyć operatory logiczne?

Tak, można tworzyć złożone zapytania, łącząc operatory. Na przykład, można użyć and do połączenia wielu cech, a następnie użyć przecinka (LUB) do połączenia tego złożonego zapytania z innym. Pamiętaj, że not i only muszą występować na początku zapytania.

Jaka jest kolejność wykonywania operatorów?

Operator not ma najwyższy priorytet (negując całe zapytanie, które po nim następuje). Następnie działa and. Przecinek (LUB) działa na najniższym poziomie, łącząc niezależne zapytania.

Czy muszę zawsze używać and między typem a cechą?

Tak, jeśli podajesz zarówno typ medium (inny niż all), jak i cechę medium, musisz je połączyć za pomocą operatora and. Na przykład: @media screen and (min-width: 600px).

Czy only ma jakiś wpływ na działanie w nowoczesnych przeglądarkach?

Nie, nowoczesne przeglądarki po prostu ignorują słowo kluczowe only i przetwarzają resztę zapytania normalnie. Jego jedynym celem była kompatybilność wsteczna ze starszymi przeglądarkami.