5 puan yazan GN⁺ 2024-10-11 | Henüz yorum yok. | WhatsApp'ta paylaş
  • CSS iç içe geçirme (CSS Nesting) spesifikasyonuna CSSNestedDeclarations arayüzü eklendi ve iç içe geçirmeden kaynaklanan sorunlar çözüldü
  • Bunun dışında, stil kurallarından sonra gelen bildirimlerin artık yukarı taşınmaması gibi iyileştirmeler de var
  • Chrome 130, Firefox Nightly 132 ve Safari Technology Preview 204 sürümlerinden itibaren uygulanıyor

CSSNestedDeclarations kullanıma girmeden önceki CSS iç içe geçirme sorunları

  • İç içe bildirimlerin beklenmedik şekilde çalıştığı bir sorun vardı
.foo {  
  width: fit-content;  
  @media screen {  
    background-color: red;  
  }  
  background-color: green;  
}  
  • Chrome 130 öncesi sürümlerde background-color, green yerine red olarak uygulanıyordu
  • Parse işleminden sonra gerçekten uygulanan kural aşağıdaki gibi değişiyordu
.foo {  
  width: fit-content;  
  background-color: green;  
  @media screen {  
    & {  
      background-color: red;  
    }  
  }  
}  
  • background-color: green;, diğer bildirimlerle birlikte yukarı taşınıyor ve iç içe CSSMediaRule, & seçicisini kullanan ek bir CSSStyleRule içine sarılıyordu
  • Bunun nedeni, CSS motorunun stil kuralının başında görünen özelliklerle diğer kurallar arasında görünen özellikleri ayırt edememesiydi

Çözüm - CSSNestedDeclarations arayüzünün eklenmesi

  • CSS çalışma grubu bunu çözmek için iç içe bildirim kuralını (nested declarations rule) getirdi
  • Chrome 130'dan itibaren art arda gelen iç içe bildirimler otomatik olarak CSSNestedDeclarations örneği içinde sarılıyor
  • Bu sayede background-color: green bildiriminin konumu, background-color: red bildiriminden sonra korunabiliyor
  • CSSNestedDeclarations, üst stil kuralıyla aynı öğe ve pseudo-element'lerle eşleşiyor ve specificity davranışı da aynı oluyor

Geliştiricilere etkisi

  • Chrome 130 ile birlikte CSS iç içe geçirme önemli ölçüde iyileşti
  • Ancak bildirimler ile iç içe kurallar birlikte kullanıldıysa kodu düzeltmek gerekebilir
/* Chrome 130'da çalışmaz */  
#mypopover:popover-open {  
  @starting-style {  
    opacity: 0;  
    scale: 0.5;   
  }  
  opacity: 1;  
  scale: 1;  
}  
  • Bu kodda @starting-style bildirimi, CSSNestedDeclarations içindeki bildirimler tarafından ezildiği için giriş animasyonu kaldırılıyor
  • Aşağıdaki gibi düzeltilmeli
/* Chrome 130'da çalışır */  
#mypopover:popover-open {  
  opacity: 1;  
  scale: 1;  
  @starting-style {  
    opacity: 0;  
    scale: 0.5;  
  }  
}  
  • CSS iç içe geçirme kullanırken iç içe bildirimleri iç içe kuralların üstüne koymak, çoğu tarayıcı sürümünde sorunsuz çalışır

CSSNestedDeclarations özellik tespiti

if (!("CSSNestedDeclarations" in self && "style" in CSSNestedDeclarations.prototype)) {  
  // CSSNestedDeclarations desteklenmiyor  
}  

GN⁺ görüşü

  • CSS iç içe geçirme, kodun okunabilirliğini ve bakımını kolaylaştıran faydalı bir özellik. Ancak iç içe kurallar ile bildirimlerin birlikte kullanılmasından doğan sorunlar vardı; CSSNestedDeclarations ile bunun çözülmesi sevindirici.
  • CSSNestedDeclarations gelmeden önce iç içe bildirimlerin konumu değişebiliyor veya beklenmedik şekilde ezilebiliyordu. Bu durum geliştiriciler için kafa karıştırıcı olabiliyordu.
  • @nest kuralını kullanmak ya da iç içe bildirimleri CSSStyleRule ile sarmak gibi başka çözümler de değerlendirildi, ancak geliştirici deneyimini kötüleştirme gibi nedenlerle benimsenmedi. İç içe bildirim kuralının eklenmesi en uygun çözüm gibi görünüyor.
  • Yine de CSSNestedDeclarations henüz yalnızca bazı tarayıcılarda desteklendiği için, çapraz tarayıcı uyumluluğu açısından iç içe bildirimleri her zaman iç içe kuralların üstüne koymak daha güvenli görünüyor.
  • PostCSS, Sass gibi CSS önişleyicileri de CSSNestedDeclarations benzeri işlevler sunuyor. Önişleyici kullanıyorsanız bu özelliklerden yararlanabilirsiniz.

Henüz yorum yok.

Henüz yorum yok.