CSS daha çok statik yetenekleri olan dinamik yetenekleri olmayan bir standarttır. Son zamanlarda bu statikliğinden sıyrılıp dinamik yetenekler kazanmaya başladı. CSS artık daha dinamik bir standart.

Değişkenler yazılım dillerinden alışık olduğumuz öğelerdir. CSS Önişlemcileriyle (pre-processor) uzun zamandır değişkenleri kullanabilmekteyiz. Ancak bunların normal CSS değişkenlerine göre yetenekleri kısıtlı. Standart koyucular yani W3C CSS Variables değil de CSS Custom Properties demesinin sebepleri var. Aşağıda açıklayacağım özelliklerden dolayı bu özellik sadece bir değişken değil farklı yetenekleri olan özel bir CSS özelliğidir. Bizim alışkanlıklarımızdan dolayı CSS değişkenleri diyeceğim.

CSS değişkenlerinin avantajlarını ikiye ayırmak lazım. Genel değişken avantajları ve Önişlemcilerinin değişkenlerine göre avantajları.

Genel değişken avantajları

  • Kolay okunabilir kodlar üretmemizi sağlarlar. Örneğin #FF0000 renk tanımı ilk görünümde bir şey ifade etmez ama ana-renk tanımı daha anlamlıdır.
  • Geliştirme ve yeniden yapılandırmayı basitleştirir. Örneğin tek bir değişiklik ile sitedeki tüm renkleri değiştirme imkanımız olur.

Önişlemci değişkenlerine göre avantajları

  • Derlenmeye gerek yoktur.
  • Dinamik olarak değiştirebiliriz. Örn: Medya sorgularına göre farklı değerler tanımlanabilir.
  • DOM ve CSSOM yeteneklerinden yararlanma imkanı.
  • Kalıtsal olarak aktarılma imkanı.
  • Javascript ile erişebilme ve değiştirme imkanı.

Kalın olarak belirttiklerim hakkında aşağıda daha detaylı bilgi vereceğim. Bu güzel özelliği öğrenmeye başlayalım.

Örnek

a {
    color: #FF0000;
}

p {
    color: #FF0000;
}

div > span {
    color: #FF0000;
}

Kodumuzun farklı yerlerinde bulunan renk tanımlarımız olsun. Bu tanımları tek bir değişkene atayıp kullandığımız bu yerlerde değişkeni kullanabiliriz.

CSS değişken sözdizimi

Tanımlarken çift tire -- ile başlayan bir tanım yapılır. Değişkeni kullanırken var() şeklinde kullanılır.

:root {
    --anaRenk: #FF0000;
}

a {
    color: var(--anaRenk);
}

p {
    color: var(--anaRenk);
}

div > span {
    color: var(--anaRenk);
}  

Tüm örnekler renk üzerinden veriliyor. Düzenli tasarlanmış sitelerde yazı tipleri, yazı boyutları ve mesafe (margin, padding) değerleri değişkenlere atanabilir. Bu sayede yönetimi ve yeniden yapılandırması daha kolay bir kod yapısı elde ederiz.

CSS Önişlemcilerinin (pre-processor) değişken tanımları daha basit bence.

Değişken kapsamı

Javascript’ten alışık olduğumuz değişkenlerin etkin olduğu alanlar vardır. Tüm kodu etkileyen Genel değişkenler ve sadece belirli kod blokunu etkileyen yerel değişkenler.

:root {
    --ana-renk: #FF0000;
}

a {
    color: var(--ana-renk);
}

p {
    --ana-renk: #000000;
    color: var(--ana-renk);
}

div > span {
    color: var(--ana-renk);
}  

:root içinde tanımlanan değişkenler genel değişkenlerdir. p elementi içinde tanımlanan --ana-renk tanımı yerel bir tanımdır ve sadece bu paragrafı etkiler.

Bir not olarak :root aslında html elementine karşılık geliyor.

Kurtarma değerleri

CSS değişkenleri yeni standartlaşıyor. Bir çok tarayıcı şimdiden destekliyor. Peki desteklemeyenler için bir çözüm var mı? Evet.

a {
    color: var(--ana-renk, red);
}

Değişken tanımı içinde virgül ile ayrılan alanın sonrasındaki tanımlar CSS değişkenlerini desteklemeyen tarayıcılar içindir. Desteklemeyen tarayıcılar virgülden sonrasını yorumlayacaktır.

Dört işlem (+,-,x,/)

CSS Önişlemcilerinin yeteneklerinden birisi de dört işlemi değişkenler ile birlikte kullanabilme imkanıdır. CSS değişkenleriyle dört işlemi yapmak için calc() değerini kullanırız.

