Menu

CSS Medya Sorguları: Breakpoint, min-width ve max-width

Bir medya sorgusu CSS'i yalnızca bir koşul doğru olduğunda uygular: minimum bir ekran genişliği, karanlık bir renk şeması ya da bir fare imleci gibi. @media söz dizimini, mobil öncelikli breakpoint'leri, aralık söz dizimini, prefers-color-scheme'i, JavaScript'te matchMedia'yı ve container query'leri öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Tek örnekte bir medya sorgusu

Bir medya sorgusu CSS'i bir koşulla sarar. @media (min-width: 600px) içindeki kurallar yalnızca viewport en az 600px genişliğindeyken uygulanır:

Önizleme bir çerçevedir ve içindeki bir medya sorgusu senin ekranını değil çerçeveyi ölçer. Masaüstünde bu makale sütunu kadar geniştir, genellikle 600px'ten fazla, bu yüzden kutu mavidir. Tarayıcı pencereni çerçeve 600px'in altına düşecek kadar daralt, kehribar rengine döner; kutunun altındaki satır çerçevenin genişliğini canlı bildirir. Bir telefonda çerçeve zaten dardır, bu yüzden kehribar rengi sürümü görürsün.

@media söz dizimi

@media (min-width: 600px) { ... }                        /* one condition */
@media (min-width: 600px) and (max-width: 899px) { ... } /* both must be true */
@media (max-width: 599px), print { ... }                 /* either one (comma = or) */
@media not print { ... }                                 /* negation */
@media screen and (orientation: landscape) { ... }       /* media type plus a feature */
@media (width >= 600px) { ... }                          /* range syntax */
@media (600px <= width < 900px) { ... }                  /* a range with both ends */

and iki yanında da boşluk ister: (min-width: 600px)and(max-width: 900px) geçersizdir ve bütün sorgu yok sayılır. Aralık söz dizimi (width >= 600px) güncel Chrome, Firefox ve Safari'de desteklenir ve özellikle "şuna kadar ama dahil değil" için min-width'ten daha anlaşılır okunur.

En çok kullanacağın özellikler:

ÖzellikNe zaman eşleşirÖrnek
min-width / width >=viewport en az bu kadar genişse(min-width: 768px)
max-width / width <=viewport en fazla bu kadar genişse(max-width: 767px)
orientationportrait (genişliğinden uzun) ya da landscape(orientation: landscape)
hoverana işaretçi üzerine gelebiliyorsa (hover) ya da gelemiyorsa (none, çoğu dokunmatik ekran)(hover: hover)
pointerana işaretçi fine (fare) ya da coarse (parmak) ise(pointer: coarse)
prefers-color-schemekullanıcı dark ya da light bir tema seçtiyse(prefers-color-scheme: dark)
prefers-reduced-motionkullanıcı sistemden daha az hareket istediyse(prefers-reduced-motion: reduce)
print (bir medya türü)sayfa yazdırılıyor ya da PDF olarak kaydediliyorsa@media print

Mobil öncelik: min-width breakpoint'leri

Telefon düzenini temel CSS olarak yaz, sonra alan büyüdükçe düzeni değiştiren min-width sorguları ekle. Her sorgu yalnızca neyin değiştiğini tarif etmek zorundadır:

Geniş bir masaüstü penceresinde önizleme 720px'in üzerindedir, bu yüzden üç sütun görürsün; ızgaranın altındaki satır genişliği ve sütun sayısını bildirir. Pencereyi daralt, 720px'in altında ikiye, 480px'in altında bire düşer. İki sorgunun sırası önemlidir: geniş bir ekranda ikisi de doğrudur ve sonraki kazanır, bu yüzden min-width sorguları küçükten büyüğe gider. (max-width sorgularında tersidir: önce en büyük.)

Breakpoint seçmek

Resmi bir liste yoktur. Bunlar yaygın değerler ve genellikle neyi ayırdıkları:

BreakpointGenellikle
min-width: 640pxyatay tutulan büyük telefonlar, küçük tabletler
min-width: 768pxdikey tutulan tabletler
min-width: 1024pxyatay tutulan tabletler, küçük dizüstü bilgisayarlar
min-width: 1280pxmasaüstleri

Daha iyi bir yöntem: dar düzenle başla, bir şey kötü görünene kadar pencereyi genişlet (fazla uzun satırlar, fazla geniş kartlar) ve oraya bir breakpoint koy. Çoğu sayfa için iki ya da üç breakpoint yeterlidir. Çoğu zaman hiç gerekmez: grid'de repeat(auto-fit, minmax(200px, 1fr)), flex-wrap ve clamp() kesintisiz uyum sağlar.

Her sayfanın viewport meta etiketine ihtiyacı var

<head> içinde bu etiket olmadan telefon tarayıcıları sayfayı ekran yaklaşık 980px genişliğindeymiş gibi yerleştirir ve sonra uzaklaştırır, bu yüzden min-width: 480px sorgun her zaman doğrudur ve telefon düzenin hiç görünmez:

<meta name="viewport" content="width=device-width, initial-scale=1">

İçindeki her değeri meta viewport sayfası açıklıyor.

prefers-color-scheme ile karanlık mod

prefers-color-scheme, işletim sisteminin açık ya da karanlık ayarını takip eder. Onu kullanmanın en temiz yolu renkleri CSS değişkenlerinde tutmak ve sorgunun içinde yalnızca değişkenleri değiştirmektir:

