• 01-04-2022, 20:24:09
    #1
    Merhabalar,
    Transform:translate methodu ile kaydırılan slider yapmaktayım. JavaScript ile ekranın genişliğini alıp her bir slider kutucuğunun boyutunu ona göre ayarlıyorum. Her şey tamam lakin bir sorunum var. Diyelim ki ekran genişliği 700px den fazla, ben bunu 700 den aşağı düşürüp tekrar slider kontrol butonlarına tıklayınca slideislem fonksiyonum 2 kere dönüyor. Ve bunun sonucunda bir adet kayacağına iki adet kayıyor ve aynı zamanda bu her seferinde bir artıyor. Ben her koşulda sadece bir kere çalışmasını istiyorum. Bunun nedenini bir türlü anlayamadım. Lütfen bana yardım edin uzun süredir bunun için uğraşmaktayım, en az 4-5 kere silip yazdım neredeyse. Canımı çok sıktı


    (Kontrol butonlarına tıkladığımda her seferinde bir kere index değeri slideislem 'e girip bir tane kaydırıyor lakin dediğim gibi diğer media query sorgusunun içi çalışırsa eğer index değeri iki kere slideislem 'e giriyor. mesela index = -1 dönünce bir kere kaydırmış oluyorum. Ama bu hem -1 hem -2 oluyor bir anda iki kere dönüyor. Ve bu her seferinde diğer query nin içine girince artıyor. Bunu ben yakalayamadım belki siz yakalarsınız)
                    <script>
                    
                    var index = 0;
    
                    document.querySelector('body').onload = function() {
                        var win = window,
                            relatedposts = document.querySelectorAll('.post_box_slider'),
                            slider_container = document.getElementById('slider_container'),
                            x = win.innerWidth
    
                        // myfunction lara gönderilen x ekran genişliği değerini tutuyor
    
                       // eger 700 px den küçükse slider kısmı 2 kutucuk görünecek
                        function myFunction(z, x) {
                            if (z.matches) {
                                index = 0;
                                for (var a = 0; a < relatedposts.length; a++) {
                                    relatedposts[a].style.width = (x / 2) + 'px';
                                }
                               // slider kutucuklarının hepsinin toplam genişliği
                                slider_container.style.width = (((x / 2) + 1) * <?= $tema_ayarlari[0]['relatedpostscount'] ?>) + 'px';
    
    
                                var newrelatedposts = document.querySelectorAll('.post_box_slider').length
                                document.querySelector('.slider_next_btn').addEventListener('click', function() {
                                    if (index > -(newrelatedposts - 2))
                                        index--
                                    slideislem(2, index)
                                })
                                document.querySelector('.slider_prev_btn').addEventListener('click', function() {
                                    if (index < 0) {
                                        index++
                                        slideislem(2, index)
                                    }
                                })
                            }
                        }
                       // eger 700 px den büyükse slider kısmı 4 kutucuk görünecek
                        function myFunction2(y, x) {
                            if (y.matches) {
                                index = 0;
                                for (var a = 0; a < relatedposts.length; a++) {
                                    relatedposts[a].style.width = (x / 4) + 'px';
                                }
                                 // slider kutucuklarının hepsinin toplam genişliği
                                slider_container.style.width = (((x / 4) + 1) * <?= $tema_ayarlari[0]['relatedpostscount'] ?>) + 'px';
    
    
                                var newrelatedposts = document.querySelectorAll('.post_box_slider').length
                                document.querySelector('.slider_next_btn').addEventListener('click', function() {
                                    if (index > -(newrelatedposts - 4))
                                        index--
                                    slideislem(4, index)
                                })
                                document.querySelector('.slider_prev_btn').addEventListener('click', function() {
                                    if (index < 0) {
                                        index++
                                        slideislem(4, index)
                                    }
                                })
                            }
                        }
                       // 700 px altı ve üstü için çalışacak media query fonksiyonları
                        var z = window.matchMedia("(max-width: 700px)")
                        myFunction(z, x) // Call listener function at run time
                        z.addListener(myFunction) // Attach listener function on state changes
                        var y = window.matchMedia("(min-width: 700px)")
                        myFunction2(y, x) // Call listener function at run time
                        y.addListener(myFunction2) // Attach listener function on state changes
    
    
    
    
    
                        // ekran genişliği oynatılırsa tetikleniyor
                        function checkMediaQuery() {
                            var win = window,
                                relatedposts = document.querySelectorAll('.post_box_slider')
                            x = win.innerWidth
    
    
                            if (window.innerWidth > 700) {
                                index = 0
                                for (var a = 0; a < relatedposts.length; a++) {
                                    relatedposts[a].style.width = (x / 4) + 'px';
                                }
                                 // slider kutucuklarının hepsinin toplam genişliği
                                slider_container.style.width = (((x / 4) + 1) * <?= $tema_ayarlari[0]['relatedpostscount'] ?>) + 'px';
                                slideislem(4, index)
                            } else if (window.innerWidth < 700) {
                                index = 0
                                for (var a = 0; a < relatedposts.length; a++) {
                                    relatedposts[a].style.width = (x / 2) + 'px';
                                }
                                // slider kutucuklarının hepsinin toplam genişliği
                                slider_container.style.width = (((x / 2) + 1) * <?= $tema_ayarlari[0]['relatedpostscount'] ?>) + 'px';
                                slideislem(2, index)
                            }
                        }
                        window.addEventListener("resize", checkMediaQuery);
    
    
    
                        // slider kısmının kaydırılmasını tetikliyor
                        function slideislem(b, index) {
                            console.log(index)
                            document.getElementById('slider_container').style.transform = 'translate3d(' + (index * (x / b + 1)) + 'px, 0px, 0px)'
                        }
    
                    }
                </script>
  • 01-04-2022, 23:01:15
    #2
    Değişim başladığında elemente bir dataset ekleyin eğer dataset yada anahtar açık ise devam etsin yoksa return, bu şekilde tek kayma yapabilirsiniz.