Önce Genel CSS: Önce Mobilde Yeni Düşünce

Yayınlanan: 2022-03-10
Kısa özet ↬ Duyarlı web tasarımının ortaya çıkışı ve mobil öncelikli yaklaşımla birlikte, yeni kavramların bizi temel düzeyde CSS yazma yöntemimizi uyarlamaya zorlamasının üzerinden yedi harika yıl geçti. Sana önerebileceğim çığır açıcı bir şeyim yok ama küçük bir sürprizim var. Bakın: Genel İlk CSS.

Ethan Marcotte'nin Duyarlı Web Tasarımı'nın dünyanın her yerindeki web geliştiricileri için hoş bir keşif olduğunu söylemek yanlış olmaz sanırım. Tamamen yeni bir tasarım düşüncesi dalgasını ve harika yeni ön uç tekniklerini tetikledi. Sıklıkla hor görülen m nokta web sitelerinin saltanatı da sona ermişti. Aynı dönemde ve neredeyse onun kadar etkili olan, Luke Wroblewski'nin Mobil İlk metodolojisiydi - Marcotte'nin etkileyici temelleri üzerine inşa edilmiş sağlam bir gelişme.

Bu teknikler çoğu web geliştiricisinin yaşamının temelini oluşturur ve bize iyi hizmet ettiler, ancak ne yazık ki zaman değişiyor ve geliştiriciler sürekli olarak yineleniyor. Yöntemlerimizin verimliliğini artırdıkça ve proje gereksinimleri daha karmaşık hale geldikçe, yeni hayal kırıklıkları ortaya çıkıyor.

Önce Jeneriğe Yolculuk

CSS'imi yazma şeklimi neyin değiştirdiğini tam olarak belirleyemiyorum çünkü bu benim için neredeyse bilinçaltında gerçekleşen gerçekten doğal bir ilerlemeydi. Geriye dönüp baktığımda, bunun daha çok içinde çalıştığım geliştirme ortamının bir yan ürünü olduğunu düşünüyorum. Birlikte çalıştığım ekip, CSS bildirimlerimize kolayca kesme noktaları eklemek için şık küçük bir karışımla devam eden güzel bir SCSS iş akışına sahipti. Muhtemelen benzer bir teknik kullanıyorsunuz.

Bu harika küçük SCSS karışımı, birdenbire süper ayrıntılı medya sorguları yazmayı kolaylaştırdı. Şuna benzeyen varsayımsal bir biyografi bloğu alın:

 .bio { display: block; width: 100%; background-color: #ece9e9; padding: 20px; margin: 20px 0; @include media('>=small') { max-width: 400px; background-color: white; margin: 20px auto; } @include media('>=medium') { max-width: 600px; padding: 30px; margin: 30px auto; } @include media('>=large') { max-width: 800px; padding: 40px; margin: 40px auto; } @include media('>=huge') { max-width: 1000px; padding: 50px; margin: 50px auto; } }

Şekil 1. Basamaklı medya sorgularıyla ilk olarak tipik mobil

Bu iyi çalışıyor - Geçmişte bunun gibi birçok CSS yazdım. Ancak bir gün, cihaz genişliği arttıkça CSS bildirimlerinin üzerine yazmanın bir anlam ifade etmediğini fark ettim. Neden yalnızca aşağıdaki bildirimde üzerine yazılması için bir CSS özelliği bildirmelisiniz?

Atlamadan sonra daha fazlası! Aşağıdan okumaya devam edin ↓

Bu, Şekil 1'deki örnekte olduğu gibi yukarıya (veya aşağıya) kademeli olarak artan medya sorgularının daha yaygın yaklaşımının aksine, bölümlere ayrılmış medya sorguları yazmaya başlamama neden oldu.

Ekran boyutundaki artışla birlikte yukarı doğru basamaklanan medya sorguları yazmak yerine, stilleri istenen ekran genişliklerinde içine alacak hedefli medya sorguları oluşturmaya başladım. Medya sorgusu karışımı burada gerçekten kendine gelirdi. Şimdi SCSS medya sorgularım şöyle görünmeye başlıyor:

 .bio { display: block; width: 100%; padding: 20px; margin: 20px 0; @include media('>=small', ' < medium') { max-width: 400px; margin: 20px auto; } @include media('>=medium', ' < large') { max-width: 600px; padding: 30px; margin: 30px auto; } @include media('>=large', ' < huge') { max-width: 800px; padding: 40px; margin: 40px auto; } @include media('>=huge') { max-width: 1000px; padding: 50px; margin: 50px auto; } }

İncir. 2. Bölümlere ayrılmış medya sorgularına bir örnek

Bu yeni yaklaşım bana daha sezgisel geldi, stilleri önceki kesme noktasından sıfırlama zorunluluğunu azalttı ve CSS'nin okunmasını kolaylaştırdı. Daha da önemlisi, medya sorgularının daha önemli bir şekilde kendi kendini belgelemesini sağlıyordu.

Yine de yukarıdakilerden %100 memnun değildim, Hala üstesinden gelinmesi gereken büyük bir sorun varmış gibi görünüyordu.

Önce Mobil İle İlgili Sorun

Önce mobil ile ilgili sorun, tanım gereği, sonraki medya sorgularında büyük olasılıkla mobil öncelikli stilleri geçersiz kılmanız gerekeceğidir. Bu biraz anti-desen gibi geliyor.

Yani - bana göre - cevap açıktı: medya sorgusu bölümlendirme fikrini mantıklı sonucuna götürelim - ayrıca mobil cihazlara özgü stilleri kendi medya sorgularına göre bölümlere ayıracağız. Biliyorum, biliyorum, bu yıllar içinde öğrendiğimiz ortak geleneklere aykırı. “Önce Mobil” o kadar yaygın ki, genellikle işe alım yöneticisinin soracağı “beceri” sorularından biridir. Yani kesinlikle herhangi bir alternatif yanlış olmalı, değil mi? Bu genellikle insanların defalarca cep telefonu derken kafalarını salladıkları kısımdır.

Pekala, mobil ilk dogmayı kıracağız ve tüm stillerimizi ilgili medya sorgularında bölümlere ayıracağız. Artık elimizde kalan, yalnızca ilgili ekran boyutları için geçerli olan medya sorgularında kapsüllenmiş diğer tüm cihaza özel stiller ile bir CSS seçicisinde bildirilen saf genel stiller. Artık Generic First CSS'ye sahibiz:

 .bio { display: block; width: 100%; @include media('>=0', ' < small') { padding: 20px; margin: 20px 0; } @include media('>=small', ' < medium') { max-width: 400px; margin: 20px auto; } @include media('>=medium', ' < large') { max-width: 600px; padding: 30px; margin: 30px auto; } @include media('>=large', ' < huge') { max-width: 800px; padding: 40px; margin: 40px auto; } @include media('>=huge') { max-width: 1000px; padding: 50px; margin: 50px auto; } }

Şekil 3. Bir Genel İlk CSS örneği

Evet, biraz daha fazla medya sorgusu var, ancak bunu bir fayda olarak görüyorum, herhangi bir geliştirici artık bu CSS'ye bakabilir ve medyayı ayırmanın bilişsel yükü olmadan her ekran boyutunda tam olarak hangi stillerin uygulandığını görebilir. sorgu özgüllüğü.

Bu, kod tabanına veya hatta gelecekteki siz'e aşina olmayan insanlar için harika olabilir!

Ne Zaman Bölümlere Ayrılmamalı

Medya sorgusu bölümlendirmesinin bir yük olduğu ve bazı durumlarda eski bir >= medya sorgusunun iyi olduğu zamanlar vardır. Unutma, yapmaya çalıştığımız tek şey, mülkün üzerine yazmaktan kaçınmak.

Geliştirici Aracı Mutluluğu

Bölümlere ayrılmış Generic First CSS yazmanın istenmeyen önemli bir sonucu, geliştirici araçları stil panelinizden alacağınız deneyimdir. Medya sorgusu kademeli olmadan, artık hangi stillerin uygulandığına dair daha net bir genel bakışa sahip olacaksınız — Üzerine yazılan medya sorgusu kurallarından çıkarılmış bildirimlerle dolu bir stil paneliniz olmayacak — Gürültü gitti! Bu - benim için - Generic First CSS tekniğinin en büyük faydalarından biridir. CSS hata ayıklama deneyimine biraz daha fazla akıl sağlığı getiriyor ve bu, altın cinsinden ağırlığına değer. Sonra teşekkür et.

Genel ilk CSS yaklaşımının krom geliştirme araçları stil panelini nasıl etkilediğinin ekran görüntüsünden önce ve sonra.
Şekil 4. Öncelikle genel, bölümlere ayrılmış css, geliştirici konsolunuza neşe ve akıl sağlığı getirmeye ne kadar yardımcı olabilir. (Büyük önizleme)

Performans Etkileri

Dolayısıyla tüm bu Genel İlk CSS faydaları kulağa oldukça iyi gelmeye başladı, ancak bence ele alınması gerektiğini düşündüğüm son bir önemli soru var. Performans optimizasyonu konusunda. Şimdi kesin olarak bilmiyorum, ancak tamamen bölümlere ayrılmış medya sorgularının küçük bir performans avantajı olabileceğine dair bir sezgim var.

Tarayıcılar, hesaplanmış stil hesaplaması adı verilen bir işleme görevi gerçekleştirir. Herhangi bir anda bir öğeye hangi stillerin uygulanması gerektiğini hesaplamanın tarayıcı yolu. Bu görev her zaman ilk sayfa yüklendiğinde gerçekleştirilir, ancak sayfa içeriği değişirse veya diğer tarayıcı eylemleri gerçekleşirse de gerçekleştirilebilir. Sürecin hızına verebileceğiniz herhangi bir destek, ilk sayfa yüklemesi için harika olacak ve web sitenizin sayfalarının yaşam döngüsü üzerinde bileşik bir etkisi olabilir.

Genel ilk CSS'ye geri dönersek: Tarayıcının çok sayıda basamaklı medya sorgusunun CSS özgüllüğünü çözmek zorunda kalmasıyla ilgili herhangi bir performans sorunu var mı?

Bunu yanıtlamak için, herhangi bir hız avantajını veya gerçekten dezavantajını ölçmek için kullanılabilecek bir test senaryosu tasarladım.

Test Vakası

Test senaryosu, 5000 kez “biyo” bloğu çıktısı veren temel bir HTML sayfasından oluşur, işaretleme her blok için aynıdır, ancak sınıflar biraz farklıdır (sayısal farklılaştırıcı), bu bloğun CSS'si de 5000 kez yazdırılır , farklı olan tek şey sınıf isimleridir. Çıktı alınan CSS, CSS MQPacker adlı bir araç aracılığıyla iletilir; bu, belirli bir medya sorgusunun tüm ayrı örneklerini tek bir örnekte birleştirerek çok sayıda satır içi medya sorgusu kullanan CSS'nin dosya boyutunu önemli ölçüde azaltmaya yardımcı olur — Bu muhtemelen fayda sağlayacak harika bir araçtır en modern CSS kod tabanları — Bunu, package.json test projelerinde bir npm görevi aracılığıyla bağımsız bir cli aracı olarak kullandım, ayrıca güzel ve kullanışlı bir postcss eklentisi olarak da kullanabilirsiniz!

İlk test senaryosu, mobil öncelikli basamaklı medya sorguları örneğidir, ikinci test senaryosu, CSS'nin genel bir birinci bölmeli varyantıdır. Bu durumlar için CSS biraz ayrıntılıdır ve muhtemelen çok daha kısa terimlerle yazılabilir, ancak gerçekten sadece argümanı test etmek için kaba bir örnek olarak hizmet eder.

Test, masaüstü Google Chrome v70'deki her CSS varyasyonu için 20 kez çalıştırıldı, çok büyük bir veri seti değil, ancak bana bir performans kazancı/kaybı hakkında kabaca bir fikir vermeye yetecek kadar.

Kullanmayı seçtiğim test metrikleri:

  • Genel sayfa yükleme süresi
    <head> bölümünün başında ve <body> bölümünün en sonundaki Performans API işaretçilerini kullanarak sayfa yükleme süresini kontrol etmek için temel bir ölçüm
  • Yeniden Hesaplama Stili
    Geliştirme araçları performans bölmesindeki zaman.
  • Genel Sayfa Oluşturma
    Geliştirme araçları performans bölmesindeki zaman.
Google Chrome performans profili oluşturucudan elde edilen sonuç tablosu
Şek.5. Ölçülmekte olan temel metrik “Stil Yeniden Hesapla” dır. (Büyük önizleme)

Sonuç Tablosu (tüm zamanlar milisaniye cinsinden)

Önce Mobil Genel İlk
Yükleme zamanı Stilleri hesapla Toplam oluşturma süresi Yükleme zamanı Stilleri hesapla Toplam oluşturma süresi
1135 565.7 1953 1196 536.9 2012
1176 563,5 1936 1116 506.9 1929
1118 563.1 1863 1148 514.4 1853
1174 568.3 1929 1124 507.1 1868
1204 577.2 1924 1115 518.4 1854
1155 554.7 1991 1177 540.8 1905
1112 554.5 1912 1111 504.3 1886
1110 557.9 1854 1104 505.3 1954
1106 544.5 1895 1148 525.4 1881
1162 559.8 1920 1095 508.9 1941
1146 545.9 1897 1115 504.4 1968
1168 566.3 1882 1112 519.8 1861
1105 542.7 1978 1121 515.7 1905
1123 566.6 1970 1090 510.7 1820
1106 514.5 1956 1127 515.2 1986
1135 575.7 1869 1130 504.2 1882
1164 545.6 2450 1169 525.6 1934
1144 565 1894 1092 516 1822
1115 554.5 1955 1091 508.9 1986
1133 554.8 2572 1001 504.5 1812
ortalama 1139.55 557.04 1980 1119.1 514.67 1903.15

Şekil 6. Önce mobilin temel yük/oluşturma metriklerini, diğeri genel ilk CSS'yi ölçen 20 test çalıştırması.

Kuşkusuz küçük veri kümemden, ilk şüphem doğru olabilir gibi görünüyor. Ortalama olarak, Stil Yeniden Hesaplama görevinin %7,6 hız artışı olan 42ms daha az zaman aldığını ve bu nedenle genel oluşturma süresinin de azaldığını görüyorum. Fark akıllara durgunluk vermiyor, ancak bir gelişme. Veri kümesinin %100 kesin olacak kadar büyük olduğunu düşünmüyorum ve test senaryosu biraz gerçekçi değil, ancak performans düşüşü görmemekten çok memnunum.

Mobil öncelikli şekilde yazılmış, gerçek dünyada var olan bir kod tabanına uygulanan genel ilk metodolojiyi görmek çok ilgimi çeker - önce-sonra metrikleri günlük pratik için çok daha gerçekçi olurdu.

Ve herhangi birinin bu testi daha geniş bir yineleme kümesi üzerinde nasıl otomatikleştireceğine dair önerileri varsa, lütfen yorumlarda bana bildirin! Bunu yapabilecek bir araç olması gerektiğini hayal ediyorum.

Çözüm

Bu yeni geliştirme metodolojisinin faydalarını özetlemek için...

  • Tam olarak amaçlandığı gibi yapan CSS, ikinci bir tahminde bulunmaz;
  • Kendi kendini belgeleyen medya sorguları;
  • Daha iyi bir geliştirme araçları deneyimi;
  • Daha hızlı işlenen sayfalar.

Bu tarzda CSS yazmayı benimseyen tek kişi olmadığımı düşünmek isterim. Genel ilk zihniyeti zaten benimsediyseniz, yaşasın! Ama değilse, sağladığı faydaları gerçekten seveceğinizi düşünüyorum. Kendi başına birçok geliştirici için büyük bir olumlu olacak olan düzenli geliştirme araçları deneyiminden kişisel olarak büyük ölçüde yararlandım. medya sorgularınızı bu şekilde yazmanın kendi kendini belgeleyen doğası, kendinize ve (eğer varsa) daha geniş takıma da fayda sağlayacaktır. Ve son olarak, bu faydaların performans açısından size hiçbir maliyeti olmayacak ve aslında marjinal hız kazanımları olduğu gösterildi!

Son söz

Tüm geliştirme metodolojileri gibi, herkes için olmayabilir, ancak Generic First CSS'ye oldukça doğal bir şekilde düştüm, şimdi bunu bana mobilin tüm avantajlarını sağlayan değerli bir çalışma yöntemi olarak görüyorum. ön uç geliştirmenin zor işi, çok az daha kolay.

Kaynaklar

Test Senaryosu Deposu

Test senaryosunu başlatmak ve kendiniz denemek isterseniz, GitHub'da bulabilirsiniz, başkalarından bazı raporlar görmeyi çok isterim.

Araçlar

  • CSS MQ Paketleyici
  • Medyayı Dahil Et