Stil Sorgularına Başlarken

Bir üst öğenin satır içi boyutunu ve kapsayıcı sorgu birimi değerlerini sorgulama olanağı kısa süre önce tüm modern tarayıcı motorlarında istikrarlı bir desteğe ulaştı.

Tarayıcı Desteği

  • Chrome: 105..
  • Kenar: 105..
  • Firefox: 110..
  • Safari: 16..

Kaynak

Bununla birlikte, sınırlama spesifikasyonu sadece boyut sorgularından ibaret değildir; aynı zamanda üst öğenin stil değerlerinin sorgulanmasını da sağlar. Chromium 111'den itibaren, özel özellik değerleri için stil içerme uygulayabilecek ve özel bir özelliğin değeri için üst öğeyi sorgulayabileceksiniz.

Tarayıcı Desteği

  • Chrome: 111..
  • Kenar: 111..
  • Firefox: Desteklenmez..
  • Safari: 18..

Kaynak

Bu da CSS'deki stiller üzerinde daha fazla mantıksal kontrol gerçekleştirdiğimiz ve bir uygulamanın mantığı ile veri katmanının stillerinden daha iyi ayrılması anlamına gelir.

Boyut ve stil sorgularını kapsayan CSS Kapsam Modülü Düzey 3 spesifikasyonu, font-weight: 800 gibi özellik ve değer çiftleri dahil olmak üzere tüm stillerin bir üst öğeden sorgulanmasına olanak tanır. Ancak bu özelliğin kullanıma sunulmasında stil sorguları şu anda yalnızca CSS özel mülk değerleriyle çalışmaktadır. Bu, stilleri birleştirmek ve verileri tasarımdan ayırmak açısından yine de çok yararlıdır. Stil sorgularını CSS özel özellikleriyle nasıl kullandığınıza bakalım:

Stil sorgularını kullanmaya başlama

Aşağıdaki HTML'ye sahip olduğumuzu varsayalım:

<ul class="card-list">
  <li class="card-container">
    <div class="card">
      ...
    </div>
  </li>
</ul>

Stil sorguları kullanmak için önce bir kapsayıcı öğe ayarlamanız gerekir. Bu, doğrudan veya dolaylı bir üst öğeyi sorguladığınıza bağlı olarak biraz farklı bir yaklaşım gerektirir.

Doğrudan ebeveynlerle ilgili sorgular

Stil sorgusunun şeması.

Stil sorgularının aksine, .card doğrudan üst öğesinin stillerini sorgulayabilmesi için .card-container öğesine container-type veya container özelliğini kullanarak kapsam uygulamanız gerekmez. Bununla birlikte, stilleri (bu örnekte özel özellik değerleri) bir kapsayıcıya (bu örnekte .card-container) veya DOM'de stilini oluşturmakta olduğumuz öğeyi içeren herhangi bir öğeye uygulamamız gerekir. Sonsuz döngülere neden olabileceği için, sorguladığımız stilleri bu sorguyu kullanarak biçimlendirdiğimiz doğrudan öğeye uygulayamayız.

Bir üst yayıncıyı doğrudan sorgulamak için şunları yazabilirsiniz:

/* styling .card based on the value of --theme on .card-container */
@container style(--theme: warm) {
  .card {
    background-color: wheat;
    border-color: brown; 
    ...
  }
}

Stil sorgusunun sorguyu style() ile sarmaladığını fark etmiş olabilirsiniz. Böylece, beden değerlerini stillerden netleştirebilir. Örneğin, @container (min-width: 200px) { … } olarak kapsayıcının genişliği için bir sorgu yazabilirsiniz. Üst kapsayıcı en az 200 piksel genişliğindeyse stiller uygulanır. Ancak min-width, bir CSS mülkü de olabilir ve stil sorguları kullanarak min-width öğesinin CSS değerini sorgulayabilirsiniz. Bu yüzden farkı netleştirmek için style() sarmalayıcıyı kullanırsınız: @container style(min-width: 200px) { … }.

Doğrudan olmayan ebeveynlerin stilini belirleme

Doğrudan üst öğe olmayan herhangi bir öğenin stillerini sorgulamak isterseniz bu öğeye bir container-name vermeniz gerekir. Örneğin, .card-list öğesine bir container-name verip stil sorgusunda bu ayarı referans alarak .card öğesine .card-list stillerine göre stil uygulayabiliriz.

/* styling .card based on the value of --moreGlobalVar on .card-list */
@container cards style(--moreGlobalVar: value) {
  .card {
    ...
  }
}

Sorguladığınız şeyleri netleştirmek ve bu kapsayıcılara daha kolay erişme olanağının kilidini açmak için kapsayıcılarınıza ad vermek genellikle en iyi uygulamadır. Bunun pratik olduğu bir örnek olarak, doğrudan .card içindeki öğelerin stilini belirlemek istiyorsanız bunu yapabilirsiniz. .card-container üzerinde adlandırılmış bir kapsayıcı olmadan kapsayıcıyı doğrudan sorgulayamazlar.

Ancak tüm bunlar pratikte çok daha mantıklı. Bazı örneklere bir göz atalım:

Uygulama sırasında sorguların stilini belirleyin

Bazıları &quot;yeni&quot; veya &quot;düşük stok&quot; etiketine sahip birden fazla ürün kartının ve arka planı kırmızı olan &quot;düşük stok&quot; kartının yer aldığı demo resim.

Stil sorguları, birden çok varyasyon içeren yeniden kullanılabilir bir bileşeniniz olduğunda veya stillerinizin tümü üzerinde kontrolünüz olmadığı halde belirli durumlarda değişiklikler uygulamanız gerektiğinde özellikle yararlıdır. Bu örnekte, aynı kart bileşenini paylaşan bir dizi ürün kartı gösterilmektedir. Bazı ürün kartlarında, --detail adlı özel bir özellik tarafından tetiklenen "Yeni" veya "Düşük Stok" gibi ek ayrıntılar/notlar bulunur. Ayrıca "Düşük Stok"ta olan ürünlerin arka planı koyu kırmızı olur. Bu tür bilgiler büyük olasılıkla sunucu tarafından oluşturulur ve kartlara aşağıdakiler gibi satır içi stillerle uygulanabilir:

 <div class="product-list">
  <div class="product-card-container" style="--detail: new">
    <div class="product-card">
      <div class="media">
        <img .../>
      <div class="comment-block"></div>
    </div>
  </div>
  <div class="meta">
    ...
  </div>
  </div>
  <div class="product-card-container" style="--detail: low-stock">
    ...
  </div>
  <div class="product-card-container">
    ...
  </div>
  ...
</div>

Bu yapılandırılmış verileri kullanarak değerleri --detail öğesine iletebilir ve stilleri uygulamak için bu CSS özel özelliğini kullanabilirsiniz:

@container style(--detail: new) {
  .comment-block {
    display: block;
  }
  
  .comment-block::after {
    content: 'New';
    border: 1px solid currentColor;
    background: white;
    ...
  }
}

@container style(--detail: low-stock) {
  .comment-block {
    display: block;
  }
  
  .comment-block::after {
    content: 'Low Stock';
    border: 1px solid currentColor;
    background: white;
    ...
  }
  
  .media-img {
    border: 2px solid brickred;
  }
}

Yukarıdaki kod, --detail: low-stock ve --detail: new için çip uygulamamıza olanak tanır, ancak kod bloğunda bazı gereksizler fark etmiş olabilirsiniz. Şu anda @container style(--detail) ile yalnızca --detail özelliğinin varlığını sorgulamanın bir yolu yoktur. Bu sayede stilleri daha iyi paylaşabilir ve tekrarı daha az görüntüleyebilirsiniz. Bu özellik şu anda çalışma grubunda tartışma aşamasındadır.