Bu önizlemede sistemin karanlık moddayken bile sorgu false yazdırabilir: Chrome, sistem ayarını bunun gibi sandbox içindeki bir frame'e aktarmaz. Buton aynı değişkenleri elle değiştirir; bir sitenin tema düğmesi de böyle çalışır. :root[data-theme], sorgunun içindeki sade :root'tan daha özgüldür, bu yüzden okuyucunun seçimi sistemin önüne geçer. Sorgunun sistemini takip ettiğini görmek için örneği dosya olarak kaydedip aç.

Script, medya sorgularının ikinci yarısını gösteriyor: matchMedia() aynı sorguyu JavaScript'ten çalıştırır, şu anda eşleşip eşleşmediğini döndürür ve cevap değiştiğinde bir change olayı tetikler. Yalnızca stil değil davranış da ekrana bağlı olduğunda kullan, örneğin dokunmatik cihazlarda bir menüyü farklı açmak için.

Hareket de aynı şekilde çalışır. Büyük ya da döngüsel animasyonları, animasyon sayfasında gösterildiği gibi prefers-reduced-motion kontrolüyle sar.

Container query'ler: kararı bileşen verdiğinde

Bir medya sorgusu yalnızca viewport'u bilir. Aynı sayfada hem geniş bir ana sütunda hem dar bir kenar çubuğunda duran bir kartın bunun yerine kendi alanını bilmesi gerekir. İşte bu bir container query'dir: ebeveyni container-type: inline-size ile işaretle, sonra aynı koşullarla @container kullan.

Yeniden boyutlandırmak için gri kutunun köşesini sürükle. Kart, pencere boyutu ne olursa olsun kutunun 360px genişliğinde düzen değiştirir:

Başlangıçtaki 480px'te resim metnin yanında duruyor. Kutuyu 376px'ten dar sürükle (360px içerik artı her iki yanda 8px padding), resim metnin üstüne geçer. Container query'ler bütün güncel büyük tarayıcılarda çalışır.

Yazdırma için stiller

@media print yalnızca sayfa yazdırılırken ya da PDF olarak kaydedilirken uygulanır. Gezinmeyi ve butonları gizle, beyaz üzerine koyu metin kullan:

@media print {
  nav, .ad, button { display: none; }
  body { color: black; background: white; }
  a::after { content: " (" attr(href) ")"; } /* print the URL after each link */
}

Sık yapılan hatalar

  • Viewport meta etiketi yok. Telefonlar bu durumda geniş bir düzen viewport'u bildirir ve küçük ekran sorguları hiç eşleşmez.
  • Yanlış sıradaki sorgular. Aynı seçiciye sahip iki doğru sorgu: sonraki kazanır. min-width sorgularını küçükten büyüğe sırala.
  • Çakışan ya da boşluk bırakan sınırlar. max-width: 768px ve min-width: 768px tam 768px'te ikisi de eşleşir. Birinde 767px kullan ya da aralık söz dizimiyle (width < 768px) ve (width >= 768px) yaz.
  • and'den sonra boşluk yok. and( geçersizdir ve sorgu sessizce atılır.
  • Yalnızca bir masaüstü penceresini boyutlandırarak test etmek. Gerçek bir telefonu ya da telefonun viewport'unu, piksel oranını ve dokunmayı uygulayan tarayıcının cihaz modunu da kontrol et.
  • Çok fazla breakpoint. Her bileşenin kendi breakpoint'ine ihtiyacı varsa bunun yerine grid auto-fit, flex-wrap ya da container query'leri dene.

Sıkça Sorulan Sorular

CSS'te medya sorgusu nedir?

İçindeki CSS'i yalnızca cihaz ya da pencereyle ilgili bir koşul doğru olduğunda uygulayan bir kuraldır. @media (min-width: 600px) { ... } stillerini yalnızca viewport en az 600px genişliğindeyken uygular; tek bir sayfa telefonlardan masaüstlerine böyle uyum sağlar.

min-width mı yoksa max-width medya sorguları mı kullanmalıyım?

Çoğu site mobil öncelikli yazar: temel CSS küçük ekranlar içindir ve ekran büyüdükçe min-width sorguları düzen ekler. max-width sorguları masaüstü düzeninden başlayarak ters yönde çalışır. İkisi de çalışır; ikisini aynı elementte karıştırmak sınırlarda çakışmalara ve boşluklara yol açar.

Standart medya sorgusu breakpoint'leri nelerdir?

Resmi bir standart yoktur. Yaygın seçimler 640px, 768px, 1024px ve 1280px civarıdır, ama daha iyi kural, kendi düzeninin kötü görünmeye başladığı yere bir breakpoint eklemek ve breakpoint sayısını az tutmaktır.

Medya sorgum telefonda neden çalışmıyor?

En yaygın neden eksik bir viewport meta etiketidir. <meta name="viewport" content="width=device-width, initial-scale=1"> olmadan mobil tarayıcılar sayfanın yaklaşık 980px genişliğinde olduğunu varsayar, bu yüzden küçük genişlik sorguları hiç eşleşmez. Ayrıca sorgunun ezdiği kurallardan sonra geldiğini kontrol et.

Karanlık mod için medya sorgusu nasıl yazılır?

@media (prefers-color-scheme: dark) { ... } kullan. Kullanıcının işletim sistemi ya da tarayıcısı karanlık bir temaya ayarlı olduğunda eşleşir ve içinde renkleri ya da CSS değişkenlerini ezebilirsin.

Medya sorguları ile container query'ler arasındaki fark nedir?

Bir medya sorgusu viewport'u (bütün pencereyi) test eder. @container ile yazılan bir container query ise container-type: inline-size ile işaretlediğin bir ebeveyn elementin boyutunu test eder. Aynı sayfada hem geniş hem dar yerlerde görünen bir bileşen için container query kullan.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA