CSS filtre efektlerini anlama

Alex Danilo

Giriş

Filtreler, web yazarlarının ilginç görsel efektler elde etmek için kullanabileceği güçlü bir araçtır. Bu makalede, filtre efektlerinin geçmişi, ne işe yaradığı ve nasıl kullanılacağı ele alınmaktadır. CSS için tanımlanmış tüm önceden tanımlanmış filtrelerin örneklerini birkaç örnekle ele alacağız. Filtrelerin hız etkisinin bilinmesi, iyi bir kullanıcı deneyimi açısından önemli olduğundan, filtreleri masaüstü ve mobil cihazlarda kullanırken performansla ilgili dikkat edilmesi gereken noktaları da ele alacağız. Son olarak, modern tarayıcılardaki mevcut uygulama durumunu gözden geçireceğiz.

Filtre efektlerinin geçmişi, bugünü ve geleceği

Filtre efektleri, Ölçeklenebilir Vektör Grafikleri (SVG) spesifikasyonunun bir parçası olarak oluşturulmuştur. Bu resimler, bir vektör çizimine piksel tabanlı çeşitli resim efektleri uygulamak için oluşturulmuştur. Tarayıcı satıcıları zamanla tarayıcılarına SVG özelliklerini ekledikçe filtrelerin faydaları belirginleşti. Mozilla'dan Robert O’Callahan, CSS'yi "normal" HTML içeriğine uygulayarak SVG filtrelerini kullanma mükemmel bir fikri buldu. Robert, filtre ve CSS stili kombinasyonunun ne kadar güçlü olabileceğini gösteren ilk sürümün prototipini oluşturdu. W3C'deki CSS ve SVG çalışma grupları, CSS stili aracılığıyla hem HTML hem de SVG filtrelerinin kullanımını uyumlu hale getirmeye karar vermiştir. Böylece CSS'nin "filter" (filtre) özelliği ortaya çıkmıştır. Şu anda CSS ve SVG üzerinde çalışan kişilerin ortak görev gücü, filtreleri evrensel olarak kullanışlı hale getirmek için bir sürü iş yapıyor. Tüm bunlarla ilgili geçerli spesifikasyonları burada bulabilirsiniz.

"Filtre" CSS mülkü için yeni bir hayat

Deja Vu bazen CSS stillerinde "filtre" ifadesini gördüğünde bir web geliştiricisini fark ediyor. Bunun nedeni, Internet Explorer'ın eski sürümlerinde platforma özgü bazı işlevleri yerine getirmek için CSS aracılığıyla açığa çıkan bir "filtre" özelliğine sahip olmasıdır. Bu özellik kullanımdan kaldırılmıştır ve yerini artık CSS3'ün bir parçası olan standart "filter" özelliğini kullanıma sunmuştur. Dolayısıyla, bazı eski web sayfalarında "filtre" ifadesini gördüğünüzde kafanızın karışmasına gerek yoktur. İşlemin tamamı yeni "filter" özelliğindedir ve IE'nin yeni sürümleri, bu özelliği tüm modern tarayıcılarla aynı şekilde uygulamaktadır.

Filtrelerin işleyişi

Peki, filtre tam olarak ne yapar? Bir filtreyi kullanmanın en kolay yolu, tüm sayfa içeriğiniz yerleştirilip çizildikten sonra sihirli bir şey yapan bir son işleme adımıdır.

Tarayıcının bir web sayfası yüklediğinde stilleri uygulaması, düzen gerçekleştirmesi ve ardından bakılacak bir şey olması için sayfayı oluşturması gerekir. Filtreler, tüm bu adımlardan sonra ve sayfa ekrana kopyalanmadan hemen önce etkinleşir. Oluşturulan sayfanın anlık görüntüsünü bit eşlem resmi olarak alırlar, ardından anlık görüntüdeki piksellerde grafik oluşturma büyüsü gerçekleştirir ve ardından sonucu orijinal sayfa resminin üzerine çizirler. Bunları, kamera lensinin ön tarafına yerleştirilmiş bir filtre gibi düşünebilirsiniz. Mercekten gördükleriniz, filtrenin etkisiyle değiştirilen dış dünyadır.