Hava durumu kartları

Önceki örnekte, stilleri uygulamak için birden çok olası değere sahip tek bir özel mülk kullanılıyordu. Ancak, birden fazla özel özellik kullanarak ve sorgulayarak da bunları karıştırabilirsiniz. Şu hava durumu kartı örneğini ele alalım:

Hava durumu kartları demosu.

Bu kartların arka plan gradyanlarını ve simgelerini şekillendirmek için "bulutlu", "yağmurlu" veya "güneşli" gibi hava durumu özelliklerini arayın:

@container style(--sunny: true) {
  .weather-card {
    background: linear-gradient(-30deg, yellow, orange);
  }
  
  .weather-card:after {
    content: url(<data-uri-for-demo-brevity>);
    background: gold;
  }
}

Bu şekilde, her bir kartı benzersiz özelliklerine göre biçimlendirebilirsiniz. Ancak, medya sorguları ile aynı şekilde and birleştiricisini kullanarak karakteristik (özel mülk) kombinasyonları için de stil belirleyebilirsiniz. Örneğin, hem bulutlu hem de güneşli bir gün şu şekilde görünür:

@container style(--sunny: true) and style(--cloudy: true) {
    .weather-card {
      background: linear-gradient(24deg, pink, violet);
    }
  
  .weather-card:after {
      content: url(<data-uri-for-demo-brevity>);
      background: violet;
  }
}

Verileri tasarımdan ayırma

Her iki demoda da veri katmanını (sayfada oluşturulacak DOM) uygulanan stillerden ayırmanın yapısal bir avantajı vardır. Stiller, bileşen stilinde bulunan olası varyantlar olarak yazılır. Bir uç nokta ise bileşenin stilini belirlemek için kullanacağı verileri gönderebilir. İlk durumda --detail değerini güncelleme gibi tek bir değer veya ikinci örnekte olduğu gibi birden çok değişken kullanabilirsiniz (--rainy, --cloudy ya da --sunny şeklinde ayarlanır). İşin en iyi yanı da bu değerleri birleştirebilmenizdir. Hem --sunny hem de --cloudy değerlerini kontrol ederek parçalı bulutlu bir stil görebilirsiniz.

Özel özellik değerlerini JavaScript aracılığıyla güncelleme işlemi, DOM modeli ayarlanırken (ör. bir çerçevede bileşeni oluştururken) sorunsuz bir şekilde yapılabilir veya <parentElem>.style.setProperty('--myProperty’, <value>) kullanılarak her zaman güncellenebilir. I

Aşağıdaki demoda, birkaç satır kodla bir düğmenin --theme özelliğini güncelleyip stil sorgularını ve bu özel özelliği (--theme) kullanarak stilleri uygulayabilirsiniz:

Stil sorguları kullanarak kartı biçimlendirin. Özel özellik değerlerini güncellemek için kullanılan JavaScript şu şekildedir:

const themePicker = document.querySelector('#theme-picker')
const btnParent = document.querySelector('.btn-section');

themePicker.addEventListener('input', (e) => {
  btnParent.style.setProperty('--theme', e.target.value);
})

Bu makalede açıklanan özellikler sadece başlangıçtır. Kapsayıcı sorguları, dinamik ve duyarlı arayüzler oluşturmanıza yardımcı olacak daha fazla özellik sunar. Özellikle stil sorgularına gelince, hâlâ birkaç açık sorun vardır. Bunlardan biri, özel özelliklerin ötesinde CSS stilleri için stil sorgularının uygulanmasıdır. Bu, mevcut spesifikasyon düzeyinin bir parçasıdır, ancak henüz hiçbir tarayıcıda uygulanmamıştır. Boole bağlam değerlendirmesinin, bekleyen sorun çözüldüğünde geçerli spesifikasyon düzeyine eklenmesi beklenirken spesifikasyonun bir sonraki düzeyi için aralık sorgulamasının yapılması planlanmaktadır.