:root{
  --indent-size: 10px;

  --indent-xl: calc(2*var(--indent-size));
  --indent-l: calc(var(--indent-size) + 2px);
  --indent-s: calc(var(--indent-size) - 2px);
  --indent-xs: calc(var(--indent-size)/2);
}

Değer tanımı olmayan değişkenlerin dört işlemi çalışmıyor.

:root{
  --bosluk: 10;
}

.box{
  padding: var(--bosluk)px 0; /* çalışmaz */
  padding: calc(var(--bosluk)*1px) 0; /* çalışır */
}

Değerli vermek daha mantıklı.

DOM Yapısını kullanmak

CSS değişkenlerinin en güzel avantajlarından birisi DOM ve CSSOM yapısından yararlanıyor olmasıdır.

Bir kutumuz olsun ve bu kutudan türettiğimiz farklı çeşitleri olsun.

<div class="kutu">
  Standart kutu
</div>

<div class="kutu kirilmaz-esya-kutusu">
  Kırılmaz eşya kutusu
</div>

CSS değişkenleriyle şöyle bir şey yapabiliyoruz.

.kutu {
  --kutu-boyutu: 18px;
  font-size: var(--kutu-boyutu);
}

.kirilmaz-esya-kutusu {
  --kutu-boyutu: 34px;
}

.kutu DOM ilişkilerinden yararlanarak font-size tanımını .kirilmaz-esya-kutusu sınıfına taşıyor. .kirilmaz-esya-kutusu sınıfı da --kutu-boyutu değişkeni değerini değiştirerek uyguluyor. Gereksiz tekrarlardan kurtuluyoruz.

Süper değil mi? CSS Önişlemcileri DOM oluşmadan derlendiği için bu gibi avantajlardan yararlanamıyor.

Dinamik olarak değiştirme

CSS değişkenleri CSS Önişlemcilerinde farklı olarak statik değil dinamiklerdir. Örneğin Medya sorguları ve :hover durumunda değişebilirler.

Bir örnek ile nasıl olduğunu görelim. SASS ile bir örnek yapalım

CSS değişkenleri ile

Dinamik değişen değişkenler kod boyutumuzu azaltacaktır.

Kalıtsallık

CSS değişkenleri kalıtsaldır. Bir elemana atanmış CSS değişkeni olmayabilir ancak üst elemanına tanımlanan CSS değişkeni o elemanın etkiler. Örnek:

<div class="kap">
  <div class="eleman">
    <div class="bir"></div>
    <div class="iki"></div>
  </div>
</div>

CSS kodu:

.eleman {
  --yazi-boyutu: 24px;
  font-size: var(--yazi-boyutu);
}

.iki {
  --yazi-boyutu: 44px;
  font-size: var(--yazi-boyutu);
}
  • .eleman öğesinin 24px yazı boyutu olacak. (24px)
  • .iki öğesinin 44px yazı boyutu olacak. (44px)
  • .bir öğesine atanmış bir CSS değişkeni olmamasına karşın üst elemanı olan .eleman öğesine tanımlanmış CSS değişkeni kalıtsallık yoluyla .bir öğesi de aynı değeri taşıyacaktır. (24px)

Javascript ile CSS değişkenlerine erişim

CSS Önişlemcileriyle (pre-processor) CSS değişkenleri arasındaki en büyük fark CSS Değişkenlerine Javascript ile erişip değiştirme imkanımız vardır.

// satıriçi tanımları almak için
element.style.getPropertyValue("--my-var");

// herhangi bir elemana veya genel tanımlı değişken değerini almak için
getComputedStyle(element).getPropertyValue("--my-var");

// istediğimiz elemana atanmış değişkenin değerini değiştirmek için
element.style.setProperty("--my-var", jsVar + 4);

Performans etkisi

CSS değişkenlerinin performans olarak nasıl bir etkisinin olacağına bakıldığında önemli iki nokta var. İlki CSS kalıtsallık özelliğinin değişken tanımlanmış eleman için ve alt elemanları içinde geçerli olduğundan dolayı. Dinamik olarak değiştirilen değişken değeri tarayıcıda performans etkisine neden olacaktır.

İkinci sorun calc() içinde kullanılan değişken değerleri birimsiz olarak hesaplanması soruna neden olur. Bunun yerine ilk başta calc() ile değeri hesaplayıp değişken tanımının sonra yapılmasıdır.

Tarayıcı desteği

Tarayıcı desteği konusunda gayet güzel bir seviyede. IE11 ve Android browser’u saf dışı edenler için %100’lük bir desteği var.

Tarayıcı Desteği

Chrome explorer Firefox
+ - +

Mobil Tarayıcılar