Bu elbette, filtreleri olan bir sayfa çizerken zaman harcandığı ancak bu filtreleri düzgün kullanmanın sitenizin hızı üzerindeki etkisinin minimum düzeyde olacağı anlamına gelir.

Ayrıca, fotoğraf makinenizin lensinde çeşitli filtreleri önlerine yığabileceğiniz gibi, her tür efekt elde etmek için art arda isteğe bağlı sayıda filtre uygulayabilirsiniz.

SVG ve CSS kullanılarak tanımlanan filtreler

Filtreler orijinal olarak SVG'den geldiği için bunları tanımlamanın ve kullanmanın farklı yolları vardır. SVG'nin kendisi, XML söz dizimini kullanarak çeşitli filtre efektlerinin tanımlarını özetleyen bir <filter> öğesine sahiptir. CSS tarafından tanımlanan filtre grubu aynı grafik modelinden yararlanır, ancak stil sayfasında kullanımı kolay olan çok daha basit tanımlardır.

CSS filtrelerinin çoğu SVG filtreleriyle ifade edilebilir. CSS, isterseniz SVG'de belirtilen bir filtreye referans vermenize de olanak tanır. CSS filtre tasarımcıları, web yazarlarının filtre uygulamasını kolaylaştırmak için büyük çaba sarf ettiler. Dolayısıyla, bu makalede şimdilik SVG tanımlarını yok sayarak yalnızca doğrudan CSS'den kullanılabilen filtreler ele alınacaktır.

CSS filtresi uygulama

CSS'deki filtrelerin kullanımı, web sayfanızdaki görünür öğelere uygulanan "filtre" özelliği kullanılarak yapılır. Çok basit bir örnek olarak,

div { { % mixin filter: grayscale(100%); % } }

Bu da sayfadaki tüm <div>öğelerinin içindeki içeriğin griye dönmesini sağlar. Sayfanızın 1940'lardan kalma bir TV resmi gibi görünmesini sağlamak için idealdir.

Orijinal resim.
Orijinal resim.
Gri tonlamalı filtrelenmiş resim.
Gri tonlamalı filtrelenmiş görüntü.

Çoğu filtre, ne kadar filtrelemenin yapıldığını kontrol etmek için bir tür parametre kullanır. Örneğin, içeriğinizi orijinal rengiyle gri tonlamalı versiyonun yarısı arasında olacak şekilde biçimlendirmek istiyorsanız, şu şekilde yapabilirsiniz:

div { { % mixin filter: grayscale(50%); % } }
Orijinal resim yukarıda, %50 gri filtreli.
Yukarıda orijinal resim, %50'si gri filtre uygulanmış.

Bir dizi farklı filtreyi arka arkaya uygulamak isterseniz bunu kolayca yapabilirsiniz. Filtreleri CSS'nize şu şekilde sıralayın:

div { { % mixin filter: grayscale(100%) sepia(100%); % } }

Bu örnek, önce orijinal rengin tamamını gri tonlamalı hale getirecek ve ardından bir sepya efekti uygulayacak ve sonuç şu şekilde olacaktır:

Sepya efekti

Filtreleri art arda uygulama esnekliği sayesinde, her türlü efekt elde edilebilir. Mükemmel sonuçlar elde etmek için denemeler yapmak tamamen hayal gücünüze kalmıştır.

CSS ile kullanılabilen filtre efektleri

Dolayısıyla, orijinal SVG filtre mekanizması hem güçlüdür hem de kullanımı göz korkutucu olabilir. Bu nedenle CSS, bunların kullanımını gerçekten kolaylaştıran birçok standart filtre efekti sunar.

Şimdi her birine tek tek göz atalım ve ne yaptıklarına bakalım.

