Bir dizi istemci ipucu başlığı, sitelerin istek zamanında kullanıcının medya tercihlerini isteğe bağlı olarak almasına olanak tanıyarak sunucuların performans nedeniyle doğru CSS'yi satır içine almasına olanak tanır.
CSS medya sorguları ve özellikle prefers-color-scheme
veya prefers-reduced-motion
gibi kullanıcı tercihi medya özellikleri, bir sayfa tarafından yayınlanması gereken CSS miktarı ve kullanıcının sayfa yüklendiğinde yaşayacağı deneyim üzerinde potansiyel olarak önemli bir etkiye sahiptir.
prefers-color-scheme
öğesine odaklanmak (ancak bu gerekçenin diğer kullanıcı tercih medya özellikleri için de geçerli olduğunu vurgulamak) en iyi uygulamadır. CSS'yi kritik oluşturma yolunda eşleşmeyen belirli renk şeması için yüklememek ve başlangıçta yalnızca şu anda alakalı CSS'yi yüklemek en iyi uygulamadır. Bunu yapmanın bir yolu
<link media>
aracılığıyla.
Bununla birlikte, Google Arama gibi kullanıcı tercih medya özelliklerini (ör. prefers-color-scheme
) ve performans nedeniyle satır içi CSS'yi dikkate almak isteyen yüksek trafik alan siteler, ideal olarak istek zamanında tercih edilen renk şemasını (veya diğer kullanıcı tercihi medya özelliklerini) bilmelidir. Böylece, ilk HTML yükü zaten doğru CSS'yi satır içi olarak bulundurmalıdır.
Buna ek olarak, özellikle de prefers-color-scheme
söz konusu olduğunda siteler hatalı renk temasının yanıp sönmesini önlemek ister.
Sec-CH-Prefers-Color-Scheme
ve Sec-CH-Prefers-Reduced-Motion
istemci ipucu başlıkları, bu sorunu çözmeyi amaçlayan bir kullanıcı tercihi medya özellikleri istemci ipucu başlıkları dizisinin ilkidir.
İstemci ipuçlarının arka planı
HTTP İstemci İpuçları, sunucuların proaktif içerik müzakeresi için istek üstbilgileri kullanımının reklamını yapmak üzere kullanabileceği bir Accept-CH
yanıt üst bilgisi tanımlar. Bu başlık, konuşma dilinde istemci ipuçları olarak adlandırılır. Kullanıcı Tercihi Medya Özellikleri İstemci İpuçları Başlıkları teklifi, kullanıcı tercihi medya özelliklerini iletmeye yönelik bir dizi istemci ipucunu tanımlar. Bu istemci ipuçları, raporlanan ilgili kullanıcı tercihi medya özelliğine göre adlandırılır.
Örneğin, prefers-color-scheme
uyarınca şu anda tercih edilen renk şeması, uygun şekilde adlandırılmış Sec-CH-Prefers-Color-Scheme
istemci ipucu aracılığıyla raporlanır.
Kritik müşteri ipuçlarıyla ilgili arka plan
Kullanıcı Tercihi Medya Özellikleri İstemci İpucu Başlıkları'nda önerilen istemci ipuçları, muhtemelen Kritik İstemci İpuçları olarak kullanılacaktır. Kritik İstemci İpuçları, sonuçta kullanılacak kaynağı anlamlı bir şekilde değiştiren Müşteri İpuçlarıdır. Kullanıcı tarafından görülebilen anahtarların sarsıcı olmasını önlemek için bu tür bir kaynak, sayfa yüklemelerinde (initial sayfa yükleme işlemi dahil) tutarlı bir şekilde getirilmelidir.
İstemci ipucu söz dizimi
Kullanıcı tercihi medya özellikleri bir addan (prefers-reduced-motion
gibi) ve izin verilen değerlerden (no-preference
veya reduce
gibi) oluşur. Her istemci ipucu başlık alanı, değeri dize olan bir öğe içeren HTTP için Yapılandırılmış Üstbilgiler nesnesi olarak temsil edilir. Örneğin, kullanıcının koyu bir temayı ve daha az hareketi tercih ettiğini aktarmak için istemci ipuçları aşağıdaki örnekte olduğu gibi görünür.
GET / HTTP/2
Host: example.com
Sec-CH-Prefers-Color-Scheme: "dark"
Sec-CH-Prefers-Reduced-Motion: "reduce"
Yukarıdaki istemci ipuçlarında iletilen bilgilerin CSS eşdeğeri, sırasıyla @media (prefers-color-scheme: dark) {}
ve @media (prefers-reduced-motion: reduce) {}
şeklindedir.
İstemci ipuçlarının tam listesi
İstemci ipuçlarının listesi, Medya Sorguları Düzeyi 5'teki kullanıcı tercihi medya özelliklerine göre modellenir.
İstemci İpucu | İzin Verilen Değerler | İlgili Kullanıcı Tercihi Medya Özelliği |
---|---|---|
Sec-CH-Prefers-Reduced-Motion |
no-preference , reduce |
prefers-reduced-motion |
Sec-CH-Prefers-Reduced-Transparency |
no-preference , reduce |
prefers-reduced-transparency |
Sec-CH-Prefers-Contrast |
no-preference , less , more , custom |
prefers-contrast |
Sec-CH-Forced-Colors |
active , none |
forced-colors |
Sec-CH-Prefers-Color-Scheme |
light , dark |
prefers-color-scheme |
Sec-CH-Prefers-Reduced-Data |
no-preference , reduce |
prefers-reduced-data |
Tarayıcı desteği
Sec-CH-Prefers-Color-Scheme
istemci ipucu başlığı Chromium 93'te desteklenir.
Sec-CH-Prefers-Reduced-Motion
istemci ipucu başlığı Chromium 108'de desteklenir.
Diğer satıcıların, yani WebKit'in
ve Mozilla'nın geri bildirimleri beklemede.
Sec-CH-Prefers-Color-Scheme
demosu
Chromium 93'teki demoyu deneyerek satır içi CSS'nin kullanıcının tercih ettiği renk şemasına göre nasıl değiştiğine bakın.
Sec-CH-Prefers-Reduced-Motion
demosu
Chromium 108'deki demoyu deneyerek satır içi CSS'nin kullanıcının hareket tercihlerine göre nasıl değiştiğine bakın.
İşleyiş şekli
- İstemci sunucuya bir ilk istek gönderir.
bash GET / HTTP/2 Host: example.com
- Sunucu yanıt verir ve
Accept-CH
aracılığıyla istemciye,Sec-CH-Prefers-Color-Scheme
veSec-CH-Prefers-Contrast
İstemci İpuçlarını kabul ettiğini bildirir.Critical-CH
uyarınca,Sec-CH-Prefers-Color-Scheme
bilgisiniVary
ile iletilen şekilde Kritik İstemci İpucu olarak kabul eder.bash HTTP/2 200 OK Content-Type: text/html Accept-CH: Sec-CH-Prefers-Color-Scheme, Sec-CH-Prefers-Contrast Vary: Sec-CH-Prefers-Color-Scheme Critical-CH: Sec-CH-Prefers-Color-Scheme
- Ardından istemci, isteği yeniden deneyerek
Sec-CH-Prefers-Color-Scheme
aracılığıyla sunucuya kullanıcının koyu planlı içeriği tercih ettiğini bildirir.bash GET / HTTP/2 Host: example.com Sec-CH-Prefers-Color-Scheme: "dark"
- Daha sonra sunucu, yanıtı istemcinin tercihlerine uygun şekilde özelleştirebilir ve örneğin, koyu temadan sorumlu CSS'yi yanıt gövdesinde satır içine alabilir.
Node.js örneği
Popüler Express.js çerçevesi için yazılan aşağıdaki Node.js örneği, Sec-CH-Prefers-Color-Scheme
istemci ipucu başlığıyla anlaşmanın pratikte nasıl görünebileceğini göstermektedir.
Yukarıdaki demo bu kodla desteklenir.
app.get("/", (req, res) => {
// Tell the client the server accepts the `Sec-CH-Prefers-Color-Scheme` client hint…
res.set("Accept-CH", "Sec-CH-Prefers-Color-Scheme");
// …and that the server's response will vary based on its value…
res.set("Vary", "Sec-CH-Prefers-Color-Scheme");
// …and that the server considers this client hint a _critical_ client hint.
res.set("Critical-CH", "Sec-CH-Prefers-Color-Scheme");
// Read the user's preferred color scheme from the headers…
const prefersColorScheme = req.get("sec-ch-prefers-color-scheme");
// …and send the adequate HTML response with the right CSS inlined.
res.send(getHTML(prefersColorScheme));
});
Gizlilik ve güvenlikle ilgili dikkat edilmesi gereken noktalar
Chromium ekibi; kullanıcı denetimi, şeffaflık ve ergonomi dahil olmak üzere Güçlü Web Platformu Özelliklerine Erişimi Kontrol Etme bölümünde tanımlanan temel ilkeleri kullanarak Kullanıcı Tercihi Medya Özellikleri Medya Özellikleri İstemci İpucu Başlıklarını tasarladı ve uyguladı.
HTTP İstemci İpuçlarının Güvenlikle İlgili Dikkat Edilmesi Gerekenler ve İstemci İpucu Güvenilirliği ile ilgili Güvenlikle İlgili Dikkat Edilmesi Gerekenler bu teklif için de aynı şekilde geçerlidir.
Referanslar
- Spesifikasyon taslağı
- Açıklayıcı
- Sec-CH-Prefers-Color-Scheme - Chrome Durum girişi
- Sec-CH-Prefers-Color-Scheme - Chromium hatası
- Sec-CH-Prefers-Reduced-Motion - Chrome Durum girişi
- Sec-CH-Prefers-Reduced-Motion - Chromium hatası
- WebKit ileti dizisi
- Mozilla Standartları Konumu
- İstemci İpuçları
- İstemci İpucu Güvenilirliği
- Medya Sorguları Düzey 5
- HTTP için Yapılandırılmış Üstbilgiler
Teşekkür
Yoav Weiss'tan değerli geri bildirimler ve tavsiyeler için çok teşekkür ederiz. Wikimedia Commons'da Tdadamemd tarafından hazırlanan lokomotif resim.