Chrome Mobil Safari Samsung Internet
+ + +

Sonuç

CSS değişkenleri hakkında okuduğum yazılardan bir derleme yaptım. Bundan sonra CSS değişkenlerini aktif olarak kullanmak istiyorum. Kullandıkça daha güzel özellikleri ortaya çıkacaktır. Çıkan her güzelliği sizlerle paylaşacağım.

CSS Önişlemcilerini severek kullanıyoruz. Büyük boyutlu dosyalarda derlenme uzun zaman beklemelere neden oluyor. CSS Önişlemcilerinin en çok hangi özelliklerini kullanıyorum diye sorguladığımda

  • Değişkenler
  • Fonksiyonlar (mixin)
  • İç içe kullanım (nested)

İlk üç sırayı alıyor. Değişken normal CSS’e geldi. İç içe kullanım da gelse fonksiyon kullanımı çok aramam hemen normal CSS’e geçerim. JsTurk slack kanalında bu konuyu konuşurken Armağan Amcalar‘ın savunduğu noktaya geliyoruz yavaş yavaş:)

CSS geliştirici grubu çok yavaş. Çok

Kalın sağlıcakla.

Örnekler

Kaynaklar

zingat.com’da IE11 desteğini sonlandırdıktan sonra ES6’in yeniliklerinden yararlanıyoruz.

jQuery ile basit bir şekilde yaptığımız DOM’dan eleman silme işini aynı kolaylıkla ES6 ile yapıyoruz.

jQuery ile

$('.deneme').remove();

ES6 ile

let eleman = document.querySelector('#bosBeles');

eleman.remove();

Süper.

Peki siz hala IE11 destekliyorsanız size de eskiye destek için remove polyfills‘ini öneriyorum.

Tarayıcı Desteği

Chrome explorer Firefox
+ - +

Mobil Tarayıcılar

Chrome Mobil Safari Samsung Internet
+ + +

Kalın sağlıcakla.

İnternet tarayıcıları web geliştiricileri için önemli programlardır. Kullanım oranları, neleri destekleyip neleri desteklemedikleri, birbirleri arasındaki farklar bizim için önemlidir. Senelerce Internet Explorer 6 ile uğraştıktan sonra sırası ile ie8, ie9, ie10 ve son olarak ie11 ile uğraştık. Mobil, hayatımızda öncelikli olmaya başladıktan sonra sorun yaşadığımız tarayıcılar değişti. Artık iOS Safari veya Samsung Internet ile sorun yaşıyoruz.

Tarayıcı dünyasını ayıran önemli özellik: Otomatik güncelleme özelliği, tarayıcıların kullanıcı veya işletim sisteminin yenilenmesi beklmeden kendi kendini güncellemesi.

  • Otomatik güncellenen tarayıcılar: Chrome, Opera, Firefox, Microsoft Edge, Android Webview
  • Otomatik güncellenmeyen tarayıcılar: Safari, Samsung Internet, Internet Explorer ve Android Browser

Hızlı güncellenen standartlar karşısından tarayıcının hızlı güncelleniyor olması önemli bir özellik.

ie11 son

Geçen hafta zingat.com‘da Internet Explorer’ın tüm sürümlerine desteği sonlandırdık. Bu sayede birçok avantajı geliştiriciler olarak elde ettik. Destek verdiğimiz tarayıcı listesinde otomatik güncellenmeyen iki tarayıcı kaldı. Mobil Safari ve Samsung Internet.

Mobil dünyadaki bu iki tarayıcının bizim sitedeki kullanı oranı:

  • Mobil Safari %20
  • Samsung Internet %6.7

Toplamda %27’lik bir kullanıcı kitlesi otomatik güncellemeden uzak. Burada Mobil Safari’yi bir kenera ayırmak gerekiyor. Mobil Safari her sistem güncellemesiyle güncelleniyor. iPhone kullanıcılarının güncellemeleri yükleme hızı gayet iyi. Bizim siteden takip ettiğim kadarıyla yeni sürüme geçiş 3 aylık bir zaman alıyor. Buradaki sıkıntı Safari’nin daha doğru ifade ile Webkit’in yenilikleri biraz geriden takip ediyor olması.

Samsung Internet Chrome (Blink) alt yapısını kullanıyor. Bu güzel bir gelişme olsa da güncelleme sıklığı konusunda sorunlu olduğunu belirtmeliyim.

Yeni gelen her özelliğin tarayıcılar tarafından desteklenme oranını takip etmeye yani caniuse kullanmaya devam.

Son bir not eski Internet Explorer 6 günlerine göre çok iyi durumdayız, ama her zaman daha iyisi aramamız gerekiyor.

Kalın sağlıcakla.