gri tonlama(miktar)
Bu işlem, giriş resmimizdeki rengi gri tonuna dönüştürür. Uygulanan "tutar", ne kadar gri dönüşümün uygulandığını kontrol eder. %100 ise her şey gri tonuyla gösterilir. %0 ise renkler değişmez. Yüzde yerine tercih ettiğiniz bir kayan nokta sayısını burada kullanabilirsiniz. Yani 0, %0 ile aynı işlevi görürken 1,0 %100 ile aynı şekilde çalışır.
Orijinal
Orijinal
gri tonlama (%100)
gri tonlama(%100)
sepya(miktar)
Bu model, eski fotoğraflarda olduğu gibi sepya tonunda geçirilen renklerin verilmesini sağlar. Uygulanan "tutar", "gri tonlama" filtresiyle aynı şekilde çalışır. Yani% 100, tüm renklerin tamamen sepya tonlu olmasını sağlar ve daha küçük değerler, efektin daha küçük oranlarda uygulanmasına olanak tanır.
Orijinal
Orijinal
sepya(%100)
sepya(%100)
doygunluk(tutar)
Bu özellik, renklere renk doygunluğu efekti uygulayarak renklerin daha canlı görünmesini sağlar. Fotoğrafların poster veya çizgi film gibi görünmesini sağlayan hoş bir efekttir.Bu efekt, doygunluğu gerçekten vurgulamak için% 100'den büyük bir değer kullanmanıza da olanak tanır. Kesinlikle tuhaf görünen bir efekt var!
Orijinal
Orijinal
doygun(10)
saturate(10)
tonu-döndür(açı)
Bu, ilginç sonuçlar için kullanılabilecek bir renk meraklısı efekti. Renkleri değiştirerek giriş resminin tamamen farklı görünmesini sağlar. Bir renk çemberi etrafında kırmızıdan menekşeye giden bir renk spektrumunun olduğunu hayal edebiliyorsanız, bu efekt tekerlek üzerindeki orijinal rengi girdi olarak alır ve "angle" parametresine göre döndürerek, çıktı rengi değeri olarak döndürüldüğü tekerlek üzerindeki rengi oluşturur. Böylece resimdeki tüm renkler, tekerlek üzerinde aynı "açı" tarafından kaydırılır. Bu, elbette işlevin daha basit bir halidir. Yine de anlamlı bir sonuç vereceğini umuyoruz.
Orijinal
Orijinal
ton-döndürme(90 derece)
toplantıyı döndür(90deg)
ters çevir(tutar)
Bu efekt renkleri çevirir. Yani "tutar" %100 uygulandığında ortaya çıkan sonuç, kameraların eski film günlerinde çekilmiş bir fotoğraf negatifi gibi görünür. Daha önce olduğu gibi, %100'den küçük değerler kullanıldığında ters çevirme efekti kademeli olarak uygulanır.
Orijinal
Orijinal
ters çevir(%100)
invert(%100)
opaklık(miktar)
Filtrelenen içeriğin yarı şeffaf görünmesini istiyorsanız bu uygulama tam size göre. "amount" [tutar] değeri, çıktının ne kadar opak olacağını tanımlar. %100 değeri tamamen opak olduğundan çıkış, girişle tam olarak aynı olur. Değer% 100'ün altına düştüğünde, çıktı görüntüsü daha az opak (daha şeffaf) hale gelir ve bu resmin giderek daha azını görürsünüz. Bu elbette, sayfa üzerinde başka bir şeyle çakıştığında, altındaki öğelerin görünmeye başlayacağı anlamına gelir. %0'lık bir "amount" (tutar) değeri, öğenin tamamen kaybolacağı anlamına gelir. Ancak, fare tıklamaları gibi etkinliklerin tamamen şeffaf nesnelerde gerçekleşmeye devam edebileceğini unutmayın. Bu nedenle, hiçbir şey görüntülemeden tıklanabilir alanlar oluşturmak istiyorsanız bu özellik kullanışlıdır.

