Framer Motion ile Animasyona Giriş
Framer Motion, gerek kullanım kolaylığı gerekse istenilen çoğu animasyonun yapılabilmesi nedeniyle birçok developer tarafından kullanılan popüler bir animasyon kütüphanesidir.
February 3, 2024
Türkçe
Framer Motion, gerek kullanım kolaylığı gerekse istenilen çoğu animasyonun yapılabilmesi nedeniyle birçok developer tarafından kullanılan popüler bir animasyon kütüphanesidir.
Neden Framer Motion Kullanmalıyım?
React uygulamalarınızı kolayca hareketli ve kullanıcıyı çeken hale getirmek için animasyonlar çokça kullanılıyor. Bu animasyonları yapmak için birçok tercihiniz var fakat hem kullanım kolaylığı hem esnekliği hem de topluluk desteğiyle Framer-Motion oldukça öne çıkıyor. Aynı zamanda üzerine gelme efektinden tutun ekranda göründüğünde X olayı gerçekleşsin gibi birçok kurguyu framer-motion kullanarak gerçekleştirebilirsiniz.
Kurulum
Framer Motion kurulumu oldukça basit. Tek yapmanız gereken React
projenize, framer-motion paketini eklemek.
Kurulum işlemi tamamlandıktan sonra framer-motion kullanmaya başlayabilirsiniz.
Kullanım
Framer Motion’da en çok kullanacağınız element motion elementi. Bu element div’e ve diğer html özelliklerinde framer motion özelliklerini eklemek için kullanılmakta. Bunu kullanmak için kodunuza, motion elementini framer-motion paketinden import edin.
İlk yapacağımız basit animasyon girişte opaklığı sıfır olan ve 0.5 saniye sonra opaklığı bir olan animasyon yapalım.
⚠️ Eğer projenizde veya gündelik yaşamınızda NextJS kullanmıyor, React kullanıyorsanız herhangi bir hata almazsınız ve aşağıdaki işlemleri yapmaya gerek duymazsınız.
Yukarıdaki bileşen bir NextJS projesinin Home sayfasında yaptığımız örnek bir animasyon fakat bunu kaydedip, uygulamaya baktığımızda aşağıdaki hatayı göreceğiz.
Bu hatanın sebebi NextJS 14+ ile eğer context, state, effect gibi özellikler kullanacaksak bu özellikleri kullandığımız sayfanın başına “use client” yazmalıyız. Fakat sayfalarda “use client” kullanmaktan kaçınmalıyız. Bu durumda önümüzde 2 seçenek çıkıyor.
1. Local Component yapmak:
Burada yapacağımız animasyonu “Animation.tsx” olarak başka bir komponente aktarıp, bu komponentin en üstüne “use client” yazmak.
Örnek olarak;
2. “use client” ile birlikte export etmek
motionElements.ts adında bir dosya açın. Bu dosyadan “use client” olarak exportlar alacağız.
Bu şekilde export ettiğimiz elementler artık client component olarak dışarı aktarılmış olacak ve kullandığımız yerlerde artık MotionDiv olarak kullanabilir hale geleceğiz. O halde kodumuzu aşağıdaki hale getirebiliriz.
Ekranda göreceğiniz çıktı:
💡 Not: Bu şekilde hata veren bazı kütüphanelerde de bu yolu tercih edebilirsiniz. Örneğin; Bootstrap gibi kütüphanelerde server componentlerle uyumlu olmadığı için, burada kullanacağınız özellikleri de yaptığınız dosyadan dışarı aktarıp kullanımınızı daha kolay hale getirecektir.
Peki nedir bu “initial” , “animate” ve “transition”?
Initial adından da anlaşılacağı gibi komponentin varsayılan görünümünü belirler, animate ise o animasyonun sonunda ne olacağını belirlediğimiz alan. Bu initial ve animate’e ek olarak exit adında bir özellik daha var. Bu özellik ise çıkış durumunda yapılacak animasyonu belirler. Transition ise en çok seveceğiniz parametrelerden biri.
Transition yukarıdaki gibi çok fazla özellik barındırmakta. Burada animasyonun pürüzsüzlüğünü, hangi durumlarda olacağını, eğer bir liste ise her liste elemanlarının index değerine göre geç gelmesi gibi birçok detayı burada ayarlayabilirsiniz.
Önerilen Kullanım Şekilleri
Bazen initial, animate, exit gibi özelliklerimiz çok uzun olabiliyor. Bu durumda elemanlarınızın karmaşık olmaması, kod tekrarını azaltmanız için önerimiz var. Yapacağınız initial, animate, exit gibi özellikleri başka bir .ts dosyasında yapıp oradan içeri aktarabilirsiniz.
İlk olarak variants.ts adında bir dosya açalım.
Sonrasında ise kodumuzu aşağıdaki hale getirebiliriz.
💡 Variant içinde belirlediğiniz objenin keylerini initial ve animate kısımlarına aktarmayı unutmayın.
Ekranda göreceğiniz animasyon aşağıdaki gibi olacak:
Gelelim olayları biraz daha derinleştirmeye. Şimdi birden fazla çözmemiz gereken senaryolara ve bu senaryolar da çözüm yolları aramaya bakalım.
Senaryo 1: Exit animasyonu yapılması gereken bir ögenin DOM’dan silinmesi.
Örnek senaryomuzda Frontend Developer olarak çalışan çoğu kişinin aklına gelecek bir örnek vereceğiz. Bir modalın açılışında animasyon yapabilirken, modalın kapatılmasında animasyon yapamamamız. Gelin bu örneği çözen anahtar özelliği sizinle tanıştırayım. “AnimatePresence”!
Hemen bu konuyu daha iyi pekiştirebilmek için verdiğimiz senaryoya uygun bir kod yazalım.
Gördüğünüz videoda girişte çok güzel bir animasyon var fakat exit animasyonum olmasına rağmen domdan silindiği için bu animasyonu gerçekleştirmiyor. Hadi sihirli elemanımız AnimatePresence’ı kullanalım Tek yapmamız gereken condition eklediğimiz yeri <AnimatePresence> ile sarmak.
Bu kodun çıktısını da aşağıdaki gibi görebilirsiniz.
AnimationPresence ile bu senaryomuzu başarıyla çözdük! 🚀
Senaryo 2: Bir listem var ve bu listedeki elemanların animasyonlarının tek tek animasyon olmasını istiyorum fakat animasyonlar tek seferde gerçekleşiyor.
Hadi gelin bu problemi örnekleyen bir kod yazalım!
Yukarıdaki kodumuzu çalıştırdığınızda aşağıdaki gibi görünüm elde edeceksiniz. Gördüğünüz gibi tüm noktalarda aynı anda animasyon gerçekleşiyor.
Fakat bizim istediğimiz bu noktaların belirli bir süre aralıkla gerçekleşmesini sağlamak. Hadi gelin bunu nasıl çözebiliriz ona odaklanalım.
Daha önce de bahsettiğim gibi transition özelliğinde birçok şey yapabiliyorsunuz bunlardan biri map döngüsüne soktuğunuz dataların keylerini istediğimiz gibi kullanabiliyoruz. Yukarıdaki kodda delay’ı index’ten çıkan değerle çarparsak istediğimiz görünümü elde edebiliriz.
Bu şekilde istediğimiz animasyonu elde etmiş olduk!
3. Senaryo: “Ben üzerine gelme veya basılı tutma animasyonu yapmak istiyorum” diyenler için.
Framer Motion geliştiricileri bu konuda da bizi yalnız bırakmamış ve whileTap, whileFocus, whileHover gibi propslar eklemize olanak sağlamışlar. Gelin bunlara da küçük küçük göz atalım.
“whileHover” Kullanımı
Yukarıdaki kodun çalışma görüntüsü
“whileTap” Kullanımı
Yukarıdaki kodun çıktısı da aşağıdaki gibi olacaktır.
Son olarak Framer Motion’ın avantajları
Her şey sizin kontrolünüzde: Framer Motion kullanarak yapmamız gereken şeyde kontrol sizde! Framer Motion sadece sizin işinizi kolaylaştıracak her türlü aracı veriyor. Bunun dışında sizde istediğiniz şekilde yapı kurup işlemlerinizi yapabilirsiniz.
Öğrenmesi zevkli: Çoğu şeyleri öğrenmenin başları sıkıcı ve bunaltıcı, sonlara doğru ise zevkli hale gelmekte. Fakat Framer Motion’da işler tam olarak böyle yürümüyor. Başından sonuna kadar tüm işlemlerinizde, tüm animasyonlarınızda keyif alıyorsunuz. Derin öğrenme yaptıkça da keyfiniz daha fazla artıyor.
Dökümantasyon ve Topluluk: Kendi sitesi ve birçok örnek sitede birden fazla detaylı örnek bulabilirsiniz ve aynı zamanda gerek Medium’da gerek başka blog sitelerinde Framer Motion hakkında bir çok detay var.
React ile tam uyumlu: React’taki çoğu özellik ile tam uyumlu! Yukarıdaki örneklerde de gördüğün gibi çok kolay bir şekilde kurup hemen kullanmaya başlayabilirsin.
Performans odaklı: Framer Motion, yüksek performanslı animasyonlar sunar. Web uygulamanızın hızını ve performansını olumsuz etkilemeden etkileyici animasyonlar oluşturmanıza olanak tanır. Bu da kullanıcı deneyimini artırır.
Mobil uyumlu: Framer Motion, mobil cihazlarda da mükemmel performans gösterir. Böylece, responsive tasarımlarda animasyonlarınızın her cihazda sorunsuz çalıştığından emin olabilirsiniz.
Framer Motion hakkında daha detaylı bilgi almak için dökümanını ziyaret edebilirsiniz.
Okuduğunuz için teşekkürler, gelecek yazılarımızda görüşmek üzere 🙌
Framer Motion
React
Next.js
React Animation
Front-End Development
Hüsnü Lübnan
Front-End Developer