Pseudo-element'ler ile animasyon
Pseudo-element’ler bize pek çaba harcamadan fazladan DOM elementleri elde etme imkanı verir. Sayfalarımıza ilave HTML eklemeden fazladan içerik, dekor vb. eklememizi sağlarlar ve bu pseudo-elementlere animasyon ekleyebiliriz. Bu yazıda bir pseudo-element’i bir butona biraz görsellik eklemek için kullanacağız.
Pseudo-elementler
CSS’te ::before
ya da ::after
kullanarak bir pseudo-element oluşturabiliriz. Bu pseudo-element daha sonra eklendiği element ile herhangi bir içeriğin arasına yerleştirilir. Pseudo-element kendi başına bir elementmiş gibi davrandığı için stil verilebilir, konumlandırılabilir ve daha fazlası yapılabilir. Kod şuna benzer:
.pebble::before {
...
}
.pebble::after {
...
}
Bu aşamada .pebble
elementimize iki adet sanal (HTML’de belirtmeden elde ettiğimiz) element ekledik ve bu elementleri ihtiyacımıza göre şekillendirebiliyoruz.
“::” ve “:” arasındaki fark hakkında
Pseudo elementleri belirtirken genel olarak kabul edilen belirtme şekli (:hover, :first-child gibi pseudo-class’ları aksine) iki adet ‘iki nokta üst üste’ imi ::
kullanmaktır. Eğer IE8’i desteklemeniz gerekiyorsa, tek ‘iki nokta üst üste’ imi :
kullanmak en iyisidir. Diğer tüm tarayıcılar ve IE’nin yeni versiyonları iki adet ‘iki nokta üst üste’ imini (::) desteklemektedir.
“content"i unutma!
Pseudo-elementler eklerken akılda tutulması gereken şeylerden biri, pseudo-elementlerin sayfada görünebilir olması için content
özelliğinin eklenmesi gerektiğidir. Pseudo-elementler içeriksiz bir halde oluşturuldukları için onlara aşağıdaki şekilde boş bir content
özelliği ekleyerek sayfada görünmelerini sağlayabiliriz:
.pebble::before {
content: ""
... more styling goes here...
}
Bu kod elementin sayfada görünmesini sağlayacaktır.
Örnek: Göz kamaştırıcı buton
Bu örnekte bir pseudo-element kullanarak mouse butonun üzerinde olduğunda (burdan böyle kısaca ’hover’ diyeceğiz) tetiklenen göz kamaştırıcı bir efekt yaratacağız. Ornegin sonunda boyle bir goruntu elde edecegiz (animasyonu gormek icin butona hover yapabilirsiniz)
Biraz HTML ile başlayalım:
<button>Oooh SHINY</button>
Pseudo-elementler kullandıgımız için daha fazla HTML’e ihtiyacımız olmayacak. Eğer bir sayfada birden fazla butona stil verecekseniz class kullanmak isteyebilirsiniz ama şimdilik basitlik adına genel bir element kullanacağız.
Parıltıyı (sheen) ekleme
Göz kamaştıran parıltı efektimiz butonumuzun bir ucundan diğer ucuna giden bir linear gradient. Bunu oluşturmak için after
pseudo-elementini kullanacağız ve bunu butonun dışında bir başlama noktasına yerleştireceğiz.
button::after {
content: '';
position: absolute;
top: -50%;
right: -50%;
bottom: -50%;
left: -50%;
background: linear-gradient(to bottom, rgba(229, 172, 142, 0), rgba(255,255,255,0.5) 50%, rgba(229, 172, 142, 0));
transform: rotateZ(60deg) translate(-5em, 7.5em);
}
Parıltı (sheen) efekti, butonun renginden beyaza ve tekrar butonun rengine dönen bir gradient’ten meydana gelmekte. Bu aşamada gradient butonun dışında duruyor.
Parıltı (sheen) efekti olan katmanı sadece hover’da iken görünecek şekilde saklamamız gerekecek. Bunu yapmak için öncelikle butonun overflow
özelliğini hidden
olarak belirleyeceğiz. Pseudo-elementimiz butonun içinde olduğundan butonun dışında kalan bölümü görünür olmayacaktır.
button {
background: #e5ac8e;
color: #fff;
font-size: 14px;
border-radius: 0.5em;
padding: 0 1em;
position: relative;
overflow: hidden;
line-height: 32px;
}
Butona kendine has bir görüntü vermek için başka stiller de verdim. Dikkatinizi çekmek istediğim bir nokta position: relative
‘in kullanımı. Bu özelliği butona eklememin sebebi position: absolute ile sabitlenmiş olan pseudo-element’in butonun içinde yer almasını istemem. Pozisyonu belirtilmediği sürece position: absolute kullanılan element, bir katman üstünde yer alan (parent) elementin içinde yer alacaktır.
Animasyonu ekleme
Bu örnekte animasyon kullanacağımız için önümüzde iki adet aşama var. Birincisi tarayıcıya buton hover’da iken animasyon kullanmasını söylemek. Daha sonra ise keyframes
kullanarak bu animasyonun tam olarak ne olduğunu belirteceğiz.
Butonun hover halini hover
pseudo-class’ına after
pseudo-class’ını şu şekilde ekleyerek oluşturabiliriz:
button:hover::after, button:focus::after {
animation: sheen 1s forwards;
}
Burada tarayıcıya butonumuz hover’da olduğunda after
pseudo-elementinin bir animation
degeri almasi gerektiğini söylüyoruz. Sheen (parıltı) olarak adlandırdığımız animasyonumuz 1 saniye sürüyor ve bunun sonunda tekrar etmeden sonlanıyor.
Burada pseudo-class’ları kullanma sırası önemlidir. Pseudo-class’ları ::after:hover
şeklinde kullanmak işe yaramayacaktır çünkü bu kullanım tarayıcıya butonun hover haline tepki vermesi yerine ::after pseudo-elementinin hover haline tepki vermesini söyleyecektir.
Butona aynı zamanda bir focus hali ekledim. Bunun sayesinde sayfayı tab tuşu ile dolaşan kullanıcılar da butona hover etmelerine gerek kalmaksızın parıltı efektini görebilecekler. (Šime Vidas‘a tavsiye için teşekkürler.)
Şimdi animasyonumuzun keyframes
ozelliklerini belirtelim:
@keyframes sheen {
100% {
transform: rotateZ(60deg) translate(1em, -9em);
}
}
Bu animasyonda tek bir keyframe’e ihtiyacımız var. Başlama noktası (0%) halihazırda pseudo-elementimizin başlama noktasında belirtildiği için sadece bitiş noktasını belirtmemiz gerekiyor. Bu durumda bitiş noktası butonun (başlama noktasına göre) diğer ucunun sağ üstü. Bunu tanımladıktan sonra tarayıcı parıltı efektinin animasyonunu butonun bir ucundan diğer ucana uygulayacak.
Tarayıcı değerlendirmeleri
Animasyon özelliği de, pseudo-elementler de tarayıcılar tarafından iyi bir şekilde desteklenmektedir. İşi garantiye almak için keyframes
ve diğer tüm transform özellikleri için -webkit
ve -moz
ön eklerini eklemek her zaman iyi bir fikirdir.