JavaScript / jQuery ile sayfanın üstüne nasıl geçilir?


159

JavaScript / jQuery ile tarayıcı kaydırmayı kontrol etmenin bir yolu var mı?

Sayfamı yarıya kadar kaydırdığımda, daha sonra bir yeniden yüklemeyi tetiklediğimde, sayfanın en üste gitmesini istiyorum, ancak bunun yerine son kaydırma konumunu bulmaya çalışıyor. Ben de bunu yaptım:

$('document').ready(function() {
   $(window).scrollTop(0);
});

Ama şans yok.

DÜZENLE :

Sayfa yüklendikten sonra aradığımda her iki cevabınız da işe yaradı-Teşekkürler. Ancak, sayfada sadece bir yenileme yaparsam, tarayıcı .readyolayı hesapladıktan sonra eski kaydırma konumunu hesaplar ve kaydırır gibi görünür (gövde yükü () işlevini de test ettim).

Yani takip, tarayıcıyı geçmiş konumuna kaydırmayı ÖNLEMEK veya işini yaptıktan SONRA tekrar yukarı kaydırmanın bir yolu var mı?


1
$ (Window) .load () öğesinden yaptığınızda ne olur?
mpdonadio

2
@ MPD- Mükemmel fikir! ... ama sadece denedim ve kaydırma ayarı bundan sonra da devam ediyor. Yine de bahşiş için teşekkürler, aslında başka bir soruya yardımcı oluyor: stackoverflow.com/questions/4210829/… . Eğer bu soruya cevap vermek istiyorsan sana biraz şans vereceğim.
Yarin

@Yarin Üzgünüm, bunun için 9 yıl beklemek zorundaydın. Kaydırmayı denemeden önce history.scrollRestoration öğesini ayarlamanız gerekir. Cevabımı gör.
RayLoveless

Yanıtlar:


17

Vay be, bu soruya 9 yıl geç kaldım. Hadi bakalım:

Bu kodu yüklemenize ekleyin.

// This prevents the page from scrolling down to where it was previously.
if ('scrollRestoration' in history) {
    history.scrollRestoration = 'manual';
}
// This is needed if the user scrolls down during page load and you want to make sure the page is scrolled to the top once it's fully loaded. This has Cross-browser support.
window.scrollTo(0,0);

history.scrollRestoration Tarayıcı desteği:

Chrome: desteklenir (46'dan beri)

Firefox: destekleniyor (46'dan beri)

IE / Edge: desteklenmiyor (Henüz ..)

Opera: desteklendi (33'ten beri)

Safari: desteklenir

IE / Edge için, otomatik aşağı kaydırıldıktan SONRA tekrar yukarı kaydırmak istiyorsanız, bu benim için çalıştı:

var isIE11 = !!window.MSInputMethodContext && !!document.documentMode;
var isEdge = /Edge/.test(navigator.userAgent);
if(isIE11 || isEdge) {
    setTimeout(function(){ window.scrollTo(0, 0); }, 300);  // adjust time according to your page. The better solution would be to possibly tie into some event and trigger once the autoscrolling goes to the top.
} 

Teşekkürler @ RayLoveless - ne yazık ki bu MS tarayıcıları tarafından desteklenmiyor (tabii ki). Bkz. Caniuse.com/#feat=mdn-api_history_scrollrestoration ve developer.mozilla.org/de/docs/Web/API/…
Yarin

@Yarin, Güzel nokta. Yazımı güncelledim. sorunuza cevap veriyor mu?
RayLoveless

312

Çapraz tarayıcı, saf JavaScript çözümü:

document.body.scrollTop = document.documentElement.scrollTop = 0;

3
JQuery kullandığınız için bunu deneyebilirsiniz:$(window).one("scroll",function() { /* the code from my answer here */ });
Niet the Dark Absol

Bu çalışmanın IE / Chrome / FF çapraz tarayıcılarımda çalışması için, Niet Dark Absol yanıtı ve user113716 yanıtı (zaman aşımı kullanarak) birleştirmeliyim.
Panini Luncher

FF 45.1.0 kullanarak CentOS 6.7 üzerinde çalışmadı. Bir belgeye sardım. Zaten emin olmak için.
Brandon Elliott

Sadece
testimden

Bu, "tarayıcıyı önceki konumuna kaydırmayı ÖNLEMİYOR". Cevabımı gör.
RayLoveless

85

Sen neredeyse aldım - ayarlamak gerekir scrollTopüzerinde bodydeğil, window:

$(function() {
   $('body').scrollTop(0);
});

DÜZENLE:

Belki sayfanın üstüne boş bir çapa ekleyebilirsiniz:

$(function() {
   $('<a name="top"/>').insertBefore($('body').children().eq(0));
   window.location.hash = 'top';
});

3
Bugün denedim ve FF16'da çalışmadı. Bunun yerine bu sayfada daha aşağıda görülen saf JS kullanma: document.body.scrollTop = document.documentElement.scrollTop = 0;
Gigi2m02

2
Yukarıdaki kod, FF, Chrome gibi Modern tarayıcılarda düzgün çalışacaktır, ancak IE8 ve aşağıda çalışmaz, hem 'html','body'modern tarayıcılar gövdeye göre kaydırılacağı için hem de IE8 ve altı yalnızca 'html', 'gövde'
Rajesh

17

Tarayıcının geçmiş konumuna kaydırmasını ÖNLEMEK veya işini yaptıktan SONRA tekrar yukarı kaydırmanın bir yolu var mı?

Aşağıdaki jquery çözümü benim için çalışıyor:

$(window).unload(function() {
    $('body').scrollTop(0);
});

evet yenilemeden önce yukarı kaydır
Morgan T.

Tamamen çapraz tarayıcı değil, ama yine de çoğu için çalışıyor. Diğer cevapların bazıları ile birleştiğinde bu iyi bir ektir
Brad Decker

16

İşte no-jQuery'ers için saf bir JavaScript animasyonlu kaydırma sürümü: D

var stepTime = 20;
var docBody = document.body;
var focElem = document.documentElement;

var scrollAnimationStep = function (initPos, stepAmount) {
    var newPos = initPos - stepAmount > 0 ? initPos - stepAmount : 0;

    docBody.scrollTop = focElem.scrollTop = newPos;

    newPos && setTimeout(function () {
        scrollAnimationStep(newPos, stepAmount);
    }, stepTime);
}

var scrollTopAnimated = function (speed) {
    var topOffset = docBody.scrollTop || focElem.scrollTop;
    var stepAmount = topOffset;

    speed && (stepAmount = (topOffset * stepTime)/speed);

    scrollAnimationStep(topOffset, stepAmount);
};

Ve sonra:

<button onclick="scrollTopAnimated(1000)">Scroll Top</button>

1
Güzel. Yine de, requestAnimationStepyerine tercih ederim setTimeout. Ayrıca OP'nin sorusuna cevap vermez.
Quentin Roy

bunu Angular'da uyguladı. tıkır tıkır çalışıyor. Teşekkürler
Ahmad

12

GÜNCELLEME

Bir kaydırma efekti ile sayfanın üstüne gitmek javascript ile şimdi biraz daha kolay:

https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll

window.scroll({
 top: 0, 
 left: 0, 
 behavior: 'smooth' 
});

DİKKAT

Bunu daha yeni projelerimizde kullanıyoruz, ancak cevabımı güncellerken şu anda mozilla doktorunu kontrol ettim ve güncellenmiş olduğuna inanıyorum. Şu anda yöntemdir window.scroll(x-coord, y-coord)ve söz veya kullanım örnekleri göstermez objectayarlayabileceğiniz parametre behavioriçin smooth. Ben sadece kodu denedim ve hala krom ve firefox ve nesne parametresi hala spec çalışıyor .

Bu yüzden dikkatli kullanın veya bu Çoklu Dolguyu kullanabilirsiniz . Kenara en kaydırmadan bu polyfill da başka yöntemler ele alır: window.scrollBy, element.scrollIntoViewvs.


ESKİ CEVAP

Bu bizim vanilya javascriptuygulamamız. Basit bir hareket hızı efekti vardır, böylece Kullanıcı Başa Dön düğmesini tıklattıktan sonra şok olmaz .

Çok küçük ve küçültüldüğünde daha da küçülür. Geliştirme aracı jquery yöntemine bir alternatif arıyor ama aynı sonuçları istiyorum bunu deneyebilirsiniz.

JS

document.querySelector("#to-top").addEventListener("click", function(){

    var toTopInterval = setInterval(function(){

        var supportedScrollTop = document.body.scrollTop > 0 ? document.body : document.documentElement;

        if (supportedScrollTop.scrollTop > 0) {
            supportedScrollTop.scrollTop = supportedScrollTop.scrollTop - 50;
        }

        if (supportedScrollTop.scrollTop < 1) {
            clearInterval(toTopInterval);
        }

    }, 10);

},false);

HTML

<button id="to-top">To Top</button>

Şerefe!


8

Bu benim için çalışıyor:

window.onload = function() {
    // short timeout
    setTimeout(function() {
        $(document.body).scrollTop(0);
    }, 15);
};

Tarayıcıya kaydırma yapma şansı vermek için setTimeoutiçinde kısa bir süre kullanır onload.


Bu çalışmanın IE / Chrome / FF çapraz tarayıcılarımda çalışması için, Niet Dark Absol yanıtı ve user113716 yanıtı (zaman aşımı kullanarak) birleştirmeliyim.
Panini Luncher

@Panini: öneriniz benim için Chrome / FF'de çalışıyor, ancak IE11'de çalışmıyor.
EML

8

JQuery ile kullanabilirsiniz

jQuery(window).load(function(){

    jQuery("html,body").animate({scrollTop: 100}, 1000);

});

Temel olarak FF 45.1.0 kullanarak CentOS 6.7 üzerinde çalışmak için buldum budur. Biraz farklı sürümüm (bir pencere yükleme işlevine sarılmış): $ ("html, body"). Animate ({scrollTop: 0}, 1);
Brandon Elliott

6

Aşağıdaki işlevi kullanın

window.scrollTo(xpos, ypos)

Burada xpos Gerekli. X ekseni (yatay) boyunca piksel olarak kaydırılacak koordinat

ypos da gereklidir. Y ekseni (dikey) boyunca piksel cinsinden kaydırılacak koordinat


5
$(function() {
    // the element inside of which we want to scroll
        var $elem = $('#content');

        // show the buttons
    $('#nav_up').fadeIn('slow');
    $('#nav_down').fadeIn('slow');  

        // whenever we scroll fade out both buttons
    $(window).bind('scrollstart', function(){
        $('#nav_up,#nav_down').stop().animate({'opacity':'0.2'});
    });
        // ... and whenever we stop scrolling fade in both buttons
    $(window).bind('scrollstop', function(){
        $('#nav_up,#nav_down').stop().animate({'opacity':'1'});
    });

        // clicking the "down" button will make the page scroll to the $elem's height
    $('#nav_down').click(
        function (e) {
            $('html, body').animate({scrollTop: $elem.height()}, 800);
        }
    );
        // clicking the "up" button will make the page scroll to the top of the page
    $('#nav_up').click(
        function (e) {
            $('html, body').animate({scrollTop: '0px'}, 800);
        }
    );
 });

Bunu kullan


Güzel! Animasyonla iyi çalışıyor!
Sakthivel

4

Aşağıdaki kod Firefox, Chrome ve Safari'de çalışır , ancak Internet Explorer'da bunu test edemedim. Birisi test edebilir ve ardından cevabımı düzenleyebilir veya yorum yapabilir mi?

$(document).scrollTop(0);

4

Saf (animasyonlu) Javascript çözümüm:

function gototop() {
    if (window.scrollY>0) {
        window.scrollTo(0,window.scrollY-20)
        setTimeout("gototop()",10)
    }
}

Açıklama:

window.scrollY tarayıcı tarafından pencerenin kaydırıldığı üstten piksel miktarının koruduğu bir değişkendir.

window.scrollTo(x,y) pencereyi x ekseninde ve y ekseninde belirli miktarda piksel kaydıran bir işlevdir.

Böylece, window.scrollTo(0,window.scrollY-20)sayfayı 20 piksel yukarı taşır.

setTimeoutO zaman o başka 20 piksel (hareketli) ve hareket etmelerini sağlayacak şekilde 10 milisaniye içinde yeniden işlevini çağırır ifhala kaydırma gerekiyorsa deyimi kontrolleri.


3

Neden html dosyanızın en başında bazı referans öğelerini kullanmıyorsunuz, örneğin

<div id="top"></div>

ve sonra sayfa yüklendiğinde

$(document).ready(function(){

    top.location.href = '#top';

});

Tarayıcı bu işlev çalıştıktan sonra kayarsa,

$(window).load(function(){

    top.location.href = '#top';

});

3
Bu benim için çalıştı, ama url #top ekler, lütfen bana bunu nasıl önleyebilirim söyleyebilir misiniz, ama aynı zamanda, işlevsellikten taviz vermeyin
Abbas

3

Çapraz tarayıcı üste kaydır:

        if($('body').scrollTop()>0){
            $('body').scrollTop(0);         //Chrome,Safari
        }else{
            if($('html').scrollTop()>0){    //IE, FF
                $('html').scrollTop(0);
            }
        } 

Çapraz tarayıcı kimliği = div_id olan bir öğeye kaydırın:

        if($('body').scrollTop()>$('#div_id').offset().top){
            $('body').scrollTop($('#div_id').offset().top);         //Chrome,Safari
        }else{
            if($('html').scrollTop()>$('#div_id').offset().top){    //IE, FF
                $('html').scrollTop($('#div_id').offset().top);
            }
        } 

2

Düzenlenmiş sorunuza cevap vermek için onscrollişleyiciyi şu şekilde kaydedebilirsiniz :

document.documentElement.onscroll = document.body.onscroll = function() {
    this.scrollTop = 0;
    this.onscroll = null;
}

Bu, ilk kaydırma girişiminin (muhtemelen tarayıcı tarafından otomatik olarak yapılan) etkin bir şekilde iptal edilmesini sağlayacaktır.


Güzel bir çözüm
Yarin

2

Quircks modundaysanız (teşekkürler @Niet the Dark Absol):

document.body.scrollTop = document.documentElement.scrollTop = 0;

Katı moddaysanız:

document.documentElement.scrollTop = 0;

Burada jQuery'ye gerek yok.


2

Bu çalışıyor:

jQuery(document).ready(function() {
     jQuery("html").animate({ scrollTop: 0 }, "fast");
});

2

Benim durumumda vücut işe yaramadı:

$('body').scrollTop(0);

Ancak HTML çalıştı:

$('html').scrollTop(0);

1
Her iki ekleme 'html','body'modern tarayıcılarda FF olarak, Krom vücutta ancak IE8 dayalı sağa kayacaktır ve aşağıda sadece olacak kaydırma ile'html','body'
Rajesh

2

Bu ikisinin birleşimi bana yardımcı oldu. Kaydırmayan bir sidenav vardı beri diğer cevapların hiçbiri bana yardımcı oldu.

 setTimeout(function () {
        window.scroll({
                        top: 0,
                        left: 0,
                        behavior: 'smooth'
                    });

    document.body.scrollTop = document.documentElement.scrollTop = 0;

}, 15);

1
var totop = $('#totop');
totop.click(function(){
 $('html, body').stop(true,true).animate({scrollTop:0}, 1000);
 return false;
});

$(window).scroll(function(){
 if ($(this).scrollTop() > 100){ 
  totop.fadeIn();
 }else{
  totop.fadeOut();
 }
});

<img id="totop" src="img/arrow_up.png" title="Click to go Up" style="display:none;position:fixed;bottom:10px;right:10px;cursor:pointer;cursor:hand;"/>


1

Herhangi biri sidenav ile açısal ve malzeme tasarımı kullanıyorsa. Bu sizi sayfanın üst kısmına gönderir:

let ele = document.getElementsByClassName('md-sidenav-content');
    let eleArray = <Element[]>Array.prototype.slice.call(ele);
    eleArray.map( val => {
        val.scrollTop = document.documentElement.scrollTop = 0;
    });

0

Hash'in işi yapması gerekir. Bir başlığınız varsa,

window.location.href = "#headerid";

Aksi takdirde, #

window.location.href = "#";

Ve URL'ye yazılırken, yenilerseniz kalır.

Aslında, bir onclick etkinliğinde yapmak istiyorsanız, JavaScript'e ihtiyacınız yoktur, sadece öğenizin etrafına bir bağlantı koymanız ve # olarak href olarak vermeniz gerekir.


Btw, window.location ağacın bir parçası değil, bu yüzden şimdi yükleme için beklemek için kullanım var.
xavierm02

0

İlk önce gitmek istediğiniz yere boş bir bağlantı etiketi ekleyin

<a href="#topAnchor"></a> 

Şimdi başlık bölümüne bir işlev ekleyin

 function GoToTop() {
            var urllocation = location.href;
            if (urllocation.indexOf("#topAnchor") > -1) {
                window.location.hash = "topAnchor";
            } else {
                return false;
            }
        }

son olarak gövde etiketine bir onload etkinliği ekleyin

<body onload="GoToTop()">

0

Herhangi bir X ve Y değeri için çalışan ve sadece scrollDuration eklenmesiyle window.scrollTo api ile aynı olan genel bir sürüm.

* Window.scrollTo tarayıcı api ile eşleşen genel bir sürüm **

function smoothScrollTo(x, y, scrollDuration) {
    x = Math.abs(x || 0);
    y = Math.abs(y || 0);
    scrollDuration = scrollDuration || 1500;

    var currentScrollY = window.scrollY,
        currentScrollX = window.scrollX,
        dirY = y > currentScrollY ? 1 : -1,
        dirX = x > currentScrollX ? 1 : -1,
        tick = 16.6667, // 1000 / 60
        scrollStep = Math.PI / ( scrollDuration / tick ),
        cosParameterY = currentScrollY / 2,
        cosParameterX = currentScrollX / 2,
        scrollCount = 0,
        scrollMargin;

    function step() {        
        scrollCount = scrollCount + 1;  

        if ( window.scrollX !== x ) {
            scrollMargin = cosParameterX + dirX * cosParameterX * Math.cos( scrollCount * scrollStep );
            window.scrollTo( 0, ( currentScrollX - scrollMargin ) );
        } 

        if ( window.scrollY !== y ) {
            scrollMargin = cosParameterY + dirY * cosParameterY * Math.cos( scrollCount * scrollStep );
            window.scrollTo( 0, ( currentScrollY - scrollMargin ) );
        } 

        if (window.scrollX !== x || window.scrollY !== y) {
            requestAnimationFrame(step);
        }
    }

    step();
}

0

Bunun başka bir yere gönderildiğini hatırlıyorum (nerede bulamadım), ama bu gerçekten iyi çalışıyor:

setTimeout(() => {
    window.scrollTo(0, 0);
}, 0);

Tuhaf, ancak çalışma şekli JavaScript'in yığın kuyruğunun çalışma şekline dayanıyor. Tam açıklama burada Sıfır Gecikmeler bölümünde bulunur.

Temel fikir, zamanın setTimeoutgerçekten bekleyeceği süreyi değil, bekleyeceği minimum süreyi belirtmesidir. Bu nedenle, 0ms beklemesini söylediğinizde, tarayıcı diğer sıraya alınmış tüm işlemleri çalıştırır (pencereyi son bulunduğunuz yere kaydırmak gibi) ve geri aramayı yürütür.


-1
 <script>
  sessionStorage.scrollDirection = 1;//create a session variable 
  var pageScroll = function() {
  window.scrollBy ({
   top: sessionStorage.scrollDirection,
   left: 0,
   behavior: 'smooth'
   });
   if($(window).scrollTop() + $(window).height() > $(document).height() - 1)
  {    
    sessionStorage.scrollDirection= Number(sessionStorage.scrollDirection )-300;
    setTimeout(pageScroll,50);//
   }
   else{
   sessionStorage.scrollDirection=Number(sessionStorage.scrollDirection )+1
   setTimeout(pageScroll,300); 
  }
};
pageScroll();
</script>

1
Stackoverflow'a hoş geldiniz. Verdiğiniz koda ek olarak, bunun neden ve nasıl sorunu çözdüğüne dair biraz açıklama yapmaya çalışın.
46'da jtate
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.