{"id":33928,"date":"2025-11-08T23:40:57","date_gmt":"2025-11-08T20:40:57","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33928"},"modified":"2025-11-08T23:40:57","modified_gmt":"2025-11-08T20:40:57","slug":"vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/","title":{"rendered":"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Netflix, modern web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini (UX) zenginle\u015ftiren, g\u00f6rsel olarak \u00e7ekici ve etkile\u015fimli aray\u00fczlerin \u00f6nc\u00fclerinden biridir. \u00d6zellikle ana sayfas\u0131ndaki yatay kayd\u0131rma listeleri, kullan\u0131c\u0131lara geni\u015f i\u00e7erik yelpazesini ke\u015ffetme imkan\u0131 sunarken, ayn\u0131 zamanda d\u00fczenli ve estetik bir g\u00f6r\u00fcn\u00fcm sa\u011flar. Bu t\u00fcr &#8220;swiper&#8221; veya &#8220;carousel&#8221; bile\u015fenleri, e-ticaret sitelerinden haber portallar\u0131na kadar bir\u00e7ok platformda \u00fcr\u00fcnleri, makaleleri veya di\u011fer \u00f6\u011feleri sergilemek i\u00e7in vazge\u00e7ilmez hale gelmi\u015ftir. Bu makalede, Vue.js kullanarak Netflix benzeri, \u00f6zelle\u015ftirilebilir ve performansl\u0131 kayd\u0131rma bile\u015fenlerini ad\u0131m ad\u0131m nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Hem temel bir yap\u0131y\u0131 s\u0131f\u0131rdan in\u015fa edecek hem de ileri d\u00fczey \u00f6zellikler, performans optimizasyonlar\u0131 ve eri\u015filebilirlik ipu\u00e7lar\u0131 hakk\u0131nda bilgi verece\u011fiz.<\/p>\n<h3>Giri\u015f: Neden Netflix Tarz\u0131 Swiper&#8217;lar ve Vue.js?<\/h3>\n<p>Netflix&#8217;in kayd\u0131rma bile\u015fenleri, kullan\u0131c\u0131n\u0131n dikkatini \u00e7ekme, i\u00e7erik ke\u015ffini kolayla\u015ft\u0131rma ve s\u0131n\u0131rl\u0131 ekran alan\u0131nda zengin veri sunma konusunda olduk\u00e7a ba\u015far\u0131l\u0131d\u0131r. Bu bile\u015fenler sayesinde kullan\u0131c\u0131lar, sayfay\u0131 dikey olarak kayd\u0131rmadan, ilgilendikleri kategori veya koleksiyon i\u00e7indeki di\u011fer \u00f6\u011felere yatay olarak g\u00f6z atabilirler. Bu, \u00f6zellikle mobil cihazlarda ekran alan\u0131n\u0131n k\u0131s\u0131tl\u0131 oldu\u011fu durumlarda hayati \u00f6nem ta\u015f\u0131r. G\u00f6rsel olarak \u00e7ekici animasyonlar ve sezgisel navigasyon, kullan\u0131c\u0131lar\u0131n uygulamayla daha fazla etkile\u015fim kurmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Peki neden Vue.js? Vue.js, progresif bir JavaScript \u00e7er\u00e7evesidir; yani k\u00fc\u00e7\u00fck bir etkile\u015fimli bile\u015fen eklemek i\u00e7in de, b\u00fcy\u00fck \u00f6l\u00e7ekli tek sayfa uygulamalar\u0131 (SPA) geli\u015ftirmek i\u00e7in de kullan\u0131labilir. Bile\u015fen tabanl\u0131 mimarisi, reaktif veri ba\u011flama yetenekleri ve anla\u015f\u0131l\u0131r s\u00f6zdizimi sayesinde karma\u015f\u0131k UI bile\u015fenlerini geli\u015ftirmeyi olduk\u00e7a kolayla\u015ft\u0131r\u0131r. Performans odakl\u0131 yap\u0131s\u0131 ve geli\u015fen ekosistemi, Netflix tarz\u0131 kayd\u0131rma bile\u015fenleri gibi dinamik ve etkile\u015fimli \u00f6\u011feleri olu\u015fturmak i\u00e7in Vue.js&#8217;i m\u00fckemmel bir se\u00e7im haline getirir.<\/p>\n<p>Bu makalede, \u00f6ncelikle temel bir kayd\u0131rma bile\u015feninin anatomisini anlayacak, ard\u0131ndan Vue.js ile basit bir versiyonunu olu\u015fturacak ve son olarak navigasyon oklar\u0131, duyarl\u0131 tasar\u0131m, performans optimizasyonlar\u0131 ve s\u00fcr\u00fckle-b\u0131rak (drag-to-scroll) gibi geli\u015fmi\u015f \u00f6zelliklerle bile\u015fenimizi zenginle\u015ftirece\u011fiz. Ayr\u0131ca, \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerin ne zaman kullan\u0131laca\u011f\u0131 ve pop\u00fcler alternatifler hakk\u0131nda da bilgi verece\u011fiz.<\/p>\n<h3>Temel Konseptler ve Haz\u0131rl\u0131k<\/h3>\n<p>Netflix benzeri bir kayd\u0131rma bile\u015feni olu\u015fturmadan \u00f6nce, temel yap\u0131 ta\u015flar\u0131n\u0131 ve Vue.js projemizi nas\u0131l haz\u0131rlayaca\u011f\u0131m\u0131z\u0131 anlamam\u0131z gerekiyor.<\/p>\n<h4>Kayd\u0131rma Bile\u015fenlerinin Anatomisi<\/h4>\n<p>Bir kayd\u0131rma bile\u015feni genellikle \u015fu \u00f6\u011felerden olu\u015fur:<\/p>\n<ul>\n<li><strong>Kapsay\u0131c\u0131 (Container):<\/strong> T\u00fcm kayd\u0131rma bile\u015fenini saran ana element. Genellikle bir ba\u015fl\u0131k ve kayd\u0131r\u0131labilir i\u00e7eri\u011fi bar\u0131nd\u0131r\u0131r.<\/li>\n<li><strong>Kayd\u0131rma Alan\u0131 (Scroller\/Wrapper):<\/strong> \u0130\u00e7indeki \u00f6\u011felerin yatay olarak d\u00fczenlendi\u011fi ve kayd\u0131r\u0131ld\u0131\u011f\u0131 alan. Bu alanda <code>overflow-x: auto;<\/code> veya <code>scroll;<\/code> gibi CSS \u00f6zellikleri kullan\u0131l\u0131r.<\/li>\n<li><strong>\u00d6\u011feler (Items):<\/strong> Kayd\u0131r\u0131labilir listenin her bir eleman\u0131 (\u00f6rne\u011fin, bir film posteri, bir \u00fcr\u00fcn kart\u0131). Bu \u00f6\u011feler genellikle esnek kutu (flexbox) veya \u0131zgara (grid) d\u00fczeni ile yatay olarak s\u0131ralan\u0131r.<\/li>\n<li><strong>Navigasyon Kontrolleri (Navigation Controls):<\/strong> Kullan\u0131c\u0131n\u0131n kayd\u0131rma alan\u0131n\u0131 manuel olarak hareket ettirmesini sa\u011flayan ok butonlar\u0131 (sol ve sa\u011f).<\/li>\n<\/ul>\n<h4>Vue.js Projesi Olu\u015fturma<\/h4>\n<p>Yeni bir Vue.js projesi olu\u015fturmak i\u00e7in Vue CLI veya Vite kullanabilirsiniz. Vite, daha h\u0131zl\u0131 bir geli\u015ftirme deneyimi sundu\u011fu i\u00e7in genellikle tercih edilir.<\/p>\n<pre><code class=\"language-bash\">\n<h2>Vite ile yeni bir Vue projesi olu\u015fturma<\/h2>\nnpm create vue@latest\n\n<h2>Proje ad\u0131n\u0131 girin (\u00f6rn: netflix-swiper-app)<\/h2>\n<h2>Vue 3, TypeScript yok, JSX yok, Router yok, Pinia yok, Vitest yok, Cypress yok, ESLint yok se\u00e7ebilirsiniz.<\/h2>\n\ncd netflix-swiper-app\nnpm install\nnpm run dev\n<\/code><\/pre>\n<p>Bu komutlarla temel bir Vue 3 projesi olu\u015fturmu\u015f olacaks\u0131n\u0131z. \u015eimdi, <code>src\/components<\/code> klas\u00f6r\u00fcnde yeni bir Vue bile\u015feni olu\u015fturmaya ba\u015flayabiliriz.<\/p>\n<h3>Basit Bir Kayd\u0131rma Bile\u015feni Olu\u015fturma<\/h3>\n<p>\u0130lk ad\u0131m olarak, navigasyon oklar\u0131 olmadan sadece yatay olarak kayd\u0131r\u0131labilen bir \u00f6\u011fe listesi olu\u015fturaca\u011f\u0131z.<\/p>\n<h4>Veri Yap\u0131s\u0131<\/h4>\n<p>\u00d6ncelikle, bile\u015fenimizin g\u00f6sterece\u011fi i\u00e7erik i\u00e7in \u00f6rnek bir veri yap\u0131s\u0131na ihtiyac\u0131m\u0131z var. Bu, genellikle bir dizi nesneden olu\u015fur:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ src\/components\/NetflixRow.vue\nimport { ref } from 'vue';\n\nconst movies = ref([\n  { id: 1, title: 'Film 1', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+1' },\n  { id: 2, title: 'Film 2', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+2' },\n  { id: 3, title: 'Film 3', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+3' },\n  { id: 4, title: 'Film 4', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+4' },\n  { id: 5, title: 'Film 5', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+5' },\n  { id: 6, title: 'Film 6', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+6' },\n  { id: 7, title: 'Film 7', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+7' },\n  { id: 8, title: 'Film 8', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+8' },\n  { id: 9, title: 'Film 9', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+9' },\n  { id: 10, title: 'Film 10', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+10' },\n]);\n<\/code><\/pre>\n<h4>Temel HTML Yap\u0131s\u0131<\/h4>\n<p>\u015eimdi, bu veriyi kullanarak temel bir HTML yap\u0131s\u0131 olu\u015ftural\u0131m. Bir ana kapsay\u0131c\u0131, i\u00e7inde kayd\u0131r\u0131labilir bir sarmalay\u0131c\u0131 ve <code>v-for<\/code> d\u00f6ng\u00fcs\u00fcyle olu\u015fturulan film kartlar\u0131 olacak.<\/p>\n<pre><code class=\"language-html\">\n<!-- src\/components\/NetflixRow.vue -->\n<template>\n  <div class=\"netflix-row\">\n    <h3 class=\"row-title\">Pop\u00fcler Filmler<\/h3>\n    <div class=\"row-content-wrapper\">\n      <div class=\"row-content\" ref=\"rowContent\">\n        <div v-for=\"movie in movies\" :key=\"movie.id\" class=\"movie-item\">\n          <img :src=\"movie.imageUrl\" :alt=\"movie.title\" class=\"movie-poster\" \/>\n          <span class=\"movie-title\">{{ movie.title }}<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\n\nconst movies = ref([\n  { id: 1, title: 'Film 1', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+1' },\n  { id: 2, title: 'Film 2', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+2' },\n  \/\/ ... di\u011fer filmler\n  { id: 10, title: 'Film 10', imageUrl: 'https:\/\/via.placeholder.com\/200x300?text=Film+10' },\n]);\n\nconst rowContent = ref(null); \/\/ Kayd\u0131rma alan\u0131na referans\n<\/script>\n<\/code><\/pre>\n<h4>CSS ile Yatay D\u00fczenleme<\/h4>\n<p>\u015eimdi bu yap\u0131ya CSS ile yatay kayd\u0131rma \u00f6zelli\u011fini kazand\u0131ral\u0131m. Flexbox kullanarak \u00f6\u011feleri yan yana dizecek ve <code>overflow-x<\/code> ile yatay kayd\u0131rmay\u0131 etkinle\u015ftirece\u011fiz.<\/p>\n<pre><code class=\"language-css\">\n<!-- src\/components\/NetflixRow.vue -->\n<style scoped>\n.netflix-row {\n  margin-bottom: 30px;\n  position: relative; \/<em> Oklar i\u00e7in <\/em>\/\n}\n\n.row-title {\n  color: #e5e5e5;\n  font-size: 1.5rem;\n  margin-left: 60px; \/<em> Netflix'in kenar bo\u015flu\u011fu <\/em>\/\n  margin-bottom: 15px;\n}\n\n.row-content-wrapper {\n  position: relative;\n  overflow: hidden; \/<em> Oklar\u0131n d\u0131\u015far\u0131 ta\u015fmas\u0131n\u0131 \u00f6nler <\/em>\/\n  padding: 0 60px; \/<em> Kayd\u0131rma alan\u0131n\u0131n kenar bo\u015flu\u011fu <\/em>\/\n}\n\n.row-content {\n  display: flex;\n  gap: 10px; \/<em> \u00d6\u011feler aras\u0131 bo\u015fluk <\/em>\/\n  overflow-x: scroll; \/<em> Yatay kayd\u0131rmay\u0131 etkinle\u015ftir <\/em>\/\n  scroll-behavior: smooth; \/<em> Yumu\u015fak kayd\u0131rma animasyonu <\/em>\/\n  -webkit-overflow-scrolling: touch; \/<em> iOS'ta daha iyi kayd\u0131rma performans\u0131 <\/em>\/\n  scrollbar-width: none; \/<em> Firefox'ta kayd\u0131rma \u00e7ubu\u011funu gizle <\/em>\/\n  \/<em> IE ve Edge i\u00e7in kayd\u0131rma \u00e7ubu\u011funu gizle <\/em>\/\n  -ms-overflow-style: none; \n}\n\n\/<em> Webkit taray\u0131c\u0131lar\u0131 (Chrome, Safari) i\u00e7in kayd\u0131rma \u00e7ubu\u011funu gizle <\/em>\/\n.row-content::-webkit-scrollbar {\n  display: none;\n}\n\n.movie-item {\n  flex-shrink: 0; \/<em> \u00d6\u011felerin k\u00fc\u00e7\u00fclmesini engelle <\/em>\/\n  width: 200px; \/<em> Film posteri geni\u015fli\u011fi <\/em>\/\n  height: 300px; \/<em> Film posteri y\u00fcksekli\u011fi <\/em>\/\n  background-color: #222;\n  border-radius: 5px;\n  overflow: hidden;\n  position: relative;\n  cursor: pointer;\n  transition: transform 0.2s ease-in-out;\n}\n\n.movie-item:hover {\n  transform: scale(1.05); \/<em> Hover efekti <\/em>\/\n  z-index: 10; \/<em> \u00dcstte g\u00f6r\u00fcnmesini sa\u011fla <\/em>\/\n}\n\n.movie-poster {\n  width: 100%;\n  height: 100%;\n  object-fit: cover; \/<em> Resmi kutuya s\u0131\u011fd\u0131r <\/em>\/\n}\n\n.movie-title {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  background-color: rgba(0, 0, 0, 0.7);\n  color: #fff;\n  padding: 10px;\n  font-size: 0.9rem;\n  text-align: center;\n  opacity: 0;\n  transition: opacity 0.2s ease-in-out;\n}\n\n.movie-item:hover .movie-title {\n  opacity: 1;\n}\n<\/style>\n<\/code><\/pre>\n<p>Bu CSS ile film posterleri yatay olarak s\u0131ralanacak ve fare tekerle\u011fi veya dokunmatik hareketlerle kayd\u0131r\u0131labilecektir. Kayd\u0131rma \u00e7ubu\u011funu gizleyerek daha temiz bir g\u00f6r\u00fcn\u00fcm elde ettik.<\/p>\n<h3>Navigasyon ve Etkile\u015fim Ekleme<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n kayd\u0131rma bile\u015fenini daha kolay kontrol etmesi i\u00e7in sol ve sa\u011f ok butonlar\u0131 ekleyece\u011fiz. Bu butonlar, JavaScript ile kayd\u0131rma alan\u0131n\u0131n <code>scrollLeft<\/code> \u00f6zelli\u011fini manip\u00fcle ederek \u00e7al\u0131\u015facak.<\/p>\n<h4>Kayd\u0131rma Oklar\u0131<\/h4>\n<p>Ok butonlar\u0131n\u0131 ekleyelim ve bunlara t\u0131klama olaylar\u0131 atayal\u0131m. Bu butonlar, <code>row-content-wrapper<\/code> i\u00e7inde, kayd\u0131rma alan\u0131n\u0131n \u00fczerine konumland\u0131r\u0131lacak.<\/p>\n<pre><code class=\"language-html\">\n<!-- src\/components\/NetflixRow.vue -->\n<template>\n  <div class=\"netflix-row\">\n    <h3 class=\"row-title\">Pop\u00fcler Filmler<\/h3>\n    <div class=\"row-content-wrapper\">\n      <button class=\"scroll-arrow left-arrow\" @click=\"scroll('left')\" :disabled=\"!canScrollLeft\">\n        <!-- Sol ok SVG ikonu -->\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6z\"\/><\/svg>\n      <\/button>\n      <div class=\"row-content\" ref=\"rowContent\">\n        <div v-for=\"movie in movies\" :key=\"movie.id\" class=\"movie-item\">\n          <img :src=\"movie.imageUrl\" :alt=\"movie.title\" class=\"movie-poster\" \/>\n          <span class=\"movie-title\">{{ movie.title }}<\/span>\n        <\/div>\n      <\/div>\n      <button class=\"scroll-arrow right-arrow\" @click=\"scroll('right')\" :disabled=\"!canScrollRight\">\n        <!-- Sa\u011f ok SVG ikonu -->\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z\"\/><\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { ref, onMounted, onUnmounted, computed } from 'vue';\n\n\/\/ ... (movies verisi ayn\u0131)\n\nconst rowContent = ref(null);\nconst scrollPosition = ref(0); \/\/ Mevcut kayd\u0131rma pozisyonunu takip etmek i\u00e7in\n\nconst scroll = (direction) => {\n  if (rowContent.value) {\n    const itemWidth = 210; \/\/ movie-item geni\u015fli\u011fi + gap (200px + 10px)\n    const scrollAmount = itemWidth * 4; \/\/ Her t\u0131klamada 4 \u00f6\u011fe kadar kayd\u0131r\n\n    if (direction === 'left') {\n      rowContent.value.scrollLeft -= scrollAmount;\n    } else {\n      rowContent.value.scrollLeft += scrollAmount;\n    }\n  }\n};\n\nconst handleScroll = () => {\n  if (rowContent.value) {\n    scrollPosition.value = rowContent.value.scrollLeft;\n  }\n};\n\nonMounted(() => {\n  if (rowContent.value) {\n    rowContent.value.addEventListener('scroll', handleScroll);\n  }\n});\n\nonUnmounted(() => {\n  if (rowContent.value) {\n    rowContent.value.removeEventListener('scroll', handleScroll);\n  }\n});\n\nconst canScrollLeft = computed(() => {\n  return scrollPosition.value > 0;\n});\n\nconst canScrollRight = computed(() => {\n  if (rowContent.value) {\n    \/\/ scrollWidth: Kayd\u0131r\u0131labilir i\u00e7eri\u011fin toplam geni\u015fli\u011fi\n    \/\/ clientWidth: Kayd\u0131rma alan\u0131n\u0131n g\u00f6r\u00fcnen geni\u015fli\u011fi\n    \/\/ scrollLeft: Mevcut kayd\u0131rma pozisyonu\n    return rowContent.value.scrollWidth > rowContent.value.clientWidth + scrollPosition.value;\n  }\n  return false;\n});\n<\/script>\n\n<style scoped>\n\/<em> ... (\u00f6nceki CSS) ... <\/em>\/\n\n.scroll-arrow {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 60px; \/<em> Netflix'in kenar bo\u015flu\u011funa denk gelecek geni\u015flik <\/em>\/\n  background-color: rgba(0, 0, 0, 0.5);\n  color: #fff;\n  border: none;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 2rem;\n  z-index: 20;\n  opacity: 0; \/<em> Varsay\u0131lan olarak gizli <\/em>\/\n  transition: opacity 0.3s ease-in-out;\n}\n\n.netflix-row:hover .scroll-arrow {\n  opacity: 1; \/<em> Sat\u0131r \u00fczerine gelindi\u011finde g\u00f6r\u00fcn\u00fcr <\/em>\/\n}\n\n.scroll-arrow:hover {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n\n.scroll-arrow.left-arrow {\n  left: 0;\n  border-top-left-radius: 5px;\n  border-bottom-left-radius: 5px;\n}\n\n.scroll-arrow.right-arrow {\n  right: 0;\n  border-top-right-radius: 5px;\n  border-bottom-right-radius: 5px;\n}\n\n.scroll-arrow:disabled {\n  opacity: 0.3 !important; \/<em> Devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131nda daha soluk <\/em>\/\n  cursor: not-allowed;\n}\n\n.scroll-arrow svg {\n    width: 35px;\n    height: 35px;\n}\n<\/style>\n<\/code><\/pre>\n<p>Yukar\u0131daki kodda, <code>scroll<\/code> fonksiyonu ile <code>scrollLeft<\/code> \u00f6zelli\u011fini kullanarak kayd\u0131rma i\u015flemini ger\u00e7ekle\u015ftirdik. <code>onMounted<\/code> ve <code>onUnmounted<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131n\u0131 kullanarak kayd\u0131rma olay\u0131n\u0131 dinledik ve <code>scrollPosition<\/code>&#8216;\u0131 g\u00fcncelledik. <code>computed<\/code> \u00f6zellikler olan <code>canScrollLeft<\/code> ve <code>canScrollRight<\/code> ile oklar\u0131n ne zaman devre d\u0131\u015f\u0131 b\u0131rak\u0131laca\u011f\u0131n\u0131 belirledik. Bu, kullan\u0131c\u0131n\u0131n kayd\u0131rabilece\u011fi bir alan kalmad\u0131\u011f\u0131nda oklar\u0131n t\u0131klanamaz olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Geli\u015fmi\u015f \u00d6zellikler ve Kullan\u0131c\u0131 Deneyimi<\/h3>\n<p>Temel kayd\u0131rma bile\u015fenimiz art\u0131k \u00e7al\u0131\u015f\u0131yor. \u015eimdi, kullan\u0131c\u0131 deneyimini daha da iyile\u015ftirecek ve bile\u015fenimizi daha esnek hale getirecek geli\u015fmi\u015f \u00f6zelliklere odaklanal\u0131m.<\/p>\n<h4>Duyarl\u0131 Tasar\u0131m (Responsive Design)<\/h4>\n<p>Farkl\u0131 ekran boyutlar\u0131nda bile\u015fenin do\u011fru g\u00f6r\u00fcnmesini sa\u011flamak kritik \u00f6neme sahiptir. Media query&#8217;ler kullanarak film \u00f6\u011felerinin geni\u015fli\u011fini ve bir seferde g\u00f6r\u00fcnen \u00f6\u011fe say\u0131s\u0131n\u0131 ayarlayabiliriz.<\/p>\n<pre><code class=\"language-css\">\n<!-- src\/components\/NetflixRow.vue -->\n<style scoped>\n\/<em> ... (\u00f6nceki CSS) ... <\/em>\/\n\n\/<em> K\u00fc\u00e7\u00fck ekranlar i\u00e7in <\/em>\/\n@media (max-width: 768px) {\n  .row-title {\n    margin-left: 20px;\n  }\n  .row-content-wrapper {\n    padding: 0 20px;\n  }\n  .movie-item {\n    width: 150px; \/<em> Daha k\u00fc\u00e7\u00fck posterler <\/em>\/\n    height: 225px;\n  }\n  .scroll-arrow {\n    width: 30px; \/<em> Daha k\u00fc\u00e7\u00fck oklar <\/em>\/\n  }\n}\n\n\/<em> \u00c7ok k\u00fc\u00e7\u00fck ekranlar i\u00e7in <\/em>\/\n@media (max-width: 480px) {\n  .row-title {\n    font-size: 1.2rem;\n    margin-left: 10px;\n  }\n  .row-content-wrapper {\n    padding: 0 10px;\n  }\n  .movie-item {\n    width: 120px;\n    height: 180px;\n  }\n  .scroll-arrow {\n    width: 20px;\n    font-size: 1.5rem;\n  }\n}\n<\/style>\n<\/code><\/pre>\n<p>JavaScript taraf\u0131nda, <code>scrollAmount<\/code> de\u011ferini de ekran geni\u015fli\u011fine g\u00f6re dinamik olarak ayarlayabiliriz. \u00d6rne\u011fin, her kayd\u0131rmada bir tam sayfa veya belirli say\u0131da \u00f6\u011fe kayd\u0131r\u0131lmas\u0131n\u0131 sa\u011flayabiliriz. Bunun i\u00e7in <code>rowContent.value.clientWidth<\/code> de\u011ferini kullanabiliriz.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ src\/components\/NetflixRow.vue - scroll fonksiyonu i\u00e7inde\nconst scroll = (direction) => {\n  if (rowContent.value) {\n    const visibleWidth = rowContent.value.clientWidth; \/\/ G\u00f6r\u00fcnen alan\u0131n geni\u015fli\u011fi\n    const scrollAmount = visibleWidth * 0.9; \/\/ G\u00f6r\u00fcnen alan\u0131n %90'\u0131 kadar kayd\u0131r\n\n    if (direction === 'left') {\n      rowContent.value.scrollLeft -= scrollAmount;\n    } else {\n      rowContent.value.scrollLeft += scrollAmount;\n    }\n  }\n};\n<\/code><\/pre>\n<h4>Performans Optimizasyonu<\/h4>\n<p>\u00c7ok say\u0131da film veya \u00fcr\u00fcn g\u00f6sterdi\u011finizde performans sorunlar\u0131 ortaya \u00e7\u0131kabilir. \u0130\u015fte baz\u0131 optimizasyon teknikleri:<\/p>\n<ul>\n<li><strong>Tembel Y\u00fckleme (Lazy Loading):<\/strong> G\u00f6rsel \u00f6\u011felerin yaln\u0131zca kullan\u0131c\u0131 onlar\u0131 g\u00f6rd\u00fc\u011f\u00fcnde y\u00fcklenmesini sa\u011flamak. <code><img loading=\"lazy\"><\/code> \u00f6zelli\u011fini kullanabilir veya bir Vue tembel y\u00fckleme k\u00fct\u00fcphanesi (\u00f6rn. <code>vue-lazyload<\/code>) entegre edebilirsiniz.<\/li>\n<li><strong>Sanalla\u015ft\u0131rma (Virtual Scrolling):<\/strong> Yaln\u0131zca o anda g\u00f6r\u00fcn\u00fcr olan veya g\u00f6r\u00fcn\u00fcr olmaya yak\u0131n olan \u00f6\u011feleri DOM&#8217;a render etmek. Bu, \u00e7ok b\u00fcy\u00fck listeler i\u00e7in \u00f6nemlidir. Ancak bu, basit bir swiper i\u00e7in genellikle a\u015f\u0131r\u0131ya ka\u00e7an bir optimizasyondur.<\/li>\n<li><strong>CSS Animasyonlar\u0131:<\/strong> JavaScript tabanl\u0131 animasyonlar yerine m\u00fcmk\u00fcn oldu\u011funca CSS <code>transition<\/code> veya <code>transform<\/code> \u00f6zelliklerini kullanmak, taray\u0131c\u0131n\u0131n donan\u0131m h\u0131zland\u0131rmas\u0131ndan faydalanmas\u0131n\u0131 sa\u011flar. (<code>scroll-behavior: smooth;<\/code> bu kategoriye girer.)<\/li>\n<\/ul>\n<p>Film posterleri i\u00e7in tembel y\u00fckleme ekleyelim:<\/p>\n<pre><code class=\"language-html\">\n<!-- src\/components\/NetflixRow.vue -->\n<img :src=\"movie.imageUrl\" :alt=\"movie.title\" class=\"movie-poster\" loading=\"lazy\" \/>\n<\/code><\/pre>\n<h4>Klavye Navigasyonu ve Eri\u015filebilirlik (Accessibility &#8211; A11y)<\/h4>\n<p>Web siteleri herkes i\u00e7in eri\u015filebilir olmal\u0131d\u0131r. Klavye ile gezinen veya ekran okuyucu kullanan kullan\u0131c\u0131lar i\u00e7in bile\u015fenimizi eri\u015filebilir hale getirmek \u00f6nemlidir:<\/p>\n<ul>\n<li><strong>Odak Y\u00f6netimi (Focus Management):<\/strong> Ok butonlar\u0131na klavye ile eri\u015filebilir olmas\u0131n\u0131 sa\u011flamak i\u00e7in varsay\u0131lan HTML butonlar\u0131n\u0131 kullanmak yeterlidir.<\/li>\n<li><strong>ARIA Nitelikleri:<\/strong> Ekran okuyucular\u0131na anlaml\u0131 bilgiler sa\u011flamak i\u00e7in ARIA (Accessible Rich Internet Applications) niteliklerini kullan\u0131n. \u00d6rne\u011fin, kayd\u0131rma alan\u0131na <code>role=\"region\"<\/code> ve bir <code>aria-label<\/code> ekleyebiliriz.<\/li>\n<li><strong>Klavye Olaylar\u0131:<\/strong> Kullan\u0131c\u0131lar\u0131n ok tu\u015flar\u0131yla kayd\u0131rma yapmas\u0131na izin verebiliriz.<\/li>\n<\/ul>\n<pre><code class=\"language-html\">\n<!-- src\/components\/NetflixRow.vue -->\n<template>\n  <div class=\"netflix-row\" role=\"region\" aria-label=\"Pop\u00fcler Filmler Listesi\">\n    <h3 class=\"row-title\">Pop\u00fcler Filmler<\/h3>\n    <div class=\"row-content-wrapper\">\n      <button class=\"scroll-arrow left-arrow\" @click=\"scroll('left')\" :disabled=\"!canScrollLeft\" aria-label=\"Sola kayd\u0131r\">\n        <!-- SVG -->\n      <\/button>\n      <div class=\"row-content\" ref=\"rowContent\" tabindex=\"0\" @keydown=\"handleKeydown\"> <!-- tabindex ve keydown ekledik -->\n        <div v-for=\"movie in movies\" :key=\"movie.id\" class=\"movie-item\" role=\"listitem\" aria-label=\"{{ movie.title }}\">\n          <img :src=\"movie.imageUrl\" :alt=\"movie.title\" class=\"movie-poster\" loading=\"lazy\" \/>\n          <span class=\"movie-title\">{{ movie.title }}<\/span>\n        <\/div>\n      <\/div>\n      <button class=\"scroll-arrow right-arrow\" @click=\"scroll('right')\" :disabled=\"!canScrollRight\" aria-label=\"Sa\u011fa kayd\u0131r\">\n        <!-- SVG -->\n      <\/button>\n    <\/div>\n  <\/div>\n<\/template>\n\n<script setup>\n\/\/ ... (\u00f6nceki script) ...\n\nconst handleKeydown = (event) => {\n  if (event.key === 'ArrowLeft') {\n    scroll('left');\n    event.preventDefault(); \/\/ Varsay\u0131lan taray\u0131c\u0131 kayd\u0131rmas\u0131n\u0131 engelle\n  } else if (event.key === 'ArrowRight') {\n    scroll('right');\n    event.preventDefault();\n  }\n};\n<\/script>\n<\/code><\/pre>\n<h4>S\u00fcr\u00fckle-B\u0131rak (Drag-to-Scroll) \u00d6zelli\u011fi<\/h4>\n<p>Netflix&#8217;in mobil deneyiminde oldu\u011fu gibi, kullan\u0131c\u0131lar\u0131n fare veya parmaklar\u0131yla kayd\u0131rma alan\u0131n\u0131 s\u00fcr\u00fckleyerek hareket ettirebilmesi kullan\u0131c\u0131 deneyimini zenginle\u015ftirir. Bu \u00f6zelli\u011fi uygulamak i\u00e7in fare olaylar\u0131n\u0131 (<code>mousedown<\/code>, <code>mousemove<\/code>, <code>mouseup<\/code>) veya dokunmatik olaylar\u0131 (<code>touchstart<\/code>, <code>touchmove<\/code>, <code>touchend<\/code>) dinlememiz gerekir.<\/p>\n<pre><code class=\"language-javascript\">\n<!-- src\/components\/NetflixRow.vue -->\n<template>\n  <!-- ... -->\n    <div class=\"row-content\" ref=\"rowContent\"\n         tabindex=\"0\"\n         @keydown=\"handleKeydown\"\n         @mousedown=\"startDragging\"\n         @mousemove=\"dragging\"\n         @mouseup=\"stopDragging\"\n         @mouseleave=\"stopDragging\" >\n      <!-- ... -->\n    <\/div>\n  <!-- ... -->\n<\/template>\n\n<script setup>\n\/\/ ... (\u00f6nceki script) ...\n\nconst isDragging = ref(false);\nconst startX = ref(0);\nconst scrollLeftStart = ref(0);\n\nconst startDragging = (e) => {\n  isDragging.value = true;\n  startX.value = e.pageX - rowContent.value.offsetLeft;\n  scrollLeftStart.value = rowContent.value.scrollLeft;\n  rowContent.value.style.cursor = 'grabbing';\n};\n\nconst dragging = (e) => {\n  if (!isDragging.value) return;\n  e.preventDefault(); \/\/ Metin se\u00e7imi gibi varsay\u0131lan olaylar\u0131 engelle\n  const x = e.pageX - rowContent.value.offsetLeft;\n  const walk = (x - startX.value) * 1.5; \/\/ Kayd\u0131rma h\u0131z\u0131n\u0131 ayarla\n  rowContent.value.scrollLeft = scrollLeftStart.value - walk;\n};\n\nconst stopDragging = () => {\n  isDragging.value = false;\n  rowContent.value.style.cursor = 'grab';\n};\n\nonMounted(() => {\n  if (rowContent.value) {\n    rowContent.value.addEventListener('scroll', handleScroll);\n    rowContent.value.style.cursor = 'grab'; \/\/ Varsay\u0131lan cursor\n  }\n});\n\n\/\/ ... (onUnmounted ayn\u0131) ...\n<\/script>\n\n<style scoped>\n\/<em> ... (\u00f6nceki CSS) ... <\/em>\/\n.row-content {\n  \/<em> ... <\/em>\/\n  cursor: grab; \/<em> Ba\u015flang\u0131\u00e7 imleci <\/em>\/\n}\n.row-content.dragging {\n  cursor: grabbing; \/<em> S\u00fcr\u00fckleme an\u0131ndaki imle\u00e7 <\/em>\/\n}\n<\/style>\n<\/code><\/pre>\n<p>Bu kod par\u00e7as\u0131, fare olaylar\u0131n\u0131 kullanarak s\u00fcr\u00fckle-b\u0131rak i\u015flevselli\u011fini sa\u011flar. Kullan\u0131c\u0131 <code>mousedown<\/code> ile s\u00fcr\u00fcklemeye ba\u015flad\u0131\u011f\u0131nda, mevcut kayd\u0131rma pozisyonunu ve fare konumunu kaydederiz. <code>mousemove<\/code> s\u0131ras\u0131nda, farenin hareketine g\u00f6re kayd\u0131rma alan\u0131n\u0131 g\u00fcncelleriz. <code>mouseup<\/code> veya <code>mouseleave<\/code> durumunda s\u00fcr\u00fcklemeyi durdururuz. <code>e.preventDefault()<\/code> kullan\u0131m\u0131, s\u00fcr\u00fckleme s\u0131ras\u0131nda metin se\u00e7imi gibi istenmeyen taray\u0131c\u0131 davran\u0131\u015flar\u0131n\u0131 engeller.<\/p>\n<h3>\u00dc\u00e7\u00fcnc\u00fc Parti K\u00fct\u00fcphaneler ve Alternatifler<\/h3>\n<p>S\u0131f\u0131rdan bir kayd\u0131rma bile\u015feni olu\u015fturmak, kontrol ve \u00f6\u011frenme a\u00e7\u0131s\u0131ndan harika olsa da, baz\u0131 durumlarda \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneler daha verimli bir \u00e7\u00f6z\u00fcm sunabilir.<\/p>\n<h4>Neden K\u00fct\u00fcphane Kullanmal\u0131?<\/h4>\n<ul>\n<li><strong>Zaman Tasarrufu:<\/strong> Karma\u015f\u0131k animasyonlar, dokunmatik hareket deste\u011fi ve duyarl\u0131 tasar\u0131m gibi \u00f6zellikleri s\u0131f\u0131rdan yazmak yerine haz\u0131r \u00e7\u00f6z\u00fcmleri kullanmak geli\u015ftirme s\u00fcresini k\u0131salt\u0131r.<\/li>\n<li><strong>Test Edilmi\u015f \u00c7\u00f6z\u00fcmler:<\/strong> Pop\u00fcler k\u00fct\u00fcphaneler geni\u015f bir kullan\u0131c\u0131 kitlesi taraf\u0131ndan test edilmi\u015f ve hatalar\u0131 giderilmi\u015ftir.<\/li>\n<li><strong>Zengin \u00d6zellik Seti:<\/strong> Otomatik oynatma, sonsuz d\u00f6ng\u00fc, farkl\u0131 ge\u00e7i\u015f efektleri, k\u00fc\u00e7\u00fck resim navigasyonu gibi ileri d\u00fczey \u00f6zellikler genellikle k\u00fct\u00fcphanelerde mevcuttur.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> K\u00fct\u00fcphaneler genellikle aktif olarak bak\u0131m\u0131 yap\u0131lan projelerdir, bu da g\u00fcvenlik g\u00fcncellemeleri ve yeni \u00f6zellikler alacaklar\u0131 anlam\u0131na gelir.<\/li>\n<\/ul>\n<h4>Pop\u00fcler Vue Kayd\u0131rma K\u00fct\u00fcphaneleri<\/h4>\n<p>Vue ekosisteminde bir\u00e7ok harika kayd\u0131rma k\u00fct\u00fcphanesi bulunmaktad\u0131r:<\/p>\n<ul>\n<li><strong>Swiper.js:<\/strong> Muhtemelen en pop\u00fcler ve \u00f6zellik a\u00e7\u0131s\u0131ndan en zengin kayd\u0131rma k\u00fct\u00fcphanesidir. Vue, React, Angular ve vanilya JS deste\u011fi sunar. Mobil dokunmatik hareketleri, 3D efektler, tembel y\u00fckleme ve bir\u00e7ok \u00f6zelle\u015ftirme se\u00e7ene\u011fi ile gelir. Netflix benzeri karma\u015f\u0131k senaryolar i\u00e7in idealdir.<\/li>\n<li><strong>Vue Awesome Swiper:<\/strong> Swiper.js&#8217;in resmi olmayan ancak yayg\u0131n olarak kullan\u0131lan bir Vue wrapper&#8217;\u0131d\u0131r. Swiper.js&#8217;in t\u00fcm g\u00fcc\u00fcn\u00fc Vue bile\u015fenleri arac\u0131l\u0131\u011f\u0131yla kullanman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>Vue Carousel:<\/strong> Daha hafif ve basit ihtiya\u00e7lar i\u00e7in tasarlanm\u0131\u015f bir k\u00fct\u00fcphanedir. Temel kayd\u0131rma i\u015flevselli\u011fi, otomatik oynatma ve duyarl\u0131 se\u00e7enekler sunar.<\/li>\n<li><strong>Vue Splide:<\/strong> Hafif, esnek ve eri\u015filebilir bir kayd\u0131rma k\u00fct\u00fcphanesidir. Performans ve eri\u015filebilirli\u011fe odaklan\u0131r ve Vue 2\/3 deste\u011fi sunar.<\/li>\n<\/ul>\n<h4>K\u00fct\u00fcphane Se\u00e7imi Yaparken Dikkat Edilmesi Gerekenler<\/h4>\n<ul>\n<li><strong>\u00d6zellik Seti:<\/strong> \u0130htiya\u00e7 duydu\u011funuz t\u00fcm \u00f6zellikleri sunuyor mu?<\/li>\n<li><strong>Dosya Boyutu:<\/strong> Uygulaman\u0131z\u0131n toplam boyutunu ne kadar art\u0131r\u0131yor?<\/li>\n<li><strong>Performans:<\/strong> \u00d6zellikle mobil cihazlarda ak\u0131c\u0131 \u00e7al\u0131\u015f\u0131yor mu?<\/li>\n<li><strong>Topluluk Deste\u011fi ve Dok\u00fcmantasyon:<\/strong> Sorun ya\u015fad\u0131\u011f\u0131n\u0131zda yard\u0131m bulmak kolay m\u0131? Dok\u00fcmantasyonu anla\u015f\u0131l\u0131r m\u0131?<\/li>\n<li><strong>Vue 3 Deste\u011fi:<\/strong> Kulland\u0131\u011f\u0131n\u0131z Vue s\u00fcr\u00fcm\u00fcyle uyumlu mu?<\/li>\n<\/ul>\n<p>Netflix benzeri bir deneyim i\u00e7in genellikle Swiper.js veya Vue Awesome Swiper gibi daha kapsaml\u0131 bir k\u00fct\u00fcphane tercih etmek, s\u0131f\u0131rdan yazmaktan daha verimli olabilir, \u00f6zellikle de karma\u015f\u0131k animasyonlar ve dokunmatik hareketler isteniyorsa.<\/p>\n<h3>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<ul>\n<li><strong>Performans Odakl\u0131l\u0131k:<\/strong> \u00d6zellikle \u00e7ok say\u0131da \u00f6\u011fe i\u00e7eren listelerde, g\u00f6rselleri tembel y\u00fckleyin ve CSS transform\/transition \u00f6zelliklerini kullanarak animasyonlar\u0131 optimize edin.<\/li>\n<li><strong>Kullan\u0131labilirlik:<\/strong> Kayd\u0131rma bile\u015feninin hem fare hem de dokunmatik ekranlarda sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flay\u0131n. S\u00fcr\u00fckle-b\u0131rak \u00f6zelli\u011fi mobil cihazlarda vazge\u00e7ilmezdir.<\/li>\n<li><strong>Eri\u015filebilirlik:<\/strong> Klavye navigasyonu ve ekran okuyucu deste\u011fi i\u00e7in ARIA niteliklerini ve uygun HTML semanti\u011fini kullanmay\u0131 unutmay\u0131n. Butonlar, kayd\u0131rma alanlar\u0131 ve \u00f6\u011feler i\u00e7in anlaml\u0131 etiketler sa\u011flay\u0131n.<\/li>\n<li><strong>Esneklik:<\/strong> Bile\u015feni farkl\u0131 veri t\u00fcrleri ve farkl\u0131 say\u0131da \u00f6\u011fe ile \u00e7al\u0131\u015facak \u015fekilde tasarlay\u0131n. <code>props<\/code> kullanarak ba\u015fl\u0131k, \u00f6\u011fe listesi gibi verileri d\u0131\u015far\u0131dan almas\u0131n\u0131 sa\u011flay\u0131n.<\/li>\n<li><strong>Test Etme:<\/strong> Farkl\u0131 taray\u0131c\u0131larda (Chrome, Firefox, Safari, Edge) ve farkl\u0131 cihazlarda (masa\u00fcst\u00fc, tablet, mobil) bile\u015feninizin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun.<\/li>\n<li><strong>G\u00f6rsel Geri Bildirim:<\/strong> Kullan\u0131c\u0131 etkile\u015fimlerinde (hover, click, drag) g\u00f6rsel geri bildirimler (g\u00f6lge, b\u00fcy\u00fcme, renk de\u011fi\u015fimi) sa\u011flayarak kullan\u0131c\u0131 deneyimini zenginle\u015ftirin.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Vue.js kullanarak Netflix benzeri yatay kayd\u0131rma bile\u015fenlerini (swipers) s\u0131f\u0131rdan nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceledik. Temel HTML yap\u0131s\u0131ndan CSS ile yatay d\u00fczenlemeye, navigasyon oklar\u0131ndan duyarl\u0131 tasar\u0131ma, performans optimizasyonlar\u0131ndan eri\u015filebilirlik ipu\u00e7lar\u0131na ve s\u00fcr\u00fckle-b\u0131rak \u00f6zelli\u011fine kadar bir\u00e7ok konuyu ele ald\u0131k. Ayr\u0131ca, daha karma\u015f\u0131k projelerde \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerin sundu\u011fu avantajlara ve pop\u00fcler alternatiflere de de\u011findik.<\/p>\n<p>Vue.js&#8217;in reaktif yap\u0131s\u0131 ve bile\u015fen tabanl\u0131 mimarisi, bu t\u00fcr dinamik ve etkile\u015fimli UI \u00f6\u011felerini geli\u015ftirmek i\u00e7in olduk\u00e7a uygundur. Kendi kayd\u0131rma bile\u015feninizi olu\u015fturmak, hem Vue.js bilginizi peki\u015ftirecek hem de projenize tam kontrol sa\u011flayacakt\u0131r. Ancak, zaman k\u0131s\u0131tlamalar\u0131 veya \u00e7ok \u00f6zel ihtiya\u00e7lar olmad\u0131\u011f\u0131nda, Swiper.js gibi olgun bir k\u00fct\u00fcphane kullanmak da ak\u0131ll\u0131ca bir tercih olabilir.<\/p>\n<p>Unutmay\u0131n ki iyi bir kullan\u0131c\u0131 deneyimi, sadece g\u00f6rsel \u00e7ekicilikle s\u0131n\u0131rl\u0131 de\u011fildir; ayn\u0131 zamanda performans, eri\u015filebilirlik ve sezgisel etkile\u015fimleri de kapsar. Bu makalede \u00f6\u011frendi\u011finiz teknikleri uygulayarak, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n be\u011fenece\u011fi ve kolayca kullanabilece\u011fi modern web uygulamalar\u0131 geli\u015ftirebilirsiniz. \u015eimdi s\u0131ra sizde; bu bilgileri kendi Vue.js projelerinizde hayata ge\u00e7irin ve yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131z\u0131 konu\u015fturun!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?\nNetflix, modern web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini (UX) ze","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-33928","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 ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur? - 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-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur? Netflix, modern web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini (UX) ze\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-08T20:40:57+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=\"13 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-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2025-11-08T20:40:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/\"},\"wordCount\":2303,\"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-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/\",\"name\":\"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-08T20:40:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?\"}]},{\"@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 ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur? - 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-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?","og_description":"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur? Netflix, modern web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini (UX) ze","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-08T20:40:57+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?","datePublished":"2025-11-08T20:40:57+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/"},"wordCount":2303,"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-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/","name":"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-08T20:40:57+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-netflix-benzeri-kaydirma-bilesenleri-swipers-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js ile Netflix Benzeri Kayd\u0131rma Bile\u015fenleri (Swipers) Nas\u0131l Olu\u015fturulur?"}]},{"@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\/33928","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=33928"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33928\/revisions"}],"predecessor-version":[{"id":33929,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33928\/revisions\/33929"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33928"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33928"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}