{"id":31493,"date":"2025-10-10T14:41:34","date_gmt":"2025-10-10T11:41:34","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31493"},"modified":"2025-10-10T14:41:34","modified_gmt":"2025-10-10T11:41:34","slug":"vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/","title":{"rendered":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme<\/h2>\n<h2>Giri\u015f: Kullan\u0131c\u0131 Deneyimini Zenginle\u015ftiren Material Dalgalanmalar<\/h2>\n<p>Modern web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimi (UX), ba\u015far\u0131n\u0131n anahtarlar\u0131ndan biridir. Kullan\u0131c\u0131lar\u0131n aray\u00fczle etkile\u015fimini daha sezgisel, do\u011fal ve keyifli hale getiren g\u00f6rsel geri bildirimler, bu deneyimi \u00f6nemli \u00f6l\u00e7\u00fcde zenginle\u015ftirir. Google&#8217;\u0131n Material Design felsefesi, bu prensipler \u00fczerine in\u015fa edilmi\u015f olup, kullan\u0131c\u0131 aray\u00fcz\u00fc bile\u015fenlerine fiziksel d\u00fcnyan\u0131n \u00f6zelliklerini yans\u0131tan animasyonlar ve ge\u00e7i\u015fler ekleyerek dijital ortamda ger\u00e7ek\u00e7i bir dokunma hissi yaratmay\u0131 hedefler. Bu felsefenin en belirgin ve sevilen \u00f6zelliklerinden biri de &#8220;Material Ripples&#8221; veya &#8220;Dalgalanma Efektleri&#8221;dir.<\/p>\n<p>Material Ripples, bir kullan\u0131c\u0131 bir aray\u00fcz \u00f6\u011fesine (\u00f6rne\u011fin bir d\u00fc\u011fme, kart veya liste \u00f6\u011fesi) t\u0131klad\u0131\u011f\u0131nda veya dokundu\u011funda, t\u0131klama noktas\u0131ndan d\u0131\u015far\u0131ya do\u011fru yay\u0131lan, su \u00fczerindeki dalgalar\u0131 an\u0131msatan bir animasyondur. Bu efekt, kullan\u0131c\u0131n\u0131n etkile\u015fimi hakk\u0131nda an\u0131nda g\u00f6rsel geri bildirim sa\u011flayarak, eyleminin alg\u0131lanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve aray\u00fcze dinamik bir canl\u0131l\u0131k katar. Kullan\u0131c\u0131lar, bu t\u00fcr k\u00fc\u00e7\u00fck ama etkili animasyonlar sayesinde uygulaman\u0131n daha duyarl\u0131 ve profesyonel oldu\u011funu hissederler.<\/p>\n<p>Vue.js, reaktif bile\u015fen tabanl\u0131 yap\u0131s\u0131yla modern ve performansl\u0131 kullan\u0131c\u0131 aray\u00fczleri geli\u015ftirmek i\u00e7in pop\u00fcler bir JavaScript \u00e7er\u00e7evesidir. Vue&#8217;nin esnekli\u011fi ve bile\u015fen odakl\u0131 yakla\u015f\u0131m\u0131, Material Ripples gibi dinamik g\u00f6rsel efektleri uygulamay\u0131 olduk\u00e7a kolayla\u015ft\u0131r\u0131r. \u0130ster haz\u0131r bir k\u00fct\u00fcphane kullanarak h\u0131zl\u0131ca entegrasyon yapmak isteyin, ister kendi \u00f6zel direktifinizi veya bile\u015feninizi olu\u015fturarak tam kontrol sa\u011flamay\u0131 tercih edin, Vue.js size bu konuda geni\u015f bir \u00f6zg\u00fcrl\u00fck sunar.<\/p>\n<p>Bu makale, Vue.js projelerinize Material Dalgalanma efektlerini nas\u0131l ekleyebilece\u011finizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele alacakt\u0131r. \u0130lk olarak Material Ripples&#8217;\u0131n temel \u00e7al\u0131\u015fma prensiplerini ve UX \u00fczerindeki etkilerini inceleyece\u011fiz. Ard\u0131ndan, bu efektleri projenize entegre etmenin farkl\u0131 yakla\u015f\u0131mlar\u0131n\u0131 \u2013 haz\u0131r k\u00fct\u00fcphanelerden faydalanmaktan, kendi \u00f6zel Vue direktifimizi veya renderless bile\u015fenimizi olu\u015fturmaya kadar \u2013 ad\u0131m ad\u0131m kod \u00f6rnekleriyle a\u00e7\u0131klayaca\u011f\u0131z. CSS ve JavaScript ile animasyonun detaylar\u0131n\u0131, performans ipu\u00e7lar\u0131n\u0131 ve eri\u015filebilirlik konular\u0131n\u0131 da ele alarak, Vue.js uygulamalar\u0131n\u0131zda etkileyici ve kullan\u0131c\u0131 dostu dalgalanma efektleri olu\u015fturman\u0131z i\u00e7in kapsaml\u0131 bir rehber sunaca\u011f\u0131z.<\/p>\n<h2>Material Ripples Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Material Ripples, Google&#8217;\u0131n Material Design felsefesinin temel ta\u015flar\u0131ndan biridir. Bu felsefe, dijital aray\u00fczleri ger\u00e7ek d\u00fcnyan\u0131n fiziksel \u00f6zellikleriyle harmanlayarak kullan\u0131c\u0131ya daha sezgisel bir deneyim sunmay\u0131 ama\u00e7lar. Dalgalanma efekti, bir kullan\u0131c\u0131n\u0131n bir y\u00fczeye dokundu\u011funda veya t\u0131klad\u0131\u011f\u0131nda ortaya \u00e7\u0131kan fiziksel bir dalgay\u0131 taklit eder. Bu, kullan\u0131c\u0131n\u0131n eyleminin g\u00f6rsel bir onay\u0131n\u0131 sa\u011flar ve uygulaman\u0131n etkile\u015fimli oldu\u011funu hissettirir.<\/p>\n<h3>Fiziksel Metafor ve Kullan\u0131c\u0131 Alg\u0131s\u0131<\/h3>\n<p>Dalgalanma efekti, su y\u00fczeyine d\u00fc\u015fen bir damlac\u0131\u011f\u0131n yaratt\u0131\u011f\u0131 dairesel yay\u0131l\u0131m\u0131 and\u0131r\u0131r. Kullan\u0131c\u0131 bir d\u00fc\u011fmeye t\u0131klad\u0131\u011f\u0131nda, sanki o d\u00fc\u011fme y\u00fczeyine parma\u011f\u0131yla hafif\u00e7e bast\u0131rm\u0131\u015f ve bu bask\u0131 bir dalga olu\u015fturmu\u015f gibi bir his yarat\u0131l\u0131r. Bu fiziksel metafor, dijital aray\u00fczlerin soyut do\u011fas\u0131n\u0131 azaltarak, kullan\u0131c\u0131n\u0131n zihninde daha somut bir ba\u011flant\u0131 kurmas\u0131na yard\u0131mc\u0131 olur. Sonu\u00e7 olarak, kullan\u0131c\u0131 etkile\u015fimleri daha do\u011fal ve anla\u015f\u0131l\u0131r hale gelir.<\/p>\n<p>Kullan\u0131c\u0131 alg\u0131s\u0131 a\u00e7\u0131s\u0131ndan, dalgalanma efektleri birka\u00e7 \u00f6nemli rol oynar:<br \/>\n*   <strong>An\u0131nda Geri Bildirim:<\/strong> Kullan\u0131c\u0131n\u0131n t\u0131klamas\u0131na veya dokunmas\u0131na an\u0131nda g\u00f6rsel bir yan\u0131t verir. Bu, kullan\u0131c\u0131n\u0131n eyleminin alg\u0131land\u0131\u011f\u0131n\u0131 ve i\u015flendi\u011fini hissetmesini sa\u011flar.<br \/>\n*   <strong>Duyarl\u0131l\u0131k Hissi:<\/strong> Uygulaman\u0131n h\u0131zl\u0131 ve duyarl\u0131 oldu\u011fu izlenimini yarat\u0131r. Kullan\u0131c\u0131lar, an\u0131nda geri bildirim alan uygulamalar\u0131 daha g\u00fcvenilir ve modern bulurlar.<br \/>\n*   <strong>Odak Noktas\u0131:<\/strong> Dalgalanma, kullan\u0131c\u0131n\u0131n dikkatini etkile\u015fimde bulundu\u011fu \u00f6\u011feye \u00e7eker, b\u00f6ylece eyleminin nereye odakland\u0131\u011f\u0131n\u0131 netle\u015ftirir.<br \/>\n*   <strong>Estetik \u00c7ekicilik:<\/strong> \u0130yi tasarlanm\u0131\u015f animasyonlar, uygulaman\u0131n genel esteti\u011fini ve profesyonelli\u011fini art\u0131r\u0131r.<\/p>\n<h3>Dalgalanma Efektinin Mekani\u011fi<\/h3>\n<p>Bir Material Ripple efektinin arkas\u0131ndaki temel mekanizma, genellikle a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<p>1.  <strong>Etkile\u015fim Alg\u0131lama:<\/strong> Kullan\u0131c\u0131 bir \u00f6\u011feye (\u00f6rne\u011fin bir <code><\/p>\n<div><\/code> veya <code><button><\/code>) t\u0131klad\u0131\u011f\u0131nda veya dokundu\u011funda (<code>mousedown<\/code>, <code>touchstart<\/code> olaylar\u0131) bu etkile\u015fim alg\u0131lan\u0131r.<br \/>\n2.  <strong>T\u0131klama Noktas\u0131n\u0131n Belirlenmesi:<\/strong> Etkile\u015fimin ger\u00e7ekle\u015fti\u011fi kesin X ve Y koordinatlar\u0131 belirlenir. Bu, dalgalanman\u0131n tam olarak t\u0131klanan noktadan ba\u015flamas\u0131 i\u00e7in \u00f6nemlidir.<br \/>\n3.  <strong>Dalgalanma Elementi Olu\u015fturma:<\/strong> Genellikle dinamik olarak k\u00fc\u00e7\u00fck bir <code><\/p>\n<div><\/code> elementi olu\u015fturulur. Bu element, dalgalanma animasyonunu ta\u015f\u0131yacakt\u0131r. Bu <code>div<\/code>, t\u0131klanan \u00f6\u011fenin i\u00e7ine (genellikle <code>position: absolute<\/code> ile) yerle\u015ftirilir.<br \/>\n4.  <strong>Ba\u015flang\u0131\u00e7 Konumu ve Boyutu:<\/strong> Olu\u015fturulan <code>div<\/code> elementi, t\u0131klama noktas\u0131n\u0131n merkezine konumland\u0131r\u0131l\u0131r ve ba\u015flang\u0131\u00e7ta \u00e7ok k\u00fc\u00e7\u00fck (\u00f6rne\u011fin, 0 geni\u015flik ve y\u00fckseklik) ve tamamen \u015feffaf (<code>opacity: 0<\/code>) bir daire \u015feklinde ayarlan\u0131r. Bu dairenin boyutu, dalgalanma ba\u015flad\u0131\u011f\u0131nda kapsay\u0131c\u0131 \u00f6\u011fenin en uzak k\u00f6\u015fesine kadar yay\u0131lacak \u015fekilde dinamik olarak hesaplan\u0131r.<br \/>\n5.  <strong>Animasyon Ba\u015flatma:<\/strong> JavaScript, CSS <code>transform: scale()<\/code> ve <code>opacity<\/code> \u00f6zelliklerini kullanarak dalgalanma elementini canland\u0131r\u0131r.<br \/>\n    *   <code>transform: scale(1)<\/code>&#8216;den <code>transform: scale(X)<\/code>&#8216;e (X, dalgalanman\u0131n maksimum yay\u0131lma boyutu) do\u011fru bir ge\u00e7i\u015fle elementin boyutu b\u00fcy\u00fct\u00fcl\u00fcr.<br \/>\n    *   <code>opacity: 0<\/code>&#8216;dan ba\u015flay\u0131p, animasyonun ortalar\u0131nda <code>opacity: 0.5<\/code> (veya benzeri bir de\u011fer) gibi bir zirveye ula\u015f\u0131r ve animasyonun sonunda tekrar <code>opacity: 0<\/code>&#8216;a d\u00fc\u015fer.<br \/>\n    *   Bu ge\u00e7i\u015fler, CSS <code>transition<\/code> \u00f6zelli\u011fi ile yumu\u015fak ve ak\u0131c\u0131 hale getirilir.<br \/>\n6.  <strong>Dalgalanma Elementinin Temizlenmesi:<\/strong> Animasyon tamamland\u0131\u011f\u0131nda (genellikle <code>transitionend<\/code> olay\u0131 dinlenerek), dinamik olarak olu\u015fturulan dalgalanma elementi DOM&#8217;dan kald\u0131r\u0131l\u0131r. Bu, gereksiz DOM elemanlar\u0131n\u0131n birikmesini \u00f6nler ve performans\u0131 korur.<\/p>\n<p>Bu s\u00fcre\u00e7, bir Material Ripple&#8217;\u0131n temelini olu\u015fturur. Vue.js ile bu mant\u0131\u011f\u0131 bir direktif veya bile\u015fen olarak sarmak, bu efekti uygulaman\u0131z\u0131n bir\u00e7ok farkl\u0131 yerinde kolayca ve tekrar kullan\u0131labilir bir \u015fekilde kullanman\u0131z\u0131 sa\u011flar.<\/p>\n<h2>Vue.js Projesine Material Ripples Eklemenin Temel Yakla\u015f\u0131mlar\u0131<\/h2>\n<p>Vue.js uygulamalar\u0131n\u0131za Material Ripples eklemek i\u00e7in birka\u00e7 farkl\u0131 yakla\u015f\u0131m mevcuttur. Her birinin kendi avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r. Bu b\u00f6l\u00fcmde, hem haz\u0131r k\u00fct\u00fcphaneleri kullanmay\u0131 hem de kendi \u00e7\u00f6z\u00fcm\u00fcm\u00fcz\u00fc (\u00f6zel direktif veya renderless bile\u015fen) olu\u015fturmay\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>K\u00fct\u00fcphane Kullan\u0131m\u0131<\/h3>\n<p>Haz\u0131r k\u00fct\u00fcphaneler, Material Ripples efektini projenize h\u0131zl\u0131 ve kolay bir \u015fekilde entegre etmenin en pratik yoludur. Bu k\u00fct\u00fcphaneler genellikle test edilmi\u015f, optimize edilmi\u015f ve \u00e7e\u015fitli \u00f6zelle\u015ftirme se\u00e7enekleri sunar.<\/p>\n<h4>Neden K\u00fct\u00fcphane Kullanmal\u0131y\u0131z?<\/h4>\n<p>*   <strong>H\u0131z ve Kolayl\u0131k:<\/strong> Kendi kodunuzu yazmaya gerek kalmadan, birka\u00e7 komut ve sat\u0131r kod ile efekti uygulayabilirsiniz.<br \/>\n*   <strong>Test Edilmi\u015f \u00c7\u00f6z\u00fcmler:<\/strong> K\u00fct\u00fcphaneler genellikle topluluk taraf\u0131ndan test edilmi\u015f ve olas\u0131 hatalar\u0131 giderilmi\u015f \u00e7\u00f6z\u00fcmler sunar.<br \/>\n*   <strong>Bak\u0131m:<\/strong> K\u00fct\u00fcphaneler aktif olarak bak\u0131m\u0131 yap\u0131l\u0131yorsa, gelecekteki Vue.js s\u00fcr\u00fcmleriyle uyumluluk ve hata d\u00fczeltmeleri konusunda endi\u015felenmenize gerek kalmaz.<br \/>\n*   <strong>\u00d6zelle\u015ftirme Se\u00e7enekleri:<\/strong> \u00c7o\u011fu k\u00fct\u00fcphane, renk, s\u00fcre, gecikme gibi animasyon \u00f6zelliklerini yap\u0131land\u0131rmak i\u00e7in prop&#8217;lar veya direktif arg\u00fcmanlar\u0131 sunar.<\/p>\n<h4>Pop\u00fcler K\u00fct\u00fcphane \u00d6rnekleri: <code>vue-ripple-directive<\/code><\/h4>\n<p>Vue ekosisteminde Material Ripples eklemek i\u00e7in kullanabilece\u011finiz bir\u00e7ok k\u00fct\u00fcphane bulunmaktad\u0131r. Bunlardan biri, basit ve odaklanm\u0131\u015f yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan <code>vue-ripple-directive<\/code>&#8216;dir. Bu direktif, Material Design dalgalanma efektini herhangi bir DOM eleman\u0131na kolayca eklemenizi sa\u011flar.<\/p>\n<p><strong>Kurulum:<\/strong><br \/>\n\u00d6ncelikle projenize <code>vue-ripple-directive<\/code> paketini y\u00fcklemeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">npm install vue-ripple-directive\n<h2>veya<\/h2>\nyarn add vue-ripple-directive<\/code><\/pre>\n<p><strong>Global Kay\u0131t:<\/strong><br \/>\nGenellikle <code>main.js<\/code> (Vue 2) veya <code>main.ts<\/code> (Vue 3) dosyan\u0131zda direktifi global olarak kaydetmek en yayg\u0131n yakla\u015f\u0131md\u0131r. Bu sayede uygulaman\u0131z\u0131n herhangi bir yerinde <code>v-ripple<\/code> direktifini kullanabilirsiniz.<\/p>\n<p><strong>Vue 3 i\u00e7in:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js veya main.ts\nimport { createApp } from 'vue';\nimport App from '.\/App.vue';\nimport Ripple from 'vue-ripple-directive';\n\nconst app = createApp(App);\n\napp.directive('ripple', Ripple); \/\/ 'ripple' ad\u0131yla global olarak kaydet\napp.mount('#app');<\/code><\/pre>\n<p><strong>Vue 2 i\u00e7in:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\nimport Vue from 'vue';\nimport App from '.\/App.vue';\nimport Ripple from 'vue-ripple-directive';\n\nVue.directive('ripple', Ripple); \/\/ 'ripple' ad\u0131yla global olarak kaydet\n\nnew Vue({\n  render: h => h(App),\n}).$mount('#app');<\/code><\/pre>\n<p><strong>Component \u0130\u00e7inde Kullan\u0131m:<\/strong><br \/>\nDirektifi global olarak kaydettikten sonra, herhangi bir Vue bile\u015feninizde <code>v-ripple<\/code> direktifini kullanabilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <button v-ripple class=\"my-button\">T\u0131kla Bana<\/button>\n    <div v-ripple class=\"my-card\">\n      <h3>Bir Kart Ba\u015fl\u0131\u011f\u0131<\/h3>\n      <p>Bu kartta da dalgalanma efekti var.<\/p>\n    <\/div>\n  <\/div>\n<\/template>\n\n<style scoped>\n.my-button {\n  padding: 10px 20px;\n  background-color: #42b983;\n  color: white;\n  border: none;\n  border-radius: 5px;\n  cursor: pointer;\n  \/<em> Dalgalanma efektinin kapsay\u0131c\u0131 element i\u00e7inde kalmas\u0131 i\u00e7in <\/em>\/\n  position: relative;\n  overflow: hidden;\n  z-index: 1; \/<em> Dalgalanman\u0131n di\u011fer i\u00e7eriklerin \u00fcst\u00fcnde olmas\u0131 i\u00e7in <\/em>\/\n}\n\n.my-card {\n  width: 300px;\n  padding: 20px;\n  margin-top: 20px;\n  background-color: #f0f0f0;\n  border-radius: 8px;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n  cursor: pointer;\n  \/<em> Dalgalanma efektinin kapsay\u0131c\u0131 element i\u00e7inde kalmas\u0131 i\u00e7in <\/em>\/\n  position: relative;\n  overflow: hidden;\n  z-index: 1;\n}\n<\/style><\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> Dalgalanma efektinin do\u011fru bir \u015fekilde \u00e7al\u0131\u015fmas\u0131 i\u00e7in, <code>v-ripple<\/code> direktifini uygulad\u0131\u011f\u0131n\u0131z elementin <code>position: relative<\/code> (veya <code>absolute<\/code>, <code>fixed<\/code>) ve <code>overflow: hidden<\/code> CSS \u00f6zelliklerine sahip olmas\u0131 genellikle zorunludur. <code>position: relative<\/code> dalgalanma elementinin konumland\u0131r\u0131lmas\u0131na izin verirken, <code>overflow: hidden<\/code> dalgalanman\u0131n elementin s\u0131n\u0131rlar\u0131 i\u00e7inde kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>\u00d6zelle\u015ftirme Se\u00e7enekleri:<\/strong><br \/>\n<code>vue-ripple-directive<\/code> gibi k\u00fct\u00fcphaneler genellikle direktife arg\u00fcmanlar veya modifier&#8217;lar arac\u0131l\u0131\u011f\u0131yla \u00f6zelle\u015ftirme imkan\u0131 sunar:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <!-- Varsay\u0131lan dalgalanma rengiyle -->\n    <button v-ripple class=\"my-button\">Varsay\u0131lan Dalga<\/button>\n\n    <!-- K\u0131rm\u0131z\u0131 dalgalanma rengiyle -->\n    <button v-ripple=\"'#ff0000'\" class=\"my-button\">K\u0131rm\u0131z\u0131 Dalga<\/button>\n\n    <!-- Yava\u015f dalgalanma -->\n    <button v-ripple.slow class=\"my-button\">Yava\u015f Dalga<\/button>\n\n    <!-- H\u0131zl\u0131 dalgalanma -->\n    <button v-ripple.fast class=\"my-button\">H\u0131zl\u0131 Dalga<\/button>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Bu \u00f6rnekler, k\u00fct\u00fcphanelerin sundu\u011fu esnekli\u011fi g\u00f6stermektedir. Kullanaca\u011f\u0131n\u0131z k\u00fct\u00fcphanenin dok\u00fcmantasyonunu inceleyerek mevcut t\u00fcm \u00f6zelle\u015ftirme se\u00e7eneklerini \u00f6\u011frenebilirsiniz.<\/p>\n<h3>Manuel Uygulama (Custom Directive veya Component)<\/h3>\n<p>Baz\u0131 durumlarda, bir k\u00fct\u00fcphaneye ba\u011f\u0131ml\u0131 kalmak istemeyebilir veya dalgalanma efektinin davran\u0131\u015f\u0131n\u0131 ve stilini tamamen kontrol etmek isteyebilirsiniz. Bu senaryolarda, kendi \u00f6zel Vue direktifinizi veya renderless bile\u015feninizi olu\u015fturmak harika bir \u00e7\u00f6z\u00fcmd\u00fcr. Bu yakla\u015f\u0131m, Vue&#8217;nin g\u00fcc\u00fcn\u00fc daha derinlemesine anlaman\u0131za da yard\u0131mc\u0131 olur.<\/p>\n<h4>Neden Manuel Uygulama?<\/h4>\n<p>*   <strong>Tam Kontrol:<\/strong> Animasyonun her y\u00f6n\u00fcn\u00fc (zamanlama, renk, boyut, yay\u0131lma h\u0131z\u0131, easing fonksiyonu) tamamen kontrol edebilirsiniz.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Azaltma:<\/strong> Projenize ek bir harici k\u00fct\u00fcphane ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 eklemekten ka\u00e7\u0131n\u0131rs\u0131n\u0131z.<br \/>\n*   <strong>Performans Optimizasyonu:<\/strong> Kendi kodunuzu yazd\u0131\u011f\u0131n\u0131zda, sadece ihtiyac\u0131n\u0131z olan \u00f6zellikleri dahil ederek daha hafif bir \u00e7\u00f6z\u00fcm olu\u015fturabilirsiniz.<br \/>\n*   <strong>\u00d6\u011frenme F\u0131rsat\u0131:<\/strong> Vue&#8217;nin \u00f6zel direktiflerini ve renderless bile\u015fenlerini nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 \u00f6\u011frenmek i\u00e7in harika bir yoldur.<\/p>\n<h4>Custom Directive ile Uygulama<\/h4>\n<p>Vue \u00f6zel direktifleri, DOM elemanlar\u0131na do\u011frudan d\u00fc\u015f\u00fck seviyeli eri\u015fim ve manip\u00fclasyon sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r. Dalgalanma efektini uygulamak i\u00e7in idealdirler \u00e7\u00fcnk\u00fc do\u011frudan elementin olaylar\u0131n\u0131 dinleyebilir ve DOM&#8217;a yeni elementler ekleyip kald\u0131rabilirler.<\/p>\n<p><strong>Ad\u0131m Ad\u0131m Direktif Olu\u015fturma:<\/strong><\/p>\n<p>1.  <strong>Direktif Dosyas\u0131 Olu\u015fturma:<\/strong><br \/>\n    Genellikle projenizin <code>src\/directives<\/code> klas\u00f6r\u00fcnde <code>ripple.js<\/code> ad\u0131nda bir dosya olu\u015fturabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/directives\/ripple.js\n    function createRipple(event) {\n      const button = event.currentTarget; \/\/ T\u0131klanan element\n      const ripple = document.createElement('span'); \/\/ Dalgalanma elementi\n      const diameter = Math.max(button.clientWidth, button.clientHeight);\n      const radius = diameter \/ 2;\n\n      \/\/ Dalgalanma elementinin stilini ayarla\n      ripple.style.width = ripple.style.height = <code>${diameter}px<\/code>;\n      ripple.style.left = <code>${event.clientX - button.getBoundingClientRect().left - radius}px<\/code>;\n      ripple.style.top = <code>${event.clientY - button.getBoundingClientRect().top - radius}px<\/code>;\n      ripple.classList.add('ripple'); \/\/ CSS s\u0131n\u0131f\u0131n\u0131 ekle\n\n      \/\/ Mevcut dalgalanmalar\u0131 temizle (\u00f6nceki dalgalanma bitmeden yeni bir t\u0131klama olursa)\n      const existingRipple = button.getElementsByClassName('ripple')[0];\n      if (existingRipple) {\n        existingRipple.remove();\n      }\n\n      button.appendChild(ripple); \/\/ Dalgalanma elementini butona ekle\n\n      \/\/ Animasyon bitti\u011finde dalgalanmay\u0131 kald\u0131r\n      ripple.addEventListener('transitionend', () => {\n        ripple.remove();\n      }, { once: true });\n    }\n\n    const RippleDirective = {\n      \/\/ Direktif elemente ilk ba\u011fland\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r\n      mounted(el, binding) {\n        \/\/ Elementin position stilini kontrol et, yoksa relative yap\n        if (getComputedStyle(el).position === 'static') {\n          el.style.position = 'relative';\n        }\n        el.style.overflow = 'hidden'; \/\/ Dalgalanman\u0131n element i\u00e7inde kalmas\u0131n\u0131 sa\u011fla\n\n        \/\/ T\u0131klama olay\u0131n\u0131 dinle\n        el.addEventListener('mousedown', createRipple);\n      },\n      \/\/ Direktif elementten ayr\u0131ld\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r (temizlik i\u00e7in)\n      unmounted(el) {\n        el.removeEventListener('mousedown', createRipple);\n      }\n    };\n\n    export default RippleDirective;<\/code><\/pre>\n<p>2.  <strong>CSS Stilleri Ekleme:<\/strong><br \/>\n    Bu direktif i\u00e7in temel CSS stillerini eklemeniz gerekir. Genellikle <code>src\/assets\/main.css<\/code> veya global bir stil dosyan\u0131za ekleyebilirsiniz.<\/p>\n<pre><code class=\"language-css\">\/<em> src\/assets\/main.css veya global stil dosyas\u0131 <\/em>\/\n    .ripple {\n      display: block;\n      position: absolute;\n      border-radius: 50%;\n      background-color: rgba(255, 255, 255, 0.7); \/<em> Dalgalanma rengi <\/em>\/\n      transform: scale(0); \/<em> Ba\u015flang\u0131\u00e7ta g\u00f6r\u00fcnmez <\/em>\/\n      opacity: 1;\n      pointer-events: none; \/<em> T\u0131klama olaylar\u0131n\u0131 engellemesin <\/em>\/\n      animation: ripple-animation 0.6s linear forwards; \/<em> Animasyon <\/em>\/\n    }\n\n    @keyframes ripple-animation {\n      from {\n        transform: scale(0);\n        opacity: 1;\n      }\n      to {\n        transform: scale(2.5); \/<em> Yeterince b\u00fcy\u00fcmesini sa\u011fla <\/em>\/\n        opacity: 0;\n      }\n    }<\/code><\/pre>\n<p>    <strong>Not:<\/strong> Yukar\u0131daki CSS&#8217;i direktif i\u00e7indeki <code>transitionend<\/code> listener&#8217;\u0131 yerine bir <code>@keyframes<\/code> animasyonu ile kullan\u0131yoruz. Bu, animasyonun daha tutarl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve <code>forwards<\/code> anahtar kelimesi ile son durumunu korumas\u0131n\u0131 garantiler. Animasyon bitti\u011finde <code>ripple.remove()<\/code> \u00e7a\u011fr\u0131s\u0131 DOM&#8217;dan kald\u0131racakt\u0131r. Alternatif olarak, <code>transition<\/code> tabanl\u0131 bir yakla\u015f\u0131m da kullan\u0131labilir, ancak <code>@keyframes<\/code> daha fazla kontrol sunar.<\/p>\n<p>3.  <strong>Global Kay\u0131t:<\/strong><br \/>\n    <code>main.js<\/code> (Vue 3) veya <code>main.ts<\/code> dosyan\u0131zda direktifi global olarak kaydedin:<\/p>\n<p>    <strong>Vue 3 i\u00e7in:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\n    import { createApp } from 'vue';\n    import App from '.\/App.vue';\n    import RippleDirective from '.\/directives\/ripple'; \/\/ Kendi direktifimizi import et\n\n    const app = createApp(App);\n    app.directive('ripple', RippleDirective);\n    app.mount('#app');<\/code><\/pre>\n<p>4.  <strong>Kullan\u0131m:<\/strong><br \/>\n    Art\u0131k <code>v-ripple<\/code> direktifini herhangi bir Vue bile\u015feninizde kullanabilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><template>\n      <div>\n        <button v-ripple class=\"my-custom-button\">\u00d6zel Dalga Butonu<\/button>\n        <div v-ripple class=\"my-custom-card\">\n          <h4>\u00d6zel Dalgal\u0131 Kart<\/h4>\n          <p>Kendi direktifimizle!<\/p>\n        <\/div>\n      <\/div>\n    <\/template>\n\n    <style scoped>\n    .my-custom-button {\n      padding: 12px 24px;\n      background-color: #673ab7; \/<em> Mor renk <\/em>\/\n      color: white;\n      border: none;\n      border-radius: 6px;\n      cursor: pointer;\n      font-size: 1rem;\n      transition: background-color 0.3s ease;\n      \/<em> Direktif taraf\u0131ndan ayarlanacak, ancak yine de belirtmek iyi bir al\u0131\u015fkanl\u0131kt\u0131r <\/em>\/\n      position: relative;\n      overflow: hidden;\n      z-index: 1;\n    }\n\n    .my-custom-button:hover {\n      background-color: #512da8;\n    }\n\n    .my-custom-card {\n      width: 280px;\n      padding: 25px;\n      margin-top: 25px;\n      background-color: #e0f2f1; \/<em> A\u00e7\u0131k ye\u015fil <\/em>\/\n      border-radius: 10px;\n      box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n      cursor: pointer;\n      \/<em> Direktif taraf\u0131ndan ayarlanacak <\/em>\/\n      position: relative;\n      overflow: hidden;\n      z-index: 1;\n    }\n    <\/style><\/code><\/pre>\n<p>Bu direktif, dalgalanma efektini tamamen kontrol etmenizi sa\u011flar. <code>binding.value<\/code> veya <code>binding.arg<\/code> kullanarak direktife parametreler (\u00f6rne\u011fin dalgalanma rengi) ge\u00e7irebilir ve bu parametreleri <code>createRipple<\/code> fonksiyonunda kullanabilirsiniz.<\/p>\n<h4>Renderless Component ile Uygulama<\/h4>\n<p>Renderless bile\u015fenler, g\u00f6rsel bir \u00e7\u0131kt\u0131 \u00fcretmeyen, ancak mant\u0131k ve davran\u0131\u015f sa\u011flayan bile\u015fenlerdir. Dalgalanma efektini bir renderless bile\u015fen arac\u0131l\u0131\u011f\u0131yla uygulamak, mant\u0131\u011f\u0131 UI&#8217;dan ay\u0131rarak daha esnek ve tekrar kullan\u0131labilir bir yap\u0131 olu\u015fturabilir. Bu yakla\u015f\u0131m, \u00f6zellikle dalgalanma efektini farkl\u0131 bile\u015fenlere entegre ederken veya dalgalanman\u0131n kendisi \u00fczerinde daha karma\u015f\u0131k bir kontrol gerekti\u011finde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><strong>Renderless Component Olu\u015fturma:<\/strong><\/p>\n<p>1.  <strong><code>RippleWrapper.vue<\/code> Dosyas\u0131 Olu\u015fturma:<\/strong><br \/>\n    <code>src\/components<\/code> klas\u00f6r\u00fcnde <code>RippleWrapper.vue<\/code> ad\u0131nda bir dosya olu\u015fturun.<\/p>\n<pre><code class=\"language-vue\"><template>\n      <div\n        class=\"ripple-container\"\n        @mousedown=\"handleMouseDown\"\n        :style=\"{ position: 'relative', overflow: 'hidden' }\"\n      >\n        <slot><\/slot>\n        <transition-group name=\"ripple-fade\">\n          <span\n            v-for=\"ripple in ripples\"\n            :key=\"ripple.id\"\n            class=\"ripple-effect\"\n            :style=\"ripple.style\"\n            @animationend=\"removeRipple(ripple.id)\"\n          ><\/span>\n        <\/transition-group>\n      <\/div>\n    <\/template>\n\n    <script setup>\n    import { ref, nextTick } from 'vue';\n\n    const ripples = ref([]);\n    let rippleId = 0;\n\n    const props = defineProps({\n      color: {\n        type: String,\n        default: 'rgba(255, 255, 255, 0.7)'\n      },\n      duration: {\n        type: Number,\n        default: 600 \/\/ ms\n      }\n    });\n\n    const handleMouseDown = async (event) => {\n      const target = event.currentTarget;\n      const rect = target.getBoundingClientRect();\n      const diameter = Math.max(rect.width, rect.height);\n      const radius = diameter \/ 2;\n\n      const newRipple = {\n        id: rippleId++,\n        style: {\n          width: <code>${diameter}px<\/code>,\n          height: <code>${diameter}px<\/code>,\n          left: <code>${event.clientX - rect.left - radius}px<\/code>,\n          top: <code>${event.clientY - rect.top - radius}px<\/code>,\n          backgroundColor: props.color,\n          transitionDuration: <code>${props.duration}ms<\/code> \/\/ CSS animasyon s\u00fcresini JS'den kontrol et\n        }\n      };\n\n      ripples.value.push(newRipple);\n\n      \/\/ DOM g\u00fcncellendikten sonra animasyonu ba\u015flat\n      await nextTick();\n      const addedRipple = target.querySelector(<code>.ripple-effect:last-child<\/code>);\n      if (addedRipple) {\n        \/\/ Force reflow for CSS transition to work correctly\n        void addedRipple.offsetWidth;\n        addedRipple.style.transform = <code>scale(2.5)<\/code>; \/\/ Hedef boyut\n        addedRipple.style.opacity = '0'; \/\/ Animasyon sonunda \u015feffafla\u015fs\u0131n\n      }\n    };\n\n    const removeRipple = (idToRemove) => {\n      ripples.value = ripples.value.filter(ripple => ripple.id !== idToRemove);\n    };\n    <\/script>\n\n    <style scoped>\n    .ripple-container {\n      \/<em> Bu stil d\u0131\u015far\u0131dan gelen elementlerin \u00fczerine yaz\u0131lmamas\u0131 i\u00e7in <\/em>\/\n      \/<em> component i\u00e7inde tan\u0131mland\u0131, ancak d\u0131\u015far\u0131dan da verilebilir <\/em>\/\n      \/<em> position: relative; <\/em>\/\n      \/<em> overflow: hidden; <\/em>\/\n      cursor: pointer;\n      user-select: none; \/<em> Metin se\u00e7imini engelle <\/em>\/\n    }\n\n    .ripple-effect {\n      display: block;\n      position: absolute;\n      border-radius: 50%;\n      transform: scale(0);\n      opacity: 1;\n      pointer-events: none;\n      \/<em> Animasyon i\u00e7in transition kullan\u0131yoruz <\/em>\/\n      transition: transform var(--ripple-duration, 0.6s) ease-out, opacity var(--ripple-duration, 0.6s) ease-out;\n      \/<em> Varsay\u0131lan renk, prop ile override edilecek <\/em>\/\n      background-color: var(--ripple-color, rgba(255, 255, 255, 0.7));\n    }\n    <\/style><\/code><\/pre>\n<p>    <strong>Not:<\/strong> Bu renderless bile\u015fen \u00f6rne\u011finde, CSS <code>transition<\/code> tabanl\u0131 bir yakla\u015f\u0131m kullan\u0131lm\u0131\u015ft\u0131r. <code>animationend<\/code> yerine <code>transitionend<\/code> de kullan\u0131labilir, ancak <code>animationend<\/code> ile <code>forwards<\/code> kullanarak son durumu korumak daha kolayd\u0131r. Yukar\u0131daki \u00f6rnekte <code>transition<\/code> kullan\u0131ld\u0131\u011f\u0131 i\u00e7in, <code>removeRipple<\/code> fonksiyonu <code>transitionend<\/code> olay\u0131na ba\u011flanmal\u0131d\u0131r. <code>animationend<\/code> kullan\u0131ld\u0131\u011f\u0131nda ise <code>@keyframes<\/code> animasyonuna ihtiyac\u0131n\u0131z olacakt\u0131r. Basitlik ad\u0131na, <code>transition<\/code> ile <code>nextTick<\/code> kullanarak <code>transform<\/code> ve <code>opacity<\/code> de\u011ferlerini ayarlayarak animasyonu tetikledik.<\/p>\n<p>2.  <strong>Kullan\u0131m:<\/strong><br \/>\n    \u015eimdi bu <code>RippleWrapper<\/code> bile\u015fenini herhangi bir Vue bile\u015feninizde kullanabilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><template>\n      <div>\n        <RippleWrapper>\n          <button class=\"my-renderless-button\">Renderless Buton<\/button>\n        <\/RippleWrapper>\n\n        <RippleWrapper color=\"rgba(0, 123, 255, 0.6)\" :duration=\"800\">\n          <div class=\"my-renderless-card\">\n            <h5>Renderless Kart<\/h5>\n            <p>Farkl\u0131 renk ve s\u00fcreyle.<\/p>\n          <\/div>\n        <\/RippleWrapper>\n      <\/div>\n    <\/template>\n\n    <script setup>\n    import RippleWrapper from '.\/RippleWrapper.vue';\n    <\/script>\n\n    <style scoped>\n    .my-renderless-button {\n      padding: 15px 30px;\n      background-color: #007bff; \/<em> Mavi <\/em>\/\n      color: white;\n      border: none;\n      border-radius: 8px;\n      cursor: pointer;\n      font-size: 1.1rem;\n      transition: background-color 0.3s ease;\n      margin-right: 20px;\n      \/<em> RippleWrapper taraf\u0131ndan y\u00f6netildi\u011fi i\u00e7in burada position: relative\/overflow: hidden gerekmez <\/em>\/\n    }\n\n    .my-renderless-button:hover {\n      background-color: #0056b3;\n    }\n\n    .my-renderless-card {\n      width: 320px;\n      padding: 30px;\n      margin-top: 30px;\n      background-color: #e3f2fd; \/<em> A\u00e7\u0131k mavi <\/em>\/\n      border-radius: 12px;\n      box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2);\n      cursor: pointer;\n      \/<em> RippleWrapper taraf\u0131ndan y\u00f6netildi\u011fi i\u00e7in burada position: relative\/overflow: hidden gerekmez <\/em>\/\n    }\n    <\/style><\/code><\/pre>\n<p>Renderless bile\u015fen yakla\u015f\u0131m\u0131, dalgalanma efektinin mant\u0131\u011f\u0131n\u0131 kapsay\u0131c\u0131 bir bile\u015fene ta\u015f\u0131yarak, bu mant\u0131\u011f\u0131 farkl\u0131 DOM elementlerine uygulamak i\u00e7in esnek bir yol sunar. <code>slot<\/code> sayesinde, dalgalanma efektini uygulamak istedi\u011finiz herhangi bir i\u00e7eri\u011fi i\u00e7ine yerle\u015ftirebilirsiniz.<\/p>\n<h2>Detayl\u0131 Uygulama ve \u00d6zelle\u015ftirme<\/h2>\n<p>Material Ripples efektini Vue.js bile\u015fenlerinize entegre ederken, animasyonun p\u00fcr\u00fczs\u00fcz, duyarl\u0131 ve g\u00f6rsel olarak \u00e7ekici olmas\u0131n\u0131 sa\u011flamak i\u00e7in CSS ve JavaScript detaylar\u0131na hakim olmak \u00f6nemlidir.<\/p>\n<h3>CSS ile Stil Verme<\/h3>\n<p>Dalgalanma efektinin g\u00f6rsel g\u00fczelli\u011fi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde do\u011fru CSS stillerine ba\u011fl\u0131d\u0131r.<\/p>\n<p>*   <strong>Temel Dalgalanma Elementi Stili:<\/strong><br \/>\n    Dalgalanma, genellikle <code>span<\/code> veya <code>div<\/code> gibi basit bir HTML elementiyle olu\u015fturulur. Bu elementin temel stilleri \u015funlar\u0131 i\u00e7ermelidir:<br \/>\n    *   <code>display: block;<\/code>: Elementin blok d\u00fczeyinde davranmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>position: absolute;<\/code>: T\u0131klanan ana elementin i\u00e7inde konumland\u0131r\u0131labilmesi i\u00e7in. Ana elementin <code>position: relative;<\/code> olmas\u0131 gerekti\u011fini unutmay\u0131n.<br \/>\n    *   <code>border-radius: 50%;<\/code>: Dalgalanman\u0131n dairesel olmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>background-color: rgba(255, 255, 255, 0.7);<\/code>: Dalgalanman\u0131n rengi ve \u015feffafl\u0131\u011f\u0131. Genellikle beyaz veya ana teman\u0131n a\u00e7\u0131k bir tonu kullan\u0131l\u0131r.<br \/>\n    *   <code>transform: scale(0);<\/code>: Ba\u015flang\u0131\u00e7ta dalgalanman\u0131n g\u00f6r\u00fcnmez olmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>opacity: 1;<\/code>: Ba\u015flang\u0131\u00e7 \u015feffafl\u0131\u011f\u0131. Animasyon s\u0131ras\u0131nda azalacakt\u0131r.<br \/>\n    *   <code>pointer-events: none;<\/code>: Dalgalanma elementinin kendisinin t\u0131klama olaylar\u0131n\u0131 yakalamas\u0131n\u0131 engeller, b\u00f6ylece ana elementin t\u0131klama olaylar\u0131 etkilenmez.<br \/>\n    *   <code>z-index: 2;<\/code> (veya daha y\u00fcksek): Ana elementin i\u00e7eri\u011fi \u00fczerinde g\u00f6r\u00fcnmesini sa\u011flar.<\/p>\n<p>*   <strong>Animasyon Ge\u00e7i\u015fleri (<code>transition<\/code> veya <code>@keyframes<\/code>):<\/strong><br \/>\n    Dalgalanman\u0131n p\u00fcr\u00fczs\u00fcz bir \u015fekilde b\u00fcy\u00fcmesi ve kaybolmas\u0131 i\u00e7in CSS ge\u00e7i\u015fleri veya anahtar kare animasyonlar\u0131 kullan\u0131l\u0131r.<\/p>\n<p>    <strong><code>transition<\/code> Kullan\u0131m\u0131:<\/strong><\/p>\n<pre><code class=\"language-css\">.ripple-effect {\n      \/<em> ... di\u011fer stiller ... <\/em>\/\n      transition: transform 0.6s ease-out, opacity 0.6s ease-out;\n    }\n    \/<em> JavaScript, bu s\u0131n\u0131fa sahip elementin transform ve opacity de\u011ferlerini de\u011fi\u015ftirecektir <\/em>\/\n    \/<em> \u00d6rne\u011fin: element.style.transform = 'scale(2.5)'; element.style.opacity = '0'; <\/em>\/<\/code><\/pre>\n<p>    Burada <code>transform<\/code> ve <code>opacity<\/code> \u00f6zellikleri i\u00e7in ayr\u0131 ayr\u0131 ge\u00e7i\u015fler tan\u0131mlanm\u0131\u015ft\u0131r. <code>ease-out<\/code> zamanlama fonksiyonu, animasyonun ba\u015flang\u0131\u00e7ta h\u0131zl\u0131, sona do\u011fru yava\u015flamas\u0131n\u0131 sa\u011flar.<\/p>\n<p>    <strong><code>@keyframes<\/code> Kullan\u0131m\u0131:<\/strong><\/p>\n<pre><code class=\"language-css\">.ripple {\n      \/<em> ... di\u011fer stiller ... <\/em>\/\n      animation: ripple-animation 0.6s linear forwards;\n    }\n\n    @keyframes ripple-animation {\n      from {\n        transform: scale(0);\n        opacity: 1;\n      }\n      to {\n        transform: scale(2.5); \/<em> Yeterince b\u00fcy\u00fcmesini sa\u011fla <\/em>\/\n        opacity: 0;\n      }\n    }<\/code><\/pre>\n<p>    <code>@keyframes<\/code> daha fazla kontrol sunar ve animasyonun farkl\u0131 a\u015famalar\u0131nda farkl\u0131 \u00f6zellikler belirlemenize olanak tan\u0131r. <code>forwards<\/code> anahtar kelimesi, animasyon bittikten sonra elementin son anahtar karedeki stilini korumas\u0131n\u0131 sa\u011flar.<\/p>\n<p>*   <strong>Kapsay\u0131c\u0131 Element Stilleri:<\/strong><br \/>\n    <code>v-ripple<\/code> uygulad\u0131\u011f\u0131n\u0131z veya <code>RippleWrapper<\/code> i\u00e7ine yerle\u015ftirdi\u011finiz elementin a\u015fa\u011f\u0131daki stillere sahip olmas\u0131 kritik \u00f6neme sahiptir:<br \/>\n    *   <code>position: relative;<\/code> (veya <code>absolute<\/code>, <code>fixed<\/code>): Dalgalanma elementinin <code>position: absolute;<\/code> ile do\u011fru bir \u015fekilde konumland\u0131r\u0131labilmesi i\u00e7in.<br \/>\n    *   <code>overflow: hidden;<\/code>: Dalgalanman\u0131n ana elementin s\u0131n\u0131rlar\u0131 d\u0131\u015f\u0131na ta\u015fmas\u0131n\u0131 engeller ve sadece i\u00e7inde g\u00f6r\u00fcnmesini sa\u011flar.<\/p>\n<h3>JavaScript ile Animasyon Kontrol\u00fc<\/h3>\n<p>JavaScript, dalgalanman\u0131n dinamik davran\u0131\u015f\u0131n\u0131 y\u00f6netmek i\u00e7in kullan\u0131l\u0131r:<\/p>\n<p>*   <strong>T\u0131klama Koordinatlar\u0131:<\/strong><br \/>\n    <code>mousedown<\/code> veya <code>touchstart<\/code> olaylar\u0131ndan <code>event.clientX<\/code> ve <code>event.clientY<\/code> de\u011ferleri al\u0131narak t\u0131klaman\u0131n ekran \u00fczerindeki mutlak koordinatlar\u0131 belirlenir.<\/p>\n<p>*   <strong>Elementin Konumu:<\/strong><br \/>\n    T\u0131klanan elementin kendi i\u00e7indeki g\u00f6receli konumu i\u00e7in <code>element.getBoundingClientRect()<\/code> kullan\u0131l\u0131r. Bu metod, elementin boyutunu ve viewport&#8217;a g\u00f6re konumunu d\u00f6nd\u00fcr\u00fcr.<br \/>\n    <code>event.clientX - element.getBoundingClientRect().left<\/code> ifadesi, t\u0131klaman\u0131n elementin sol kenar\u0131na g\u00f6re X koordinat\u0131n\u0131 verir.<br \/>\n    <code>event.clientY - element.getBoundingClientRect().top<\/code> ifadesi, t\u0131klaman\u0131n elementin \u00fcst kenar\u0131na g\u00f6re Y koordinat\u0131n\u0131 verir.<\/p>\n<p>*   <strong>Dalgalanma Boyutunun Hesaplanmas\u0131:<\/strong><br \/>\n    Dalgalanman\u0131n boyutu, genellikle t\u0131klanan elementin en geni\u015f veya en y\u00fcksek boyutuna g\u00f6re belirlenir. Bu, dalgalanman\u0131n elementin t\u00fcm y\u00fczeyini kaplayacak kadar b\u00fcy\u00fcmesini sa\u011flar. En basit haliyle:<br \/>\n    <code>const diameter = Math.max(element.clientWidth, element.clientHeight);<\/code><br \/>\n    Daha do\u011fru bir yakla\u015f\u0131m, t\u0131klama noktas\u0131ndan elementin en uzak k\u00f6\u015fesine olan mesafeyi hesaplamak ve bu mesafeyi dalgalanman\u0131n yar\u0131\u00e7ap\u0131 olarak kullanmakt\u0131r. Bu, dalgalanman\u0131n her zaman elementin t\u00fcm y\u00fczeyini kaplamas\u0131n\u0131 garanti eder.<\/p>\n<p>*   <strong>Animasyonun Ba\u015flat\u0131lmas\u0131 ve Bitirilmesi:<\/strong><br \/>\n    1.  <strong>Olu\u015fturma:<\/strong> <code>document.createElement('span')<\/code> ile yeni bir dalgalanma elementi olu\u015fturulur.<br \/>\n    2.  <strong>Konumland\u0131rma ve Boyutland\u0131rma:<\/strong> Hesaplanan koordinatlar ve \u00e7ap kullan\u0131larak <code>ripple.style.left<\/code>, <code>ripple.style.top<\/code>, <code>ripple.style.width<\/code>, <code>ripple.style.height<\/code> ayarlan\u0131r.<br \/>\n    3.  <strong>DOM&#8217;a Ekleme:<\/strong> <code>element.appendChild(ripple)<\/code> ile dalgalanma elementi ana elementin i\u00e7ine eklenir.<br \/>\n    4.  <strong>Animasyon Tetikleme:<\/strong> E\u011fer <code>transition<\/code> kullan\u0131l\u0131yorsa, elementin <code>transform<\/code> ve <code>opacity<\/code> stilleri <code>setTimeout(..., 0)<\/code> veya <code>requestAnimationFrame<\/code> i\u00e7inde de\u011fi\u015ftirilir. Bu, taray\u0131c\u0131n\u0131n DOM&#8217;a eklemeyi tamamlamas\u0131na ve ba\u015flang\u0131\u00e7 stillerini i\u015flemesine izin verir, b\u00f6ylece ge\u00e7i\u015f do\u011fru bir \u015fekilde tetiklenir.<br \/>\n    5.  <strong>Temizleme:<\/strong> Animasyon bittikten sonra (\u00f6rne\u011fin <code>transitionend<\/code> veya <code>animationend<\/code> olay dinleyicisi ile), <code>ripple.remove()<\/code> \u00e7a\u011fr\u0131s\u0131 yap\u0131larak dalgalanma elementi DOM&#8217;dan kald\u0131r\u0131l\u0131r. Bu, gereksiz DOM elemanlar\u0131n\u0131n birikmesini \u00f6nler.<\/p>\n<h3>Eri\u015filebilirlik (Accessibility) ve Performans \u0130pu\u00e7lar\u0131<\/h3>\n<p>*   <strong>Eri\u015filebilirlik:<\/strong><br \/>\n    *   <strong><code>prefers-reduced-motion<\/code>:<\/strong> Baz\u0131 kullan\u0131c\u0131lar hareketli animasyonlara kar\u015f\u0131 hassas olabilir. CSS medya sorgusu <code>@media (prefers-reduced-motion: reduce)<\/code> kullanarak, bu kullan\u0131c\u0131lar i\u00e7in dalgalanma efektlerini devre d\u0131\u015f\u0131 b\u0131rakabilir veya basitle\u015ftirebilirsiniz.<br \/>\n    *   <strong>Anlamsal HTML:<\/strong> Dalgalanma efektini uygulad\u0131\u011f\u0131n\u0131z elementlerin do\u011fru anlamsal HTML etiketleri (\u00f6rne\u011fin <code>button<\/code>, <code>a<\/code>, <code>li<\/code>) ve uygun ARIA rolleri ve etiketleri (<code>aria-label<\/code>) ile kullan\u0131ld\u0131\u011f\u0131ndan emin olun. Efektin kendisi eri\u015filebilirli\u011fi do\u011frudan etkilemez, ancak kapsay\u0131c\u0131 elementin eri\u015filebilirli\u011fi \u00f6nemlidir.<\/p>\n<p>*   <strong>Performans:<\/strong><br \/>\n    *   <strong>Gereksiz DOM Manip\u00fclasyonundan Ka\u00e7\u0131nma:<\/strong> Her t\u0131klamada yeni bir DOM elementi olu\u015fturup kald\u0131rmak, \u00f6zellikle yo\u011fun etkile\u015fimli sayfalarda performans maliyeti yaratabilir. Ancak dalgalanma efektleri genellikle k\u0131sa \u00f6m\u00fcrl\u00fc oldu\u011fu i\u00e7in bu kabul edilebilir bir maliyettir. <code>transitionend<\/code> veya <code>animationend<\/code> olaylar\u0131n\u0131 kullanarak elementleri zaman\u0131nda kald\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n    *   <strong>CSS <code>transform<\/code> ve <code>opacity<\/code> Kullan\u0131m\u0131:<\/strong> Animasyonlar i\u00e7in <code>width<\/code>, <code>height<\/code>, <code>left<\/code>, <code>top<\/code> gibi \u00f6zellikler yerine <code>transform<\/code> (\u00f6zellikle <code>scale<\/code> ve <code>translate<\/code>) ve <code>opacity<\/code> kullanmak, taray\u0131c\u0131n\u0131n GPU h\u0131zland\u0131rmas\u0131ndan faydalanmas\u0131n\u0131 sa\u011flar ve daha ak\u0131c\u0131 animasyonlar elde etmenize yard\u0131mc\u0131 olur. Bu \u00f6zellikler, &#8220;layout&#8221; veya &#8220;paint&#8221; i\u015flemlerini tetiklemez, sadece &#8220;composite&#8221; a\u015famas\u0131n\u0131 etkiler.<br \/>\n    *   <strong><code>will-change<\/code> \u00d6zelli\u011fi:<\/strong> Baz\u0131 durumlarda, dalgalanma elementine <code>will-change: transform, opacity;<\/code> eklemek, taray\u0131c\u0131n\u0131n animasyonu optimize etmesine yard\u0131mc\u0131 olabilir. Ancak bu \u00f6zelli\u011fi dikkatli kullanmak gerekir, \u00e7\u00fcnk\u00fc yanl\u0131\u015f kullan\u0131m\u0131 performans\u0131 olumsuz etkileyebilir.<br \/>\n    *   <strong><code>passive<\/code> Event Listeners:<\/strong> \u00d6zellikle <code>touchstart<\/code> ve <code>touchmove<\/code> gibi dokunmatik olaylar\u0131 dinlerken, <code>passive: true<\/code> se\u00e7ene\u011fini kullanmak, kayd\u0131rma performans\u0131n\u0131 art\u0131rabilir. Ancak <code>mousedown<\/code> olaylar\u0131 i\u00e7in genellikle gerekli de\u011fildir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131 ve \u0130leri Seviye Kullan\u0131m<\/h2>\n<p>Material Ripples efektini temel d\u00fczeyde uygulamay\u0131 \u00f6\u011frendikten sonra, bu efekti ger\u00e7ek d\u00fcnya uygulamalar\u0131n\u0131zda daha etkili bir \u015fekilde nas\u0131l kullanabilece\u011finizi ve ileri seviye \u00f6zelle\u015ftirmeler yapabilece\u011finizi inceleyelim.<\/p>\n<h3>Farkl\u0131 Bile\u015fen Tipleriyle Entegrasyon<\/h3>\n<p>Dalgalanma efektleri sadece butonlarla s\u0131n\u0131rl\u0131 de\u011fildir. Uygulaman\u0131zdaki bir\u00e7ok etkile\u015fimli bile\u015fene uygulanabilir:<\/p>\n<p>*   <strong>Kartlar (Cards):<\/strong> Bir kullan\u0131c\u0131 bir kart\u0131n \u00fczerine t\u0131klad\u0131\u011f\u0131nda veya dokundu\u011funda, t\u00fcm kart \u00fczerinde yay\u0131lan bir dalgalanma, kart\u0131n se\u00e7ilebilir veya etkile\u015fimli oldu\u011funu g\u00f6sterir. \u00d6zellikle bir kart\u0131n detay sayfas\u0131na gitmek gibi bir eylemi tetikledi\u011finde \u00f6nemlidir.<\/p>\n<pre><code class=\"language-vue\"><template>\n      <div v-ripple class=\"product-card\">\n        <img decoding=\"async\" src=\"product.jpg\" alt=\"\u00dcr\u00fcn Resmi\">\n        <h3>\u00dcr\u00fcn Ad\u0131<\/h3>\n        <p>K\u0131sa \u00fcr\u00fcn a\u00e7\u0131klamas\u0131.<\/p>\n        <button>Sepete Ekle<\/button>\n      <\/div>\n    <\/template><\/code><\/pre>\n<p>*   <strong>Liste \u00d6\u011feleri (List Items):<\/strong> Bir <code>ul<\/code> veya <code>ol<\/code> i\u00e7indeki <code>li<\/code> elementleri, \u00f6zellikle bir listeyi filtrelemek, bir \u00f6\u011feyi se\u00e7mek veya bir detay\u0131 g\u00f6r\u00fcnt\u00fclemek i\u00e7in kullan\u0131ld\u0131\u011f\u0131nda dalgalanma efektiyle daha duyarl\u0131 hale gelir.<\/p>\n<pre><code class=\"language-vue\"><template>\n      <ul class=\"item-list\">\n        <li v-ripple v-for=\"item in items\" :key=\"item.id\" class=\"list-item\">\n          {{ item.name }}\n        <\/li>\n      <\/ul>\n    <\/template><\/code><\/pre>\n<p>*   <strong>Navigasyon \u00d6\u011feleri:<\/strong> Men\u00fc \u00f6\u011feleri, sekme ba\u015fl\u0131klar\u0131 veya ba\u011flant\u0131lar gibi navigasyon bile\u015fenleri, t\u0131klama an\u0131nda dalgalanma g\u00f6stererek kullan\u0131c\u0131n\u0131n nerede oldu\u011funu ve nereye gitti\u011fini g\u00f6rsel olarak peki\u015ftirir.<\/p>\n<pre><code class=\"language-vue\"><template>\n      <nav>\n        <a v-ripple href=\"#home\">Ana Sayfa<\/a>\n        <a v-ripple href=\"#about\">Hakk\u0131m\u0131zda<\/a>\n        <a v-ripple href=\"#contact\">\u0130leti\u015fim<\/a>\n      <\/nav>\n    <\/template><\/code><\/pre>\n<p>Bu entegrasyonlarda \u00f6nemli olan, dalgalanma efektinin kapsay\u0131c\u0131 elementin <code>position: relative<\/code> ve <code>overflow: hidden<\/code> \u00f6zelliklerine sahip oldu\u011fundan emin olmakt\u0131r.<\/p>\n<h3>Renk ve Tema Entegrasyonu<\/h3>\n<p>Dalgalanma efektinin rengini ve di\u011fer g\u00f6rsel \u00f6zelliklerini uygulaman\u0131z\u0131n genel tema renkleriyle uyumlu hale getirmek, tutarl\u0131 bir kullan\u0131c\u0131 deneyimi i\u00e7in kritiktir.<\/p>\n<p>*   <strong>CSS De\u011fi\u015fkenleri (<code>--ripple-color<\/code>):<\/strong><br \/>\n    Dalgalanma direktifiniz veya bile\u015feniniz, CSS de\u011fi\u015fkenlerini kullanarak rengi dinamik olarak ayarlayabilir.<\/p>\n<pre><code class=\"language-css\">\/<em> global.css <\/em>\/\n    :root {\n      --primary-color: #42b983;\n      --ripple-color: rgba(255, 255, 255, 0.7); \/<em> Varsay\u0131lan <\/em>\/\n    }\n\n    \/<em> E\u011fer bir bile\u015fenin kendi rengi varsa <\/em>\/\n    .my-button {\n      background-color: var(--primary-color);\n      \/<em> Dalgalanma rengini butona g\u00f6re ayarlamak i\u00e7in <\/em>\/\n      --ripple-color: rgba(0, 0, 0, 0.2);\n    }<\/code><\/pre>\n<p>    Daha sonra JavaScript&#8217;te veya Vue prop&#8217;lar\u0131nda bu de\u011fi\u015fkenleri kullanabilirsiniz. Direktifiniz, <code>binding.value<\/code> arac\u0131l\u0131\u011f\u0131yla bir renk dizesi alabilir ve bunu dalgalanma elementinin <code>backgroundColor<\/code> \u00f6zelli\u011fine atayabilir.<\/p>\n<p>*   <strong>Vuex veya Provide\/Inject ile Tema Y\u00f6netimi:<\/strong><br \/>\n    Daha b\u00fcy\u00fck uygulamalarda, tema renklerini merkezi bir yerden (Vuex store veya <code>provide<\/code>\/<code>inject<\/code> API&#8217;si) y\u00f6netmek daha mant\u0131kl\u0131 olabilir. Bu sayede, uygulaman\u0131z\u0131n tema modu (a\u00e7\u0131k\/koyu) de\u011fi\u015fti\u011finde dalgalanma renkleri de otomatik olarak g\u00fcncellenebilir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\n    import { createApp } from 'vue';\n    import App from '.\/App.vue';\n    import RippleDirective from '.\/directives\/ripple'; \/\/ Kendi direktifimiz\n\n    const app = createApp(App);\n\n    \/\/ Global olarak tema rengini provide et\n    app.provide('themeColor', 'dark'); \/\/ veya 'light'\n\n    app.directive('ripple', RippleDirective);\n    app.mount('#app');<\/code><\/pre>\n<pre><code class=\"language-javascript\">\/\/ src\/directives\/ripple.js (veya RippleWrapper.vue)\n    \/\/ ...\n    import { inject } from 'vue'; \/\/ E\u011fer setup script kullan\u0131yorsan\u0131z\n\n    function createRipple(event, binding) {\n      \/\/ const themeColor = inject('themeColor'); \/\/ E\u011fer provide\/inject kullan\u0131l\u0131yorsa\n      const rippleColor = binding.value || 'rgba(255, 255, 255, 0.7)'; \/\/ Varsay\u0131lan veya direktif de\u011feri\n      \/\/ ... ripple.style.backgroundColor = rippleColor;\n    }\n    \/\/ ...<\/code><\/pre>\n<h3>Dinleyicileri Y\u00f6netme<\/h3>\n<p>Bir elemente <code>v-ripple<\/code> direktifi uygulad\u0131\u011f\u0131n\u0131zda ve ayn\u0131 zamanda bu elemente ba\u015fka bir <code>@click<\/code> olay\u0131 ekledi\u011finizde, olaylar\u0131n do\u011fru s\u0131rayla tetiklendi\u011finden emin olman\u0131z gerekir. Genellikle <code>mousedown<\/code> olay\u0131nda dalgalanmay\u0131 ba\u015flatmak ve <code>mouseup<\/code> veya <code>mouseleave<\/code> olay\u0131nda bitirmek, t\u0131klama olaylar\u0131yla \u00e7ak\u0131\u015fmay\u0131 \u00f6nler. Dalgalanma elementine <code>pointer-events: none;<\/code> eklemek, dalgalanman\u0131n kendisinin t\u0131klama olaylar\u0131n\u0131 engellemesini sa\u011flar.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular ve Kar\u015f\u0131la\u015f\u0131lan Problemler<\/h2>\n<p>Material Ripples entegrasyonu s\u0131ras\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan baz\u0131 sorunlar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri:<\/p>\n<p>*   <strong>Dalgalanma Neden G\u00f6r\u00fcnm\u00fcyor?<\/strong><br \/>\n    *   <strong><code>position: relative;<\/code> Eksikli\u011fi:<\/strong> Dalgalanma efekti elementi (<code>span<\/code> veya <code>div<\/code>), ana elementin i\u00e7inde <code>position: absolute;<\/code> ile konumland\u0131r\u0131l\u0131r. Ana elementin <code>position: relative;<\/code> (veya <code>absolute<\/code>, <code>fixed<\/code>) olmas\u0131 gerekir. Aksi takdirde, dalgalanma <code>body<\/code> veya en yak\u0131n <code>positioned<\/code> ataya g\u00f6re konumlan\u0131r ve beklenmedik yerlerde g\u00f6r\u00fcnebilir veya hi\u00e7 g\u00f6r\u00fcnmeyebilir.<br \/>\n    *   <strong><code>overflow: hidden;<\/code> Eksikli\u011fi:<\/strong> Dalgalanma elementinin ana elementin s\u0131n\u0131rlar\u0131 i\u00e7inde kalmas\u0131 i\u00e7in ana elementin <code>overflow: hidden;<\/code> stilini ta\u015f\u0131mas\u0131 gerekir. Bu yoksa, dalgalanma ana elementin d\u0131\u015f\u0131na ta\u015far ve \u00e7irkin bir g\u00f6r\u00fcnt\u00fc olu\u015fturur.<br \/>\n    *   <strong>CSS Stillerinin Y\u00fcklenmemesi:<\/strong> Dalgalanma i\u00e7in gerekli olan <code>.ripple<\/code> veya <code>.ripple-effect<\/code> s\u0131n\u0131f\u0131n\u0131n CSS stillerinin (\u00f6zellikle <code>transform: scale(0);<\/code> ve <code>opacity<\/code> ge\u00e7i\u015fleri) do\u011fru bir \u015fekilde y\u00fcklendi\u011finden ve uyguland\u0131\u011f\u0131ndan emin olun.<br \/>\n    <\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme\nGiri\u015f: Kullan\u0131c\u0131 Deneyimini Zenginle\u015ftiren Material Dalgalanmalar\nModern web uygulam","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1402],"tags":[],"class_list":{"0":"post-31493","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-vue","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme\" \/>\n<meta property=\"og:description\" content=\"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme Giri\u015f: Kullan\u0131c\u0131 Deneyimini Zenginle\u015ftiren Material Dalgalanmalar Modern web uygulam\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T11:41:34+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme\",\"datePublished\":\"2025-10-10T11:41:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/\"},\"wordCount\":3406,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/\",\"name\":\"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-10T11:41:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme","og_description":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme Giri\u015f: Kullan\u0131c\u0131 Deneyimini Zenginle\u015ftiren Material Dalgalanmalar Modern web uygulam","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-10T11:41:34+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme","datePublished":"2025-10-10T11:41:34+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/"},"wordCount":3406,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/","name":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-10T11:41:34+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-bilesenlerinize-material-dalgalanma-efektleri-ekleme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js Bile\u015fenlerinize Material Dalgalanma Efektleri Ekleme"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31493"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31493\/revisions"}],"predecessor-version":[{"id":31494,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31493\/revisions\/31494"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31493"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31493"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}