Bu, bildiğiniz "opacity" özelliği ile aynı şekilde çalışır. Genel olarak CSS "opaklığı" özelliği donanım hızlandırmalı değildir, ancak donanım hızlandırmayı kullanarak filtre uygulayan bazı tarayıcılar çok daha iyi performans için opaklığın filtre sürümünü hızlandırır.

Orijinal
Orijinal
opaklık(%50)
opaklık(%50)
parlaklık(miktar)
Bu işlev, tıpkı TV'nizdeki parlaklık kontrolü gibidir. Tamamen siyah ile orijinal renk arasındaki renkleri "amount" parametresiyle orantılı olarak ayarlar. Bunu% 0'a ayarlarsanız siyahtan başka bir şey görmezsiniz, ancak değer% 100'e doğru yükseldikçe, giriş resmiyle aynı olduğu yerde% 100'e ulaşana kadar, orijinal resmin giderek daha fazla aydınlandığını görürsünüz. Elbette bu şekilde devam edebilirsiniz. Böylece% 200 gibi bir ayarı orijinalinden iki kat daha fazla parlaklık resmi elde edersiniz. Bu da düşük ışıkta çekimleri ayarlamak için harika bir yöntem!
Orijinal
Orijinal
parlaklık(%140)
parlaklık(%140)
kontrast(tutar)
TV setinizden daha fazla kontrol! Bu işlem, giriş görüntüsünün en koyu ve en açık kısımları arasındaki farkı ayarlar. %0'ı kullanırsanız "parlaklık"ta olduğu gibi siyah sonucunu elde edersiniz, bu nedenle fazla ilgi çekici olmaz. Ancak, değeri% 100'e doğru artırdıkça, %100'e ulaşana ve tekrar orijinal resim haline gelene kadar koyuluktaki fark değişir. Bu efekt için% 100'ün üzerine çıkabileceğinizi de belirleyebilirsiniz. Bu durumda açık ve koyu renkler arasındaki fark daha da artar.
Orijinal
Orijinal
kontrast(%200)
kontrast(%200)
bulanıklaştırma(yarıçap)
İçeriğinize yumuşak bir hava eklemek istiyorsanız bulanıklaştırma ekleyebilirsiniz. Bu, eskiden popüler bir film yapım tekniği olan cam levha üzerindeki klasik Vazelin'e benziyor. Tıpkı gözlerin odaklanmadığı gibi tüm renkleri birlikte bulaştırır ve etkilerini yayır. "Radius" parametresi ekrandaki kaç pikselin birbiriyle karıştığını etkiler. Dolayısıyla, daha büyük bir değer daha fazla bulanıklık oluşturur. Sıfır ise resim değişmez.
Orijinal
Orijinal
bulanıklaştırma(10 piksel)
bulanık(10px)
drop-shadow(shadow)
İçeriklerinizi, arkadaki zemine gölge eklenmiş güneşin altındaymış gibi göstermek çok güzel. Tabii ki "gölge" de bunu yapar. Resmin anlık görüntüsünü alır, resmi tek bir renk yapar, bulanıklaştırır, ardından sonucu belirli bir ölçüde kaydırır ve orijinal içeriğin gölgesi gibi görünür. İletilen "shadow" parametresi, tek bir değerden biraz daha karmaşıktır. Boşlukla ayrılmış bir değerler dizisidir ve bazı değerler isteğe bağlıdır. "Gölge" değerleri, gölgenin yerleştirildiği yeri, ne kadar bulanıklaştırma uygulanacağını, gölgenin rengini vb. kontrol eder. "gölge" değerlerinin işleviyle ilgili tüm ayrıntılar için CSS3 Arka Planları spesifikasyonunda "kutu gölgesi" özelliği ayrıntılı şekilde tanımlanır. Aşağıdaki birkaç örneği inceleyerek farklı olasılıkların neler olduğuna dair iyi bir fikir edinebilirsiniz.
drop-shadow(16 piksel 16 piksel 20 piksel siyah
drop-shadow(16 piksel 16 piksel 20 piksel siyah)
drop-shadow(10px -16px 30px mor)
drop-shadow(10px -16px 30px mor)

Bu, "box-shadow" özelliği üzerinden kullanılabilen mevcut CSS işlevine benzeyen başka bir filtreleme işlemidir. Filtre yaklaşımının kullanılması, yukarıda "opaklık" işlemi için açıkladığımız gibi, donanımın bazı tarayıcılar tarafından hızlandırılabileceği anlamına gelir.

SVG filtrelerine referans veren URL
Filtreler SVG'nin bir parçası olarak oluşturulduğundan, içeriğinizi bir SVG filtresi kullanarak biçimlendirebilmeniz mantıklıdır. Mevcut "filtre" mülk teklifiyle bu işlemi kolayca gerçekleştirebilirsiniz. SVG'deki tüm filtreler, filtre efektine referans vermek için kullanılabilecek bir "id" özelliğiyle tanımlanır. Dolayısıyla, CSS'den herhangi bir SVG filtresini kullanmak için tek yapmanız gereken "url" söz dizimini kullanarak filtreye referans vermektir.

Örneğin, bir filtrenin SVG işaretlemesi aşağıdaki gibi olabilir:

<filter id="foo">...</filter>

CSS'den şu gibi basit bir işlem yapabilirsiniz:

div { { % mixin filter: url(#foo); % } }

ve işte oldu! Dokümanınızdaki tüm <div> öğeleri, SVG filtre tanımlarıyla şekillendirilir.

özel (çok yakında)
Yakında özel filtreler kullanıma sunulacak. Bunlar, özel gölgelendirme dili kullanarak yalnızca kendi hayal gücünüzle sınırlı harika efektler oluşturmak için grafik GPU'nuzun gücünden yararlanır. "Filtre" spesifikasyonunun bu bölümü hâlâ tartışılıyor ve değişmeye devam ediyor. Ancak, bu özellik yakınınızdaki bir tarayıcıya gelmeye başlar başlamaz, nelerin mümkün olduğu hakkında daha fazla bilgi vereceğimizden emin olabilirsiniz.

Performansla ilgili konular

Her web geliştiricisinin önem verdiği bir konu da web sayfasının veya uygulamasının performansıdır. CSS filtreleri, görsel efektler için güçlü bir araçtır, ancak aynı zamanda sitenizin performansını da etkileyebilir.

Ne işe yaradığını ve bunun performansı nasıl etkilediğini anlamak, özellikle de sitenizin CSS filtrelerini destekleyen mobil cihazlarda iyi çalışmasını istiyorsanız önemlidir.

Öncelikle, tüm filtreler eşit değildir! Aslında çoğu filtre, tüm platformlarda çok hızlı çalışır ve performans üzerindeki etkisi çok azdır. Ancak, herhangi bir bulanıklaştırma işlemi gerçekleştiren filtreler diğerlerinden daha yavaş olma eğilimindedir. Bu elbette "bulanıklaştırma" ve "gölgeleme" anlamına gelir. Bu, bunları kullanmamanız gerektiği anlamına gelmez ancak nasıl çalıştıklarını anlamanız yararlı olabilir.

blur yaptığınızda bulanıklaştırılmış bir sonuç oluşturmak için çıkış pikselinin etrafındaki piksellerin renkleri karıştırılır. Örneğin, radius parametreniz 2 ise karma rengi oluşturmak için filtrenin her çıkış pikselinin etrafında her yönde 2 piksele bakması gerekir. Bu durum her bir çıkış pikseli için gerçekleşir. Yani, radius artırıldığında büyüyen hesaplamalar da artar. blur her yönde baktığından, "yarıçapı" iki katına çıkarmak 4 kat fazla piksele bakmanız gerektiği anlamına gelir. Bu nedenle, radius her ikiye katlandığında 4 kat daha yavaş olur. drop-shadow filtresi, etkisi kapsamında bir blur içerdiğinden bu filtre de shadow parametresinin radius ve spread bölümlerini değiştirdiğinizde blur gibi davranır.

blur, bazı platformlarda GPU'yu hızlandırmak için kullanılabileceğinden, bunların hepsi de kaybolmaz. Ancak bu her tarayıcıda mümkün olmayabilir. Şüpheye düştüğünüzde en iyi şey, istediğiniz etkiyi veren "yarıçap" ile denemeler yapmaktır. Ardından, kabul edilebilir bir görsel etkiyi korurken, yarıçapı mümkün olduğunca azaltmaya çalışın. Bu şekilde ince ayar yapmak, özellikle sitenizi telefondan kullanan kullanıcılarınızı daha mutlu eder.

SVG filtrelerine referans veren url tabanlı filtreler kullanıyorsanız, bunlar isteğe bağlı filtre efektleri içerebilir. Bu nedenle, bu filtreler de yavaş olabilir. Bu nedenle, filtre efektinin ne işe yaradığını bildiğinizden emin olun ve performansın iyi olduğundan emin olmak için bir mobil cihazda deneme yapın.

Modern tarayıcılarda kullanılabilirlik

Şu anda WebKit tabanlı tarayıcılarda ve Mozilla'da CSS filter efektlerinin bir kısmı kullanıma sunulmaktadır. Bu modelleri çok yakında Opera'da ve IE10'da görmeyi umuyoruz. Spesifikasyon hâlâ geliştirme aşamasında olduğundan, bazı tarayıcı satıcıları bu işlemleri tedarikçi öneklerini kullanarak uygulamıştır. Bu nedenle WebKit'te -webkit-filter, Mozilla'da ise -moz-filter kullanmanız ve diğer tarayıcı uygulamaları göründüklerinde dikkat etmeniz gerekir.

Tüm tarayıcılar tüm filtre efektlerini hemen desteklemez, bu nedenle kullanım hızınız değişiklik gösterir. Şu an için, Mozilla tarayıcısı diğer efekt işlevlerinden önce geldiği için tedarikçi firma öneki olmadan yalnızca filter: url() işlevini desteklemektedir.

Aşağıda, çeşitli tarayıcılarda kullanılabilen CSS filtre efektlerinin yazılımda uygulandıkları zamana ilişkin yaklaşık performans göstergeleriyle bir özet sunduk. Bir dizi modern tarayıcının bunları donanımda uygulamaya başladığını (GPU hızlandırmalı) unutmayın. Bunlar GPU desteğiyle oluşturulduğunda, daha yavaş efektler için performans büyük ölçüde iyileştirilir. Her zaman olduğu gibi, performansı değerlendirmenin en iyi yolu farklı tarayıcılarda test etmektir.

Filtre efekti Tarayıcı desteği Performans
gri tonlamalıChromeçok hızlı
sepyaChromeçok hızlı
doygunlukChromeçok hızlı
tonu döndürChromehızlı
ters çevirChromeçok hızlı
opacityChromeyavaş olabilir
parlaklıkChromehızlı
kontrastChromehızlı
bulanıklaştırmakChromehızlandırılmadığı sürece yavaş
drop-shadowChromeyavaş olabilir
url()Chrome, MozillaDeğişir, hızlıdan yavaşa

Diğer faydalı kaynaklar

Çalışmanızı deneyip paylaşmanıza olanak tanıyan harika bir filtrelerle etkileşimli soyut resim uygulaması Eric Bidelman’ın mükemmel etkileşimli filtre sayfasına mutlaka göz atın Örnekler içeren harika bir filtreler hakkında öğretici Resmi W3C Filtre Efektleri 1.0 taslak spesifikasyonu http://dev.w3.org/fxtf/filters/ Örnek Filtrelerle oluşturulan kullanıcı arayüzü